blob: abe0b6c43fd77cbcedc800aa5322e5b845ffa22c [file]
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<u8>;
fn format_info(&self) -> Option<(u8, bool)>;
fn to_pipe_format(&self) -> Option<pipe_format>;
fn channel_size(&self) -> Option<u8> {
if let Some(packed) = self.is_packed() {
assert!(!packed);
self.format_info().map(|i| i.0)
} else {
None
}
}
fn packed_size(&self) -> Option<u8> {
if let Some(packed) = self.is_packed() {
assert!(packed);
self.format_info().map(|i| i.0)
} else {
None
}
}
fn is_packed(&self) -> Option<bool> {
self.format_info().map(|i| i.1)
}
fn pixel_size(&self) -> Option<u8> {
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<u8> {
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<pipe_format> {
FORMATS
.iter()
.find(|f| f.cl_image_format == *self)
.map(|f| f.pipe)
}
}