Proper VAP output configuration as R300_RS_ROUTE_0_COLOR became optional and broke arbvptorus(takes no input color but produces output color). Also removing some useless code.
This commit is contained in:
parent
dd9da8cdb5
commit
c1aa3d1e6f
|
@ -579,6 +579,7 @@ struct r300_vertex_program {
|
||||||
int t2rs;
|
int t2rs;
|
||||||
unsigned long num_temporaries; /* Number of temp vars used by program */
|
unsigned long num_temporaries; /* Number of temp vars used by program */
|
||||||
int inputs[VERT_ATTRIB_MAX];
|
int inputs[VERT_ATTRIB_MAX];
|
||||||
|
GLuint outputs;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* 64 appears to be the maximum */
|
/* 64 appears to be the maximum */
|
||||||
|
|
|
@ -243,7 +243,7 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd)
|
||||||
GLuint vic_1 = 0; /* R300_VAP_INPUT_CNTL_1 */
|
GLuint vic_1 = 0; /* R300_VAP_INPUT_CNTL_1 */
|
||||||
GLuint aa_vap_reg = 0; /* VAP register assignment */
|
GLuint aa_vap_reg = 0; /* VAP register assignment */
|
||||||
GLuint i;
|
GLuint i;
|
||||||
GLuint inputs = 0;
|
GLuint inputs = 0, outputs = 0;
|
||||||
|
|
||||||
|
|
||||||
#define CONFIGURE_AOS(r, f, v, sz, cn) { \
|
#define CONFIGURE_AOS(r, f, v, sz, cn) { \
|
||||||
|
@ -306,6 +306,14 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd)
|
||||||
nr = 0;
|
nr = 0;
|
||||||
} else {
|
} else {
|
||||||
inputs = TNL_CONTEXT(ctx)->render_inputs;
|
inputs = TNL_CONTEXT(ctx)->render_inputs;
|
||||||
|
/* Hack to see what would happen if we would enable tex units according to their enabled values.
|
||||||
|
Why arent we doing this?
|
||||||
|
As for vertex programs tex coords should be passed if program wants them as some programs might deliver
|
||||||
|
some other values to the program with them. Futher more some programs might generate output tex coords
|
||||||
|
without taking them as inputs. */
|
||||||
|
/*for (i=0;i<ctx->Const.MaxTextureUnits;i++)
|
||||||
|
if(ctx->Texture.Unit[i].Enabled == 0)
|
||||||
|
inputs &= ~ (_TNL_BIT_TEX0<<i);*/
|
||||||
}
|
}
|
||||||
rmesa->state.render_inputs = inputs;
|
rmesa->state.render_inputs = inputs;
|
||||||
|
|
||||||
|
@ -489,13 +497,22 @@ drm_radeon_cmd_header_t *cmd = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Stage 3: VAP output */
|
/* Stage 3: VAP output */
|
||||||
|
if (rmesa->current_vp != NULL)
|
||||||
|
outputs = rmesa->current_vp->outputs;
|
||||||
|
else
|
||||||
|
outputs = inputs;
|
||||||
|
|
||||||
R300_STATECHANGE(r300, vof);
|
R300_STATECHANGE(r300, vof);
|
||||||
r300->hw.vof.cmd[R300_VOF_CNTL_0]=R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT
|
|
||||||
| R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT;
|
r300->hw.vof.cmd[R300_VOF_CNTL_0]=0;
|
||||||
|
if(outputs & _TNL_BIT_POS)
|
||||||
|
r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT;
|
||||||
|
if(outputs & _TNL_BIT_COLOR0)
|
||||||
|
r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT;
|
||||||
|
|
||||||
r300->hw.vof.cmd[R300_VOF_CNTL_1]=0;
|
r300->hw.vof.cmd[R300_VOF_CNTL_1]=0;
|
||||||
for(i=0;i < ctx->Const.MaxTextureUnits;i++)
|
for(i=0;i < ctx->Const.MaxTextureUnits;i++)
|
||||||
if(r300->state.render_inputs & (_TNL_BIT_TEX0<<i))
|
if(outputs & (_TNL_BIT_TEX0<<i))
|
||||||
r300->hw.vof.cmd[R300_VOF_CNTL_1]|=(4<<(3*i));
|
r300->hw.vof.cmd[R300_VOF_CNTL_1]|=(4<<(3*i));
|
||||||
|
|
||||||
rmesa->state.aos_count = nr;
|
rmesa->state.aos_count = nr;
|
||||||
|
|
|
@ -1356,7 +1356,8 @@ void r300_setup_textures(GLcontext *ctx)
|
||||||
/*if(ctx->Texture.Unit[i].Enabled == 0)
|
/*if(ctx->Texture.Unit[i].Enabled == 0)
|
||||||
continue;*/
|
continue;*/
|
||||||
if( ((r300->state.render_inputs & (_TNL_BIT_TEX0<<i))!=0) != ((ctx->Texture.Unit[i].Enabled)!=0) ) {
|
if( ((r300->state.render_inputs & (_TNL_BIT_TEX0<<i))!=0) != ((ctx->Texture.Unit[i].Enabled)!=0) ) {
|
||||||
WARN_ONCE("Mismatch between render_inputs and ctx->Texture.Unit[i].Enabled value.\n");
|
WARN_ONCE("Mismatch between render_inputs and ctx->Texture.Unit[i].Enabled value(%d vs %d).\n",
|
||||||
|
((r300->state.render_inputs & (_TNL_BIT_TEX0<<i))!=0), ((ctx->Texture.Unit[i].Enabled)!=0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(r300->state.render_inputs & (_TNL_BIT_TEX0<<i)) {
|
if(r300->state.render_inputs & (_TNL_BIT_TEX0<<i)) {
|
||||||
|
@ -1422,6 +1423,7 @@ void r300_setup_rs_unit(GLcontext *ctx)
|
||||||
0x00,
|
0x00,
|
||||||
0x00
|
0x00
|
||||||
};
|
};
|
||||||
|
GLuint vap_outputs;
|
||||||
|
|
||||||
/* This needs to be rewritten - it is a hack at best */
|
/* This needs to be rewritten - it is a hack at best */
|
||||||
|
|
||||||
|
@ -1433,6 +1435,11 @@ void r300_setup_rs_unit(GLcontext *ctx)
|
||||||
cur_reg = 0;
|
cur_reg = 0;
|
||||||
r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0;
|
r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0;
|
||||||
|
|
||||||
|
if (r300->current_vp != NULL)
|
||||||
|
vap_outputs = r300->current_vp->outputs;
|
||||||
|
else
|
||||||
|
vap_outputs = r300->state.render_inputs;
|
||||||
|
|
||||||
for (i=0;i<ctx->Const.MaxTextureUnits;i++) {
|
for (i=0;i<ctx->Const.MaxTextureUnits;i++) {
|
||||||
r300->hw.ri.cmd[R300_RI_INTERP_0+i] = 0
|
r300->hw.ri.cmd[R300_RI_INTERP_0+i] = 0
|
||||||
| R300_RS_INTERP_USED
|
| R300_RS_INTERP_USED
|
||||||
|
@ -1450,7 +1457,7 @@ void r300_setup_rs_unit(GLcontext *ctx)
|
||||||
cur_reg++;
|
cur_reg++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (r300->state.render_inputs & _TNL_BIT_COLOR0)
|
if (vap_outputs & _TNL_BIT_COLOR0)
|
||||||
r300->hw.rr.cmd[R300_RR_ROUTE_0] |= 0
|
r300->hw.rr.cmd[R300_RR_ROUTE_0] |= 0
|
||||||
| R300_RS_ROUTE_0_COLOR
|
| R300_RS_ROUTE_0_COLOR
|
||||||
| (cur_reg << R300_RS_ROUTE_0_COLOR_DEST_SHIFT);
|
| (cur_reg << R300_RS_ROUTE_0_COLOR_DEST_SHIFT);
|
||||||
|
|
|
@ -373,16 +373,6 @@ static unsigned long t_src_index(struct r300_vertex_program *vp, struct vp_src_r
|
||||||
int max_reg=-1;
|
int max_reg=-1;
|
||||||
|
|
||||||
if(src->File == PROGRAM_INPUT){
|
if(src->File == PROGRAM_INPUT){
|
||||||
/*
|
|
||||||
switch(src->Index){
|
|
||||||
case 0: return 0;
|
|
||||||
case 3: return 1;
|
|
||||||
|
|
||||||
case 2: return 2;
|
|
||||||
case 8: return 8;
|
|
||||||
|
|
||||||
default: printf("unknown input index %d\n", src->Index); exit(0); break;
|
|
||||||
}*/
|
|
||||||
if(vp->inputs[src->Index] != -1)
|
if(vp->inputs[src->Index] != -1)
|
||||||
return vp->inputs[src->Index];
|
return vp->inputs[src->Index];
|
||||||
|
|
||||||
|
@ -487,6 +477,23 @@ static void translate_program(struct r300_vertex_program *vp)
|
||||||
for(i=0; i < VERT_ATTRIB_MAX; i++)
|
for(i=0; i < VERT_ATTRIB_MAX; i++)
|
||||||
vp->inputs[i]=-1;
|
vp->inputs[i]=-1;
|
||||||
|
|
||||||
|
vp->outputs = 0;
|
||||||
|
/* FIXME: hardcoded values in arbprogparse.c:parse_result_binding ()
|
||||||
|
We might want to use these constants for VAP output in general as well once they have been added to
|
||||||
|
mesa headers.
|
||||||
|
*/
|
||||||
|
if(mesa_vp->OutputsWritten & (1<<0))
|
||||||
|
vp->outputs |= _TNL_BIT_POS;
|
||||||
|
if(mesa_vp->OutputsWritten & (1<<1))
|
||||||
|
vp->outputs |= _TNL_BIT_COLOR0;
|
||||||
|
if(mesa_vp->OutputsWritten & (1<<2))
|
||||||
|
vp->outputs |= _TNL_BIT_COLOR1;
|
||||||
|
for(i=0; i < 8/*ctx->Const.MaxTextureUnits*/; i++)
|
||||||
|
if(mesa_vp->OutputsWritten & (1<<(7+i)))
|
||||||
|
vp->outputs |= _TNL_BIT_TEX(i);
|
||||||
|
if(mesa_vp->OutputsWritten & ~(0x7 | 0x3f80))
|
||||||
|
fprintf(stderr, "%s:Odd bits(0x%08x)\n", __FUNCTION__, mesa_vp->OutputsWritten);
|
||||||
|
|
||||||
o_inst=vp->program.body.i;
|
o_inst=vp->program.body.i;
|
||||||
for(vpi=mesa_vp->Instructions; vpi->Opcode != VP_OPCODE_END; vpi++, o_inst++){
|
for(vpi=mesa_vp->Instructions; vpi->Opcode != VP_OPCODE_END; vpi++, o_inst++){
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue