Pushed, thanks.<br><br>Marek<br><br><div class="gmail_quote">On Mon, Sep 6, 2010 at 4:56 AM, Luca Barbieri <span dir="ltr">&lt;<a href="mailto:luca@luca-barbieri.com">luca@luca-barbieri.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

The current GLSL compiler inlines everything indiscriminately,<br>
and unrolls all loops that have a small iteration count.<br>
<br>
This is a bad idea, because it can lead to exponential growth of<br>
the code, as these test cases illustrate.<br>
<br>
On a naive implementation (like current Mesa) these tests will<br>
attempt to allocate more than 2^64 bytes of RAM, ensuring failure.<br>
<br>
A smart implementation will instead generate actual calls/loops, and the<br>
test passes, since the branch protecting the functions/loops is not taken.<br>
<br>
Currently they aren&#39;t added to any profile since they obviously cause<br>
piglit to hang until memory is exhausted, possibly causing lots of<br>
swap thrashing.<br>
---<br>
 tests/shaders/glsl-fs-inline-explosion.shader_test |  415 ++++++++++++++++++++<br>
 tests/shaders/glsl-fs-unroll-explosion.shader_test |   45 +++<br>
 tests/shaders/glsl-vs-inline-explosion.shader_test |  413 +++++++++++++++++++<br>
 tests/shaders/glsl-vs-unroll-explosion.shader_test |   44 ++<br>
 4 files changed, 917 insertions(+), 0 deletions(-)<br>
 create mode 100644 tests/shaders/glsl-fs-inline-explosion.shader_test<br>
 create mode 100644 tests/shaders/glsl-fs-unroll-explosion.shader_test<br>
 create mode 100644 tests/shaders/glsl-vs-inline-explosion.shader_test<br>
 create mode 100644 tests/shaders/glsl-vs-unroll-explosion.shader_test<br>
