i915g: Improve constant handling
authorJakob Bornecrantz <wallbraker@gmail.com>
Sun, 23 Jan 2011 23:35:53 +0000 (00:35 +0100)
committerJakob Bornecrantz <wallbraker@gmail.com>
Mon, 24 Jan 2011 02:26:59 +0000 (03:26 +0100)
src/gallium/drivers/i915/i915_state.c

index 4a1a4a0..e386a3f 100644 (file)
@@ -535,21 +535,31 @@ static void i915_set_constant_buffer(struct pipe_context *pipe,
 
    /* if we have a new buffer compare it with the old one */
    if (buf) {
-      struct i915_buffer *ir = i915_buffer(buf);
+      struct i915_buffer *ibuf = i915_buffer(buf);
       struct pipe_resource *old_buf = i915->constants[shader];
       struct i915_buffer *old = old_buf ? i915_buffer(old_buf) : NULL;
-
-      new_num = ir->b.b.width0 / 4 * sizeof(float);
-
-      if (old && new_num != i915->current.num_user_constants[shader])
-         diff = memcmp(old->data, ir->data, ir->b.b.width0);
+      unsigned old_num = i915->current.num_user_constants[shader];
+
+      new_num = ibuf->b.b.width0 / 4 * sizeof(float);
+
+      if (old_num == new_num) {
+         if (old_num == 0)
+            diff = FALSE;
+#if 0
+         /* XXX no point in running this code since st/mesa only uses user buffers */
+         /* Can't compare the buffer data since they are userbuffers */
+         else if (old && old->free_on_destroy)
+            diff = memcmp(old->data, ibuf->data, ibuf->b.b.width0);
+#else
+         (void)old;
+#endif
+      }
    } else {
       diff = i915->current.num_user_constants[shader] != 0;
    }
 
    /*
     * flush before updateing the state.
-    * XXX: looks like its okay to skip the flush for vertex cbufs
     */
    if (diff && shader == PIPE_SHADER_FRAGMENT)
       draw_flush(i915->draw);