rusticl/gl: store the mesa_glinterop_export_in

We need it later for proper flushing and waiting.

Cc: mesa-stable
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36249>
(cherry picked from commit 2e1fff8e5d)
This commit is contained in:
Karol Herbst 2025-07-20 18:00:19 +02:00 committed by Eric Engestrom
parent d0121cdfd2
commit 5495dab304
4 changed files with 64 additions and 34 deletions

View file

@ -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

View file

@ -3040,12 +3040,9 @@ unsafe impl CLInfo<cl_gl_texture_info> for cl_mem {
let mem = MemBase::ref_from_raw(*self)?;
match *q {
CL_GL_MIPMAP_LEVEL => v.write::<cl_GLint>(0),
CL_GL_TEXTURE_TARGET => v.write::<cl_GLenum>(
mem.gl_obj
.as_ref()
.ok_or(CL_INVALID_GL_OBJECT)?
.gl_object_target,
),
CL_GL_TEXTURE_TARGET => {
v.write::<cl_GLenum>(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.

View file

@ -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<cl_gl_object_type> {
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<cl_mem_object_type> {
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<PipeResource>>,
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::<usize>::new([0, 0, idx]);
let dst_offset: [u32; 3] = [0, 0, 0];
let region = CLVec::<usize>::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::<usize>::new([0, 0, 0]);
let dst_offset: [u32; 3] = [0, 0, idx];
let region = CLVec::<usize>::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<cl_mem_object_type> {
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),
})
}

View file

@ -920,12 +920,12 @@ impl MemBase {
pub fn from_gl(
context: Arc<Context>,
flags: cl_mem_flags,
gl_export_manager: &GLExportManager,
gl_export_manager: GLExportManager,
) -> CLResult<cl_mem> {
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()),