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)
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

index 548a9a398556d79368c910a67be8f0b90b7736f8..5f03f3245353743a005bebefab962ca892380be1 100644 (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::
index d0db5e4bceeda7b77b401c22f0b245e528d8bc4b..fdf6e7fb17bb31e7d58dc5653a357ab54d26335f 100644 (file)
@@ -542,7 +542,8 @@ enum pipe_shader_cap
    PIPE_SHADER_CAP_SUBROUTINES = 16, /* BGNSUB, ENDSUB, CAL, RET */
    PIPE_SHADER_CAP_INTEGERS = 17,
    PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS = 18,
-   PIPE_SHADER_CAP_PREFERRED_IR = 19
+   PIPE_SHADER_CAP_PREFERRED_IR = 19,
+   PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED = 20
 };
 
 /**
index 3fb12fb2c47791643b2ca8637c2f1ec10df03da9..a9fb6aab989e0f5ea41633f8f424f873eff691fa 100644 (file)
@@ -275,7 +275,7 @@ struct tgsi_property_data {
 #define TGSI_OPCODE_SUB                 17
 #define TGSI_OPCODE_LRP                 18
 #define TGSI_OPCODE_CND                 19
-                                /* gap */
+#define TGSI_OPCODE_SQRT                20
 #define TGSI_OPCODE_DP2A                21
                                 /* gap */
 #define TGSI_OPCODE_FRC                 24