From b9b088375d33a87b201cdbe18be71802e2607717 Mon Sep 17 00:00:00 2001 From: Dan Stoza Date: Thu, 13 Mar 2014 11:55:57 -0700 Subject: [PATCH] Remove deprecated BufferQueue constructor Bug: 13415624 Change-Id: I9fe15e45daa7351f1db34ee75bfee6f19cb347d3 --- services/surfaceflinger/Android.mk | 2 +- .../DisplayHardware/VirtualDisplaySurface.cpp | 7 +- .../DisplayHardware/VirtualDisplaySurface.h | 3 +- services/surfaceflinger/Layer.cpp | 13 ++- services/surfaceflinger/Layer.h | 6 +- services/surfaceflinger/MonitoredProducer.cpp | 105 ++++++++++++++++++ services/surfaceflinger/MonitoredProducer.h | 60 ++++++++++ services/surfaceflinger/SurfaceFlinger.cpp | 29 +++-- services/surfaceflinger/SurfaceFlinger.h | 2 +- .../surfaceflinger/SurfaceFlingerConsumer.h | 5 +- .../surfaceflinger/SurfaceTextureLayer.cpp | 56 ---------- services/surfaceflinger/SurfaceTextureLayer.h | 46 -------- 12 files changed, 206 insertions(+), 128 deletions(-) create mode 100644 services/surfaceflinger/MonitoredProducer.cpp create mode 100644 services/surfaceflinger/MonitoredProducer.h delete mode 100644 services/surfaceflinger/SurfaceTextureLayer.cpp delete mode 100644 services/surfaceflinger/SurfaceTextureLayer.h diff --git a/services/surfaceflinger/Android.mk b/services/surfaceflinger/Android.mk index 49a017f0f..0834c804a 100644 --- a/services/surfaceflinger/Android.mk +++ b/services/surfaceflinger/Android.mk @@ -11,9 +11,9 @@ LOCAL_SRC_FILES:= \ Layer.cpp \ LayerDim.cpp \ MessageQueue.cpp \ + MonitoredProducer.cpp \ SurfaceFlinger.cpp \ SurfaceFlingerConsumer.cpp \ - SurfaceTextureLayer.cpp \ Transform.cpp \ DisplayHardware/FramebufferSurface.cpp \ DisplayHardware/HWComposer.cpp \ diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp index 11c42e0f3..f4cb8b5d5 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp @@ -47,9 +47,10 @@ static const char* dbgCompositionTypeStr(DisplaySurface::CompositionType type) { VirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, int32_t dispId, const sp& sink, - const sp& bq, + const sp& bqProducer, + const sp& bqConsumer, const String8& name) -: ConsumerBase(bq), +: ConsumerBase(bqConsumer), mHwc(hwc), mDisplayId(dispId), mDisplayName(name), @@ -60,7 +61,7 @@ VirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, int32_t dispId, mMustRecompose(false) { mSource[SOURCE_SINK] = sink; - mSource[SOURCE_SCRATCH] = bq; + mSource[SOURCE_SCRATCH] = bqProducer; resetPerFrameState(); diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h index 0d30a1be5..09e5544fa 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h @@ -73,7 +73,8 @@ class VirtualDisplaySurface : public DisplaySurface, public: VirtualDisplaySurface(HWComposer& hwc, int32_t dispId, const sp& sink, - const sp& bq, + const sp& bqProducer, + const sp& bqConsumer, const String8& name); // diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 019d89223..7f2ee2a80 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -40,8 +40,8 @@ #include "Colorizer.h" #include "DisplayDevice.h" #include "Layer.h" +#include "MonitoredProducer.h" #include "SurfaceFlinger.h" -#include "SurfaceTextureLayer.h" #include "DisplayHardware/HWComposer.h" @@ -117,8 +117,11 @@ Layer::Layer(SurfaceFlinger* flinger, const sp& client, void Layer::onFirstRef() { // Creates a custom BufferQueue for SurfaceFlingerConsumer to use - mBufferQueue = new SurfaceTextureLayer(mFlinger); - mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(mBufferQueue, mTextureName); + sp producer; + sp consumer; + BufferQueue::createBufferQueue(&producer, &consumer); + mProducer = new MonitoredProducer(producer, mFlinger); + mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName); mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); mSurfaceFlingerConsumer->setContentsChangedListener(this); mSurfaceFlingerConsumer->setName(mName); @@ -236,8 +239,8 @@ sp Layer::getHandle() { return new Handle(mFlinger, this); } -sp Layer::getBufferQueue() const { - return mBufferQueue; +sp Layer::getProducer() const { + return mProducer; } // --------------------------------------------------------------------------- diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 43de9991a..8f8989e93 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -37,9 +37,9 @@ #include "FrameTracker.h" #include "Client.h" +#include "MonitoredProducer.h" #include "SurfaceFlinger.h" #include "SurfaceFlingerConsumer.h" -#include "SurfaceTextureLayer.h" #include "Transform.h" #include "DisplayHardware/HWComposer.h" @@ -140,7 +140,7 @@ public: Rect computeBounds() const; sp getHandle(); - sp getBufferQueue() const; + sp getProducer() const; const String8& getName() const; // ----------------------------------------------------------------------- @@ -338,7 +338,7 @@ private: // constants sp mSurfaceFlingerConsumer; - sp mBufferQueue; + sp mProducer; uint32_t mTextureName; bool mPremultipliedAlpha; String8 mName; diff --git a/services/surfaceflinger/MonitoredProducer.cpp b/services/surfaceflinger/MonitoredProducer.cpp new file mode 100644 index 000000000..8fed676ac --- /dev/null +++ b/services/surfaceflinger/MonitoredProducer.cpp @@ -0,0 +1,105 @@ +/* + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MessageQueue.h" +#include "MonitoredProducer.h" +#include "SurfaceFlinger.h" + +namespace android { + +MonitoredProducer::MonitoredProducer(const sp& producer, + const sp& flinger) : + mProducer(producer), + mFlinger(flinger) {} + +MonitoredProducer::~MonitoredProducer() { + // Remove ourselves from SurfaceFlinger's list. We do this asynchronously + // because we don't know where this destructor is called from. It could be + // called with the mStateLock held, leading to a dead-lock (it actually + // happens). + class MessageCleanUpList : public MessageBase { + public: + MessageCleanUpList(const sp& flinger, + const wp& producer) + : mFlinger(flinger), mProducer(producer) {} + + virtual ~MessageCleanUpList() {} + + virtual bool handler() { + Mutex::Autolock _l(mFlinger->mStateLock); + mFlinger->mGraphicBufferProducerList.remove(mProducer); + return true; + } + + private: + sp mFlinger; + wp mProducer; + }; + + mFlinger->postMessageAsync(new MessageCleanUpList(mFlinger, + static_cast(this))); +} + +status_t MonitoredProducer::requestBuffer(int slot, sp* buf) { + return mProducer->requestBuffer(slot, buf); +} + +status_t MonitoredProducer::setBufferCount(int bufferCount) { + return mProducer->setBufferCount(bufferCount); +} + +status_t MonitoredProducer::dequeueBuffer(int* slot, sp* fence, + bool async, uint32_t w, uint32_t h, uint32_t format, uint32_t usage) { + return mProducer->dequeueBuffer(slot, fence, async, w, h, format, usage); +} + +status_t MonitoredProducer::detachBuffer(int slot) { + return mProducer->detachBuffer(slot); +} + +status_t MonitoredProducer::attachBuffer(int* outSlot, + const sp& buffer) { + return mProducer->attachBuffer(outSlot, buffer); +} + +status_t MonitoredProducer::queueBuffer(int slot, const QueueBufferInput& input, + QueueBufferOutput* output) { + return mProducer->queueBuffer(slot, input, output); +} + +void MonitoredProducer::cancelBuffer(int slot, const sp& fence) { + mProducer->cancelBuffer(slot, fence); +} + +int MonitoredProducer::query(int what, int* value) { + return mProducer->query(what, value); +} + +status_t MonitoredProducer::connect(const sp& token, int api, + bool producerControlledByApp, QueueBufferOutput* output) { + return mProducer->connect(token, api, producerControlledByApp, output); +} + +status_t MonitoredProducer::disconnect(int api) { + return mProducer->disconnect(api); +} + +status_t MonitoredProducer::setSidebandStream(const sp& stream) { + return mProducer->setSidebandStream(stream); +} + +// --------------------------------------------------------------------------- +}; // namespace android diff --git a/services/surfaceflinger/MonitoredProducer.h b/services/surfaceflinger/MonitoredProducer.h new file mode 100644 index 000000000..f78be2001 --- /dev/null +++ b/services/surfaceflinger/MonitoredProducer.h @@ -0,0 +1,60 @@ +/* + * Copyright 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_MONITORED_PRODUCER_H +#define ANDROID_MONITORED_PRODUCER_H + +#include + +namespace android { + +class IBinder; +class NativeHandle; +class SurfaceFlinger; + +// MonitoredProducer wraps an IGraphicBufferProducer so that SurfaceFlinger will +// be notified upon its destruction +class MonitoredProducer : public BnGraphicBufferProducer { +public: + MonitoredProducer(const sp& producer, + const sp& flinger); + virtual ~MonitoredProducer(); + + // From IGraphicBufferProducer + virtual status_t requestBuffer(int slot, sp* buf); + virtual status_t setBufferCount(int bufferCount); + virtual status_t dequeueBuffer(int* slot, sp* fence, bool async, + uint32_t w, uint32_t h, uint32_t format, uint32_t usage); + virtual status_t detachBuffer(int slot); + virtual status_t attachBuffer(int* outSlot, + const sp& buffer); + virtual status_t queueBuffer(int slot, const QueueBufferInput& input, + QueueBufferOutput* output); + virtual void cancelBuffer(int slot, const sp& fence); + virtual int query(int what, int* value); + virtual status_t connect(const sp& token, int api, + bool producerControlledByApp, QueueBufferOutput* output); + virtual status_t disconnect(int api); + virtual status_t setSidebandStream(const sp& stream); + +private: + sp mProducer; + sp mFlinger; +}; + +}; // namespace android + +#endif // ANDROID_MONITORED_PRODUCER_H diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index e05417ffe..0650d9723 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -420,12 +420,17 @@ void SurfaceFlinger::init() { createBuiltinDisplayLocked(type); wp token = mBuiltinDisplays[i]; - sp bq = new BufferQueue(new GraphicBufferAlloc()); - sp fbs = new FramebufferSurface(*mHwc, i, bq); + sp producer; + sp consumer; + BufferQueue::createBufferQueue(&producer, &consumer, + new GraphicBufferAlloc()); + + sp fbs = new FramebufferSurface(*mHwc, i, + consumer); int32_t hwcId = allocateHwcDisplayId(type); sp hw = new DisplayDevice(this, type, hwcId, mHwc->getFormat(hwcId), isSecure, token, - fbs, bq, + fbs, producer, mRenderEngine->getEGLConfig()); if (i > DisplayDevice::DISPLAY_PRIMARY) { // FIXME: currently we don't get blank/unblank requests @@ -1152,7 +1157,10 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) sp dispSurface; sp producer; - sp bq = new BufferQueue(new GraphicBufferAlloc()); + sp bqProducer; + sp bqConsumer; + BufferQueue::createBufferQueue(&bqProducer, &bqConsumer, + new GraphicBufferAlloc()); int32_t hwcDisplayId = -1; if (state.isVirtualDisplay()) { @@ -1163,8 +1171,8 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) hwcDisplayId = allocateHwcDisplayId(state.type); sp vds = new VirtualDisplaySurface( - *mHwc, hwcDisplayId, state.surface, bq, - state.displayName); + *mHwc, hwcDisplayId, state.surface, + bqProducer, bqConsumer, state.displayName); dispSurface = vds; if (hwcDisplayId >= 0) { @@ -1183,8 +1191,9 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags) hwcDisplayId = allocateHwcDisplayId(state.type); // for supported (by hwc) displays we provide our // own rendering surface - dispSurface = new FramebufferSurface(*mHwc, state.type, bq); - producer = bq; + dispSurface = new FramebufferSurface(*mHwc, state.type, + bqConsumer); + producer = bqProducer; } const wp& display(curr.keyAt(i)); @@ -1978,7 +1987,7 @@ status_t SurfaceFlinger::createNormalLayer(const sp& client, status_t err = (*outLayer)->setBuffers(w, h, format, flags); if (err == NO_ERROR) { *handle = (*outLayer)->getHandle(); - *gbp = (*outLayer)->getBufferQueue(); + *gbp = (*outLayer)->getProducer(); } ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err)); @@ -1991,7 +2000,7 @@ status_t SurfaceFlinger::createDimLayer(const sp& client, { *outLayer = new LayerDim(this, client, name, w, h, flags); *handle = (*outLayer)->getHandle(); - *gbp = (*outLayer)->getBufferQueue(); + *gbp = (*outLayer)->getProducer(); return NO_ERROR; } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 923046715..630f4b709 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -138,7 +138,7 @@ private: friend class Client; friend class DisplayEventConnection; friend class Layer; - friend class SurfaceTextureLayer; + friend class MonitoredProducer; // This value is specified in number of frames. Log frame stats at most // every half hour. diff --git a/services/surfaceflinger/SurfaceFlingerConsumer.h b/services/surfaceflinger/SurfaceFlingerConsumer.h index becd5d365..0f1bf3583 100644 --- a/services/surfaceflinger/SurfaceFlingerConsumer.h +++ b/services/surfaceflinger/SurfaceFlingerConsumer.h @@ -31,8 +31,9 @@ public: virtual void onSidebandStreamChanged() = 0; }; - SurfaceFlingerConsumer(const sp& bq, uint32_t tex) - : GLConsumer(bq, tex, GLConsumer::TEXTURE_EXTERNAL, false) + SurfaceFlingerConsumer(const sp& consumer, + uint32_t tex) + : GLConsumer(consumer, tex, GLConsumer::TEXTURE_EXTERNAL, false) {} class BufferRejecter { diff --git a/services/surfaceflinger/SurfaceTextureLayer.cpp b/services/surfaceflinger/SurfaceTextureLayer.cpp deleted file mode 100644 index 9d79ce20e..000000000 --- a/services/surfaceflinger/SurfaceTextureLayer.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -#include - -#include "SurfaceFlinger.h" -#include "SurfaceTextureLayer.h" - -namespace android { -// --------------------------------------------------------------------------- - - -SurfaceTextureLayer::SurfaceTextureLayer(const sp& flinger) - : BufferQueue(), flinger(flinger) { -} - -SurfaceTextureLayer::~SurfaceTextureLayer() { - // remove ourselves from SurfaceFlinger's list. We do this asynchronously - // because we don't know where this dtor is called from, it could be - // called with the mStateLock held, leading to a dead-lock (it actually - // happens). - class MessageCleanUpList : public MessageBase { - sp flinger; - wp gbp; - public: - MessageCleanUpList(const sp& flinger, const wp& gbp) - : flinger(flinger), gbp(gbp) { } - virtual bool handler() { - Mutex::Autolock _l(flinger->mStateLock); - flinger->mGraphicBufferProducerList.remove(gbp); - return true; - } - }; - flinger->postMessageAsync( - new MessageCleanUpList(flinger, static_cast(this)) ); -} - -// --------------------------------------------------------------------------- -}; // namespace android diff --git a/services/surfaceflinger/SurfaceTextureLayer.h b/services/surfaceflinger/SurfaceTextureLayer.h deleted file mode 100644 index 5f5e4ef5d..000000000 --- a/services/surfaceflinger/SurfaceTextureLayer.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ANDROID_SURFACE_TEXTURE_LAYER_H -#define ANDROID_SURFACE_TEXTURE_LAYER_H - -#include -#include -#include - -#include -#include - -namespace android { -// --------------------------------------------------------------------------- - -class Layer; -class SurfaceFlinger; - -/* - * This is a thin wrapper around BufferQueue, used by the Layer class. - */ -class SurfaceTextureLayer : public BufferQueue { - sp flinger; -public: - SurfaceTextureLayer(const sp& flinger); - virtual ~SurfaceTextureLayer(); -}; - -// --------------------------------------------------------------------------- -}; // namespace android - -#endif // ANDROID_SURFACE_TEXTURE_LAYER_H