From ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584 Mon Sep 17 00:00:00 2001 From: Pablo Ceballos Date: Wed, 7 Oct 2015 15:05:45 -0700 Subject: BQ: Add support for single buffer mode - Adds a single buffer mode to BufferQueue. In this mode designate the first dequeued buffer as the shared buffer. All calls to dequeue() and acquire() will then return the shared buffer, allowing the producer and consumer to share it. - Modify the buffer slot state tracking. Add a new SHARED state for the shared buffer in single buffer mode. Also track how many times a buffer has been dequeued/queued/acquired as it's possible for a shared buffer to be both dequeued and acquired at the same time, or dequeued/acquired multiple times. This tracking is needed to know when to drop the buffer out of the SHARED state after single buffer mode has been disabled. - Add plumbing for enabling/disabling single buffer mode from Surface. Bug 24940410 Change-Id: I3fc550c74bacb5523c049a227111356257386853 --- libs/gui/Surface.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'libs/gui/Surface.cpp') diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 9191b2a379..7578a3db29 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -550,6 +550,9 @@ int Surface::perform(int operation, va_list args) case NATIVE_WINDOW_SET_SURFACE_DAMAGE: res = dispatchSetSurfaceDamage(args); break; + case NATIVE_WINDOW_SET_SINGLE_BUFFER_MODE: + res = dispatchSetSingleBufferMode(args); + break; default: res = NAME_NOT_FOUND; break; @@ -660,6 +663,12 @@ int Surface::dispatchSetSurfaceDamage(va_list args) { return NO_ERROR; } +int Surface::dispatchSetSingleBufferMode(va_list args) { + bool singleBufferMode = va_arg(args, int); + setSingleBufferMode(singleBufferMode); + return NO_ERROR; +} + int Surface::connect(int api) { static sp listener = new DummyProducerListener(); return connect(api, listener); @@ -861,6 +870,19 @@ int Surface::setAsyncMode(bool async) { return err; } +int Surface::setSingleBufferMode(bool singleBufferMode) { + ATRACE_CALL(); + ALOGV("Surface::setSingleBufferMode (%d)", singleBufferMode); + Mutex::Autolock lock(mMutex); + + status_t err = mGraphicBufferProducer->setSingleBufferMode( + singleBufferMode); + ALOGE_IF(err, "IGraphicsBufferProducer::setSingleBufferMode(%d) returned" + "%s", singleBufferMode, strerror(-err)); + + return err; +} + int Surface::setBuffersDimensions(uint32_t width, uint32_t height) { ATRACE_CALL(); -- cgit v1.2.3-59-g8ed1b