diff options
author | Mathias Agopian <mathias@google.com> | 2009-10-05 18:20:39 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-10-06 17:24:26 -0700 |
commit | 351a7073fb60eb3534ec8c69ab263f057a124500 (patch) | |
tree | a054ba17c87524486ec48c6ac70854a5a5f64240 | |
parent | 6f5f5a095a5a4d42fc656cf8c1e6d0f67594f88d (diff) | |
download | frameworks_base-351a7073fb60eb3534ec8c69ab263f057a124500.zip frameworks_base-351a7073fb60eb3534ec8c69ab263f057a124500.tar.gz frameworks_base-351a7073fb60eb3534ec8c69ab263f057a124500.tar.bz2 |
fix [2168528] enable glTexImage2D code path in SF for software-only buffers
-rw-r--r-- | libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp | 9 | ||||
-rw-r--r-- | libs/surfaceflinger/DisplayHardware/DisplayHardware.h | 1 | ||||
-rw-r--r-- | libs/surfaceflinger/Layer.cpp | 17 | ||||
-rw-r--r-- | libs/surfaceflinger/Layer.h | 1 |
4 files changed, 23 insertions, 5 deletions
diff --git a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp index 8a7abec..f84933e 100644 --- a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp +++ b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp @@ -123,7 +123,7 @@ void DisplayHardware::init(uint32_t dpy) EGLint numConfigs=0; EGLSurface surface; EGLContext context; - mFlags = 0; + mFlags = CACHED_BUFFERS; // TODO: all the extensions below should be queried through // eglGetProcAddress(). @@ -239,12 +239,17 @@ void DisplayHardware::init(uint32_t dpy) eglMakeCurrent(display, surface, surface, context); const char* const gl_extensions = (const char*)glGetString(GL_EXTENSIONS); + const char* const gl_renderer = (const char*)glGetString(GL_RENDERER); LOGI("OpenGL informations:"); LOGI("vendor : %s", glGetString(GL_VENDOR)); - LOGI("renderer : %s", glGetString(GL_RENDERER)); + LOGI("renderer : %s", gl_renderer); LOGI("version : %s", glGetString(GL_VERSION)); LOGI("extensions: %s", gl_extensions); + if (strstr(gl_renderer, "PowerVR SGX 530")) { + LOGD("Assuming uncached graphics buffers."); + mFlags &= ~CACHED_BUFFERS; + } if (strstr(gl_extensions, "GL_ARB_texture_non_power_of_two")) { mFlags |= NPOT_EXTENSION; } diff --git a/libs/surfaceflinger/DisplayHardware/DisplayHardware.h b/libs/surfaceflinger/DisplayHardware/DisplayHardware.h index cb688b7..6914d0c 100644 --- a/libs/surfaceflinger/DisplayHardware/DisplayHardware.h +++ b/libs/surfaceflinger/DisplayHardware/DisplayHardware.h @@ -51,6 +51,7 @@ public: PARTIAL_UPDATES = 0x00020000, // video driver feature SLOW_CONFIG = 0x00040000, // software SWAP_RECTANGLE = 0x00080000, + CACHED_BUFFERS = 0x00100000 }; DisplayHardware( diff --git a/libs/surfaceflinger/Layer.cpp b/libs/surfaceflinger/Layer.cpp index c1f7f27..eb0614f 100644 --- a/libs/surfaceflinger/Layer.cpp +++ b/libs/surfaceflinger/Layer.cpp @@ -51,6 +51,7 @@ Layer::Layer(SurfaceFlinger* flinger, DisplayID display, const sp<Client>& c, int32_t i) : LayerBaseClient(flinger, display, c, i), mSecure(false), + mNoEGLImageForSwBuffers(false), mNeedsBlending(true), mNeedsDithering(false) { @@ -108,13 +109,15 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h, const DisplayHardware& hw(graphicPlane(0).displayHardware()); PixelFormatInfo displayInfo; getPixelFormatInfo(hw.getFormat(), &displayInfo); - + const uint32_t hwFlags = hw.getFlags(); + mFormat = format; mWidth = w; mHeight = h; mSecure = (flags & ISurfaceComposer::eSecure) ? true : false; mNeedsBlending = (info.h_alpha - info.l_alpha) > 0; - + mNoEGLImageForSwBuffers = !(hwFlags & DisplayHardware::CACHED_BUFFERS); + // we use the red index int displayRedSize = displayInfo.getSize(PixelFormatInfo::INDEX_RED); int layerRedsize = info.getSize(PixelFormatInfo::INDEX_RED); @@ -331,7 +334,15 @@ uint32_t Layer::getEffectiveUsage(uint32_t usage) const } else { // it's allowed to modify the usage flags here, but generally // the requested flags should be honored. - usage |= GraphicBuffer::USAGE_HW_TEXTURE; + if (mNoEGLImageForSwBuffers) { + if (usage & GraphicBuffer::USAGE_HW_MASK) { + // request EGLImage for h/w buffers only + usage |= GraphicBuffer::USAGE_HW_TEXTURE; + } + } else { + // request EGLImage for all buffers + usage |= GraphicBuffer::USAGE_HW_TEXTURE; + } } return usage; } diff --git a/libs/surfaceflinger/Layer.h b/libs/surfaceflinger/Layer.h index e176cfc..6f59241 100644 --- a/libs/surfaceflinger/Layer.h +++ b/libs/surfaceflinger/Layer.h @@ -107,6 +107,7 @@ private: sp<Surface> mSurface; bool mSecure; + bool mNoEGLImageForSwBuffers; int32_t mFrontBufferIndex; bool mNeedsBlending; bool mNeedsDithering; |