diff options
author | Christian König <[email protected]> | 2012-02-26 13:01:55 +0100 |
---|---|---|
committer | Christian König <[email protected]> | 2012-03-02 13:37:59 +0100 |
commit | 507fd8026ad2ade8bc79f5852ec20ad74503cc7f (patch) | |
tree | 09ec15fdfee51a8bb8b9d82bf70ab103dda7fa79 /src | |
parent | 494e0025d995fb2cab04474d13880ee438b0c868 (diff) |
st/vdpau: implement OutputSurfaceGetBitsNative
Signed-off-by: Christian König <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/state_trackers/vdpau/output.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c index c5d26895583..56ce315db7f 100644 --- a/src/gallium/state_trackers/vdpau/output.c +++ b/src/gallium/state_trackers/vdpau/output.c @@ -173,7 +173,42 @@ vlVdpOutputSurfaceGetBitsNative(VdpOutputSurface surface, void *const *destination_data, uint32_t const *destination_pitches) { - return VDP_STATUS_NO_IMPLEMENTATION; + vlVdpOutputSurface *vlsurface; + struct pipe_context *pipe; + struct pipe_resource *res; + struct pipe_box box; + struct pipe_transfer *transfer; + uint8_t *map; + + vlsurface = vlGetDataHTAB(surface); + if (!vlsurface) + return VDP_STATUS_INVALID_HANDLE; + + pipe = vlsurface->device->context; + if (!pipe) + return VDP_STATUS_INVALID_HANDLE; + + vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL); + + res = vlsurface->sampler_view->texture; + box = RectToPipeBox(source_rect, res); + transfer = pipe->get_transfer(pipe, res, 0, PIPE_TRANSFER_READ, &box); + if (transfer == NULL) + return VDP_STATUS_RESOURCES; + + map = pipe_transfer_map(pipe, transfer); + if (map == NULL) { + pipe_transfer_destroy(pipe, transfer); + return VDP_STATUS_RESOURCES; + } + + util_copy_rect(*destination_data, res->format, *destination_pitches, 0, 0, + box.width, box.height, map, transfer->stride, 0, 0); + + pipe_transfer_unmap(pipe, transfer); + pipe_transfer_destroy(pipe, transfer); + + return VDP_STATUS_OK; } /** |