From: Pan Xiuli <[email protected]> CL_sRGBA with CL_UNNORM_INT8 is the minimum request for OpenCL2.0 and CL_sBGRA is also support by hardware. None of the sRGB surface type suport hardware write.
Signed-off-by: Pan Xiuli <[email protected]> --- backend/src/ocl_common_defines.h | 7 ++++++- src/cl_api.c | 2 +- src/cl_image.c | 19 ++++++++++++++++++- utests/utest_helper.cpp | 2 ++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/backend/src/ocl_common_defines.h b/backend/src/ocl_common_defines.h index cb9190a..1278f25 100644 --- a/backend/src/ocl_common_defines.h +++ b/backend/src/ocl_common_defines.h @@ -5,7 +5,7 @@ // // Common defines for Image intrinsics // Channel order -#define CLK_HAS_ALPHA(color) (color == CLK_A || color == CLK_RA || color == CLK_RGBA || color == CLK_BGRA || color == CLK_ARGB) +#define CLK_HAS_ALPHA(color) (color == CLK_A || color == CLK_RA || color == CLK_RGBA || color == CLK_BGRA || color == CLK_ARGB || color == CLK_sRGBA || color == CLK_sBGRA) enum { CLK_R = 0x10B0, CLK_A = 0x10B1, @@ -29,6 +29,11 @@ enum { CLK_RGx = 0x10BB, CLK_RGBx = 0x10BC #endif +#if (__NV_CL_C_VERSION >= __NV_CL_C_VERSION_2_0) + , + CLK_sRGBA = 0x10C1, + CLK_sBGRA = 0x10C2 +#endif }; diff --git a/src/cl_api.c b/src/cl_api.c index d04ad44..e18ff5c 100644 --- a/src/cl_api.c +++ b/src/cl_api.c @@ -600,7 +600,7 @@ clCreateImage(cl_context context, goto error; } if (image_format->image_channel_order < CL_R || - image_format->image_channel_order > CL_RGBx) { + image_format->image_channel_order > CL_sBGRA) { err = CL_INVALID_IMAGE_FORMAT_DESCRIPTOR; goto error; } diff --git a/src/cl_image.c b/src/cl_image.c index d58bdf3..47298b6 100644 --- a/src/cl_image.c +++ b/src/cl_image.c @@ -91,6 +91,13 @@ cl_image_byte_per_pixel(const cl_image_format *fmt, uint32_t *bpp) return CL_INVALID_IMAGE_FORMAT_DESCRIPTOR; *bpp *= 4; break; + case CL_sRGBA: + case CL_sBGRA: + if (type != CL_UNORM_INT8) + return CL_INVALID_IMAGE_FORMAT_DESCRIPTOR; + *bpp *= 4; + break; + default: return CL_INVALID_IMAGE_FORMAT_DESCRIPTOR; }; @@ -189,13 +196,23 @@ cl_image_get_intel_format(const cl_image_format *fmt) case CL_UNORM_INT8: return I965_SURFACEFORMAT_B8G8R8A8_UNORM; default: return INTEL_UNSUPPORTED_FORMAT; }; + case CL_sRGBA: + switch (type) { + case CL_UNORM_INT8: return I965_SURFACEFORMAT_R8G8B8A8_UNORM_SRGB; + default: return INTEL_UNSUPPORTED_FORMAT; + }; + case CL_sBGRA: + switch (type) { + case CL_UNORM_INT8: return I965_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB; + default: return INTEL_UNSUPPORTED_FORMAT; + }; default: return INTEL_UNSUPPORTED_FORMAT; }; } static const uint32_t cl_image_order[] = { CL_R, CL_A, CL_RG, CL_RA, CL_RGB, CL_RGBA, CL_BGRA, CL_ARGB, - CL_INTENSITY, CL_LUMINANCE, CL_Rx, CL_RGx, CL_RGBx + CL_INTENSITY, CL_LUMINANCE, CL_Rx, CL_RGx, CL_RGBx, CL_sRGBA, CL_sBGRA }; static const uint32_t cl_image_type[] = { diff --git a/utests/utest_helper.cpp b/utests/utest_helper.cpp index d265d4c..f65360d 100644 --- a/utests/utest_helper.cpp +++ b/utests/utest_helper.cpp @@ -169,6 +169,8 @@ cl_test_channel_order_string(cl_channel_order order) DECL_ORDER(Rx); DECL_ORDER(RGx); DECL_ORDER(RGBx); + DECL_ORDER(sRGBA); + DECL_ORDER(sBGRA); #undef DECL_ORDER default: return "Unsupported image channel order"; }; -- 2.5.0 _______________________________________________ Beignet mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/beignet
