st/vdpau: implement OutputSurfacePutBitsNative

Signed-off-by: Christian König <deathsimple@vodafone.de>
This commit is contained in:
Christian König 2012-02-26 12:40:47 +01:00
parent a0571b135e
commit 494e0025d9
3 changed files with 43 additions and 15 deletions

View file

@ -179,20 +179,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);

View file

@ -186,7 +186,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;
}
/**

View file

@ -285,6 +285,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;