[Mesa-dev] [PATCH 18/25] st/vdpau: implement OutputSurfaceGetBitsNative
Christian König
deathsimple at vodafone.de
Mon Feb 27 08:25:46 PST 2012
Only compile tested!
Signed-off-by: Christian König <deathsimple at vodafone.de>
---
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 b58d05d..886b046 100644
--- a/src/gallium/state_trackers/vdpau/output.c
+++ b/src/gallium/state_trackers/vdpau/output.c
@@ -174,7 +174,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;
}
/**
--
1.7.5.4
More information about the mesa-dev
mailing list