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

Commit ab8443c8 authored by Carlos Martinez Romero's avatar Carlos Martinez Romero
Browse files

Use SurfaceListener instead of IProducerListener

IProducerListener is being deprecated outside of libgui, we are limiting IGBP/IGBC usage outside of libgui to allow for future changes. See go/warren-buffers for more information.

Bug: 342199105
Test: Pending
FLAG: EXEMPT no op refactor
BYPASS_IGBP_IGBC_API_REASON: Refactor

Change-Id: I37129c645b55fd33d6789b9b2ba85a35e044dcd9
parent ab12e9d1
Loading
Loading
Loading
Loading
+10 −12
Original line number Original line Diff line number Diff line
@@ -44,8 +44,6 @@
#include <gui/AidlStatusUtil.h>
#include <gui/AidlStatusUtil.h>
#include <gui/BufferItem.h>
#include <gui/BufferItem.h>


#include <gui/IProducerListener.h>

#include <gui/ISurfaceComposer.h>
#include <gui/ISurfaceComposer.h>
#include <gui/LayerState.h>
#include <gui/LayerState.h>
#include <private/gui/ComposerService.h>
#include <private/gui/ComposerService.h>
@@ -1860,30 +1858,31 @@ bool Surface::transformToDisplayInverse() const {
}
}


int Surface::connect(int api) {
int Surface::connect(int api) {
    static sp<IProducerListener> listener = new StubProducerListener();
    static sp<SurfaceListener> listener = new StubSurfaceListener();
    return connect(api, listener);
    return connect(api, listener);
}
}


int Surface::connect(int api, const sp<IProducerListener>& listener) {
int Surface::connect(int api, const sp<SurfaceListener>& listener) {
    return connect(api, listener, false);
    return connect(api, listener, false);
}
}


int Surface::connect(
int Surface::connect(
        int api, bool reportBufferRemoval, const sp<SurfaceListener>& sListener) {
        int api, bool reportBufferRemoval, const sp<SurfaceListener>& sListener) {
    if (sListener != nullptr) {
    return connect(api, sListener, reportBufferRemoval);
        mListenerProxy = new ProducerListenerProxy(this, sListener);
    }
    return connect(api, mListenerProxy, reportBufferRemoval);
}
}


int Surface::connect(
int Surface::connect(int api, const sp<SurfaceListener>& listener, bool reportBufferRemoval) {
        int api, const sp<IProducerListener>& listener, bool reportBufferRemoval) {
    ATRACE_CALL();
    ATRACE_CALL();
    ALOGV("Surface::connect");
    ALOGV("Surface::connect");
    Mutex::Autolock lock(mMutex);
    Mutex::Autolock lock(mMutex);
    IGraphicBufferProducer::QueueBufferOutput output;
    IGraphicBufferProducer::QueueBufferOutput output;
    mReportRemovedBuffers = reportBufferRemoval;
    mReportRemovedBuffers = reportBufferRemoval;
    int err = mGraphicBufferProducer->connect(listener, api, mProducerControlledByApp, &output);
    if (listener != nullptr) {
        mListenerProxy = new ProducerListenerProxy(this, listener);
    }

    int err =
            mGraphicBufferProducer->connect(mListenerProxy, api, mProducerControlledByApp, &output);
    if (err == NO_ERROR) {
    if (err == NO_ERROR) {
        mDefaultWidth = output.width;
        mDefaultWidth = output.width;
        mDefaultHeight = output.height;
        mDefaultHeight = output.height;
@@ -1911,7 +1910,6 @@ int Surface::connect(
    return err;
    return err;
}
}



int Surface::disconnect(int api, IGraphicBufferProducer::DisconnectMode mode) {
int Surface::disconnect(int api, IGraphicBufferProducer::DisconnectMode mode) {
    ATRACE_CALL();
    ATRACE_CALL();
    ALOGV("Surface::disconnect");
    ALOGV("Surface::disconnect");
+14 −4
Original line number Original line Diff line number Diff line
@@ -56,6 +56,16 @@ public:
    virtual bool needsReleaseNotify() = 0;
    virtual bool needsReleaseNotify() = 0;


    virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& buffers) = 0;
    virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& buffers) = 0;
    virtual void onBufferDetached(int slot) = 0;
};

class StubSurfaceListener : public SurfaceListener {
public:
    virtual ~StubSurfaceListener() {}
    virtual void onBufferReleased() override {}
    virtual bool needsReleaseNotify() { return false; }
    virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& /*buffers*/) override {}
    virtual void onBufferDetached(int /*slot*/) override {}
};
};


