diff options
-rw-r--r-- | src/gallium/state_trackers/vdpau/output.c | 7 | ||||
-rw-r--r-- | src/gallium/state_trackers/vdpau/presentation.c | 6 | ||||
-rw-r--r-- | src/gallium/state_trackers/vdpau/vdpau_private.h | 1 |
3 files changed, 11 insertions, 3 deletions
diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c index 98a8011f0a6..8b26f7a81ab 100644 --- a/src/gallium/state_trackers/vdpau/output.c +++ b/src/gallium/state_trackers/vdpau/output.c @@ -75,6 +75,13 @@ vlVdpOutputSurfaceCreate(VdpDevice device, memset(&res_tmpl, 0, sizeof(res_tmpl)); + /* + * The output won't look correctly when this buffer is send to X, + * if the VDPAU RGB component order doesn't match the X11 one so + * we only allow the X11 format + */ + vlsurface->send_to_X = rgba_format == VDP_RGBA_FORMAT_B8G8R8A8; + res_tmpl.target = PIPE_TEXTURE_2D; res_tmpl.format = VdpFormatRGBAToPipe(rgba_format); res_tmpl.width0 = width; diff --git a/src/gallium/state_trackers/vdpau/presentation.c b/src/gallium/state_trackers/vdpau/presentation.c index d4793692f90..78cafc81afe 100644 --- a/src/gallium/state_trackers/vdpau/presentation.c +++ b/src/gallium/state_trackers/vdpau/presentation.c @@ -231,7 +231,7 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue, vscreen = pq->device->vscreen; pipe_mutex_lock(pq->device->mutex); - if (vscreen->set_back_texture_from_output) + if (vscreen->set_back_texture_from_output && surf->send_to_X) vscreen->set_back_texture_from_output(vscreen, surf->surface->texture, clip_width, clip_height); tex = vscreen->texture_from_drawable(vscreen, (void *)pq->drawable); if (!tex) { @@ -239,7 +239,7 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue, return VDP_STATUS_INVALID_HANDLE; } - if (!vscreen->set_back_texture_from_output) { + if (!vscreen->set_back_texture_from_output || !surf->send_to_X) { dirty_area = vscreen->get_dirty_area(vscreen); memset(&surf_templ, 0, sizeof(surf_templ)); @@ -289,7 +289,7 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue, framenum++; } - if (!vscreen->set_back_texture_from_output) { + if (!vscreen->set_back_texture_from_output || !surf->send_to_X) { pipe_resource_reference(&tex, NULL); pipe_surface_reference(&surf_draw, NULL); } diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h index 490a0bd308a..8356608f6d7 100644 --- a/src/gallium/state_trackers/vdpau/vdpau_private.h +++ b/src/gallium/state_trackers/vdpau/vdpau_private.h @@ -415,6 +415,7 @@ typedef struct struct pipe_fence_handle *fence; struct vl_compositor_state cstate; struct u_rect dirty_area; + bool send_to_X; } vlVdpOutputSurface; typedef struct |