Commit dac5cc3b by Mohan Maiya Committed by Commit Bot

EGL: Add support for EGL_EXT_image_gl_colorspace extension

Add support for creating images with custom colorspace. Bug: angleproject:3756 Tests: angle_end2end_tests --gtest_filter=ImageTest* Change-Id: I9c332c012541c094728d9d9bde7add4189084a33 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2104088Reviewed-by: 's avatarCourtney Goeltzenleuchter <courtneygo@google.com> Commit-Queue: Mohan Maiya <m.maiya@samsung.com>
parent 728b9178
...@@ -164,6 +164,7 @@ Samsung Electronics, Inc. ...@@ -164,6 +164,7 @@ Samsung Electronics, Inc.
Mohan Maiya Mohan Maiya
Peter Mowry Peter Mowry
Sangwon Park Sangwon Park
Saurabh Badenkal
Arm Ltd. Arm Ltd.
Fei Yang Fei Yang
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
"scripts/gl_angle_ext.xml": "scripts/gl_angle_ext.xml":
"079cc4829de7ce638faf7bbf66e141ad", "079cc4829de7ce638faf7bbf66e141ad",
"scripts/registry_xml.py": "scripts/registry_xml.py":
"96820b40e5bb05b74d0bfbf5a19133fc", "d48b9fcf30e2f98210f0b98824e7bd49",
"scripts/wgl.xml": "scripts/wgl.xml":
"aa96419c582af2f6673430e2847693f4", "aa96419c582af2f6673430e2847693f4",
"src/libEGL/egl_loader_autogen.cpp": "src/libEGL/egl_loader_autogen.cpp":
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
"scripts/gl_angle_ext.xml": "scripts/gl_angle_ext.xml":
"079cc4829de7ce638faf7bbf66e141ad", "079cc4829de7ce638faf7bbf66e141ad",
"scripts/registry_xml.py": "scripts/registry_xml.py":
"96820b40e5bb05b74d0bfbf5a19133fc", "d48b9fcf30e2f98210f0b98824e7bd49",
"scripts/wgl.xml": "scripts/wgl.xml":
"aa96419c582af2f6673430e2847693f4", "aa96419c582af2f6673430e2847693f4",
"src/libANGLE/Context_gl_1_0_autogen.h": "src/libANGLE/Context_gl_1_0_autogen.h":
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"scripts/gl_angle_ext.xml": "scripts/gl_angle_ext.xml":
"079cc4829de7ce638faf7bbf66e141ad", "079cc4829de7ce638faf7bbf66e141ad",
"scripts/registry_xml.py": "scripts/registry_xml.py":
"96820b40e5bb05b74d0bfbf5a19133fc", "d48b9fcf30e2f98210f0b98824e7bd49",
"src/libANGLE/gl_enum_utils_autogen.cpp": "src/libANGLE/gl_enum_utils_autogen.cpp":
"591432182a8cb304b7a3747ee6cc7b60", "591432182a8cb304b7a3747ee6cc7b60",
"src/libANGLE/gl_enum_utils_autogen.h": "src/libANGLE/gl_enum_utils_autogen.h":
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
"scripts/gl_angle_ext.xml": "scripts/gl_angle_ext.xml":
"079cc4829de7ce638faf7bbf66e141ad", "079cc4829de7ce638faf7bbf66e141ad",
"scripts/registry_xml.py": "scripts/registry_xml.py":
"96820b40e5bb05b74d0bfbf5a19133fc", "d48b9fcf30e2f98210f0b98824e7bd49",
"scripts/wgl.xml": "scripts/wgl.xml":
"aa96419c582af2f6673430e2847693f4", "aa96419c582af2f6673430e2847693f4",
"src/libGL/proc_table_wgl_autogen.cpp": "src/libGL/proc_table_wgl_autogen.cpp":
......
...@@ -133,6 +133,7 @@ supported_egl_extensions = [ ...@@ -133,6 +133,7 @@ supported_egl_extensions = [
"EGL_ANGLE_sync_control_rate", "EGL_ANGLE_sync_control_rate",
"EGL_EXT_create_context_robustness", "EGL_EXT_create_context_robustness",
"EGL_EXT_device_query", "EGL_EXT_device_query",
"EGL_EXT_image_gl_colorspace",
"EGL_EXT_pixel_format_float", "EGL_EXT_pixel_format_float",
"EGL_EXT_platform_base", "EGL_EXT_platform_base",
"EGL_EXT_platform_device", "EGL_EXT_platform_device",
......
...@@ -1338,6 +1338,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const ...@@ -1338,6 +1338,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const
InsertExtensionString("EGL_KHR_image", image, &extensionStrings); InsertExtensionString("EGL_KHR_image", image, &extensionStrings);
InsertExtensionString("EGL_KHR_image_base", imageBase, &extensionStrings); InsertExtensionString("EGL_KHR_image_base", imageBase, &extensionStrings);
InsertExtensionString("EGL_KHR_image_pixmap", imagePixmap, &extensionStrings); InsertExtensionString("EGL_KHR_image_pixmap", imagePixmap, &extensionStrings);
InsertExtensionString("EGL_EXT_image_gl_colorspace", imageGlColorspace, &extensionStrings);
InsertExtensionString("EGL_KHR_gl_colorspace", glColorspace, &extensionStrings); InsertExtensionString("EGL_KHR_gl_colorspace", glColorspace, &extensionStrings);
InsertExtensionString("EGL_EXT_gl_colorspace_scrgb", glColorspaceScrgb, &extensionStrings); InsertExtensionString("EGL_EXT_gl_colorspace_scrgb", glColorspaceScrgb, &extensionStrings);
InsertExtensionString("EGL_EXT_gl_colorspace_scrgb_linear", glColorspaceScrgbLinear, &extensionStrings); InsertExtensionString("EGL_EXT_gl_colorspace_scrgb_linear", glColorspaceScrgbLinear, &extensionStrings);
......
...@@ -1048,6 +1048,9 @@ struct DisplayExtensions ...@@ -1048,6 +1048,9 @@ struct DisplayExtensions
// EGL_ANDROID_framebuffer_target // EGL_ANDROID_framebuffer_target
bool framebufferTargetANDROID = false; bool framebufferTargetANDROID = false;
// EGL_EXT_image_gl_colorspace
bool imageGlColorspace = false;
}; };
struct DeviceExtensions struct DeviceExtensions
......
...@@ -225,7 +225,9 @@ ImageState::ImageState(EGLenum target, ImageSibling *buffer, const AttributeMap ...@@ -225,7 +225,9 @@ ImageState::ImageState(EGLenum target, ImageSibling *buffer, const AttributeMap
format(GL_NONE), format(GL_NONE),
size(), size(),
samples(), samples(),
sourceType(target) sourceType(target),
colorspace(
static_cast<EGLenum>(attribs.get(EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_DEFAULT_EXT)))
{} {}
ImageState::~ImageState() {} ImageState::~ImageState() {}
...@@ -392,7 +394,19 @@ Error Image::initialize(const Display *display) ...@@ -392,7 +394,19 @@ Error Image::initialize(const Display *display)
ANGLE_TRY(rx::GetAs<ExternalImageSibling>(mState.source)->initialize(display)); ANGLE_TRY(rx::GetAs<ExternalImageSibling>(mState.source)->initialize(display));
} }
mState.format = mState.source->getAttachmentFormat(GL_NONE, mState.imageIndex); mState.format = mState.source->getAttachmentFormat(GL_NONE, mState.imageIndex);
if (mState.colorspace != EGL_GL_COLORSPACE_DEFAULT_EXT)
{
GLenum nonLinearFormat = mState.format.info->sizedInternalFormat;
if (!gl::ColorspaceFormatOverride(mState.colorspace, &nonLinearFormat))
{
// the colorspace format is not supported
return egl::EglBadMatch();
}
mState.format = gl::Format(nonLinearFormat);
}
mState.size = mState.source->getAttachmentSize(mState.imageIndex); mState.size = mState.source->getAttachmentSize(mState.imageIndex);
mState.samples = mState.source->getAttachmentSamples(mState.imageIndex); mState.samples = mState.source->getAttachmentSamples(mState.imageIndex);
......
...@@ -135,6 +135,7 @@ struct ImageState : private angle::NonCopyable ...@@ -135,6 +135,7 @@ struct ImageState : private angle::NonCopyable
gl::Extents size; gl::Extents size;
size_t samples; size_t samples;
EGLenum sourceType; EGLenum sourceType;
EGLenum colorspace;
}; };
class Image final : public RefCountObject, public LabeledObject class Image final : public RefCountObject, public LabeledObject
......
...@@ -782,7 +782,7 @@ static InternalFormatInfoMap BuildInternalFormatInfoMap() ...@@ -782,7 +782,7 @@ static InternalFormatInfoMap BuildInternalFormatInfoMap()
AddRGBAFormat(&map, GL_RGB10_A2, true, 10, 10, 10, 2, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireES<3, 0>, AlwaysSupported, RequireES<3, 0>, RequireES<3, 0>, RequireES<3, 0>); AddRGBAFormat(&map, GL_RGB10_A2, true, 10, 10, 10, 2, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireES<3, 0>, AlwaysSupported, RequireES<3, 0>, RequireES<3, 0>, RequireES<3, 0>);
AddRGBAFormat(&map, GL_RGB10_A2UI, true, 10, 10, 10, 2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, RequireES<3, 0>, RequireES<3, 0>, NeverSupported); AddRGBAFormat(&map, GL_RGB10_A2UI, true, 10, 10, 10, 2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
AddRGBAFormat(&map, GL_SRGB8, true, 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireES<3, 0>, AlwaysSupported, NeverSupported, NeverSupported, NeverSupported); AddRGBAFormat(&map, GL_SRGB8, true, 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireES<3, 0>, AlwaysSupported, NeverSupported, NeverSupported, NeverSupported);
AddRGBAFormat(&map, GL_SRGB8_ALPHA8, true, 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireES<3, 0>, AlwaysSupported, RequireES<3, 0>, RequireESOrExt<3, 0, &Extensions::sRGB>, RequireESOrExt<3, 0, &Extensions::sRGB>); AddRGBAFormat(&map, GL_SRGB8_ALPHA8, true, 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireESOrExt<3, 0, &Extensions::sRGB>, AlwaysSupported, RequireES<3, 0>, RequireESOrExt<3, 0, &Extensions::sRGB>, RequireESOrExt<3, 0, &Extensions::sRGB>);
AddRGBAFormat(&map, GL_R11F_G11F_B10F, true, 11, 11, 10, 0, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_FLOAT, false, RequireES<3, 0>, AlwaysSupported, RequireExt<&Extensions::colorBufferFloat>, RequireExt<&Extensions::colorBufferFloat>, RequireExt<&Extensions::colorBufferFloat>); AddRGBAFormat(&map, GL_R11F_G11F_B10F, true, 11, 11, 10, 0, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_FLOAT, false, RequireES<3, 0>, AlwaysSupported, RequireExt<&Extensions::colorBufferFloat>, RequireExt<&Extensions::colorBufferFloat>, RequireExt<&Extensions::colorBufferFloat>);
AddRGBAFormat(&map, GL_RGB9_E5, true, 9, 9, 9, 0, 5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, GL_FLOAT, false, RequireES<3, 0>, AlwaysSupported, NeverSupported, NeverSupported, NeverSupported); AddRGBAFormat(&map, GL_RGB9_E5, true, 9, 9, 9, 0, 5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, GL_FLOAT, false, RequireES<3, 0>, AlwaysSupported, NeverSupported, NeverSupported, NeverSupported);
AddRGBAFormat(&map, GL_R8I, true, 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, RequireES<3, 0>, RequireES<3, 0>, NeverSupported); AddRGBAFormat(&map, GL_R8I, true, 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
......
...@@ -621,6 +621,7 @@ void DisplayEGL::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -621,6 +621,7 @@ void DisplayEGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
mEGL->hasExtension("EGL_EXT_gl_colorspace_scrgb_linear"); mEGL->hasExtension("EGL_EXT_gl_colorspace_scrgb_linear");
outExtensions->glColorspaceDisplayP3Passthrough = outExtensions->glColorspaceDisplayP3Passthrough =
mEGL->hasExtension("EGL_EXT_gl_colorspace_display_p3_passthrough"); mEGL->hasExtension("EGL_EXT_gl_colorspace_display_p3_passthrough");
outExtensions->imageGlColorspace = mEGL->hasExtension("EGL_EXT_image_gl_colorspace");
} }
outExtensions->imageNativeBuffer = mEGL->hasExtension("EGL_ANDROID_image_native_buffer"); outExtensions->imageNativeBuffer = mEGL->hasExtension("EGL_ANDROID_image_native_buffer");
......
...@@ -211,6 +211,7 @@ void DisplayVk::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -211,6 +211,7 @@ void DisplayVk::generateExtensions(egl::DisplayExtensions *outExtensions) const
getRenderer()->getFeatures().supportsAndroidHardwareBuffer.enabled; getRenderer()->getFeatures().supportsAndroidHardwareBuffer.enabled;
outExtensions->surfacelessContext = true; outExtensions->surfacelessContext = true;
outExtensions->glColorspace = getRenderer()->getFeatures().supportsSwapchainColorspace.enabled; outExtensions->glColorspace = getRenderer()->getFeatures().supportsSwapchainColorspace.enabled;
outExtensions->imageGlColorspace = outExtensions->glColorspace;
#if defined(ANGLE_PLATFORM_ANDROID) #if defined(ANGLE_PLATFORM_ANDROID)
outExtensions->framebufferTargetANDROID = true; outExtensions->framebufferTargetANDROID = true;
......
...@@ -2140,6 +2140,22 @@ Error ValidateCreateImage(const Display *display, ...@@ -2140,6 +2140,22 @@ Error ValidateCreateImage(const Display *display,
} }
break; break;
case EGL_GL_COLORSPACE:
if (!displayExtensions.glColorspace)
{
return EglBadParameter() << "EGL_GL_COLORSPACE cannot be used "
"without EGL_KHR_gl_colorspace support.";
}
switch (value)
{
case EGL_GL_COLORSPACE_DEFAULT_EXT:
break;
default:
ANGLE_TRY(ValidateColorspaceAttribute(displayExtensions, value));
break;
}
break;
case EGL_TEXTURE_INTERNAL_FORMAT_ANGLE: case EGL_TEXTURE_INTERNAL_FORMAT_ANGLE:
if (!displayExtensions.imageD3D11Texture) if (!displayExtensions.imageD3D11Texture)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment