rusticl/mem: fix IMAGE1D_BUFFER

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15439>
This commit is contained in:
Karol Herbst
2022-04-15 13:36:00 +02:00
committed by Marge Bot
parent 798fb6b9c7
commit de292ee3b8
6 changed files with 51 additions and 25 deletions

View File

@@ -383,7 +383,7 @@ fn validate_image_desc(
host_ptr: *mut ::std::os::raw::c_void, host_ptr: *mut ::std::os::raw::c_void,
elem_size: usize, elem_size: usize,
devs: &[Arc<Device>], devs: &[Arc<Device>],
) -> CLResult<cl_image_desc> { ) -> CLResult<(cl_image_desc, Option<Arc<Mem>>)> {
// CL_INVALID_IMAGE_DESCRIPTOR if values specified in image_desc are not valid // CL_INVALID_IMAGE_DESCRIPTOR if values specified in image_desc are not valid
const err: cl_int = CL_INVALID_IMAGE_DESCRIPTOR; const err: cl_int = CL_INVALID_IMAGE_DESCRIPTOR;
@@ -452,8 +452,8 @@ fn validate_image_desc(
// //
// TODO: cl_khr_image2d_from_buffer is an optional feature // TODO: cl_khr_image2d_from_buffer is an optional feature
let p = unsafe { &desc.anon_1.mem_object }; let p = unsafe { &desc.anon_1.mem_object };
if !p.is_null() { let parent = if !p.is_null() {
let p = p.get_ref()?; let p = p.get_arc()?;
if !match desc.image_type { if !match desc.image_type {
CL_MEM_OBJECT_IMAGE1D_BUFFER => p.is_buffer(), CL_MEM_OBJECT_IMAGE1D_BUFFER => p.is_buffer(),
CL_MEM_OBJECT_IMAGE2D => !p.is_buffer(), CL_MEM_OBJECT_IMAGE2D => !p.is_buffer(),
@@ -461,7 +461,10 @@ fn validate_image_desc(
} { } {
return Err(CL_INVALID_OPERATION); return Err(CL_INVALID_OPERATION);
} }
} Some(p)
} else {
None
};
// image_row_pitch is the scan-line pitch in bytes. This must be 0 if host_ptr is NULL and can // image_row_pitch is the scan-line pitch in bytes. This must be 0 if host_ptr is NULL and can
// be either 0 or ≥ image_width × size of element in bytes if host_ptr is not NULL. If host_ptr // be either 0 or ≥ image_width × size of element in bytes if host_ptr is not NULL. If host_ptr
@@ -505,7 +508,7 @@ fn validate_image_desc(
} }
} }
Ok(desc) Ok((desc, parent))
} }
fn desc_eq_no_buffer(a: &cl_image_desc, b: &cl_image_desc) -> bool { fn desc_eq_no_buffer(a: &cl_image_desc, b: &cl_image_desc) -> bool {
@@ -680,7 +683,11 @@ pub fn create_image_with_properties(
.ok_or(CL_INVALID_OPERATION)?; .ok_or(CL_INVALID_OPERATION)?;
let (format, elem_size) = validate_image_format(image_format)?; let (format, elem_size) = validate_image_format(image_format)?;
let desc = validate_image_desc(image_desc, host_ptr, elem_size.into(), &c.devs)?; let (desc, parent) = validate_image_desc(image_desc, host_ptr, elem_size.into(), &c.devs)?;
// validate host_ptr before merging flags
validate_host_ptr(host_ptr, flags)?;
flags = validate_buffer(&desc, flags, format, host_ptr, elem_size.into())?; flags = validate_buffer(&desc, flags, format, host_ptr, elem_size.into())?;
// For all image types except CL_MEM_OBJECT_IMAGE1D_BUFFER, if the value specified for flags is 0, the // For all image types except CL_MEM_OBJECT_IMAGE1D_BUFFER, if the value specified for flags is 0, the
@@ -690,7 +697,6 @@ pub fn create_image_with_properties(
} }
validate_mem_flags(flags, false)?; validate_mem_flags(flags, false)?;
validate_host_ptr(host_ptr, flags)?;
let filtered_flags = filter_image_access_flags(flags); let filtered_flags = filter_image_access_flags(flags);
// CL_IMAGE_FORMAT_NOT_SUPPORTED if there are no devices in context that support image_format. // CL_IMAGE_FORMAT_NOT_SUPPORTED if there are no devices in context that support image_format.
@@ -712,6 +718,7 @@ pub fn create_image_with_properties(
Ok(cl_mem::from_arc(Mem::new_image( Ok(cl_mem::from_arc(Mem::new_image(
c, c,
parent,
desc.image_type, desc.image_type,
flags, flags,
format, format,

View File

@@ -6,6 +6,7 @@ use crate::api::icd::*;
use crate::api::util::cl_prop; use crate::api::util::cl_prop;
use crate::core::device::*; use crate::core::device::*;
use crate::core::event::*; use crate::core::event::*;
use crate::core::format::*;
use crate::core::memory::*; use crate::core::memory::*;
use crate::core::program::*; use crate::core::program::*;
use crate::core::queue::*; use crate::core::queue::*;
@@ -557,11 +558,12 @@ impl Kernel {
input.extend_from_slice(&mem.offset.to_ne_bytes()); input.extend_from_slice(&mem.offset.to_ne_bytes());
resource_info.push((Some(res.clone()), arg.offset)); resource_info.push((Some(res.clone()), arg.offset));
} else { } else {
let format = mem.image_format.to_pipe_format().unwrap();
let (formats, orders) = if arg.kind == KernelArgType::Image { let (formats, orders) = if arg.kind == KernelArgType::Image {
iviews.push(res.pipe_image_view()); iviews.push(res.pipe_image_view(format));
(&mut img_formats, &mut img_orders) (&mut img_formats, &mut img_orders)
} else { } else {
sviews.push(res.clone()); sviews.push((res.clone(), format));
(&mut tex_formats, &mut tex_orders) (&mut tex_formats, &mut tex_orders)
}; };
@@ -649,7 +651,10 @@ impl Kernel {
let mut globals: Vec<*mut u32> = Vec::new(); let mut globals: Vec<*mut u32> = Vec::new();
let printf_format = nir.printf_format(); let printf_format = nir.printf_format();
let mut sviews: Vec<_> = sviews.iter().map(|s| ctx.create_sampler_view(s)).collect(); let mut sviews: Vec<_> = sviews
.iter()
.map(|(s, f)| ctx.create_sampler_view(s, *f))
.collect();
let samplers: Vec<_> = samplers let samplers: Vec<_> = samplers
.iter() .iter()
.map(|s| ctx.create_sampler_state(s)) .map(|s| ctx.create_sampler_state(s))

View File

@@ -286,6 +286,7 @@ impl Mem {
pub fn new_image( pub fn new_image(
context: Arc<Context>, context: Arc<Context>,
parent: Option<Arc<Mem>>,
mem_type: cl_mem_object_type, mem_type: cl_mem_object_type,
flags: cl_mem_flags, flags: cl_mem_flags,
image_format: &cl_image_format, image_format: &cl_image_format,
@@ -312,12 +313,16 @@ impl Mem {
image_desc.image_array_size = 1; image_desc.image_array_size = 1;
} }
let texture = context.create_texture( let texture = if parent.is_none() {
&image_desc, Some(context.create_texture(
image_format, &image_desc,
host_ptr, image_format,
bit_check(flags, CL_MEM_COPY_HOST_PTR), host_ptr,
)?; bit_check(flags, CL_MEM_COPY_HOST_PTR),
)?)
} else {
None
};
let host_ptr = if bit_check(flags, CL_MEM_USE_HOST_PTR) { let host_ptr = if bit_check(flags, CL_MEM_USE_HOST_PTR) {
host_ptr host_ptr
@@ -328,7 +333,7 @@ impl Mem {
Ok(Arc::new(Self { Ok(Arc::new(Self {
base: CLObjectBase::new(), base: CLObjectBase::new(),
context: context, context: context,
parent: None, parent: parent,
mem_type: mem_type, mem_type: mem_type,
flags: flags, flags: flags,
size: image_desc.pixels() * image_format.pixel_size().unwrap() as usize, size: image_desc.pixels() * image_format.pixel_size().unwrap() as usize,
@@ -339,7 +344,7 @@ impl Mem {
image_elem_size: image_elem_size, image_elem_size: image_elem_size,
props: props, props: props,
cbs: Mutex::new(Vec::new()), cbs: Mutex::new(Vec::new()),
res: Some(texture), res: texture,
maps: Mappings::new(), maps: Mappings::new(),
})) }))
} }

View File

@@ -11,7 +11,7 @@ pub fn cl_mem_type_to_texture_target(mem_type: cl_mem_object_type) -> pipe_textu
CL_MEM_OBJECT_IMAGE3D => pipe_texture_target::PIPE_TEXTURE_3D, CL_MEM_OBJECT_IMAGE3D => pipe_texture_target::PIPE_TEXTURE_3D,
CL_MEM_OBJECT_IMAGE1D_ARRAY => pipe_texture_target::PIPE_TEXTURE_1D_ARRAY, CL_MEM_OBJECT_IMAGE1D_ARRAY => pipe_texture_target::PIPE_TEXTURE_1D_ARRAY,
CL_MEM_OBJECT_IMAGE2D_ARRAY => pipe_texture_target::PIPE_TEXTURE_2D_ARRAY, CL_MEM_OBJECT_IMAGE2D_ARRAY => pipe_texture_target::PIPE_TEXTURE_2D_ARRAY,
CL_MEM_OBJECT_IMAGE1D_BUFFER => pipe_texture_target::PIPE_BUFFER, CL_MEM_OBJECT_IMAGE1D_BUFFER => pipe_texture_target::PIPE_TEXTURE_1D,
_ => pipe_texture_target::PIPE_TEXTURE_2D, _ => pipe_texture_target::PIPE_TEXTURE_2D,
} }
} }

View File

@@ -286,8 +286,12 @@ impl PipeContext {
} }
} }
pub fn create_sampler_view(&self, res: &PipeResource) -> *mut pipe_sampler_view { pub fn create_sampler_view(
let template = res.pipe_sampler_view_template(); &self,
res: &PipeResource,
format: pipe_format,
) -> *mut pipe_sampler_view {
let template = res.pipe_sampler_view_template(format);
unsafe { unsafe {
self.pipe.as_ref().create_sampler_view.unwrap()( self.pipe.as_ref().create_sampler_view.unwrap()(
self.pipe.as_ptr(), self.pipe.as_ptr(),

View File

@@ -29,7 +29,7 @@ impl PipeResource {
unsafe { self.pipe.as_ref().unwrap() } unsafe { self.pipe.as_ref().unwrap() }
} }
pub fn pipe_image_view(&self) -> pipe_image_view { pub fn pipe_image_view(&self, format: pipe_format) -> pipe_image_view {
let u = if self.as_ref().target() == pipe_texture_target::PIPE_BUFFER { let u = if self.as_ref().target() == pipe_texture_target::PIPE_BUFFER {
pipe_image_view__bindgen_ty_1 { pipe_image_view__bindgen_ty_1 {
buf: pipe_image_view__bindgen_ty_1__bindgen_ty_2 { buf: pipe_image_view__bindgen_ty_1__bindgen_ty_2 {
@@ -54,18 +54,23 @@ impl PipeResource {
pipe_image_view { pipe_image_view {
resource: self.pipe(), resource: self.pipe(),
format: self.as_ref().format(), format: format,
access: 0, access: 0,
shader_access: PIPE_IMAGE_ACCESS_WRITE as u16, shader_access: PIPE_IMAGE_ACCESS_WRITE as u16,
u: u, u: u,
} }
} }
pub fn pipe_sampler_view_template(&self) -> pipe_sampler_view { pub fn pipe_sampler_view_template(&self, format: pipe_format) -> pipe_sampler_view {
let mut res = pipe_sampler_view::default(); let mut res = pipe_sampler_view::default();
unsafe { unsafe {
u_sampler_view_default_template(&mut res, self.pipe, self.as_ref().format()); u_sampler_view_default_template(&mut res, self.pipe, format);
} }
if res.target() == pipe_texture_target::PIPE_BUFFER {
res.u.buf.size = self.as_ref().width0;
}
res res
} }
} }