Browse Source

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
tags/mesa_7_5_rc1
Brian Paul 16 years ago
parent
commit
dc9705d12d

+ 2
- 0
src/mesa/drivers/dri/i965/brw_context.h 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
src/mesa/drivers/dri/i965/brw_curbe.c View File

@@ -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);
}



+ 0
- 2
src/mesa/drivers/dri/i965/brw_vs.h 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;

+ 5
- 5
src/mesa/drivers/dri/i965/brw_vs_emit.c View File

@@ -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) {

+ 0
- 2
src/mesa/drivers/dri/i965/brw_wm.h View File

@@ -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;

+ 6
- 6
src/mesa/drivers/dri/i965/brw_wm_glsl.c View File

@@ -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)

Loading…
Cancel
Save