Add support for EGL_EXT_pixel_format_float
Bug: 32146087
Test: run test-opengl-configdump on device.
Change-Id: Ic7843f523a1c4125f6697c58d930aad6fc3248ba
diff --git a/opengl/include/EGL/eglext.h b/opengl/include/EGL/eglext.h
index 8b754d5..027c18d 100644
--- a/opengl/include/EGL/eglext.h
+++ b/opengl/include/EGL/eglext.h
@@ -651,6 +651,13 @@
#endif
#endif
+#ifndef EGL_KHR_pixel_format_float
+#define EGL_KHR_pixel_format_float 1
+#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339 // eglChooseConfig and eglGetConfigAttrib attribute
+#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT 0x333A // Attribute value for COLOR_COMPONENT_TYPE
+#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B // Attribute value for COLOR_COMPONENT_TYPE
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp
index b38b4c2..1672397 100644
--- a/opengl/libs/EGL/eglApi.cpp
+++ b/opengl/libs/EGL/eglApi.cpp
@@ -118,6 +118,7 @@
"EGL_KHR_wait_sync " // strongly recommended
"EGL_ANDROID_recordable " // mandatory
"EGL_KHR_partial_update " // strongly recommended
+ "EGL_EXT_pixel_format_float "
"EGL_EXT_buffer_age " // strongly recommended with partial_update
"EGL_KHR_create_context_no_error "
"EGL_KHR_mutable_render_buffer "
@@ -477,27 +478,50 @@
// modify the EGLconfig's format before setting the native window's
// format.
- // TODO: Add support for HAL_PIXEL_FORMAT_RGBA_FP16
- // by default, just pick RGBA_8888
+ EGLint componentType = EGL_COLOR_COMPONENT_TYPE_FIXED_EXT;
+ cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_COLOR_COMPONENT_TYPE_EXT,
+ &componentType);
+
+ // by default, just pick appropriate RGBA
EGLint format = HAL_PIXEL_FORMAT_RGBA_8888;
+ if (dp->haveExtension("EGL_EXT_pixel_format_float") &&
+ (componentType == EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT)) {
+ format = HAL_PIXEL_FORMAT_RGBA_FP16;
+ }
android_dataspace dataSpace = HAL_DATASPACE_UNKNOWN;
EGLint a = 0;
+ EGLint r, g, b;
+ r = g = b = 0;
+ cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_RED_SIZE, &r);
+ cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_GREEN_SIZE, &g);
+ cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_BLUE_SIZE, &b);
cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_ALPHA_SIZE, &a);
- if (a > 0) {
- // alpha-channel requested, there's really only one suitable format
- format = HAL_PIXEL_FORMAT_RGBA_8888;
- } else {
- EGLint r, g, b;
- r = g = b = 0;
- cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_RED_SIZE, &r);
- cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_GREEN_SIZE, &g);
- cnx->egl.eglGetConfigAttrib(iDpy, config, EGL_BLUE_SIZE, &b);
- EGLint colorDepth = r + g + b;
+ EGLint colorDepth = r + g + b;
+
+ if (a == 0) {
if (colorDepth <= 16) {
format = HAL_PIXEL_FORMAT_RGB_565;
} else {
- format = HAL_PIXEL_FORMAT_RGBX_8888;
+ if (componentType == EGL_COLOR_COMPONENT_TYPE_FIXED_EXT) {
+ if (colorDepth > 24) {
+ format = HAL_PIXEL_FORMAT_RGBA_1010102;
+ } else {
+ format = HAL_PIXEL_FORMAT_RGBX_8888;
+ }
+ } else {
+ format = HAL_PIXEL_FORMAT_RGBA_FP16;
+ }
+ }
+ } else {
+ if (componentType == EGL_COLOR_COMPONENT_TYPE_FIXED_EXT) {
+ if (colorDepth > 24) {
+ format = HAL_PIXEL_FORMAT_RGBA_1010102;
+ } else {
+ format = HAL_PIXEL_FORMAT_RGBA_8888;
+ }
+ } else {
+ format = HAL_PIXEL_FORMAT_RGBA_FP16;
}
}
diff --git a/opengl/tests/configdump/configdump.cpp b/opengl/tests/configdump/configdump.cpp
index 69b9eb6..2a94598 100644
--- a/opengl/tests/configdump/configdump.cpp
+++ b/opengl/tests/configdump/configdump.cpp
@@ -18,6 +18,7 @@
#include <stdio.h>
#include <EGL/egl.h>
+#include <EGL/eglext.h>
#define ATTRIBUTE(_attr) { _attr, #_attr }
@@ -26,6 +27,7 @@
char const* name;
};
+// clang-format off
Attribute attributes[] = {
ATTRIBUTE( EGL_BUFFER_SIZE ),
ATTRIBUTE( EGL_ALPHA_SIZE ),
@@ -60,8 +62,9 @@
ATTRIBUTE( EGL_RENDERABLE_TYPE ),
ATTRIBUTE( EGL_MATCH_NATIVE_PIXMAP ),
ATTRIBUTE( EGL_CONFORMANT ),
+ ATTRIBUTE( EGL_COLOR_COMPONENT_TYPE_EXT ),
};
-
+// clang-format on
int main(int argc, char** argv)
{
diff --git a/opengl/tools/glgen2/registry/egl.xml b/opengl/tools/glgen2/registry/egl.xml
index c9384ce..518c369 100755
--- a/opengl/tools/glgen2/registry/egl.xml
+++ b/opengl/tools/glgen2/registry/egl.xml
@@ -720,6 +720,9 @@
<enum value="0x332D" name="EGL_YUV_PLANE1_TEXTURE_UNIT_NV"/>
<enum value="0x332E" name="EGL_YUV_PLANE2_TEXTURE_UNIT_NV"/>
<unused start="0x332F" end="0x339F"/>
+ <enum value="0x3339" name="EGL_COLOR_COMPONENT_TYPE_EXT"/>
+ <enum value="0x333A" name="EGL_COLOR_COMPONENT_TYPE_FIXED_EXT"/>
+ <enum value="0x333B" name="EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT"/>
</enums>
<enums namespace="EGL" start="0x33A0" end="0x33AF" vendor="ANGLE" comment="Reserved for Shannon Woods (Bug 13175)">