summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Collingbourne <pcc@google.com>2019-10-15 17:29:20 -0700
committerPeter Collingbourne <pcc@google.com>2019-10-15 17:50:25 -0700
commitf2ed293b9be68db45a6d2dc3fed5d2f504a6f861 (patch)
tree826540a1fdab19ec6407aaa36ba48456f47980e7
parentf364e76947f39b9bc8bc3d03f019eff9aa749784 (diff)
downloadlibhardware-f2ed293b9be68db45a6d2dc3fed5d2f504a6f861.tar.gz
gralloc: Configure framebuffer mode according to requested image format.
Previously we were ignoring the requested image format when mapping a graphics device via gralloc_alloc, and using the mode that the framebuffer started up in. This meant that on devices whose framebuffer starts up in a mode other than RGBA8888, we would map the framebuffer in the other mode and attempt to use it as an RGBA8888 framebuffer, which would lead to crashes or incorrecet rendering. This is the case in the ARM FVP, whose framebuffer starts up in RGB565 mode. Unfortunately there is no preferred image format passed in to fb_device_open, and we presumably cannot start passing one in for backwards compatibility reasons. Therefore, we set the image format to RGBA8888, which appears to be the only format that the platform ends up using. Bug: 142352330 Change-Id: I24000fd36910b4044ce7659605efc423e36cba00
-rw-r--r--modules/gralloc/framebuffer.cpp19
-rw-r--r--modules/gralloc/gr.h2
-rw-r--r--modules/gralloc/gralloc.cpp10
3 files changed, 23 insertions, 8 deletions
diff --git a/modules/gralloc/framebuffer.cpp b/modules/gralloc/framebuffer.cpp
index c1717115..b2ec3e44 100644
--- a/modules/gralloc/framebuffer.cpp
+++ b/modules/gralloc/framebuffer.cpp
@@ -117,7 +117,7 @@ static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer)
/*****************************************************************************/
-int mapFrameBufferLocked(struct private_module_t* module)
+int mapFrameBufferLocked(struct private_module_t* module, int format)
{
// already initialized...
if (module->framebuffer) {
@@ -161,6 +161,20 @@ int mapFrameBufferLocked(struct private_module_t* module)
*/
info.yres_virtual = info.yres * NUM_BUFFERS;
+ switch (format) {
+ case HAL_PIXEL_FORMAT_RGBA_8888:
+ info.bits_per_pixel = 32;
+ info.red.offset = 0;
+ info.red.length = 8;
+ info.green.offset = 8;
+ info.green.length = 8;
+ info.blue.offset = 16;
+ info.blue.length = 8;
+ break;
+ default:
+ ALOGW("unknown format: %d", format);
+ break;
+ }
uint32_t flags = PAGE_FLIP;
#if USE_PAN_DISPLAY
@@ -280,7 +294,8 @@ int mapFrameBufferLocked(struct private_module_t* module)
static int mapFrameBuffer(struct private_module_t* module)
{
pthread_mutex_lock(&module->lock);
- int err = mapFrameBufferLocked(module);
+ // Request RGBA8888 because the platform assumes support for RGBA8888.
+ int err = mapFrameBufferLocked(module, HAL_PIXEL_FORMAT_RGBA_8888);
pthread_mutex_unlock(&module->lock);
return err;
}
diff --git a/modules/gralloc/gr.h b/modules/gralloc/gr.h
index ac7e9670..14fe6a05 100644
--- a/modules/gralloc/gr.h
+++ b/modules/gralloc/gr.h
@@ -36,7 +36,7 @@ inline size_t roundUpToPageSize(size_t x) {
return (x + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1);
}
-int mapFrameBufferLocked(struct private_module_t* module);
+int mapFrameBufferLocked(struct private_module_t* module, int format);
int terminateBuffer(gralloc_module_t const* module, private_handle_t* hnd);
int mapBuffer(gralloc_module_t const* module, private_handle_t* hnd);
diff --git a/modules/gralloc/gralloc.cpp b/modules/gralloc/gralloc.cpp
index 07bbfbac..87bda975 100644
--- a/modules/gralloc/gralloc.cpp
+++ b/modules/gralloc/gralloc.cpp
@@ -101,7 +101,7 @@ struct private_module_t HAL_MODULE_INFO_SYM = {
/*****************************************************************************/
static int gralloc_alloc_framebuffer_locked(alloc_device_t* dev,
- size_t size, int usage, buffer_handle_t* pHandle)
+ size_t size, int format, int usage, buffer_handle_t* pHandle)
{
private_module_t* m = reinterpret_cast<private_module_t*>(
dev->common.module);
@@ -110,7 +110,7 @@ static int gralloc_alloc_framebuffer_locked(alloc_device_t* dev,
if (m->framebuffer == NULL) {
// initialize the framebuffer, the framebuffer is mapped once
// and forever.
- int err = mapFrameBufferLocked(m);
+ int err = mapFrameBufferLocked(m, format);
if (err < 0) {
return err;
}
@@ -154,12 +154,12 @@ static int gralloc_alloc_framebuffer_locked(alloc_device_t* dev,
}
static int gralloc_alloc_framebuffer(alloc_device_t* dev,
- size_t size, int usage, buffer_handle_t* pHandle)
+ size_t size, int format, int usage, buffer_handle_t* pHandle)
{
private_module_t* m = reinterpret_cast<private_module_t*>(
dev->common.module);
pthread_mutex_lock(&m->lock);
- int err = gralloc_alloc_framebuffer_locked(dev, size, usage, pHandle);
+ int err = gralloc_alloc_framebuffer_locked(dev, size, format, usage, pHandle);
pthread_mutex_unlock(&m->lock);
return err;
}
@@ -236,7 +236,7 @@ static int gralloc_alloc(alloc_device_t* dev,
int err;
if (usage & GRALLOC_USAGE_HW_FB) {
- err = gralloc_alloc_framebuffer(dev, size, usage, pHandle);
+ err = gralloc_alloc_framebuffer(dev, size, format, usage, pHandle);
} else {
err = gralloc_alloc_buffer(dev, size, usage, pHandle);
}