From ec8879684012590082b8be3e7e84042e49f220b0 Mon Sep 17 00:00:00 2001 From: Alec Mouri Date: Wed, 29 Jan 2020 13:30:03 -0800 Subject: [PATCH] [libandroid_graphics] Remove last libgui dep Bug: 136263382 Test: builds Test: boots Test: swipe through multiple apps Change-Id: Ifb149ccd4247de2dac36a5165e97a01e38498343 --- core/jni/Android.bp | 4 +- core/jni/android_view_ThreadedRenderer.cpp | 76 ++++++++++++---------- 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/core/jni/Android.bp b/core/jni/Android.bp index d1a7d240dfa2f..653cbc90d88d7 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -234,6 +234,7 @@ cc_library_shared { "libui", "libgraphicsenv", "libgui", + "libmediandk", "libsensor", "libinput", "libcamera_client", @@ -449,9 +450,10 @@ cc_library_static { ], shared_libs: [ "libandroidfw", + "libEGL", + "libmediandk", "libnativedisplay", "libnativewindow", - "libgui", "libpdfium", ], static_libs: [ diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index c13e3e814c11b..27c5a7302ba4f 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -23,10 +23,9 @@ #include #include #include -#include -#include -#include #include +#include +#include #include #include #include @@ -34,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -481,24 +479,35 @@ static jobject android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode( uint32_t width = jwidth; uint32_t height = jheight; - // TODO: should this be generated from an AImageReader? - // Create a Surface wired up to a BufferItemConsumer - sp producer; - sp rawConsumer; - BufferQueue::createBufferQueue(&producer, &rawConsumer); - // We only need 1 buffer but some drivers have bugs so workaround it by setting max count to 2 - rawConsumer->setMaxBufferCount(2); - sp consumer = new BufferItemConsumer(rawConsumer, - GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_NEVER); - consumer->setDefaultBufferSize(width, height); - sp surface = new Surface(producer); + // Create an ImageReader wired up to a BufferItemConsumer + AImageReader* rawReader; + media_status_t result = + AImageReader_newWithUsage(width, height, AIMAGE_FORMAT_RGBA_8888, + AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE, 2, &rawReader); + std::unique_ptr reader(rawReader, + AImageReader_delete); + + if (result != AMEDIA_OK) { + ALOGW("Error creating image reader!"); + return nullptr; + } + + // Note that ownership of this window is maintained by AImageReader, so we + // shouldn't need to wrap around a smart pointer. + ANativeWindow* window; + result = AImageReader_getWindow(rawReader, &window); + + if (result != AMEDIA_OK) { + ALOGW("Error retrieving the native window!"); + return nullptr; + } // Render into the surface { ContextFactory factory; RenderProxy proxy{true, renderNode, &factory}; proxy.setSwapBehavior(SwapBehavior::kSwap_discardBuffer); - proxy.setSurface(surface.get()); + proxy.setSurface(window); // Shadows can't be used via this interface, so just set the light source // to all 0s. proxy.setLightAlpha(0, 0); @@ -510,33 +519,34 @@ static jobject android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode( proxy.syncAndDrawFrame(); } - // Yank out the GraphicBuffer - BufferItem bufferItem; - status_t err; - if ((err = consumer->acquireBuffer(&bufferItem, 0, true)) != OK) { - ALOGW("Failed to acquireBuffer, error %d (%s)", err, strerror(-err)); + AImage* rawImage; + result = AImageReader_acquireNextImage(rawReader, &rawImage); + std::unique_ptr image(rawImage, AImage_delete); + if (result != AMEDIA_OK) { + ALOGW("Error reading image: %d!", result); return nullptr; } - sp buffer = bufferItem.mGraphicBuffer; - // We don't really care if this fails or not since we're just going to destroy this anyway - consumer->releaseBuffer(bufferItem); - if (!buffer.get()) { - ALOGW("GraphicBuffer is null?"); - return nullptr; - } - if (buffer->getWidth() != width || buffer->getHeight() != height) { - ALOGW("GraphicBuffer size mismatch, got %dx%d expected %dx%d", - buffer->getWidth(), buffer->getHeight(), width, height); + + AHardwareBuffer* buffer; + result = AImage_getHardwareBuffer(rawImage, &buffer); + + AHardwareBuffer_Desc desc; + AHardwareBuffer_describe(buffer, &desc); + + if (desc.width != width || desc.height != height) { + ALOGW("AHardwareBuffer size mismatch, got %dx%d expected %dx%d", desc.width, desc.height, + width, height); // Continue I guess? } - sk_sp cs = uirenderer::DataSpaceToColorSpace(bufferItem.mDataSpace); + sk_sp cs = uirenderer::DataSpaceToColorSpace( + static_cast(ANativeWindow_getBuffersDataSpace(window))); if (cs == nullptr) { // nullptr is treated as SRGB in Skia, thus explicitly use SRGB in order to make sure // the returned bitmap has a color space. cs = SkColorSpace::MakeSRGB(); } - sk_sp bitmap = Bitmap::createFrom(buffer->toAHardwareBuffer(), cs); + sk_sp bitmap = Bitmap::createFrom(buffer, cs); return bitmap::createBitmap(env, bitmap.release(), android::bitmap::kBitmapCreateFlag_Premultiplied); }