gallium: drivers should reference vertex buffers
authorMarek Olšák <maraeo@gmail.com>
Sun, 26 Dec 2010 17:43:39 +0000 (18:43 +0100)
committerMarek Olšák <maraeo@gmail.com>
Thu, 6 Jan 2011 15:16:29 +0000 (16:16 +0100)
So that a state tracker can unreference them after set_vertex_buffers.

17 files changed:
src/gallium/auxiliary/draw/draw_context.c
src/gallium/auxiliary/util/u_blitter.h
src/gallium/auxiliary/util/u_inlines.h
src/gallium/drivers/cell/ppu/cell_context.c
src/gallium/drivers/cell/ppu/cell_state_vertex.c
src/gallium/drivers/failover/fo_context.c
src/gallium/drivers/failover/fo_state.c
src/gallium/drivers/i915/i915_context.c
src/gallium/drivers/i915/i915_state.c
src/gallium/drivers/i965/brw_pipe_vertex.c
src/gallium/drivers/llvmpipe/lp_context.c
src/gallium/drivers/llvmpipe/lp_state_vertex.c
src/gallium/drivers/nv50/nv50_context.c
src/gallium/drivers/nv50/nv50_state.c
src/gallium/drivers/nvfx/nvfx_vbo.c
src/gallium/drivers/softpipe/sp_context.c
src/gallium/drivers/softpipe/sp_state_vertex.c

index 73d5b6e403fb96022557fd0b327daf8f1086c8bb..e045313b94fe1d1992d3fdefd567e08b9f9568d4 100644 (file)
@@ -35,6 +35,7 @@
 #include "util/u_memory.h"
 #include "util/u_math.h"
 #include "util/u_cpu_detect.h"
+#include "util/u_inlines.h"
 #include "draw_context.h"
 #include "draw_vs.h"
 #include "draw_gs.h"
@@ -164,6 +165,10 @@ void draw_destroy( struct draw_context *draw )
       }
    }
 
