----- Original Message ----- > IIRC, all Radeons older than HD 7700 or so can do fixed-function fog, > but Gallium doesn't have a proper interface for it. There is no > dedicated shader output though, so r300g and r600g use a texcoord slot > if there is any left. I think all drivers except > softpipe/llvmpipe/svga already do the X001 swizzling. > > Considering that the fog varying is being turned into a generic vec4, > I wonder why we don't just use TGSI_SEMANTIC_GENERIC for it.
Same could be said for many TGSI_SEMANTIC_*. At very least, having a TGSI_SEMANTIC_FOG allows add registers for fog with the need to do complicated renumbering of TGSI_SEMANTIC_GENERIC indices, and it also provides helpful hints for human reading the shaders. I wouldn't mind if we axed most of these fixed function relics, but it's probably a fair amount of work to do so, and I'm not sure the benefits justify. Jose > > Marek > > On Wed, Nov 20, 2013 at 5:28 PM, Roland Scheidegger <srol...@vmware.com> > wrote: > > On 11/20/2013 03:23 PM, jfons...@vmware.com wrote: > >> > >> From: José Fonseca <jfons...@vmware.com> > >> > >> D3D9 Shader Model 2 restricted the fog register to one component, > >> https://urldefense.proofpoint.com/v1/url?u=http://msdn.microsoft.com/en-us/library/windows/desktop/bb172945.aspx&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=QYVehdp8Eys%2F%2BELh4mOPqGab2c6TppOFGBX7pi8YkdM%3D%0A&s=b367b797783ff401bc5b67fffa82046a1ab34e8e0663ab252b580c358d6d76c7 > >> , > >> but that restriction no longer exists in Shader Model 3, and several > >> WHCK tests enforce that. > >> > >> So this change: > >> - lifts the single-component restriction TGSI_SEMANTIC_FOG > >> from Gallium interface > >> - updates the Mesa state tracker to enforce output fog has (f, 0, 0, 1) > >> - draw module was updated to leave TGSI_SEMANTIC_FOG output registers > >> alone > >> > >> Several gallium drivers that are going out of their way to clear > >> TGSI_SEMANTIC_FOG components could be simplified in the future. > >> > >> Thanks to Si Chen and Michal Krol for identifying the problem. > >> > >> Testing done: piglit fogcoord-*.vpfp tests > >> --- > >> src/gallium/auxiliary/draw/draw_llvm.c | 6 ------ > >> src/gallium/auxiliary/draw/draw_vs_exec.c | 7 +------ > >> src/gallium/docs/source/tgsi.rst | 10 +++------- > >> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 7 +++++++ > >> src/mesa/state_tracker/st_mesa_to_tgsi.c | 7 +++++++ > >> 5 files changed, 18 insertions(+), 19 deletions(-) > >> > >> diff --git a/src/gallium/auxiliary/draw/draw_llvm.c > >> b/src/gallium/auxiliary/draw/draw_llvm.c > >> index fe49b86..71cc45f 100644 > >> --- a/src/gallium/auxiliary/draw/draw_llvm.c > >> +++ b/src/gallium/auxiliary/draw/draw_llvm.c > >> @@ -659,12 +659,6 @@ generate_vs(struct draw_llvm_variant *variant, > >> LLVMBuildStore(builder, out, > >> outputs[attrib][chan]); > >> } > >> break; > >> - case TGSI_SEMANTIC_FOG: > >> - if (chan == 1 || chan == 2) > >> - LLVMBuildStore(builder, bld.zero, > >> outputs[attrib][chan]); > >> - else if (chan == 3) > >> - LLVMBuildStore(builder, bld.one, > >> outputs[attrib][chan]); > >> - break; > >> } > >> } > >> } > >> diff --git a/src/gallium/auxiliary/draw/draw_vs_exec.c > >> b/src/gallium/auxiliary/draw/draw_vs_exec.c > >> index 6100394..83cc5fd 100644 > >> --- a/src/gallium/auxiliary/draw/draw_vs_exec.c > >> +++ b/src/gallium/auxiliary/draw/draw_vs_exec.c > >> @@ -167,12 +167,7 @@ vs_exec_run_linear( struct draw_vertex_shader > >> *shader, > >> output[slot][2] = > >> CLAMP(machine->Outputs[slot].xyzw[2].f[j], 0.0f, 1.0f); > >> output[slot][3] = > >> CLAMP(machine->Outputs[slot].xyzw[3].f[j], 0.0f, 1.0f); > >> } > >> - else if (name == TGSI_SEMANTIC_FOG) { > >> - output[slot][0] = machine->Outputs[slot].xyzw[0].f[j]; > >> - output[slot][1] = 0; > >> - output[slot][2] = 0; > >> - output[slot][3] = 1; > >> - } else > >> + else > >> { > >> output[slot][0] = machine->Outputs[slot].xyzw[0].f[j]; > >> output[slot][1] = machine->Outputs[slot].xyzw[1].f[j]; > >> diff --git a/src/gallium/docs/source/tgsi.rst > >> b/src/gallium/docs/source/tgsi.rst > >> index f80c08d..1070619 100644 > >> --- a/src/gallium/docs/source/tgsi.rst > >> +++ b/src/gallium/docs/source/tgsi.rst > >> @@ -2420,13 +2420,9 @@ TGSI_SEMANTIC_FOG > >> > >> Vertex shader inputs and outputs and fragment shader inputs may be > >> labeled with TGSI_SEMANTIC_FOG to indicate that the register contains > >> -a fog coordinate in the form (F, 0, 0, 1). Typically, the fragment > >> -shader will use the fog coordinate to compute a fog blend factor which > >> -is used to blend the normal fragment color with a constant fog color. > >> - > >> -Only the first component matters when writing from the vertex shader; > >> -the driver will ensure that the coordinate is in this format when used > >> -as a fragment shader input. > >> +a fog coordinate. Typically, the fragment shader will use the fog > >> coordinate > >> +to compute a fog blend factor which is used to blend the normal fragment > >> color > >> +with a constant fog color. > > > > Maybe add some text that the "fog coord" really is just an ordinary vec4 > > reg > > like regular semantics? > > > > > > > >> > >> > >> TGSI_SEMANTIC_PSIZE > >> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > >> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > >> index 6319079..74b3e5b 100644 > >> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > >> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > >> @@ -4889,6 +4889,13 @@ st_translate_program( > >> t->outputs[i] = ureg_DECL_output(ureg, > >> outputSemanticName[i], > >> outputSemanticIndex[i]); > >> + if (outputSemanticName[i] == TGSI_SEMANTIC_FOG) { > >> + /* force register to contain a fog coordinate in the form (F, > >> 0, 0, 1). */ > >> + ureg_MOV(ureg, > >> + ureg_writemask(t->outputs[i], TGSI_WRITEMASK_XYZW & > >> ~TGSI_WRITEMASK_X), > >> + ureg_imm4f(ureg, 0.0f, 0.0f, 0.0f, 1.0f)); > >> + t->outputs[i] = ureg_writemask(t->outputs[i], > >> TGSI_WRITEMASK_X); > >> + } > >> } > >> if (passthrough_edgeflags) > >> emit_edgeflags(t); > >> diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c > >> b/src/mesa/state_tracker/st_mesa_to_tgsi.c > >> index 921b0f9..7d79c62 100644 > >> --- a/src/mesa/state_tracker/st_mesa_to_tgsi.c > >> +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c > >> @@ -1121,6 +1121,13 @@ st_translate_mesa_program( > >> t->outputs[i] = ureg_DECL_output( ureg, > >> outputSemanticName[i], > >> outputSemanticIndex[i] ); > >> + if (outputSemanticName[i] == TGSI_SEMANTIC_FOG) { > >> + /* force register to contain a fog coordinate in the form (F, > >> 0, 0, 1). */ > >> + ureg_MOV(ureg, > >> + ureg_writemask(t->outputs[i], TGSI_WRITEMASK_XYZW & > >> ~TGSI_WRITEMASK_X), > >> + ureg_imm4f(ureg, 0.0f, 0.0f, 0.0f, 1.0f)); > >> + t->outputs[i] = ureg_writemask(t->outputs[i], > >> TGSI_WRITEMASK_X); > >> + } > >> } > >> if (passthrough_edgeflags) > >> emit_edgeflags( t, program ); > >> > > > > Otherwise looks good to me. Can't say I'm a big fan of our half-baked > > d3d10-bolted-on-d3d9 semantics style, but this just changes a weirdo > > semantic into one which doesn't really have much meaning which is fine by > > me > > - I think you get lucky because there aren't any drivers which can't > > actually do this, even r300 which can't do SM3 looks like it treats fog > > interpolation like any other generic semantic (though that was just a very > > quick glance). > > > > Roland > > > > _______________________________________________ > > mesa-dev mailing list > > mesa-dev@lists.freedesktop.org > > https://urldefense.proofpoint.com/v1/url?u=http://lists.freedesktop.org/mailman/listinfo/mesa-dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=QYVehdp8Eys%2F%2BELh4mOPqGab2c6TppOFGBX7pi8YkdM%3D%0A&s=bf0162e7afd51cd3d39a500bd60b6997783b1be741baeb2bb52a2d9293ace2dd > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev