diff options
Diffstat (limited to 'src/gallium/state_trackers/vdpau/output.c')
-rw-r--r-- | src/gallium/state_trackers/vdpau/output.c | 42 |
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); |