Pack tex coord regs at vertex program backend.
authorAapo Tahkola <aet@rasterburn.org>
Thu, 5 May 2005 00:28:31 +0000 (00:28 +0000)
committerAapo Tahkola <aet@rasterburn.org>
Thu, 5 May 2005 00:28:31 +0000 (00:28 +0000)
src/mesa/drivers/dri/r300/r300_context.h
src/mesa/drivers/dri/r300/r300_state.c
src/mesa/drivers/dri/r300/r300_vertexprog.c

index 72472c4d5958832fa32f15cc178d5e972762a0ba..fa6dbbf8af1f07f1686563182d75648d8c66a79c 100644 (file)
@@ -585,9 +585,10 @@ struct r300_vertex_program {
        struct r300_vertex_shader_fragment program;
        struct r300_vertex_shader_fragment params;
        
-       int t2rs;
+       int pos_end;
        unsigned long num_temporaries; /* Number of temp vars used by program */
        int inputs[VERT_ATTRIB_MAX];
+       int tex_regs[8];
 };
 
 /* 64 appears to be the maximum */
index 1448577e12859864b6a0c0f9b9ea8c5159b89c1b..922113c9206119bcd225a929feec3488ad6842da 100644 (file)
@@ -1798,7 +1798,7 @@ void r300SetupVertexProgram(r300ContextPtr rmesa)
 
        R300_STATECHANGE(rmesa, pvs);
        rmesa->hw.pvs.cmd[R300_PVS_CNTL_1]=(0 << R300_PVS_CNTL_1_PROGRAM_START_SHIFT)
-               | (inst_count/*0*/ << R300_PVS_CNTL_1_UNKNOWN_SHIFT)
+               | (inst_count/*pos_end*/ << R300_PVS_CNTL_1_UNKNOWN_SHIFT)
                | (inst_count << R300_PVS_CNTL_1_PROGRAM_END_SHIFT);
        rmesa->hw.pvs.cmd[R300_PVS_CNTL_2]=(0 << R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT)
                | (param_count << R300_PVS_CNTL_2_PARAM_COUNT_SHIFT);
index cbcbdcbe6f26a2ef433d055d7bb6f7d9946f78ef..d5a466414455072b4ee5b191687b2d742bff4a9f 100644 (file)
@@ -230,8 +230,8 @@ void debug_vp(GLcontext *ctx, struct vertex_program *vp)
                        }
                        fprintf(stderr, "%d.", vpi->SrcReg[operand_index].Index);
                        
-                       /*for(i=0; i < 4; i++)
-                               fprintf(stderr, "%s", dst_mask_names[vpi->SrcReg[operand_index].Swizzle[i]]);*/
+                       for(i=0; i < 4; i++)
+                               fprintf(stderr, "%s", dst_mask_names[GET_SWZ(vpi->SrcReg[operand_index].Swizzle, i)]);
                        
                        if(operand_index+1 < (op_names[operator_index].ip & (~FLAG_MASK)) )
                                fprintf(stderr, ",");
@@ -313,6 +313,7 @@ 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:
@@ -320,21 +321,27 @@ static unsigned long t_dst_index(struct r300_vertex_program *vp, struct vp_dst_r
                        case VERT_RESULT_COL0:
                                return 1;
                        case VERT_RESULT_TEX0:
-                               return 2;
                        case VERT_RESULT_TEX1:
-                               return 3;
                        case VERT_RESULT_TEX2:
-                               return 4;
                        case VERT_RESULT_TEX3:
-                               return 5;
                        case VERT_RESULT_TEX4:
-                               return 6;
                        case VERT_RESULT_TEX5:
-                               return 7;
                        case VERT_RESULT_TEX6:
-                               return 8;
                        case VERT_RESULT_TEX7:
-                               return 9;
+                               /* 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:
@@ -517,9 +524,11 @@ void translate_vertex_shader(struct r300_vertex_program *vp)
 #else  
 #define src    vpi->SrcReg     
 #endif                 
-       vp->t2rs=0;
+       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;
@@ -593,6 +602,7 @@ void translate_vertex_shader(struct r300_vertex_program *vp)
                                        t_src_class(src[0].File), VSF_FLAG_NONE);
 
                        o_inst->src3=0;
+
                        goto next;
                        
                case VP_OPCODE_ADD:
@@ -906,23 +916,8 @@ void translate_vertex_shader(struct r300_vertex_program *vp)
                        }
                }
                next: ;
-#if 0                          
-               /* If instruction writes to result and one of the inputs is tmp, we move it at the end of program */
-               if(vpi->DstReg.File == PROGRAM_OUTPUT){
-                       for(operand_index=0; operand_index < operands; operand_index++)
-                               if(src[operand_index].File == PROGRAM_TEMPORARY){
-                                       t2rs[vp->t2rs++]=*o_inst;
-                                       o_inst--; /* FIXME */
-                                       break;
-                               }
-               }
-#endif         
        }
-#if 0  
-       /* Put "tmp to result" instructions in */
-       for(i=0; i < vp->t2rs; i++, o_inst++)
-               *o_inst=t2rs[i];
-#endif         
+       
        vp->program.length=(o_inst - vp->program.body.i) * 4;
        
        if(u_temp_i < vp->num_temporaries)