summaryrefslogtreecommitdiffstats
path: root/opengl
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2010-11-24 15:59:35 -0800
committerMathias Agopian <mathias@google.com>2010-12-03 14:15:40 -0800
commit698a8aaca2b9e2b4707e39b8f6fc62a91db1a3b5 (patch)
tree45d3d62fb66cedd3bd5201c5e4b77085241a60cb /opengl
parent78d81851a8ef6691541215afb19e5bc690a4c3c0 (diff)
downloadframeworks_base-698a8aaca2b9e2b4707e39b8f6fc62a91db1a3b5.zip
frameworks_base-698a8aaca2b9e2b4707e39b8f6fc62a91db1a3b5.tar.gz
frameworks_base-698a8aaca2b9e2b4707e39b8f6fc62a91db1a3b5.tar.bz2
[3229973, 3247470, ...] set EGLNativeWindowSurface's format in EGL
(there are multiple bugs this should fix) we now use the EGL_NATIVE_VISUAL_ID of a config to set the ANativeWindow's format from eglCreateWindowSurface(), this guarantees that the surface's format will match whatever EGLConfig the user chose. this should fix all current and future config/surface format mismatch and allow users to easily select 32-bits surfaces. Change-Id: I3835d0eb70c75eeecded3c3509a0a8207554c98b
Diffstat (limited to 'opengl')
-rw-r--r--opengl/libs/EGL/egl.cpp33
1 files changed, 25 insertions, 8 deletions
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp
index ab260d5..29a5a96 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -40,6 +40,8 @@
#include <utils/KeyedVector.h>
#include <utils/String8.h>
+#include <ui/egl/android_natives.h>
+
#include "hooks.h"
#include "egl_impl.h"
#include "Loader.h"
@@ -196,15 +198,16 @@ struct egl_surface_t : public egl_object_t
{
typedef egl_object_t::LocalRef<egl_surface_t, EGLSurface> Ref;
- egl_surface_t(EGLDisplay dpy, EGLSurface surface, EGLConfig config,
- int impl, egl_connection_t const* cnx)
- : dpy(dpy), surface(surface), config(config), impl(impl), cnx(cnx) {
+ egl_surface_t(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win,
+ EGLSurface surface, int impl, egl_connection_t const* cnx)
+ : dpy(dpy), surface(surface), config(config), win(win), impl(impl), cnx(cnx) {
}
~egl_surface_t() {
}
EGLDisplay dpy;
EGLSurface surface;
EGLConfig config;
+ sp<ANativeWindow> win;
int impl;
egl_connection_t const* cnx;
};
@@ -984,11 +987,22 @@ EGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config,
egl_display_t const* dp = 0;
egl_connection_t* cnx = validate_display_config(dpy, config, dp);
if (cnx) {
+ EGLDisplay iDpy = dp->disp[ dp->configs[intptr_t(config)].impl ].dpy;
+ EGLConfig iConfig = dp->configs[intptr_t(config)].config;
+ EGLint format;
+
+ // set the native window's buffers format to match this config
+ if (cnx->egl.eglGetConfigAttrib(iDpy,
+ iConfig, EGL_NATIVE_VISUAL_ID, &format)) {
+ if (format != 0) {
+ native_window_set_buffers_geometry(window, 0, 0, format);
+ }
+ }
+
EGLSurface surface = cnx->egl.eglCreateWindowSurface(
- dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
- dp->configs[intptr_t(config)].config, window, attrib_list);
+ iDpy, iConfig, window, attrib_list);
if (surface != EGL_NO_SURFACE) {
- egl_surface_t* s = new egl_surface_t(dpy, surface, config,
+ egl_surface_t* s = new egl_surface_t(dpy, config, window, surface,
dp->configs[intptr_t(config)].impl, cnx);
return s;
}
@@ -1007,7 +1021,7 @@ EGLSurface eglCreatePixmapSurface( EGLDisplay dpy, EGLConfig config,
dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
dp->configs[intptr_t(config)].config, pixmap, attrib_list);
if (surface != EGL_NO_SURFACE) {
- egl_surface_t* s = new egl_surface_t(dpy, surface, config,
+ egl_surface_t* s = new egl_surface_t(dpy, config, NULL, surface,
dp->configs[intptr_t(config)].impl, cnx);
return s;
}
@@ -1025,7 +1039,7 @@ EGLSurface eglCreatePbufferSurface( EGLDisplay dpy, EGLConfig config,
dp->disp[ dp->configs[intptr_t(config)].impl ].dpy,
dp->configs[intptr_t(config)].config, attrib_list);
if (surface != EGL_NO_SURFACE) {
- egl_surface_t* s = new egl_surface_t(dpy, surface, config,
+ egl_surface_t* s = new egl_surface_t(dpy, config, NULL, surface,
dp->configs[intptr_t(config)].impl, cnx);
return s;
}
@@ -1046,6 +1060,9 @@ EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
EGLBoolean result = s->cnx->egl.eglDestroySurface(
dp->disp[s->impl].dpy, s->surface);
if (result == EGL_TRUE) {
+ if (s->win != NULL) {
+ native_window_set_buffers_geometry(s->win.get(), 0, 0, 0);
+ }
_s.terminate();
}
return result;