Mesa (master): u_blitter: add support for saving vertex buffers

Luca Barbieri lb at kemper.freedesktop.org
Sun Apr 18 13:29:30 UTC 2010


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

Author: Luca Barbieri <luca at luca-barbieri.com>
Date:   Sun Apr 18 14:50:14 2010 +0200

u_blitter: add support for saving vertex buffers

Currently r300g does not save vertex buffer on blitter calls.

It gets away with it because the current Mesa state tracker usually
resets vertex buffers on every draw calls.

However, this is wrong.

nvfx won't be lucky because it needs to use the blitter inside draw
calls.

---

 src/gallium/auxiliary/util/u_blitter.c |    8 ++++++++
 src/gallium/auxiliary/util/u_blitter.h |   16 ++++++++++++++++
 2 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
index f3b42f7..956aedc 100644
--- a/src/gallium/auxiliary/util/u_blitter.c
+++ b/src/gallium/auxiliary/util/u_blitter.c
@@ -132,6 +132,7 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
    ctx->blitter.saved_fb_state.nr_cbufs = ~0;
    ctx->blitter.saved_num_sampler_views = ~0;
    ctx->blitter.saved_num_sampler_states = ~0;
+   ctx->blitter.saved_num_vertex_buffers = ~0;
 
    /* blend state objects */
    memset(&blend, 0, sizeof(blend));
@@ -318,6 +319,13 @@ static void blitter_restore_CSOs(struct blitter_context_priv *ctx)
                                        ctx->blitter.saved_sampler_views);
       ctx->blitter.saved_num_sampler_views = ~0;
    }
+
+   if (ctx->blitter.saved_num_vertex_buffers != ~0) {
+      pipe->set_vertex_buffers(pipe,
+                                       ctx->blitter.saved_num_vertex_buffers,
+                                       ctx->blitter.saved_vertex_buffers);
+      ctx->blitter.saved_num_vertex_buffers = ~0;
+   }
 }
 
 static void blitter_set_rectangle(struct blitter_context_priv *ctx,
diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h
index 2ad7201..f6e3ce4 100644
--- a/src/gallium/auxiliary/util/u_blitter.h
+++ b/src/gallium/auxiliary/util/u_blitter.h
@@ -57,6 +57,9 @@ struct blitter_context
 
    int saved_num_sampler_views;
    struct pipe_sampler_view *saved_sampler_views[PIPE_MAX_SAMPLERS];
+
+   int saved_num_vertex_buffers;
+   struct pipe_vertex_buffer saved_vertex_buffers[PIPE_MAX_ATTRIBS];
 };
 
 /**
@@ -255,6 +258,19 @@ util_blitter_save_fragment_sampler_views(struct blitter_context *blitter,
           num_views * sizeof(struct pipe_sampler_view *));
 }
 
+static INLINE void
+util_blitter_save_vertex_buffers(struct blitter_context *blitter,
+                                         int num_vertex_buffers,
+                                         struct pipe_vertex_buffer *vertex_buffers)
+{
+   assert(num_vertex_buffers <= Elements(blitter->saved_vertex_buffers));
+
+   blitter->saved_num_vertex_buffers = num_vertex_buffers;
+   memcpy(blitter->saved_vertex_buffers,
+          vertex_buffers,
+          num_vertex_buffers * sizeof(struct pipe_vertex_buffer));
+}
+
 #ifdef __cplusplus
 }
 #endif




More information about the mesa-commit mailing list