/*
/*
@@ -357,15 +367,13 @@ public:
    virtual int unlockAndPost();
    virtual int unlockAndPost();
    virtual int query(int what, int* value) const;
    virtual int query(int what, int* value) const;


    virtual int connect(int api, const sp<IProducerListener>& listener);
    virtual int connect(int api, const sp<SurfaceListener>& listener);


    // When reportBufferRemoval is true, clients must call getAndFlushRemovedBuffers to fetch
    // When reportBufferRemoval is true, clients must call getAndFlushRemovedBuffers to fetch
    // GraphicBuffers removed from this surface after a dequeueBuffer, detachNextBuffer or
    // GraphicBuffers removed from this surface after a dequeueBuffer, detachNextBuffer or
    // attachBuffer call. This allows clients with their own buffer caches to free up buffers no
    // attachBuffer call. This allows clients with their own buffer caches to free up buffers no
    // longer in use by this surface.
    // longer in use by this surface.
    virtual int connect(
    virtual int connect(int api, const sp<SurfaceListener>& listener, bool reportBufferRemoval);
            int api, const sp<IProducerListener>& listener,
            bool reportBufferRemoval);
    virtual int detachNextBuffer(sp<GraphicBuffer>* outBuffer,
    virtual int detachNextBuffer(sp<GraphicBuffer>* outBuffer,
            sp<Fence>* outFence);
            sp<Fence>* outFence);
    virtual int attachBuffer(ANativeWindowBuffer*);
    virtual int attachBuffer(ANativeWindowBuffer*);
@@ -422,6 +430,8 @@ protected:
            return mSurfaceListener->needsReleaseNotify();
            return mSurfaceListener->needsReleaseNotify();
        }
        }


        virtual void onBufferDetached(int slot) { mSurfaceListener->onBufferDetached(slot); }

        virtual void onBuffersDiscarded(const std::vector<int32_t>& slots);
        virtual void onBuffersDiscarded(const std::vector<int32_t>& slots);
    private:
    private:
        wp<Surface> mParent;
        wp<Surface> mParent;
+15 −1
Original line number Original line Diff line number Diff line
@@ -1269,6 +1269,20 @@ public:
    }
    }
};
};


class TestSurfaceListener : public SurfaceListener {
public:
    sp<IGraphicBufferProducer> mIgbp;
    TestSurfaceListener(const sp<IGraphicBufferProducer>& igbp) : mIgbp(igbp) {}
    void onBufferReleased() override {
        sp<GraphicBuffer> buffer;
        sp<Fence> fence;
        mIgbp->detachNextBuffer(&buffer, &fence);
    }
    bool needsReleaseNotify() override { return true; }
    void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& /*buffers*/) override {}
    void onBufferDetached(int /*slot*/) {}
};

