rendered paste bodydiff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.cindex 4ef7f2b..33e2680 100644--- a/src/mesa/drivers/dri/r300/r300_fragprog.c+++ b/src/mesa/drivers/dri/r300/r300_fragprog.c@@ -259,7 +259,7 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler) { GLuint InputsRead = compiler->fp->mesa_program.Base.InputsRead; - if (!(InputsRead & FRAG_BIT_WPOS))+ if (!(InputsRead & (FRAG_BIT_WPOS | FRAG_BIT_FOGC))) return; static gl_state_index tokens[STATE_LENGTH] = {@@ -269,8 +269,9 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler) GLuint window_index; int i = 0; GLuint tempregi = _mesa_find_free_register(compiler->program, PROGRAM_TEMPORARY);+ GLuint tempregf = _mesa_find_free_register(compiler->program, PROGRAM_TEMPORARY); - _mesa_insert_instructions(compiler->program, 0, 3);+ _mesa_insert_instructions(compiler->program, 0, 4); fpi = compiler->program->Instructions; /* perspective divide */@@ -328,6 +329,18 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler) MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO); i++; + fpi[i].Opcode = OPCODE_MOV;++ fpi[i].DstReg.File = PROGRAM_TEMPORARY;+ fpi[i].DstReg.Index = tempregf;+ fpi[i].DstReg.WriteMask = WRITEMASK_XYZW;+ 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_Z, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ONE);+ for (; i < compiler->program->NumInstructions; ++i) { int reg; for (reg = 0; reg < 3; reg++) {@@ -335,6 +348,10 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler) fpi[i].SrcReg[reg].Index == FRAG_ATTRIB_WPOS) { fpi[i].SrcReg[reg].File = PROGRAM_TEMPORARY; fpi[i].SrcReg[reg].Index = tempregi;+ } else if (fpi[i].SrcReg[reg].File == PROGRAM_INPUT+ && fpi[i].SrcReg[reg].Index == FRAG_ATTRIB_FOGC) {+ fpi[i].SrcReg[reg].File = PROGRAM_TEMPORARY;+ fpi[i].SrcReg[reg].Index = tempregf; } } }diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.cindex 6a5c363..b2b5737 100644--- a/src/mesa/drivers/dri/r300/r300_state.c+++ b/src/mesa/drivers/dri/r300/r300_state.c@@ -1643,6 +1643,11 @@ static void r300SetupRSUnit(GLcontext * ctx) r300->hw.rr.cmd[R300_RR_INST_1] = 0; + if (InputsRead & FRAG_BIT_FOGC) {+ InputsRead |= FRAG_BIT_WPOS;+ InputsRead &= ~FRAG_BIT_FOGC;+ }+ if (InputsRead & FRAG_BIT_WPOS) { for (i = 0; i < ctx->Const.MaxTextureUnits; i++) if (!(InputsRead & (FRAG_BIT_TEX0 << i)))@@ -2619,7 +2624,7 @@ static void r500SetupPixelShader(r300ContextPtr rmesa) return; } code = &fp->code;-+#if 0 if (fp->mesa_program.FogOption != GL_NONE) { /* Enable HW fog. Try not to squish GL context. * (Anybody sane remembered to set glFog() opts first!) */@@ -2629,7 +2634,7 @@ static void r500SetupPixelShader(r300ContextPtr rmesa) } else /* Make sure HW is matching GL context. */ r300SetFogState(ctx, ctx->Fog.Enabled);-+#endif r300SetupTextures(ctx); R300_STATECHANGE(rmesa, fp);diff --git a/src/mesa/drivers/dri/r300/r300_vertprog.c b/src/mesa/drivers/dri/r300/r300_vertprog.cindex c4e325e..392397b 100644--- a/src/mesa/drivers/dri/r300/r300_vertprog.c+++ b/src/mesa/drivers/dri/r300/r300_vertprog.c@@ -1431,7 +1431,7 @@ void r300SelectVertexShader(r300ContextPtr r300) InputsRead = ctx->FragmentProgram._Current->Base.InputsRead; wpos_idx = -1;- if (InputsRead & FRAG_BIT_WPOS) {+ if (InputsRead & (FRAG_BIT_WPOS | FRAG_BIT_FOGC)) { for (i = 0; i < ctx->Const.MaxTextureUnits; i++) if (!(InputsRead & (FRAG_BIT_TEX0 << i))) break;diff --git a/src/mesa/drivers/dri/r300/radeon_program_pair.c b/src/mesa/drivers/dri/r300/radeon_program_pair.cindex 5ad50d2..30b3272 100644--- a/src/mesa/drivers/dri/r300/radeon_program_pair.c+++ b/src/mesa/drivers/dri/r300/radeon_program_pair.c@@ -473,6 +473,10 @@ static void allocate_input_registers(struct pair_state *s) alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_COL1, hwindex++); InputsRead &= ~FRAG_BIT_COL1; + /* Fog coordinate */+ if (InputsRead & FRAG_BIT_FOGC)+ InputsRead &= ~FRAG_BIT_FOGC;+ /* Anything else */ if (InputsRead) error("Don't know how to handle inputs 0x%x\n", InputsRead);