Programmable per-vertex point sizes and proper result reg assigns.

This commit is contained in:
Aapo Tahkola 2005-05-28 01:02:00 +00:00
parent 0080faf83e
commit 74e412c695
5 changed files with 53 additions and 55 deletions

View file

@ -573,7 +573,7 @@ extern int hw_tcl_on;
#define CURRENT_VERTEX_SHADER(ctx) (ctx->VertexProgram._Enabled ? ctx->VertexProgram.Current : ctx->_TnlProgram)
//#define TMU_ENABLED(ctx, unit) (hw_tcl_on ? ctx->Texture.Unit[unit]._ReallyEnabled && (OutputsWritten & (1<<(VERT_RESULT_TEX0+(unit)))) : \
//#define TMU_ENABLED(ctx, unit) (hw_tcl_on ? ctx->Texture.Unit[unit]._ReallyEnabled && (OutputsWritten & (1<<(VERT_RESULT_TEX0+(unit)))) :
// (r300->state.render_inputs & (_TNL_BIT_TEX0<<(unit))))
#define TMU_ENABLED(ctx, unit) (hw_tcl_on ? ctx->Texture.Unit[unit]._ReallyEnabled && OutputsWritten & (1<<(VERT_RESULT_TEX0+(unit))) : \
ctx->Texture.Unit[unit]._ReallyEnabled && r300->state.render_inputs & (_TNL_BIT_TEX0<<(unit)))
@ -591,7 +591,7 @@ struct r300_vertex_program {
int pos_end;
unsigned long num_temporaries; /* Number of temp vars used by program */
int inputs[VERT_ATTRIB_MAX];
int tex_regs[8];
int outputs[VERT_RESULT_MAX];
};
#if USE_ARB_F_P == 1

View file

