----- Original Message ----- > ----- 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
Sorry, meant "without" here. > 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