gralloc: Add support to RGB compressed format and handle error
1. Add corresponding adreno format for RGB compressed hal format,
as new adreno API adreno_init_memory_layout needs ADRENO_FORMAT to
be passed.
2. Handle the error returned by adreno_init_memory_layout API for the
inappropriate values passed.
Change-Id: Iedcf306583b83ecb80db5495a801f37d2479276b
CRs-Fixed: 2262839
diff --git a/gralloc/gr_adreno_info.cpp b/gralloc/gr_adreno_info.cpp
index c89f555..64c74c6 100644
--- a/gralloc/gr_adreno_info.cpp
+++ b/gralloc/gr_adreno_info.cpp
@@ -233,6 +233,62 @@
return ADRENO_PIXELFORMAT_D32_FLOAT;
case HAL_PIXEL_FORMAT_STENCIL_8:
return ADRENO_PIXELFORMAT_S8_UINT;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_4x4_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_4X4;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_4X4_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x4_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_5X4;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_5X4_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_5x5_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_5X5;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_5X5_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x5_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_6X5;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_6X5_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_6x6_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_6X6;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_6X6_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x5_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_8X5;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_8X5_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x6_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_8X6;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_8X6_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_8x8_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_8X8;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_8X8_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x5_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_10X5;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_10X5_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x6_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_10X6;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_10X6_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x8_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_10X8;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_10X8_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_10x10_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_10X10;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_10X10_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x10_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_12X10;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_12X10_SRGB;
+ case HAL_PIXEL_FORMAT_COMPRESSED_RGBA_ASTC_12x12_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_12X12;
+ case HAL_PIXEL_FORMAT_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
+ return ADRENO_PIXELFORMAT_ASTC_12X12_SRGB;
default:
ALOGE("%s: No map for format: 0x%x", __FUNCTION__, hal_format);
break;
diff --git a/gralloc/gr_adreno_info.h b/gralloc/gr_adreno_info.h
index bb8fdd6..436e0c0 100644
--- a/gralloc/gr_adreno_info.h
+++ b/gralloc/gr_adreno_info.h
@@ -67,6 +67,34 @@
ADRENO_PIXELFORMAT_D24_UNORM = 549,
ADRENO_PIXELFORMAT_D32_FLOAT_X24S8_UINT = 551,
ADRENO_PIXELFORMAT_S8_UINT = 552,
+ ADRENO_PIXELFORMAT_ASTC_4X4 = 568, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_5X4 = 569, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_5X5 = 570, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_6X5 = 571, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_6X6 = 572, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_8X5 = 573, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_8X6 = 574, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_8X8 = 575, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_10X5 = 576, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_10X6 = 577, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_10X8 = 578, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_10X10 = 579, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_12X10 = 580, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_12X12 = 581, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_4X4_SRGB = 582, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_5X4_SRGB = 583, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_5X5_SRGB = 584, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_6X5_SRGB = 585, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_6X6_SRGB = 586, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_8X5_SRGB = 587, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_8X6_SRGB = 588, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_8X8_SRGB = 589, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_10X5_SRGB = 590, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_10X6_SRGB = 591, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_10X8_SRGB = 592, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_10X10_SRGB = 593, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_12X10_SRGB = 594, // ASTC Compressed
+ ADRENO_PIXELFORMAT_ASTC_12X12_SRGB = 595, // ASTC Compressed
// Vertex, Normalized GL_UNSIGNED_INT_10_10_10_2_OES
ADRENO_PIXELFORMAT_R5G6B5 = 610, // RGBA version of B5G6R5
ADRENO_PIXELFORMAT_R5G5B5A1 = 611, // RGBA version of B5G5R5A1
diff --git a/gralloc/gr_buf_mgr.cpp b/gralloc/gr_buf_mgr.cpp
index 9a25a8e..61e31d6 100644
--- a/gralloc/gr_buf_mgr.cpp
+++ b/gralloc/gr_buf_mgr.cpp
@@ -86,7 +86,10 @@
Error BufferManager::ValidateBufferSize(private_handle_t const *hnd, BufferInfo info) {
unsigned int size, alignedw, alignedh;
info.format = GetImplDefinedFormat(info.usage, info.format);
- GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh);
+ int ret = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh);
+ if (ret < 0) {
+ return Error::BAD_BUFFER;
+ }
auto ion_fd_size = static_cast<unsigned int>(lseek(hnd->fd, 0, SEEK_END));
if (size != ion_fd_size) {
return Error::BAD_VALUE;
@@ -270,6 +273,7 @@
unsigned int size;
unsigned int alignedw, alignedh;
+ int err = 0;
int buffer_type = GetBufferType(format);
BufferInfo info = GetBufferInfo(descriptor);
@@ -277,10 +281,12 @@
info.layer_count = layer_count;
GraphicsMetadata graphics_metadata = {};
- GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh, &graphics_metadata);
+ err = GetBufferSizeAndDimensions(info, &size, &alignedw, &alignedh, &graphics_metadata);
+ if (err < 0) {
+ return Error::BAD_DESCRIPTOR;
+ }
size = (bufferSize >= size) ? bufferSize : size;
- int err = 0;
uint64_t flags = 0;
auto page_size = UINT(getpagesize());
AllocData data;
@@ -292,7 +298,8 @@
// Allocate buffer memory
err = allocator_->AllocateMem(&data, usage, format);
if (err) {
- ALOGE("gralloc failed to allocate err=%s", strerror(-err));
+ ALOGE("gralloc failed to allocate err=%s format %d size %d WxH %dx%d usage %" PRIu64,
+ strerror(-err), format, size, alignedw, alignedh, usage);
return Error::NO_RESOURCES;
}
diff --git a/gralloc/gr_ion_alloc.cpp b/gralloc/gr_ion_alloc.cpp
index 2c7a90b..a9e06da 100644
--- a/gralloc/gr_ion_alloc.cpp
+++ b/gralloc/gr_ion_alloc.cpp
@@ -95,7 +95,8 @@
err = ion_alloc_fd(ion_dev_fd_, data->size, data->align, data->heap_id, flags, &fd);
ATRACE_END();
if (err) {
- ALOGE("libion alloc failed");
+ ALOGE("libion alloc failed ion_fd %d size %d align %d heap_id %x flags %x",
+ ion_dev_fd_, data->size, data->align, data->heap_id, flags);
return err;
}
diff --git a/gralloc/gr_utils.cpp b/gralloc/gr_utils.cpp
index 7c825bd..3b019a3 100644
--- a/gralloc/gr_utils.cpp
+++ b/gralloc/gr_utils.cpp
@@ -341,21 +341,22 @@
return size;
}
-void GetBufferSizeAndDimensions(const BufferInfo &info, unsigned int *size, unsigned int *alignedw,
- unsigned int *alignedh) {
+int GetBufferSizeAndDimensions(const BufferInfo &info, unsigned int *size, unsigned int *alignedw,
+ unsigned int *alignedh) {
GraphicsMetadata graphics_metadata = {};
- GetBufferSizeAndDimensions(info, size, alignedw, alignedh, &graphics_metadata);
+ return GetBufferSizeAndDimensions(info, size, alignedw, alignedh, &graphics_metadata);
}
-void GetBufferSizeAndDimensions(const BufferInfo &info, unsigned int *size, unsigned int *alignedw,
- unsigned int *alignedh, GraphicsMetadata *graphics_metadata) {
+int GetBufferSizeAndDimensions(const BufferInfo &info, unsigned int *size, unsigned int *alignedw,
+ unsigned int *alignedh, GraphicsMetadata *graphics_metadata) {
int buffer_type = GetBufferType(info.format);
if (CanUseAdrenoForSize(buffer_type, info.usage)) {
- GetGpuResourceSizeAndDimensions(info, size, alignedw, alignedh, graphics_metadata);
+ return GetGpuResourceSizeAndDimensions(info, size, alignedw, alignedh, graphics_metadata);
} else {
GetAlignedWidthAndHeight(info, alignedw, alignedh);
*size = GetSize(info, *alignedw, *alignedh);
}
+ return 0;
}
void GetYuvUbwcSPPlaneInfo(uint64_t base, uint32_t width, uint32_t height, int color_format,
@@ -1014,9 +1015,9 @@
return 0;
}
-void GetGpuResourceSizeAndDimensions(const BufferInfo &info, unsigned int *size,
- unsigned int *alignedw, unsigned int *alignedh,
- GraphicsMetadata *graphics_metadata) {
+int GetGpuResourceSizeAndDimensions(const BufferInfo &info, unsigned int *size,
+ unsigned int *alignedw, unsigned int *alignedh,
+ GraphicsMetadata *graphics_metadata) {
GetAlignedWidthAndHeight(info, alignedw, alignedh);
AdrenoMemInfo* adreno_mem_info = AdrenoMemInfo::GetInstance();
graphics_metadata->size = adreno_mem_info->AdrenoGetMetadataBlobSize();
@@ -1038,10 +1039,11 @@
if (ret != 0) {
ALOGE("%s Graphics metadata init failed", __FUNCTION__);
*size = 0;
- return;
+ return -EINVAL;
}
// Call adreno api with the metadata blob to get buffer size
*size = adreno_mem_info->AdrenoGetAlignedGpuBufferSize(graphics_metadata->data);
+ return 0;
}
bool CanUseAdrenoForSize(int buffer_type, uint64_t usage) {
diff --git a/gralloc/gr_utils.h b/gralloc/gr_utils.h
index c955619..309b8a7 100644
--- a/gralloc/gr_utils.h
+++ b/gralloc/gr_utils.h
@@ -76,10 +76,10 @@
bool CpuCanRead(uint64_t usage);
bool CpuCanWrite(uint64_t usage);
unsigned int GetSize(const BufferInfo &d, unsigned int alignedw, unsigned int alignedh);
-void GetBufferSizeAndDimensions(const BufferInfo &d, unsigned int *size, unsigned int *alignedw,
- unsigned int *alignedh);
-void GetBufferSizeAndDimensions(const BufferInfo &d, unsigned int *size, unsigned int *alignedw,
- unsigned int *alignedh, GraphicsMetadata *graphics_metadata);
+int GetBufferSizeAndDimensions(const BufferInfo &d, unsigned int *size, unsigned int *alignedw,
+ unsigned int *alignedh);
+int GetBufferSizeAndDimensions(const BufferInfo &d, unsigned int *size, unsigned int *alignedw,
+ unsigned int *alignedh, GraphicsMetadata *graphics_metadata);
void GetCustomDimensions(private_handle_t *hnd, int *stride, int *height);
void GetColorSpaceFromMetadata(private_handle_t *hnd, int *color_space);
void GetAlignedWidthAndHeight(const BufferInfo &d, unsigned int *aligned_w,
@@ -105,9 +105,9 @@
int GetBufferLayout(private_handle_t *hnd, uint32_t stride[4], uint32_t offset[4],
uint32_t *num_planes);
uint32_t GetDataAlignment(int format, uint64_t usage);
-void GetGpuResourceSizeAndDimensions(const BufferInfo &info, unsigned int *size,
- unsigned int *alignedw, unsigned int *alignedh,
- GraphicsMetadata *graphics_metadata);
+int GetGpuResourceSizeAndDimensions(const BufferInfo &info, unsigned int *size,
+ unsigned int *alignedw, unsigned int *alignedh,
+ GraphicsMetadata *graphics_metadata);
bool CanUseAdrenoForSize(int buffer_type, uint64_t usage);
bool GetAdrenoSizeAPIStatus();
bool UseUncached(int format, uint64_t usage);
diff --git a/sdm/libs/hwc2/hwc_buffer_allocator.cpp b/sdm/libs/hwc2/hwc_buffer_allocator.cpp
index 34db732..896c527 100644
--- a/sdm/libs/hwc2/hwc_buffer_allocator.cpp
+++ b/sdm/libs/hwc2/hwc_buffer_allocator.cpp
@@ -211,7 +211,10 @@
uint32_t aligned_width = 0, aligned_height = 0, buffer_size = 0;
gralloc::BufferInfo info(width, height, format, alloc_flags);
- GetBufferSizeAndDimensions(info, &buffer_size, &aligned_width, &aligned_height);
+ int ret = GetBufferSizeAndDimensions(info, &buffer_size, &aligned_width, &aligned_height);
+ if (ret < 0) {
+ return 0;
+ }
return buffer_size;
}
@@ -365,7 +368,10 @@
uint32_t aligned_width = 0, aligned_height = 0, buffer_size = 0;
gralloc::BufferInfo info(width, height, format, alloc_flags);
- GetBufferSizeAndDimensions(info, &buffer_size, &aligned_width, &aligned_height);
+ int ret = GetBufferSizeAndDimensions(info, &buffer_size, &aligned_width, &aligned_height);
+ if (ret < 0) {
+ return kErrorParameters;
+ }
allocated_buffer_info->stride = UINT32(aligned_width);
allocated_buffer_info->aligned_width = UINT32(aligned_width);
allocated_buffer_info->aligned_height = UINT32(aligned_height);