summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2012-03-25 00:49:46 -0700
committerMathias Agopian <mathias@google.com>2012-03-25 00:49:46 -0700
commit7db993a98b9239bd4e384cc4aa128262fe3cf52c (patch)
treeeaae74ffe09790c10cb331ed5671a4ef73f0a185
parent94ff71fd6a4eeb36f02d277a0d2c96230b5c9ee6 (diff)
downloadframeworks_native-7db993a98b9239bd4e384cc4aa128262fe3cf52c.zip
frameworks_native-7db993a98b9239bd4e384cc4aa128262fe3cf52c.tar.gz
frameworks_native-7db993a98b9239bd4e384cc4aa128262fe3cf52c.tar.bz2
debug.egl.finish can be used to force a glFinish() when eglSwapBuffers() is called
this debug property is evaludated at eglInitialize() time. Change-Id: Ie439e4aac87f7fdc6ab2add86183d6d042f3ee8b
-rw-r--r--opengl/libs/EGL/eglApi.cpp12
-rw-r--r--opengl/libs/EGL/egl_display.cpp9
-rw-r--r--opengl/libs/EGL/egl_display.h1
3 files changed, 21 insertions, 1 deletions
diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp
index a1bd82d..8bfa16d 100644
--- a/opengl/libs/EGL/eglApi.cpp
+++ b/opengl/libs/EGL/eglApi.cpp
@@ -30,6 +30,7 @@
#include <cutils/log.h>
#include <cutils/atomic.h>
+#include <cutils/compiler.h>
#include <cutils/properties.h>
#include <cutils/memory.h>
@@ -732,6 +733,17 @@ EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
#endif
egl_surface_t const * const s = get_surface(draw);
+
+ if (CC_UNLIKELY(dp->finishOnSwap)) {
+ uint32_t pixel;
+ egl_context_t * const c = get_context( egl_tls_t::getContext() );
+ if (c) {
+ // glReadPixels() ensures that the frame is complete
+ s->cnx->hooks[c->version]->gl.glReadPixels(0,0,1,1,
+ GL_RGBA,GL_UNSIGNED_BYTE,&pixel);
+ }
+ }
+
return s->cnx->egl.eglSwapBuffers(dp->disp.dpy, s->surface);
}
diff --git a/opengl/libs/EGL/egl_display.cpp b/opengl/libs/EGL/egl_display.cpp
index f1e493d..b80afd6 100644
--- a/opengl/libs/EGL/egl_display.cpp
+++ b/opengl/libs/EGL/egl_display.cpp
@@ -22,6 +22,7 @@
#include "egl_tls.h"
#include "egl_impl.h"
#include "Loader.h"
+#include <cutils/properties.h>
// ----------------------------------------------------------------------------
namespace android {
@@ -66,7 +67,7 @@ extern void setGLHooksThreadSpecific(gl_hooks_t const *value);
egl_display_t egl_display_t::sDisplay[NUM_DISPLAYS];
egl_display_t::egl_display_t() :
- magic('_dpy'), refs(0) {
+ magic('_dpy'), finishOnSwap(false), refs(0) {
}
egl_display_t::~egl_display_t() {
@@ -232,6 +233,12 @@ EGLBoolean egl_display_t::initialize(EGLint *major, EGLint *minor) {
egl_cache_t::get()->initialize(this);
+ char value[PROPERTY_VALUE_MAX];
+ property_get("debug.egl.finish", value, "0");
+ if (atoi(value)) {
+ finishOnSwap = true;
+ }
+
refs++;
if (major != NULL)
*major = VERSION_MAJOR;
diff --git a/opengl/libs/EGL/egl_display.h b/opengl/libs/EGL/egl_display.h
index 6348228..43738ea 100644
--- a/opengl/libs/EGL/egl_display.h
+++ b/opengl/libs/EGL/egl_display.h
@@ -107,6 +107,7 @@ private:
public:
DisplayImpl disp;
+ bool finishOnSwap;
private:
uint32_t refs;