<br>
diff --git a/tests/shaders/glsl-fs-inline-explosion.shader_test b/tests/shaders/glsl-fs-inline-explosion.shader_test<br>
new file mode 100644<br>
index 0000000..227012d<br>
--- /dev/null<br>
+++ b/tests/shaders/glsl-fs-inline-explosion.shader_test<br>
@@ -0,0 +1,415 @@<br>
+// if you inline all functions indiscriminately, you won&#39;t pass this<br>
+[require]<br>
+GL &gt;= 2.0<br>
+GLSL &gt;= 1.10<br>
+<br>
+[vertex shader]<br>
+void main()<br>
+{<br>
+       gl_Position = gl_Vertex;<br>
+       gl_TexCoord[0] = gl_Position;<br>
+}<br>
+<br>
+[fragment shader]<br>
+void f64()<br>
+{<br>
+// use something that cannot be optimized away<br>
+       gl_FragColor = exp(gl_FragColor);<br>
+}<br>
+<br>
+<br>
+void f63()<br>
+{<br>
+       f64();<br>
+       f64();<br>
+}<br>
+<br>
+void f62()<br>
+{<br>
+       f63();<br>
+       f63();<br>
+}<br>
+<br>
+void f61()<br>
+{<br>
+       f62();<br>
+       f62();<br>
+}<br>
+<br>
+void f60()<br>
+{<br>
+       f61();<br>
+       f61();<br>
+}<br>
+<br>
+void f59()<br>
+{<br>
+       f60();<br>
+       f60();<br>
+}<br>
+<br>
+void f58()<br>
+{<br>
+       f59();<br>
+       f59();<br>
+}<br>
+<br>
+void f57()<br>
+{<br>
+       f58();<br>
+       f58();<br>
+}<br>
+<br>
+void f56()<br>
+{<br>
+       f57();<br>
+       f57();<br>
+}<br>
+<br>
+void f55()<br>
+{<br>
+       f56();<br>
+       f56();<br>
+}<br>
+<br>
+void f54()<br>
+{<br>
+       f55();<br>
+       f55();<br>
+}<br>
+<br>
+void f53()<br>
+{<br>
+       f54();<br>
+       f54();<br>
+}<br>
+<br>
+void f52()<br>
+{<br>
+       f53();<br>
+       f53();<br>
+}<br>
+<br>
+void f51()<br>
+{<br>
+       f52();<br>
+       f52();<br>
+}<br>
+<br>
+void f50()<br>
+{<br>
+       f51();<br>
+       f51();<br>
+}<br>
+<br>
+void f49()<br>
+{<br>
+       f50();<br>
+       f50();<br>
+}<br>
+<br>
+void f48()<br>
+{<br>
+       f49();<br>
+       f49();<br>
+}<br>
+<br>
+void f47()<br>
+{<br>
+       f48();<br>
+       f48();<br>
+}<br>
+<br>
+void f46()<br>
+{<br>
+       f47();<br>
+       f47();<br>
+}<br>
+<br>
+void f45()<br>
+{<br>
+       f46();<br>
+       f46();<br>
+}<br>
+<br>
+void f44()<br>
+{<br>
+       f45();<br>
+       f45();<br>
+}<br>
+<br>
+void f43()<br>
+{<br>
+       f44();<br>
+       f44();<br>
+}<br>
+<br>
+void f42()<br>
+{<br>
+       f43();<br>
+       f43();<br>
+}<br>
+<br>
+void f41()<br>
+{<br>
+       f42();<br>
+       f42();<br>
+}<br>
+<br>
+void f40()<br>
+{<br>
+       f41();<br>
+       f41();<br>
+}<br>
+<br>
+void f39()<br>
+{<br>
+       f40();<br>
+       f40();<br>
+}<br>
+<br>
+void f38()<br>
+{<br>
+       f39();<br>
+       f39();<br>
+}<br>
+<br>
+void f37()<br>
+{<br>
+       f38();<br>
+       f38();<br>
+}<br>
+<br>
+void f36()<br>
+{<br>
+       f37();<br>
+       f37();<br>
+}<br>
+<br>
+void f35()<br>
+{<br>
+       f36();<br>
+       f36();<br>
+}<br>
+<br>
+void f34()<br>
+{<br>
+       f35();<br>
+       f35();<br>
+}<br>
+<br>
+void f33()<br>
+{<br>
+       f34();<br>
+       f34();<br>
+}<br>
+<br>
+void f32()<br>
+{<br>
+       f33();<br>
+       f33();<br>
+}<br>
+<br>
+void f31()<br>
+{<br>
+       f32();<br>
+       f32();<br>
+}<br>
+<br>
+void f30()<br>
+{<br>
+       f31();<br>
+       f31();<br>
+}<br>
+<br>
+void f29()<br>
+{<br>
+       f30();<br>
+       f30();<br>
+}<br>
+<br>
+void f28()<br>
+{<br>
+       f29();<br>
+       f29();<br>
+}<br>
+<br>
+void f27()<br>
+{<br>
+       f28();<br>
+       f28();<br>
+}<br>
+<br>
+void f26()<br>
+{<br>
+       f27();<br>
+       f27();<br>
+}<br>
+<br>
+void f25()<br>
+{<br>
+       f26();<br>
+       f26();<br>
+}<br>
+<br>
+void f24()<br>
+{<br>
+       f25();<br>
+       f25();<br>
+}<br>
+<br>
+void f23()<br>
+{<br>
+       f24();<br>
+       f24();<br>
+}<br>
+<br>
+void f22()<br>
+{<br>
+       f23();<br>
+       f23();<br>
+}<br>
+<br>
+void f21()<br>
+{<br>
+       f22();<br>
+       f22();<br>
+}<br>
+<br>
+void f20()<br>
+{<br>
+       f21();<br>
+       f21();<br>
+}<br>
+<br>
+void f19()<br>
+{<br>
+       f20();<br>
+       f20();<br>
+}<br>
+<br>
+void f18()<br>
+{<br>
+       f19();<br>
+       f19();<br>
+}<br>
+<br>
+void f17()<br>
+{<br>
+       f18();<br>
+       f18();<br>
+}<br>
+<br>
+void f16()<br>
+{<br>
+       f17();<br>
+       f17();<br>
+}<br>
+<br>
+void f15()<br>
+{<br>
+       f16();<br>
+       f16();<br>
+}<br>
+<br>
+void f14()<br>
+{<br>
+       f15();<br>
+       f15();<br>
+}<br>
+<br>
+void f13()<br>
+{<br>
+       f14();<br>
+       f14();<br>
+}<br>
+<br>
+void f12()<br>
+{<br>
+       f13();<br>
+       f13();<br>
+}<br>
+<br>
+void f11()<br>
+{<br>
+       f12();<br>
+       f12();<br>
+}<br>
+<br>
+void f10()<br>
+{<br>
+       f11();<br>
+       f11();<br>
+}<br>
+<br>
+void f9()<br>
+{<br>
+       f10();<br>
+       f10();<br>
+}<br>
+<br>
+void f8()<br>
+{<br>
+       f9();<br>
+       f9();<br>
+}<br>
+<br>
+void f7()<br>
+{<br>
+       f8();<br>
+       f8();<br>
+}<br>
+<br>
+void f6()<br>
+{<br>
+       f7();<br>
+       f7();<br>
+}<br>
+<br>
+void f5()<br>
+{<br>
+       f6();<br>
+       f6();<br>
+}<br>
+<br>
+void f4()<br>
+{<br>
+       f5();<br>
+       f5();<br>
+}<br>
+<br>
+void f3()<br>
+{<br>
+       f4();<br>
+       f4();<br>
+}<br>
+<br>
+void f2()<br>
+{<br>
+       f3();<br>
+       f3();<br>
+}<br>
+<br>
+void f1()<br>
+{<br>
+       f2();<br>
+       f2();<br>
+}<br>
+<br>
+void f0()<br>
+{<br>
+       f1();<br>
+       f1();<br>
+}<br>
+<br>
+void main()<br>
+{<br>
+       gl_FragColor = vec4(0.1, 0.2, 0.3, 0.4);<br>
+       if(gl_TexCoord[0].x &gt; 2.0) // this branch is never taken, but the compiler doesn&#39;t know this<br>
+               f0();<br>
+}<br>
+<br>
+[test]<br>
+draw rect -1 -1 2 2<br>
+probe all rgba 0.1 0.2 0.3 0.4<br>
+<br>
diff --git a/tests/shaders/glsl-fs-unroll-explosion.shader_test b/tests/shaders/glsl-fs-unroll-explosion.shader_test<br>
new file mode 100644<br>
index 0000000..415bda6<br>
--- /dev/null<br>
+++ b/tests/shaders/glsl-fs-unroll-explosion.shader_test<br>
@@ -0,0 +1,45 @@<br>
+// if you unroll all loops with a few iterations, you won&#39;t pass this<br>
+[require]<br>
+GL &gt;= 2.0<br>
+GLSL &gt;= 1.10<br>
+<br>
+[vertex shader]<br>
+void main()<br>
+{<br>
+       gl_Position = gl_Vertex;<br>
+       gl_TexCoord[0] = gl_Position;<br>
+}<br>
+<br>
+[fragment shader]<br>
+<br>
+void main()<br>
+{<br>
+       gl_FragColor = vec4(0.1, 0.2, 0.3, 0.4);<br>
+       if(gl_TexCoord[0].x &gt; 2.0) // this branch is never taken, but the compiler doesn&#39;t know this<br>
+       {<br>
+               for(int i0 = 0; i0 &lt; 16; ++i0)<br>
+               for(int i1 = 0; i1 &lt; 16; ++i1)<br>
+               for(int i2 = 0; i2 &lt; 16; ++i2)<br>
+               for(int i3 = 0; i3 &lt; 16; ++i3)<br>
+               for(int i4 = 0; i4 &lt; 16; ++i4)<br>
+               for(int i5 = 0; i5 &lt; 16; ++i5)<br>
+               for(int i6 = 0; i6 &lt; 16; ++i6)<br>
+               for(int i7 = 0; i7 &lt; 16; ++i7)<br>
+               for(int i8 = 0; i8 &lt; 16; ++i8)<br>
+               for(int i9 = 0; i9 &lt; 16; ++i9)<br>
+               for(int i10 = 0; i10 &lt; 16; ++i10)<br>
+               for(int i11 = 0; i11 &lt; 16; ++i11)<br>
+               for(int i12 = 0; i12 &lt; 16; ++i12)<br>
+               for(int i13 = 0; i13 &lt; 16; ++i13)<br>
+               for(int i14 = 0; i14 &lt; 16; ++i14)<br>
+               for(int i15 = 0; i15 &lt; 16; ++i15)<br>
+               {<br>
+                       gl_FragColor = exp(gl_FragColor);<br>
+               }<br>
+       }<br>
+}<br>
+<br>
+[test]<br>
+draw rect -1 -1 2 2<br>
+probe all rgba 0.1 0.2 0.3 0.4<br>
+<br>
diff --git a/tests/shaders/glsl-vs-inline-explosion.shader_test b/tests/shaders/glsl-vs-inline-explosion.shader_test<br>
new file mode 100644<br>
index 0000000..27593ae<br>
--- /dev/null<br>
+++ b/tests/shaders/glsl-vs-inline-explosion.shader_test<br>
@@ -0,0 +1,413 @@<br>
+// if you inline all functions indiscriminately, you won&#39;t pass this<br>
+[require]<br>
+GL &gt;= 2.0<br>
+GLSL &gt;= 1.10<br>
+<br>
+[vertex shader]<br>
+void f64()<br>
+{<br>
+// use something that cannot be optimized away<br>
+       gl_TexCoord[0] = exp(gl_TexCoord[0]);<br>
+}<br>
+<br>
+void f63()<br>
+{<br>
+       f64();<br>
+       f64();<br>
+}<br>
+<br>
+void f62()<br>
+{<br>
+       f63();<br>
+       f63();<br>
+}<br>
+<br>
+void f61()<br>
+{<br>
+       f62();<br>
+       f62();<br>
+}<br>
+<br>
+void f60()<br>
+{<br>
+       f61();<br>
+       f61();<br>
+}<br>
+<br>
+void f59()<br>
+{<br>
+       f60();<br>
+       f60();<br>
+}<br>
+<br>
+void f58()<br>
+{<br>
+       f59();<br>
+       f59();<br>
+}<br>
+<br>
+void f57()<br>
+{<br>
+       f58();<br>
+       f58();<br>
+}<br>
+<br>
+void f56()<br>
+{<br>
+       f57();<br>
+       f57();<br>
+}<br>
+<br>
+void f55()<br>
+{<br>
+       f56();<br>
+       f56();<br>
+}<br>
+<br>
+void f54()<br>
+{<br>
+       f55();<br>
+       f55();<br>
+}<br>
+<br>
+void f53()<br>
+{<br>
+       f54();<br>
+       f54();<br>
+}<br>
+<br>
+void f52()<br>
+{<br>
+       f53();<br>
+       f53();<br>
+}<br>
+<br>
+void f51()<br>
+{<br>
+       f52();<br>
+       f52();<br>
+}<br>
+<br>
+void f50()<br>
+{<br>
+       f51();<br>
+       f51();<br>
+}<br>
+<br>
+void f49()<br>
+{<br>
+       f50();<br>
+       f50();<br>
+}<br>
+<br>
+void f48()<br>
+{<br>
+       f49();<br>
+       f49();<br>
+}<br>
+<br>
+void f47()<br>
+{<br>
+       f48();<br>
+       f48();<br>
+}<br>
+<br>
+void f46()<br>
+{<br>
+       f47();<br>
+       f47();<br>
+}<br>
+<br>
+void f45()<br>
+{<br>
+       f46();<br>
+       f46();<br>
+}<br>
+<br>
+void f44()<br>
+{<br>
+       f45();<br>
+       f45();<br>
+}<br>
+<br>
+void f43()<br>
+{<br>
+       f44();<br>
+       f44();<br>
+}<br>
+<br>
+void f42()<br>
+{<br>
+       f43();<br>
+       f43();<br>
+}<br>
+<br>
+void f41()<br>
+{<br>
+       f42();<br>
+       f42();<br>
+}<br>
+<br>
+void f40()<br>
+{<br>
+       f41();<br>
+       f41();<br>
+}<br>
+<br>
+void f39()<br>
+{<br>
+       f40();<br>
+       f40();<br>
+}<br>
+<br>
+void f38()<br>
+{<br>
+       f39();<br>
+       f39();<br>
+}<br>
+<br>
+void f37()<br>
+{<br>
+       f38();<br>
+       f38();<br>
+}<br>
+<br>
+void f36()<br>
+{<br>
+       f37();<br>
+       f37();<br>
+}<br>
+<br>
+void f35()<br>
+{<br>
+       f36();<br>
+       f36();<br>
+}<br>
+<br>
+void f34()<br>
+{<br>
+       f35();<br>
+       f35();<br>
+}<br>
+<br>
+void f33()<br>
+{<br>
+       f34();<br>
+       f34();<br>
+}<br>
+<br>
+void f32()<br>
+{<br>
+       f33();<br>
+       f33();<br>
+}<br>
+<br>
+void f31()<br>
+{<br>
+       f32();<br>
+       f32();<br>
+}<br>
+<br>
+void f30()<br>
+{<br>
+       f31();<br>
+       f31();<br>
+}<br>
+<br>
+void f29()<br>
+{<br>
+       f30();<br>
+       f30();<br>
+}<br>
+<br>
+void f28()<br>
+{<br>
+       f29();<br>
+       f29();<br>
+}<br>
+<br>
+void f27()<br>
+{<br>
+       f28();<br>
+       f28();<br>
+}<br>
+<br>
+void f26()<br>
+{<br>
+       f27();<br>
+       f27();<br>
+}<br>
+<br>
+void f25()<br>
+{<br>
+       f26();<br>
+       f26();<br>
+}<br>
+<br>
+void f24()<br>
+{<br>
+       f25();<br>
+       f25();<br>
+}<br>
+<br>
+void f23()<br>
+{<br>
+       f24();<br>
+       f24();<br>
+}<br>
+<br>
+void f22()<br>
+{<br>
+       f23();<br>
+       f23();<br>
+}<br>
+<br>
+void f21()<br>
+{<br>
+       f22();<br>
+       f22();<br>
+}<br>
+<br>
+void f20()<br>
+{<br>
+       f21();<br>
+       f21();<br>
+}<br>
+<br>
+void f19()<br>
+{<br>
+       f20();<br>
+       f20();<br>
+}<br>
+<br>
+void f18()<br>
+{<br>
+       f19();<br>
+       f19();<br>
+}<br>
+<br>
+void f17()<br>
+{<br>
+       f18();<br>
+       f18();<br>
+}<br>
+<br>
+void f16()<br>
+{<br>
+       f17();<br>
+       f17();<br>
+}<br>
+<br>
+void f15()<br>
+{<br>
+       f16();<br>
+       f16();<br>
+}<br>
+<br>
+void f14()<br>
+{<br>
+       f15();<br>
+       f15();<br>
+}<br>
+<br>
+void f13()<br>
+{<br>
+       f14();<br>
+       f14();<br>
+}<br>
+<br>
+void f12()<br>
+{<br>
+       f13();<br>
+       f13();<br>
+}<br>
+<br>
+void f11()<br>
+{<br>
+       f12();<br>
+       f12();<br>
+}<br>
+<br>
+void f10()<br>
+{<br>
+       f11();<br>
+       f11();<br>
+}<br>
+<br>
+void f9()<br>
+{<br>
+       f10();<br>
+       f10();<br>
+}<br>
+<br>
+void f8()<br>
+{<br>
+       f9();<br>
+       f9();<br>
+}<br>
+<br>
+void f7()<br>
+{<br>
+       f8();<br>
+       f8();<br>
+}<br>
+<br>
+void f6()<br>
+{<br>
+       f7();<br>
+       f7();<br>
+}<br>
+<br>
+void f5()<br>
+{<br>
+       f6();<br>
+       f6();<br>
+}<br>
+<br>
+void f4()<br>
+{<br>
+       f5();<br>
+       f5();<br>
+}<br>
+<br>
+void f3()<br>
+{<br>
+       f4();<br>
+       f4();<br>
+}<br>
+<br>
+void f2()<br>
+{<br>
+       f3();<br>
+       f3();<br>
+}<br>
+<br>
+void f1()<br>
+{<br>
+       f2();<br>
+       f2();<br>
+}<br>
+<br>
+void f0()<br>
+{<br>
+       f1();<br>
+       f1();<br>
+}<br>
+<br>
+void main()<br>
+{<br>
+       gl_TexCoord[0] = vec4(0.1, 0.2, 0.3, 0.4);<br>
+       if(gl_Vertex.x &gt; 2.0) // this branch is never taken, but the compiler doesn&#39;t know this<br>
+               f0();<br>
+       gl_Position = gl_Vertex;<br>
+}<br>
+[fragment shader]<br>
+void main()<br>
+{<br>
+       gl_FragColor = gl_TexCoord[0];<br>
+}<br>
+<br>
+[test]<br>
+draw rect -1 -1 2 2<br>
+probe all rgba 0.1 0.2 0.3 0.4<br>
+<br>
diff --git a/tests/shaders/glsl-vs-unroll-explosion.shader_test b/tests/shaders/glsl-vs-unroll-explosion.shader_test<br>
new file mode 100644<br>
index 0000000..ef07dfa<br>
--- /dev/null<br>
+++ b/tests/shaders/glsl-vs-unroll-explosion.shader_test<br>
@@ -0,0 +1,44 @@<br>
+// if you inline all functions indiscriminately, you won&#39;t pass this<br>
+[require]<br>
+GL &gt;= 2.0<br>
+GLSL &gt;= 1.10<br>
+<br>
+[vertex shader]<br>
+<br>
+void main()<br>
+{<br>
+       gl_TexCoord[0] = vec4(0.1, 0.2, 0.3, 0.4);<br>
+       if(gl_Vertex.x &gt; 2.0) // this branch is never taken, but the compiler doesn&#39;t know this<br>
+       {<br>
+               for(int i0 = 0; i0 &lt; 16; ++i0)<br>
+               for(int i1 = 0; i1 &lt; 16; ++i1)<br>
+               for(int i2 = 0; i2 &lt; 16; ++i2)<br>
+               for(int i3 = 0; i3 &lt; 16; ++i3)<br>
+               for(int i4 = 0; i4 &lt; 16; ++i4)<br>
+               for(int i5 = 0; i5 &lt; 16; ++i5)<br>
+               for(int i6 = 0; i6 &lt; 16; ++i6)<br>
+               for(int i7 = 0; i7 &lt; 16; ++i7)<br>
+               for(int i8 = 0; i8 &lt; 16; ++i8)<br>
+               for(int i9 = 0; i9 &lt; 16; ++i9)<br>
+               for(int i10 = 0; i10 &lt; 16; ++i10)<br>
+               for(int i11 = 0; i11 &lt; 16; ++i11)<br>
+               for(int i12 = 0; i12 &lt; 16; ++i12)<br>
+               for(int i13 = 0; i13 &lt; 16; ++i13)<br>
+               for(int i14 = 0; i14 &lt; 16; ++i14)<br>
+               for(int i15 = 0; i15 &lt; 16; ++i15)<br>
+               {<br>
+                       gl_TexCoord[0] = exp(gl_TexCoord[0]);<br>
+               }<br>
+       }<br>
+       gl_Position = gl_Vertex;<br>
+}<br>
+[fragment shader]<br>
+void main()<br>
+{<br>
+       gl_FragColor = gl_TexCoord[0];<br>
+}<br>
+<br>
+[test]<br>
+draw rect -1 -1 2 2<br>
+probe all rgba 0.1 0.2 0.3 0.4<br>
+<br>
<font color="#888888">--<br>
1.7.0.4<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></blockquote></div><br>