Mesa (gallium-resources): gallium: don' t use generic get_transfer func for textures

Keith Whitwell keithw at kemper.freedesktop.org
Sat Apr 10 11:49:39 UTC 2010


Module: Mesa
Branch: gallium-resources
Commit: 0189cb2fde9f5d7326fd4bfbc2e52db4cce73b3e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0189cb2fde9f5d7326fd4bfbc2e52db4cce73b3e

Author: Keith Whitwell <keithw at vmware.com>
Date:   Sat Apr 10 12:48:43 2010 +0100

gallium: don't use generic get_transfer func for textures

It doesn't know and can't fill in the stride value.

---

 src/gallium/auxiliary/util/u_transfer.c          |    4 +++
 src/gallium/drivers/i915/i915_resource_texture.c |   22 ++++++++++++++++++-
 src/gallium/drivers/i965/brw_resource_texture.c  |   25 +++++++++++++++++++++-
 3 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_transfer.c b/src/gallium/auxiliary/util/u_transfer.c
index 02e714f..bedace3 100644
--- a/src/gallium/auxiliary/util/u_transfer.c
+++ b/src/gallium/auxiliary/util/u_transfer.c
@@ -90,6 +90,10 @@ struct pipe_transfer * u_default_get_transfer(struct pipe_context *context,
    transfer->sr = sr;
    transfer->usage = usage;
    transfer->box = *box;
+
+   /* Note strides are zero, this is ok for buffers, but not for
+    * textures 2d & higher at least. 
+    */
    return transfer;
 }
 
diff --git a/src/gallium/drivers/i915/i915_resource_texture.c b/src/gallium/drivers/i915/i915_resource_texture.c
index 82c8fe2..b259968 100644
--- a/src/gallium/drivers/i915/i915_resource_texture.c
+++ b/src/gallium/drivers/i915/i915_resource_texture.c
@@ -653,6 +653,26 @@ i915_texture_destroy(struct pipe_screen *screen,
    FREE(tex);
 }
 
+static struct pipe_transfer * 
+i915_texture_get_transfer(struct pipe_context *context,
+			  struct pipe_resource *resource,
+			  struct pipe_subresource sr,
+			  unsigned usage,
+			  const struct pipe_box *box)
+{
+   struct i915_texture *tex = i915_texture(resource);
+   struct pipe_transfer *transfer = CALLOC_STRUCT(pipe_transfer);
+   if (transfer == NULL)
+      return NULL;
+
+   transfer->resource = resource;
+   transfer->sr = sr;
+   transfer->usage = usage;
+   transfer->box = *box;
+   transfer->stride = tex->stride;
+
+   return transfer;
+}
 
 
 static void *
@@ -707,7 +727,7 @@ struct u_resource_vtbl i915_texture_vtbl =
    i915_texture_get_handle,	      /* get_handle */
    i915_texture_destroy,	      /* resource_destroy */
    NULL,			      /* is_resource_referenced */
-   u_default_get_transfer,	      /* get_transfer */
+   i915_texture_get_transfer,	      /* get_transfer */
    u_default_transfer_destroy,	      /* transfer_destroy */
    i915_texture_transfer_map,	      /* transfer_map */
    u_default_transfer_flush_region,   /* transfer_flush_region */
diff --git a/src/gallium/drivers/i965/brw_resource_texture.c b/src/gallium/drivers/i965/brw_resource_texture.c
index b42aae4..a6f27b8 100644
--- a/src/gallium/drivers/i965/brw_resource_texture.c
+++ b/src/gallium/drivers/i965/brw_resource_texture.c
@@ -270,6 +270,29 @@ static unsigned brw_texture_is_referenced( struct pipe_context *pipe,
  * Transfer functions
  */
 
+
+static struct pipe_transfer * 
+brw_texture_get_transfer(struct pipe_context *context,
+			  struct pipe_resource *resource,
+			  struct pipe_subresource sr,
+			  unsigned usage,
+			  const struct pipe_box *box)
+{
+   struct brw_texture *tex = brw_texture(resource);
+   struct pipe_transfer *transfer = CALLOC_STRUCT(pipe_transfer);
+   if (transfer == NULL)
+      return NULL;
+
+   transfer->resource = resource;
+   transfer->sr = sr;
+   transfer->usage = usage;
+   transfer->box = *box;
+   transfer->stride = tex->pitch * tex->cpp;
+
+   return transfer;
+}
+
+
 static void *
 brw_texture_transfer_map(struct pipe_context *pipe,
                  struct pipe_transfer *transfer)
@@ -331,7 +354,7 @@ struct u_resource_vtbl brw_texture_vtbl =
    brw_texture_get_handle,	      /* get_handle */
    brw_texture_destroy,	      /* resource_destroy */
    brw_texture_is_referenced,	      /* is_resource_referenced */
-   u_default_get_transfer,	      /* get_transfer */
+   brw_texture_get_transfer,	      /* get_transfer */
    u_default_transfer_destroy,	      /* transfer_destroy */
    brw_texture_transfer_map,	      /* transfer_map */
    u_default_transfer_flush_region,   /* transfer_flush_region */




More information about the mesa-commit mailing list