Mesa (master): i915g: Use slab allocator for transfers

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Fri Jan 21 19:55:16 UTC 2011


Module: Mesa
Branch: master
Commit: 7287964f944d7e2bcf409b758163ab75c61b0f8e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7287964f944d7e2bcf409b758163ab75c61b0f8e

Author: Jakob Bornecrantz <wallbraker at gmail.com>
Date:   Fri Dec  3 19:42:45 2010 +0100

i915g: Use slab allocator for transfers

Also remove unused i915_transfer struct

---

 src/gallium/drivers/i915/i915_context.c          |    4 ++
 src/gallium/drivers/i915/i915_context.h          |    4 ++
 src/gallium/drivers/i915/i915_resource_buffer.c  |   36 ++++++++++++++++++++-
 src/gallium/drivers/i915/i915_resource_texture.c |   16 ++++++++--
 src/gallium/drivers/i915/i915_screen.h           |   16 ----------
 5 files changed, 55 insertions(+), 21 deletions(-)

diff --git a/src/gallium/drivers/i915/i915_context.c b/src/gallium/drivers/i915/i915_context.c
index 9be3161..9d43381 100644
--- a/src/gallium/drivers/i915/i915_context.c
+++ b/src/gallium/drivers/i915/i915_context.c
@@ -140,6 +140,10 @@ i915_create_context(struct pipe_screen *screen, void *priv)
 
    i915->base.draw_vbo = i915_draw_vbo;
 
+   /* init this before draw */
+   util_slab_create(&i915->transfer_pool, sizeof(struct pipe_transfer),
+                    16, UTIL_SLAB_SINGLETHREADED);
+
    /*
     * Create drawing context and plug our rendering stage into it.
     */
diff --git a/src/gallium/drivers/i915/i915_context.h b/src/gallium/drivers/i915/i915_context.h
index d15e172..1bf9cde 100644
--- a/src/gallium/drivers/i915/i915_context.h
+++ b/src/gallium/drivers/i915/i915_context.h
@@ -37,6 +37,8 @@
 
 #include "tgsi/tgsi_scan.h"
 
+#include "util/u_slab.h"
+
 
 struct i915_winsys;
 struct i915_winsys_buffer;
@@ -237,6 +239,8 @@ struct i915_context {
 
    struct i915_state current;
    unsigned hardware_dirty;
+
+   struct util_slab_mempool transfer_pool;
 };
 
 /* A flag for each state_tracker state object:
diff --git a/src/gallium/drivers/i915/i915_resource_buffer.c b/src/gallium/drivers/i915/i915_resource_buffer.c
index 450203d..6e2b490 100644
--- a/src/gallium/drivers/i915/i915_resource_buffer.c
+++ b/src/gallium/drivers/i915/i915_resource_buffer.c
@@ -60,6 +60,38 @@ i915_buffer_destroy(struct pipe_screen *screen,
 }
 
 
+static struct pipe_transfer *
+i915_get_transfer(struct pipe_context *pipe,
+                  struct pipe_resource *resource,
+                  unsigned level,
+                  unsigned usage,
+                  const struct pipe_box *box)
+{
+   struct i915_context *i915 = i915_context(pipe);
+   struct pipe_transfer *transfer = util_slab_alloc(&i915->transfer_pool);
+
+   if (transfer == NULL)
+      return NULL;
+
+   transfer->resource = resource;
+   transfer->level = level;
+   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;
+}
+
+static void
+i915_transfer_destroy(struct pipe_context *pipe,
+                      struct pipe_transfer *transfer)
+{
+   struct i915_context *i915 = i915_context(pipe);
+   util_slab_free(&i915->transfer_pool, transfer);
+}
+
 static void *
 i915_buffer_transfer_map( struct pipe_context *pipe,
                           struct pipe_transfer *transfer )
@@ -92,8 +124,8 @@ struct u_resource_vtbl i915_buffer_vtbl =
    i915_buffer_get_handle,	     /* get_handle */
    i915_buffer_destroy,		     /* resource_destroy */
    NULL,			     /* is_resource_referenced */
-   u_default_get_transfer,	     /* get_transfer */
-   u_default_transfer_destroy,	     /* transfer_destroy */
+   i915_get_transfer,		     /* get_transfer */
+   i915_transfer_destroy,	     /* transfer_destroy */
    i915_buffer_transfer_map,	     /* transfer_map */
    u_default_transfer_flush_region,  /* transfer_flush_region */
    u_default_transfer_unmap,	     /* transfer_unmap */
diff --git a/src/gallium/drivers/i915/i915_resource_texture.c b/src/gallium/drivers/i915/i915_resource_texture.c
index f19106f..e793d12 100644
--- a/src/gallium/drivers/i915/i915_resource_texture.c
+++ b/src/gallium/drivers/i915/i915_resource_texture.c
@@ -716,14 +716,16 @@ i915_texture_destroy(struct pipe_screen *screen,
 }
 
 static struct pipe_transfer * 
-i915_texture_get_transfer(struct pipe_context *context,
+i915_texture_get_transfer(struct pipe_context *pipe,
                           struct pipe_resource *resource,
                           unsigned level,
                           unsigned usage,
                           const struct pipe_box *box)
 {
+   struct i915_context *i915 = i915_context(pipe);
    struct i915_texture *tex = i915_texture(resource);
-   struct pipe_transfer *transfer = CALLOC_STRUCT(pipe_transfer);
+   struct pipe_transfer *transfer = util_slab_alloc(&i915->transfer_pool);
+
    if (transfer == NULL)
       return NULL;
 
@@ -737,6 +739,14 @@ i915_texture_get_transfer(struct pipe_context *context,
    return transfer;
 }
 
+static void
+i915_transfer_destroy(struct pipe_context *pipe,
+                      struct pipe_transfer *transfer)
+{
+   struct i915_context *i915 = i915_context(pipe);
+   util_slab_free(&i915->transfer_pool, transfer);
+}
+
 static void *
 i915_texture_transfer_map(struct pipe_context *pipe,
                           struct pipe_transfer *transfer)
@@ -781,7 +791,7 @@ struct u_resource_vtbl i915_texture_vtbl =
    i915_texture_destroy,	      /* resource_destroy */
    NULL,			      /* is_resource_referenced */
    i915_texture_get_transfer,	      /* get_transfer */
-   u_default_transfer_destroy,	      /* transfer_destroy */
+   i915_transfer_destroy,	      /* transfer_destroy */
    i915_texture_transfer_map,	      /* transfer_map */
    u_default_transfer_flush_region,   /* transfer_flush_region */
    i915_texture_transfer_unmap,	      /* transfer_unmap */
diff --git a/src/gallium/drivers/i915/i915_screen.h b/src/gallium/drivers/i915/i915_screen.h
index 0c4186c..bb4d255 100644
--- a/src/gallium/drivers/i915/i915_screen.h
+++ b/src/gallium/drivers/i915/i915_screen.h
@@ -47,16 +47,6 @@ struct i915_screen
    boolean is_i945;
 };
 
-/**
- * Subclass of pipe_transfer
- */
-struct i915_transfer
-{
-   struct pipe_transfer base;
-
-   unsigned offset;
-};
-
 
 /*
  * Cast wrappers
@@ -69,11 +59,5 @@ i915_screen(struct pipe_screen *pscreen)
    return (struct i915_screen *) pscreen;
 }
 
-static INLINE struct i915_transfer *
-i915_transfer(struct pipe_transfer *transfer)
-{
-   return (struct i915_transfer *)transfer;
-}
-
 
 #endif /* I915_SCREEN_H */




More information about the mesa-commit mailing list