diff options
-rw-r--r-- | src/gallium/state_trackers/vdpau/presentation.c | 32 | ||||
-rw-r--r-- | src/gallium/state_trackers/vdpau/surface.c | 2 | ||||
-rw-r--r-- | src/gallium/state_trackers/vdpau/vdpau_private.h | 1 |
3 files changed, 33 insertions, 2 deletions
diff --git a/src/gallium/state_trackers/vdpau/presentation.c b/src/gallium/state_trackers/vdpau/presentation.c index fadc57e70c0..fdd0144fe22 100644 --- a/src/gallium/state_trackers/vdpau/presentation.c +++ b/src/gallium/state_trackers/vdpau/presentation.c @@ -69,6 +69,7 @@ vlVdpPresentationQueueCreate(VdpDevice device, pq->device = dev; pq->compositor = context->create_compositor(context); + pq->drawable = pqt->drawable; if (!pq->compositor) { ret = VDP_STATUS_ERROR; goto no_compositor; @@ -130,7 +131,36 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue, uint32_t clip_height, VdpTime earliest_presentation_time) { - return VDP_STATUS_NO_IMPLEMENTATION; + vlVdpPresentationQueue *pq; + vlVdpOutputSurface *surf; + struct pipe_surface *drawable_surface; + + pq = vlGetDataHTAB(presentation_queue); + if (!pq) + return VDP_STATUS_INVALID_HANDLE; + + drawable_surface = vl_drawable_surface_get(pq->device->context, pq->drawable); + if (!drawable_surface) + return VDP_STATUS_INVALID_HANDLE; + + surf = vlGetDataHTAB(surface); + if (!surf) + return VDP_STATUS_INVALID_HANDLE; + + pq->compositor->clear_layers(pq->compositor); + pq->compositor->set_rgba_layer(pq->compositor, 0, surf->sampler_view, NULL, NULL); + pq->compositor->render_picture(pq->compositor, PIPE_MPEG12_PICTURE_TYPE_FRAME, + drawable_surface, NULL, NULL); + + pq->device->context->vpipe->screen->flush_frontbuffer + ( + pq->device->context->vpipe->screen, + drawable_surface->texture, + 0, 0, + vl_contextprivate_get(pq->device->context, drawable_surface) + ); + + return VDP_STATUS_OK; } VdpStatus diff --git a/src/gallium/state_trackers/vdpau/surface.c b/src/gallium/state_trackers/vdpau/surface.c index 496f647a8d0..f0aafae79b5 100644 --- a/src/gallium/state_trackers/vdpau/surface.c +++ b/src/gallium/state_trackers/vdpau/surface.c @@ -182,7 +182,7 @@ vlVdpVideoSurfacePutBitsYCbCr(VdpVideoSurface surface, for (i = 0; i < 3; ++i) { //TODO put nr of planes into util format struct pipe_sampler_view *sv = sampler_views[i]; - struct pipe_box dst_box = { 0, 0, sv->texture->width0, sv->texture->height0 }; + struct pipe_box dst_box = { 0, 0, 0, sv->texture->width0, sv->texture->height0, 1 }; context->upload_sampler(context, sv, &dst_box, source_data[i], source_pitches[i], 0, 0); } diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h index 25f289aa726..bd77507567f 100644 --- a/src/gallium/state_trackers/vdpau/vdpau_private.h +++ b/src/gallium/state_trackers/vdpau/vdpau_private.h @@ -183,6 +183,7 @@ typedef struct typedef struct { vlVdpDevice *device; + Drawable drawable; struct pipe_video_compositor *compositor; } vlVdpPresentationQueue; |