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.
This commit is contained in:
Brian Paul
2013-02-01 10:59:43 -07:00
parent 6455d40b7e
commit d276a40e15
3 changed files with 12 additions and 2 deletions

View File

@@ -89,6 +89,15 @@ This instruction replicates its result.
dst = \frac{1}{\sqrt{|src.x|}}
.. opcode:: SQRT - Square Root
This instruction replicates its result.
.. math::
dst = {\sqrt{src.x}}
.. opcode:: EXP - Approximate Exponential Base 2
.. math::