Use lower alignments where possible. Also pad out allocated blocks to
authorKeith Whitwell <keith@tungstengraphics.com>
Thu, 7 Sep 2006 16:23:22 +0000 (16:23 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Thu, 7 Sep 2006 16:23:22 +0000 (16:23 +0000)
a multiple of alignment to avoid accumulating unusable free blocks.

src/mesa/drivers/dri/i965/brw_state_pool.c
src/mesa/drivers/dri/i965/brw_wm_state.c
src/mesa/drivers/dri/i965/bufmgr.h
src/mesa/drivers/dri/i965/bufmgr_fake.c
src/mesa/drivers/dri/i965/intel_batchbuffer.c
src/mesa/drivers/dri/i965/intel_buffer_objects.c
src/mesa/drivers/dri/i965/intel_regions.c

index 60565bf83cbbb8d2b84d7753d7fa776d3476a5d9..2b469638cff439489336e31b4220655349569312 100644 (file)
@@ -95,7 +95,7 @@ static void brw_init_pool( struct brw_context *brw,
    pool->size = size;   
    pool->brw = brw;
    
-   bmGenBuffers(&brw->intel, "pool", 1, &pool->buffer);
+   bmGenBuffers(&brw->intel, "pool", 1, &pool->buffer, 0);
 
    /* Also want to say not to wait on fences when data is presented
     */
index accf1243ec46af8802f23914a0748bfdce61e1e0..4707a709e779815818224ae3e7f6366286c913f9 100644 (file)
@@ -79,7 +79,7 @@ static void upload_wm_unit(struct brw_context *brw )
        */      
 
       if (!brw->wm.scratch_buffer) {
-        bmGenBuffers(intel, "wm scratch", 1, &brw->wm.scratch_buffer);
+        bmGenBuffers(intel, "wm scratch", 1, &brw->wm.scratch_buffer, 12);
         bmBufferSetInvalidateCB(intel,
                                 brw->wm.scratch_buffer,
                                 invalidate_scratch_cb,
index 50fbcda50b55d8470ce4573963ddcadec43d956a..63e1011a76836fa414e01c289401d9d604f66364 100644 (file)
@@ -84,7 +84,8 @@ int bmInitPool( struct intel_context *,
  * understood, and drivers can just pass the calls through without too
  * much thunking.
  */
-void bmGenBuffers(struct intel_context *, const char *, unsigned n, struct buffer **buffers);
+void bmGenBuffers(struct intel_context *, const char *, unsigned n, struct buffer **buffers,
+                 int align );
 void bmDeleteBuffers(struct intel_context *, unsigned n, struct buffer **buffers);
 
 
index b9f1553c74dda8659251ea960493c676e71f1ab9..1cb3f67b349a0a9f2ff80a7eab7d041fde634693 100644 (file)
@@ -163,10 +163,16 @@ static GLboolean alloc_from_pool( struct intel_context *intel,
    struct bufmgr *bm = intel->bm;
    struct pool *pool = &bm->pool[pool_nr];
    struct block *block = (struct block *)calloc(sizeof *block, 1);
+   GLuint sz, align = (1<<buf->alignment);
+
    if (!block)
       return GL_FALSE;
 
-   block->mem = mmAllocMem(pool->heap, buf->size, buf->alignment, 0);
+   sz = (buf->size + align-1) & ~(align-1);
+
+   block->mem = mmAllocMem(pool->heap, 
+                          sz, 
+                          buf->alignment, 0);
    if (!block->mem) {
       free(block);
       return GL_FALSE;
@@ -621,14 +627,14 @@ int bmInitPool( struct intel_context *intel,
    return retval;
 }
 
-static struct buffer *do_GenBuffer(struct intel_context *intel, const char *name)
+static struct buffer *do_GenBuffer(struct intel_context *intel, const char *name, int align)
 {
    struct bufmgr *bm = intel->bm;
    struct buffer *buf = calloc(sizeof(*buf), 1);
 
    buf->id = ++bm->buf_nr;
    buf->name = name;
-   buf->alignment = 12;        /* page-alignment to fit in with AGP swapping */
+   buf->alignment = align ? align : 6; 
    buf->flags = BM_MEM_AGP|BM_MEM_VRAM|BM_MEM_LOCAL;
 
    return buf;
@@ -638,7 +644,8 @@ static struct buffer *do_GenBuffer(struct intel_context *intel, const char *name
 
 void bmGenBuffers(struct intel_context *intel, 
                  const char *name, unsigned n, 
-                 struct buffer **buffers)
+                 struct buffer **buffers,
+                 int align )
 {
    struct bufmgr *bm = intel->bm;
    LOCK(bm);
@@ -646,7 +653,7 @@ void bmGenBuffers(struct intel_context *intel,
       int i;
 
       for (i = 0; i < n; i++)
-        buffers[i] = do_GenBuffer(intel, name);
+        buffers[i] = do_GenBuffer(intel, name, align);
    }
    UNLOCK(bm);
 }
@@ -694,7 +701,7 @@ struct buffer *bmGenBufferStatic(struct intel_context *intel,
       if (bm->pool[pool].static_buffer)
         buf = bm->pool[pool].static_buffer;
       else {
-        buf = do_GenBuffer(intel, "static");
+        buf = do_GenBuffer(intel, "static", 12);
    
         bm->pool[pool].static_buffer = buf;
         assert(!buf->block);
index 441412a7c285460c7f92526b94f430b8146053bc..7510ac5b92048e1d80ed3ab794e8aff4ce130b46 100644 (file)
@@ -92,7 +92,7 @@ struct intel_batchbuffer *intel_batchbuffer_alloc( struct intel_context *intel )
 
    batch->intel = intel;
 
-   bmGenBuffers(intel, "batch", 1, &batch->buffer);
+   bmGenBuffers(intel, "batch", 1, &batch->buffer, 12);
 
    bmBufferSetInvalidateCB(intel, batch->buffer,
                           intel_batchbuffer_reset_cb,
index 0f88583635a15420c12fb2e195544aae434f70bc..015e433fd7a701866c0727e03b495eb29376a07b 100644 (file)
@@ -52,7 +52,7 @@ static struct gl_buffer_object *intel_bufferobj_alloc( GLcontext *ctx,
 
    /* XXX:  We generate our own handle, which is different to 'name' above.
     */
-   bmGenBuffers(intel, "bufferobj", 1, &obj->buffer);
+   bmGenBuffers(intel, "bufferobj", 1, &obj->buffer, 6);
    assert(obj->buffer);
 
    return &obj->Base;
index e2cb42730422e21fd1ca0c78341cc3a42437087d..51495448ca9b01560d824a0b8aa15b5d8b006138 100644 (file)
@@ -82,7 +82,7 @@ struct intel_region *intel_region_alloc( struct intel_context *intel,
    region->height = height;    /* needed? */
    region->refcount = 1;
 
-   bmGenBuffers(intel, "tex", 1, &region->buffer);
+   bmGenBuffers(intel, "tex", 1, &region->buffer, 6);
    bmBufferData(intel, region->buffer, pitch * cpp * height, NULL, 0);
 
    return region;