On 20/06/16 06:18 AM, Tomi Valkeinen wrote: > From: Tomi Valkeinen <[email protected]> > > At the moment only XRGB8888 is supported when using pixman renderer. > This patch adds support also for RGB565. > > Signed-off-by: Tomi Valkeinen <[email protected]>
Looks fine to me, Reviewed-by: Derek Foreman <[email protected]> > --- > src/compositor-drm.c | 62 > ++++++++++++++++++++++++++++++++++++++++++++++------ > 1 file changed, 55 insertions(+), 7 deletions(-) > > diff --git a/src/compositor-drm.c b/src/compositor-drm.c > index 3356ae0..f903a3b 100644 > --- a/src/compositor-drm.c > +++ b/src/compositor-drm.c > @@ -262,10 +262,12 @@ drm_fb_destroy_callback(struct gbm_bo *bo, void *data) > } > > 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; > int ret; > + uint32_t bpp, depth; > > struct drm_mode_create_dumb create_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) > 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); > - create_arg.bpp = 32; > + create_arg.bpp = bpp; > create_arg.width = width; > 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->fd = b->drm.fd; > > - ret = drmModeAddFB(b->drm.fd, width, height, 24, 32, > - fb->stride, fb->handle, &fb->fb_id); > + ret = -1; > + > + 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) > 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 h = output->base.current_mode->height; > + uint32_t format = output->gbm_format; > + uint32_t pixman_format; > 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++) { > - 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]) > goto err; > > 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]->stride); > if (!output->image[i]) > _______________________________________________ wayland-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/wayland-devel
