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 from20f3497e4b(cherry picked from master, commitdc9705d12d)
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user