diff options
author | 2024-06-21 14:27:36 +0000 | |
---|---|---|
committer | 2024-08-24 00:19:20 +0000 | |
commit | 16f0b8e20e50e515bb37560920787836e3c9ea36 (patch) | |
tree | ec4a4655b523110f7e52e6399e5bd0c17e2d402e | |
parent | 08a2b92750643367137412a13cb6001bc35008ec (diff) |
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
-rw-r--r-- | core/jni/android_graphics_SurfaceTexture.cpp | 37 | ||||
-rw-r--r-- | libs/hwui/tests/common/TestContext.cpp | 12 | ||||
-rw-r--r-- | media/jni/android_media_ImageReader.cpp | 57 | ||||
-rw-r--r-- | media/mca/filterfw/native/core/gl_env.cpp | 26 |
4 files changed, 93 insertions, 39 deletions
diff --git a/core/jni/android_graphics_SurfaceTexture.cpp b/core/jni/android_graphics_SurfaceTexture.cpp index 50832a5c256a..8dd63cc07b8a 100644 --- a/core/jni/android_graphics_SurfaceTexture.cpp +++ b/core/jni/android_graphics_SurfaceTexture.cpp @@ -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, diff --git a/libs/hwui/tests/common/TestContext.cpp b/libs/hwui/tests/common/TestContext.cpp index fd596d998dfd..e427c97e41fa 100644 --- a/libs/hwui/tests/common/TestContext.cpp +++ b/libs/hwui/tests/common/TestContext.cpp @@ -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() { @@ -144,4 +154,4 @@ void TestContext::waitForVsync() { } // namespace test } // namespace uirenderer -} // namespace android +} // namespace android
\ No newline at end of file diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp index 371e3d2deda5..019b1e0de4d6 100644 --- a/media/jni/android_media_ImageReader.cpp +++ b/media/jni/android_media_ImageReader.cpp @@ -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); diff --git a/media/mca/filterfw/native/core/gl_env.cpp b/media/mca/filterfw/native/core/gl_env.cpp index 1bb82f88ba48..4637ccdfad15 100644 --- a/media/mca/filterfw/native/core/gl_env.cpp +++ b/media/mca/filterfw/native/core/gl_env.cpp @@ -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; |