summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAshish Kumar <asku@codeaurora.org>2019-11-15 18:15:22 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2019-12-10 03:05:49 -0800
commitd6ecf9d3fb4db22698f73f9f2c58e9960c964be5 (patch)
treefdd3d87c57075b27fdf285a3cc72aa230bc79c39
parent9b9dd456c9692b8bcb585e6c012c5979d1dd9fcb (diff)
downloaddisplay-d6ecf9d3fb4db22698f73f9f2c58e9960c964be5.tar.gz
gralloc: Add RGB format support in getFormatLayout API
CRs-Fixed: 2568703 Change-Id: I183a85fe5d30dc15454de0f5bec39658c24775ee
-rw-r--r--gralloc/QtiMapperExtensions.cpp57
-rw-r--r--gralloc/gr_utils.cpp78
-rw-r--r--gralloc/gr_utils.h4
3 files changed, 99 insertions, 40 deletions
diff --git a/gralloc/QtiMapperExtensions.cpp b/gralloc/QtiMapperExtensions.cpp
index cace7ba6..33cd23dc 100644
--- a/gralloc/QtiMapperExtensions.cpp
+++ b/gralloc/QtiMapperExtensions.cpp
@@ -344,7 +344,7 @@ Return<void> QtiMapperExtensions::getFormatLayout(int32_t format, uint64_t usage
getFormatLayout_cb hidl_cb) {
ALOGD_IF(DEBUG, "%s: Input parameters - wxh: %dx%d usage: 0x%" PRIu64 " format: %d", __FUNCTION__,
width, height, usage, format);
- auto err = Error::BAD_BUFFER;
+ auto err = Error::NONE;
hidl_vec<PlaneLayout> plane_info;
unsigned int alignedw = 0, alignedh = 0;
int plane_count = 0;
@@ -353,34 +353,41 @@ Return<void> QtiMapperExtensions::getFormatLayout(int32_t format, uint64_t usage
BufferInfo info(width, height, custom_format, usage);
gralloc::GetAlignedWidthAndHeight(info, &alignedw, &alignedh);
size = gralloc::GetSize(info, alignedw, alignedh);
+ gralloc::PlaneLayoutInfo plane_layout[8] = {};
ALOGD_IF(DEBUG, "%s: Aligned width and height - wxh: %ux%u custom_format = %d", __FUNCTION__,
alignedw, alignedh, custom_format);
if (gralloc::IsYuvFormat(custom_format)) {
- gralloc::PlaneLayoutInfo yuv_plane_info[8] = {};
gralloc::GetYUVPlaneInfo(info, custom_format, alignedw, alignedh, flags, &plane_count,
- yuv_plane_info);
- ALOGD_IF(DEBUG, "%s: Number of plane - %d, custom_format - %d", __FUNCTION__, plane_count,
- custom_format);
- plane_info.resize(plane_count);
- for (int i = 0; i < plane_count; i++) {
- plane_info[i].component = yuv_plane_info[i].component;
- plane_info[i].h_subsampling = yuv_plane_info[i].h_subsampling;
- plane_info[i].v_subsampling = yuv_plane_info[i].v_subsampling;
- plane_info[i].offset = yuv_plane_info[i].offset;
- plane_info[i].pixel_increment = yuv_plane_info[i].step;
- plane_info[i].stride = yuv_plane_info[i].stride;
- plane_info[i].stride_bytes = yuv_plane_info[i].stride_bytes;
- plane_info[i].scanlines = yuv_plane_info[i].scanlines;
- plane_info[i].size = yuv_plane_info[i].size;
- ALOGD_IF(DEBUG, "%s: plane info: component - %d", __FUNCTION__, plane_info[i].component);
- ALOGD_IF(DEBUG, "h_subsampling - %u, v_subsampling - %u, offset - %u, pixel_increment - %d",
- plane_info[i].h_subsampling, plane_info[i].v_subsampling, plane_info[i].offset,
- plane_info[i].pixel_increment);
- ALOGD_IF(DEBUG, "stride_pixel - %d, stride_bytes - %d, scanlines - %d, size - %u",
- plane_info[i].stride, plane_info[i].stride_bytes, plane_info[i].scanlines,
- plane_info[i].size);
- }
- err = Error::NONE;
+ plane_layout);
+ } else if (gralloc::IsUncompressedRGBFormat(custom_format) ||
+ gralloc::IsCompressedRGBFormat(custom_format)) {
+ gralloc::GetRGBPlaneInfo(info, custom_format, alignedw, alignedh, flags, &plane_count,
+ plane_layout);
+ } else {
+ err = Error::BAD_BUFFER;
+ hidl_cb(err, size, plane_info);
+ return Void();
+ }
+ ALOGD_IF(DEBUG, "%s: Number of plane - %d, custom_format - %d", __FUNCTION__, plane_count,
+ custom_format);
+ plane_info.resize(plane_count);
+ for (int i = 0; i < plane_count; i++) {
+ plane_info[i].component = plane_layout[i].component;
+ plane_info[i].h_subsampling = plane_layout[i].h_subsampling;
+ plane_info[i].v_subsampling = plane_layout[i].v_subsampling;
+ plane_info[i].offset = plane_layout[i].offset;
+ plane_info[i].pixel_increment = plane_layout[i].step;
+ plane_info[i].stride = plane_layout[i].stride;
+ plane_info[i].stride_bytes = plane_layout[i].stride_bytes;
+ plane_info[i].scanlines = plane_layout[i].scanlines;
+ plane_info[i].size = plane_layout[i].size;
+ ALOGD_IF(DEBUG, "%s: plane info: component - %d", __FUNCTION__, plane_info[i].component);
+ ALOGD_IF(DEBUG, "h_subsampling - %u, v_subsampling - %u, offset - %u, pixel_increment - %d",
+ plane_info[i].h_subsampling, plane_info[i].v_subsampling, plane_info[i].offset,
+ plane_info[i].pixel_increment);
+ ALOGD_IF(DEBUG, "stride_pixel - %d, stride_bytes - %d, scanlines - %d, size - %u",
+ plane_info[i].stride, plane_info[i].stride_bytes, plane_info[i].scanlines,
+ plane_info[i].size);
}
hidl_cb(err, size, plane_info);
return Void();
diff --git a/gralloc/gr_utils.cpp b/gralloc/gr_utils.cpp
index 9eca92df..6eb414e2 100644
--- a/gralloc/gr_utils.cpp
+++ b/gralloc/gr_utils.cpp
@@ -794,6 +794,28 @@ unsigned int GetUBwcSize(int width, int height, int format, unsigned int aligned
return size;
}
+unsigned int GetRgbMetaSize(int format, uint32_t width, uint32_t height, uint64_t usage) {
+ unsigned int meta_size = 0;
+ if (!IsUBwcEnabled(format, usage)) {
+ return meta_size;
+ }
+ uint32_t bpp = GetBppForUncompressedRGB(format);
+ switch (format) {
+ case HAL_PIXEL_FORMAT_BGR_565:
+ case HAL_PIXEL_FORMAT_RGBA_8888:
+ case HAL_PIXEL_FORMAT_RGBX_8888:
+ case HAL_PIXEL_FORMAT_RGBA_1010102:
+ case HAL_PIXEL_FORMAT_RGBX_1010102:
+ case HAL_PIXEL_FORMAT_RGBA_FP16:
+ meta_size = GetRgbUBwcMetaBufferSize(width, height, bpp);
+ break;
+ default:
+ ALOGE("%s:Unsupported RGB format: 0x%x", __FUNCTION__, format);
+ break;
+ }
+ return meta_size;
+}
+
int GetRgbDataAddress(private_handle_t *hnd, void **rgb_data) {
int err = 0;
@@ -807,22 +829,8 @@ int GetRgbDataAddress(private_handle_t *hnd, void **rgb_data) {
*rgb_data = reinterpret_cast<void *>(hnd->base);
return err;
}
+ unsigned int meta_size = GetRgbMetaSize(hnd->format, hnd->width, hnd->height, hnd->usage);
- unsigned int meta_size = 0;
- uint32_t bpp = GetBppForUncompressedRGB(hnd->format);
- switch (hnd->format) {
- case HAL_PIXEL_FORMAT_BGR_565:
- case HAL_PIXEL_FORMAT_RGBA_8888:
- case HAL_PIXEL_FORMAT_RGBX_8888:
- case HAL_PIXEL_FORMAT_RGBA_1010102:
- case HAL_PIXEL_FORMAT_RGBX_1010102:
- meta_size = GetRgbUBwcMetaBufferSize(hnd->width, hnd->height, bpp);
- break;
- default:
- ALOGE("%s:Unsupported RGB format: 0x%x", __FUNCTION__, hnd->format);
- err = -EINVAL;
- break;
- }
*rgb_data = reinterpret_cast<void *>(hnd->base + meta_size);
return err;
@@ -1560,4 +1568,44 @@ void CopyPlaneLayoutInfotoAndroidYcbcr(uint64_t base, int plane_count, PlaneLayo
}
}
+bool HasAlphaComponent(int32_t format) {
+ switch (format) {
+ case HAL_PIXEL_FORMAT_RGBA_8888:
+ case HAL_PIXEL_FORMAT_BGRA_8888:
+ case HAL_PIXEL_FORMAT_RGBA_5551:
+ case HAL_PIXEL_FORMAT_RGBA_4444:
+ case HAL_PIXEL_FORMAT_RGBA_1010102:
+ case HAL_PIXEL_FORMAT_ARGB_2101010:
+ case HAL_PIXEL_FORMAT_BGRA_1010102:
+ case HAL_PIXEL_FORMAT_ABGR_2101010:
+ case HAL_PIXEL_FORMAT_RGBA_FP16:
+ return true;
+ default:
+ return false;
+ }
+}
+
+void GetRGBPlaneInfo(const BufferInfo &info, int32_t format, int32_t width, int32_t height,
+ int32_t /* flags */, int *plane_count, PlaneLayoutInfo *plane_info) {
+ uint64_t usage = info.usage;
+ *plane_count = 1;
+ uint32_t bpp = 0;
+ if (IsUncompressedRGBFormat(format)) {
+ bpp = GetBppForUncompressedRGB(format);
+ }
+ plane_info->component =
+ (PlaneComponent)(PLANE_COMPONENT_R | PLANE_COMPONENT_G | PLANE_COMPONENT_B);
+ if (HasAlphaComponent(format)) {
+ plane_info->component = (PlaneComponent)(plane_info->component | PLANE_COMPONENT_A);
+ }
+ plane_info->size = GetSize(info, width, height);
+ plane_info->step = bpp;
+ plane_info->offset = GetRgbMetaSize(format, width, height, usage);
+ plane_info->h_subsampling = 0;
+ plane_info->v_subsampling = 0;
+ plane_info->stride = width;
+ plane_info->stride_bytes = width * plane_info->step;
+ plane_info->scanlines = height;
+}
+
} // namespace gralloc
diff --git a/gralloc/gr_utils.h b/gralloc/gr_utils.h
index 8ecb90f6..39d7e9bd 100644
--- a/gralloc/gr_utils.h
+++ b/gralloc/gr_utils.h
@@ -144,6 +144,9 @@ void GetAlignedWidthAndHeight(const BufferInfo &d, unsigned int *aligned_w,
int GetYUVPlaneInfo(const private_handle_t *hnd, struct android_ycbcr ycbcr[2]);
int GetYUVPlaneInfo(const BufferInfo &info, int32_t format, int32_t width, int32_t height,
int32_t flags, int *plane_count, PlaneLayoutInfo plane_info[8]);
+void GetRGBPlaneInfo(const BufferInfo &info, int32_t format, int32_t width, int32_t height,
+ int32_t flags, int *plane_count, PlaneLayoutInfo *plane_info);
+unsigned int GetRgbMetaSize(int format, uint32_t width, uint32_t height, uint64_t usage);
void GetYuvSubSamplingFactor(int32_t format, int *h_subsampling, int *v_subsampling);
void CopyPlaneLayoutInfotoAndroidYcbcr(uint64_t base, int plane_count, PlaneLayoutInfo *plane_info,
struct android_ycbcr *ycbcr);
@@ -178,6 +181,7 @@ int GetImplDefinedFormat(uint64_t usage, int format);
int GetCustomFormatFlags(int format, uint64_t usage, int *custom_format, uint64_t *priv_flags);
int GetBufferType(int inputFormat);
bool IsGPUFlagSupported(uint64_t usage);
+bool HasAlphaComponent(int32_t format);
} // namespace gralloc
#endif // __GR_UTILS_H__