i965: only upload constant buffer data when we actually need the const buffer
authorBrian Paul <brianp@vmware.com>
Mon, 27 Apr 2009 16:45:41 +0000 (10:45 -0600)
committerBrian Paul <brianp@vmware.com>
Mon, 27 Apr 2009 16:45:41 +0000 (10:45 -0600)
Make the use_const_buffer field per-program and only call the code which
updates the constant buffer's data if the flag is set.

This should undo the perf regression from 20f3497e4b6756e330f7b3f54e8acaa1d6c92052

(cherry picked from master, commit dc9705d12d162ba6d087eb762e315de9f97bc456)

src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_curbe.c
src/mesa/drivers/dri/i965/brw_vs.h
src/mesa/drivers/dri/i965/brw_vs_emit.c
src/mesa/drivers/dri/i965/brw_wm.h
src/mesa/drivers/dri/i965/brw_wm_glsl.c

index f0d4993e117a8295e489b342afae29c647e8244b..838e718d0d519b6b5860f6d77d89dba1fb05c6a1 100644 (file)
@@ -161,6 +161,7 @@ struct brw_vertex_program {
    struct gl_vertex_program program;
    GLuint id;
    dri_bo *const_buffer;    /** Program constant buffer/surface */
+   GLboolean use_const_buffer;
 };
 
 
@@ -171,6 +172,7 @@ struct brw_fragment_program {
    GLboolean isGLSL;  /**< really, any IF/LOOP/CONT/BREAK instructions */
 
    dri_bo *const_buffer;    /** Program constant buffer/surface */
+   GLboolean use_const_buffer;
 };
 
 
index da746e4aa05e681b994dca58d320f1e354a600c2..e6e26cdc40623139674970270c73492f392e11ae 100644 (file)
@@ -368,7 +368,8 @@ update_vertex_constant_buffer(struct brw_context *brw)
       printf("update VS constants in buffer %p  vp = %p\n", vp->const_buffer, vp);
       printf("program %u\n", vp->program.Base.Id);
    }
-   update_constant_buffer(brw, vp->program.Base.Parameters, vp->const_buffer);
+   if (vp->use_const_buffer)
+      update_constant_buffer(brw, vp->program.Base.Parameters, vp->const_buffer);
 }
 
 
@@ -382,7 +383,8 @@ update_fragment_constant_buffer(struct brw_context *brw)
       printf("update WM constants in buffer %p\n", fp->const_buffer);
       printf("program %u\n", fp->program.Base.Id);
    }
-   update_constant_buffer(brw, fp->program.Base.Parameters, fp->const_buffer);
+   if (fp->use_const_buffer)
+      update_constant_buffer(brw, fp->program.Base.Parameters, fp->const_buffer);
 }
 
 
