fix crashers with wifi/virtual displays
Bug: 10647742 Change-Id: I4b8ed9da52ef95af3a3b3a04b98514a3776a674d
This commit is contained in:
parent
d555684cb3
commit
6da15f46f5
@ -258,6 +258,17 @@ status_t VirtualDisplaySurface::dequeueBuffer(int* pslot, sp<Fence>* fence, bool
|
|||||||
Source source = fbSourceForCompositionType(mCompositionType);
|
Source source = fbSourceForCompositionType(mCompositionType);
|
||||||
|
|
||||||
if (source == SOURCE_SINK) {
|
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
|
// We already dequeued the output buffer. If the GLES driver wants
|
||||||
// something incompatible, we have to cancel and get a new one. This
|
// something incompatible, we have to cancel and get a new one. This
|
||||||
// will mean that HWC will see a different output buffer between
|
// will mean that HWC will see a different output buffer between
|
||||||
|
@ -963,6 +963,12 @@ void SurfaceFlinger::postFramebuffer()
|
|||||||
hwc.commit();
|
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++) {
|
for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
|
||||||
sp<const DisplayDevice> hw(mDisplays[dpy]);
|
sp<const DisplayDevice> hw(mDisplays[dpy]);
|
||||||
const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
|
const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
|
||||||
|
Loading…
Reference in New Issue
Block a user