[Mesa-dev] [PATCH 1/3] st/mesa: do vertex and fragment color clamping in shaders
Marek Olšák
maraeo at gmail.com
Tue Feb 21 12:36:31 PST 2012
Hi Tilman,
Thanks for the info. I didn't consider outputs to be readable, sorry.
A quick fix would be to move the outputs to temps. There is a GLSL pass
for that and it can be enabled by reporting
PIPE_SHADER_CAP_OUTPUT_READ --> 0 in r600_pipe.c. Can you try that and
see if it helps?
To Vadim: Now that we have a GLSL pass for lowering output reads, are
you okay with removing PIPE_SHADER_CAP_OUTPUT_READ? It makes the
fallback for glClampColorARB really non-trivial.
Marek
On Tue, Feb 21, 2012 at 9:17 PM, Tilman Sauerbeck <tilman at code-monkey.de> wrote:
> Tilman Sauerbeck [2012-02-12 11:31]:
>> Marek Olšák [2012-01-23 13:32]:
>> > For ARB_color_buffer_float. Most hardware can't do it and st/mesa is
>> > the perfect place for a fallback.
>>
>> This breaks lighting in Heroes of Newerth on my rv730:
>> http://files.code-monkey.de/frag_color_clamp_bad.png (after patch)
>> http://files.code-monkey.de/frag_color_clamp_good.png (before patch)
>> I can provide a trace file that shows the problem (3.5GB, so will take
>> a while to upload).
>
> The problematic fragment shader looks like this:
>
> void main() {
> gl_FragColor = vec4(0.0);
> gl_FragColor += texture2D(...);
> gl_FragColor += texture2D(...);
> gl_FragColor += texture2D(...);
> gl_FragColor += texture2D(...);
> gl_FragColor *= 0.25;
> gl_FragColor *= v_vColor; // varying vec4
> }
>
> Before this patch landed, mesa would generate the following TGSI for
> that shader:
>
> 0: MOV TEMP[0].x, -CONST[1].xxxx
> 1: MOV TEMP[0].y, -CONST[1].xxxx
> 2: ADD TEMP[0].xy, IN[0].xyyy, TEMP[0].xyyy
> 3: TEX TEMP[0], TEMP[0].xyyy, SAMP[0], 2D
> 4: MOV OUT[0], TEMP[0]
> 5: MOV TEMP[0].x, -CONST[1].xxxx
> 6: MOV TEMP[0].y, CONST[1].xxxx
> 7: ADD TEMP[0].xy, IN[0].xyyy, TEMP[0].xyyy
> 8: TEX TEMP[0], TEMP[0].xyyy, SAMP[0], 2D
> 9: ADD OUT[0], OUT[0], TEMP[0]
> 10: ADD TEMP[0].xy, IN[0].xyyy, CONST[1].xxxx
> 11: TEX TEMP[0], TEMP[0].xyyy, SAMP[0], 2D
> 12: ADD OUT[0], OUT[0], TEMP[0]
> 13: MOV TEMP[0].x, CONST[1].xxxx
> 14: MOV TEMP[0].y, -CONST[1].xxxx
> 15: ADD TEMP[0].xy, IN[0].xyyy, TEMP[0].xyyy
> 16: TEX TEMP[0], TEMP[0].xyyy, SAMP[0], 2D
> 17: ADD TEMP[0], OUT[0], TEMP[0]
> 18: MUL TEMP[0], TEMP[0], IMM[0].xxxx
> 19: MUL OUT[0], TEMP[0], IN[1]
> 20: END
>
> With this patch, instructions 4, 9, 12 and 19 are replaced by their
> _SAT variants.
>
> If I hack the code to only use saturate in the final instruction
> (MUL -> MUL_SAT), the game looks okay.
>
> I'm wondering whether the current behaviour is correct in that it uses
> saturate ops for the intermediate results as well.
>
> Issue 24 of the ARB_color_buffer_float says:
>
>> 24. Does this extension interact with the ARB_fragment_program or
>> ARB_fragment_shader extensions?
>>
>> RESOLVED: Yes. The only interaction is that the fragment color
>> clamp enable determines if the final color(s) produced by the
>> fragment program/shader has its components clamped to [0,1].
>>
>> However, the fragment color clamp enable affects only the final
>> result; it does NOT affect any computations performed during
>> program execution. Note that the same clamping can be done
>> explicitly in a fragment program or shader.
>> ARB_fragment_program provides the "_SAT" opcode suffix to clamp
>> instruction results to [0,1].
>
> If I'm understanding this language correctly, _and_ it applies to GLSL
> too then it seems like Mesa should only use saturation in the final
> operation that's writing to gl_FragColor, but not in the earlier ones?
>
> Regards,
> Tilman
>
> --
> A: Because it messes up the order in which people normally read text.
> Q: Why is top-posting such a bad thing?
> A: Top-posting.
> Q: What is the most annoying thing on usenet and in e-mail?
More information about the mesa-dev
mailing list