i915g: Use alignment of 64 instead of 16 for buffer allocation
[mesa.git] / src / gallium / drivers / i915 / i915_resource_buffer.c
index d2f8afeee7cbea9c16b66bc8d2df1eb20b0822cf..9fb3855a37ef496a8abea87fbdf0ab20f123b6dc 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  * 
- * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2006 VMware, Inc.
  * All Rights Reserved.
  * 
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -18,7 +18,7 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  **************************************************************************/
  /*
   * Authors:
-  *   Keith Whitwell <keith@tungstengraphics.com>
-  *   Michel Dänzer <michel@tungstengraphics.com>
+  *   Keith Whitwell <keithw@vmware.com>
+  *   Michel Dänzer <daenzer@vmware.com>
   */
 
 #include "pipe/p_context.h"
 #include "pipe/p_defines.h"
 #include "util/u_inlines.h"
-#include "util/u_format.h"
 #include "util/u_math.h"
 #include "util/u_memory.h"
 
@@ -62,29 +61,52 @@ i915_buffer_destroy(struct pipe_screen *screen,
 
 
 static void *
-i915_buffer_transfer_map( struct pipe_context *pipe,
-                         struct pipe_transfer *transfer )
+i915_buffer_transfer_map(struct pipe_context *pipe,
+                         struct pipe_resource *resource,
+                         unsigned level,
+                         unsigned usage,
+                         const struct pipe_box *box,
+                         struct pipe_transfer **ptransfer)
 {
-   struct i915_buffer *buffer = i915_buffer(transfer->resource);
+   struct i915_context *i915 = i915_context(pipe);
+   struct i915_buffer *buffer = i915_buffer(resource);
+   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;
+   *ptransfer = transfer;
+
    return buffer->data + transfer->box.x;
 }
 
+static void
+i915_buffer_transfer_unmap(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_inline_write( struct pipe_context *rm_ctx,
-                                  struct pipe_resource *resource,
-                                  struct pipe_subresource sr,
-                                  unsigned usage,
-                                  const struct pipe_box *box,
-                                  const void *data,
-                                  unsigned stride,
-                                  unsigned slice_stride)
+                                   struct pipe_resource *resource,
+                                   unsigned level,
+                                   unsigned usage,
+                                   const struct pipe_box *box,
+                                   const void *data,
+                                   unsigned stride,
+                                   unsigned layer_stride)
 {
    struct i915_buffer *buffer = i915_buffer(resource);
 
    memcpy(buffer->data + box->x,
-         data,
-         box->width);
+          data,
+          box->width);
 }
 
 
@@ -92,12 +114,9 @@ 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_buffer_transfer_map,        /* transfer_map */
    u_default_transfer_flush_region,  /* transfer_flush_region */
-   u_default_transfer_unmap,        /* transfer_unmap */
+   i915_buffer_transfer_unmap,      /* transfer_unmap */
    i915_buffer_transfer_inline_write /* transfer_inline_write */
 };
 
@@ -116,8 +135,7 @@ i915_buffer_create(struct pipe_screen *screen,
    buf->b.vtbl = &i915_buffer_vtbl;
    pipe_reference_init(&buf->b.b.reference, 1);
    buf->b.b.screen = screen;
-   
-   buf->data = MALLOC(template->width0);
+   buf->data = align_malloc(template->width0, 64);
    buf->free_on_destroy = TRUE;
 
    if (!buf->data)
@@ -136,7 +154,7 @@ struct pipe_resource *
 i915_user_buffer_create(struct pipe_screen *screen,
                         void *ptr,
                         unsigned bytes,
-                       unsigned bind)
+                        unsigned bind)
 {
    struct i915_buffer *buf = CALLOC_STRUCT(i915_buffer);
 
@@ -147,12 +165,13 @@ i915_user_buffer_create(struct pipe_screen *screen,
    buf->b.vtbl = &i915_buffer_vtbl;
    buf->b.b.screen = screen;
    buf->b.b.format = PIPE_FORMAT_R8_UNORM; /* ?? */
-   buf->b.b._usage = PIPE_USAGE_IMMUTABLE;
+   buf->b.b.usage = PIPE_USAGE_IMMUTABLE;
    buf->b.b.bind = bind;
    buf->b.b.flags = 0;
    buf->b.b.width0 = bytes;
    buf->b.b.height0 = 1;
    buf->b.b.depth0 = 1;
+   buf->b.b.array_size = 1;
 
    buf->data = ptr;
    buf->free_on_destroy = FALSE;