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

Commit 16f0b8e2 authored by Jim Shargo's avatar Jim Shargo
Browse files

base: ConsumerBase-based classes now create their own BufferQueues

Using ConsumerBase-based classes is now the recommended way to create
BufferQueues.

This is an important step for go/warren-buffers, because it consolidates
usages of BufferQueues to supported APIs and reduces the libgui API
surface that exposes IGBP/IGBC.

BYPASS_IGBP_IGBC_API_REASON: this CL is part of the migration.

Bug: 340933754
Flag: com.android.graphics.libgui.flags.wb_consumer_base_owns_bq
Test: atest, presubmit, compiles

Change-Id: I1bd14b96b6601d22f6ff5ffb7d58279b46a1867b
parent 08a2b927
Loading
Loading
Loading
Loading
+33 −4
Original line number Diff line number Diff line
@@ -256,9 +256,21 @@ static void SurfaceTexture_classInit(JNIEnv* env, jclass clazz)
    }
}

static void SurfaceTexture_init(JNIEnv* env, jobject thiz, jboolean isDetached,
        jint texName, jboolean singleBufferMode, jobject weakThiz)
{
static void SurfaceTexture_init(JNIEnv* env, jobject thiz, jboolean isDetached, jint texName,
                                jboolean singleBufferMode, jobject weakThiz) {
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
    sp<SurfaceTexture> surfaceTexture;
    if (isDetached) {
        surfaceTexture = new SurfaceTexture(GL_TEXTURE_EXTERNAL_OES, true, !singleBufferMode);
    } else {
        surfaceTexture =
                new SurfaceTexture(texName, GL_TEXTURE_EXTERNAL_OES, true, !singleBufferMode);
    }

    if (singleBufferMode) {
        surfaceTexture->setMaxBufferCount(1);
    }
#else
    sp<IGraphicBufferProducer> producer;
    sp<IGraphicBufferConsumer> consumer;
    BufferQueue::createBufferQueue(&producer, &consumer);
@@ -275,6 +287,7 @@ static void SurfaceTexture_init(JNIEnv* env, jobject thiz, jboolean isDetached,
        surfaceTexture = new SurfaceTexture(consumer, texName,
                GL_TEXTURE_EXTERNAL_OES, true, !singleBufferMode);
    }
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)

    if (surfaceTexture == 0) {
        jniThrowException(env, OutOfResourcesException,
@@ -287,11 +300,27 @@ static void SurfaceTexture_init(JNIEnv* env, jobject thiz, jboolean isDetached,
            createProcessUniqueId()));

    // If the current context is protected, inform the producer.
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
    surfaceTexture->setConsumerIsProtected(isProtectedContext());

    SurfaceTexture_setSurfaceTexture(env, thiz, surfaceTexture);
    sp<Surface> surface = surfaceTexture->getSurface();
    if (nullptr == surface) {
        jniThrowException(env, IllegalStateException, "Unable to get surface from SurfaceTexture");
        return;
    }
    sp<IGraphicBufferProducer> igbp = surface->getIGraphicBufferProducer();
    if (nullptr == igbp) {
        jniThrowException(env, IllegalStateException, "Unable to get IGBP from Surface");
        return;
    }
    SurfaceTexture_setProducer(env, thiz, igbp);
#else
    consumer->setConsumerIsProtected(isProtectedContext());

    SurfaceTexture_setSurfaceTexture(env, thiz, surfaceTexture);
    SurfaceTexture_setProducer(env, thiz, producer);

#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
    jclass clazz = env->GetObjectClass(thiz);
    if (clazz == NULL) {
        jniThrowRuntimeException(env,
+11 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#include "tests/common/TestContext.h"

#include <com_android_graphics_libgui_flags.h>
#include <cutils/trace.h>

namespace android {
@@ -101,6 +102,14 @@ 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);
    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);
@@ -110,6 +119,7 @@ void TestContext::createOffscreenSurface() {
    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() {
+32 −25
Original line number Diff line number Diff line
@@ -17,35 +17,31 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "ImageReader_JNI"
#define ATRACE_TAG ATRACE_TAG_CAMERA
#include "android_media_Utils.h"
#include <cutils/atomic.h>
#include <utils/Log.h>
#include <utils/misc.h>
#include <utils/List.h>
#include <utils/Trace.h>
#include <utils/String8.h>

#include <cstdio>

#include <gui/BufferItemConsumer.h>
#include <gui/Surface.h>

#include <android/hardware_buffer_jni.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/android_view_Surface.h>
#include <android_runtime/android_graphics_GraphicBuffer.h>
#include <android_runtime/android_hardware_HardwareBuffer.h>
#include <android_runtime/android_view_Surface.h>
#include <com_android_graphics_libgui_flags.h>
#include <cutils/atomic.h>
#include <grallocusage/GrallocUsageConversion.h>

#include <private/android/AHardwareBufferHelpers.h>

#include <gui/BufferItemConsumer.h>
#include <gui/Surface.h>
#include <inttypes.h>
#include <jni.h>
#include <nativehelper/JNIHelp.h>

#include <private/android/AHardwareBufferHelpers.h>
#include <stdint.h>
#include <inttypes.h>
#include <android/hardware_buffer_jni.h>

#include <ui/Rect.h>
#include <utils/List.h>
#include <utils/Log.h>
#include <utils/String8.h>
#include <utils/Trace.h>
#include <utils/misc.h>

#include <cstdio>

#include "android_media_Utils.h"

#define ANDROID_MEDIA_IMAGEREADER_CTX_JNI_ID       "mNativeContext"
#define ANDROID_MEDIA_SURFACEIMAGE_BUFFER_JNI_ID   "mNativeBuffer"
@@ -393,18 +389,25 @@ static void ImageReader_init(JNIEnv* env, jobject thiz, jobject weakThiz, jint w
    }
    sp<JNIImageReaderContext> ctx(new JNIImageReaderContext(env, weakThiz, clazz, maxImages));

    sp<IGraphicBufferProducer> gbProducer;
    sp<IGraphicBufferConsumer> gbConsumer;
    BufferQueue::createBufferQueue(&gbProducer, &gbConsumer);
    sp<BufferItemConsumer> bufferConsumer;
    String8 consumerName = String8::format("ImageReader-%dx%df%xm%d-%d-%d",
            width, height, nativeHalFormat, maxImages, getpid(),
            createProcessUniqueId());
    uint64_t consumerUsage =
            android_hardware_HardwareBuffer_convertToGrallocUsageBits(ndkUsage);

#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,
            /*controlledByApp*/true);
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
    if (bufferConsumer == nullptr) {
        jniThrowExceptionFmt(env, "java/lang/RuntimeException",
                "Failed to allocate native buffer consumer for hal format 0x%x and usage 0x%x",
@@ -413,7 +416,11 @@ 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);
+17 −9
Original line number Diff line number Diff line
@@ -15,21 +15,23 @@
 */
// #define LOG_NDEBUG 0

#include "base/logging.h"
#include "base/utilities.h"
#include "core/gl_env.h"
#include "core/shader_program.h"
#include "core/vertex_frame.h"
#include "system/window.h"

#include <map>
#include <string>
#include <EGL/eglext.h>

#include <com_android_graphics_libgui_flags.h>
#include <gui/BufferQueue.h>
#include <gui/Surface.h>
#include <gui/GLConsumer.h>
#include <gui/IGraphicBufferProducer.h>
#include <gui/Surface.h>

#include <map>
#include <string>

#include "base/logging.h"
#include "base/utilities.h"
#include "core/shader_program.h"
#include "core/vertex_frame.h"
#include "system/window.h"

namespace android {
namespace filterfw {
@@ -165,12 +167,18 @@ bool GLEnv::InitWithNewContext() {
  }

  // Create dummy surface using a GLConsumer
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
  surfaceTexture_ = new GLConsumer(0, GLConsumer::TEXTURE_EXTERNAL, /*useFenceSync=*/true,
                                   /*isControlledByApp=*/false);
  window_ = surfaceTexture_->getSurface();
#else
  sp<IGraphicBufferProducer> producer;
  sp<IGraphicBufferConsumer> consumer;
  BufferQueue::createBufferQueue(&producer, &consumer);
  surfaceTexture_ = new GLConsumer(consumer, 0, GLConsumer::TEXTURE_EXTERNAL,
          true, false);
  window_ = new Surface(producer);
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)

  surfaces_[0] = SurfaceWindowPair(eglCreateWindowSurface(display(), config, window_.get(), NULL), NULL);
  if (CheckEGLError("eglCreateWindowSurface")) return false;