summaryrefslogtreecommitdiff
path: root/src/egl/main/eglsurface.h
diff options
context:
space:
mode:
authorChad Versace <chadversary@chromium.org>2018-04-30 22:32:25 -0700
committerChad Versace <chadversary@chromium.org>2018-05-01 03:15:58 -0700
commitbf85c6b1603c16b15c9dc83919c8bba4e9f92ad2 (patch)
tree658304eaaef07b2dad636843feffc110d910e0db /src/egl/main/eglsurface.h
parent272fd36b242a6428cccd3a236f328b6a85386567 (diff)
CHROMIUM: egl/main: Add bits for EGL_KHR_mutable_render_buffer
A follow-up patch enables EGL_KHR_mutable_render_buffer for Android. This patch is separate from the Android patch because I think it's easier to review the platform-independent bits separately. BUG=b:77899911 TEST=No android-cts-7.1 regressions on Eve. Change-Id: I07470f2862796611b141f69f47f935b97b0e04a1
Diffstat (limited to 'src/egl/main/eglsurface.h')
-rw-r--r--src/egl/main/eglsurface.h33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/egl/main/eglsurface.h b/src/egl/main/eglsurface.h
index 06e3b5b1b81..5d69bf487cf 100644
--- a/src/egl/main/eglsurface.h
+++ b/src/egl/main/eglsurface.h
@@ -78,7 +78,20 @@ struct _egl_surface
* surfaces, the EGL spec hard-codes the EGL_RENDER_BUFFER value and the
* user must not provide it in the attribute list.
*
- * Refer to eglQuerySurface() in the EGL spec.
+ * Normally, the attribute is immutable and after surface creation.
+ * However, EGL_KHR_mutable_render_buffer allows the user to change it in
+ * window surfaces via eglSurfaceAttrib, in which case
+ * eglQuerySurface(EGL_RENDER_BUFFER) will immediately afterwards return
+ * the requested value but the actual render buffer used by the context
+ * does not change until completion of the next eglSwapBuffers call.
+ *
+ * From the EGL_KHR_mutable_render_buffer spec (v12):
+ *
+ * Querying EGL_RENDER_BUFFER returns the buffer which client API
+ * rendering is requested to use. For a window surface, this is the
+ * attribute value specified when the surface was created or last set
+ * via eglSurfaceAttrib.
+ *
* eglQueryContext(EGL_RENDER_BUFFER) ignores this.
*/
EGLenum RequestedRenderBuffer;
@@ -91,6 +104,19 @@ struct _egl_surface
*
* Refer to eglQueryContext(EGL_RENDER_BUFFER) in the EGL spec.
* eglQuerySurface(EGL_RENDER_BUFFER) ignores this.
+ *
+ * If a window surface is bound as the draw surface and has a pending,
+ * user-requested change to EGL_RENDER_BUFFER, then the next eglSwapBuffers
+ * will flush the pending change. (The flush of EGL_RENDER_BUFFER state may
+ * occur without the implicit glFlush induced by eglSwapBuffers). The spec
+ * requires that the flush occur at that time and nowhere else. During the
+ * state-flush, we copy RequestedRenderBuffer to ActiveRenderBuffer.
+ *
+ * From the EGL_KHR_mutable_render_buffer spec (v12):
+ *
+ * If [...] there is a pending change to the EGL_RENDER_BUFFER
+ * attribute, eglSwapBuffers performs an implicit flush operation on the
+ * context and effects the attribute change.
*/
EGLenum ActiveRenderBuffer;
@@ -150,6 +176,11 @@ _eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf, EGLin
extern EGLBoolean
_eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf, EGLint interval);
+extern EGLBoolean
+_eglSurfaceHasMutableRenderBuffer(_EGLSurface *surf);
+
+extern EGLBoolean
+_eglSurfaceInSharedBufferMode(_EGLSurface *surf);
/**
* Increment reference count for the surface.