Move GraphicBuffer back into libandroid_runtime.
Update Bitmap to store AHardwareBuffer instead of GraphicBuffer and
begin removing references to GraphicBuffer from the graphics JNI code
Test: CtsUiRenderingTestCases
Bug: 137655431
Change-Id: If533b6d87a87ae7e94a9b6f16fc52043714087df
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index 0d837f2..ae90f11 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -88,6 +88,7 @@
"libvulkan",
"libui",
"libgui",
+ "libnativewindow",
"libprotobuf-cpp-lite",
"libft2",
"libandroidfw",
diff --git a/libs/hwui/HardwareBitmapUploader.cpp b/libs/hwui/HardwareBitmapUploader.cpp
index 9bb6031..40bff88 100644
--- a/libs/hwui/HardwareBitmapUploader.cpp
+++ b/libs/hwui/HardwareBitmapUploader.cpp
@@ -403,8 +403,9 @@
if (!sUploader->uploadHardwareBitmap(bitmap, format, buffer)) {
return nullptr;
}
- return Bitmap::createFrom(buffer, bitmap.colorType(), bitmap.refColorSpace(),
- bitmap.alphaType(), Bitmap::computePalette(bitmap));
+ return Bitmap::createFrom(buffer->toAHardwareBuffer(), bitmap.colorType(),
+ bitmap.refColorSpace(), bitmap.alphaType(),
+ Bitmap::computePalette(bitmap));
}
void HardwareBitmapUploader::initialize() {
diff --git a/libs/hwui/hwui/Bitmap.cpp b/libs/hwui/hwui/Bitmap.cpp
index 4c2f0ad..a1be5b7 100644
--- a/libs/hwui/hwui/Bitmap.cpp
+++ b/libs/hwui/hwui/Bitmap.cpp
@@ -148,12 +148,26 @@
#ifdef __ANDROID__ // Layoutlib does not support hardware acceleration
-sk_sp<Bitmap> Bitmap::createFrom(sp<GraphicBuffer> graphicBuffer, SkColorType colorType,
+sk_sp<Bitmap> Bitmap::createFrom(AHardwareBuffer* hardwareBuffer, sk_sp<SkColorSpace> colorSpace,
+ BitmapPalette palette) {
+ AHardwareBuffer_Desc bufferDesc;
+ AHardwareBuffer_describe(hardwareBuffer, &bufferDesc);
+ SkImageInfo info = uirenderer::BufferDescriptionToImageInfo(bufferDesc, colorSpace);
+
+ const size_t rowBytes = info.bytesPerPixel() * bufferDesc.stride;
+ return sk_sp<Bitmap>(new Bitmap(hardwareBuffer, info, rowBytes, palette));
+}
+
+sk_sp<Bitmap> Bitmap::createFrom(AHardwareBuffer* hardwareBuffer, SkColorType colorType,
sk_sp<SkColorSpace> colorSpace, SkAlphaType alphaType,
BitmapPalette palette) {
- SkImageInfo info = SkImageInfo::Make(graphicBuffer->getWidth(), graphicBuffer->getHeight(),
+ AHardwareBuffer_Desc bufferDesc;
+ AHardwareBuffer_describe(hardwareBuffer, &bufferDesc);
+ SkImageInfo info = SkImageInfo::Make(bufferDesc.width, bufferDesc.height,
colorType, alphaType, colorSpace);
- return sk_sp<Bitmap>(new Bitmap(graphicBuffer.get(), info, palette));
+
+ const size_t rowBytes = info.bytesPerPixel() * bufferDesc.stride;
+ return sk_sp<Bitmap>(new Bitmap(hardwareBuffer, info, rowBytes, palette));
}
#endif
@@ -238,18 +252,17 @@
}
#ifdef __ANDROID__ // Layoutlib does not support hardware acceleration
-Bitmap::Bitmap(GraphicBuffer* buffer, const SkImageInfo& info, BitmapPalette palette)
- : SkPixelRef(info.width(), info.height(), nullptr,
- bytesPerPixel(buffer->getPixelFormat()) * buffer->getStride())
+Bitmap::Bitmap(AHardwareBuffer* buffer, const SkImageInfo& info, size_t rowBytes,
+ BitmapPalette palette)
+ : SkPixelRef(info.width(), info.height(), nullptr, rowBytes)
, mInfo(validateAlpha(info))
, mPixelStorageType(PixelStorageType::Hardware)
, mPalette(palette)
, mPaletteGenerationId(getGenerationID()) {
mPixelStorage.hardware.buffer = buffer;
- buffer->incStrong(buffer);
+ AHardwareBuffer_acquire(buffer);
setImmutable(); // HW bitmaps are always immutable
- mImage = SkImage::MakeFromAHardwareBuffer(reinterpret_cast<AHardwareBuffer*>(buffer),
- mInfo.alphaType(), mInfo.refColorSpace());
+ mImage = SkImage::MakeFromAHardwareBuffer(buffer, mInfo.alphaType(), mInfo.refColorSpace());
}
#endif
@@ -274,7 +287,7 @@
case PixelStorageType::Hardware:
#ifdef __ANDROID__ // Layoutlib does not support hardware acceleration
auto buffer = mPixelStorage.hardware.buffer;
- buffer->decStrong(buffer);
+ AHardwareBuffer_release(buffer);
mPixelStorage.hardware.buffer = nullptr;
#endif
break;
@@ -352,7 +365,7 @@
}
#ifdef __ANDROID__ // Layoutlib does not support hardware acceleration
-GraphicBuffer* Bitmap::graphicBuffer() {
+AHardwareBuffer* Bitmap::hardwareBuffer() {
if (isHardware()) {
return mPixelStorage.hardware.buffer;
}
diff --git a/libs/hwui/hwui/Bitmap.h b/libs/hwui/hwui/Bitmap.h
index c7e18d1..00733c6 100644
--- a/libs/hwui/hwui/Bitmap.h
+++ b/libs/hwui/hwui/Bitmap.h
@@ -24,7 +24,7 @@
#include <SkPixelRef.h>
#include <cutils/compiler.h>
#ifdef __ANDROID__ // Layoutlib does not support hardware acceleration
-#include <ui/GraphicBuffer.h>
+#include <android/hardware_buffer.h>
#endif
namespace android {
@@ -74,11 +74,15 @@
* memory that is provided as an input param.
*/
#ifdef __ANDROID__ // Layoutlib does not support hardware acceleration
- static sk_sp<Bitmap> createFrom(sp<GraphicBuffer> graphicBuffer,
+ static sk_sp<Bitmap> createFrom(AHardwareBuffer* hardwareBuffer,
+ sk_sp<SkColorSpace> colorSpace,
+ BitmapPalette palette = BitmapPalette::Unknown);
+
+ static sk_sp<Bitmap> createFrom(AHardwareBuffer* hardwareBuffer,
SkColorType colorType,
sk_sp<SkColorSpace> colorSpace,
- SkAlphaType alphaType = kPremul_SkAlphaType,
- BitmapPalette palette = BitmapPalette::Unknown);
+ SkAlphaType alphaType,
+ BitmapPalette palette);
#endif
static sk_sp<Bitmap> createFrom(const SkImageInfo& info, size_t rowBytes, int fd, void* addr,
size_t size, bool readOnly);
@@ -110,7 +114,7 @@
PixelStorageType pixelStorageType() const { return mPixelStorageType; }
#ifdef __ANDROID__ // Layoutlib does not support hardware acceleration
- GraphicBuffer* graphicBuffer();
+ AHardwareBuffer* hardwareBuffer();
#endif
/**
@@ -143,7 +147,8 @@
size_t rowBytes);
Bitmap(void* address, int fd, size_t mappedSize, const SkImageInfo& info, size_t rowBytes);
#ifdef __ANDROID__ // Layoutlib does not support hardware acceleration
- Bitmap(GraphicBuffer* buffer, const SkImageInfo& info, BitmapPalette palette);
+ Bitmap(AHardwareBuffer* buffer, const SkImageInfo& info, size_t rowBytes,
+ BitmapPalette palette);
#endif
virtual ~Bitmap();
@@ -175,7 +180,7 @@
} heap;
#ifdef __ANDROID__ // Layoutlib does not support hardware acceleration
struct {
- GraphicBuffer* buffer;
+ AHardwareBuffer* buffer;
} hardware;
#endif
} mPixelStorage;
diff --git a/libs/hwui/renderthread/VulkanSurface.h b/libs/hwui/renderthread/VulkanSurface.h
index 5717bb3..bd23626 100644
--- a/libs/hwui/renderthread/VulkanSurface.h
+++ b/libs/hwui/renderthread/VulkanSurface.h
@@ -18,6 +18,7 @@
#include <system/graphics.h>
#include <system/window.h>
#include <ui/BufferQueueDefs.h>
+#include <ui/PixelFormat.h>
#include <vulkan/vulkan.h>
#include <SkRefCnt.h>
diff --git a/libs/hwui/tests/common/scenes/HwBitmapInCompositeShader.cpp b/libs/hwui/tests/common/scenes/HwBitmapInCompositeShader.cpp
index 3d0a2b2..5886ea3 100644
--- a/libs/hwui/tests/common/scenes/HwBitmapInCompositeShader.cpp
+++ b/libs/hwui/tests/common/scenes/HwBitmapInCompositeShader.cpp
@@ -50,7 +50,7 @@
pixels[4000 + 4 * i + 3] = 255;
}
buffer->unlock();
- sk_sp<Bitmap> hardwareBitmap(Bitmap::createFrom(buffer, kRGBA_8888_SkColorType,
+ sk_sp<Bitmap> hardwareBitmap(Bitmap::createFrom(buffer->toAHardwareBuffer(),
SkColorSpace::MakeSRGB()));
sk_sp<SkShader> hardwareShader(createBitmapShader(*hardwareBitmap));
diff --git a/libs/hwui/utils/Color.cpp b/libs/hwui/utils/Color.cpp
index cc7725b..9a27f28 100644
--- a/libs/hwui/utils/Color.cpp
+++ b/libs/hwui/utils/Color.cpp
@@ -19,12 +19,50 @@
#include <utils/Log.h>
#include <ui/ColorSpace.h>
+#ifdef __ANDROID__ // Layoutlib does not support hardware buffers or native windows
+#include <android/hardware_buffer.h>
+#endif
+
#include <algorithm>
#include <cmath>
namespace android {
namespace uirenderer {
+#ifdef __ANDROID__ // Layoutlib does not support hardware buffers or native windows
+SkImageInfo BufferDescriptionToImageInfo(const AHardwareBuffer_Desc& bufferDesc,
+ sk_sp<SkColorSpace> colorSpace) {
+ SkColorType colorType = kUnknown_SkColorType;
+ SkAlphaType alphaType = kOpaque_SkAlphaType;
+ switch (bufferDesc.format) {
+ case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
+ colorType = kN32_SkColorType;
+ alphaType = kPremul_SkAlphaType;
+ break;
+ case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
+ colorType = kN32_SkColorType;
+ alphaType = kOpaque_SkAlphaType;
+ break;
+ case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
+ colorType = kRGB_565_SkColorType;
+ alphaType = kOpaque_SkAlphaType;
+ break;
+ case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
+ colorType = kRGBA_1010102_SkColorType;
+ alphaType = kPremul_SkAlphaType;
+ break;
+ case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
+ colorType = kRGBA_F16_SkColorType;
+ alphaType = kPremul_SkAlphaType;
+ break;
+ default:
+ ALOGV("Unsupported format: %d, return unknown by default", bufferDesc.format);
+ break;
+ }
+ return SkImageInfo::Make(bufferDesc.width, bufferDesc.height, colorType, alphaType, colorSpace);
+}
+#endif
+
android::PixelFormat ColorTypeToPixelFormat(SkColorType colorType) {
switch (colorType) {
case kRGBA_8888_SkColorType:
diff --git a/libs/hwui/utils/Color.h b/libs/hwui/utils/Color.h
index 79400de..7c2378a 100644
--- a/libs/hwui/utils/Color.h
+++ b/libs/hwui/utils/Color.h
@@ -25,6 +25,8 @@
#include <SkColorSpace.h>
#include <SkImageInfo.h>
+struct AHardwareBuffer_Desc;
+
namespace android {
namespace uirenderer {
namespace Color {
@@ -89,6 +91,9 @@
return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f);
}
+SkImageInfo BufferDescriptionToImageInfo(const AHardwareBuffer_Desc& bufferDesc,
+ sk_sp<SkColorSpace> colorSpace);
+
android::PixelFormat ColorTypeToPixelFormat(SkColorType colorType);
ANDROID_API SkColorType PixelFormatToColorType(android::PixelFormat format);