OSDN Git Service

fix crashers with wifi/virtual displays
authorMathias Agopian <mathias@google.com>
Thu, 26 Sep 2013 03:40:07 +0000 (20:40 -0700)
committerThe Android Automerger <android-build@google.com>
Fri, 27 Sep 2013 18:30:59 +0000 (11:30 -0700)
Bug: 10647742
Change-Id: I4b8ed9da52ef95af3a3b3a04b98514a3776a674d

services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp
services/surfaceflinger/SurfaceFlinger.cpp

index c06043d..88ef392 100644 (file)
@@ -258,6 +258,17 @@ status_t VirtualDisplaySurface::dequeueBuffer(int* pslot, sp<Fence>* fence, bool
     Source source = fbSourceForCompositionType(mCompositionType);
 
     if (source == SOURCE_SINK) {
+
+        if (mOutputProducerSlot < 0) {
+            // Last chance bailout if something bad happened earlier. For example,
+            // in a GLES configuration, if the sink disappears then dequeueBuffer
+            // will fail, the GLES driver won't queue a buffer, but SurfaceFlinger
+            // will soldier on. So we end up here without a buffer. There should
+            // be lots of scary messages in the log just before this.
+            VDS_LOGE("dequeueBuffer: no buffer, bailing out");
+            return NO_MEMORY;
+        }
+
         // We already dequeued the output buffer. If the GLES driver wants
         // something incompatible, we have to cancel and get a new one. This
         // will mean that HWC will see a different output buffer between
index 879c911..f83cc06 100644 (file)
@@ -963,6 +963,12 @@ void SurfaceFlinger::postFramebuffer()
         hwc.commit();
     }
 
+    // make the default display current because the VirtualDisplayDevice code cannot
+    // deal with dequeueBuffer() being called outside of the composition loop; however
+    // the code below can call glFlush() which is allowed (and does in some case) call
+    // dequeueBuffer().
+    getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
+
     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
         sp<const DisplayDevice> hw(mDisplays[dpy]);
         const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());