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 @@
"scripts/generate_loader.py":
"48c60c668bec42a80378179aae2acc61",
"scripts/registry_xml.py":
"e817317edf2899585efcd8e521dcb23e",
"25c1d067256369f668ea7357ec93aef9",
"scripts/wgl.xml":
"aa96419c582af2f6673430e2847693f4",
"src/libEGL/egl_loader_autogen.cpp":
......
......@@ -12,7 +12,7 @@
"scripts/gl_angle_ext.xml":
"d6907cd84d95ac0b32a164194eadcf53",
"scripts/registry_xml.py":
"e817317edf2899585efcd8e521dcb23e",
"25c1d067256369f668ea7357ec93aef9",
"scripts/wgl.xml":
"aa96419c582af2f6673430e2847693f4",
"src/libANGLE/Context_gl_1_0_autogen.h":
......
......@@ -6,7 +6,7 @@
"scripts/gl_angle_ext.xml":
"d6907cd84d95ac0b32a164194eadcf53",
"scripts/registry_xml.py":
"e817317edf2899585efcd8e521dcb23e",
"25c1d067256369f668ea7357ec93aef9",
"src/libANGLE/gl_enum_utils_autogen.cpp":
"fc023ad21e10d2279c8f14686bf838b6",
"src/libANGLE/gl_enum_utils_autogen.h":
......
......@@ -10,7 +10,7 @@
"scripts/gl_angle_ext.xml":
"d6907cd84d95ac0b32a164194eadcf53",
"scripts/registry_xml.py":
"e817317edf2899585efcd8e521dcb23e",
"25c1d067256369f668ea7357ec93aef9",
"scripts/wgl.xml":
"aa96419c582af2f6673430e2847693f4",
"src/libGL/proc_table_wgl_autogen.cpp":
......
......@@ -125,6 +125,7 @@ supported_egl_extensions = [
"EGL_CHROMIUM_get_sync_values",
"EGL_EXT_create_context_robustness",
"EGL_EXT_device_query",
"EGL_EXT_pixel_format_float",
"EGL_EXT_platform_base",
"EGL_EXT_platform_device",
"EGL_KHR_debug",
......
......@@ -136,6 +136,7 @@ void DisplayEGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
outExtensions->glTextureCubemapImage = mEGL->hasExtension("EGL_KHR_gl_texture_cubemap_image");
outExtensions->glTexture3DImage = mEGL->hasExtension("EGL_KHR_gl_texture_3D_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");
if (outExtensions->glColorspace)
......
......@@ -26,7 +26,8 @@ WindowSurfaceEGL::~WindowSurfaceEGL() {}
egl::Error WindowSurfaceEGL::initialize(const egl::Display *display)
{
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::TrimAttributeMap(mState.attributes, kForwardedWindowSurfaceAttributes);
......
......@@ -134,7 +134,8 @@ egl::Error DisplayVkWin32::initialize(egl::Display *display)
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);
}
......
......@@ -303,6 +303,19 @@ Error ValidateConfigAttributeValue(const Display *display, EGLAttrib attribute,
}
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:
break;
}
......
......@@ -241,6 +241,102 @@ class EGLSurfaceTest : public ANGLETest
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
{};
......@@ -902,6 +998,11 @@ ANGLE_INSTANTIATE_TEST(EGLSurfaceTest,
WithNoFixture(ES3_VULKAN()),
WithNoFixture(ES2_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()));
#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