diff options
author | Christian König <[email protected]> | 2012-02-29 16:37:37 +0100 |
---|---|---|
committer | Christian König <[email protected]> | 2012-03-05 16:51:16 +0100 |
commit | 4f5469f8d65fdeafe5b8410bbe20292b476b1ac9 (patch) | |
tree | 92fb5aaf8ca4c55a4d915d555500b3da69969414 /src/gallium/state_trackers/vdpau | |
parent | e363dd5c7d8ba40984d937ad7487abbb5be439bc (diff) |
st/vdpau: implement support for extra mixer layers
Signed-off-by: Christian König <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers/vdpau')
-rw-r--r-- | src/gallium/state_trackers/vdpau/mixer.c | 27 |
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 { |