Mesa (pipe-video): vdpau: implement output surface creation

Christian König deathsimple at kemper.freedesktop.org
Fri Apr 8 16:40:07 PDT 2011


Module: Mesa
Branch: pipe-video
Commit: b98b58c76a2560b1db603e62f96c6641cedfa8e8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b98b58c76a2560b1db603e62f96c6641cedfa8e8

Author: Christian König <deathsimple at vodafone.de>
Date:   Fri Apr  8 19:21:13 2011 +0200

vdpau: implement output surface creation

---

 src/gallium/state_trackers/vdpau/output.c        |   50 ++++++++++++++++++++--
 src/gallium/state_trackers/vdpau/vdpau_private.h |    5 +-
 2 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c
index 90c6648..e95f333 100644
--- a/src/gallium/state_trackers/vdpau/output.c
+++ b/src/gallium/state_trackers/vdpau/output.c
@@ -1,6 +1,7 @@
 /**************************************************************************
  *
  * Copyright 2010 Thomas Balling Sørensen.
+ * Copyright 2011 Christian König.
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -25,17 +26,24 @@
  *
  **************************************************************************/
 
-#include "vdpau_private.h"
 #include <vdpau/vdpau.h>
+
 #include <util/u_debug.h>
 #include <util/u_memory.h>
 
+#include "vdpau_private.h"
+
 VdpStatus
 vlVdpOutputSurfaceCreate(VdpDevice device,
                          VdpRGBAFormat rgba_format,
                          uint32_t width, uint32_t height,
                          VdpOutputSurface  *surface)
 {
+   struct pipe_video_context *context;
+   struct pipe_resource res_tmpl, *res;
+   struct pipe_sampler_view sv_templ;
+   struct pipe_surface surf_templ;
+
    vlVdpOutputSurface *vlsurface = NULL;
 
    debug_printf("[VDPAU] Creating output surface\n");
@@ -46,13 +54,47 @@ vlVdpOutputSurfaceCreate(VdpDevice device,
    if (!dev)
       return VDP_STATUS_INVALID_HANDLE;
 
+   context = dev->context->vpipe;
+   if (!context)
+      return VDP_STATUS_INVALID_HANDLE;
+
    vlsurface = CALLOC(1, sizeof(vlVdpOutputSurface));
    if (!vlsurface)
       return VDP_STATUS_RESOURCES;
 
-   vlsurface->width = width;
-   vlsurface->height = height;
-   vlsurface->format = FormatRGBAToPipe(rgba_format);
+   memset(&res_tmpl, 0, sizeof(res_tmpl));
+
+   res_tmpl.target = PIPE_TEXTURE_2D;
+   res_tmpl.format = FormatRGBAToPipe(rgba_format);
+   res_tmpl.width0 = width;
+   res_tmpl.height0 = height;
+   res_tmpl.depth0 = 1;
+   res_tmpl.array_size = 1;
+   res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
+   res_tmpl.usage = PIPE_USAGE_STATIC;
+
+   res = context->screen->resource_create(context->screen, &res_tmpl);
+   if (!res) {
+      FREE(dev);
+      return VDP_STATUS_ERROR;
+   }
+
+   memset(&sv_templ, 0, sizeof(sv_templ));
+   u_sampler_view_default_template(&sv_templ, res, res->format);
+   vlsurface->sampler_view = context->create_sampler_view(context, res, &sv_templ);
+   if (!vlsurface->sampler_view) {
+      FREE(dev);
+      return VDP_STATUS_ERROR;
+   }
+
+   memset(&surf_templ, 0, sizeof(surf_templ));
+   surf_templ.format = res->format;
+   surf_templ.usage = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
+   vlsurface->surface = context->create_surface(context, res, &surf_templ);
+   if (!vlsurface->surface) {
+      FREE(dev);
+      return VDP_STATUS_ERROR;
+   }
 
    *surface = vlAddDataHTAB(vlsurface);
    if (*surface == 0) {
diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h
index d326784..dca755e 100644
--- a/src/gallium/state_trackers/vdpau/vdpau_private.h
+++ b/src/gallium/state_trackers/vdpau/vdpau_private.h
@@ -200,9 +200,8 @@ typedef struct
 typedef struct
 {
    vlVdpDevice *device;
-   uint32_t width;
-   uint32_t height;
-   enum pipe_format format;
+   struct pipe_surface *surface;
+   struct pipe_sampler_view *sampler_view;
 } vlVdpOutputSurface;
 
 typedef struct



More information about the mesa-commit mailing list