[Mesa-dev] [PATCH 17/25] st/vdpau: implement OutputSurfacePutBitsNative

Christian König deathsimple at vodafone.de
Mon Feb 27 08:25:45 PST 2012


Only compile tested!

Signed-off-by: Christian König <deathsimple at 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



More information about the mesa-dev mailing list