rendered paste bodydiff --git a/src/mesa/drivers/dri/r300/r300_emit.c b/src/mesa/drivers/dri/r300/r300_emit.cindex 80bd338..67a94c8 100644--- a/src/mesa/drivers/dri/r300/r300_emit.c+++ b/src/mesa/drivers/dri/r300/r300_emit.c@@ -388,6 +388,11 @@ int r300EmitArrays(GLcontext * ctx) OutputsWritten |= 1 << VERT_RESULT_COL1; } + if (RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_FOG)) {+ InputsRead |= 1 << VERT_ATTRIB_FOG;+ OutputsWritten |= 1 << VERT_RESULT_FOGC;+ }+ for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { if (RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_TEX(i))) { InputsRead |= 1 << (VERT_ATTRIB_TEX0 + i);@@ -415,6 +420,8 @@ int r300EmitArrays(GLcontext * ctx) for (i = VERT_ATTRIB_TEX0; i <= VERT_ATTRIB_TEX7; i++) if (InputsRead & (1 << i)) inputs[i] = 6 + (i - VERT_ATTRIB_TEX0);+ if (InputsRead & (1 << VERT_ATTRIB_FOG))+ inputs[VERT_ATTRIB_FOG] = 14; RENDERINPUTS_COPY(rmesa->state.render_inputs_bitset, render_inputs_bitset); }diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.cindex 50136d5..ce08d5f 100644--- a/src/mesa/drivers/dri/r300/r300_fragprog.c+++ b/src/mesa/drivers/dri/r300/r300_fragprog.c@@ -341,7 +341,7 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler) 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_ZERO, SWIZZLE_ZERO, SWIZZLE_ONE);+ MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ONE); for (; i < compiler->program->NumInstructions; ++i) { int reg;diff --git a/src/mesa/drivers/dri/r300/r300_vertprog.c b/src/mesa/drivers/dri/r300/r300_vertprog.cindex 392397b..a25b82e 100644--- a/src/mesa/drivers/dri/r300/r300_vertprog.c+++ b/src/mesa/drivers/dri/r300/r300_vertprog.c@@ -1345,7 +1345,7 @@ static void insert_wpos(struct r300_vertex_program *vp, struct gl_program *prog, vpi_insert[i].DstReg.File = PROGRAM_OUTPUT; vpi_insert[i].DstReg.Index = VERT_RESULT_TEX0 + vp->wpos_idx;- vpi_insert[i].DstReg.WriteMask = WRITEMASK_XYZW;+ vpi_insert[i].DstReg.WriteMask = WRITEMASK_XYW; vpi_insert[i].DstReg.CondMask = COND_TR; vpi_insert[i].SrcReg[0].File = PROGRAM_TEMPORARY;@@ -1381,6 +1381,27 @@ static void pos_as_texcoord(struct r300_vertex_program *vp, insert_wpos(vp, prog, tempregi); } +static void fogc_to_wpos(struct r300_vertex_program *vp,+ struct gl_program *prog)+{+ struct prog_instruction *vpi;+ int i;+ GLuint swiz;++ for (vpi = prog->Instructions; vpi->Opcode != OPCODE_END; vpi++) {+ if (vpi->DstReg.File == PROGRAM_OUTPUT+ && vpi->DstReg.Index == VERT_RESULT_FOGC) {+ vpi->DstReg.Index = VERT_RESULT_TEX0 + vp->wpos_idx;+ vpi->DstReg.WriteMask = WRITEMASK_Z;+ for (i = 0; i < 3; i++) {+ swiz = GET_SWZ(vpi->SrcReg[i].Swizzle, 0);+ vpi->SrcReg[i].Swizzle = MAKE_SWIZZLE4(swiz,+ swiz, swiz, swiz);+ }+ }+ }+}+ static struct r300_vertex_program *build_program(struct r300_vertex_program_key *wanted_key, struct gl_vertex_program *mesa_vp, GLint wpos_idx)@@ -1395,7 +1416,11 @@ static struct r300_vertex_program *build_program(struct r300_vertex_program_key position_invariant(&mesa_vp->Base); } + if (wpos_idx > -1) {+ if (mesa_vp->Base.OutputsWritten & VERT_RESULT_FOGC) {+ fogc_to_wpos(vp, &mesa_vp->Base);+ } pos_as_texcoord(vp, &mesa_vp->Base); } @@ -1472,7 +1497,7 @@ void r300SelectVertexShader(r300ContextPtr r300) r300->selected_vp = vp; return; }- //_mesa_print_program(&vpc->mesa_program.Base);+ _mesa_print_program(&vpc->mesa_program.Base); vp = build_program(&wanted_key, &vpc->mesa_program, wpos_idx); vp->next = vpc->progs;diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.cindex a39a540..4fcfc67 100644--- a/src/mesa/drivers/dri/r300/r500_fragprog.c+++ b/src/mesa/drivers/dri/r300/r500_fragprog.c@@ -277,7 +277,7 @@ static void insert_WPOS_trailer(struct r500_fragment_program_compiler *compiler) 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_ZERO, SWIZZLE_ZERO, SWIZZLE_ONE);+ MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ONE); for (; i < compiler->program->NumInstructions; ++i) { int reg;