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

Commit 97a297e9 authored by Carlos Martinez Romero's avatar Carlos Martinez Romero Committed by Android (Google) Code Review
Browse files

Merge "Use SurfaceListener instead of IProducerListener" into main

parents 44e895b7 ab8443c8
Loading
Loading
Loading
Loading
+10 −12
Original line number Diff line number Diff line
@@ -44,8 +44,6 @@
#include <gui/AidlStatusUtil.h>
#include <gui/BufferItem.h>

#include <gui/IProducerListener.h>

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

int Surface::connect(int api) {
    static sp<IProducerListener> listener = new StubProducerListener();
    static sp<SurfaceListener> listener = new StubSurfaceListener();
    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);
}

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

int Surface::connect(
        int api, const sp<IProducerListener>& listener, bool reportBufferRemoval) {
int Surface::connect(int api, const sp<SurfaceListener>& listener, bool reportBufferRemoval) {
    ATRACE_CALL();
    ALOGV("Surface::connect");
    Mutex::Autolock lock(mMutex);
    IGraphicBufferProducer::QueueBufferOutput output;
    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) {
        mDefaultWidth = output.width;
        mDefaultHeight = output.height;
@@ -1911,7 +1910,6 @@ int Surface::connect(
    return err;
}


int Surface::disconnect(int api, IGraphicBufferProducer::DisconnectMode mode) {
    ATRACE_CALL();
    ALOGV("Surface::disconnect");
+14 −4
Original line number Diff line number Diff line
@@ -56,6 +56,16 @@ public:
    virtual bool needsReleaseNotify() = 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 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
    // 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
    // longer in use by this surface.
    virtual int connect(
            int api, const sp<IProducerListener>& listener,
            bool reportBufferRemoval);
    virtual int connect(int api, const sp<SurfaceListener>& listener, bool reportBufferRemoval);
    virtual int detachNextBuffer(sp<GraphicBuffer>* outBuffer,
            sp<Fence>* outFence);
    virtual int attachBuffer(ANativeWindowBuffer*);
@@ -422,6 +430,8 @@ protected:
            return mSurfaceListener->needsReleaseNotify();
        }

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

        virtual void onBuffersDiscarded(const std::vector<int32_t>& slots);
    private:
        wp<Surface> mParent;
+15 −1
Original line number 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) {
    BLASTBufferQueueHelper adapter(mSurfaceControl, mDisplayWidth, mDisplayHeight);
    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(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.
    surface->query(NATIVE_WINDOW_TRANSFORM_HINT, &transformHint);
+4 −5
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@
#include <configstore/Utils.h>
#include <gui/AidlStatusUtil.h>
#include <gui/BufferItemConsumer.h>
#include <gui/IProducerListener.h>
#include <gui/ISurfaceComposer.h>
#include <gui/Surface.h>
#include <gui/SurfaceComposerClient.h>
@@ -82,7 +81,7 @@ public:
    virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& buffers) {
        mDiscardedBuffers.insert(mDiscardedBuffers.end(), buffers.begin(), buffers.end());
    }

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

    sp<Surface> surface = new Surface(producer);
    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,
@@ -2154,7 +2153,7 @@ TEST_F(SurfaceTest, BatchOperations) {
    sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1);
    sp<Surface> surface = new Surface(producer);
    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,
            /*reportBufferRemoval*/false));
@@ -2206,7 +2205,7 @@ TEST_F(SurfaceTest, BatchIllegalOperations) {
    sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1);
    sp<Surface> surface = new Surface(producer);
    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,
            /*reportBufferRemoval*/false));