mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-06 14:58:06 +02:00
compositor-drm: Allow scanning out of opaque ARGB surfaces
This commit is contained in:
parent
6e09a298b7
commit
93594b7651
1 changed files with 29 additions and 4 deletions
|
|
@ -273,6 +273,34 @@ fb_handle_buffer_destroy(struct wl_listener *listener, void *data)
|
|||
weston_output_schedule_repaint(&fb->output->base);
|
||||
}
|
||||
|
||||
static int
|
||||
drm_output_check_scanout_format(struct drm_output *output,
|
||||
struct weston_surface *es, struct gbm_bo *bo)
|
||||
{
|
||||
int ret = 0;
|
||||
uint32_t format;
|
||||
pixman_region32_t r;
|
||||
|
||||
format = gbm_bo_get_format(bo);
|
||||
|
||||
if (format == GBM_FORMAT_XRGB8888)
|
||||
ret = 1;
|
||||
else if (format == GBM_FORMAT_ARGB8888) {
|
||||
/* We can only scanout an ARGB buffer if the surface's
|
||||
* opaque region covers the whole output */
|
||||
pixman_region32_init(&r);
|
||||
pixman_region32_subtract(&r, &output->base.region,
|
||||
&es->opaque);
|
||||
|
||||
if (!pixman_region32_not_empty(&r))
|
||||
ret = 1;
|
||||
|
||||
pixman_region32_fini(&r);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct weston_plane *
|
||||
drm_output_prepare_scanout_surface(struct weston_output *_output,
|
||||
struct weston_surface *es)
|
||||
|
|
@ -297,10 +325,7 @@ drm_output_prepare_scanout_surface(struct weston_output *_output,
|
|||
if (!bo)
|
||||
return NULL;
|
||||
|
||||
/* Need to verify output->region contained in surface opaque
|
||||
* region. Or maybe just that format doesn't have alpha.
|
||||
* For now, scanout only if format is XRGB8888. */
|
||||
if (gbm_bo_get_format(bo) != GBM_FORMAT_XRGB8888) {
|
||||
if (!drm_output_check_scanout_format(output, es, bo)) {
|
||||
gbm_bo_destroy(bo);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue