Merge "Defer destroying surfaces until not current" into jb-mr2-dev

This commit is contained in:
Jesse Hall 2013-03-07 23:41:45 +00:00 committed by Android (Google) Code Review
commit 86306b5876

View File

@ -147,6 +147,7 @@ struct egl_surface_t
EGLDisplay dpy; EGLDisplay dpy;
EGLConfig config; EGLConfig config;
EGLContext ctx; EGLContext ctx;
bool zombie;
egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat); egl_surface_t(EGLDisplay dpy, EGLConfig config, int32_t depthFormat);
virtual ~egl_surface_t(); virtual ~egl_surface_t();
@ -173,7 +174,7 @@ protected:
egl_surface_t::egl_surface_t(EGLDisplay dpy, egl_surface_t::egl_surface_t(EGLDisplay dpy,
EGLConfig config, EGLConfig config,
int32_t depthFormat) int32_t depthFormat)
: magic(MAGIC), dpy(dpy), config(config), ctx(0) : magic(MAGIC), dpy(dpy), config(config), ctx(0), zombie(false)
{ {
depth.version = sizeof(GGLSurface); depth.version = sizeof(GGLSurface);
depth.data = 0; depth.data = 0;
@ -1580,11 +1581,12 @@ EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface eglSurface)
if (surface->dpy != dpy) if (surface->dpy != dpy)
return setError(EGL_BAD_DISPLAY, EGL_FALSE); return setError(EGL_BAD_DISPLAY, EGL_FALSE);
if (surface->ctx) { if (surface->ctx) {
// FIXME: this surface is current check what the spec says // defer disconnect/delete until no longer current
surface->zombie = true;
} else {
surface->disconnect(); surface->disconnect();
surface->ctx = 0; delete surface;
} }
delete surface;
} }
return EGL_TRUE; return EGL_TRUE;
} }
@ -1736,6 +1738,9 @@ EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw,
if (c->draw) { if (c->draw) {
egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw); egl_surface_t* s = reinterpret_cast<egl_surface_t*>(c->draw);
s->disconnect(); s->disconnect();
s->ctx = EGL_NO_CONTEXT;
if (s->zombie)
delete s;
} }
if (c->read) { if (c->read) {
// FIXME: unlock/disconnect the read surface too // FIXME: unlock/disconnect the read surface too
@ -1777,8 +1782,10 @@ EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw,
egl_surface_t* r = (egl_surface_t*)c->read; egl_surface_t* r = (egl_surface_t*)c->read;
if (d) { if (d) {
c->draw = 0; c->draw = 0;
d->ctx = EGL_NO_CONTEXT;
d->disconnect(); d->disconnect();
d->ctx = EGL_NO_CONTEXT;
if (d->zombie)
delete d;
} }
if (r) { if (r) {
c->read = 0; c->read = 0;