From 87641cffd97f328e846604d314c21582f426a19a Mon Sep 17 00:00:00 2001
From: Chris Wilson <chris@chris-wilson.co.uk>
Date: Thu, 25 Nov 2010 21:39:21 +0000
Subject: i915: Eliminate redundant CONSTANTS updates

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 src/mesa/drivers/dri/i915/i915_program.c | 51 ++++++++++++++++----------------
 1 file changed, 26 insertions(+), 25 deletions(-)

(limited to 'src/mesa/drivers/dri/i915')

diff --git a/src/mesa/drivers/dri/i915/i915_program.c b/src/mesa/drivers/dri/i915/i915_program.c
index ca1949b223e..507adf1d3dc 100644
--- a/src/mesa/drivers/dri/i915/i915_program.c
+++ b/src/mesa/drivers/dri/i915/i915_program.c
@@ -538,6 +538,7 @@ i915_upload_program(struct i915_context *i915,
 {
    GLuint program_size = p->csr - p->program;
    GLuint decl_size = p->decl - p->declarations;
+   GLuint nr;
 
    if (p->error)
       return;
@@ -554,32 +555,32 @@ i915_upload_program(struct i915_context *i915,
       i915->state.ProgramSize = decl_size + program_size;
    }
 
-   /* Always seemed to get a failure if I used memcmp() to
-    * shortcircuit this state upload.  Needs further investigation?
-    */
-   if (p->nr_constants) {
-      GLuint nr = p->nr_constants;
-
-      I915_ACTIVESTATE(i915, I915_UPLOAD_CONSTANTS, 1);
-      I915_STATECHANGE(i915, I915_UPLOAD_CONSTANTS);
-
-      i915->state.Constant[0] = _3DSTATE_PIXEL_SHADER_CONSTANTS | ((nr) * 4);
-      i915->state.Constant[1] = (1 << (nr - 1)) | ((1 << (nr - 1)) - 1);
-
-      memcpy(&i915->state.Constant[2], p->constant, 4 * sizeof(int) * (nr));
-      i915->state.ConstantSize = 2 + (nr) * 4;
-
-      if (0) {
-         GLuint i;
-         for (i = 0; i < nr; i++) {
-            fprintf(stderr, "const[%d]: %f %f %f %f\n", i,
-                    p->constant[i][0],
-                    p->constant[i][1], p->constant[i][2], p->constant[i][3]);
-         }
+   nr = p->nr_constants;
+   if (i915->state.ConstantSize != 2 + nr*4 ||
+       memcmp(i915->state.Constant + 2,
+	      p->constant, 4*sizeof(int)*nr)) {
+      if (nr) {
+	 I915_ACTIVESTATE(i915, I915_UPLOAD_CONSTANTS, 1);
+	 I915_STATECHANGE(i915, I915_UPLOAD_CONSTANTS);
+
+	 i915->state.Constant[0] = _3DSTATE_PIXEL_SHADER_CONSTANTS | (nr * 4);
+	 i915->state.Constant[1] = (1 << nr) -1;
+
+	 memcpy(&i915->state.Constant[2], p->constant, 4 * sizeof(int) * nr);
+	 i915->state.ConstantSize = 2 + nr * 4;
+
+	 if (0) {
+	    GLuint i;
+	    for (i = 0; i < nr; i++) {
+	       fprintf(stderr, "const[%d]: %f %f %f %f\n", i,
+		       p->constant[i][0],
+		       p->constant[i][1], p->constant[i][2], p->constant[i][3]);
+	    }
+	 }
+      }
+      else {
+	 I915_ACTIVESTATE(i915, I915_UPLOAD_CONSTANTS, 0);
       }
-   }
-   else {
-      I915_ACTIVESTATE(i915, I915_UPLOAD_CONSTANTS, 0);
    }
 
    p->on_hardware = 1;
-- 
cgit v1.2.3