r300: use mesa provided function for adding MVP code
authorMaciej Cencora <m.cencora@gmail.com>
Mon, 29 Jun 2009 19:48:35 +0000 (21:48 +0200)
committerMaciej Cencora <m.cencora@gmail.com>
Mon, 13 Jul 2009 17:25:54 +0000 (19:25 +0200)
src/mesa/drivers/dri/r300/r300_context.c
src/mesa/drivers/dri/r300/r300_vertprog.c

index b7d75426c57fc0a55cb2d22f72e7742e5a5ddd1d..6f3aab986d236269f06a2c8ef3a5f57d342b1ef8 100644 (file)
@@ -418,8 +418,6 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
 
        _mesa_set_mvp_with_dp4( ctx, GL_TRUE );
 
-       _mesa_set_mvp_with_dp4( ctx, GL_TRUE );
-
        /* Initialize the software rasterizer and helper modules.
         */
        _swrast_CreateContext(ctx);
index 1d198cde4293919215fc52b7ab26c91cc14f10a2..5da9bda281b9b9507ab9ca1763d0eb782b3f51e8 100644 (file)
@@ -32,6 +32,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "main/macros.h"
 #include "main/enums.h"
 #include "shader/program.h"
+#include "shader/programopt.h"
 #include "shader/prog_instruction.h"
 #include "shader/prog_parameter.h"
 #include "shader/prog_print.h"
@@ -1191,94 +1192,6 @@ static void r300TranslateVertexShader(struct r300_vertex_program *vp,
        }
 }
 
-/* DP4 version seems to trigger some hw peculiarity */
-//#define PREFER_DP4
-
-static void position_invariant(struct gl_program *prog)
-{
-       struct prog_instruction *vpi;
-       struct gl_program_parameter_list *paramList;
-       int i;
-
-       gl_state_index tokens[STATE_LENGTH] = { STATE_MVP_MATRIX, 0, 0, 0, 0 };
-
-       /* tokens[4] = matrix modifier */
-#ifdef PREFER_DP4
-       tokens[4] = 0;          /* not transposed or inverted */
-#else
-       tokens[4] = STATE_MATRIX_TRANSPOSE;
-#endif
-       paramList = prog->Parameters;
-
-       vpi = _mesa_alloc_instructions(prog->NumInstructions + 4);
-       _mesa_init_instructions(vpi, prog->NumInstructions + 4);
-
-       for (i = 0; i < 4; i++) {
-               GLint idx;
-               tokens[2] = tokens[3] = i;      /* matrix row[i]..row[i] */
-               idx = _mesa_add_state_reference(paramList, tokens);
-#ifdef PREFER_DP4
-               vpi[i].Opcode = OPCODE_DP4;
-               vpi[i].StringPos = 0;
-               vpi[i].Data = 0;
-
-               vpi[i].DstReg.File = PROGRAM_OUTPUT;
-               vpi[i].DstReg.Index = VERT_RESULT_HPOS;
-               vpi[i].DstReg.WriteMask = 1 << i;
-               vpi[i].DstReg.CondMask = COND_TR;
-
-               vpi[i].SrcReg[0].File = PROGRAM_STATE_VAR;
-               vpi[i].SrcReg[0].Index = idx;
-               vpi[i].SrcReg[0].Swizzle = SWIZZLE_XYZW;
-
-               vpi[i].SrcReg[1].File = PROGRAM_INPUT;
-               vpi[i].SrcReg[1].Index = VERT_ATTRIB_POS;
-               vpi[i].SrcReg[1].Swizzle = SWIZZLE_XYZW;
-#else
-               if (i == 0)
-                       vpi[i].Opcode = OPCODE_MUL;
-               else
-                       vpi[i].Opcode = OPCODE_MAD;
-
-               vpi[i].Data = 0;
-
-               if (i == 3)
-                       vpi[i].DstReg.File = PROGRAM_OUTPUT;
-               else
-                       vpi[i].DstReg.File = PROGRAM_TEMPORARY;
-               vpi[i].DstReg.Index = 0;
-               vpi[i].DstReg.WriteMask = 0xf;
-               vpi[i].DstReg.CondMask = COND_TR;
-
-               vpi[i].SrcReg[0].File = PROGRAM_STATE_VAR;
-               vpi[i].SrcReg[0].Index = idx;
-               vpi[i].SrcReg[0].Swizzle = SWIZZLE_XYZW;
-
-               vpi[i].SrcReg[1].File = PROGRAM_INPUT;
-               vpi[i].SrcReg[1].Index = VERT_ATTRIB_POS;
-               vpi[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(i, i, i, i);
-
-               if (i > 0) {
-                       vpi[i].SrcReg[2].File = PROGRAM_TEMPORARY;
-                       vpi[i].SrcReg[2].Index = 0;
-                       vpi[i].SrcReg[2].Swizzle = SWIZZLE_XYZW;
-               }
-#endif
-       }
-
-       _mesa_copy_instructions(&vpi[i], prog->Instructions,
-                               prog->NumInstructions);
-
-       free(prog->Instructions);
-
-       prog->Instructions = vpi;
-
-       prog->NumInstructions += 4;
-       vpi = &prog->Instructions[prog->NumInstructions - 1];
-
-       assert(vpi->Opcode == OPCODE_END);
-}
-
 static void insert_wpos(struct r300_vertex_program *vp, struct gl_program *prog,
                        GLuint temp_index)
 {
@@ -1335,9 +1248,10 @@ static void pos_as_texcoord(struct r300_vertex_program *vp,
        insert_wpos(vp, prog, tempregi);
 }
 
-static struct r300_vertex_program *build_program(struct r300_vertex_program_key
-                                                *wanted_key, struct gl_vertex_program
-                                                *mesa_vp, GLint wpos_idx)
+static struct r300_vertex_program *build_program(GLcontext *ctx,
+                                                struct r300_vertex_program_key *wanted_key,
+                                                struct gl_vertex_program *mesa_vp,
+                                                GLint wpos_idx)
 {
        struct r300_vertex_program *vp;
 
@@ -1346,7 +1260,7 @@ static struct r300_vertex_program *build_program(struct r300_vertex_program_key
        vp->wpos_idx = wpos_idx;
 
        if (mesa_vp->IsPositionInvariant) {
-               position_invariant(&mesa_vp->Base);
+               _mesa_insert_mvp_code(ctx, mesa_vp);
        }
 
        if (wpos_idx > -1) {
@@ -1480,7 +1394,7 @@ void r300SelectVertexShader(r300ContextPtr r300)
                fflush(stdout);
        }
 
-       vp = build_program(&wanted_key, &vpc->mesa_program, wpos_idx);
+       vp = build_program(ctx, &wanted_key, &vpc->mesa_program, wpos_idx);
        vp->next = vpc->progs;
        vpc->progs = vp;
        r300->selected_vp = vp;