diff options
author | Mathias Agopian <mathias@google.com> | 2013-07-16 22:56:09 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2013-07-18 22:28:18 -0700 |
commit | 595264f1af12e25dce57d7c5b1d52ed86ac0d0c9 (patch) | |
tree | 204b340f3781aa95671fb08f47e53f51b125f57e /services/surfaceflinger | |
parent | 1962f6513732682645f74561c0665e168196056e (diff) | |
download | frameworks_native-595264f1af12e25dce57d7c5b1d52ed86ac0d0c9.zip frameworks_native-595264f1af12e25dce57d7c5b1d52ed86ac0d0c9.tar.gz frameworks_native-595264f1af12e25dce57d7c5b1d52ed86ac0d0c9.tar.bz2 |
BufferQueue improvements and APIs changes
this is the first step of a series of improvements to
BufferQueue. A few things happen in this change:
- setSynchronousMode() goes away as well as the SynchronousModeAllowed flag
- BufferQueue now defaults to (what used to be) synchronous mode
- a new "controlled by app" flag is passed when creating consumers and producers
those flags are used to put the BufferQueue in a mode where it
will never block if both flags are set. This is achieved by:
- returning an error from dequeueBuffer() if it would block
- making sure a buffer is always available by replacing
the previous buffer with the new one in queueBuffer()
(note: this is similar to what asynchrnous mode used to be)
Note: in this change EGL's swap-interval 0 is broken; this will be
fixed in another change.
Change-Id: I691f9507d6e2e158287e3039f2a79a4d4434211d
Diffstat (limited to 'services/surfaceflinger')
7 files changed, 7 insertions, 45 deletions
diff --git a/services/surfaceflinger/Android.mk b/services/surfaceflinger/Android.mk index 2ec575e..bb0a2f9 100644 --- a/services/surfaceflinger/Android.mk +++ b/services/surfaceflinger/Android.mk @@ -36,7 +36,6 @@ ifeq ($(TARGET_BOARD_PLATFORM),omap4) endif ifeq ($(TARGET_BOARD_PLATFORM),s5pc110) LOCAL_CFLAGS += -DHAS_CONTEXT_PRIORITY - LOCAL_CFLAGS += -DNEVER_DEFAULT_TO_ASYNC_MODE endif ifeq ($(TARGET_DISABLE_TRIPLE_BUFFERING),true) diff --git a/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp b/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp index 7987da3..bd2f5f3 100644 --- a/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp +++ b/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp @@ -51,7 +51,7 @@ namespace android { */ FramebufferSurface::FramebufferSurface(HWComposer& hwc, int disp) : - ConsumerBase(new BufferQueue(true, new GraphicBufferAlloc())), + ConsumerBase(new BufferQueue(new GraphicBufferAlloc())), mDisplayType(disp), mCurrentBufferSlot(-1), mCurrentBuffer(0), @@ -64,7 +64,6 @@ FramebufferSurface::FramebufferSurface(HWComposer& hwc, int disp) : GRALLOC_USAGE_HW_COMPOSER); mBufferQueue->setDefaultBufferFormat(mHwc.getFormat(disp)); mBufferQueue->setDefaultBufferSize(mHwc.getWidth(disp), mHwc.getHeight(disp)); - mBufferQueue->setSynchronousMode(true); mBufferQueue->setDefaultMaxBufferCount(NUM_FRAMEBUFFER_SURFACE_BUFFERS); } diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp index a324e94..c92b666 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp @@ -41,7 +41,7 @@ static const char* dbgCompositionTypeStr(DisplaySurface::CompositionType type) { VirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, int32_t dispId, const sp<IGraphicBufferProducer>& sink, const String8& name) -: ConsumerBase(new BufferQueue(true)), +: ConsumerBase(new BufferQueue()), mHwc(hwc), mDisplayId(dispId), mDisplayName(name), @@ -345,13 +345,10 @@ int VirtualDisplaySurface::query(int what, int* value) { return mSource[SOURCE_SINK]->query(what, value); } -status_t VirtualDisplaySurface::setSynchronousMode(bool enabled) { - return mSource[SOURCE_SINK]->setSynchronousMode(enabled); -} - -status_t VirtualDisplaySurface::connect(int api, QueueBufferOutput* output) { +status_t VirtualDisplaySurface::connect(int api, bool producerControlledByApp, + QueueBufferOutput* output) { QueueBufferOutput qbo; - status_t result = mSource[SOURCE_SINK]->connect(api, &qbo); + status_t result = mSource[SOURCE_SINK]->connect(api, producerControlledByApp, &qbo); if (result == NO_ERROR) { updateQueueBufferOutput(qbo); *output = mQueueBufferOutput; diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h index 2b4cf8f..94b24d2 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h @@ -101,8 +101,7 @@ private: const QueueBufferInput& input, QueueBufferOutput* output); virtual void cancelBuffer(int pslot, const sp<Fence>& fence); virtual int query(int what, int* value); - virtual status_t setSynchronousMode(bool enabled); - virtual status_t connect(int api, QueueBufferOutput* output); + virtual status_t connect(int api, bool producerControlledByApp, QueueBufferOutput* output); virtual status_t disconnect(int api); // diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 2962115..52211c2 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -115,7 +115,6 @@ void Layer::onFirstRef() mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); mSurfaceFlingerConsumer->setFrameAvailableListener(this); - mSurfaceFlingerConsumer->setSynchronousMode(true); mSurfaceFlingerConsumer->setName(mName); #ifdef TARGET_DISABLE_TRIPLE_BUFFERING diff --git a/services/surfaceflinger/SurfaceTextureLayer.cpp b/services/surfaceflinger/SurfaceTextureLayer.cpp index d0f0dae..b76dc0c 100644 --- a/services/surfaceflinger/SurfaceTextureLayer.cpp +++ b/services/surfaceflinger/SurfaceTextureLayer.cpp @@ -28,7 +28,7 @@ namespace android { SurfaceTextureLayer::SurfaceTextureLayer(const sp<SurfaceFlinger>& flinger) - : BufferQueue(true), flinger(flinger) { + : BufferQueue(), flinger(flinger) { } SurfaceTextureLayer::~SurfaceTextureLayer() { @@ -51,32 +51,5 @@ SurfaceTextureLayer::~SurfaceTextureLayer() { flinger->postMessageAsync( new MessageCleanUpList(flinger, this) ); } -status_t SurfaceTextureLayer::connect(int api, QueueBufferOutput* output) { - status_t err = BufferQueue::connect(api, output); - if (err == NO_ERROR) { - switch(api) { - case NATIVE_WINDOW_API_MEDIA: - case NATIVE_WINDOW_API_CAMERA: - // Camera preview and videos are rate-limited on the producer - // side. If enabled for this build, we use async mode to always - // show the most recent frame at the cost of requiring an - // additional buffer. -#ifndef NEVER_DEFAULT_TO_ASYNC_MODE - err = setSynchronousMode(false); - break; -#endif - // fall through to set synchronous mode when not defaulting to - // async mode. - default: - err = setSynchronousMode(true); - break; - } - if (err != NO_ERROR) { - disconnect(api); - } - } - return err; -} - // --------------------------------------------------------------------------- }; // namespace android diff --git a/services/surfaceflinger/SurfaceTextureLayer.h b/services/surfaceflinger/SurfaceTextureLayer.h index 13cff2f..5f5e4ef 100644 --- a/services/surfaceflinger/SurfaceTextureLayer.h +++ b/services/surfaceflinger/SurfaceTextureLayer.h @@ -38,10 +38,6 @@ class SurfaceTextureLayer : public BufferQueue { public: SurfaceTextureLayer(const sp<SurfaceFlinger>& flinger); virtual ~SurfaceTextureLayer(); - - // After calling the superclass connect(), set or clear synchronous - // mode appropriately for the specified API. - virtual status_t connect(int api, QueueBufferOutput* output); }; // --------------------------------------------------------------------------- |