util: reference vertex buffers in blitter
authorMarek Olšák <maraeo@gmail.com>
Wed, 9 Jun 2010 00:13:10 +0000 (02:13 +0200)
committerMarek Olšák <maraeo@gmail.com>
Wed, 9 Jun 2010 00:26:24 +0000 (02:26 +0200)
src/gallium/auxiliary/util/u_blitter.c
src/gallium/auxiliary/util/u_blitter.h

index ae4c80c6450e8f3d64efaef554c9aa4432235f90..dfe2101c2e5c1cfdc94f2c01bf9827134b95b090 100644 (file)
@@ -282,6 +282,7 @@ static void blitter_check_saved_CSOs(struct blitter_context_priv *ctx)
 static void blitter_restore_CSOs(struct blitter_context_priv *ctx)
 {
    struct pipe_context *pipe = ctx->pipe;
+   unsigned i;
 
    /* restore the state objects which are always required to be saved */
    pipe->bind_blend_state(pipe, ctx->blitter.saved_blend_state);
@@ -328,6 +329,13 @@ static void blitter_restore_CSOs(struct blitter_context_priv *ctx)
       pipe->set_vertex_buffers(pipe,
                                ctx->blitter.saved_num_vertex_buffers,
                                ctx->blitter.saved_vertex_buffers);
+
+      for (i = 0; i < ctx->blitter.saved_num_vertex_buffers; i++) {
+         if (ctx->blitter.saved_vertex_buffers[i].buffer) {
+            pipe_resource_reference(&ctx->blitter.saved_vertex_buffers[i].buffer,
+                                    NULL);
+         }
+      }
       ctx->blitter.saved_num_vertex_buffers = ~0;
    }
 }
index 10143a5e0f21f4aa3c21b83c235f51fcda349770..22849280ab9be272b6ddf135932fa57317182df4 100644 (file)
@@ -27,6 +27,7 @@
 #ifndef U_BLITTER_H
 #define U_BLITTER_H
 
+#include "util/u_inlines.h"
 #include "util/u_memory.h"
 
 #include "pipe/p_state.h"
@@ -259,9 +260,18 @@ 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));