+   for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
+      pipe_resource_reference(&draw->pt.vertex_buffer[i].buffer, NULL);
+   }
+
    /* Not so fast -- we're just borrowing this at the moment.
     * 
    if (draw->render)
@@ -307,8 +312,9 @@ draw_set_vertex_buffers(struct draw_context *draw,
 {
    assert(count <= PIPE_MAX_ATTRIBS);
 
-   memcpy(draw->pt.vertex_buffer, buffers, count * sizeof(buffers[0]));
-   draw->pt.nr_vertex_buffers = count;
+   util_copy_vertex_buffers(draw->pt.vertex_buffer,
+                            &draw->pt.nr_vertex_buffers,
+                            buffers, count);
 }
 
 
index c5660cf2d00a6cb37cd51a8221328e13ab205874..922a8580ac15a3e68562034d0a247b79a3af0eb0 100644 (file)
@@ -318,21 +318,13 @@ util_blitter_save_vertex_buffers(struct blitter_context *blitter,
                                          int num_vertex_buffers,
                                          struct pipe_vertex_buffer *vertex_buffers)
 {
-   unsigned i;
    assert(num_vertex_buffers <= Elements(blitter->saved_vertex_buffers));
 
-   blitter->saved_num_vertex_buffers = num_vertex_buffers;
-
-   for (i = 0; i < num_vertex_buffers; i++) {
-      if (vertex_buffers[i].buffer) {
-         pipe_resource_reference(&blitter->saved_vertex_buffers[i].buffer,
-                                 vertex_buffers[i].buffer);
-      }
-   }
-
-   memcpy(blitter->saved_vertex_buffers,
-          vertex_buffers,
-          num_vertex_buffers * sizeof(struct pipe_vertex_buffer));
+   blitter->saved_num_vertex_buffers = 0;
+   util_copy_vertex_buffers(blitter->saved_vertex_buffers,
+                            (unsigned*)&blitter->saved_num_vertex_buffers,
+                            vertex_buffers,
+                            num_vertex_buffers);
 }
 
 #ifdef __cplusplus
index 9184b6aa4dbf27f50d5f5306d2e9048879e0d8c7..8aaf7a74165b2e1fdd2ae53d539fee35e0a25972 100644 (file)
@@ -400,6 +400,24 @@ static INLINE boolean util_get_offset(
    }
 }
 
+static INLINE void util_copy_vertex_buffers(struct pipe_vertex_buffer *dst,
+                                            unsigned *dst_count,
+                                            const struct pipe_vertex_buffer *src,
+                                            unsigned src_count)
+{
+   unsigned i;
+
+   for (i = 0; i < src_count; i++) {
+      pipe_resource_reference(&dst[i].buffer, src[i].buffer);
+   }
+   for (; i < *dst_count; i++) {
+      pipe_resource_reference(&dst[i].buffer, NULL);
+   }
+
+   *dst_count = src_count;
+   memcpy(dst, src, src_count * sizeof(struct pipe_vertex_buffer));
+}
+
 #ifdef __cplusplus
 }
 #endif
index b6b3a700cda8ce8154ab85366d226c2c4570bfbd..f9b83c8666c1d6464f5abf92a77c8c8346007934 100644 (file)
@@ -37,6 +37,7 @@
 #include "pipe/p_format.h"
 #include "util/u_memory.h"
 #include "pipe/p_screen.h"
+#include "util/u_inlines.h"
 
 #include "draw/draw_context.h"
 #include "draw/draw_private.h"
@@ -61,6 +62,11 @@ static void
 cell_destroy_context( struct pipe_context *pipe )
 {
    struct cell_context *cell = cell_context(pipe);
+   unsigned i;
+
+   for (i = 0; i < cell->num_vertex_buffers; i++) {
+      pipe_resource_reference(&cell->vertex_buffer[i].buffer, NULL);
+   }
 
    util_delete_keymap(cell->fragment_ops_cache, NULL);
 
index a065d68b5a63ba297d9c20cc3c5e18c23bef0aa8..eb22a09a913b85182b1c469efebc097e07e1f055 100644 (file)
@@ -82,8 +82,9 @@ cell_set_vertex_buffers(struct pipe_context *pipe,
 
    assert(count <= PIPE_MAX_ATTRIBS);
 
-   memcpy(cell->vertex_buffer, buffers, count * sizeof(buffers[0]));
-   cell->num_vertex_buffers = count;
+   util_copy_vertex_buffers(cell->vertex_buffer,
+                            &cell->num_vertex_buffers,
+                            buffers, count);
 
    cell->dirty |= CELL_NEW_VERTEX;
 
index e4d289c8a4d1b10ded434bc9cdad30e5b011413a..d60718d971661f0121ffc6eda89ff1453551f17c 100644 (file)
@@ -29,6 +29,7 @@
 #include "pipe/p_defines.h"
 #include "util/u_memory.h"
 #include "pipe/p_context.h"
+#include "util/u_inlines.h"
 
 #include "fo_context.h"
 #include "fo_winsys.h"
 static void failover_destroy( struct pipe_context *pipe )
 {
    struct failover_context *failover = failover_context( pipe );
+   unsigned i;
+
+   for (i = 0; i < failover->num_vertex_buffers; i++) {
+      pipe_resource_reference(&failover->vertex_buffers[i].buffer, NULL);
+   }
 
    FREE( failover );
 }
index c265f381b6755559f668eb8e1ac6353d6e843744..af1fd953aaf0b89c44973e88492449526cdc6967 100644 (file)
@@ -574,10 +574,10 @@ failover_set_vertex_buffers(struct pipe_context *pipe,
 {
    struct failover_context *failover = failover_context(pipe);
 
-   memcpy(failover->vertex_buffers, vertex_buffers,
-          count * sizeof(vertex_buffers[0]));
+   util_copy_vertex_buffers(failover->vertex_buffers,
+                            &failover->num_vertex_buffers,
+                            vertex_buffers, count);
    failover->dirty |= FO_NEW_VERTEX_BUFFER;
-   failover->num_vertex_buffers = count;
    failover->sw->set_vertex_buffers( failover->sw, count, vertex_buffers );
    failover->hw->set_vertex_buffers( failover->hw, count, vertex_buffers );
 }
index 847dd6dd47e697792f42a8514a23d5174daeecbb..9be316192547d929855ae214b1566ae4186e0b12 100644 (file)
@@ -107,6 +107,10 @@ static void i915_destroy(struct pipe_context *pipe)
    if(i915->batch)
       i915->iws->batchbuffer_destroy(i915->batch);
 
+   for (i = 0; i < i915->num_vertex_buffers; i++) {
+      pipe_resource_reference(&i915->vertex_buffer[i].buffer, NULL);
+   }
+
    /* unbind framebuffer */
    for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
       pipe_surface_reference(&i915->framebuffer.cbufs[i], NULL);
