Only compile tested! Signed-off-by: Christian König <deathsim...@vodafone.de> --- src/gallium/state_trackers/vdpau/bitmap.c | 15 +-------------- src/gallium/state_trackers/vdpau/output.c | 21 ++++++++++++++++++++- src/gallium/state_trackers/vdpau/vdpau_private.h | 22 ++++++++++++++++++++++ 3 files changed, 43 insertions(+), 15 deletions(-)
diff --git a/src/gallium/state_trackers/vdpau/bitmap.c b/src/gallium/state_trackers/vdpau/bitmap.c index 0b885c8..bfabd05 100644 --- a/src/gallium/state_trackers/vdpau/bitmap.c +++ b/src/gallium/state_trackers/vdpau/bitmap.c @@ -180,20 +180,7 @@ vlVdpBitmapSurfacePutBitsNative(VdpBitmapSurface surface, vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL); - dst_box.x = 0; - dst_box.y = 0; - dst_box.z = 0; - dst_box.width = vlsurface->sampler_view->texture->width0; - dst_box.height = vlsurface->sampler_view->texture->height0; - dst_box.depth = 1; - - if (destination_rect) { - dst_box.x = MIN2(destination_rect->x0, destination_rect->x1); - dst_box.y = MIN2(destination_rect->y0, destination_rect->y1); - dst_box.width = abs(destination_rect->x1 - destination_rect->x0); - dst_box.height = abs(destination_rect->y1 - destination_rect->y0); - } - + dst_box = RectToPipeBox(destination_rect, vlsurface->sampler_view->texture); pipe->transfer_inline_write(pipe, vlsurface->sampler_view->texture, 0, PIPE_TRANSFER_WRITE, &dst_box, *source_data, *source_pitches, 0); diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c index fc56803..b58d05d 100644 --- a/src/gallium/state_trackers/vdpau/output.c +++ b/src/gallium/state_trackers/vdpau/output.c @@ -187,7 +187,26 @@ vlVdpOutputSurfacePutBitsNative(VdpOutputSurface surface, uint32_t const *source_pitches, VdpRect const *destination_rect) { - return VDP_STATUS_NO_IMPLEMENTATION; + vlVdpOutputSurface *vlsurface; + struct pipe_box dst_box; + struct pipe_context *pipe; + + 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); + + dst_box = RectToPipeBox(destination_rect, vlsurface->sampler_view->texture); + pipe->transfer_inline_write(pipe, vlsurface->sampler_view->texture, 0, + PIPE_TRANSFER_WRITE, &dst_box, *source_data, + *source_pitches, 0); + + return VDP_STATUS_OK; } /** diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h index 2d9f775..2f9f37b 100644 --- a/src/gallium/state_trackers/vdpau/vdpau_private.h +++ b/src/gallium/state_trackers/vdpau/vdpau_private.h @@ -283,6 +283,28 @@ RectToPipe(const VdpRect *src, struct u_rect *dst) return NULL; } +static inline struct pipe_box +RectToPipeBox(const VdpRect *rect, struct pipe_resource *res) +{ + struct pipe_box box; + + box.x = 0; + box.y = 0; + box.z = 0; + box.width = res->width0; + box.height = res->height0; + box.depth = 1; + + if (rect) { + box.x = MIN2(rect->x0, rect->x1); + box.y = MIN2(rect->y0, rect->y1); + box.width = abs(rect->x1 - rect->x0); + box.height = abs(rect->y1 - rect->y0); + } + + return box; +} + typedef struct { struct vl_screen *vscreen; -- 1.7.5.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev