From: Karol Herbst Date: Fri, 15 Apr 2022 11:36:00 +0000 (+0200) Subject: rusticl/mem: fix IMAGE1D_BUFFER X-Git-Tag: upstream/22.3.5~3261 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=de292ee3b8a3688b32f02d4e4cd0aa3040b95cfe;p=platform%2Fupstream%2Fmesa.git rusticl/mem: fix IMAGE1D_BUFFER Signed-off-by: Karol Herbst Acked-by: Alyssa Rosenzweig Part-of: --- diff --git a/src/gallium/frontends/rusticl/api/memory.rs b/src/gallium/frontends/rusticl/api/memory.rs index eef984e..c9fd718 100644 --- a/src/gallium/frontends/rusticl/api/memory.rs +++ b/src/gallium/frontends/rusticl/api/memory.rs @@ -383,7 +383,7 @@ fn validate_image_desc( host_ptr: *mut ::std::os::raw::c_void, elem_size: usize, devs: &[Arc], -) -> CLResult { +) -> CLResult<(cl_image_desc, Option>)> { // CL_INVALID_IMAGE_DESCRIPTOR if values specified in image_desc are not valid 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 let p = unsafe { &desc.anon_1.mem_object }; - if !p.is_null() { - let p = p.get_ref()?; + let parent = if !p.is_null() { + let p = p.get_arc()?; if !match desc.image_type { CL_MEM_OBJECT_IMAGE1D_BUFFER => p.is_buffer(), CL_MEM_OBJECT_IMAGE2D => !p.is_buffer(), @@ -461,7 +461,10 @@ fn validate_image_desc( } { 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 // 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 { @@ -680,7 +683,11 @@ pub fn create_image_with_properties( .ok_or(CL_INVALID_OPERATION)?; 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())?; // 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_host_ptr(host_ptr, 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. @@ -712,6 +718,7 @@ pub fn create_image_with_properties( Ok(cl_mem::from_arc(Mem::new_image( c, + parent, desc.image_type, flags, format, diff --git a/src/gallium/frontends/rusticl/core/kernel.rs b/src/gallium/frontends/rusticl/core/kernel.rs index 6504ec7..6788c82 100644 --- a/src/gallium/frontends/rusticl/core/kernel.rs +++ b/src/gallium/frontends/rusticl/core/kernel.rs @@ -6,6 +6,7 @@ use crate::api::icd::*; use crate::api::util::cl_prop; use crate::core::device::*; use crate::core::event::*; +use crate::core::format::*; use crate::core::memory::*; use crate::core::program::*; use crate::core::queue::*; @@ -557,11 +558,12 @@ impl Kernel { input.extend_from_slice(&mem.offset.to_ne_bytes()); resource_info.push((Some(res.clone()), arg.offset)); } else { + let format = mem.image_format.to_pipe_format().unwrap(); 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) } else { - sviews.push(res.clone()); + sviews.push((res.clone(), format)); (&mut tex_formats, &mut tex_orders) }; @@ -649,7 +651,10 @@ impl Kernel { let mut globals: Vec<*mut u32> = Vec::new(); 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 .iter() .map(|s| ctx.create_sampler_state(s)) diff --git a/src/gallium/frontends/rusticl/core/memory.rs b/src/gallium/frontends/rusticl/core/memory.rs index eb60c61..0f08a05 100644 --- a/src/gallium/frontends/rusticl/core/memory.rs +++ b/src/gallium/frontends/rusticl/core/memory.rs @@ -286,6 +286,7 @@ impl Mem { pub fn new_image( context: Arc, + parent: Option>, mem_type: cl_mem_object_type, flags: cl_mem_flags, image_format: &cl_image_format, @@ -312,12 +313,16 @@ impl Mem { image_desc.image_array_size = 1; } - let texture = context.create_texture( - &image_desc, - image_format, - host_ptr, - bit_check(flags, CL_MEM_COPY_HOST_PTR), - )?; + let texture = if parent.is_none() { + Some(context.create_texture( + &image_desc, + image_format, + host_ptr, + bit_check(flags, CL_MEM_COPY_HOST_PTR), + )?) + } else { + None + }; let host_ptr = if bit_check(flags, CL_MEM_USE_HOST_PTR) { host_ptr @@ -328,7 +333,7 @@ impl Mem { Ok(Arc::new(Self { base: CLObjectBase::new(), context: context, - parent: None, + parent: parent, mem_type: mem_type, flags: flags, size: image_desc.pixels() * image_format.pixel_size().unwrap() as usize, @@ -339,7 +344,7 @@ impl Mem { image_elem_size: image_elem_size, props: props, cbs: Mutex::new(Vec::new()), - res: Some(texture), + res: texture, maps: Mappings::new(), })) } diff --git a/src/gallium/frontends/rusticl/core/util.rs b/src/gallium/frontends/rusticl/core/util.rs index bbc48dd..8dfedc1 100644 --- a/src/gallium/frontends/rusticl/core/util.rs +++ b/src/gallium/frontends/rusticl/core/util.rs @@ -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_IMAGE1D_ARRAY => pipe_texture_target::PIPE_TEXTURE_1D_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, } } diff --git a/src/gallium/frontends/rusticl/mesa/pipe/context.rs b/src/gallium/frontends/rusticl/mesa/pipe/context.rs index c4382ce..24640dc 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/context.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/context.rs @@ -286,8 +286,12 @@ impl PipeContext { } } - pub fn create_sampler_view(&self, res: &PipeResource) -> *mut pipe_sampler_view { - let template = res.pipe_sampler_view_template(); + pub fn create_sampler_view( + &self, + res: &PipeResource, + format: pipe_format, + ) -> *mut pipe_sampler_view { + let template = res.pipe_sampler_view_template(format); unsafe { self.pipe.as_ref().create_sampler_view.unwrap()( self.pipe.as_ptr(), diff --git a/src/gallium/frontends/rusticl/mesa/pipe/resource.rs b/src/gallium/frontends/rusticl/mesa/pipe/resource.rs index 63cf919..24c512b 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/resource.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/resource.rs @@ -29,7 +29,7 @@ impl PipeResource { 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 { pipe_image_view__bindgen_ty_1 { buf: pipe_image_view__bindgen_ty_1__bindgen_ty_2 { @@ -54,18 +54,23 @@ impl PipeResource { pipe_image_view { resource: self.pipe(), - format: self.as_ref().format(), + format: format, access: 0, shader_access: PIPE_IMAGE_ACCESS_WRITE as u16, 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(); 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 } }