summaryrefslogtreecommitdiff
path: root/src/gallium/state_trackers/vdpau/mixer.c
diff options
context:
space:
mode:
authorChristian König <deathsimple@vodafone.de>2012-02-29 16:37:37 +0100
committerChristian König <deathsimple@vodafone.de>2012-03-05 16:51:16 +0100
commit4f5469f8d65fdeafe5b8410bbe20292b476b1ac9 (patch)
tree92fb5aaf8ca4c55a4d915d555500b3da69969414 /src/gallium/state_trackers/vdpau/mixer.c
parente363dd5c7d8ba40984d937ad7487abbb5be439bc (diff)
st/vdpau: implement support for extra mixer layers
Signed-off-by: Christian König <deathsimple@vodafone.de>
Diffstat (limited to 'src/gallium/state_trackers/vdpau/mixer.c')
-rw-r--r--src/gallium/state_trackers/vdpau/mixer.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c
index d3768175a2b..cad577d16b0 100644
--- a/src/gallium/state_trackers/vdpau/mixer.c
+++ b/src/gallium/state_trackers/vdpau/mixer.c
@@ -207,9 +207,9 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
uint32_t layer_count,
VdpLayer const *layers)
{
- struct u_rect src_rect, dst_rect, dst_clip;
enum vl_compositor_deinterlace deinterlace;
- unsigned layer = 0;
+ struct u_rect rect, clip;
+ unsigned i, layer = 0;
vlVdpVideoMixer *vmixer;
vlVdpSurface *surf;
@@ -249,7 +249,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
if (!bg)
return VDP_STATUS_INVALID_HANDLE;
vl_compositor_set_rgba_layer(&vmixer->cstate, compositor, layer++, bg->sampler_view,
- RectToPipe(background_source_rect, &src_rect), NULL, NULL);
+ RectToPipe(background_source_rect, &rect), NULL, NULL);
}
vl_compositor_clear_layers(&vmixer->cstate);
@@ -271,9 +271,24 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
return VDP_STATUS_INVALID_VIDEO_MIXER_PICTURE_STRUCTURE;
};
vl_compositor_set_buffer_layer(&vmixer->cstate, compositor, layer, surf->video_buffer,
- RectToPipe(video_source_rect, &src_rect), NULL, deinterlace);
- vl_compositor_set_layer_dst_area(&vmixer->cstate, layer++, RectToPipe(destination_video_rect, &dst_rect));
- vl_compositor_set_dst_clip(&vmixer->cstate, RectToPipe(destination_rect, &dst_clip));
+ RectToPipe(video_source_rect, &rect), NULL, deinterlace);
+ vl_compositor_set_layer_dst_area(&vmixer->cstate, layer++, RectToPipe(destination_video_rect, &rect));
+
+ for (i = 0; i < layer_count; ++i) {
+ vlVdpOutputSurface *src = vlGetDataHTAB(layers->source_surface);
+ if (!src)
+ return VDP_STATUS_INVALID_HANDLE;
+
+ assert(layers->struct_version == VDP_LAYER_VERSION);
+
+ vl_compositor_set_rgba_layer(&vmixer->cstate, compositor, layer, src->sampler_view,
+ RectToPipe(layers->source_rect, &rect), NULL, NULL);
+ vl_compositor_set_layer_dst_area(&vmixer->cstate, layer++, RectToPipe(layers->destination_rect, &rect));
+
+ ++layers;
+ }
+
+ vl_compositor_set_dst_clip(&vmixer->cstate, RectToPipe(destination_rect, &clip));
if (!vmixer->noise_reduction.filter && !vmixer->sharpness.filter)
vlVdpSave4DelayedRendering(vmixer->device, destination_surface, &vmixer->cstate);
else {