Commit df0203a9 by Mohan Maiya Committed by Commit Bot

EGL: Add support for EGL_EXT_pixel_format_float extension

Add support for floating point configs. On backends that support rendering to floating point formats, add them to EGL's frambuffer config list Bug: angleproject:3958 Tests: dEQP-EGL.functional.wide_color.*fp16* angle_end2end_tests --gtest_filter=EGLFloatSurfaceTest* Change-Id: Ie65f63013483267985c2b308567bf5025acf750e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1993686 Commit-Queue: Mohan Maiya <m.maiya@samsung.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent d151b459
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
"scripts/generate_loader.py": "scripts/generate_loader.py":
"48c60c668bec42a80378179aae2acc61", "48c60c668bec42a80378179aae2acc61",
"scripts/registry_xml.py": "scripts/registry_xml.py":
"e817317edf2899585efcd8e521dcb23e", "25c1d067256369f668ea7357ec93aef9",
"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":
"d6907cd84d95ac0b32a164194eadcf53", "d6907cd84d95ac0b32a164194eadcf53",
"scripts/registry_xml.py": "scripts/registry_xml.py":
"e817317edf2899585efcd8e521dcb23e", "25c1d067256369f668ea7357ec93aef9",
"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":
"d6907cd84d95ac0b32a164194eadcf53", "d6907cd84d95ac0b32a164194eadcf53",
"scripts/registry_xml.py": "scripts/registry_xml.py":
"e817317edf2899585efcd8e521dcb23e", "25c1d067256369f668ea7357ec93aef9",
"src/libANGLE/gl_enum_utils_autogen.cpp": "src/libANGLE/gl_enum_utils_autogen.cpp":
"fc023ad21e10d2279c8f14686bf838b6", "fc023ad21e10d2279c8f14686bf838b6",
"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":
"d6907cd84d95ac0b32a164194eadcf53", "d6907cd84d95ac0b32a164194eadcf53",
"scripts/registry_xml.py": "scripts/registry_xml.py":
"e817317edf2899585efcd8e521dcb23e", "25c1d067256369f668ea7357ec93aef9",
"scripts/wgl.xml": "scripts/wgl.xml":
"aa96419c582af2f6673430e2847693f4", "aa96419c582af2f6673430e2847693f4",
"src/libGL/proc_table_wgl_autogen.cpp": "src/libGL/proc_table_wgl_autogen.cpp":
......
...@@ -125,6 +125,7 @@ supported_egl_extensions = [ ...@@ -125,6 +125,7 @@ supported_egl_extensions = [
"EGL_CHROMIUM_get_sync_values", "EGL_CHROMIUM_get_sync_values",
"EGL_EXT_create_context_robustness", "EGL_EXT_create_context_robustness",
"EGL_EXT_device_query", "EGL_EXT_device_query",
"EGL_EXT_pixel_format_float",
"EGL_EXT_platform_base", "EGL_EXT_platform_base",
"EGL_EXT_platform_device", "EGL_EXT_platform_device",
"EGL_KHR_debug", "EGL_KHR_debug",
......
...@@ -136,6 +136,7 @@ void DisplayEGL::generateExtensions(egl::DisplayExtensions *outExtensions) const ...@@ -136,6 +136,7 @@ void DisplayEGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
outExtensions->glTextureCubemapImage = mEGL->hasExtension("EGL_KHR_gl_texture_cubemap_image"); outExtensions->glTextureCubemapImage = mEGL->hasExtension("EGL_KHR_gl_texture_cubemap_image");
outExtensions->glTexture3DImage = mEGL->hasExtension("EGL_KHR_gl_texture_3D_image"); outExtensions->glTexture3DImage = mEGL->hasExtension("EGL_KHR_gl_texture_3D_image");
outExtensions->glRenderbufferImage = mEGL->hasExtension("EGL_KHR_gl_renderbuffer_image"); outExtensions->glRenderbufferImage = mEGL->hasExtension("EGL_KHR_gl_renderbuffer_image");
outExtensions->pixelFormatFloat = mEGL->hasExtension("EGL_EXT_pixel_format_float");
outExtensions->glColorspace = mEGL->hasExtension("EGL_KHR_gl_colorspace"); outExtensions->glColorspace = mEGL->hasExtension("EGL_KHR_gl_colorspace");
if (outExtensions->glColorspace) if (outExtensions->glColorspace)
......
...@@ -26,7 +26,8 @@ WindowSurfaceEGL::~WindowSurfaceEGL() {} ...@@ -26,7 +26,8 @@ WindowSurfaceEGL::~WindowSurfaceEGL() {}
egl::Error WindowSurfaceEGL::initialize(const egl::Display *display) egl::Error WindowSurfaceEGL::initialize(const egl::Display *display)
{ {
constexpr EGLint kForwardedWindowSurfaceAttributes[] = { constexpr EGLint kForwardedWindowSurfaceAttributes[] = {
EGL_RENDER_BUFFER, EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_GL_COLORSPACE}; EGL_RENDER_BUFFER, EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_GL_COLORSPACE,
EGL_COLOR_COMPONENT_TYPE_EXT};
native_egl::AttributeVector nativeAttribs = native_egl::AttributeVector nativeAttribs =
native_egl::TrimAttributeMap(mState.attributes, kForwardedWindowSurfaceAttributes); native_egl::TrimAttributeMap(mState.attributes, kForwardedWindowSurfaceAttributes);
......
...@@ -134,7 +134,8 @@ egl::Error DisplayVkWin32::initialize(egl::Display *display) ...@@ -134,7 +134,8 @@ egl::Error DisplayVkWin32::initialize(egl::Display *display)
egl::ConfigSet DisplayVkWin32::generateConfigs() egl::ConfigSet DisplayVkWin32::generateConfigs()
{ {
constexpr GLenum kColorFormats[] = {GL_RGB565, GL_BGRA8_EXT, GL_BGRX8_ANGLEX, GL_RGB10_A2_EXT}; constexpr GLenum kColorFormats[] = {GL_RGB565, GL_BGRA8_EXT, GL_BGRX8_ANGLEX, GL_RGB10_A2_EXT,
GL_RGBA16F_EXT};
return egl_vk::GenerateConfigs(kColorFormats, egl_vk::kConfigDepthStencilFormats, this); return egl_vk::GenerateConfigs(kColorFormats, egl_vk::kConfigDepthStencilFormats, this);
} }
......
...@@ -303,6 +303,19 @@ Error ValidateConfigAttributeValue(const Display *display, EGLAttrib attribute, ...@@ -303,6 +303,19 @@ Error ValidateConfigAttributeValue(const Display *display, EGLAttrib attribute,
} }
break; break;
case EGL_COLOR_COMPONENT_TYPE_EXT:
switch (value)
{
case EGL_COLOR_COMPONENT_TYPE_FIXED_EXT:
case EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT:
case EGL_DONT_CARE:
break;
default:
return EglBadAttribute()
<< "EGL_COLOR_COMPONENT_TYPE_EXT invalid attribute: " << value;
}
break;
default: default:
break; break;
} }
......
...@@ -241,6 +241,102 @@ class EGLSurfaceTest : public ANGLETest ...@@ -241,6 +241,102 @@ class EGLSurfaceTest : public ANGLETest
OSWindow *mOSWindow; OSWindow *mOSWindow;
}; };
class EGLFloatSurfaceTest : public EGLSurfaceTest
{
protected:
EGLFloatSurfaceTest() : EGLSurfaceTest()
{
setWindowWidth(512);
setWindowHeight(512);
}
void testSetUp() override
{
mOSWindow = OSWindow::New();
mOSWindow->initialize("EGLFloatSurfaceTest", 64, 64);
}
void testTearDown() override
{
EGLSurfaceTest::testTearDown();
glDeleteProgram(mProgram);
}
GLuint createProgram()
{
constexpr char kFS[] =
"precision highp float;\n"
"void main()\n"
"{\n"
" gl_FragColor = vec4(1.0, 2.0, 3.0, 4.0);\n"
"}\n";
return CompileProgram(angle::essl1_shaders::vs::Simple(), kFS);
}
bool initializeSurfaceWithFloatConfig()
{
const EGLint configAttributes[] = {EGL_RED_SIZE,
16,
EGL_GREEN_SIZE,
16,
EGL_BLUE_SIZE,
16,
EGL_ALPHA_SIZE,
16,
EGL_COLOR_COMPONENT_TYPE_EXT,
EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT,
EGL_NONE,
EGL_NONE};
initializeDisplay();
EGLConfig config;
if (EGLWindow::FindEGLConfig(mDisplay, configAttributes, &config) == EGL_FALSE)
{
std::cout << "EGLConfig for a float surface is not supported, skipping test"
<< std::endl;
return false;
}
initializeSurface(config);
eglMakeCurrent(mDisplay, mWindowSurface, mWindowSurface, mContext);
mProgram = createProgram();
return true;
}
GLuint mProgram;
};
// Test clearing and checking the color is correct
TEST_P(EGLFloatSurfaceTest, Clearing)
{
ANGLE_SKIP_TEST_IF(!initializeSurfaceWithFloatConfig());
ASSERT_NE(0u, mProgram) << "shader compilation failed.";
ASSERT_GL_NO_ERROR();
GLColor32F clearColor(0.0f, 1.0f, 2.0f, 3.0f);
glClearColor(clearColor.R, clearColor.G, clearColor.B, clearColor.A);
glClear(GL_COLOR_BUFFER_BIT);
ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR32F_EQ(0, 0, clearColor);
}
// Test drawing and checking the color is correct
TEST_P(EGLFloatSurfaceTest, Drawing)
{
ANGLE_SKIP_TEST_IF(!initializeSurfaceWithFloatConfig());
ASSERT_NE(0u, mProgram) << "shader compilation failed.";
ASSERT_GL_NO_ERROR();
glUseProgram(mProgram);
drawQuad(mProgram, essl1_shaders::PositionAttrib(), 0.5f);
EXPECT_PIXEL_32F_EQ(0, 0, 1.0f, 2.0f, 3.0f, 4.0f);
}
class EGLSurfaceTest3 : public EGLSurfaceTest class EGLSurfaceTest3 : public EGLSurfaceTest
{}; {};
...@@ -902,6 +998,11 @@ ANGLE_INSTANTIATE_TEST(EGLSurfaceTest, ...@@ -902,6 +998,11 @@ ANGLE_INSTANTIATE_TEST(EGLSurfaceTest,
WithNoFixture(ES3_VULKAN()), WithNoFixture(ES3_VULKAN()),
WithNoFixture(ES2_VULKAN_SWIFTSHADER()), WithNoFixture(ES2_VULKAN_SWIFTSHADER()),
WithNoFixture(ES3_VULKAN_SWIFTSHADER())); WithNoFixture(ES3_VULKAN_SWIFTSHADER()));
ANGLE_INSTANTIATE_TEST(EGLFloatSurfaceTest,
WithNoFixture(ES2_OPENGL()),
WithNoFixture(ES3_OPENGL()),
WithNoFixture(ES2_VULKAN()),
WithNoFixture(ES3_VULKAN()));
ANGLE_INSTANTIATE_TEST(EGLSurfaceTest3, WithNoFixture(ES3_VULKAN())); ANGLE_INSTANTIATE_TEST(EGLSurfaceTest3, WithNoFixture(ES3_VULKAN()));
#if defined(ANGLE_ENABLE_D3D11) #if defined(ANGLE_ENABLE_D3D11)
......
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