Mesa (master): i915g: Don't emit FS constants when VS contants change

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Fri Jan 21 19:55:16 UTC 2011


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

Author: Jakob Bornecrantz <wallbraker at gmail.com>
Date:   Mon Nov 29 21:37:09 2010 +0100

i915g: Don't emit FS constants when VS contants change

---

 src/gallium/drivers/i915/i915_context.c   |   18 ++++++++++++++----
 src/gallium/drivers/i915/i915_context.h   |    8 +++++---
 src/gallium/drivers/i915/i915_debug.c     |    3 ++-
 src/gallium/drivers/i915/i915_state.c     |   11 +++++++++--
 src/gallium/drivers/i915/i915_state_fpc.c |    2 +-
 5 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/i915/i915_context.c b/src/gallium/drivers/i915/i915_context.c
index 9d43381..15454d0 100644
--- a/src/gallium/drivers/i915/i915_context.c
+++ b/src/gallium/drivers/i915/i915_context.c
@@ -51,6 +51,14 @@ i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
    struct draw_context *draw = i915->draw;
    void *mapped_indices = NULL;
    unsigned i;
+   unsigned cbuf_dirty;
+
+
+   /*
+    * Ack vs contants here, helps ipers a lot.
+    */
+   cbuf_dirty = i915->dirty & I915_NEW_VS_CONSTANTS;
+   i915->dirty &= ~I915_NEW_VS_CONSTANTS;
 
    if (i915->dirty)
       i915_update_derived(i915);
@@ -70,10 +78,12 @@ i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
       mapped_indices = i915_buffer(i915->index_buffer.buffer)->data;
    draw_set_mapped_index_buffer(draw, mapped_indices);
 
-   draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0,
-                                   i915->current.constants[PIPE_SHADER_VERTEX],
-                                   (i915->current.num_user_constants[PIPE_SHADER_VERTEX] * 
-                                      4 * sizeof(float)));
+   if (cbuf_dirty) {
+      draw_set_mapped_constant_buffer(draw, PIPE_SHADER_VERTEX, 0,
+                                      i915->current.constants[PIPE_SHADER_VERTEX],
+                                      (i915->current.num_user_constants[PIPE_SHADER_VERTEX] * 
+                                         4 * sizeof(float)));
+   }
 
    /*
     * Do the drawing
diff --git a/src/gallium/drivers/i915/i915_context.h b/src/gallium/drivers/i915/i915_context.h
index 1bf9cde..6dab3a1 100644
--- a/src/gallium/drivers/i915/i915_context.h
+++ b/src/gallium/drivers/i915/i915_context.h
@@ -257,9 +257,11 @@ struct i915_context {
 #define I915_NEW_DEPTH_STENCIL 0x200
 #define I915_NEW_SAMPLER       0x400
 #define I915_NEW_SAMPLER_VIEW  0x800
-#define I915_NEW_CONSTANTS     0x1000
-#define I915_NEW_VBO           0x2000
-#define I915_NEW_VS            0x4000
+#define I915_NEW_VS_CONSTANTS  0x1000
+#define I915_NEW_FS_CONSTANTS  0x2000
+#define I915_NEW_GS_CONSTANTS  0x4000
+#define I915_NEW_VBO           0x8000
+#define I915_NEW_VS            0x10000
 
 
 /* Driver's internally generated state flags:
diff --git a/src/gallium/drivers/i915/i915_debug.c b/src/gallium/drivers/i915/i915_debug.c
index 87c435a..845e92c 100644
--- a/src/gallium/drivers/i915/i915_debug.c
+++ b/src/gallium/drivers/i915/i915_debug.c
@@ -948,7 +948,8 @@ i915_dump_dirty(struct i915_context *i915, const char *func)
       {I915_NEW_DEPTH_STENCIL, "depth_stencil"},
       {I915_NEW_SAMPLER,       "sampler"},
       {I915_NEW_SAMPLER_VIEW,  "sampler_view"},
-      {I915_NEW_CONSTANTS,     "constants"},
+      {I915_NEW_VS_CONSTANTS,  "vs_const"},
+      {I915_NEW_FS_CONSTANTS,  "fs_const"},
       {I915_NEW_VBO,           "vbo"},
       {I915_NEW_VS,            "vs"},
       {0, NULL},
diff --git a/src/gallium/drivers/i915/i915_state.c b/src/gallium/drivers/i915/i915_state.c
index f5b60ed..cc8bd3b 100644
--- a/src/gallium/drivers/i915/i915_state.c
+++ b/src/gallium/drivers/i915/i915_state.c
@@ -527,6 +527,10 @@ static void i915_set_constant_buffer(struct pipe_context *pipe,
    struct i915_context *i915 = i915_context(pipe);
    draw_flush(i915->draw);
 
+   /* XXX don't support geom shaders now */
+   if (shader == PIPE_SHADER_GEOMETRY)
+      return;
+
    /* Make a copy of shader constants.
     * During fragment program translation we may add additional
     * constants to the array.
@@ -538,6 +542,10 @@ static void i915_set_constant_buffer(struct pipe_context *pipe,
     */
    if (buf) {
       struct i915_buffer *ir = i915_buffer(buf);
+
+      if (!memcmp(i915->current.constants[shader], ir->data, ir->b.b.width0))
+         return;
+
       memcpy(i915->current.constants[shader], ir->data, ir->b.b.width0);
       i915->current.num_user_constants[shader] = (ir->b.b.width0 /
 						  4 * sizeof(float));
@@ -546,8 +554,7 @@ static void i915_set_constant_buffer(struct pipe_context *pipe,
       i915->current.num_user_constants[shader] = 0;
    }
 
-
-   i915->dirty |= I915_NEW_CONSTANTS;
+   i915->dirty |= shader == PIPE_SHADER_VERTEX ? I915_NEW_VS_CONSTANTS : I915_NEW_FS_CONSTANTS;
 }
 
 
diff --git a/src/gallium/drivers/i915/i915_state_fpc.c b/src/gallium/drivers/i915/i915_state_fpc.c
index ec7cec0..1959a24 100644
--- a/src/gallium/drivers/i915/i915_state_fpc.c
+++ b/src/gallium/drivers/i915/i915_state_fpc.c
@@ -40,7 +40,7 @@ static void update_hw_constants(struct i915_context *i915)
 struct i915_tracked_state i915_hw_constants = {
    "hw_constants",
    update_hw_constants,
-   I915_NEW_CONSTANTS | I915_NEW_FS
+   I915_NEW_FS_CONSTANTS | I915_NEW_FS
 };
 
 




More information about the mesa-commit mailing list