Force async behavior for the virtual display output BufferQueue
Bug: 10551087 Change-Id: I40bbb2b87d64420939a0ea309254f281437dab56
This commit is contained in:
parent
f2e4fcd96c
commit
8db92553e9
@ -637,7 +637,8 @@ void BufferQueue::cancelBuffer(int buf, const sp<Fence>& fence) {
|
||||
|
||||
status_t BufferQueue::connect(int api, bool producerControlledByApp, QueueBufferOutput* output) {
|
||||
ATRACE_CALL();
|
||||
ST_LOGV("connect: api=%d", api);
|
||||
ST_LOGV("connect: api=%d producerControlledByApp=%s", api,
|
||||
producerControlledByApp ? "true" : "false");
|
||||
Mutex::Autolock lock(mMutex);
|
||||
|
||||
if (mAbandoned) {
|
||||
@ -1001,7 +1002,8 @@ status_t BufferQueue::releaseBuffer(
|
||||
|
||||
status_t BufferQueue::consumerConnect(const sp<IConsumerListener>& consumerListener,
|
||||
bool controlledByApp) {
|
||||
ST_LOGV("consumerConnect");
|
||||
ST_LOGV("consumerConnect controlledByApp=%s",
|
||||
controlledByApp ? "true" : "false");
|
||||
Mutex::Autolock lock(mMutex);
|
||||
|
||||
if (mAbandoned) {
|
||||
|
@ -175,9 +175,12 @@ void VirtualDisplaySurface::onFrameCommitted() {
|
||||
sp<Fence> outFence = mHwc.getLastRetireFence(mDisplayId);
|
||||
VDS_LOGV("onFrameCommitted: queue sink sslot=%d", sslot);
|
||||
status_t result = mSource[SOURCE_SINK]->queueBuffer(sslot,
|
||||
QueueBufferInput(systemTime(), false,
|
||||
QueueBufferInput(
|
||||
systemTime(), false /* isAutoTimestamp */,
|
||||
Rect(mSinkBufferWidth, mSinkBufferHeight),
|
||||
NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, outFence),
|
||||
NATIVE_WINDOW_SCALING_MODE_FREEZE, 0 /* transform */,
|
||||
true /* async*/,
|
||||
outFence),
|
||||
&qbo);
|
||||
if (result == NO_ERROR) {
|
||||
updateQueueBufferOutput(qbo);
|
||||
@ -205,7 +208,10 @@ status_t VirtualDisplaySurface::setBufferCount(int bufferCount) {
|
||||
}
|
||||
|
||||
status_t VirtualDisplaySurface::dequeueBuffer(Source source,
|
||||
uint32_t format, int* sslot, sp<Fence>* fence, bool async) {
|
||||
uint32_t format, int* sslot, sp<Fence>* fence) {
|
||||
// Don't let a slow consumer block us
|
||||
bool async = (source == SOURCE_SINK);
|
||||
|
||||
status_t result = mSource[source]->dequeueBuffer(sslot, fence, async,
|
||||
mSinkBufferWidth, mSinkBufferHeight, format, mProducerUsage);
|
||||
if (result < 0)
|
||||
@ -244,6 +250,7 @@ status_t VirtualDisplaySurface::dequeueBuffer(int* pslot, sp<Fence>* fence, bool
|
||||
"Unexpected dequeueBuffer() in %s state", dbgStateStr());
|
||||
mDbgState = DBG_STATE_GLES;
|
||||
|
||||
VDS_LOGW_IF(!async, "EGL called dequeueBuffer with !async despite eglSwapInterval(0)");
|
||||
VDS_LOGV("dequeueBuffer %dx%d fmt=%d usage=%#x", w, h, format, usage);
|
||||
|
||||
status_t result = NO_ERROR;
|
||||
@ -275,7 +282,7 @@ status_t VirtualDisplaySurface::dequeueBuffer(int* pslot, sp<Fence>* fence, bool
|
||||
*fence = mOutputFence;
|
||||
} else {
|
||||
int sslot;
|
||||
result = dequeueBuffer(source, format, &sslot, fence, async);
|
||||
result = dequeueBuffer(source, format, &sslot, fence);
|
||||
if (result >= 0) {
|
||||
*pslot = mapSource2ProducerSlot(source, sslot);
|
||||
}
|
||||
@ -391,7 +398,7 @@ status_t VirtualDisplaySurface::refreshOutputBuffer() {
|
||||
}
|
||||
|
||||
int sslot;
|
||||
status_t result = dequeueBuffer(SOURCE_SINK, 0, &sslot, &mOutputFence, false);
|
||||
status_t result = dequeueBuffer(SOURCE_SINK, 0, &sslot, &mOutputFence);
|
||||
if (result < 0)
|
||||
return result;
|
||||
mOutputProducerSlot = mapSource2ProducerSlot(SOURCE_SINK, sslot);
|
||||
|
@ -110,7 +110,7 @@ private:
|
||||
//
|
||||
static Source fbSourceForCompositionType(CompositionType type);
|
||||
status_t dequeueBuffer(Source source, uint32_t format,
|
||||
int* sslot, sp<Fence>* fence, bool async);
|
||||
int* sslot, sp<Fence>* fence);
|
||||
void updateQueueBufferOutput(const QueueBufferOutput& qbo);
|
||||
void resetPerFrameState();
|
||||
status_t refreshOutputBuffer();
|
||||
|
Loading…
Reference in New Issue
Block a user