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 20f3497e4b

(cherry picked from master, commit dc9705d12d)
This commit is contained in:
Brian Paul
2009-04-27 10:45:41 -06:00
parent b58b3a786a
commit 777b9ff43e
6 changed files with 22 additions and 17 deletions
+2
View 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;
};
+4 -2
View 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);
}
-2
View 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;
+6 -5
View 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) {
-2
View 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;
+10 -6
View 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)