diff --git a/docs/features.txt b/docs/features.txt index ee684116c1f..66f11f60577 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -799,7 +799,7 @@ Clover extensions that are not part of any OpenCL version: Rusticl OpenCL 1.0 -- all DONE: Image support DONE - - Optional image formats not started + - Optional image formats in progress Rusticl OpenCL 1.1 -- all DONE: @@ -859,10 +859,10 @@ Rusticl OpenCL 2.0 -- all DONE: - Additional queries for clGetDeviceInfo DONE Pipes not started Extended 2D images creation in progress - - CL_ABGR not started + - CL_ABGR DONE - cl_khr_image2d_from_buffer DONE (iris, llvmpipe) - cl_khr_depth_images not started - - from sRGB images not started + - from sRGB images in progress clCreateSamplerWithProperties DONE Non-uniform work-group sizes not started cl_khr_3d_image_writes DONE diff --git a/src/gallium/frontends/rusticl/core/device.rs b/src/gallium/frontends/rusticl/core/device.rs index 5eb2fc88c9e..bc82500105e 100644 --- a/src/gallium/frontends/rusticl/core/device.rs +++ b/src/gallium/frontends/rusticl/core/device.rs @@ -232,22 +232,31 @@ impl Device { ) { flags |= CL_MEM_READ_ONLY; } - if self.screen.is_format_supported( - f.pipe, - cl_mem_type_to_texture_target(t), - PIPE_BIND_SHADER_IMAGE, - ) { + + // TODO: cl_khr_srgb_image_writes + if !f.is_srgb + && self.screen.is_format_supported( + f.pipe, + cl_mem_type_to_texture_target(t), + PIPE_BIND_SHADER_IMAGE, + ) + { flags |= CL_MEM_WRITE_ONLY; // TODO: enable once we support it // flags |= CL_MEM_KERNEL_READ_AND_WRITE; } - if self.screen.is_format_supported( - f.pipe, - cl_mem_type_to_texture_target(t), - PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_SHADER_IMAGE, - ) { + + // TODO: cl_khr_srgb_image_writes + if !f.is_srgb + && self.screen.is_format_supported( + f.pipe, + cl_mem_type_to_texture_target(t), + PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_SHADER_IMAGE, + ) + { flags |= CL_MEM_READ_WRITE; } + fs.insert(t, flags as cl_mem_flags); } self.formats.insert(f.cl_image_format, fs); diff --git a/src/gallium/frontends/rusticl/core/format.rs b/src/gallium/frontends/rusticl/core/format.rs index 30815650c50..2a0ff2316fd 100644 --- a/src/gallium/frontends/rusticl/core/format.rs +++ b/src/gallium/frontends/rusticl/core/format.rs @@ -7,6 +7,7 @@ pub struct RusticlImageFormat { pub req_for_embeded_read_or_write: bool, pub req_for_full_read_and_write: bool, pub req_for_full_cl2: bool, + pub is_srgb: bool, pub pipe: pipe_format, } @@ -42,6 +43,7 @@ pub struct RusticlImageFormat { // FLOAT => 32 FLOAT macro_rules! cl_format_table { ([$(($order: ident, $type: ident) => $pipe: expr,)+]) => { + #[allow(non_upper_case_globals)] const fn cl_format_to_pipe( ch_order: cl_channel_order, ch_type: cl_channel_type @@ -59,30 +61,157 @@ macro_rules! cl_format_table { } cl_format_table!([ - (CL_R, CL_HALF_FLOAT) => pipe_format::PIPE_FORMAT_R16_FLOAT, - (CL_RGBA, CL_HALF_FLOAT) => pipe_format::PIPE_FORMAT_R16G16B16A16_FLOAT, +// broken on iris/gen12 +// (CL_A, CL_HALF_FLOAT) => pipe_format::PIPE_FORMAT_A16_FLOAT, +// (CL_A, CL_FLOAT) => pipe_format::PIPE_FORMAT_A32_FLOAT, +// (CL_A, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_A8_SINT, +// (CL_A, CL_SIGNED_INT16) => pipe_format::PIPE_FORMAT_A16_SINT, + (CL_A, CL_SIGNED_INT32) => pipe_format::PIPE_FORMAT_A32_SINT, +// broken on iris/gen12 +// (CL_A, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_A8_UINT, +// (CL_A, CL_UNSIGNED_INT16) => pipe_format::PIPE_FORMAT_A16_UINT, + (CL_A, CL_UNSIGNED_INT32) => pipe_format::PIPE_FORMAT_A32_UINT, + (CL_A, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_A8_SNORM, + (CL_A, CL_SNORM_INT16) => pipe_format::PIPE_FORMAT_A16_SNORM, + (CL_A, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_A8_UNORM, + (CL_A, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_A16_UNORM, - (CL_R, CL_FLOAT) => pipe_format::PIPE_FORMAT_R32_FLOAT, - (CL_RGBA, CL_FLOAT) => pipe_format::PIPE_FORMAT_R32G32B32A32_FLOAT, + (CL_R, CL_HALF_FLOAT) => pipe_format::PIPE_FORMAT_R16_FLOAT, + (CL_R, CL_FLOAT) => pipe_format::PIPE_FORMAT_R32_FLOAT, + (CL_R, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_R8_SINT, + (CL_R, CL_SIGNED_INT16) => pipe_format::PIPE_FORMAT_R16_SINT, + (CL_R, CL_SIGNED_INT32) => pipe_format::PIPE_FORMAT_R32_SINT, + (CL_R, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_R8_UINT, + (CL_R, CL_UNSIGNED_INT16) => pipe_format::PIPE_FORMAT_R16_UINT, + (CL_R, CL_UNSIGNED_INT32) => pipe_format::PIPE_FORMAT_R32_UINT, + (CL_R, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_R8_SNORM, + (CL_R, CL_SNORM_INT16) => pipe_format::PIPE_FORMAT_R16_SNORM, + (CL_R, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_R8_UNORM, + (CL_R, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_R16_UNORM, - (CL_R, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_R8_SINT, - (CL_RGBA, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_R8G8B8A8_SINT, - (CL_R, CL_SIGNED_INT16) => pipe_format::PIPE_FORMAT_R16_SINT, - (CL_RGBA, CL_SIGNED_INT16) => pipe_format::PIPE_FORMAT_R16G16B16A16_SINT, - (CL_R, CL_SIGNED_INT32) => pipe_format::PIPE_FORMAT_R32_SINT, - (CL_RGBA, CL_SIGNED_INT32) => pipe_format::PIPE_FORMAT_R32G32B32A32_SINT, - (CL_R, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_R8_UINT, - (CL_RGBA, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_R8G8B8A8_UINT, - (CL_R, CL_UNSIGNED_INT16) => pipe_format::PIPE_FORMAT_R16_UINT, - (CL_RGBA, CL_UNSIGNED_INT16) => pipe_format::PIPE_FORMAT_R16G16B16A16_UINT, - (CL_R, CL_UNSIGNED_INT32) => pipe_format::PIPE_FORMAT_R32_UINT, - (CL_RGBA, CL_UNSIGNED_INT32) => pipe_format::PIPE_FORMAT_R32G32B32A32_UINT, + (CL_RA, CL_HALF_FLOAT) => pipe_format::PIPE_FORMAT_R16A16_FLOAT, + (CL_RA, CL_FLOAT) => pipe_format::PIPE_FORMAT_R32A32_FLOAT, + (CL_RA, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_R8A8_SINT, + (CL_RA, CL_SIGNED_INT16) => pipe_format::PIPE_FORMAT_R16A16_SINT, + (CL_RA, CL_SIGNED_INT32) => pipe_format::PIPE_FORMAT_R32A32_SINT, + (CL_RA, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_R8A8_UINT, + (CL_RA, CL_UNSIGNED_INT16) => pipe_format::PIPE_FORMAT_R16A16_UINT, + (CL_RA, CL_UNSIGNED_INT32) => pipe_format::PIPE_FORMAT_R32A32_UINT, + (CL_RA, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_R8A8_SNORM, + (CL_RA, CL_SNORM_INT16) => pipe_format::PIPE_FORMAT_R16A16_SNORM, + (CL_RA, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_R8A8_UNORM, + (CL_RA, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_R16A16_UNORM, - (CL_R, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_R8_UNORM, - (CL_RGBA, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8B8A8_UNORM, - (CL_BGRA, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_B8G8R8A8_UNORM, - (CL_R, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_R16_UNORM, - (CL_RGBA, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_R16G16B16A16_UNORM, + (CL_RG, CL_HALF_FLOAT) => pipe_format::PIPE_FORMAT_R16G16_FLOAT, + (CL_RG, CL_FLOAT) => pipe_format::PIPE_FORMAT_R32G32_FLOAT, + (CL_RG, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_R8G8_SINT, + (CL_RG, CL_SIGNED_INT16) => pipe_format::PIPE_FORMAT_R16G16_SINT, + (CL_RG, CL_SIGNED_INT32) => pipe_format::PIPE_FORMAT_R32G32_SINT, + (CL_RG, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_R8G8_UINT, + (CL_RG, CL_UNSIGNED_INT16) => pipe_format::PIPE_FORMAT_R16G16_UINT, + (CL_RG, CL_UNSIGNED_INT32) => pipe_format::PIPE_FORMAT_R32G32_UINT, + (CL_RG, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8_SNORM, + (CL_RG, CL_SNORM_INT16) => pipe_format::PIPE_FORMAT_R16G16_SNORM, + (CL_RG, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8_UNORM, + (CL_RG, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_R16G16_UNORM, + + (CL_RGB, CL_HALF_FLOAT) => pipe_format::PIPE_FORMAT_R16G16B16_FLOAT, + (CL_RGB, CL_FLOAT) => pipe_format::PIPE_FORMAT_R32G32B32_FLOAT, + (CL_RGB, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_R8G8B8_SINT, + (CL_RGB, CL_SIGNED_INT16) => pipe_format::PIPE_FORMAT_R16G16B16_SINT, + (CL_RGB, CL_SIGNED_INT32) => pipe_format::PIPE_FORMAT_R32G32B32_SINT, + (CL_RGB, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_R8G8B8_UINT, + (CL_RGB, CL_UNSIGNED_INT16) => pipe_format::PIPE_FORMAT_R16G16B16_UINT, + (CL_RGB, CL_UNSIGNED_INT32) => pipe_format::PIPE_FORMAT_R32G32B32_UINT, + (CL_RGB, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8B8_SNORM, + (CL_RGB, CL_SNORM_INT16) => pipe_format::PIPE_FORMAT_R16G16B16_SNORM, + (CL_RGB, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8B8_UNORM, + (CL_RGB, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_R16G16B16_UNORM, +// broken +// (CL_RGB, CL_UNORM_SHORT_565) => pipe_format::PIPE_FORMAT_R5G6B5_UNORM, + + (CL_ABGR, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_A8B8G8R8_SINT, + (CL_ABGR, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_A8B8G8R8_UINT, + (CL_ABGR, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_A8B8G8R8_SNORM, + (CL_ABGR, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_A8B8G8R8_UNORM, + + (CL_ARGB, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_A8R8G8B8_SINT, + (CL_ARGB, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_A8R8G8B8_UINT, + (CL_ARGB, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_A8R8G8B8_SNORM, + (CL_ARGB, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_A8R8G8B8_UNORM, + + (CL_BGRA, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_B8G8R8A8_SINT, + (CL_BGRA, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_B8G8R8A8_UINT, + (CL_BGRA, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_B8G8R8A8_SNORM, + (CL_BGRA, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_B8G8R8A8_UNORM, + + (CL_RGBA, CL_HALF_FLOAT) => pipe_format::PIPE_FORMAT_R16G16B16A16_FLOAT, + (CL_RGBA, CL_FLOAT) => pipe_format::PIPE_FORMAT_R32G32B32A32_FLOAT, + (CL_RGBA, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_R8G8B8A8_SINT, + (CL_RGBA, CL_SIGNED_INT16) => pipe_format::PIPE_FORMAT_R16G16B16A16_SINT, + (CL_RGBA, CL_SIGNED_INT32) => pipe_format::PIPE_FORMAT_R32G32B32A32_SINT, + (CL_RGBA, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_R8G8B8A8_UINT, + (CL_RGBA, CL_UNSIGNED_INT16) => pipe_format::PIPE_FORMAT_R16G16B16A16_UINT, + (CL_RGBA, CL_UNSIGNED_INT32) => pipe_format::PIPE_FORMAT_R32G32B32A32_UINT, + (CL_RGBA, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8B8A8_SNORM, + (CL_RGBA, CL_SNORM_INT16) => pipe_format::PIPE_FORMAT_R16G16B16A16_SNORM, + (CL_RGBA, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8B8A8_UNORM, + (CL_RGBA, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_R16G16B16A16_UNORM, +// broken +// (CL_RGBA, CL_UNORM_INT_101010_2) => pipe_format::PIPE_FORMAT_R10G10B10A2_UNORM, + +// broken +// (CL_RGBx, CL_HALF_FLOAT) => pipe_format::PIPE_FORMAT_R16G16B16X16_FLOAT, +// (CL_RGBx, CL_FLOAT) => pipe_format::PIPE_FORMAT_R32G32B32X32_FLOAT, +// (CL_RGBx, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_R8G8B8X8_SINT, +// (CL_RGBx, CL_SIGNED_INT16) => pipe_format::PIPE_FORMAT_R16G16B16X16_SINT, +// (CL_RGBx, CL_SIGNED_INT32) => pipe_format::PIPE_FORMAT_R32G32B32X32_SINT, +// (CL_RGBx, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_R8G8B8X8_UINT, +// (CL_RGBx, CL_UNSIGNED_INT16) => pipe_format::PIPE_FORMAT_R16G16B16X16_UINT, +// (CL_RGBx, CL_UNSIGNED_INT32) => pipe_format::PIPE_FORMAT_R32G32B32X32_UINT, +// (CL_RGBx, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8B8X8_SNORM, +// (CL_RGBx, CL_SNORM_INT16) => pipe_format::PIPE_FORMAT_R16G16B16X16_SNORM, +// (CL_RGBx, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8B8X8_UNORM, +// (CL_RGBx, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_R16G16B16X16_UNORM, +// (CL_RGBx, CL_UNORM_SHORT_555) => pipe_format::PIPE_FORMAT_R5G5B5X1_UNORM, +// (CL_RGBx, CL_UNORM_INT_101010) => pipe_format::PIPE_FORMAT_R10G10B10X2_UNORM, + + (CL_sRGB, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8B8_SRGB, +// broken on iris and radeonsi +// (CL_sRGBA, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8B8A8_SRGB, +// (CL_sBGRA, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_B8G8R8A8_SRGB, +// broken +// (CL_sRGBx, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_R8G8B8X8_SRGB, + +// broken +// (CL_DEPTH, CL_FLOAT) => pipe_format::PIPE_FORMAT_Z32_FLOAT, +// (CL_DEPTH, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_Z16_UNORM, + + (CL_LUMINANCE, CL_HALF_FLOAT) => pipe_format::PIPE_FORMAT_L16_FLOAT, + (CL_LUMINANCE, CL_FLOAT) => pipe_format::PIPE_FORMAT_L32_FLOAT, + (CL_LUMINANCE, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_L8_SINT, + (CL_LUMINANCE, CL_SIGNED_INT16) => pipe_format::PIPE_FORMAT_L16_SINT, + (CL_LUMINANCE, CL_SIGNED_INT32) => pipe_format::PIPE_FORMAT_L32_SINT, + (CL_LUMINANCE, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_L8_UINT, + (CL_LUMINANCE, CL_UNSIGNED_INT16) => pipe_format::PIPE_FORMAT_L16_UINT, + (CL_LUMINANCE, CL_UNSIGNED_INT32) => pipe_format::PIPE_FORMAT_L32_UINT, + (CL_LUMINANCE, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_L8_SNORM, + (CL_LUMINANCE, CL_SNORM_INT16) => pipe_format::PIPE_FORMAT_L16_SNORM, + (CL_LUMINANCE, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_L8_UNORM, + (CL_LUMINANCE, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_L16_UNORM, + + (CL_INTENSITY, CL_HALF_FLOAT) => pipe_format::PIPE_FORMAT_I16_FLOAT, + (CL_INTENSITY, CL_FLOAT) => pipe_format::PIPE_FORMAT_I32_FLOAT, + (CL_INTENSITY, CL_SIGNED_INT8) => pipe_format::PIPE_FORMAT_I8_SINT, + (CL_INTENSITY, CL_SIGNED_INT16) => pipe_format::PIPE_FORMAT_I16_SINT, + (CL_INTENSITY, CL_SIGNED_INT32) => pipe_format::PIPE_FORMAT_I32_SINT, + (CL_INTENSITY, CL_UNSIGNED_INT8) => pipe_format::PIPE_FORMAT_I8_UINT, + (CL_INTENSITY, CL_UNSIGNED_INT16) => pipe_format::PIPE_FORMAT_I16_UINT, + (CL_INTENSITY, CL_UNSIGNED_INT32) => pipe_format::PIPE_FORMAT_I32_UINT, + (CL_INTENSITY, CL_SNORM_INT8) => pipe_format::PIPE_FORMAT_I8_SNORM, + (CL_INTENSITY, CL_SNORM_INT16) => pipe_format::PIPE_FORMAT_I16_SNORM, + (CL_INTENSITY, CL_UNORM_INT8) => pipe_format::PIPE_FORMAT_I8_UNORM, + (CL_INTENSITY, CL_UNORM_INT16) => pipe_format::PIPE_FORMAT_I16_UNORM, ]); #[rustfmt::skip] @@ -197,6 +326,11 @@ const fn req_for_full_cl2( | (CL_sRGBA, CL_UNORM_INT8)) } +#[allow(non_upper_case_globals)] +const fn is_srgb(ch_order: cl_channel_order) -> bool { + matches!(ch_order, CL_sBGRA | CL_sRGB | CL_sRGBA | CL_sRGBx) +} + const fn rusticl_image_format( ch_order: cl_channel_order, ch_type: cl_channel_type, @@ -215,6 +349,7 @@ const fn rusticl_image_format( req_for_embeded_read_or_write: req_for_embedded_r_or_w(ch_order, ch_type), req_for_full_read_and_write: req_for_full_rw(ch_order, ch_type), req_for_full_cl2: req_for_full_cl2(ch_order, ch_type), + is_srgb: is_srgb(ch_order), pipe: pipe, } }