fix crashers with wifi/virtual displays
Bug: 10647742 Change-Id: I4b8ed9da52ef95af3a3b3a04b98514a3776a674d
This commit is contained in:
parent
dbf6e66206
commit
8499e93f4d
@ -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
|
||||
|
@ -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());
|
||||
|
Loading…
Reference in New Issue
Block a user