summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alec Mouri <alecmouri@google.com> 2020-02-15 06:06:49 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-02-15 06:06:49 +0000
commitb4caaafe01db1dd2d48e1c8497b6b58b83ec886e (patch)
tree8c7d23ec34563f2801ca10d7560d47e30275f78b
parent348ec3c12fc10eb0e504a9bec12aa0754a7ed6be (diff)
parentec8879684012590082b8be3e7e84042e49f220b0 (diff)
Merge "[libandroid_graphics] Remove last libgui dep"
-rw-r--r--core/jni/Android.bp4
-rw-r--r--core/jni/android_view_ThreadedRenderer.cpp76
2 files changed, 46 insertions, 34 deletions
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index d1a7d240dfa2..653cbc90d88d 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 c13e3e814c11..27c5a7302ba4 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -23,10 +23,9 @@
#include <Properties.h>
#include <RootRenderNode.h>
#include <dlfcn.h>
-#include <gui/BufferItemConsumer.h>
-#include <gui/BufferQueue.h>
-#include <gui/Surface.h>
#include <inttypes.h>
+#include <media/NdkImage.h>
+#include <media/NdkImageReader.h>
#include <nativehelper/JNIHelp.h>
#include <pipeline/skia/ShaderCache.h>
#include <private/EGL/cache.h>
@@ -34,7 +33,6 @@
#include <renderthread/RenderProxy.h>
#include <renderthread/RenderTask.h>
#include <renderthread/RenderThread.h>
-#include <system/window.h>
#include <utils/Color.h>
#include <utils/RefBase.h>
#include <utils/StrongPointer.h>
@@ -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<IGraphicBufferProducer> producer;
- sp<IGraphicBufferConsumer> 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<BufferItemConsumer> consumer = new BufferItemConsumer(rawConsumer,
- GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_NEVER);
- consumer->setDefaultBufferSize(width, height);
- sp<Surface> 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<AImageReader, decltype(&AImageReader_delete)> 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));
- return nullptr;
- }
- sp<GraphicBuffer> 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?");
+ AImage* rawImage;
+ result = AImageReader_acquireNextImage(rawReader, &rawImage);
+ std::unique_ptr<AImage, decltype(&AImage_delete)> image(rawImage, AImage_delete);
+ if (result != AMEDIA_OK) {
+ ALOGW("Error reading image: %d!", result);
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<SkColorSpace> cs = uirenderer::DataSpaceToColorSpace(bufferItem.mDataSpace);
+ sk_sp<SkColorSpace> cs = uirenderer::DataSpaceToColorSpace(
+ static_cast<android_dataspace>(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 = Bitmap::createFrom(buffer->toAHardwareBuffer(), cs);
+ sk_sp<Bitmap> bitmap = Bitmap::createFrom(buffer, cs);
return bitmap::createBitmap(env, bitmap.release(),
android::bitmap::kBitmapCreateFlag_Premultiplied);
}