Loading core/jni/android_media_ImageReader.cpp +6 −17 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -49,6 +50,7 @@ #include <utils/Trace.h> #include <utils/misc.h> #include <cstdint> #include <cstdio> #include "android_media_Utils.h" Loading Loading @@ -435,19 +437,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", Loading @@ -456,11 +449,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); Loading libs/hostgraphics/include/gui/BufferItemConsumer.h +21 −0 Original line number Diff line number Diff line Loading @@ -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) {} Loading libs/hwui/tests/common/TestContext.cpp +3 −14 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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() { Loading Loading
core/jni/android_media_ImageReader.cpp +6 −17 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -49,6 +50,7 @@ #include <utils/Trace.h> #include <utils/misc.h> #include <cstdint> #include <cstdio> #include "android_media_Utils.h" Loading Loading @@ -435,19 +437,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", Loading @@ -456,11 +449,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); Loading
libs/hostgraphics/include/gui/BufferItemConsumer.h +21 −0 Original line number Diff line number Diff line Loading @@ -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) {} Loading
libs/hwui/tests/common/TestContext.cpp +3 −14 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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() { Loading