mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-08 12:50:12 +01:00
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:
parent
d0121cdfd2
commit
5495dab304
4 changed files with 64 additions and 34 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()),
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue