diff options
| -rw-r--r-- | libs/gui/SurfaceControl.cpp | 12 | ||||
| -rw-r--r-- | opengl/libs/EGL/eglApi.cpp | 32 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayDevice.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 2 |
4 files changed, 38 insertions, 10 deletions
diff --git a/libs/gui/SurfaceControl.cpp b/libs/gui/SurfaceControl.cpp index f4e88f5db8..16e533cd2e 100644 --- a/libs/gui/SurfaceControl.cpp +++ b/libs/gui/SurfaceControl.cpp @@ -46,13 +46,13 @@ namespace android { // ============================================================================ SurfaceControl::SurfaceControl( - const sp<SurfaceComposerClient>& client, + const sp<SurfaceComposerClient>& client, const sp<IBinder>& handle, const sp<IGraphicBufferProducer>& gbp) : mClient(client), mHandle(handle), mGraphicBufferProducer(gbp) { } - + SurfaceControl::~SurfaceControl() { destroy(); @@ -71,7 +71,7 @@ void SurfaceControl::destroy() IPCThreadState::self()->flushCommands(); } -void SurfaceControl::clear() +void SurfaceControl::clear() { // here, the window manager tells us explicitly that we should destroy // the surface's resource. Soon after this call, it will also release @@ -83,7 +83,7 @@ void SurfaceControl::clear() } bool SurfaceControl::isSameSurface( - const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs) + const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs) { if (lhs == 0 || rhs == 0) return false; @@ -181,7 +181,9 @@ sp<Surface> SurfaceControl::getSurface() const { Mutex::Autolock _l(mLock); if (mSurfaceData == 0) { - mSurfaceData = new Surface(mGraphicBufferProducer); + // This surface is always consumed by SurfaceFlinger, so the + // producerControlledByApp value doesn't matter; using false. + mSurfaceData = new Surface(mGraphicBufferProducer, false); } return mSurfaceData; } diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp index d3bc14a4d3..04d5f4598c 100644 --- a/opengl/libs/EGL/eglApi.cpp +++ b/opengl/libs/EGL/eglApi.cpp @@ -49,6 +49,10 @@ using namespace android; +// This extension has not been ratified yet, so can't be shipped. +// Implementation is incomplete and untested. +#define ENABLE_EGL_KHR_GL_COLORSPACE 0 + // ---------------------------------------------------------------------------- namespace android { @@ -82,7 +86,9 @@ extern char const * const gExtensionString = "EGL_KHR_image_base " // mandatory "EGL_KHR_image_pixmap " "EGL_KHR_lock_surface " +#if (ENABLE_EGL_KHR_GL_COLORSPACE != 0) "EGL_KHR_gl_colorspace " +#endif "EGL_KHR_gl_texture_2D_image " "EGL_KHR_gl_texture_cubemap_image " "EGL_KHR_gl_renderbuffer_image " @@ -366,7 +372,7 @@ EGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, // surfaces // ---------------------------------------------------------------------------- -// The EGL_KHR_gl_colorspace spec hasn't been published yet, so these haven't +// The EGL_KHR_gl_colorspace spec hasn't been ratified yet, so these haven't // been added to the Khronos egl.h. #define EGL_GL_COLORSPACE_KHR EGL_VG_COLORSPACE #define EGL_GL_COLORSPACE_SRGB_KHR EGL_VG_COLORSPACE_sRGB @@ -427,7 +433,17 @@ EGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, attr += 2) { if (*attr == EGL_GL_COLORSPACE_KHR && dp->haveExtension("EGL_KHR_gl_colorspace")) { - format = modifyFormatColorspace(format, *(attr+1)); + if (ENABLE_EGL_KHR_GL_COLORSPACE) { + format = modifyFormatColorspace(format, *(attr+1)); + } else { + // Normally we'd pass through unhandled attributes to + // the driver. But in case the driver implements this + // extension but we're disabling it, we want to prevent + // it getting through -- support will be broken without + // our help. + ALOGE("sRGB window surfaces not supported"); + return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); + } } } } @@ -458,7 +474,17 @@ EGLSurface eglCreateWindowSurface( EGLDisplay dpy, EGLConfig config, if (attrib_list && dp->haveExtension("EGL_KHR_gl_colorspace")) { for (const EGLint* attr = attrib_list; *attr != EGL_NONE; attr += 2) { if (*attr == EGL_GL_COLORSPACE_KHR) { - format = modifyFormatColorspace(format, attr[1]); + if (ENABLE_EGL_KHR_GL_COLORSPACE) { + format = modifyFormatColorspace(format, *(attr+1)); + } else { + // Normally we'd pass through unhandled attributes to + // the driver. But in case the driver implements this + // extension but we're disabling it, we want to prevent + // it getting through -- support will be broken without + // our help. + ALOGE("sRGB window surfaces not supported"); + return setError(EGL_BAD_ATTRIBUTE, EGL_NO_SURFACE); + } } } } diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index 61a9361579..917d4cd3c9 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -73,7 +73,7 @@ DisplayDevice::DisplayDevice( mLayerStack(NO_LAYER_STACK), mOrientation() { - mNativeWindow = new Surface(producer); + mNativeWindow = new Surface(producer, false); ANativeWindow* const window = mNativeWindow.get(); int format; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index fa1ea09896..def4618118 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2782,7 +2782,7 @@ status_t SurfaceFlinger::captureScreenImplLocked( // create a surface (because we're a producer, and we need to // dequeue/queue a buffer) - sp<Surface> sur = new Surface(producer); + sp<Surface> sur = new Surface(producer, false); ANativeWindow* window = sur.get(); status_t result = NO_ERROR; |