ilo: use a bitmask for enabled constant buffers
authorChia-I Wu <olvaffe@gmail.com>
Wed, 26 Jun 2013 10:50:01 +0000 (18:50 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Wed, 26 Jun 2013 13:50:26 +0000 (21:50 +0800)
Looping over 4 * 13 constant buffers while in most cases only two are enabled
is stupid.

src/gallium/drivers/ilo/ilo_gpe.h
src/gallium/drivers/ilo/ilo_state.c

index aa979f31a09a28a0c4c9ff88fd0f4afb9146b716..1f5f47cacaa0b3c1f8f00d9f70b017cffe3cb248 100644 (file)
@@ -221,6 +221,7 @@ struct ilo_cbuf_cso {
 
 struct ilo_cbuf_state {
    struct ilo_cbuf_cso cso[ILO_MAX_CONST_BUFFERS];
+   uint32_t enabled_mask;
    unsigned count;
 };
 
index ede72623f1774d0cc05c0514fd100d9f7d3d58bc..59d3c3612a008f5f0460f98e521a590f9fa1c544 100644 (file)
@@ -87,17 +87,21 @@ finalize_shader_states(struct ilo_context *ilo)
 static void
 finalize_constant_buffers(struct ilo_context *ilo)
 {
-   int sh, i;
+   int sh;
 
    if (!(ilo->dirty & ILO_DIRTY_CONSTANT_BUFFER))
       return;
 
    /* TODO push constants? */
    for (sh = 0; sh < PIPE_SHADER_TYPES; sh++) {
-      int last_cbuf = -1;
+      unsigned enabled_mask = ilo->cbuf[sh].enabled_mask;
 
-      for (i = 0; i < Elements(ilo->cbuf[sh].cso); i++) {
-         struct ilo_cbuf_cso *cbuf = &ilo->cbuf[sh].cso[i];
+      while (enabled_mask) {
+         struct ilo_cbuf_cso *cbuf;
+         int i;
+
+         i = u_bit_scan(&enabled_mask);
+         cbuf = &ilo->cbuf[sh].cso[i];
 
          /* upload user buffer */
          if (cbuf->user_buffer) {
@@ -117,12 +121,9 @@ finalize_constant_buffers(struct ilo_context *ilo)
             cbuf->user_buffer = NULL;
             cbuf->user_buffer_size = 0;
          }
-
-         if (cbuf->resource)
-            last_cbuf = i;
       }
 
-      ilo->cbuf[sh].count = last_cbuf + 1;
+      ilo->cbuf[sh].count = util_last_bit(ilo->cbuf[sh].enabled_mask);
    }
 }
 
@@ -610,6 +611,8 @@ ilo_set_constant_buffer(struct pipe_context *pipe,
          cbuf->user_buffer = state->user_buffer;
          cbuf->user_buffer_size = state->buffer_size;
       }
+
+      ilo->cbuf[shader].enabled_mask |= 1 << index;
    }
    else {
       pipe_resource_reference(&cbuf->resource, NULL);
@@ -617,10 +620,9 @@ ilo_set_constant_buffer(struct pipe_context *pipe,
 
       cbuf->user_buffer = NULL;
       cbuf->user_buffer_size = 0;
-   }
 
-   /* the correct value will be set in ilo_finalize_3d_states() */
-   ilo->cbuf[shader].count = 0;
+      ilo->cbuf[shader].enabled_mask &= ~(1 << index);
+   }
 
    ilo->dirty |= ILO_DIRTY_CONSTANT_BUFFER;
 }