diff options
author | Jesse Hall <jessehall@google.com> | 2013-09-30 16:49:30 -0700 |
---|---|---|
committer | Jesse Hall <jessehall@google.com> | 2013-09-30 17:08:28 -0700 |
commit | d05a17fbb3772051d287f1f8830a7f00964f7ec2 (patch) | |
tree | 2d288f9b3d01140c5a57bfcccda10b5c1b7957bc | |
parent | 86206b41b2ff000e086301c6bafb8da577e563b2 (diff) | |
download | native-d05a17fbb3772051d287f1f8830a7f00964f7ec2.tar.gz |
Treat composition frames with no layers as using GLES composition
When there are no window layers for a display, SurfaceFlinger clears
the undefined region using GLES. Some of the places that check for
GLES composition weren't considering this special case, in particular:
- We were skipping the eglSwapBuffers() on these frames.
- We were putting VirtualDisplaySurface in HWC-only composition mode.
This change centralizes the logic for this special case.
Bug: 10957068
Change-Id: I2deaf2ed101e8ea76708862a6bb67751b6078794
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWComposer.cpp | 9 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 2 |
2 files changed, 10 insertions, 1 deletions
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index c851a2c067..7132b2f1b0 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -611,6 +611,10 @@ status_t HWComposer::prepare() { // here we're just making sure that "skip" layers are set // to HWC_FRAMEBUFFER and we're also counting how many layers // we have of each type. + // + // If there are no window layers, we treat the display has having FB + // composition, because SurfaceFlinger will use GLES to draw the + // wormhole region. for (size_t i=0 ; i<mNumDisplays ; i++) { DisplayData& disp(mDisplayData[i]); disp.hasFbComp = false; @@ -632,6 +636,11 @@ status_t HWComposer::prepare() { disp.hasOvComp = true; } } + if (disp.list->numHwLayers == (disp.framebufferTarget ? 1 : 0)) { + disp.hasFbComp = true; + } + } else { + disp.hasFbComp = true; } } } diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index f83cc06692..eea00bceab 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1527,7 +1527,7 @@ void SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const HWComposer::LayerListIterator cur = hwc.begin(id); const HWComposer::LayerListIterator end = hwc.end(id); - const bool hasGlesComposition = hwc.hasGlesComposition(id) || (cur==end); + bool hasGlesComposition = hwc.hasGlesComposition(id); if (hasGlesComposition) { if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) { ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s", |