From bec8366b1d4e599fd10d0cca2533eacfa5873895 Mon Sep 17 00:00:00 2001 From: Corbin Simpson Date: Tue, 11 Nov 2008 17:19:34 -0800 Subject: [PATCH] r300: Use WPOS to populate fragment.fogcoord temp. r3xx/r4xx version only. --- src/mesa/drivers/dri/r300/r300_fragprog.c | 23 +++++++++++++++++++++-- src/mesa/drivers/dri/r300/r300_state.c | 9 +++++++-- src/mesa/drivers/dri/r300/r300_vertprog.c | 2 +- src/mesa/drivers/dri/r300/radeon_program_pair.c | 5 +++++ 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c index 4ef7f2b..50136d5 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] = { @@ -270,7 +270,7 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler) int i = 0; GLuint tempregi = _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 +328,21 @@ static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler) MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO); i++; + GLuint tempregf = _mesa_find_free_register(compiler->program, PROGRAM_TEMPORARY); + + /* Prepare fragment.fogcoord as (f, 0, 0, 1) */ + 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_INPUT; + fpi[i].SrcReg[0].Index = FRAG_ATTRIB_WPOS; + fpi[i].SrcReg[0].Swizzle = + MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ONE); + for (; i < compiler->program->NumInstructions; ++i) { int reg; for (reg = 0; reg < 3; reg++) { @@ -335,6 +350,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.c index 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.c index 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.c index 5ad50d2..31838ff 100644 --- a/src/mesa/drivers/dri/r300/radeon_program_pair.c +++ b/src/mesa/drivers/dri/r300/radeon_program_pair.c @@ -463,6 +463,11 @@ static void allocate_input_registers(struct pair_state *s) alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_WPOS, hwindex++); InputsRead &= ~FRAG_BIT_WPOS; + /* Fog coordinate */ + if (InputsRead & FRAG_BIT_FOGC) + alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_FOGC, hwindex++); + InputsRead &= ~FRAG_BIT_FOGC; + /* Then primary colour */ if (InputsRead & FRAG_BIT_COL0) alloc_hw_reg(s, PROGRAM_INPUT, FRAG_ATTRIB_COL0, hwindex++); -- 1.5.6.5 From 263c61d33319392d3491ae0b5114aa3666887966 Mon Sep 17 00:00:00 2001 From: Corbin Simpson Date: Tue, 11 Nov 2008 17:24:55 -0800 Subject: [PATCH] r300: WPOS rewrites for FOGC, r5xx version. --- src/mesa/drivers/dri/r300/r300_state.c | 5 +++++ src/mesa/drivers/dri/r300/r500_fragprog.c | 23 +++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c index b2b5737..8f3df61 100644 --- a/src/mesa/drivers/dri/r300/r300_state.c +++ b/src/mesa/drivers/dri/r300/r300_state.c @@ -1796,6 +1796,11 @@ static void r500SetupRSUnit(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))) diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c index 75dae86..a39a540 100644 --- a/src/mesa/drivers/dri/r300/r500_fragprog.c +++ b/src/mesa/drivers/dri/r300/r500_fragprog.c @@ -195,7 +195,7 @@ static void insert_WPOS_trailer(struct r500_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] = { @@ -206,7 +206,7 @@ static void insert_WPOS_trailer(struct r500_fragment_program_compiler *compiler) int i = 0; GLuint tempregi = _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 */ @@ -264,6 +264,21 @@ static void insert_WPOS_trailer(struct r500_fragment_program_compiler *compiler) MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ZERO); i++; + GLuint tempregf = _mesa_find_free_register(compiler->program, PROGRAM_TEMPORARY); + + /* Prepare fragment.fogcoord as (f, 0, 0, 1) */ + 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_INPUT; + fpi[i].SrcReg[0].Index = FRAG_ATTRIB_WPOS; + fpi[i].SrcReg[0].Swizzle = + MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ONE); + for (; i < compiler->program->NumInstructions; ++i) { int reg; for (reg = 0; reg < 3; reg++) { @@ -271,6 +286,10 @@ static void insert_WPOS_trailer(struct r500_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; } } } -- 1.5.6.5