Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8aff163b authored by Anton Ivanov's avatar Anton Ivanov Committed by Android (Google) Code Review
Browse files

Merge "Delay initialization of a ConsumerBase instance to construction of a sp/wp." into main

parents b3ad731b 4efd0d93
Loading
Loading
Loading
Loading
+18 −14
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include <gui/BufferItem.h>
#include <gui/BufferQueue.h>
#include <gui/ConsumerBase.h>
#include <gui/IConsumerListener.h>
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
@@ -68,8 +69,8 @@ ConsumerBase::ConsumerBase(const sp<IGraphicBufferConsumer>& bufferQueue, bool c
#endif
        mAbandoned(false),
        mConsumer(bufferQueue),
        mPrevFinalReleaseFence(Fence::NO_FENCE) {
    initialize(controlledByApp);
        mPrevFinalReleaseFence(Fence::NO_FENCE),
        mIsControlledByApp(controlledByApp) {
}

#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
@@ -79,11 +80,11 @@ ConsumerBase::ConsumerBase(bool controlledByApp, bool consumerIsSurfaceFlinger)
        mSlots(BufferQueueDefs::NUM_BUFFER_SLOTS),
#endif
        mAbandoned(false),
        mPrevFinalReleaseFence(Fence::NO_FENCE) {
        mPrevFinalReleaseFence(Fence::NO_FENCE),
        mIsControlledByApp(controlledByApp) {
    sp<IGraphicBufferProducer> producer;
    BufferQueue::createBufferQueue(&producer, &mConsumer, consumerIsSurfaceFlinger);
    mSurface = sp<Surface>::make(producer, controlledByApp);
    initialize(controlledByApp);
}

ConsumerBase::ConsumerBase(const sp<IGraphicBufferProducer>& producer,
@@ -95,24 +96,27 @@ ConsumerBase::ConsumerBase(const sp<IGraphicBufferProducer>& producer,
        mAbandoned(false),
        mConsumer(consumer),
        mSurface(sp<Surface>::make(producer, controlledByApp)),
        mPrevFinalReleaseFence(Fence::NO_FENCE) {
    initialize(controlledByApp);
        mPrevFinalReleaseFence(Fence::NO_FENCE),
        mIsControlledByApp(controlledByApp) {
}

#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)

void ConsumerBase::initialize(bool controlledByApp) {
void ConsumerBase::onFirstRef() {
    ConsumerListener::onFirstRef();
    initialize();
}

void ConsumerBase::initialize() {
    // Choose a name using the PID and a process-unique ID.
    mName = String8::format("unnamed-%d-%d", getpid(), createProcessUniqueId());

    // Note that we can't create an sp<...>(this) in a ctor that will not keep a
    // reference once the ctor ends, as that would cause the refcount of 'this'
    // dropping to 0 at the end of the ctor.  Since all we need is a wp<...>
    // that's what we create.
    wp<ConsumerListener> listener = static_cast<ConsumerListener*>(this);
    sp<IConsumerListener> proxy = new BufferQueue::ProxyConsumerListener(listener);
    // Here we depend on an sp/wp having been created for `this`.  For this
    // reason, initialize() cannot be called from a ctor.
    wp<ConsumerListener> listener = wp<ConsumerListener>::fromExisting(this);
    sp<IConsumerListener> proxy = sp<BufferQueue::ProxyConsumerListener>::make(listener);

    status_t err = mConsumer->consumerConnect(proxy, controlledByApp);
    status_t err = mConsumer->consumerConnect(proxy, mIsControlledByApp);
    if (err != NO_ERROR) {
        CB_LOGE("ConsumerBase: error connecting to BufferQueue: %s (%d)",
                strerror(-err), err);
+8 −1
Original line number Diff line number Diff line
@@ -139,7 +139,8 @@ private:
    ConsumerBase(const ConsumerBase&);
    void operator=(const ConsumerBase&);

    void initialize(bool controlledByApp);
    // Requires `this` to be sp/wp so must not be called from ctor.
    void initialize();

protected:
    // ConsumerBase constructs a new ConsumerBase object to consume image
@@ -252,6 +253,10 @@ protected:
            const sp<GraphicBuffer> graphicBuffer,
            EGLDisplay display = EGL_NO_DISPLAY, EGLSyncKHR eglFence = EGL_NO_SYNC_KHR);
#endif
    // Required to complete initialization, so `final` lest overrides forget to
    // delegate.
    void onFirstRef() override final;

    // returns true iff the slot still has the graphicBuffer in it.
    bool stillTracking(int slot, const sp<GraphicBuffer> graphicBuffer);

@@ -327,6 +332,8 @@ protected:
    // releaseBufferLocked.
    sp<Fence> mPrevFinalReleaseFence;

    const bool mIsControlledByApp;

    // mMutex is the mutex used to prevent concurrent access to the member
    // variables of ConsumerBase objects. It must be locked whenever the
    // member variables are accessed or when any of the *Locked methods are