summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Hall <jessehall@google.com>2013-08-30 14:19:13 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-08-30 14:19:13 -0700
commit2d28c37269ca55b2be896ca67271994ebbc2bc84 (patch)
treed262cafd583c4964c93ef5632643bedb4e366e06
parentbf5e8b631db3dbd9cee5cf8805c5379f013b54db (diff)
parent87967c186995d1500875c495cba8f04f7cff76cc (diff)
downloadframeworks_native-2d28c37269ca55b2be896ca67271994ebbc2bc84.zip
frameworks_native-2d28c37269ca55b2be896ca67271994ebbc2bc84.tar.gz
frameworks_native-2d28c37269ca55b2be896ca67271994ebbc2bc84.tar.bz2
am 87967c18: Merge "Force async behavior for the virtual display output BufferQueue" into klp-dev
* commit '87967c186995d1500875c495cba8f04f7cff76cc': Force async behavior for the virtual display output BufferQueue
-rw-r--r--libs/gui/BufferQueue.cpp6
-rw-r--r--services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp17
-rw-r--r--services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h2
3 files changed, 17 insertions, 8 deletions
diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp
index 65007fa..57a41f2 100644
--- a/libs/gui/BufferQueue.cpp
+++ b/libs/gui/BufferQueue.cpp
@@ -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) {
diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp
index 01ca38a..43d27bb 100644
--- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp
+++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp
@@ -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);
diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h
index 4ab80e4..536007e 100644
--- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h
+++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h
@@ -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();