Mesa (master): ilo: skip state emission when reducing sampler count

Chia-I Wu olv at kemper.freedesktop.org
Wed Aug 7 15:57:50 UTC 2013


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

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Wed Aug  7 17:16:46 2013 +0800

ilo: skip state emission when reducing sampler count

When the number of sampler states bound is reduced, we are good to keep
referencing the old SAMPLER_STATE array and skip emitting a new one.

---

 src/gallium/drivers/ilo/ilo_state.c |   48 +++++++++++++++++++++--------------
 1 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/src/gallium/drivers/ilo/ilo_state.c b/src/gallium/drivers/ilo/ilo_state.c
index b92ddee..86470a7 100644
--- a/src/gallium/drivers/ilo/ilo_state.c
+++ b/src/gallium/drivers/ilo/ilo_state.c
@@ -240,19 +240,31 @@ ilo_create_sampler_state(struct pipe_context *pipe,
    return sampler;
 }
 
-static void
+static bool
 ilo_bind_sampler_states(struct pipe_context *pipe, unsigned shader,
                         unsigned start, unsigned count, void **samplers)
 {
    struct ilo_context *ilo = ilo_context(pipe);
    struct ilo_sampler_state *dst = &ilo->sampler[shader];
+   bool changed = false;
    unsigned i;
 
    assert(start + count <= Elements(dst->cso));
 
    if (samplers) {
-      for (i = 0; i < count; i++)
-         dst->cso[start + i] = samplers[i];
+      for (i = 0; i < count; i++) {
+         if (dst->cso[start + i] != samplers[i]) {
+            dst->cso[start + i] = samplers[i];
+
+            /*
+             * This function is sometimes called to reduce the number of bound
+             * samplers.  Do not consider that as a state change (and create a
+             * new array of SAMPLER_STATE).
+             */
+            if (samplers[i])
+               changed = true;
+         }
+      }
    }
    else {
       for (i = 0; i < count; i++)
@@ -270,6 +282,8 @@ ilo_bind_sampler_states(struct pipe_context *pipe, unsigned shader,
 
       dst->count = count;
    }
+
+   return changed;
 }
 
 static void
@@ -279,15 +293,14 @@ ilo_bind_fragment_sampler_states(struct pipe_context *pipe,
 {
    struct ilo_context *ilo = ilo_context(pipe);
 
-   ilo_bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT,
-         0, num_samplers, samplers);
+   if (ilo_bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT,
+         0, num_samplers, samplers))
+      ilo->dirty |= ILO_DIRTY_SAMPLER_FS;
 
    if (ilo->sampler[PIPE_SHADER_FRAGMENT].count > num_samplers) {
       ilo_bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT, num_samplers,
             ilo->sampler[PIPE_SHADER_FRAGMENT].count - num_samplers, NULL);
    }
-
-   ilo->dirty |= ILO_DIRTY_SAMPLER_FS;
 }
 
 static void
@@ -297,15 +310,14 @@ ilo_bind_vertex_sampler_states(struct pipe_context *pipe,
 {
    struct ilo_context *ilo = ilo_context(pipe);
 
-   ilo_bind_sampler_states(pipe, PIPE_SHADER_VERTEX,
-         0, num_samplers, samplers);
+   if (ilo_bind_sampler_states(pipe, PIPE_SHADER_VERTEX,
+         0, num_samplers, samplers))
+      ilo->dirty |= ILO_DIRTY_SAMPLER_VS;
 
    if (ilo->sampler[PIPE_SHADER_VERTEX].count > num_samplers) {
       ilo_bind_sampler_states(pipe, PIPE_SHADER_VERTEX, num_samplers,
             ilo->sampler[PIPE_SHADER_VERTEX].count - num_samplers, NULL);
    }
-
-   ilo->dirty |= ILO_DIRTY_SAMPLER_VS;
 }
 
 static void
@@ -315,15 +327,14 @@ ilo_bind_geometry_sampler_states(struct pipe_context *pipe,
 {
    struct ilo_context *ilo = ilo_context(pipe);
 
-   ilo_bind_sampler_states(pipe, PIPE_SHADER_GEOMETRY,
-         0, num_samplers, samplers);
+   if (ilo_bind_sampler_states(pipe, PIPE_SHADER_GEOMETRY,
+            0, num_samplers, samplers))
+      ilo->dirty |= ILO_DIRTY_SAMPLER_GS;
 
    if (ilo->sampler[PIPE_SHADER_GEOMETRY].count > num_samplers) {
       ilo_bind_sampler_states(pipe, PIPE_SHADER_GEOMETRY, num_samplers,
             ilo->sampler[PIPE_SHADER_GEOMETRY].count - num_samplers, NULL);
    }
-
-   ilo->dirty |= ILO_DIRTY_SAMPLER_GS;
 }
 
 static void
@@ -334,10 +345,9 @@ ilo_bind_compute_sampler_states(struct pipe_context *pipe,
 {
    struct ilo_context *ilo = ilo_context(pipe);
 
-   ilo_bind_sampler_states(pipe, PIPE_SHADER_COMPUTE,
-         start_slot, num_samplers, samplers);
-
-   ilo->dirty |= ILO_DIRTY_SAMPLER_CS;
+   if (ilo_bind_sampler_states(pipe, PIPE_SHADER_COMPUTE,
+            start_slot, num_samplers, samplers))
+      ilo->dirty |= ILO_DIRTY_SAMPLER_CS;
 }
 
 static void




More information about the mesa-commit mailing list