<div dir="ltr">On 22 August 2013 16:07, Matt Turner <span dir="ltr"><<a href="mailto:mattst88@gmail.com" target="_blank">mattst88@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
---<br>
 .../built-in-functions/const-ldexp.shader-test     | 62 ++++++++++++++++++++++<br>
 1 file changed, 62 insertions(+)<br>
 create mode 100644 tests/spec/arb_gpu_shader5/execution/built-in-functions/const-ldexp.shader-test<br>
<br>
diff --git a/tests/spec/arb_gpu_shader5/execution/built-in-functions/const-ldexp.shader-test b/tests/spec/arb_gpu_shader5/execution/built-in-functions/const-ldexp.shader-test<br>
new file mode 100644<br>
index 0000000..5a6752c<br>
--- /dev/null<br>
+++ b/tests/spec/arb_gpu_shader5/execution/built-in-functions/const-ldexp.shader-test<br>
@@ -0,0 +1,62 @@<br>
+[require]<br>
+GLSL >= 1.50<br>
+GL_ARB_gpu_shader5<br>
+<br>
+[vertex shader]<br>
+in vec4 vertex;<br>
+<br>
+void main() {<br>
+       gl_Position = vertex;<br>
+}<br>
+<br>
+[fragment shader]<br>
+#extension GL_ARB_gpu_shader5 : enable<br>
+<br>
+void bad_constant_folding();<br></blockquote><div><br></div><div>Ah, I see what you did there.  By not declaring this function you ensure that there will be a link error if constants are folded incorrectly.  Clever.<br>
<br></div><div>Unfortunately, I don't think the GLSL spec makes any guarantee that there *won't* be a link error in the case where constants ase folded correctly.  A conformant implementation might, for instance, postpone optimization until after linking, so it would get a link error even if all the if tests correctly constant folded to "if (false)".<br>
<br></div><div>I'd recommend switching to the trick we do in the generated constant folding tests, which is to declare an array whose size is positive if the constant folding is done correctly, and negative if it is done incorrectly, e.g.:<br>
<br></div><div>float[floatBitsToInt(vec4(0.0, -0.0, 0.5, -0.5)) !=<br>      floatBitsToInt(ldexp(vec4(0.0, -0.0, 0.5, -0.5), ivec4(0)))<br>      ? 1 : -1] array0;<br>float[floatBitsToInt(vec4(0.49, 1.0, 25.0, 100.0)) !=<br>
      floatBitsToInt(ldexp(vec4(0.98, 0.5, 0.78125, 0.78125),<br>                           ivec4(-1, 1, 5, 7)))<br>      ? 1 : -1] array1;<br><br>etc.<br><br></div><div>With that fixed, this patch is:<br><br></div><div>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+out vec4 color;<br>
+<br>
+void main()<br>
+{<br>
+       /* Green if both pass. */<br>
+       color = vec4(0.0, 1.0, 0.0, 1.0);<br>
+<br>
+       /* Compare the results after going through floatBitsToInt() allows us<br>
+        * to distinguish -0.0f from 0.0f.<br>
+        */<br>
+       if (floatBitsToInt(vec4(0.0, -0.0, 0.5, -0.5)) !=<br>
+           floatBitsToInt(ldexp(vec4(0.0, -0.0, 0.5, -0.5), ivec4(0)))) {<br>
+               bad_constant_folding();<br>
+       }<br>
+       if (floatBitsToInt(vec4(0.49, 1.0, 25.0, 100.0)) !=<br>
+           floatBitsToInt(ldexp(vec4(0.98, 0.5, 0.78125, 0.78125), ivec4(-1, 1, 5, 7)))) {<br>
+               bad_constant_folding();<br>
+       }<br>
+       if (floatBitsToInt(vec4(1.1754944e-38, -1.1754944e-38, 3.40282347e38, -3.40282347e38)) !=<br>
+           floatBitsToInt(ldexp(vec4(0.5, -0.5, 0.999999940, -0.999999940), ivec4(-125, -125, 128, 128)))) {<br>
+               bad_constant_folding();<br>
+       }<br>
+       if (floatBitsToInt(vec4(0.5, -0.5, 0.999999940, -0.999999940)) !=<br>
+           floatBitsToInt(ldexp(vec4(1.1754944e-38, -1.1754944e-38, 3.40282347e38, -3.40282347e38), ivec4(125, 125, -128, -128)))) {<br>
+               bad_constant_folding();<br>
+       }<br>
+       if (floatBitsToInt(vec4(0.0, -0.0, 0.0, -0.0)) !=<br>
+           floatBitsToInt(ldexp(vec4(0.0, -0.0, 0.5, -0.5), ivec4(-127)))) {<br>
+               bad_constant_folding();<br>
+       }<br>
+       if (floatBitsToInt(vec4(0.0, -0.0, 0.0, -0.0)) !=<br>
+           floatBitsToInt(ldexp(vec4(1.1754944e-38, -1.1754944e-38, 3.40282347e38, -3.40282347e38), ivec4(-1, -1, -255, -255)))) {<br>
+               bad_constant_folding();<br>
+       }<br>
+}<br>
+<br>
+[vertex data]<br>
+vertex/float/2<br>
+-1.0 -1.0<br>
+ 1.0 -1.0<br>
+ 1.0  1.0<br>
+-1.0  1.0<br>
+<br>
+[test]<br>
+draw arrays GL_TRIANGLE_FAN 0 4<br>
+probe all rgba 0.0 1.0 0.0 1.0<br>
<span class=""><font color="#888888">--<br>
1.8.3.2<br>
<br>
_______________________________________________<br>
Piglit mailing list<br>
<a href="mailto:Piglit@lists.freedesktop.org">Piglit@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/piglit" target="_blank">http://lists.freedesktop.org/mailman/listinfo/piglit</a><br>
</font></span></blockquote></div><br></div></div>