compositor-drm: support RGB565 with pixman renderer

At the moment only XRGB8888 is supported when using pixman renderer.
This patch adds support also for RGB565.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Derek Foreman <derekf@osg.samsung.com>
Signed-off-by: Daniel Stone <daniels@collabora.com>
dev
Tomi Valkeinen 9 years ago committed by Daniel Stone
parent ad0241d2a4
commit f8da0c2552
  1. 62
      src/compositor-drm.c

@ -262,10 +262,12 @@ drm_fb_destroy_callback(struct gbm_bo *bo, void *data)
} }
static struct drm_fb * static struct drm_fb *
drm_fb_create_dumb(struct drm_backend *b, unsigned width, unsigned height) drm_fb_create_dumb(struct drm_backend *b, unsigned width, unsigned height,
uint32_t format)
{ {
struct drm_fb *fb; struct drm_fb *fb;
int ret; int ret;
uint32_t bpp, depth;
struct drm_mode_create_dumb create_arg; struct drm_mode_create_dumb create_arg;
struct drm_mode_destroy_dumb destroy_arg; struct drm_mode_destroy_dumb destroy_arg;
@ -275,8 +277,20 @@ drm_fb_create_dumb(struct drm_backend *b, unsigned width, unsigned height)
if (!fb) if (!fb)
return NULL; return NULL;
switch (format) {
case GBM_FORMAT_XRGB8888:
bpp = 32;
depth = 24;
break;
case GBM_FORMAT_RGB565:
bpp = depth = 16;
break;
default:
return NULL;
}
memset(&create_arg, 0, sizeof create_arg); memset(&create_arg, 0, sizeof create_arg);
create_arg.bpp = 32; create_arg.bpp = bpp;
create_arg.width = width; create_arg.width = width;
create_arg.height = height; create_arg.height = height;
@ -289,8 +303,29 @@ drm_fb_create_dumb(struct drm_backend *b, unsigned width, unsigned height)
fb->size = create_arg.size; fb->size = create_arg.size;
fb->fd = b->drm.fd; fb->fd = b->drm.fd;
ret = drmModeAddFB(b->drm.fd, width, height, 24, 32, ret = -1;
fb->stride, fb->handle, &fb->fb_id);
if (!b->no_addfb2) {
uint32_t handles[4], pitches[4], offsets[4];
handles[0] = fb->handle;
pitches[0] = fb->stride;
offsets[0] = 0;
ret = drmModeAddFB2(b->drm.fd, width, height,
format, handles, pitches, offsets,
&fb->fb_id, 0);
if (ret) {
weston_log("addfb2 failed: %m\n");
b->no_addfb2 = 1;
}
}
if (ret) {
ret = drmModeAddFB(b->drm.fd, width, height, depth, bpp,
fb->stride, fb->handle, &fb->fb_id);
}
if (ret) if (ret)
goto err_bo; goto err_bo;
@ -1879,17 +1914,30 @@ drm_output_init_pixman(struct drm_output *output, struct drm_backend *b)
{ {
int w = output->base.current_mode->width; int w = output->base.current_mode->width;
int h = output->base.current_mode->height; int h = output->base.current_mode->height;
uint32_t format = output->gbm_format;
uint32_t pixman_format;
unsigned int i; unsigned int i;
/* FIXME error checking */ switch (format) {
case GBM_FORMAT_XRGB8888:
pixman_format = PIXMAN_x8r8g8b8;
break;
case GBM_FORMAT_RGB565:
pixman_format = PIXMAN_r5g6b5;
break;
default:
weston_log("Unsupported pixman format 0x%x\n", format);
return -1;
}
/* FIXME error checking */
for (i = 0; i < ARRAY_LENGTH(output->dumb); i++) { for (i = 0; i < ARRAY_LENGTH(output->dumb); i++) {
output->dumb[i] = drm_fb_create_dumb(b, w, h); output->dumb[i] = drm_fb_create_dumb(b, w, h, format);
if (!output->dumb[i]) if (!output->dumb[i])
goto err; goto err;
output->image[i] = output->image[i] =
pixman_image_create_bits(PIXMAN_x8r8g8b8, w, h, pixman_image_create_bits(pixman_format, w, h,
output->dumb[i]->map, output->dumb[i]->map,
output->dumb[i]->stride); output->dumb[i]->stride);
if (!output->image[i]) if (!output->image[i])

Loading…
Cancel
Save