summaryrefslogtreecommitdiffstats
path: root/opengl/libs/EGL/egl_display.cpp
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2011-11-13 23:52:47 -0800
committerMathias Agopian <mathias@google.com>2011-11-14 19:05:45 -0800
commite88740e6264d829099d04bbe57d1ec2b14996c40 (patch)
treebef49e54d8541fda96a8defd68807efa1573d662 /opengl/libs/EGL/egl_display.cpp
parent274e03c90ee6054e81a16b1bd0a54258e08ddee9 (diff)
downloadframeworks_base-e88740e6264d829099d04bbe57d1ec2b14996c40.zip
frameworks_base-e88740e6264d829099d04bbe57d1ec2b14996c40.tar.gz
frameworks_base-e88740e6264d829099d04bbe57d1ec2b14996c40.tar.bz2
rework a bit how we manage EGL extensions
- don't advertise extensions that are not supported by any implementation - remove EGL_ANDROID_swap_rectangle which is not implemented by anybody and confuses people - add some comments about mandatory extensions Bug: 5428001 Change-Id: Id8dc48116ac1d1eb79ec9ef55d03e29d4257c1f3
Diffstat (limited to 'opengl/libs/EGL/egl_display.cpp')
-rw-r--r--opengl/libs/EGL/egl_display.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/opengl/libs/EGL/egl_display.cpp b/opengl/libs/EGL/egl_display.cpp
index 2935832..862b48d 100644
--- a/opengl/libs/EGL/egl_display.cpp
+++ b/opengl/libs/EGL/egl_display.cpp
@@ -14,6 +14,8 @@
** limitations under the License.
*/
+#include <string.h>
+
#include "egl_cache.h"
#include "egl_display.h"
#include "egl_object.h"
@@ -25,6 +27,36 @@
namespace android {
// ----------------------------------------------------------------------------
+static char const * const sVendorString = "Android";
+static char const * const sVersionString = "1.4 Android META-EGL";
+static char const * const sClientApiString = "OpenGL ES";
+
+// this is the list of EGL extensions that are exposed to applications
+// some of them are mandatory because used by the ANDROID system.
+//
+// mandatory extensions are required per the CDD and not explicitly
+// checked during EGL initialization. the system *assumes* these extensions
+// are present. the system may not function properly if some mandatory
+// extensions are missing.
+//
+// NOTE: sExtensionString MUST be have a single space as the last character.
+//
+static char const * const sExtensionString =
+ "EGL_KHR_image " // mandatory
+ "EGL_KHR_image_base " // mandatory
+ "EGL_KHR_image_pixmap "
+ "EGL_KHR_gl_texture_2D_image "
+ "EGL_KHR_gl_texture_cubemap_image "
+ "EGL_KHR_gl_renderbuffer_image "
+ "EGL_KHR_fence_sync "
+ "EGL_NV_system_time "
+ "EGL_ANDROID_image_native_buffer " // mandatory
+ ;
+
+// extensions not exposed to applications but used by the ANDROID system
+// "EGL_ANDROID_recordable " // mandatory
+// "EGL_ANDROID_blob_cache " // strongly recommended
+
extern void initEglTraceLevel();
extern void setGLHooksThreadSpecific(gl_hooks_t const *value);
@@ -174,6 +206,36 @@ EGLBoolean egl_display_t::initialize(EGLint *major, EGLint *minor) {
}
}
+ // the query strings are per-display
+ mVendorString.setTo(sVendorString);
+ mVersionString.setTo(sVersionString);
+ mClientApiString.setTo(sClientApiString);
+
+ // we only add extensions that exist in at least one implementation
+ char const* start = sExtensionString;
+ char const* end;
+ do {
+ // find the space separating this extension for the next one
+ end = strchr(start, ' ');
+ if (end) {
+ // length of the extension string
+ const size_t len = end - start;
+ // NOTE: we could avoid the copy if we had strnstr.
+ const String8 ext(start, len);
+ // now go through all implementations and look for this extension
+ for (int i = 0; i < IMPL_NUM_IMPLEMENTATIONS; i++) {
+ // if we find it, add this extension string to our list
+ // (and don't forget the space)
+ const char* match = strstr(disp[i].queryString.extensions, ext.string());
+ if (match && (match[len] == ' ' || match[len] == 0)) {
+ mExtensionString.append(start, len+1);
+ }
+ }
+ // process the next extension string, and skip the space.
+ start = end + 1;
+ }
+ } while (end);
+
egl_cache_t::get()->initialize(this);
EGLBoolean res = EGL_FALSE;