summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/r300/r300_vertexprog.c
diff options
context:
space:
mode:
authorAapo Tahkola <aet@rasterburn.org>2005-05-28 01:02:00 +0000
committerAapo Tahkola <aet@rasterburn.org>2005-05-28 01:02:00 +0000
commit74e412c6956676d69adcd5210ca7046061629eec (patch)
tree204d1b0b07a5e2d07d6bf2c3a2cb9ce9bb4bdfdd /src/mesa/drivers/dri/r300/r300_vertexprog.c
parent0080faf83ed9bd7a0516b92249b8c585526ac956 (diff)
Programmable per-vertex point sizes and proper result reg assigns.
Diffstat (limited to 'src/mesa/drivers/dri/r300/r300_vertexprog.c')
-rw-r--r--src/mesa/drivers/dri/r300/r300_vertexprog.c83
1 files changed, 43 insertions, 40 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_vertexprog.c b/src/mesa/drivers/dri/r300/r300_vertexprog.c
index d5a4664144..8a10931538 100644
--- a/src/mesa/drivers/dri/r300/r300_vertexprog.c
+++ b/src/mesa/drivers/dri/r300/r300_vertexprog.c
@@ -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++){