TEST_F(BLASTBufferQueueTest, CustomProducerListener) {
TEST_F(BLASTBufferQueueTest, CustomProducerListener) {
    BLASTBufferQueueHelper adapter(mSurfaceControl, mDisplayWidth, mDisplayHeight);
    BLASTBufferQueueHelper adapter(mSurfaceControl, mDisplayWidth, mDisplayHeight);
    sp<IGraphicBufferProducer> igbProducer = adapter.getIGraphicBufferProducer();
    sp<IGraphicBufferProducer> igbProducer = adapter.getIGraphicBufferProducer();
@@ -1327,7 +1341,7 @@ TEST_F(BLASTBufferQueueTest, TransformHint) {
    ASSERT_EQ(ui::Transform::ROT_0, static_cast<ui::Transform::RotationFlags>(transformHint));
    ASSERT_EQ(ui::Transform::ROT_0, static_cast<ui::Transform::RotationFlags>(transformHint));


    ASSERT_EQ(NO_ERROR,
    ASSERT_EQ(NO_ERROR,
              surface->connect(NATIVE_WINDOW_API_CPU, new TestProducerListener(igbProducer)));
              surface->connect(NATIVE_WINDOW_API_CPU, new TestSurfaceListener(igbProducer)));


    // After connecting to the surface, we should get the correct hint.
    // After connecting to the surface, we should get the correct hint.
    surface->query(NATIVE_WINDOW_TRANSFORM_HINT, &transformHint);
    surface->query(NATIVE_WINDOW_TRANSFORM_HINT, &transformHint);
+4 −5
Original line number Original line Diff line number Diff line
@@ -27,7 +27,6 @@
#include <configstore/Utils.h>
#include <configstore/Utils.h>
#include <gui/AidlStatusUtil.h>
#include <gui/AidlStatusUtil.h>
#include <gui/BufferItemConsumer.h>
#include <gui/BufferItemConsumer.h>
#include <gui/IProducerListener.h>
#include <gui/ISurfaceComposer.h>
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/SurfaceComposerClient.h>
@@ -82,7 +81,7 @@ public:
    virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& buffers) {
    virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& buffers) {
        mDiscardedBuffers.insert(mDiscardedBuffers.end(), buffers.begin(), buffers.end());
        mDiscardedBuffers.insert(mDiscardedBuffers.end(), buffers.begin(), buffers.end());
    }
    }

    virtual void onBufferDetached(int /*slot*/) {}
    int getReleaseNotifyCount() const {
    int getReleaseNotifyCount() const {
        return mBuffersReleased;
        return mBuffersReleased;
    }
    }
@@ -491,7 +490,7 @@ TEST_F(SurfaceTest, GetAndFlushRemovedBuffers) {


    sp<Surface> surface = new Surface(producer);
    sp<Surface> surface = new Surface(producer);
    sp<ANativeWindow> window(surface);
    sp<ANativeWindow> window(surface);
    sp<StubProducerListener> listener = new StubProducerListener();
    sp<StubSurfaceListener> listener = new StubSurfaceListener();
    ASSERT_EQ(OK, surface->connect(
    ASSERT_EQ(OK, surface->connect(
            NATIVE_WINDOW_API_CPU,
            NATIVE_WINDOW_API_CPU,
            /*listener*/listener,
            /*listener*/listener,
@@ -2154,7 +2153,7 @@ TEST_F(SurfaceTest, BatchOperations) {
    sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1);
    sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1);
    sp<Surface> surface = new Surface(producer);
    sp<Surface> surface = new Surface(producer);
    sp<ANativeWindow> window(surface);
    sp<ANativeWindow> window(surface);
    sp<StubProducerListener> listener = new StubProducerListener();
    sp<StubSurfaceListener> listener = new StubSurfaceListener();


    ASSERT_EQ(OK, surface->connect(NATIVE_WINDOW_API_CPU, /*listener*/listener,
    ASSERT_EQ(OK, surface->connect(NATIVE_WINDOW_API_CPU, /*listener*/listener,
            /*reportBufferRemoval*/false));
            /*reportBufferRemoval*/false));
@@ -2206,7 +2205,7 @@ TEST_F(SurfaceTest, BatchIllegalOperations) {
    sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1);
    sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1);
    sp<Surface> surface = new Surface(producer);
    sp<Surface> surface = new Surface(producer);
    sp<ANativeWindow> window(surface);
    sp<ANativeWindow> window(surface);
    sp<StubProducerListener> listener = new StubProducerListener();
    sp<StubSurfaceListener> listener = new StubSurfaceListener();


    ASSERT_EQ(OK, surface->connect(NATIVE_WINDOW_API_CPU, /*listener*/listener,
    ASSERT_EQ(OK, surface->connect(NATIVE_WINDOW_API_CPU, /*listener*/listener,
            /*reportBufferRemoval*/false));
            /*reportBufferRemoval*/false));