diff options
author | Mathias Agopian <mathias@google.com> | 2017-06-09 19:02:45 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-06-09 19:02:46 +0000 |
commit | 2563c0f3b0aa07309d42c0d739880884b8131080 (patch) | |
tree | cd945fb68be1a5571bf2577e6315328b645520a1 | |
parent | aaef0983baf38bd59b4129dd37e4cd21b73d92ad (diff) | |
parent | 3a11413a2584cf9a51e4315bef27546f602578fb (diff) | |
download | native-2563c0f3b0aa07309d42c0d739880884b8131080.tar.gz |
Merge "Add missing VNDK pixel formats to AHardwareBuffer" into oc-dev
-rw-r--r-- | libs/nativewindow/AHardwareBuffer.cpp | 113 | ||||
-rw-r--r-- | libs/nativewindow/include/private/android/AHardwareBufferHelpers.h | 12 | ||||
-rw-r--r-- | libs/nativewindow/include/vndk/hardware_buffer.h | 43 |
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 */ |