index bbfcff6bc4d04396872b40c7813cd44af520a13b..f5b60ed59427414d348ac823871622037675b953 100644 (file)
@@ -760,8 +760,9 @@ static void i915_set_vertex_buffers(struct pipe_context *pipe,
     */
    draw_flush(i915->draw);
 
-   memcpy(i915->vertex_buffer, buffers, count * sizeof(buffers[0]));
-   i915->num_vertex_buffers = count;
+   util_copy_vertex_buffers(i915->vertex_buffer,
+                            &i915->num_vertex_buffers,
+                            buffers, count);
 
    /* pass-through to draw module */
    draw_set_vertex_buffers(i915->draw, count, buffers);
index 007239efc40424756f2df4dbc4452a80bbf7e9b0..e1697687cccfad2b7a8ed4575a0a20bcb42e5138 100644 (file)
@@ -248,7 +248,6 @@ static void brw_set_vertex_buffers(struct pipe_context *pipe,
                                    const struct pipe_vertex_buffer *buffers)
 {
    struct brw_context *brw = brw_context(pipe);
-   unsigned i;
 
    /* Check for no change */
    if (count == brw->curr.num_vertex_buffers &&
@@ -257,18 +256,9 @@ static void brw_set_vertex_buffers(struct pipe_context *pipe,
               count * sizeof buffers[0]) == 0)
       return;
 
-   /* Adjust refcounts */
-   for (i = 0; i < count; i++) 
-      pipe_resource_reference(&brw->curr.vertex_buffer[i].buffer, 
-                            buffers[i].buffer);
-
-   for ( ; i < brw->curr.num_vertex_buffers; i++)
-      pipe_resource_reference(&brw->curr.vertex_buffer[i].buffer,
-                            NULL);
-
-   /* Copy remaining data */
-   memcpy(brw->curr.vertex_buffer, buffers, count * sizeof buffers[0]);
-   brw->curr.num_vertex_buffers = count;
+   util_copy_vertex_buffers(brw->curr.vertex_buffer,
+                            &brw->curr.num_vertex_buffers,
+                            buffers, count);
 
    brw->state.dirty.mesa |= PIPE_NEW_VERTEX_BUFFER;
 }
@@ -318,9 +308,13 @@ brw_pipe_vertex_init( struct brw_context *brw )
 void 
 brw_pipe_vertex_cleanup( struct brw_context *brw )
 {
+   unsigned i;
 
    /* Release bound pipe vertex_buffers
     */
+   for (i = 0; i < brw->curr.num_vertex_buffers; i++) {
+      pipe_resource_reference(&brw->curr.vertex_buffer[i].buffer, NULL);
+   }
 
    /* Release some other stuff
     */
index 2de20d6e9a339f9db9ae442556e6a279a006d281..644201ddf7c1580e9aac6d3f22ec466474de95d1 100644 (file)
@@ -125,6 +125,10 @@ static void llvmpipe_destroy( struct pipe_context *pipe )
       }
    }
 
+   for (i = 0; i < llvmpipe->num_vertex_buffers; i++) {
+      pipe_resource_reference(&llvmpipe->vertex_buffer[i].buffer, NULL);
+   }
+
    gallivm_destroy(llvmpipe->gallivm);
 
    align_free( llvmpipe );
index fb29423dd3562e2559503a8d3c74764df5133cd2..fffdeb6ccde615cb7c16390d7d44c5b0a9fec2e1 100644 (file)
@@ -33,6 +33,7 @@
 #include "lp_state.h"
 
 #include "draw/draw_context.h"
+#include "util/u_inlines.h"
 
 
 static void *
