diff options
Diffstat (limited to 'libs/nativewindow/AHardwareBuffer.cpp')
-rw-r--r-- | libs/nativewindow/AHardwareBuffer.cpp | 225 |
1 files changed, 81 insertions, 144 deletions
diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp index 80607055ed..e7b2195056 100644 --- a/libs/nativewindow/AHardwareBuffer.cpp +++ b/libs/nativewindow/AHardwareBuffer.cpp @@ -40,6 +40,80 @@ static constexpr int kFdBufferSize = 128 * sizeof(int); // 128 ints using namespace android; // ---------------------------------------------------------------------------- +// Validate hardware_buffer.h and PixelFormat.aidl agree +// ---------------------------------------------------------------------------- + +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_DEPTH_16 == AHARDWAREBUFFER_FORMAT_D16_UNORM, + "HAL and AHardwareBuffer pixel format don't match"); +static_assert(HAL_PIXEL_FORMAT_DEPTH_24 == AHARDWAREBUFFER_FORMAT_D24_UNORM, + "HAL and AHardwareBuffer pixel format don't match"); +static_assert(HAL_PIXEL_FORMAT_DEPTH_24_STENCIL_8 == AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT, + "HAL and AHardwareBuffer pixel format don't match"); +static_assert(HAL_PIXEL_FORMAT_DEPTH_32F == AHARDWAREBUFFER_FORMAT_D32_FLOAT, + "HAL and AHardwareBuffer pixel format don't match"); +static_assert(HAL_PIXEL_FORMAT_DEPTH_32F_STENCIL_8 == AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT, + "HAL and AHardwareBuffer pixel format don't match"); +static_assert(HAL_PIXEL_FORMAT_STENCIL_8 == AHARDWAREBUFFER_FORMAT_S8_UINT, + "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_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"); +static_assert(HAL_PIXEL_FORMAT_YCBCR_P010 == AHARDWAREBUFFER_FORMAT_YCbCr_P010, + "HAL and AHardwareBuffer pixel format don't match"); +static_assert(static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::R_8) == + AHARDWAREBUFFER_FORMAT_R8_UNORM, + "HAL and AHardwareBuffer pixel format don't match"); +static_assert(static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::R_16_UINT) == + AHARDWAREBUFFER_FORMAT_R16_UINT, + "HAL and AHardwareBuffer pixel format don't match"); +static_assert( + static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::RG_1616_UINT) == + AHARDWAREBUFFER_FORMAT_R16G16_UINT, + "HAL and AHardwareBuffer pixel format don't match"); +static_assert( + static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::RGBA_10101010) == + AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM, + "HAL and AHardwareBuffer pixel format don't match"); + +// ---------------------------------------------------------------------------- // Public functions // ---------------------------------------------------------------------------- @@ -227,11 +301,14 @@ int AHardwareBuffer_lockPlanes(AHardwareBuffer* buffer, uint64_t usage, } return result; } else { - const uint32_t pixelStride = AHardwareBuffer_bytesPerPixel(format); + int32_t bytesPerPixel; + int32_t bytesPerStride; + int result = gBuffer->lockAsync(usage, usage, bounds, &outPlanes->planes[0].data, fence, + &bytesPerPixel, &bytesPerStride); outPlanes->planeCount = 1; - outPlanes->planes[0].pixelStride = pixelStride; - outPlanes->planes[0].rowStride = gBuffer->getStride() * pixelStride; - return gBuffer->lockAsync(usage, usage, bounds, &outPlanes->planes[0].data, fence); + outPlanes->planes[0].pixelStride = bytesPerPixel; + outPlanes->planes[0].rowStride = bytesPerStride; + return result; } } @@ -487,12 +564,6 @@ bool AHardwareBuffer_isValidDescription(const AHardwareBuffer_Desc* desc, bool l return false; } - if (!AHardwareBuffer_isValidPixelFormat(desc->format)) { - ALOGE_IF(log, "Invalid AHardwareBuffer pixel format %u (%#x))", - desc->format, desc->format); - return false; - } - if (desc->rfu0 != 0 || desc->rfu1 != 0) { ALOGE_IF(log, "AHardwareBuffer_Desc::rfu fields must be 0"); return false; @@ -557,114 +628,6 @@ bool AHardwareBuffer_isValidDescription(const AHardwareBuffer_Desc* desc, bool l return true; } -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_DEPTH_16 == AHARDWAREBUFFER_FORMAT_D16_UNORM, - "HAL and AHardwareBuffer pixel format don't match"); - static_assert(HAL_PIXEL_FORMAT_DEPTH_24 == AHARDWAREBUFFER_FORMAT_D24_UNORM, - "HAL and AHardwareBuffer pixel format don't match"); - static_assert(HAL_PIXEL_FORMAT_DEPTH_24_STENCIL_8 == AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT, - "HAL and AHardwareBuffer pixel format don't match"); - static_assert(HAL_PIXEL_FORMAT_DEPTH_32F == AHARDWAREBUFFER_FORMAT_D32_FLOAT, - "HAL and AHardwareBuffer pixel format don't match"); - static_assert(HAL_PIXEL_FORMAT_DEPTH_32F_STENCIL_8 == AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT, - "HAL and AHardwareBuffer pixel format don't match"); - static_assert(HAL_PIXEL_FORMAT_STENCIL_8 == AHARDWAREBUFFER_FORMAT_S8_UINT, - "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_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"); - static_assert(HAL_PIXEL_FORMAT_YCBCR_P010 == AHARDWAREBUFFER_FORMAT_YCbCr_P010, - "HAL and AHardwareBuffer pixel format don't match"); - static_assert(static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::R_8) == - AHARDWAREBUFFER_FORMAT_R8_UNORM, - "HAL and AHardwareBuffer pixel format don't match"); - static_assert(static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::R_16_UINT) == - AHARDWAREBUFFER_FORMAT_R16_UINT, - "HAL and AHardwareBuffer pixel format don't match"); - static_assert(static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::RG_1616_UINT) == - AHARDWAREBUFFER_FORMAT_R16G16_UINT, - "HAL and AHardwareBuffer pixel format don't match"); - static_assert(static_cast<int>(aidl::android::hardware::graphics::common::PixelFormat::RGBA_10101010) == - AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM, - "HAL and AHardwareBuffer pixel format don't match"); - - switch (format) { - case AHARDWAREBUFFER_FORMAT_R8_UNORM: - case AHARDWAREBUFFER_FORMAT_R16_UINT: - case AHARDWAREBUFFER_FORMAT_R16G16_UINT: - 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_R10G10B10A10_UNORM: - case AHARDWAREBUFFER_FORMAT_BLOB: - case AHARDWAREBUFFER_FORMAT_D16_UNORM: - case AHARDWAREBUFFER_FORMAT_D24_UNORM: - case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT: - case AHARDWAREBUFFER_FORMAT_D32_FLOAT: - case AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT: - case AHARDWAREBUFFER_FORMAT_S8_UINT: - case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420: - // 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_YCbCr_422_SP: - case AHARDWAREBUFFER_FORMAT_YCrCb_420_SP: - case AHARDWAREBUFFER_FORMAT_YCbCr_422_I: - case AHARDWAREBUFFER_FORMAT_YCbCr_P010: - return true; - - default: - return false; - } -} - bool AHardwareBuffer_formatIsYuv(uint32_t format) { switch (format) { case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420: @@ -681,32 +644,6 @@ bool AHardwareBuffer_formatIsYuv(uint32_t format) { } } -uint32_t AHardwareBuffer_bytesPerPixel(uint32_t format) { - switch (format) { - case AHARDWAREBUFFER_FORMAT_R8_UNORM: - return 1; - case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM: - case AHARDWAREBUFFER_FORMAT_D16_UNORM: - case AHARDWAREBUFFER_FORMAT_R16_UINT: - return 2; - case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM: - case AHARDWAREBUFFER_FORMAT_D24_UNORM: - return 3; - case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM: - case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM: - case AHARDWAREBUFFER_FORMAT_D32_FLOAT: - case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM: - case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT: - case AHARDWAREBUFFER_FORMAT_R16G16_UINT: - return 4; - case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT: - case AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM: - return 8; - default: - return 0; - } -} - uint32_t AHardwareBuffer_convertFromPixelFormat(uint32_t hal_format) { return hal_format; } |