use crate::api::util::*; use mesa_rust_gen::pipe_format; use rusticl_opencl_gen::*; pub struct RusticlImageFormat { pub cl_image_format: cl_image_format, pub req_for_full_read_or_write: bool, pub req_for_embeded_read_or_write: bool, pub req_for_full_read_and_write: bool, pub req_for_3d_image_write_ext: bool, pub pipe: pipe_format, } pub const fn rusticl_image_format( cl_image_format: cl_image_format, req_for_full_read_or_write: bool, req_for_embeded_read_or_write: bool, req_for_full_read_and_write: bool, req_for_3d_image_write_ext: bool, pipe: pipe_format, ) -> RusticlImageFormat { RusticlImageFormat { cl_image_format: cl_image_format, req_for_full_read_or_write: req_for_full_read_or_write, req_for_embeded_read_or_write: req_for_embeded_read_or_write, req_for_full_read_and_write: req_for_full_read_and_write, req_for_3d_image_write_ext: req_for_3d_image_write_ext, pipe: pipe, } } pub const FORMATS: &[RusticlImageFormat] = &[ rusticl_image_format( cl_image_format(CL_R, CL_HALF_FLOAT), false, false, true, false, pipe_format::PIPE_FORMAT_R16_FLOAT, ), rusticl_image_format( cl_image_format(CL_R, CL_FLOAT), false, false, true, false, pipe_format::PIPE_FORMAT_R32_FLOAT, ), rusticl_image_format( cl_image_format(CL_R, CL_SIGNED_INT8), false, false, true, false, pipe_format::PIPE_FORMAT_R8_SINT, ), rusticl_image_format( cl_image_format(CL_R, CL_SIGNED_INT16), false, false, true, false, pipe_format::PIPE_FORMAT_R16_SINT, ), rusticl_image_format( cl_image_format(CL_R, CL_SIGNED_INT32), false, false, true, false, pipe_format::PIPE_FORMAT_R32_SINT, ), rusticl_image_format( cl_image_format(CL_R, CL_UNORM_INT8), false, false, true, false, pipe_format::PIPE_FORMAT_R8_UNORM, ), rusticl_image_format( cl_image_format(CL_R, CL_UNORM_INT16), false, false, false, false, pipe_format::PIPE_FORMAT_R16_UNORM, ), rusticl_image_format( cl_image_format(CL_R, CL_UNSIGNED_INT8), false, false, true, false, pipe_format::PIPE_FORMAT_R8_UINT, ), rusticl_image_format( cl_image_format(CL_R, CL_UNSIGNED_INT16), false, false, true, false, pipe_format::PIPE_FORMAT_R16_UINT, ), rusticl_image_format( cl_image_format(CL_R, CL_UNSIGNED_INT32), false, false, true, false, pipe_format::PIPE_FORMAT_R32_UINT, ), rusticl_image_format( cl_image_format(CL_RGBA, CL_HALF_FLOAT), true, true, true, true, pipe_format::PIPE_FORMAT_R16G16B16A16_FLOAT, ), rusticl_image_format( cl_image_format(CL_RGBA, CL_FLOAT), true, true, true, true, pipe_format::PIPE_FORMAT_R32G32B32A32_FLOAT, ), rusticl_image_format( cl_image_format(CL_RGBA, CL_SIGNED_INT8), true, true, true, true, pipe_format::PIPE_FORMAT_R8G8B8A8_SINT, ), rusticl_image_format( cl_image_format(CL_RGBA, CL_SIGNED_INT16), true, true, true, true, pipe_format::PIPE_FORMAT_R16G16B16A16_SINT, ), rusticl_image_format( cl_image_format(CL_RGBA, CL_SIGNED_INT32), true, true, true, true, pipe_format::PIPE_FORMAT_R32G32B32A32_SINT, ), rusticl_image_format( cl_image_format(CL_RGBA, CL_UNORM_INT8), true, true, true, true, pipe_format::PIPE_FORMAT_R8G8B8A8_UNORM, ), rusticl_image_format( cl_image_format(CL_RGBA, CL_UNORM_INT16), true, true, false, true, pipe_format::PIPE_FORMAT_R16G16B16A16_UNORM, ), rusticl_image_format( cl_image_format(CL_RGBA, CL_UNSIGNED_INT8), true, true, true, true, pipe_format::PIPE_FORMAT_R8G8B8A8_UINT, ), rusticl_image_format( cl_image_format(CL_RGBA, CL_UNSIGNED_INT16), true, true, true, true, pipe_format::PIPE_FORMAT_R16G16B16A16_UINT, ), rusticl_image_format( cl_image_format(CL_RGBA, CL_UNSIGNED_INT32), true, true, true, true, pipe_format::PIPE_FORMAT_R32G32B32A32_UINT, ), rusticl_image_format( cl_image_format(CL_BGRA, CL_UNORM_INT8), true, false, false, true, pipe_format::PIPE_FORMAT_B8G8R8A8_UNORM, ), ]; pub trait CLFormatInfo { fn channels(&self) -> Option; fn format_info(&self) -> Option<(u8, bool)>; fn to_pipe_format(&self) -> Option; fn channel_size(&self) -> Option { if let Some(packed) = self.is_packed() { assert!(!packed); self.format_info().map(|i| i.0) } else { None } } fn packed_size(&self) -> Option { if let Some(packed) = self.is_packed() { assert!(packed); self.format_info().map(|i| i.0) } else { None } } fn is_packed(&self) -> Option { self.format_info().map(|i| i.1) } fn pixel_size(&self) -> Option { if let Some(packed) = self.is_packed() { if packed { self.packed_size() } else { self.channels().zip(self.channel_size()).map(|(c, s)| c * s) } } else { None } } } impl CLFormatInfo for cl_image_format { #[allow(non_upper_case_globals)] fn channels(&self) -> Option { match self.image_channel_order { CL_R | CL_A | CL_DEPTH | CL_INTENSITY | CL_LUMINANCE => Some(1), CL_RG | CL_RA | CL_Rx => Some(2), CL_RGB | CL_RGx | CL_sRGB => Some(3), CL_RGBA | CL_ARGB | CL_BGRA | CL_ABGR | CL_RGBx | CL_sRGBA | CL_sBGRA | CL_sRGBx => { Some(4) } _ => None, } } fn format_info(&self) -> Option<(u8, bool)> { match self.image_channel_data_type { CL_SIGNED_INT8 | CL_UNSIGNED_INT8 | CL_SNORM_INT8 | CL_UNORM_INT8 => Some((1, false)), CL_SIGNED_INT16 | CL_UNSIGNED_INT16 | CL_SNORM_INT16 | CL_UNORM_INT16 | CL_HALF_FLOAT => Some((2, false)), CL_SIGNED_INT32 | CL_UNSIGNED_INT32 | CL_FLOAT => Some((4, false)), CL_UNORM_SHORT_555 | CL_UNORM_SHORT_565 => Some((2, true)), CL_UNORM_INT_101010 | CL_UNORM_INT_101010_2 => Some((4, true)), _ => None, } } fn to_pipe_format(&self) -> Option { FORMATS .iter() .find(|f| f.cl_image_format == *self) .map(|f| f.pipe) } }