diff options
author | Yichi Chen <yichichen@google.com> | 2020-05-27 20:16:13 +0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2020-08-18 07:59:55 -0700 |
commit | 96ad5c58a955630430ffe628ae2fb65d70b75530 (patch) | |
tree | 17d2c6891d9987d363ce8867696b7c8ce2d0520d | |
parent | 0acabb14a2acc1301591b3c09f66e045a3f46549 (diff) |
gralloc: Add the support of RAW data in getComponentSizeAndOffset
To support RAW8, RAW10, RAW12, and RAW16 in gralloc4.0, the patch sets
the corresponding data in PlaneLayoutInfo and PlaneLayoutComponent.
(Not a contribution)
Bug: 157534008
Test: VtsHalGraphicsMapperV4_0TargetTest
CRs-Fixed: 2728586
Change-Id: I5c0d7c31199b949dc32e112e2743ec6cdc7106bd
-rw-r--r-- | gralloc/gr_buf_mgr.cpp | 30 | ||||
-rw-r--r-- | gralloc/gr_utils.cpp | 58 |
2 files changed, 75 insertions, 13 deletions
diff --git a/gralloc/gr_buf_mgr.cpp b/gralloc/gr_buf_mgr.cpp index f0b46395..620b8c1d 100644 --- a/gralloc/gr_buf_mgr.cpp +++ b/gralloc/gr_buf_mgr.cpp @@ -528,6 +528,31 @@ static void getComponentSizeAndOffset(int32_t format, PlaneLayoutComponent &comp comp.sizeInBits = 10; } break; + case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW16): + if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) { + comp.offsetInBits = 0; + comp.sizeInBits = 16; + } else { + return Error::BAD_VALUE; + } + break; + case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW12): + case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW10): + if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) { + comp.offsetInBits = 0; + comp.sizeInBits = -1; + } else { + return Error::BAD_VALUE; + } + break; + case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW8): + if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) { + comp.offsetInBits = 0; + comp.sizeInBits = 8; + } else { + return Error::BAD_VALUE; + } + break; default: break; } @@ -583,8 +608,9 @@ static void grallocToStandardPlaneLayoutComponentType(uint32_t in, } if (in & PLANE_COMPONENT_RAW) { - comp.type = qtigralloc::PlaneLayoutComponentType_Raw; - components->push_back(comp); + comp.type = android::gralloc4::PlaneLayoutComponentType_RAW; + if (getComponentSizeAndOffset(format, comp) == Error::NONE) + components->push_back(comp); } if (in & PLANE_COMPONENT_META) { diff --git a/gralloc/gr_utils.cpp b/gralloc/gr_utils.cpp index 3dc91d5b..312058ed 100644 --- a/gralloc/gr_utils.cpp +++ b/gralloc/gr_utils.cpp @@ -518,15 +518,10 @@ void GetYuvSPPlaneInfo(const BufferInfo &info, int format, uint32_t width, uint3 c_size = (width * height) / 2; c_height = height >> 1; break; - case HAL_PIXEL_FORMAT_RAW16: case HAL_PIXEL_FORMAT_Y16: c_size = width * height; c_height = height; break; - case HAL_PIXEL_FORMAT_RAW10: - c_size = 0; - break; - case HAL_PIXEL_FORMAT_RAW8: case HAL_PIXEL_FORMAT_Y8: c_size = 0; break; @@ -631,6 +626,44 @@ int GetYUVPlaneInfo(const private_handle_t *hnd, struct android_ycbcr ycbcr[2]) return err; } +int GetRawPlaneInfo(int32_t format, int32_t width, int32_t height, PlaneLayoutInfo *plane_info) { + int32_t step = 0; + + switch (format) { + case HAL_PIXEL_FORMAT_RAW16: + step = 2; + break; + case HAL_PIXEL_FORMAT_RAW8: + step = 1; + break; + case HAL_PIXEL_FORMAT_RAW12: + case HAL_PIXEL_FORMAT_RAW10: + step = 0; + break; + default: + ALOGW("RawPlaneInfo is unsupported for format 0x%x", format); + return -EINVAL; + } + + BufferInfo info(width, height, format); + uint32_t alignedWidth, alignedHeight; + GetAlignedWidthAndHeight(info, &alignedWidth, &alignedHeight); + + uint32_t size = GetSize(info, alignedWidth, alignedHeight); + + plane_info[0].component = (PlaneComponent)PLANE_COMPONENT_RAW; + plane_info[0].h_subsampling = 0; + plane_info[0].v_subsampling = 0; + plane_info[0].offset = 0; + plane_info[0].step = step; + plane_info[0].stride = width; + plane_info[0].stride_bytes = static_cast<int32_t>(alignedWidth); + plane_info[0].scanlines = height; + plane_info[0].size = size; + + return 0; +} + // Explicitly defined UBWC formats bool IsUBwcFormat(int format) { switch (format) { @@ -1326,10 +1359,7 @@ int GetYUVPlaneInfo(const BufferInfo &info, int32_t format, int32_t width, int32 case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO: case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS: case HAL_PIXEL_FORMAT_NV21_ZSL: - case HAL_PIXEL_FORMAT_RAW16: case HAL_PIXEL_FORMAT_Y16: - case HAL_PIXEL_FORMAT_RAW10: - case HAL_PIXEL_FORMAT_RAW8: case HAL_PIXEL_FORMAT_Y8: *plane_count = 2; GetYuvSPPlaneInfo(info, format, width, height, 1, plane_info); @@ -1340,6 +1370,15 @@ int GetYUVPlaneInfo(const BufferInfo &info, int32_t format, int32_t width, int32 plane_info[1].v_subsampling = v_subsampling; break; + case HAL_PIXEL_FORMAT_RAW10: + case HAL_PIXEL_FORMAT_RAW8: + case HAL_PIXEL_FORMAT_RAW16: + case HAL_PIXEL_FORMAT_RAW12: + *plane_count = 1; + GetRawPlaneInfo(format, info.width, info.height, plane_info); + break; + + case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC: GetYuvSubSamplingFactor(format, &h_subsampling, &v_subsampling); if (flags & LAYOUT_INTERLACED_FLAG) { @@ -1548,10 +1587,7 @@ void GetYuvSubSamplingFactor(int32_t format, int *h_subsampling, int *v_subsampl *h_subsampling = 1; *v_subsampling = 0; break; - case HAL_PIXEL_FORMAT_RAW16: case HAL_PIXEL_FORMAT_Y16: - case HAL_PIXEL_FORMAT_RAW12: - case HAL_PIXEL_FORMAT_RAW10: case HAL_PIXEL_FORMAT_Y8: case HAL_PIXEL_FORMAT_BLOB: case HAL_PIXEL_FORMAT_RAW_OPAQUE: |