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

Commit 4da5a039 authored by Jim Shargo's avatar Jim Shargo
Browse files

BufferQueues: clean up BufferItemConsumer constructors

These currently use flags that muddy up client code. We've added nice
new BufferItemConsumer::create methods, so lets use those and clean
things up.

BYPASS_IGBP_IGBC_API_REASON=warren buffers

Bug: 398822412
Flag: EXEMPT refactor
Test: builds, presubmit
Change-Id: Idbc9047638239ae4971e3fb142d70000b2911a9c
parent 22e4ca1d
Loading
Loading
Loading
Loading
+6 −17
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "ImageReader_JNI"
#define ATRACE_TAG ATRACE_TAG_CAMERA

#include <android/hardware_buffer_jni.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_graphics_GraphicBuffer.h>
@@ -49,6 +50,7 @@
#include <utils/Trace.h>
#include <utils/misc.h>

#include <cstdint>
#include <cstdio>

#include "android_media_Utils.h"
@@ -409,19 +411,10 @@ static void ImageReader_init(JNIEnv* env, jobject thiz, jobject weakThiz, jint w
    uint64_t consumerUsage = 0;
#endif

#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
    sp<BufferItemConsumer> bufferConsumer = new BufferItemConsumer(consumerUsage, maxImages,
                                                                   /*controlledByApp*/ true);
    sp<IGraphicBufferProducer> gbProducer =
            bufferConsumer->getSurface()->getIGraphicBufferProducer();
#else
    sp<IGraphicBufferProducer> gbProducer;
    sp<IGraphicBufferConsumer> gbConsumer;
    BufferQueue::createBufferQueue(&gbProducer, &gbConsumer);
    sp<BufferItemConsumer> bufferConsumer;
    bufferConsumer = new BufferItemConsumer(gbConsumer, consumerUsage, maxImages,
    auto [bufferConsumer, surface] =
            BufferItemConsumer::create((uint64_t)consumerUsage, (int)maxImages,
                                       /*controlledByApp*/ true);
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
    sp<IGraphicBufferProducer> gbProducer = surface->getIGraphicBufferProducer();
    if (bufferConsumer == nullptr) {
        jniThrowExceptionFmt(env, "java/lang/RuntimeException",
                "Failed to allocate native buffer consumer for hal format 0x%x and usage 0x%x",
@@ -430,11 +423,7 @@ static void ImageReader_init(JNIEnv* env, jobject thiz, jobject weakThiz, jint w
    }

    if (consumerUsage & GRALLOC_USAGE_PROTECTED) {
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
        bufferConsumer->setConsumerIsProtected(true);
#else
        gbConsumer->setConsumerIsProtected(true);
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
    }

    ctx->setBufferConsumer(bufferConsumer);
+21 −0
Original line number Diff line number Diff line
@@ -21,12 +21,33 @@
#include <gui/BufferQueue.h>
#include <gui/ConsumerBase.h>
#include <gui/IGraphicBufferConsumer.h>
#include <gui/Surface.h>
#include <utils/RefBase.h>

namespace android {

class BufferItemConsumer : public ConsumerBase {
public:
    enum { DEFAULT_MAX_BUFFERS = -1 };

    static std::tuple<sp<BufferItemConsumer>, sp<Surface>> create(
            uint64_t consumerUsage, int bufferCount = DEFAULT_MAX_BUFFERS,
            bool controlledByApp = false, bool isConsumerSurfaceFlinger = false) {
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
        sp<BufferItemConsumer> bufferItemConsumer =
                sp<BufferItemConsumer>::make(consumerUsage, bufferCount, controlledByApp,
                                             isConsumerSurfaceFlinger);
        return {bufferItemConsumer, bufferItemConsumer->getSurface()};
#else
        sp<IGraphicBufferProducer> igbp;
        sp<IGraphicBufferConsumer> igbc;
        BufferQueue::createBufferQueue(&igbp, &igbc, isConsumerSurfaceFlinger);
        sp<BufferItemConsumer> bufferItemConsumer =
                sp<BufferItemConsumer>::make(igbc, consumerUsage, bufferCount, controlledByApp);
        return {bufferItemConsumer, sp<Surface>::make(igbp, controlledByApp)};
#endif
    }

    BufferItemConsumer(const sp<IGraphicBufferConsumer>& consumer, uint64_t consumerUsage,
                       int bufferCount = -1, bool controlledByApp = false)
          : mConsumer(consumer) {}
+3 −14
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@
#include <com_android_graphics_libgui_flags.h>
#include <cutils/trace.h>

#include "gui/BufferItemConsumer.h"

namespace android {
namespace uirenderer {
namespace test {
@@ -102,24 +104,11 @@ void TestContext::createWindowSurface() {
}

void TestContext::createOffscreenSurface() {
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
    mConsumer = new BufferItemConsumer(GRALLOC_USAGE_HW_COMPOSER, 4);
    std::tie(mConsumer, mSurface) = BufferItemConsumer::create(GRALLOC_USAGE_HW_COMPOSER, 4);
    const ui::Size& resolution = getActiveDisplayResolution();
    mConsumer->setDefaultBufferSize(resolution.getWidth(), resolution.getHeight());
    mSurface = mConsumer->getSurface();
    mSurface->setMaxDequeuedBufferCount(3);
    mSurface->setAsyncMode(true);
#else
    sp<IGraphicBufferProducer> producer;
    sp<IGraphicBufferConsumer> consumer;
    BufferQueue::createBufferQueue(&producer, &consumer);
    producer->setMaxDequeuedBufferCount(3);
    producer->setAsyncMode(true);
    mConsumer = new BufferItemConsumer(consumer, GRALLOC_USAGE_HW_COMPOSER, 4);
    const ui::Size& resolution = getActiveDisplayResolution();
    mConsumer->setDefaultBufferSize(resolution.getWidth(), resolution.getHeight());
    mSurface = new Surface(producer);
#endif  // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
}

void TestContext::waitForVsync() {