summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian König <[email protected]>2012-02-26 11:33:55 +0100
committerChristian König <[email protected]>2012-03-02 13:14:22 +0100
commitabf31e3822665b6bdf5ac78b757a21522c9448b1 (patch)
tree83e3dcad9c51236112c8e535cd2443b6386d7545 /src
parent2ec6af0c638da5ebd196e8071630f09a5472b9e4 (diff)
st/vdpau: implement OutputSurfaceRenderBitmapSurface
Signed-off-by: Christian König <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/state_trackers/vdpau/output.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c
index 512ee944684..67c7a94c0d3 100644
--- a/src/gallium/state_trackers/vdpau/output.c
+++ b/src/gallium/state_trackers/vdpau/output.c
@@ -500,5 +500,44 @@ vlVdpOutputSurfaceRenderBitmapSurface(VdpOutputSurface destination_surface,
VdpOutputSurfaceRenderBlendState const *blend_state,
uint32_t flags)
{
- return VDP_STATUS_NO_IMPLEMENTATION;
+ vlVdpOutputSurface *dst_vlsurface;
+ vlVdpBitmapSurface *src_vlsurface;
+
+ struct pipe_context *context;
+ struct vl_compositor *compositor;
+ struct vl_compositor_state *cstate;
+
+ struct u_rect src_rect, dst_rect;
+
+ void *blend;
+
+ dst_vlsurface = vlGetDataHTAB(destination_surface);
+ if (!dst_vlsurface)
+ return VDP_STATUS_INVALID_HANDLE;
+
+ 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;
+
+ vlVdpResolveDelayedRendering(dst_vlsurface->device, NULL, NULL);
+
+ context = dst_vlsurface->device->context;
+ compositor = &dst_vlsurface->device->compositor;
+ cstate = &dst_vlsurface->cstate;
+
+ blend = BlenderToPipe(context, blend_state);
+
+ 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,
+ RectToPipe(source_rect, &src_rect), NULL, NULL);
+ vl_compositor_set_layer_dst_area(cstate, 0, RectToPipe(destination_rect, &dst_rect));
+ vl_compositor_render(cstate, compositor, dst_vlsurface->surface, NULL);
+
+ context->delete_blend_state(context, blend);
+
+ return VDP_STATUS_OK;
}