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

Commit 66394ad6 authored by Jim Shargo's avatar Jim Shargo Committed by Android (Google) Code Review
Browse files

Merge "sf: ConsumerBase-based classes now create their own BufferQueues" into main

parents 9f392a93 6ccc5e8b
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -31,10 +31,11 @@
#include <utils/String8.h>
#include <log/log.h>

#include <hardware/hardware.h>
#include <com_android_graphics_libgui_flags.h>
#include <gui/BufferItem.h>
#include <gui/BufferQueue.h>
#include <gui/Surface.h>
#include <hardware/hardware.h>

#include <ui/DebugUtils.h>
#include <ui/GraphicBuffer.h>
@@ -48,10 +49,18 @@ namespace android {

using ui::Dataspace;

#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
FramebufferSurface::FramebufferSurface(HWComposer& hwc, PhysicalDisplayId displayId,
                                       const sp<IGraphicBufferProducer>& producer,
                                       const sp<IGraphicBufferConsumer>& consumer,
                                       const ui::Size& size, const ui::Size& maxSize)
      : ConsumerBase(producer, consumer),
#else
FramebufferSurface::FramebufferSurface(HWComposer& hwc, PhysicalDisplayId displayId,
                                       const sp<IGraphicBufferConsumer>& consumer,
                                       const ui::Size& size, const ui::Size& maxSize)
      : ConsumerBase(consumer),
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
        mDisplayId(displayId),
        mMaxSize(maxSize),
        mCurrentBufferSlot(-1),
+8 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <stdint.h>
#include <sys/types.h>

#include <com_android_graphics_libgui_flags.h>
#include <compositionengine/DisplaySurface.h>
#include <gui/BufferQueue.h>
#include <gui/ConsumerBase.h>
@@ -40,9 +41,16 @@ class HWComposer;

class FramebufferSurface : public ConsumerBase, public compositionengine::DisplaySurface {
public:
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
    FramebufferSurface(HWComposer& hwc, PhysicalDisplayId displayId,
                       const sp<IGraphicBufferProducer>& producer,
                       const sp<IGraphicBufferConsumer>& consumer, const ui::Size& size,
                       const ui::Size& maxSize);
#else
    FramebufferSurface(HWComposer& hwc, PhysicalDisplayId displayId,
                       const sp<IGraphicBufferConsumer>& consumer, const ui::Size& size,
                       const ui::Size& maxSize);
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)

    virtual status_t beginFrame(bool mustRecompose);
    virtual status_t prepareFrame(CompositionType compositionType);
+5 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@

#include <cinttypes>

#include <com_android_graphics_libgui_flags.h>
#include <ftl/enum.h>
#include <ftl/flags.h>
#include <gui/BufferItem.h>
@@ -51,7 +52,11 @@ VirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, VirtualDisplayId d
                                             const sp<IGraphicBufferProducer>& bqProducer,
                                             const sp<IGraphicBufferConsumer>& bqConsumer,
                                             const std::string& name)
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
      : ConsumerBase(bqProducer, bqConsumer),
#else
      : ConsumerBase(bqConsumer),
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
        mHwc(hwc),
        mDisplayId(displayId),
        mDisplayName(name),
+10 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <binder/PermissionCache.h>
#include <com_android_graphics_libgui_flags.h>
#include <com_android_graphics_surfaceflinger_flags.h>
#include <common/FlagManager.h>
#include <common/trace.h>
@@ -3728,11 +3729,20 @@ void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken,
                 state.surface.get());
        const auto displayId = PhysicalDisplayId::tryCast(compositionDisplay->getId());
        LOG_FATAL_IF(!displayId);
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
        const auto frameBufferSurface =
                sp<FramebufferSurface>::make(getHwComposer(), *displayId, bqProducer, bqConsumer,
                                             state.physical->activeMode->getResolution(),
                                             ui::Size(maxGraphicsWidth, maxGraphicsHeight));
        displaySurface = frameBufferSurface;
        producer = frameBufferSurface->getSurface()->getIGraphicBufferProducer();
#else
        displaySurface =
                sp<FramebufferSurface>::make(getHwComposer(), *displayId, bqConsumer,
                                             state.physical->activeMode->getResolution(),
                                             ui::Size(maxGraphicsWidth, maxGraphicsHeight));
        producer = bqProducer;
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
    }

    LOG_FATAL_IF(!displaySurface);
+21 −1
Original line number Diff line number Diff line
@@ -42,8 +42,13 @@ public:
     * through saved callback. */
    class BufferListener : public ConsumerBase::FrameAvailableListener {
    public:
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
        BufferListener(sp<BufferItemConsumer> consumer, BufferCallback callback)
#else
        BufferListener(sp<IGraphicBufferConsumer> consumer, BufferCallback callback)
              : mConsumer(consumer), mCallback(callback) {}
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
              : mConsumer(consumer), mCallback(callback) {
        }

        void onFrameAvailable(const BufferItem& /*item*/) {
            BufferItem item;
@@ -55,7 +60,11 @@ public:
        }

    private:
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
        sp<BufferItemConsumer> mConsumer;
#else
        sp<IGraphicBufferConsumer> mConsumer;
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
        BufferCallback mCallback;
    };

@@ -63,6 +72,16 @@ public:
     * queue. */
    void initialize(uint32_t width, uint32_t height, android_pixel_format_t format,
                    BufferCallback callback) {
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
        mBufferItemConsumer = sp<BufferItemConsumer>::make(GraphicBuffer::USAGE_HW_TEXTURE);
        mBufferItemConsumer->setDefaultBufferSize(width, height);
        mBufferItemConsumer->setDefaultBufferFormat(format);

        mListener = sp<BufferListener>::make(mBufferItemConsumer, callback);
        mBufferItemConsumer->setFrameAvailableListener(mListener);

        mSurface = mBufferItemConsumer->getSurface();
#else
        sp<IGraphicBufferProducer> producer;
        sp<IGraphicBufferConsumer> consumer;
        BufferQueue::createBufferQueue(&producer, &consumer);
@@ -77,6 +96,7 @@ public:
        mBufferItemConsumer->setFrameAvailableListener(mListener);

        mSurface = sp<Surface>::make(producer, true);
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
    }

    /* Used by Egl manager. The surface is never displayed. */
Loading