@@ -80,8 +81,9 @@ llvmpipe_set_vertex_buffers(struct pipe_context *pipe,
 
    assert(count <= PIPE_MAX_ATTRIBS);
 
-   memcpy(llvmpipe->vertex_buffer, buffers, count * sizeof(buffers[0]));
-   llvmpipe->num_vertex_buffers = count;
+   util_copy_vertex_buffers(llvmpipe->vertex_buffer,
+                            &llvmpipe->num_vertex_buffers,
+                            buffers, count);
 
    llvmpipe->dirty |= LP_NEW_VERTEX;
 
index 0874cb5e4ea45f35365c79c1b62afc393931d780..4f9761617603bd1e9480fcd8378b0cf325b86454 100644 (file)
@@ -49,6 +49,10 @@ nv50_destroy(struct pipe_context *pipe)
        struct nv50_context *nv50 = nv50_context(pipe);
        int i;
 
+        for (i = 0; i < nv50->vtxbuf_nr; i++) {
+           pipe_resource_reference(&nv50->vtxbuf[i].buffer, NULL);
+        }
+
        for (i = 0; i < 64; i++) {
                if (!nv50->state.hw[i])
                        continue;
index f42fa2d4d2bd225694f8bd346c6163f82373c27d..d97566ed7cf98faa8f17b7ba056349709f0a112b 100644 (file)
@@ -780,8 +780,9 @@ nv50_set_vertex_buffers(struct pipe_context *pipe, unsigned count,
 {
        struct nv50_context *nv50 = nv50_context(pipe);
 
-       memcpy(nv50->vtxbuf, vb, sizeof(*vb) * count);
-       nv50->vtxbuf_nr = count;
+        util_copy_vertex_buffers(nv50->vtxbuf,
+                                 &nv50->vtxbuf_nr,
+                                 vb, count);
 
        nv50->dirty |= NV50_NEW_ARRAYS;
 }
index 1c88f5f016c8f6cb83609fde1788d196cfddfd5c..01dacb43dad1155b77d350e72c3e4da2c7a78456 100644 (file)
@@ -591,18 +591,10 @@ nvfx_set_vertex_buffers(struct pipe_context *pipe, unsigned count,
 {
        struct nvfx_context *nvfx = nvfx_context(pipe);
 
-       for(unsigned i = 0; i < count; ++i)
-       {
-               pipe_resource_reference(&nvfx->vtxbuf[i].buffer, vb[i].buffer);
-               nvfx->vtxbuf[i].buffer_offset = vb[i].buffer_offset;
-               nvfx->vtxbuf[i].max_index = vb[i].max_index;
-               nvfx->vtxbuf[i].stride = vb[i].stride;
-       }
-
-       for(unsigned i = count; i < nvfx->vtxbuf_nr; ++i)
-               pipe_resource_reference(&nvfx->vtxbuf[i].buffer, 0);
+        util_copy_vertex_buffers(nvfx->vtxbuf,
+                                 &nvfx->vtxbuf_nr,
+                                 vb, count);
 
-       nvfx->vtxbuf_nr = count;
        nvfx->use_vertex_buffers = -1;
        nvfx->draw_dirty |= NVFX_NEW_ARRAYS;
 }
index e935ce6d21b39127617e2b9c0d885c4dfbcec1aa..f3489c1c793cc8a6410adacc13e2b38b3035ac6a 100644 (file)
@@ -129,6 +129,10 @@ softpipe_destroy( struct pipe_context *pipe )
       }
    }
 
+   for (i = 0; i < softpipe->num_vertex_buffers; i++) {
+      pipe_resource_reference(&softpipe->vertex_buffer[i].buffer, NULL);
+   }
+
    tgsi_exec_machine_destroy(softpipe->fs_machine);
 
    FREE( softpipe );
index 7d8055f2bafd6ecc8984817be949fb3cb4eb8d1d..5f4d661abde74ed6cb0297ed69caacf4fe7bcda0 100644 (file)
@@ -33,6 +33,7 @@
 #include "sp_state.h"
 
 #include "util/u_memory.h"
+#include "util/u_inlines.h"
 #include "draw/draw_context.h"
 
 
@@ -84,8 +85,9 @@ softpipe_set_vertex_buffers(struct pipe_context *pipe,
 
    assert(count <= PIPE_MAX_ATTRIBS);
 
-   memcpy(softpipe->vertex_buffer, buffers, count * sizeof(buffers[0]));
-   softpipe->num_vertex_buffers = count;
+   util_copy_vertex_buffers(softpipe->vertex_buffer,
+                            &softpipe->num_vertex_buffers,
+                            buffers, count);
 
    softpipe->dirty |= SP_NEW_VERTEX;