Mesa (master): i965: only upload constant buffer data when we actually need the const buffer

Brian Paul brianp at kemper.freedesktop.org
Mon Apr 27 15:54:39 UTC 2009


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

Author: Brian Paul <brianp at vmware.com>
Date:   Mon Apr 27 09:51:46 2009 -0600

i965: only upload constant buffer data when we actually need the const buffer

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

---

 src/mesa/drivers/dri/i965/brw_context.h |    2 ++
 src/mesa/drivers/dri/i965/brw_curbe.c   |    6 ++++--
 src/mesa/drivers/dri/i965/brw_vs.h      |    2 --
 src/mesa/drivers/dri/i965/brw_vs_emit.c |   10 +++++-----
 src/mesa/drivers/dri/i965/brw_wm.h      |    2 --
 src/mesa/drivers/dri/i965/brw_wm_glsl.c |   12 ++++++------
 6 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index a0b3b06..aef2ff5 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -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;
 };
 
 
diff --git a/src/mesa/drivers/dri/i965/brw_curbe.c b/src/mesa/drivers/dri/i965/brw_curbe.c
index 2d15793..9197fed 100644
--- a/src/mesa/drivers/dri/i965/brw_curbe.c
+++ b/src/mesa/drivers/dri/i965/brw_curbe.c
@@ -383,7 +383,8 @@ update_vertex_constant_buffer(struct brw_context *brw)
       printf("update VS constants in buffer %p\n", vp->const_buffer);
       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);
 }
 
 
@@ -393,7 +394,8 @@ update_fragment_constant_buffer(struct brw_context *brw)
 {
    struct brw_fragment_program *fp =
       (struct brw_fragment_program *) brw->fragment_program;
-   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);
 }
 
 
diff --git a/src/mesa/drivers/dri/i965/brw_vs.h b/src/mesa/drivers/dri/i965/brw_vs.h
index d20cf78..1e4f660 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.h
+++ b/src/mesa/drivers/dri/i965/brw_vs.h
@@ -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;
diff --git a/src/mesa/drivers/dri/i965/brw_vs_emit.c b/src/mesa/drivers/dri/i965/brw_vs_emit.c
index 524f121..b69616d 100644
--- a/src/mesa/drivers/dri/i965/brw_vs_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_vs_emit.c
@@ -71,10 +71,10 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c )
 
 #if 0
    if (c->vp->program.Base.Parameters->NumParameters >= 6)
-      c->use_const_buffer = 1;
+      c->vp->use_const_buffer = 1;
    else
 #endif
-      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
@@ -96,7 +96,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... */
@@ -172,7 +172,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);
@@ -869,7 +869,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) {
diff --git a/src/mesa/drivers/dri/i965/brw_wm.h b/src/mesa/drivers/dri/i965/brw_wm.h
index d0ab3bd..f0d31fc 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.h
+++ b/src/mesa/drivers/dri/i965/brw_wm.h
@@ -254,8 +254,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;
diff --git a/src/mesa/drivers/dri/i965/brw_wm_glsl.c b/src/mesa/drivers/dri/i965/brw_wm_glsl.c
index 22e1762..1174608 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_glsl.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_glsl.c
@@ -194,9 +194,9 @@ static void prealloc_reg(struct brw_wm_compile *c)
         const int nr_params = c->fp->program.Base.Parameters->NumParameters;
 
         /* use a real constant buffer, or just use a section of the GRF? */
-        c->use_const_buffer = GL_FALSE; /* (nr_params > 8);*/
+        c->fp->use_const_buffer = GL_FALSE; /* (nr_params > 8);*/
 
-        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.
             */
@@ -253,14 +253,14 @@ 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 = alloc_tmp(c);
        }
     }
 #if 0
-    printf("USE CONST BUFFER? %d\n", c->use_const_buffer);
+    printf("USE CONST BUFFER? %d\n", c->fp->use_const_buffer);
     printf("AFTER PRE_ALLOC, reg_index = %d\n", c->reg_index);
 #endif
 }
@@ -368,7 +368,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)) {
@@ -2609,7 +2609,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)




More information about the mesa-commit mailing list