summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers/vdpau/output.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/state_trackers/vdpau/output.c')
-rw-r--r--src/gallium/state_trackers/vdpau/output.c42
1 files changed, 28 insertions, 14 deletions
diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c
index caae50f37a2..3248f76808d 100644
--- a/src/gallium/state_trackers/vdpau/output.c
+++ b/src/gallium/state_trackers/vdpau/output.c
@@ -624,9 +624,9 @@ vlVdpOutputSurfaceRenderOutputSurface(VdpOutputSurface destination_surface,
uint32_t flags)
{
vlVdpOutputSurface *dst_vlsurface;
- vlVdpOutputSurface *src_vlsurface;
struct pipe_context *context;
+ struct pipe_sampler_view *src_sv;
struct vl_compositor *compositor;
struct vl_compositor_state *cstate;
@@ -639,12 +639,19 @@ vlVdpOutputSurfaceRenderOutputSurface(VdpOutputSurface destination_surface,
if (!dst_vlsurface)
return VDP_STATUS_INVALID_HANDLE;
- src_vlsurface = vlGetDataHTAB(source_surface);
- if (!src_vlsurface)
- return VDP_STATUS_INVALID_HANDLE;
+ if (source_surface == VDP_INVALID_HANDLE) {
+ src_sv = dst_vlsurface->device->dummy_sv;
+
+ } else {
+ vlVdpOutputSurface *src_vlsurface = vlGetDataHTAB(source_surface);
+ if (!src_vlsurface)
+ return VDP_STATUS_INVALID_HANDLE;
- if (dst_vlsurface->device != src_vlsurface->device)
- return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
+ if (dst_vlsurface->device != src_vlsurface->device)
+ return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
+
+ src_sv = src_vlsurface->sampler_view;
+ }
pipe_mutex_lock(dst_vlsurface->device->mutex);
vlVdpResolveDelayedRendering(dst_vlsurface->device, NULL, NULL);
@@ -657,7 +664,7 @@ vlVdpOutputSurfaceRenderOutputSurface(VdpOutputSurface destination_surface,
vl_compositor_clear_layers(cstate);
vl_compositor_set_layer_blend(cstate, 0, blend, false);
- vl_compositor_set_rgba_layer(cstate, compositor, 0, src_vlsurface->sampler_view,
+ vl_compositor_set_rgba_layer(cstate, compositor, 0, src_sv,
RectToPipe(source_rect, &src_rect), NULL,
ColorsToPipe(colors, flags, vlcolors));
STATIC_ASSERT(VL_COMPOSITOR_ROTATE_0 == VDP_OUTPUT_SURFACE_RENDER_ROTATE_0);
@@ -688,9 +695,9 @@ vlVdpOutputSurfaceRenderBitmapSurface(VdpOutputSurface destination_surface,
uint32_t flags)
{
vlVdpOutputSurface *dst_vlsurface;
- vlVdpBitmapSurface *src_vlsurface;
struct pipe_context *context;
+ struct pipe_sampler_view *src_sv;
struct vl_compositor *compositor;
struct vl_compositor_state *cstate;
@@ -703,12 +710,19 @@ vlVdpOutputSurfaceRenderBitmapSurface(VdpOutputSurface destination_surface,
if (!dst_vlsurface)
return VDP_STATUS_INVALID_HANDLE;
- src_vlsurface = vlGetDataHTAB(source_surface);
- if (!src_vlsurface)
- return VDP_STATUS_INVALID_HANDLE;
+ if (source_surface == VDP_INVALID_HANDLE) {
+ src_sv = dst_vlsurface->device->dummy_sv;
+
+ } else {
+ vlVdpBitmapSurface *src_vlsurface = vlGetDataHTAB(source_surface);
+ if (!src_vlsurface)
+ return VDP_STATUS_INVALID_HANDLE;
- if (dst_vlsurface->device != src_vlsurface->device)
- return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
+ if (dst_vlsurface->device != src_vlsurface->device)
+ return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
+
+ src_sv = src_vlsurface->sampler_view;
+ }
context = dst_vlsurface->device->context;
compositor = &dst_vlsurface->device->compositor;
@@ -721,7 +735,7 @@ vlVdpOutputSurfaceRenderBitmapSurface(VdpOutputSurface destination_surface,
vl_compositor_clear_layers(cstate);
vl_compositor_set_layer_blend(cstate, 0, blend, false);
- vl_compositor_set_rgba_layer(cstate, compositor, 0, src_vlsurface->sampler_view,
+ vl_compositor_set_rgba_layer(cstate, compositor, 0, src_sv,
RectToPipe(source_rect, &src_rect), NULL,
ColorsToPipe(colors, flags, vlcolors));
vl_compositor_set_layer_rotation(cstate, 0, flags & 3);