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
tags/mesa_7_5_rc1
@@ -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; | |||
}; | |||
@@ -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); | |||
} | |||
@@ -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; |
@@ -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) { |
@@ -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; |
@@ -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) |