diff --git a/.pick_status.json b/.pick_status.json index a63f2ba9dc5..7b37baa6fa1 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -3014,7 +3014,7 @@ "description": "rusticl/gl: store the mesa_glinterop_export_in", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/gallium/frontends/rusticl/api/memory.rs b/src/gallium/frontends/rusticl/api/memory.rs index 9906a29b84a..a6bccba7119 100644 --- a/src/gallium/frontends/rusticl/api/memory.rs +++ b/src/gallium/frontends/rusticl/api/memory.rs @@ -3040,12 +3040,9 @@ unsafe impl CLInfo for cl_mem { let mem = MemBase::ref_from_raw(*self)?; match *q { CL_GL_MIPMAP_LEVEL => v.write::(0), - CL_GL_TEXTURE_TARGET => v.write::( - mem.gl_obj - .as_ref() - .ok_or(CL_INVALID_GL_OBJECT)? - .gl_object_target, - ), + CL_GL_TEXTURE_TARGET => { + v.write::(mem.gl_obj.as_ref().ok_or(CL_INVALID_GL_OBJECT)?.target()) + } _ => Err(CL_INVALID_VALUE), } } @@ -3081,7 +3078,7 @@ fn create_from_gl( let gl_export_manager = gl_ctx_manager.export_object(&c, target, flags as u32, miplevel, texture)?; - Ok(MemBase::from_gl(c, flags, &gl_export_manager)?) + Ok(MemBase::from_gl(c, flags, gl_export_manager)?) } else { Err(CL_INVALID_CONTEXT) } @@ -3170,8 +3167,8 @@ fn get_gl_object_info( // case they are ignored. // SAFETY: Caller is responsible for providing null pointers or ones // which are valid for a write of the appropriate size. - unsafe { gl_object_type.write_checked(gl_obj.gl_object_type) }; - unsafe { gl_object_name.write_checked(gl_obj.gl_object_name) }; + unsafe { gl_object_type.write_checked(gl_obj.cl_gl_type()?) }; + unsafe { gl_object_name.write_checked(gl_obj.name()) }; } None => { // CL_INVALID_GL_OBJECT if there is no GL object associated with memobj. diff --git a/src/gallium/frontends/rusticl/core/gl.rs b/src/gallium/frontends/rusticl/core/gl.rs index b11cfbaf168..2afe9ed5a19 100644 --- a/src/gallium/frontends/rusticl/core/gl.rs +++ b/src/gallium/frontends/rusticl/core/gl.rs @@ -419,12 +419,49 @@ impl Drop for GLExportManager { } pub struct GLObject { - pub gl_object_target: cl_GLenum, - pub gl_object_type: cl_gl_object_type, - pub gl_object_name: cl_GLuint, + pub props: mesa_glinterop_export_in, pub shadow_map: CLGLMappings, } +// SAFETY: We never use the pointer inside mesa_glinterop_export_in for anything. +unsafe impl Send for GLObject {} +unsafe impl Sync for GLObject {} + +impl GLObject { + pub fn cl_gl_type(&self) -> CLResult { + Ok(match self.props.target { + GL_ARRAY_BUFFER => CL_GL_OBJECT_BUFFER, + GL_TEXTURE_BUFFER => CL_GL_OBJECT_TEXTURE_BUFFER, + GL_RENDERBUFFER => CL_GL_OBJECT_RENDERBUFFER, + GL_TEXTURE_1D => CL_GL_OBJECT_TEXTURE1D, + GL_TEXTURE_1D_ARRAY => CL_GL_OBJECT_TEXTURE1D_ARRAY, + GL_TEXTURE_CUBE_MAP_NEGATIVE_X + | GL_TEXTURE_CUBE_MAP_NEGATIVE_Y + | GL_TEXTURE_CUBE_MAP_NEGATIVE_Z + | GL_TEXTURE_CUBE_MAP_POSITIVE_X + | GL_TEXTURE_CUBE_MAP_POSITIVE_Y + | GL_TEXTURE_CUBE_MAP_POSITIVE_Z + | GL_TEXTURE_2D + | GL_TEXTURE_RECTANGLE => CL_GL_OBJECT_TEXTURE2D, + GL_TEXTURE_2D_ARRAY => CL_GL_OBJECT_TEXTURE2D_ARRAY, + GL_TEXTURE_3D => CL_GL_OBJECT_TEXTURE3D, + _ => return Err(CL_INVALID_VALUE), + }) + } + + pub fn cl_mem_type(&self) -> CLResult { + mem_type_from_gl(self.props.target) + } + + pub fn name(&self) -> cl_GLuint { + self.props.obj + } + + pub fn target(&self) -> cl_GLuint { + self.props.target + } +} + pub fn create_shadow_slice( cube_map: &HashMap<&'static Device, Arc>, image_format: cl_image_format, @@ -461,14 +498,14 @@ pub fn copy_cube_to_slice(ctx: &QueueContext, mem_objects: &[Mem]) -> CLResult<( continue; }; let gl_obj = image.gl_obj.as_ref().unwrap(); - if !is_cube_map_face(gl_obj.gl_object_target) { + if !is_cube_map_face(gl_obj.target()) { continue; } let width = image.image_desc.image_width; let height = image.image_desc.image_height; // Fill in values for doing the copy - let idx = get_array_slice_idx(gl_obj.gl_object_target); + let idx = get_array_slice_idx(gl_obj.target()); let src_origin = CLVec::::new([0, 0, idx]); let dst_offset: [u32; 3] = [0, 0, 0]; let region = CLVec::::new([width, height, 1]); @@ -489,14 +526,14 @@ pub fn copy_slice_to_cube(ctx: &QueueContext, mem_objects: &[Mem]) -> CLResult<( continue; }; let gl_obj = image.gl_obj.as_ref().unwrap(); - if !is_cube_map_face(gl_obj.gl_object_target) { + if !is_cube_map_face(gl_obj.target()) { continue; } let width = image.image_desc.image_width; let height = image.image_desc.image_height; // Fill in values for doing the copy - let idx = get_array_slice_idx(gl_obj.gl_object_target) as u32; + let idx = get_array_slice_idx(gl_obj.target()) as u32; let src_origin = CLVec::::new([0, 0, 0]); let dst_offset: [u32; 3] = [0, 0, idx]; let region = CLVec::::new([width, height, 1]); @@ -534,15 +571,12 @@ pub fn cl_to_interop_flags(flags: u32) -> u32 { } } -pub fn target_from_gl(target: u32) -> CLResult<(u32, u32)> { - // CL_INVALID_IMAGE_FORMAT_DESCRIPTOR if the OpenGL texture - // internal format does not map to a supported OpenCL image format. +pub fn mem_type_from_gl(target: u32) -> CLResult { Ok(match target { - GL_ARRAY_BUFFER => (CL_MEM_OBJECT_BUFFER, CL_GL_OBJECT_BUFFER), - GL_TEXTURE_BUFFER => (CL_MEM_OBJECT_IMAGE1D_BUFFER, CL_GL_OBJECT_TEXTURE_BUFFER), - GL_RENDERBUFFER => (CL_MEM_OBJECT_IMAGE2D, CL_GL_OBJECT_RENDERBUFFER), - GL_TEXTURE_1D => (CL_MEM_OBJECT_IMAGE1D, CL_GL_OBJECT_TEXTURE1D), - GL_TEXTURE_1D_ARRAY => (CL_MEM_OBJECT_IMAGE1D_ARRAY, CL_GL_OBJECT_TEXTURE1D_ARRAY), + GL_ARRAY_BUFFER => CL_MEM_OBJECT_BUFFER, + GL_TEXTURE_BUFFER => CL_MEM_OBJECT_IMAGE1D_BUFFER, + GL_TEXTURE_1D => CL_MEM_OBJECT_IMAGE1D, + GL_TEXTURE_1D_ARRAY => CL_MEM_OBJECT_IMAGE1D_ARRAY, GL_TEXTURE_CUBE_MAP_NEGATIVE_X | GL_TEXTURE_CUBE_MAP_NEGATIVE_Y | GL_TEXTURE_CUBE_MAP_NEGATIVE_Z @@ -550,9 +584,10 @@ pub fn target_from_gl(target: u32) -> CLResult<(u32, u32)> { | GL_TEXTURE_CUBE_MAP_POSITIVE_Y | GL_TEXTURE_CUBE_MAP_POSITIVE_Z | GL_TEXTURE_2D - | GL_TEXTURE_RECTANGLE => (CL_MEM_OBJECT_IMAGE2D, CL_GL_OBJECT_TEXTURE2D), - GL_TEXTURE_2D_ARRAY => (CL_MEM_OBJECT_IMAGE2D_ARRAY, CL_GL_OBJECT_TEXTURE2D_ARRAY), - GL_TEXTURE_3D => (CL_MEM_OBJECT_IMAGE3D, CL_GL_OBJECT_TEXTURE3D), + | GL_TEXTURE_RECTANGLE + | GL_RENDERBUFFER => CL_MEM_OBJECT_IMAGE2D, + GL_TEXTURE_2D_ARRAY => CL_MEM_OBJECT_IMAGE2D_ARRAY, + GL_TEXTURE_3D => CL_MEM_OBJECT_IMAGE3D, _ => return Err(CL_INVALID_VALUE), }) } diff --git a/src/gallium/frontends/rusticl/core/memory.rs b/src/gallium/frontends/rusticl/core/memory.rs index 21c652430c9..0f10aaf996c 100644 --- a/src/gallium/frontends/rusticl/core/memory.rs +++ b/src/gallium/frontends/rusticl/core/memory.rs @@ -920,12 +920,12 @@ impl MemBase { pub fn from_gl( context: Arc, flags: cl_mem_flags, - gl_export_manager: &GLExportManager, + gl_export_manager: GLExportManager, ) -> CLResult { - let export_in = &gl_export_manager.export_in; + let export_in = gl_export_manager.export_in; let export_out = &gl_export_manager.export_out; - let (mem_type, gl_object_type) = target_from_gl(export_in.target)?; + let mem_type = mem_type_from_gl(export_in.target)?; let gl_mem_props = gl_export_manager.get_gl_mem_props()?; // Handle Buffers @@ -987,9 +987,7 @@ impl MemBase { size: gl_mem_props.size(), props: Properties::default(), gl_obj: Some(GLObject { - gl_object_target: gl_export_manager.export_in.target, - gl_object_type: gl_object_type, - gl_object_name: export_in.obj, + props: export_in, shadow_map: shadow_map, }), cbs: Mutex::new(Vec::new()),