compositor-drm: Allow scanning out of opaque ARGB surfaces
This commit is contained in:
parent
4fbb65372e
commit
e920941032
@ -305,6 +305,34 @@ drm_fb_set_buffer(struct drm_fb *fb, struct wl_buffer *buffer)
|
||||
&fb->buffer_destroy_listener);
|
||||
}
|
||||
|
||||
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)
|
||||
@ -330,10 +358,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…
Reference in New Issue
Block a user