summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2017-06-09 19:02:45 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2017-06-09 19:02:46 +0000
commit2563c0f3b0aa07309d42c0d739880884b8131080 (patch)
treecd945fb68be1a5571bf2577e6315328b645520a1
parentaaef0983baf38bd59b4129dd37e4cd21b73d92ad (diff)
parent3a11413a2584cf9a51e4315bef27546f602578fb (diff)
downloadnative-2563c0f3b0aa07309d42c0d739880884b8131080.tar.gz
Merge "Add missing VNDK pixel formats to AHardwareBuffer" into oc-dev
-rw-r--r--libs/nativewindow/AHardwareBuffer.cpp113
-rw-r--r--libs/nativewindow/include/private/android/AHardwareBufferHelpers.h12
-rw-r--r--libs/nativewindow/include/vndk/hardware_buffer.h43
3 files changed, 142 insertions, 26 deletions
diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp
index 2f4b996c75..ed292e7bae 100644
--- a/libs/nativewindow/AHardwareBuffer.cpp
+++ b/libs/nativewindow/AHardwareBuffer.cpp
@@ -44,12 +44,12 @@ int AHardwareBuffer_allocate(const AHardwareBuffer_Desc* desc, AHardwareBuffer**
if (!outBuffer || !desc)
return BAD_VALUE;
- int format = AHardwareBuffer_convertToPixelFormat(desc->format);
- if (format == 0) {
- ALOGE("Invalid pixel format %u", desc->format);
+ if (!AHardwareBuffer_isValidPixelFormat(desc->format)) {
+ ALOGE("Invalid AHardwareBuffer pixel format %u (%#x))", desc->format, desc->format);
return BAD_VALUE;
}
+ int format = AHardwareBuffer_convertToPixelFormat(desc->format);
if (desc->rfu0 != 0 || desc->rfu1 != 0) {
ALOGE("AHardwareBuffer_Desc::rfu fields must be 0");
return BAD_VALUE;
@@ -296,32 +296,95 @@ static inline bool containsBits(uint64_t mask, uint64_t bitsToCheck) {
return (mask & bitsToCheck) == bitsToCheck && bitsToCheck;
}
-uint32_t AHardwareBuffer_convertFromPixelFormat(uint32_t format) {
+bool AHardwareBuffer_isValidPixelFormat(uint32_t format) {
+ static_assert(HAL_PIXEL_FORMAT_RGBA_8888 == AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_RGBX_8888 == AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_RGB_565 == AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_RGB_888 == AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_RGBA_FP16 == AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_RGBA_1010102 == AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_BLOB == AHARDWAREBUFFER_FORMAT_BLOB,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_BGRA_8888 == AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_YV12 == AHARDWAREBUFFER_FORMAT_YV12,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_Y8 == AHARDWAREBUFFER_FORMAT_Y8,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_Y16 == AHARDWAREBUFFER_FORMAT_Y16,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_RAW16 == AHARDWAREBUFFER_FORMAT_RAW16,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_RAW10 == AHARDWAREBUFFER_FORMAT_RAW10,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_RAW12 == AHARDWAREBUFFER_FORMAT_RAW12,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_RAW_OPAQUE == AHARDWAREBUFFER_FORMAT_RAW_OPAQUE,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED == AHARDWAREBUFFER_FORMAT_IMPLEMENTATION_DEFINED,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_YCBCR_420_888 == AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_YCBCR_422_888 == AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_422,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_YCBCR_444_888 == AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_444,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_FLEX_RGB_888 == AHARDWAREBUFFER_FORMAT_FLEX_R8G8B8,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_FLEX_RGBA_8888 == AHARDWAREBUFFER_FORMAT_FLEX_R8G8B8A8,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_YCBCR_422_SP == AHARDWAREBUFFER_FORMAT_YCbCr_422_SP,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_YCRCB_420_SP == AHARDWAREBUFFER_FORMAT_YCrCb_420_SP,
+ "HAL and AHardwareBuffer pixel format don't match");
+ static_assert(HAL_PIXEL_FORMAT_YCBCR_422_I == AHARDWAREBUFFER_FORMAT_YCbCr_422_I,
+ "HAL and AHardwareBuffer pixel format don't match");
+
switch (format) {
- case HAL_PIXEL_FORMAT_RGBA_8888: return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
- case HAL_PIXEL_FORMAT_RGBX_8888: return AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM;
- case HAL_PIXEL_FORMAT_RGB_565: return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM;
- case HAL_PIXEL_FORMAT_RGB_888: return AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM;
- case HAL_PIXEL_FORMAT_RGBA_FP16: return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT;
- case HAL_PIXEL_FORMAT_RGBA_1010102: return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM;
- case HAL_PIXEL_FORMAT_BLOB: return AHARDWAREBUFFER_FORMAT_BLOB;
- default:ALOGE("Unknown pixel format %u", format);
- return 0;
+ case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
+ case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM:
+ case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
+ case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
+ case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
+ case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
+ case AHARDWAREBUFFER_FORMAT_BLOB:
+ // VNDK formats only -- unfortunately we can't differentiate from where we're called
+ case AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM:
+ case AHARDWAREBUFFER_FORMAT_YV12:
+ case AHARDWAREBUFFER_FORMAT_Y8:
+ case AHARDWAREBUFFER_FORMAT_Y16:
+ case AHARDWAREBUFFER_FORMAT_RAW16:
+ case AHARDWAREBUFFER_FORMAT_RAW10:
+ case AHARDWAREBUFFER_FORMAT_RAW12:
+ case AHARDWAREBUFFER_FORMAT_RAW_OPAQUE:
+ case AHARDWAREBUFFER_FORMAT_IMPLEMENTATION_DEFINED:
+ case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420:
+ case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_422:
+ case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_444:
+ case AHARDWAREBUFFER_FORMAT_FLEX_R8G8B8:
+ case AHARDWAREBUFFER_FORMAT_FLEX_R8G8B8A8:
+ case AHARDWAREBUFFER_FORMAT_YCbCr_422_SP:
+ case AHARDWAREBUFFER_FORMAT_YCrCb_420_SP:
+ case AHARDWAREBUFFER_FORMAT_YCbCr_422_I:
+ return true;
+
+ default:
+ return false;
}
}
-uint32_t AHardwareBuffer_convertToPixelFormat(uint32_t format) {
- switch (format) {
- case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM: return HAL_PIXEL_FORMAT_RGBA_8888;
- case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM: return HAL_PIXEL_FORMAT_RGBX_8888;
- case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM: return HAL_PIXEL_FORMAT_RGB_565;
- case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM: return HAL_PIXEL_FORMAT_RGB_888;
- case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT: return HAL_PIXEL_FORMAT_RGBA_FP16;
- case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM: return HAL_PIXEL_FORMAT_RGBA_1010102;
- case AHARDWAREBUFFER_FORMAT_BLOB: return HAL_PIXEL_FORMAT_BLOB;
- default:ALOGE("Unknown AHardwareBuffer format %u", format);
- return 0;
- }
+uint32_t AHardwareBuffer_convertFromPixelFormat(uint32_t hal_format) {
+ return hal_format;
+}
+
+uint32_t AHardwareBuffer_convertToPixelFormat(uint32_t ahardwarebuffer_format) {
+ return ahardwarebuffer_format;
}
uint64_t AHardwareBuffer_convertToGrallocUsageBits(uint64_t usage) {
diff --git a/libs/nativewindow/include/private/android/AHardwareBufferHelpers.h b/libs/nativewindow/include/private/android/AHardwareBufferHelpers.h
index ed6b1695ae..71f563467d 100644
--- a/libs/nativewindow/include/private/android/AHardwareBufferHelpers.h
+++ b/libs/nativewindow/include/private/android/AHardwareBufferHelpers.h
@@ -32,11 +32,21 @@ struct ANativeWindowBuffer;
namespace android {
+// whether this AHardwareBuffer format is valid
+bool AHardwareBuffer_isValidPixelFormat(uint32_t ahardwarebuffer_format);
+
+// convert AHardwareBuffer format to HAL format (note: this is a no-op)
uint32_t AHardwareBuffer_convertFromPixelFormat(uint32_t format);
+
+// convert HAL format to AHardwareBuffer format (note: this is a no-op)
uint32_t AHardwareBuffer_convertToPixelFormat(uint32_t format);
-uint64_t AHardwareBuffer_convertToGrallocUsageBits(uint64_t usage);
+
+// convert AHardwareBuffer usage bits to HAL usage bits (note: this is a no-op)
uint64_t AHardwareBuffer_convertFromGrallocUsageBits(uint64_t usage);
+// convert HAL usage bits to AHardwareBuffer usage bits (note: this is a no-op)
+uint64_t AHardwareBuffer_convertToGrallocUsageBits(uint64_t usage);
+
class GraphicBuffer;
const GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(const AHardwareBuffer* buffer);
GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(AHardwareBuffer* buffer);
diff --git a/libs/nativewindow/include/vndk/hardware_buffer.h b/libs/nativewindow/include/vndk/hardware_buffer.h
index dc2dcbe327..802edcc17d 100644
--- a/libs/nativewindow/include/vndk/hardware_buffer.h
+++ b/libs/nativewindow/include/vndk/hardware_buffer.h
@@ -26,6 +26,49 @@ __BEGIN_DECLS
const native_handle_t* AHardwareBuffer_getNativeHandle(const AHardwareBuffer* buffer);
+
+/**
+ * Buffer pixel formats.
+ */
+enum {
+ /* for future proofing, keep these in sync with system/graphics-base.h */
+
+ /* same as HAL_PIXEL_FORMAT_BGRA_8888 */
+ AHARDWAREBUFFER_FORMAT_B8G8R8A8_UNORM = 5,
+ /* same as HAL_PIXEL_FORMAT_YV12 */
+ AHARDWAREBUFFER_FORMAT_YV12 = 0x32315659,
+ /* same as HAL_PIXEL_FORMAT_Y8 */
+ AHARDWAREBUFFER_FORMAT_Y8 = 0x20203859,
+ /* same as HAL_PIXEL_FORMAT_Y16 */
+ AHARDWAREBUFFER_FORMAT_Y16 = 0x20363159,
+ /* same as HAL_PIXEL_FORMAT_RAW16 */
+ AHARDWAREBUFFER_FORMAT_RAW16 = 0x20,
+ /* same as HAL_PIXEL_FORMAT_RAW10 */
+ AHARDWAREBUFFER_FORMAT_RAW10 = 0x25,
+ /* same as HAL_PIXEL_FORMAT_RAW12 */
+ AHARDWAREBUFFER_FORMAT_RAW12 = 0x26,
+ /* same as HAL_PIXEL_FORMAT_RAW_OPAQUE */
+ AHARDWAREBUFFER_FORMAT_RAW_OPAQUE = 0x24,
+ /* same as HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED */
+ AHARDWAREBUFFER_FORMAT_IMPLEMENTATION_DEFINED = 0x22,
+ /* same as HAL_PIXEL_FORMAT_YCBCR_420_888 */
+ AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420 = 0x23,
+ /* same as HAL_PIXEL_FORMAT_YCBCR_422_888 */
+ AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_422 = 0x27,
+ /* same as HAL_PIXEL_FORMAT_YCBCR_444_888 */
+ AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_444 = 0x28,
+ /* same as HAL_PIXEL_FORMAT_FLEX_RGB_888 */
+ AHARDWAREBUFFER_FORMAT_FLEX_R8G8B8 = 0x29,
+ /* same as HAL_PIXEL_FORMAT_FLEX_RGBA_8888 */
+ AHARDWAREBUFFER_FORMAT_FLEX_R8G8B8A8 = 0x2A,
+ /* same as HAL_PIXEL_FORMAT_YCBCR_422_SP */
+ AHARDWAREBUFFER_FORMAT_YCbCr_422_SP = 0x10,
+ /* same as HAL_PIXEL_FORMAT_YCRCB_420_SP */
+ AHARDWAREBUFFER_FORMAT_YCrCb_420_SP = 0x11,
+ /* same as HAL_PIXEL_FORMAT_YCBCR_422_I */
+ AHARDWAREBUFFER_FORMAT_YCbCr_422_I = 0x14,
+};
+
__END_DECLS
#endif /* ANDROID_VNDK_NATIVEWINDOW_AHARDWAREBUFFER_H */