Adjust gralloc to SwiftShader's requirements.
SwiftShader processes 2x2 tiles of pixels simultaneously.
4 bytes of padding are required for reading 4-byte pixels in 8-byte chunks.
Change-Id: Ieb73df07859251cd0e5a649f9f3f16a318276e28
diff --git a/modules/gralloc/gralloc.cpp b/modules/gralloc/gralloc.cpp
index a9fbc80..e9559e9 100644
--- a/modules/gralloc/gralloc.cpp
+++ b/modules/gralloc/gralloc.cpp
@@ -196,36 +196,41 @@
/*****************************************************************************/
+inline size_t align(size_t value, size_t alignment)
+{
+ return ((value + alignment - 1) / alignment) * alignment;
+}
+
static int gralloc_alloc(alloc_device_t* dev,
- int w, int h, int format, int usage,
+ int width, int height, int format, int usage,
buffer_handle_t* pHandle, int* pStride)
{
if (!pHandle || !pStride)
return -EINVAL;
- size_t size, stride;
-
- int align = 4;
- int bpp = 0;
+ int bytesPerPixel = 0;
switch (format) {
case HAL_PIXEL_FORMAT_RGBA_8888:
case HAL_PIXEL_FORMAT_RGBX_8888:
case HAL_PIXEL_FORMAT_BGRA_8888:
- bpp = 4;
+ bytesPerPixel = 4;
break;
case HAL_PIXEL_FORMAT_RGB_888:
- bpp = 3;
+ bytesPerPixel = 3;
break;
case HAL_PIXEL_FORMAT_RGB_565:
case HAL_PIXEL_FORMAT_RAW16:
- bpp = 2;
+ bytesPerPixel = 2;
break;
default:
return -EINVAL;
}
- size_t bpr = (w*bpp + (align-1)) & ~(align-1);
- size = bpr * h;
- stride = bpr / bpp;
+
+ const size_t tileWidth = 2;
+ const size_t tileHeight = 2;
+
+ size_t stride = align(width, tileWidth);
+ size_t size = align(height, tileHeight) * stride * bytesPerPixel + 4;
int err;
if (usage & GRALLOC_USAGE_HW_FB) {