gallium: add SQRT shader opcode
authorBrian Paul <brianp@vmware.com>
Fri, 1 Feb 2013 17:59:43 +0000 (10:59 -0700)
committerBrian Paul <brianp@vmware.com>
Mon, 4 Feb 2013 16:33:44 +0000 (09:33 -0700)
commitd276a40e15dce26494ec61670fe2aeef62dbeba1
tree387857a2e30bc93de9c0c142961efe0be82471ef
parent6455d40b7ec09e3a3923c9b78952dc29627afed1
gallium: add SQRT shader opcode

The glsl-to-tgsi translater will emit SQRT to implement GLSL's sqrt()
and distance() functions if the PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED
query says it's supported by the driver.

Otherwise, sqrt(x) is implemented with x*rsq(x).  The problem with
this is sqrt(0) must be handled specially because rsq(0) might be
Inf/NaN/undefined (and then 0*rsq(0) is Inf/Nan/undefined).  In the
glsl-to-tgsi code we use an extra CMP to check if x is zero and then
replace the result of x*rsq(x) with zero.

In the end, this makes sqrt() generate much more reasonable code for
drivers that can do square roots.

Note that many of piglit's generated shader tests use the GLSL
distance() function.
src/gallium/docs/source/tgsi.rst
src/gallium/include/pipe/p_defines.h
src/gallium/include/pipe/p_shader_tokens.h