r300/vertprog: Move Mesa-dependent input/output handling out of compiler
authorNicolai Hähnle <nhaehnle@gmail.com>
Fri, 24 Jul 2009 22:59:31 +0000 (00:59 +0200)
committerNicolai Hähnle <nhaehnle@gmail.com>
Mon, 27 Jul 2009 20:51:37 +0000 (22:51 +0200)
Signed-off-by: Nicolai Hähnle <nhaehnle@gmail.com>
src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c
src/mesa/drivers/dri/r300/compiler/radeon_code.h
src/mesa/drivers/dri/r300/compiler/radeon_compiler.h
src/mesa/drivers/dri/r300/compiler/radeon_program.h
src/mesa/drivers/dri/r300/r300_vertprog.c

index 14dd36354d6ee22f63d5c9f34ff120be51f50f12..339be414cfea4d0ced72868a40a5f46c191a975a 100644 (file)
@@ -310,79 +310,6 @@ static void ei_pow(struct r300_vertex_program_code *vp,
        inst[3] = t_src_scalar(vp, &vpi->SrcReg[1]);
 }
 
-static void t_inputs_outputs(struct r300_vertex_program_compiler * c)
-{
-       int i;
-       int cur_reg;
-       GLuint OutputsWritten, InputsRead;
-
-       OutputsWritten = c->Base.Program.OutputsWritten;
-       InputsRead = c->Base.Program.InputsRead;
-
-       cur_reg = -1;
-       for (i = 0; i < VERT_ATTRIB_MAX; i++) {
-               if (InputsRead & (1 << i))
-                       c->code->inputs[i] = ++cur_reg;
-               else
-                       c->code->inputs[i] = -1;
-       }
-
-       cur_reg = 0;
-       for (i = 0; i < VERT_RESULT_MAX; i++)
-               c->code->outputs[i] = -1;
-
-       assert(OutputsWritten & (1 << VERT_RESULT_HPOS));
-
-       if (OutputsWritten & (1 << VERT_RESULT_HPOS)) {
-               c->code->outputs[VERT_RESULT_HPOS] = cur_reg++;
-       }
-
-       if (OutputsWritten & (1 << VERT_RESULT_PSIZ)) {
-               c->code->outputs[VERT_RESULT_PSIZ] = cur_reg++;
-       }
-
-       /* If we're writing back facing colors we need to send
-        * four colors to make front/back face colors selection work.
-        * If the vertex program doesn't write all 4 colors, lets
-        * pretend it does by skipping output index reg so the colors
-        * get written into appropriate output vectors.
-        */
-       if (OutputsWritten & (1 << VERT_RESULT_COL0)) {
-               c->code->outputs[VERT_RESULT_COL0] = cur_reg++;
-       } else if (OutputsWritten & (1 << VERT_RESULT_BFC0) ||
-               OutputsWritten & (1 << VERT_RESULT_BFC1)) {
-               cur_reg++;
-       }
-
-       if (OutputsWritten & (1 << VERT_RESULT_COL1)) {
-               c->code->outputs[VERT_RESULT_COL1] = cur_reg++;
-       } else if (OutputsWritten & (1 << VERT_RESULT_BFC0) ||
-               OutputsWritten & (1 << VERT_RESULT_BFC1)) {
-               cur_reg++;
-       }
-
-       if (OutputsWritten & (1 << VERT_RESULT_BFC0)) {
-               c->code->outputs[VERT_RESULT_BFC0] = cur_reg++;
-       } else if (OutputsWritten & (1 << VERT_RESULT_BFC1)) {
-               cur_reg++;
-       }
-
-       if (OutputsWritten & (1 << VERT_RESULT_BFC1)) {
-               c->code->outputs[VERT_RESULT_BFC1] = cur_reg++;
-       } else if (OutputsWritten & (1 << VERT_RESULT_BFC0)) {
-               cur_reg++;
-       }
-
-       for (i = VERT_RESULT_TEX0; i <= VERT_RESULT_TEX7; i++) {
-               if (OutputsWritten & (1 << i)) {
-                       c->code->outputs[i] = cur_reg++;
-               }
-       }
-
-       if (OutputsWritten & (1 << VERT_RESULT_FOGC)) {
-               c->code->outputs[VERT_RESULT_FOGC] = cur_reg++;
-       }
-}
 
 static void translate_vertex_program(struct r300_vertex_program_compiler * compiler)
 {
@@ -391,7 +318,7 @@ static void translate_vertex_program(struct r300_vertex_program_compiler * compi
        compiler->code->pos_end = 0;    /* Not supported yet */
        compiler->code->length = 0;
 
-       t_inputs_outputs(compiler);
+       compiler->SetHwInputOutput(compiler);
 
        for(rci = compiler->Base.Program.Instructions.Next; rci != &compiler->Base.Program.Instructions; rci = rci->Next) {
                struct prog_instruction *vpi = &rci->I;
@@ -624,23 +551,6 @@ static GLboolean swizzleIsNative(GLuint opcode, struct prog_src_register reg)
 
 void r3xx_compile_vertex_program(struct r300_vertex_program_compiler* compiler)
 {
-       rc_mesa_to_rc_program(&compiler->Base, compiler->program);
-       compiler->program = 0;
-
-       rc_move_output(&compiler->Base, VERT_RESULT_PSIZ, VERT_RESULT_PSIZ, WRITEMASK_X);
-
-       if (compiler->state.WPosAttr != FRAG_ATTRIB_MAX) {
-               rc_copy_output(&compiler->Base,
-                       VERT_RESULT_HPOS,
-                       compiler->state.WPosAttr - FRAG_ATTRIB_TEX0 + VERT_RESULT_TEX0);
-       }
-
-       if (compiler->state.FogAttr != FRAG_ATTRIB_MAX) {
-               rc_move_output(&compiler->Base,
-                       VERT_RESULT_FOGC,
-                       compiler->state.FogAttr - FRAG_ATTRIB_TEX0 + VERT_RESULT_TEX0, WRITEMASK_X);
-       }
-
        addArtificialOutputs(compiler);
 
        {
index 5489931434fe7051ca8444cd2fb7cc0b6ccbd30b..6f51358f55e9453e9b86ebb2186cefa0bb3c4cdd 100644 (file)
@@ -185,11 +185,6 @@ struct rX00_fragment_program_code {
 #define VSF_MAX_FRAGMENT_LENGTH (255*4)
 #define VSF_MAX_FRAGMENT_TEMPS (14)
 
-struct r300_vertex_program_external_state {
-       GLuint FogAttr;
-       GLuint WPosAttr;
-};
-
 struct r300_vertex_program_code {
        int length;
        union {
index a4ff2ca86ab0651db4043b6f378b94fe062c7ff3..6b251ba7f19e97948d2db54b20ab39f81c8d8300 100644 (file)
@@ -64,6 +64,8 @@ void rc_destroy(struct radeon_compiler * c);
 void rc_debug(struct radeon_compiler * c, const char * fmt, ...);
 void rc_error(struct radeon_compiler * c, const char * fmt, ...);
 
+void rc_mesa_to_rc_program(struct radeon_compiler * c, struct gl_program * program);
+
 void rc_move_input(struct radeon_compiler * c, unsigned input, struct prog_src_register new_input);
 void rc_move_output(struct radeon_compiler * c, unsigned output, unsigned new_output, unsigned writemask);
 void rc_copy_output(struct radeon_compiler * c, unsigned output, unsigned dup_output);
@@ -83,9 +85,9 @@ void r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c);
 struct r300_vertex_program_compiler {
        struct radeon_compiler Base;
        struct r300_vertex_program_code *code;
-       struct r300_vertex_program_external_state state;
        GLbitfield RequiredOutputs;
-       struct gl_program *program;
+
+       void (*SetHwInputOutput)(struct r300_vertex_program_compiler * c);
 };
 
 void r3xx_compile_vertex_program(struct r300_vertex_program_compiler* c);
index 1a34b50ed7216dcadfb931f90a0b8c1227cfaa4d..561958608cab4170741ec65201306996cf3ef3d3 100644 (file)
@@ -116,7 +116,6 @@ struct rc_instruction *rc_alloc_instruction(struct radeon_compiler * c);
 struct rc_instruction *rc_insert_new_instruction(struct radeon_compiler * c, struct rc_instruction * after);
 void rc_remove_instruction(struct rc_instruction * inst);
 
-void rc_mesa_to_rc_program(struct radeon_compiler * c, struct gl_program * program);
 void rc_print_program(const struct rc_program *prog);
 
 #endif
index 27ec23975a48172116873750b49986be5a552e23..69d6b021d5c6b4a990c134397ee8f51d9aa9b1cc 100644 (file)
@@ -128,6 +128,82 @@ static GLbitfield compute_required_outputs(struct gl_vertex_program * vp, GLbitf
        return outputs;
 }
 
+
+static void t_inputs_outputs(struct r300_vertex_program_compiler * c)
+{
+       int i;
+       int cur_reg;
+       GLuint OutputsWritten, InputsRead;
+
+       OutputsWritten = c->Base.Program.OutputsWritten;
+       InputsRead = c->Base.Program.InputsRead;
+
+       cur_reg = -1;
+       for (i = 0; i < VERT_ATTRIB_MAX; i++) {
+               if (InputsRead & (1 << i))
+                       c->code->inputs[i] = ++cur_reg;
+               else
+                       c->code->inputs[i] = -1;
+       }
+
+       cur_reg = 0;
+       for (i = 0; i < VERT_RESULT_MAX; i++)
+               c->code->outputs[i] = -1;
+
+       assert(OutputsWritten & (1 << VERT_RESULT_HPOS));
+
+       if (OutputsWritten & (1 << VERT_RESULT_HPOS)) {
+               c->code->outputs[VERT_RESULT_HPOS] = cur_reg++;
+       }
+
+       if (OutputsWritten & (1 << VERT_RESULT_PSIZ)) {
+               c->code->outputs[VERT_RESULT_PSIZ] = cur_reg++;
+       }
+
+       /* If we're writing back facing colors we need to send
+        * four colors to make front/back face colors selection work.
+        * If the vertex program doesn't write all 4 colors, lets
+        * pretend it does by skipping output index reg so the colors
+        * get written into appropriate output vectors.
+        */
+       if (OutputsWritten & (1 << VERT_RESULT_COL0)) {
+               c->code->outputs[VERT_RESULT_COL0] = cur_reg++;
+       } else if (OutputsWritten & (1 << VERT_RESULT_BFC0) ||
+               OutputsWritten & (1 << VERT_RESULT_BFC1)) {
+               cur_reg++;
+       }
+
+       if (OutputsWritten & (1 << VERT_RESULT_COL1)) {
+               c->code->outputs[VERT_RESULT_COL1] = cur_reg++;
+       } else if (OutputsWritten & (1 << VERT_RESULT_BFC0) ||
+               OutputsWritten & (1 << VERT_RESULT_BFC1)) {
+               cur_reg++;
+       }
+
+       if (OutputsWritten & (1 << VERT_RESULT_BFC0)) {
+               c->code->outputs[VERT_RESULT_BFC0] = cur_reg++;
+       } else if (OutputsWritten & (1 << VERT_RESULT_BFC1)) {
+               cur_reg++;
+       }
+
+       if (OutputsWritten & (1 << VERT_RESULT_BFC1)) {
+               c->code->outputs[VERT_RESULT_BFC1] = cur_reg++;
+       } else if (OutputsWritten & (1 << VERT_RESULT_BFC0)) {
+               cur_reg++;
+       }
+
+       for (i = VERT_RESULT_TEX0; i <= VERT_RESULT_TEX7; i++) {
+               if (OutputsWritten & (1 << i)) {
+                       c->code->outputs[i] = cur_reg++;
+               }
+       }
+
+       if (OutputsWritten & (1 << VERT_RESULT_FOGC)) {
+               c->code->outputs[VERT_RESULT_FOGC] = cur_reg++;
+       }
+}
+
+
 static struct r300_vertex_program *build_program(GLcontext *ctx,
                                                 struct r300_vertex_program_key *wanted_key,
                                                 const struct gl_vertex_program *mesa_vp)
@@ -143,19 +219,33 @@ static struct r300_vertex_program *build_program(GLcontext *ctx,
        compiler.Base.Debug = (RADEON_DEBUG & DEBUG_VERTS) ? GL_TRUE : GL_FALSE;
 
        compiler.code = &vp->code;
-       compiler.state.FogAttr = vp->key.FogAttr;
-       compiler.state.WPosAttr = vp->key.WPosAttr;
        compiler.RequiredOutputs = compute_required_outputs(vp->Base, vp->key.FpReads);
-       compiler.program = &vp->Base->Base;
+       compiler.SetHwInputOutput = &t_inputs_outputs;
 
        if (compiler.Base.Debug) {
                fprintf(stderr, "Initial vertex program:\n");
-               _mesa_print_program(compiler.program);
+               _mesa_print_program(&vp->Base->Base);
                fflush(stdout);
        }
 
        if (mesa_vp->IsPositionInvariant) {
-               _mesa_insert_mvp_code(ctx, (struct gl_vertex_program *)compiler.program);
+               _mesa_insert_mvp_code(ctx, vp->Base);
+       }
+
+       rc_mesa_to_rc_program(&compiler.Base, &vp->Base->Base);
+
+       rc_move_output(&compiler.Base, VERT_RESULT_PSIZ, VERT_RESULT_PSIZ, WRITEMASK_X);
+
+       if (vp->key.WPosAttr != FRAG_ATTRIB_MAX) {
+               rc_copy_output(&compiler.Base,
+                       VERT_RESULT_HPOS,
+                       vp->key.WPosAttr - FRAG_ATTRIB_TEX0 + VERT_RESULT_TEX0);
+       }
+
+       if (vp->key.FogAttr != FRAG_ATTRIB_MAX) {
+               rc_move_output(&compiler.Base,
+                       VERT_RESULT_FOGC,
+                       vp->key.FogAttr - FRAG_ATTRIB_TEX0 + VERT_RESULT_TEX0, WRITEMASK_X);
        }
 
        r3xx_compile_vertex_program(&compiler);