@ -396,11 +396,6 @@ void r300EmitArrays(GLcontext * ctx, GLboolean immd)
}
}
int cmd_reserved=0;
int cmd_written=0;
drm_radeon_cmd_header_t *cmd = NULL;
#define SHOW_INFO(n) do { \
if (RADEON_DEBUG & DEBUG_ALL) { \
fprintf(stderr, "RR[%d] - sz=%d, reg=%d, fmt=%d -- st=%d, of=0x%08x\n", \
@ -529,7 +524,9 @@ drm_radeon_cmd_header_t *cmd = NULL;
if(OutputsWritten & (1<<VERT_RESULT_BFC1))
r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_3_PRESENT;*/
//if(OutputsWritten & (1<<VERT_RESULT_FOGC))
//if(OutputsWritten & (1<<VERT_RESULT_PSIZ))
if(OutputsWritten & (1<<VERT_RESULT_PSIZ))
r300->hw.vof.cmd[R300_VOF_CNTL_0] |= R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT;
for(i=0;i < ctx->Const.MaxTextureUnits;i++)
if(OutputsWritten & (1<<(VERT_RESULT_TEX0+i)))

View file

@ -66,11 +66,8 @@ static struct program *r300NewProgram(GLcontext *ctx, GLenum target, GLuint id)
static void r300DeleteProgram(GLcontext *ctx, struct program *prog)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
struct r300_vertex_program *vp=(void *)prog;
/*if(rmesa->current_vp == vp)
rmesa->current_vp = NULL;*/
//r300ContextPtr rmesa = R300_CONTEXT(ctx);
//struct r300_vertex_program *vp=(void *)prog;
_mesa_delete_program(ctx, prog);
}
@ -99,8 +96,8 @@ void r300ProgramStringNotify(GLcontext *ctx, GLenum target,
static GLboolean r300IsProgramNative(GLcontext *ctx, GLenum target, struct program *prog)
{
struct r300_vertex_program *vp=(void *)prog;
r300ContextPtr rmesa = R300_CONTEXT(ctx);
//struct r300_vertex_program *vp=(void *)prog;
//r300ContextPtr rmesa = R300_CONTEXT(ctx);
return 1;
}

View file

@ -1178,6 +1178,7 @@ void r300_setup_rs_unit(GLcontext *ctx)
| (in_texcoords << R300_RS_CNTL_TC_CNT_SHIFT)
| R300_RS_CNTL_0_UNKNOWN_7
| R300_RS_CNTL_0_UNKNOWN_18;
if (r300->state.texture.tc_count > 0) {
r300->hw.rr.cmd[R300_RR_CMD_0] = cmducs(R300_RS_ROUTE_0, fp_reg);

View file

@ -313,42 +313,14 @@ static unsigned long t_dst_class(enum register_file file)
static unsigned long t_dst_index(struct r300_vertex_program *vp, struct vp_dst_register *dst)
{
int i, high=0;
if(dst->File == PROGRAM_OUTPUT)
switch(dst->Index){
case VERT_RESULT_HPOS:
return 0;
case VERT_RESULT_COL0:
return 1;
case VERT_RESULT_TEX0:
case VERT_RESULT_TEX1:
case VERT_RESULT_TEX2:
case VERT_RESULT_TEX3:
case VERT_RESULT_TEX4:
case VERT_RESULT_TEX5:
case VERT_RESULT_TEX6:
case VERT_RESULT_TEX7:
/* Awful hack to get tex coord results regs correctly packed.
Wount work if tex coords arent written in logical order! */
if(vp->tex_regs[dst->Index - VERT_RESULT_TEX0] != 1){
return vp->tex_regs[dst->Index - VERT_RESULT_TEX0];
}
for(i=0; i < 8; i++)
if(vp->tex_regs[i] > high)
high = vp->tex_regs[i];
high++;
vp->tex_regs[dst->Index - VERT_RESULT_TEX0] = high;
return high;
case VERT_RESULT_COL1:
case VERT_RESULT_BFC0:
case VERT_RESULT_BFC1:
case VERT_RESULT_FOGC:
case VERT_RESULT_PSIZ:
default: WARN_ONCE("Unknown output\n"); return 10;
if(dst->File == PROGRAM_OUTPUT) {
if (vp->outputs[dst->Index] != -1)
return vp->outputs[dst->Index];
else {
WARN_ONCE("Unknown output %d\n", dst->Index);
return 10;
}
}
return dst->Index;
}
@ -509,8 +481,7 @@ void translate_vertex_shader(struct r300_vertex_program *vp)
{
struct vertex_program *mesa_vp=(void *)vp;
struct vp_instruction *vpi;
int operand_index, i;
VERTEX_SHADER_INSTRUCTION t2rs[1024];
int i, cur_reg=0;
VERTEX_SHADER_INSTRUCTION *o_inst;
unsigned long operands;
int are_srcs_scalar;
@ -527,11 +498,43 @@ void translate_vertex_shader(struct r300_vertex_program *vp)
vp->pos_end=0; /* Not supported yet */
vp->program.length=0;
vp->num_temporaries=mesa_vp->Base.NumTemporaries;
for(i=0; i < 8; i++)
vp->tex_regs[i]=1;
for(i=0; i < VERT_ATTRIB_MAX; i++)
vp->inputs[i]=-1;
vp->inputs[i] = -1;
for(i=0; i < VERT_RESULT_MAX; i++)
vp->outputs[i] = -1;
assert(mesa_vp->OutputsWritten & (1 << VERT_RESULT_HPOS));
assert(mesa_vp->OutputsWritten & (1 << VERT_RESULT_COL0));
/* Assign outputs */
if(mesa_vp->OutputsWritten & (1 << VERT_RESULT_HPOS))
vp->outputs[VERT_RESULT_HPOS] = cur_reg++;
if(mesa_vp->OutputsWritten & (1 << VERT_RESULT_PSIZ))
vp->outputs[VERT_RESULT_PSIZ] = cur_reg++;
if(mesa_vp->OutputsWritten & (1 << VERT_RESULT_COL0))
vp->outputs[VERT_RESULT_COL0] = cur_reg++;
#if 0 /* Not supported yet */
if(mesa_vp->OutputsWritten & (1 << VERT_RESULT_BFC0))
vp->outputs[VERT_RESULT_BFC0] = cur_reg++;
if(mesa_vp->OutputsWritten & (1 << VERT_RESULT_COL1))
vp->outputs[VERT_RESULT_COL1] = cur_reg++;
if(mesa_vp->OutputsWritten & (1 << VERT_RESULT_BFC1))
vp->outputs[VERT_RESULT_BFC1] = cur_reg++;
if(mesa_vp->OutputsWritten & (1 << VERT_RESULT_FOGC))
vp->outputs[VERT_RESULT_FOGC] = cur_reg++;
#endif
for(i=VERT_RESULT_TEX0; i <= VERT_RESULT_TEX7; i++)
if(mesa_vp->OutputsWritten & (1 << i))
vp->outputs[i] = cur_reg++;
o_inst=vp->program.body.i;
for(vpi=mesa_vp->Instructions; vpi->Opcode != VP_OPCODE_END; vpi++, o_inst++){