Committed Rune Petersen's fragment.position patch (Bug #10024) plus a few small
authorOliver McFadden <z3ro.geek@gmail.com>
Thu, 15 Mar 2007 17:35:34 +0000 (17:35 +0000)
committerOliver McFadden <z3ro.geek@gmail.com>
Thu, 15 Mar 2007 17:35:34 +0000 (17:35 +0000)
corrections.

src/mesa/drivers/dri/r300/r300_fragprog.c
src/mesa/drivers/dri/r300/r300_state.c
src/mesa/drivers/dri/r300/r300_state.h
src/mesa/drivers/dri/r300/r300_vertexprog.c

index a1c634a54d0662096e289f6e898d3fe5ccbee777..d3062a414506daf47ac895526dac34248f78cd27 100644 (file)
@@ -49,6 +49,7 @@
 #include "r300_context.h"
 #include "r300_fragprog.h"
 #include "r300_reg.h"
+#include "r300_state.h"
 
 /*
  * Usefull macros and values
@@ -1787,6 +1788,94 @@ static GLboolean parse_program(struct r300_fragment_program *rp)
        return GL_TRUE;
 }
 
+static void insert_wpos(struct gl_program *prog)
+{
+       GLint tokens[6] = { STATE_INTERNAL, STATE_R300_WINDOW_DIMENSION, 0, 0, 0, 0 };
+       struct prog_instruction *fpi;
+       GLuint window_index;
+       int i = 0;
+       GLuint tempregi = prog->NumTemporaries;
+       /* should do something else if no temps left... */
+       prog->NumTemporaries++;
+
+       
+       fpi = malloc((prog->NumInstructions + 3) * sizeof(struct prog_instruction));
+       /* all including END */
+       memcpy(&fpi[3], prog->Instructions, prog->NumInstructions * sizeof(struct prog_instruction));
+       
+       memset(fpi, 0, 3 * sizeof(struct prog_instruction));
+
+       /* perspective divide */
+       fpi[i].Opcode = OPCODE_RCP;
+
+       fpi[i].DstReg.File = PROGRAM_TEMPORARY;
+       fpi[i].DstReg.Index = tempregi;
+       fpi[i].DstReg.WriteMask = WRITEMASK_W;
+       fpi[i].DstReg.CondMask = COND_TR;
+
+       fpi[i].SrcReg[0].File = PROGRAM_INPUT;
+       fpi[i].SrcReg[0].Index = FRAG_ATTRIB_WPOS;
+       fpi[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W);
+       i++;
+
+       fpi[i].Opcode = OPCODE_MUL;
+
+       fpi[i].DstReg.File = PROGRAM_TEMPORARY;
+       fpi[i].DstReg.Index = tempregi;
+       fpi[i].DstReg.WriteMask = WRITEMASK_XYZ;
+       fpi[i].DstReg.CondMask = COND_TR;
+
+       fpi[i].SrcReg[0].File = PROGRAM_INPUT;
+       fpi[i].SrcReg[0].Index = FRAG_ATTRIB_WPOS;
+       fpi[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W);
+
+       fpi[i].SrcReg[1].File = PROGRAM_TEMPORARY;
+       fpi[i].SrcReg[1].Index = tempregi;
+       fpi[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W);
+       i++;
+
+       /* viewport transformation */
+       window_index = _mesa_add_state_reference(prog->Parameters, tokens);
+
+       fpi[i].Opcode = OPCODE_MAD;
+
+       fpi[i].DstReg.File = PROGRAM_TEMPORARY;
+       fpi[i].DstReg.Index = tempregi;
+       fpi[i].DstReg.WriteMask = WRITEMASK_XYZ;
+       fpi[i].DstReg.CondMask = COND_TR;
+
+       fpi[i].SrcReg[0].File = PROGRAM_TEMPORARY;
+       fpi[i].SrcReg[0].Index = tempregi;
+       fpi[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
+
+       fpi[i].SrcReg[1].File = PROGRAM_STATE_VAR;
+       fpi[i].SrcReg[1].Index = window_index;
+       fpi[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
+
+       fpi[i].SrcReg[2].File = PROGRAM_STATE_VAR;
+       fpi[i].SrcReg[2].Index = window_index;
+       fpi[i].SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
+       i++;
+
+       free(prog->Instructions);
+
+       prog->Instructions = fpi;
+
+       prog->NumInstructions += i;
+       fpi = &prog->Instructions[prog->NumInstructions-1];
+
+       assert(fpi->Opcode == OPCODE_END);
+       
+       for(fpi = &prog->Instructions[3]; fpi->Opcode != OPCODE_END; fpi++){
+               for(i=0; i<3; i++)
+                   if( fpi->SrcReg[i].File == PROGRAM_INPUT &&
+                       fpi->SrcReg[i].Index == FRAG_ATTRIB_WPOS ){
+                           fpi->SrcReg[i].File = PROGRAM_TEMPORARY;
+                           fpi->SrcReg[i].Index = tempregi;
+                   }
+       }
+}
+
 /* - Init structures
  * - Determine what hwregs each input corresponds to
  */
@@ -1844,6 +1933,7 @@ static void init_program(r300ContextPtr r300, struct r300_fragment_program *rp)
        if (InputsRead & FRAG_BIT_WPOS) {
                cs->inputs[FRAG_ATTRIB_WPOS].refcount = 0;
                cs->inputs[FRAG_ATTRIB_WPOS].reg = get_hw_temp(rp);
+               insert_wpos(&mp->Base);
        }
        InputsRead &= ~FRAG_BIT_WPOS;
 
@@ -1956,6 +2046,7 @@ void r300_translate_fragment_shader(r300ContextPtr r300, struct r300_fragment_pr
        
                rp->translated = GL_TRUE;
                if (0) dump_program(rp);
+               r300UpdateStateParameters(rp->ctx, _NEW_PROGRAM);
        }
 
        update_params(rp);
index 895c2ff43ccf8c054c33c151a08003b20b4177a5..fcb61a2831600399719805c14fdc1ab047a67be9 100644 (file)
@@ -1066,8 +1066,8 @@ static void r300FetchStateParameter(GLcontext *ctx, const enum state_index state
        switch(state[1])
        {
        case STATE_R300_WINDOW_DIMENSION:
-           value[0] = r300->radeon.dri.drawable->w;    /* width */
-           value[1] = r300->radeon.dri.drawable->h;    /* height */
+           value[0] = r300->radeon.dri.drawable->w*0.5f;/* width*0.5 */
+           value[1] = r300->radeon.dri.drawable->h*0.5f;/* height*0.5 */
            value[2] = 0.5F;                            /* for moving range [-1 1] -> [0 1] */
            value[3] = 1.0F;                            /* not used */
            break;
@@ -1081,20 +1081,20 @@ static void r300FetchStateParameter(GLcontext *ctx, const enum state_index state
  * Update R300's own internal state parameters.
  * For now just STATE_R300_WINDOW_DIMENSION
  */
-static void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state)
+void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state)
 {
-       struct r300_vertex_program_cont *vpc;
+       struct r300_fragment_program *fp;
        struct gl_program_parameter_list *paramList;
        GLuint i;
 
        if(!(new_state & (_NEW_BUFFERS|_NEW_PROGRAM)))
            return;
 
-       vpc = (struct r300_vertex_program_cont *)ctx->VertexProgram._Current;
-       if (!vpc)
+       fp = (struct r300_fragment_program *)ctx->FragmentProgram._Current;
+       if (!fp)
            return;
 
-       paramList = vpc->mesa_program.Base.Parameters;
+       paramList = fp->mesa_program.Base.Parameters;
 
        if (!paramList)
            return;
index f6a50655d1bb719192e472d72486e85a63b4866c..52e606f241682207581180760292f603a3059da3 100644 (file)
@@ -61,6 +61,7 @@ do {                                                  \
        
 extern void r300ResetHwState(r300ContextPtr r300);
 
+extern void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state);
 extern void r300InitState(r300ContextPtr r300);
 extern void r300InitStateFuncs(struct dd_function_table* functions);
 extern void r300UpdateViewportOffset( GLcontext *ctx );
index 2ff92e13289060c979fb23990e5ae14be962f218..68a11a42b3ae8f29392017c1972ebdc17aa5ef77 100644 (file)
@@ -962,22 +962,19 @@ static void insert_wpos(struct r300_vertex_program *vp,
                       struct gl_program *prog,
                       GLuint temp_index)
 {
-
-       GLint tokens[6] = { STATE_INTERNAL, STATE_R300_WINDOW_DIMENSION, 0, 0, 0, 0 };
        struct prog_instruction *vpi;
        struct prog_instruction *vpi_insert;
-       GLuint window_index;
        int i = 0;
        
-       vpi = malloc((prog->NumInstructions + 5) * sizeof(struct prog_instruction));
+       vpi = malloc((prog->NumInstructions + 2) * sizeof(struct prog_instruction));
        /* all but END */
        memcpy(vpi, prog->Instructions, (prog->NumInstructions - 1) * sizeof(struct prog_instruction));
        /* END */
-       memcpy(&vpi[prog->NumInstructions + 4], &prog->Instructions[prog->NumInstructions - 1],
+       memcpy(&vpi[prog->NumInstructions + 1], &prog->Instructions[prog->NumInstructions - 1],
                sizeof(struct prog_instruction));
        
        vpi_insert = &vpi[prog->NumInstructions - 1];
-       memset(vpi_insert, 0, 5 * sizeof(struct prog_instruction));
+       memset(vpi_insert, 0, 2 * sizeof(struct prog_instruction));
 
        vpi_insert[i].Opcode = OPCODE_MOV;
 
@@ -991,59 +988,7 @@ static void insert_wpos(struct r300_vertex_program *vp,
        vpi_insert[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W);
        i++;
 
-       /* perspective divide */
-       vpi_insert[i].Opcode = OPCODE_RCP;
-
-       vpi_insert[i].DstReg.File = PROGRAM_TEMPORARY;
-       vpi_insert[i].DstReg.Index = temp_index;
-       vpi_insert[i].DstReg.WriteMask = WRITEMASK_W;
-       vpi_insert[i].DstReg.CondMask = COND_TR;
-
-       vpi_insert[i].SrcReg[0].File = PROGRAM_TEMPORARY;
-       vpi_insert[i].SrcReg[0].Index = temp_index;
-       vpi_insert[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO);
-       i++;
-
-       vpi_insert[i].Opcode = OPCODE_MUL;
-
-       vpi_insert[i].DstReg.File = PROGRAM_TEMPORARY;
-       vpi_insert[i].DstReg.Index = temp_index;
-       vpi_insert[i].DstReg.WriteMask = WRITEMASK_XYZ;
-       vpi_insert[i].DstReg.CondMask = COND_TR;
-
-       vpi_insert[i].SrcReg[0].File = PROGRAM_TEMPORARY;
-       vpi_insert[i].SrcReg[0].Index = temp_index;
-       vpi_insert[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
-
-       vpi_insert[i].SrcReg[1].File = PROGRAM_TEMPORARY;
-       vpi_insert[i].SrcReg[1].Index = temp_index;
-       vpi_insert[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_ZERO);
-       i++;
-
-       /* viewport transformation */
-       window_index = _mesa_add_state_reference(prog->Parameters, tokens);
-
-       vpi_insert[i].Opcode = OPCODE_MAD;
-
-       vpi_insert[i].DstReg.File = PROGRAM_TEMPORARY;
-       vpi_insert[i].DstReg.Index = temp_index;
-       vpi_insert[i].DstReg.WriteMask = WRITEMASK_XYZ;
-       vpi_insert[i].DstReg.CondMask = COND_TR;
-
-       vpi_insert[i].SrcReg[0].File = PROGRAM_TEMPORARY;
-       vpi_insert[i].SrcReg[0].Index = temp_index;
-       vpi_insert[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO);
-
-       vpi_insert[i].SrcReg[1].File = PROGRAM_STATE_VAR;
-       vpi_insert[i].SrcReg[1].Index = window_index;
-       vpi_insert[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_ZERO);
-
-       vpi_insert[i].SrcReg[2].File = PROGRAM_STATE_VAR;
-       vpi_insert[i].SrcReg[2].Index = window_index;
-       vpi_insert[i].SrcReg[2].Swizzle = MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_ZERO);
-       i++;
-
-       vpi_insert[i].Opcode = OPCODE_MUL;
+       vpi_insert[i].Opcode = OPCODE_MOV;
 
        vpi_insert[i].DstReg.File = PROGRAM_OUTPUT;
        vpi_insert[i].DstReg.Index = VERT_RESULT_TEX0+vp->wpos_idx;
@@ -1053,10 +998,6 @@ static void insert_wpos(struct r300_vertex_program *vp,
        vpi_insert[i].SrcReg[0].File = PROGRAM_TEMPORARY;
        vpi_insert[i].SrcReg[0].Index = temp_index;
        vpi_insert[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W);
-
-       vpi_insert[i].SrcReg[1].File = PROGRAM_STATE_VAR;
-       vpi_insert[i].SrcReg[1].Index = window_index;
-       vpi_insert[i].SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_ONE, SWIZZLE_ONE);
        i++;
 
        free(prog->Instructions);