summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2013-02-01 10:59:43 -0700
committerBrian Paul <[email protected]>2013-02-04 09:33:44 -0700
commitd276a40e15dce26494ec61670fe2aeef62dbeba1 (patch)
tree387857a2e30bc93de9c0c142961efe0be82471ef /src/gallium
parent6455d40b7ec09e3a3923c9b78952dc29627afed1 (diff)
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.
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/docs/source/tgsi.rst9
-rw-r--r--src/gallium/include/pipe/p_defines.h3
-rw-r--r--src/gallium/include/pipe/p_shader_tokens.h2
3 files changed, 12 insertions, 2 deletions
diff --git a/src/gallium/docs/source/tgsi.rst b/src/gallium/docs/source/tgsi.rst
index 548a9a39855..5f03f324535 100644
--- a/src/gallium/docs/source/tgsi.rst
+++ b/src/gallium/docs/source/tgsi.rst
@@ -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::
diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
index d0db5e4bcee..fdf6e7fb17b 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -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
};
/**
diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
index 3fb12fb2c47..a9fb6aab989 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -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