index d20cf78b8afd78cfc2c4a265b9c6484a3f6d5940..1e4f66091e34635fe921cf900bf7453fa36488ff 100644 (file)
@@ -75,8 +75,6 @@ struct brw_vs_compile {
 
    struct brw_reg userplane[6];
 
-   /** using a real constant buffer? */
-   GLboolean use_const_buffer;
    /** we may need up to 3 constants per instruction (if use_const_buffer) */
    struct {
       GLint index;
index c2b370279880b46d9d248dc190e29bcb0a373b41..b9a338b1cd89c98691c061154c237724a90dfe20 100644 (file)
@@ -76,9 +76,10 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c )
     */
    if (c->vp->program.Base.Parameters->NumParameters +
        c->vp->program.Base.NumTemporaries + 20 > BRW_MAX_GRF)
-      c->use_const_buffer = GL_TRUE;
+      c->vp->use_const_buffer = GL_TRUE;
    else
-      c->use_const_buffer = GL_FALSE;
+      c->vp->use_const_buffer = GL_FALSE;
+
    /*printf("use_const_buffer = %d\n", c->use_const_buffer);*/
 
    /* r0 -- reserved as usual
@@ -100,7 +101,7 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c )
 
    /* Vertex program parameters from curbe:
     */
-   if (c->use_const_buffer) {
+   if (c->vp->use_const_buffer) {
       /* get constants from a real constant buffer */
       c->prog_data.curb_read_length = 0;
       c->prog_data.nr_params = 4; /* XXX 0 causes a bug elsewhere... */
@@ -176,7 +177,7 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c )
       reg++;
    }
 
-   if (c->use_const_buffer) {
+   if (c->vp->use_const_buffer) {
       for (i = 0; i < 3; i++) {
          c->current_const[i].index = -1;
          c->current_const[i].reg = brw_vec8_grf(reg, 0);
@@ -873,7 +874,7 @@ get_src_reg( struct brw_vs_compile *c,
    case PROGRAM_STATE_VAR:
    case PROGRAM_CONSTANT:
    case PROGRAM_UNIFORM:
-      if (c->use_const_buffer) {
+      if (c->vp->use_const_buffer) {
          return get_constant(c, inst, argIndex);
       }
       else if (relAddr) {
index 75205fddb7f50040b1488edb090064715d1b1d35..2f80a60c12b97cb27e50be110f4922bc49526c01 100644 (file)
@@ -257,8 +257,6 @@ struct brw_wm_compile {
    GLuint tmp_max;
    GLuint subroutines[BRW_WM_MAX_SUBROUTINE];
 
-   /** using a real constant buffer? */
-   GLboolean use_const_buffer;
    /** we may need up to 3 constants per instruction (if use_const_buffer) */
    struct {
       GLint index;
index 3471c1946ece4a0188af00d520ad62621480ca66..eca4ca2c8213ceb701855db1e2b59ebfd347cd60 100644 (file)
@@ -311,12 +311,12 @@ static void prealloc_reg(struct brw_wm_compile *c)
         /* use a real constant buffer, or just use a section of the GRF? */
         /* XXX this heuristic may need adjustment... */
         if ((nr_params + nr_temps) * 4 + reg_index > 80)
-           c->use_const_buffer = GL_TRUE;
+           c->fp->use_const_buffer = GL_TRUE;
         else
-           c->use_const_buffer = GL_FALSE;
+           c->fp->use_const_buffer = GL_FALSE;
         /*printf("WM use_const_buffer = %d\n", c->use_const_buffer);*/
 
-        if (c->use_const_buffer) {
+        if (c->fp->use_const_buffer) {
            /* We'll use a real constant buffer and fetch constants from
             * it with a dataport read message.
             */
@@ -377,12 +377,16 @@ static void prealloc_reg(struct brw_wm_compile *c)
      * They'll be found in these registers.
      * XXX alloc these on demand!
      */
-    if (c->use_const_buffer) {
+    if (c->fp->use_const_buffer) {
        for (i = 0; i < 3; i++) {
           c->current_const[i].index = -1;
           c->current_const[i].reg = brw_vec8_grf(alloc_grf(c), 0);
        }
     }
+#if 0
+    printf("USE CONST BUFFER? %d\n", c->fp->use_const_buffer);
+    printf("AFTER PRE_ALLOC, reg_index = %d\n", c->reg_index);
+#endif
 }
 
 
@@ -488,7 +492,7 @@ static struct brw_reg get_src_reg(struct brw_wm_compile *c,
     const GLuint nr = 1;
     const GLuint component = GET_SWZ(src->Swizzle, channel);
 
-    if (c->use_const_buffer &&
+    if (c->fp->use_const_buffer &&
         (src->File == PROGRAM_STATE_VAR ||
          src->File == PROGRAM_CONSTANT ||
          src->File == PROGRAM_UNIFORM)) {
@@ -2730,7 +2734,7 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)
 #endif
 
         /* fetch any constants that this instruction needs */
-        if (c->use_const_buffer)
+        if (c->fp->use_const_buffer)
            fetch_constants(c, inst);
 
        if (inst->CondUpdate)