Make it running under Linux.
authorMichal Krol <mjkrol@gmail.org>
Tue, 30 May 2006 09:38:16 +0000 (09:38 +0000)
committerMichal Krol <mjkrol@gmail.org>
Tue, 30 May 2006 09:38:16 +0000 (09:38 +0000)
progs/slang/Makefile [new file with mode: 0644]
progs/slang/README [new file with mode: 0644]
progs/slang/cltest.c
progs/slang/cltest.txt
progs/slang/framework.c
progs/slang/framework.h
progs/slang/vstest.c
progs/slang/vstest.txt

diff --git a/progs/slang/Makefile b/progs/slang/Makefile
new file mode 100644 (file)
index 0000000..90debd1
--- /dev/null
@@ -0,0 +1,67 @@
+# progs/slang/Makefile
+
+TOP = ../..
+
+include $(TOP)/configs/current
+
+INCDIR = $(TOP)/include
+
+LIB_DEP = $(LIB_DIR)/$(GL_LIB_NAME)
+
+#
+# targets
+#
+
+.PHONY: default tests clean
+
+default: cltest sotest vstest
+
+tests: default
+       ! ./sotest 2> /dev/null | (grep -e ^[*][*][*])
+       ! ./vstest 2> /dev/null | (grep -e ^[*][*][*])
+       ! ./cltest 2> /dev/null | (grep -e ^[*][*][*])
+
+clean:
+       rm -f cltest.o sotest.o vstest.o framework.o cltest sotest vstest
+
+#
+# executables
+#
+
+cltest: cltest.o framework.o $(LIB_DEP)
+       $(CC) cltest.o framework.o $(APP_LIB_DEPS) -o cltest
+
+sotest: sotest.o framework.o $(LIB_DEP)
+       $(CC) sotest.o framework.o $(APP_LIB_DEPS) -o sotest
+
+vstest: vstest.o framework.o $(LIB_DEP)
+       $(CC) vstest.o framework.o $(APP_LIB_DEPS) -o vstest
+
+#
+# objects
+#
+
+framework.o: framework.c
+       $(CC) -c -I$(INCDIR) framework.c -o framework.o
+
+cltest.o: cltest.c
+       $(CC) -c -I$(INCDIR) cltest.c -o cltest.o
+
+sotest.o: sotest.c
+       $(CC) -c -I$(INCDIR) sotest.c -o sotest.o
+
+vstest.o: vstest.c
+       $(CC) -c -I$(INCDIR) vstest.c -o vstest.o
+
+#
+# sources
+#
+
+framework.c: framework.h
+
+cltest.c: framework.h
+
+sotest.c: framework.h
+
+vstest.c: framework.h
+
diff --git a/progs/slang/README b/progs/slang/README
new file mode 100644 (file)
index 0000000..13a6aaa
--- /dev/null
@@ -0,0 +1,7 @@
+GLSL regression tests.
+
+Type "make" to build all test apps.
+
+Type "make tests" to build and run all test apps. If any
+error is detected, a line starting with *** is output.
+
index 5736f3eab1058c499c44b6726390c68ffff98eaa..2753f59f85b5477a14882b071946db7e18bc8be7 100644 (file)
@@ -76,8 +76,8 @@ static void load_test_file (const char *filename, struct PROGRAM **program)
    struct PROGRAM **currprog = program;
    FILE *f;
    char line[256];
-   enum PROGRAM_LOAD_STATE pls;
-   enum SHADER_LOAD_STATE sls;
+   enum PROGRAM_LOAD_STATE pls = PLS_NONE;
+   enum SHADER_LOAD_STATE sls = SLS_NONE;
 
    f = fopen (filename, "r");
    if (f == NULL)
@@ -174,7 +174,7 @@ void RenderScene (void)
       exit (0);
 
    code = program->vertex.code;
-   glShaderSourceARB (vert, 1, &code, NULL);
+   glShaderSourceARB (vert, 1, (const GLcharARB **) (&code), NULL);
    glCompileShaderARB (vert);
    CheckObjectStatus (vert);
 
index 7d87e74a11e8ca285723152631d94cf3748e5f9a..8ca1dd40f972388260dbf846118ec48453b2024a 100644 (file)
-$ /*\r
-$ Shader test script.\r
-$ \r
-$ Author: Michal Krol\r
-$ \r
-$ Comment line starts with dollar sign and white space.\r
-$ \r
-$ $program <name> starts a new test program section called <name>. Contains all other sections.\r
-$ \r
-$ $attrib <name> starts vertex data input section for attrib called <name>. Each line consists of\r
-$   four values that form single vertex attrib.\r
-$ \r
-$ $vertex starts vertex shader section. Contains $code and &output sections.\r
-$ \r
-$ $code starts source code section. All text in this section gets compiled into appropriate\r
-$   shader object.\r
-$ \r
-$ $output starts shader execution results section. These are compared, value-by-value,\r
-$   with results of executing printMESA() functions within a shader.\r
-$ */\r
-\r
-\r
-$ /*\r
-$ --------------------------------------------------------------------------------------------------\r
-$ Test printMESA() function.\r
-$ */\r
-\r
-$program PRINT TEST\r
-\r
-$vertex\r
-\r
-$code\r
-\r
-void main () {\r
-   gl_Position = gl_ModelViewMatrix * gl_Vertex;\r
-   gl_FrontColor = vec4 (1.0);\r
-\r
-   printMESA (11.1);\r
-   printMESA (111);\r
-   printMESA (true);\r
-\r
-   printMESA (vec2 (22.1, 22.2));\r
-   printMESA (vec3 (33.1, 33.2, 33.3));\r
-   printMESA (vec4 (44.1, 44.2, 44.3, 44.4));\r
-\r
-   printMESA (ivec2 (221, 222));\r
-   printMESA (ivec3 (331, 332, 333));\r
-   printMESA (ivec4 (441, 442, 443, 444));\r
-\r
-   printMESA (bvec2 (false, true));\r
-   printMESA (bvec3 (true, true, false));\r
-   printMESA (bvec4 (true, false, true, false));\r
-\r
-   printMESA (mat2 (55.11, 55.12, 55.21, 55.22));\r
-   printMESA (mat3 (66.11, 66.12, 66.13,\r
-                    66.21, 66.22, 66.23,\r
-                    66.31, 66.32, 66.33));\r
-   printMESA (mat4 (77.11, 77.12, 77.13, 77.14,\r
-                    77.21, 77.22, 77.23, 77.24,\r
-                    77.31, 77.32, 77.33, 77.34,\r
-                    77.41, 77.42, 77.43, 77.44));\r
-}\r
-\r
-$output\r
-\r
-11.1\r
-111\r
-true\r
-\r
-22.1\r
-22.2\r
-33.1\r
-33.2\r
-33.3\r
-44.1\r
-44.2\r
-44.3\r
-44.4\r
-\r
-221\r
-222\r
-331\r
-332\r
-333\r
-441\r
-442\r
-443\r
-444\r
-\r
-false\r
-true\r
-true\r
-true\r
-false\r
-true\r
-false\r
-true\r
-false\r
-\r
-55.11\r
-55.12\r
-55.21\r
-55.22\r
-\r
-66.11\r
-66.12\r
-66.13\r
-66.21\r
-66.22\r
-66.23\r
-66.31\r
-66.32\r
-66.33\r
-\r
-77.11\r
-77.12\r
-77.13\r
-77.14\r
-77.21\r
-77.22\r
-77.23\r
-77.24\r
-77.31\r
-77.32\r
-77.33\r
-77.34\r
-77.41\r
-77.42\r
-77.43\r
-77.44\r
-\r
-\r
-$ /*\r
-$ --------------------------------------------------------------------------------------------------\r
-$ Test type casting.\r
-$ */\r
-\r
-$program TYPE CAST TEST\r
-\r
-$attrib gl_Vertex\r
-0.0 0.0 0.0 1.0\r
-\r
-$attrib _Zero\r
-0.0 0.0 0.0 0.0\r
-\r
-$attrib _One\r
-1.1 0.0 0.0 0.0\r
-\r
-$attrib _Two\r
-2.2 0.0 0.0 0.0\r
-\r
-$attrib _MinusThree\r
--3.3 0.0 0.0 0.0\r
-\r
-$vertex\r
-\r
-$code\r
-\r
-attribute float _Zero;\r
-attribute float _One;\r
-attribute float _Two;\r
-attribute float _MinusThree;\r
-\r
-void main () {\r
-   gl_Position = gl_ModelViewMatrix * gl_Vertex;\r
-   gl_FrontColor = vec4 (1.0);\r
-\r
-   printMESA (_Zero);\r
-   printMESA (_One);\r
-   printMESA (_Two);\r
-   printMESA (_MinusThree);\r
-\r
-   printMESA (float (_Zero));\r
-   printMESA (float (_One));\r
-   printMESA (float (_Two));\r
-   printMESA (float (_MinusThree));\r
-   printMESA (float (45.99));\r
-   printMESA (float (-6.17));\r
-\r
-   printMESA (bool (_Zero));\r
-   printMESA (bool (_One));\r
-   printMESA (bool (_Two));\r
-   printMESA (bool (_MinusThree));\r
-   printMESA (bool (45.99));\r
-   printMESA (bool (-6.17));\r
-   printMESA (bool (0.0001));\r
-   printMESA (bool (0.0));\r
-\r
-   printMESA (int (_Zero));\r
-   printMESA (int (_One));\r
-   printMESA (int (_Two));\r
-   printMESA (int (_MinusThree));\r
-   printMESA (int (45.99));\r
-   printMESA (int (45.22));\r
-   printMESA (int (-6.17));\r
-   printMESA (int (-6.87));\r
-}\r
-\r
-$output\r
-\r
-0.0\r
-1.1\r
-2.2\r
--3.3\r
-\r
-0.0\r
-1.1\r
-2.2\r
--3.3\r
-45.99\r
--6.17\r
-\r
-false\r
-true\r
-true\r
-true\r
-true\r
-true\r
-true\r
-false\r
-\r
-0\r
-1\r
-2\r
--3\r
-45\r
-45\r
--6\r
--6\r
-\r
-$ /*\r
-$ --------------------------------------------------------------------------------------------------\r
-$ Test vector swizzles.\r
-$ */\r
-\r
-$program SWIZZLE TEST\r
-\r
-$attrib gl_Vertex\r
-0.0 0.0 0.0 1.0\r
-\r
-$attrib _One\r
-1.1 1.2 1.3 1.4\r
-\r
-$attrib _Two\r
-2.1 2.2 2.3 2.4\r
-\r
-$vertex\r
-\r
-$code\r
-\r
-attribute vec4 _One;\r
-attribute vec4 _Two;\r
-\r
-void assign5678 (out vec4 v)\r
-{\r
-   v.x = 5.5;\r
-   v.y = 6.6;\r
-   v.z = 7.7;\r
-   v.w = 8.8;\r
-}\r
-\r
-void main () {\r
-   gl_Position = gl_ModelViewMatrix * gl_Vertex;\r
-   gl_FrontColor = vec4 (1.0);\r
-\r
-   printMESA (_One);\r
-   printMESA (_Two);\r
-\r
-   printMESA (_One.x);\r
-   printMESA (_One.y);\r
-   printMESA (_One.z);\r
-   printMESA (_One.w);\r
-\r
-   printMESA (_Two.xy);\r
-   printMESA (_Two.yx);\r
-   printMESA (_Two.xw);\r
-   printMESA (_Two.wx);\r
-   printMESA (_Two.yz);\r
-   printMESA (_Two.zy);\r
-   printMESA (_Two.xz);\r
-   printMESA (_Two.zx);\r
-   printMESA (_Two.zw);\r
-   printMESA (_Two.wz);\r
-\r
-   printMESA (_One.xyz);\r
-   printMESA (_One.yzx);\r
-   printMESA (_One.zxy);\r
-   printMESA (_One.xzy);\r
-   printMESA (_One.yzw);\r
-   printMESA (_One.zwx);\r
-\r
-   printMESA (_Two.xyzw);\r
-   printMESA (_Two.yzwx);\r
-   printMESA (_Two.wzyx);\r
-   printMESA (_Two.zwyx);\r
-\r
-   printMESA (_One.xx);\r
-   printMESA (_One.zz);\r
-   printMESA (_One.ww);\r
-\r
-   printMESA (_Two.xxx);\r
-   printMESA (_Two.yyy);\r
-   printMESA (_Two.www);\r
-\r
-   printMESA (_One.xxxx);\r
-   printMESA (_One.zzzz);\r
-\r
-   printMESA (_Two.xxyy);\r
-   printMESA (_Two.wwxx);\r
-   printMESA (_Two.zxxw);\r
-\r
-   vec4 v;\r
-\r
-   v.zxwy = vec4 (5.5, 6.6, 7.7, 8.8);\r
-   printMESA (v);\r
-\r
-   assign5678 (v.ywxz);\r
-   printMESA (v);\r
-}\r
-\r
-$output\r
-\r
-1.1\r
-1.2\r
-1.3\r
-1.4\r
-2.1\r
-2.2\r
-2.3\r
-2.4\r
-\r
-1.1\r
-1.2\r
-1.3\r
-1.4\r
-\r
-2.1\r
-2.2\r
-2.2\r
-2.1\r
-2.1\r
-2.4\r
-2.4\r
-2.1\r
-2.2\r
-2.3\r
-2.3\r
-2.2\r
-2.1\r
-2.3\r
-2.3\r
-2.1\r
-2.3\r
-2.4\r
-2.4\r
-2.3\r
-\r
-1.1\r
-1.2\r
-1.3\r
-1.2\r
-1.3\r
-1.1\r
-1.3\r
-1.1\r
-1.2\r
-1.1\r
-1.3\r
-1.2\r
-1.2\r
-1.3\r
-1.4\r
-1.3\r
-1.4\r
-1.1\r
-\r
-2.1\r
-2.2\r
-2.3\r
-2.4\r
-2.2\r
-2.3\r
-2.4\r
-2.1\r
-2.4\r
-2.3\r
-2.2\r
-2.1\r
-2.3\r
-2.4\r
-2.2\r
-2.1\r
-\r
-1.1\r
-1.1\r
-1.3\r
-1.3\r
-1.4\r
-1.4\r
-\r
-2.1\r
-2.1\r
-2.1\r
-2.2\r
-2.2\r
-2.2\r
-2.4\r
-2.4\r
-2.4\r
-\r
-1.1\r
-1.1\r
-1.1\r
-1.1\r
-1.3\r
-1.3\r
-1.3\r
-1.3\r
-\r
-2.1\r
-2.1\r
-2.2\r
-2.2\r
-2.4\r
-2.4\r
-2.1\r
-2.1\r
-2.3\r
-2.1\r
-2.1\r
-2.4\r
-\r
-6.6\r
-8.8\r
-5.5\r
-7.7\r
-\r
-7.7\r
-5.5\r
-8.8\r
-6.6\r
-\r
-\r
-$ /*\r
-$ --------------------------------------------------------------------------------------------------\r
-$ Test relational operators.\r
-$ */\r
-\r
-$program RELATIONAL OPERATOR TEST\r
-\r
-$attrib gl_Vertex\r
-0.0 0.0 0.0 1.0\r
-\r
-$attrib _Two\r
-2.0 0.0 0.0 0.0\r
-\r
-$attrib _Two2\r
-2.0 0.0 0.0 0.0\r
-\r
-$attrib _MinusThree\r
--3.0 0.0 0.0 0.0\r
-\r
-$vertex\r
-\r
-$code\r
-\r
-attribute float _Two;\r
-attribute float _Two2;\r
-attribute float _MinusThree;\r
-\r
-struct foo\r
-{\r
-       float f;\r
-       vec4 v4;\r
-       vec3 v3;\r
-       mat4 m4;\r
-       int i;\r
-       bool b;\r
-};\r
-\r
-void printMESA (const in foo bar)\r
-{\r
-       printMESA (bar.f);\r
-       printMESA (bar.v4);\r
-       printMESA (bar.v3);\r
-       printMESA (bar.m4);\r
-       printMESA (bar.i);\r
-       printMESA (bar.b);\r
-}\r
-\r
-void main () {\r
-   gl_Position = gl_ModelViewMatrix * gl_Vertex;\r
-   gl_FrontColor = vec4 (1.0);\r
-\r
-   int iTwo = int (_Two);\r
-   int iTwo2 = int (_Two2);\r
-   int iMinusThree = int (_MinusThree);\r
-\r
-   printMESA (_Two <= _Two);\r
-   printMESA (_Two <= _Two2);\r
-   printMESA (_Two <= _MinusThree);\r
-   printMESA (_MinusThree <= _Two);\r
-   printMESA (iTwo <= iTwo);\r
-   printMESA (iTwo <= iTwo2);\r
-   printMESA (iTwo <= iMinusThree);\r
-   printMESA (iMinusThree <= iTwo);\r
-\r
-   printMESA (_Two >= _Two);\r
-   printMESA (_Two >= _Two2);\r
-   printMESA (_Two >= _MinusThree);\r
-   printMESA (_MinusThree >= _Two);\r
-   printMESA (iTwo >= iTwo);\r
-   printMESA (iTwo >= iTwo2);\r
-   printMESA (iTwo >= iMinusThree);\r
-   printMESA (iMinusThree >= iTwo);\r
-\r
-   printMESA (_Two < _Two);\r
-   printMESA (_Two < _Two2);\r
-   printMESA (_Two < _MinusThree);\r
-   printMESA (_MinusThree < _Two);\r
-   printMESA (iTwo < iTwo);\r
-   printMESA (iTwo < iTwo2);\r
-   printMESA (iTwo < iMinusThree);\r
-   printMESA (iMinusThree < iTwo);\r
-\r
-   printMESA (_Two > _Two);\r
-   printMESA (_Two > _Two2);\r
-   printMESA (_Two > _MinusThree);\r
-   printMESA (_MinusThree > _Two);\r
-   printMESA (iTwo > iTwo);\r
-   printMESA (iTwo > iTwo2);\r
-   printMESA (iTwo > iMinusThree);\r
-   printMESA (iMinusThree > iTwo);\r
-\r
-   printMESA (_Two == _Two);\r
-   printMESA (_Two == _Two2);\r
-   printMESA (_Two == _MinusThree);\r
-   printMESA (_MinusThree == _MinusThree);\r
-   printMESA (iTwo == iTwo);\r
-   printMESA (iTwo == iTwo2);\r
-   printMESA (iTwo == iMinusThree);\r
-   printMESA (iMinusThree == iMinusThree);\r
-\r
-   printMESA (_Two != _Two);\r
-   printMESA (_Two != _Two2);\r
-   printMESA (_Two != _MinusThree);\r
-   printMESA (_MinusThree != _MinusThree);\r
-   printMESA (iTwo != iTwo);\r
-   printMESA (iTwo != iTwo2);\r
-   printMESA (iTwo != iMinusThree);\r
-   printMESA (iMinusThree != iMinusThree);\r
-\r
-   foo foo1;\r
-   foo1.f = 13.31;\r
-   foo1.v4 = vec4 (44.11, 44.22, 44.33, 44.44);\r
-   foo1.v3 = vec3 (33.11, 33.22, 33.33);\r
-   foo1.m4 = mat4 (17.88);\r
-   foo1.i = 666;\r
-   foo1.b = true;\r
-   printMESA (foo1);\r
-\r
-   // make foo2 the same as foo1\r
-   foo foo2;\r
-   foo2.f = 13.31;\r
-   foo2.v4 = vec4 (44.11, 44.22, 44.33, 44.44);\r
-   foo2.v3 = vec3 (33.11, 33.22, 33.33);\r
-   foo2.m4 = mat4 (17.88);\r
-   foo2.i = 666;\r
-   foo2.b = true;\r
-\r
-   printMESA (foo1 == foo2);\r
-   printMESA (foo1 != foo2);\r
-\r
-   // make them a little bit different\r
-   foo2.m4[2].y = 333.333;\r
-   printMESA (foo2);\r
-\r
-   printMESA (foo1 == foo2);\r
-   printMESA (foo1 != foo2);\r
-}\r
-\r
-$output\r
-\r
-true\r
-true\r
-false\r
-true\r
-true\r
-true\r
-false\r
-true\r
-\r
-true\r
-true\r
-true\r
-false\r
-true\r
-true\r
-true\r
-false\r
-\r
-false\r
-false\r
-false\r
-true\r
-false\r
-false\r
-false\r
-true\r
-\r
-false\r
-false\r
-true\r
-false\r
-false\r
-false\r
-true\r
-false\r
-\r
-true\r
-true\r
-false\r
-true\r
-true\r
-true\r
-false\r
-true\r
-\r
-false\r
-false\r
-true\r
-false\r
-false\r
-false\r
-true\r
-false\r
-\r
-13.31\r
-44.11\r
-44.22\r
-44.33\r
-44.44\r
-33.11\r
-33.22\r
-33.33\r
-17.88\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-17.88\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-17.88\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-17.88\r
-666\r
-true\r
-\r
-true\r
-false\r
-\r
-13.31\r
-44.11\r
-44.22\r
-44.33\r
-44.44\r
-33.11\r
-33.22\r
-33.33\r
-17.88\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-17.88\r
-0.0\r
-0.0\r
-0.0\r
-333.333\r
-17.88\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-17.88\r
-666\r
-true\r
-\r
-false\r
-true\r
-\r
-\r
-$ /*\r
-$ --------------------------------------------------------------------------------------------------\r
-$ Test logical operators.\r
-$ */\r
-\r
-$program LOGICAL OPERATOR TEST\r
-\r
-$attrib gl_Vertex\r
-0.0 0.0 0.0 1.0\r
-\r
-$attrib _False\r
-0.0 0.0 0.0 0.0\r
-\r
-$attrib _True\r
-1.0 0.0 0.0 0.0\r
-\r
-$attrib _False2\r
-0.0 0.0 0.0 0.0\r
-\r
-$attrib _True2\r
-1.0 0.0 0.0 0.0\r
-\r
-$vertex\r
-\r
-$code\r
-\r
-attribute float _False;\r
-attribute float _True;\r
-attribute float _False2;\r
-attribute float _True2;\r
-\r
-void main () {\r
-   gl_Position = gl_ModelViewMatrix * gl_Vertex;\r
-   gl_FrontColor = vec4 (1.0);\r
-\r
-   printMESA (_False);\r
-   printMESA (_True);\r
-   printMESA (_False2);\r
-   printMESA (_True2);\r
-\r
-   bool False = bool (_False);\r
-   bool True = bool (_True);\r
-   bool False2 = bool (_False2);\r
-   bool True2 = bool (_True2);\r
-\r
-   //\r
-   // It is important to test each operator with the following argument types:\r
-   // * Both arguments are different variables, even if they have the same values.\r
-   //   False and False2 are distinct attributes, but are the same in value.\r
-   // * Both arguments may be the same variables. This case tests possible\r
-   //   optimizations, e.g. X && X --> X.\r
-   // * Both arguments are constant. This tests constant folding.\r
-   //\r
-\r
-   printMESA (!False);\r
-   printMESA (!True);\r
-   printMESA (!false);\r
-   printMESA (!true);\r
-\r
-   printMESA (False ^^ False2);\r
-   printMESA (False ^^ True2);\r
-   printMESA (True ^^ False2);\r
-   printMESA (True ^^ True2);\r
-   printMESA (False ^^ False);\r
-   printMESA (False ^^ True);\r
-   printMESA (True ^^ False);\r
-   printMESA (True ^^ True);\r
-   printMESA (false ^^ false);\r
-   printMESA (false ^^ true);\r
-   printMESA (true ^^ false);\r
-   printMESA (true ^^ true);\r
-\r
-   printMESA (False && False2);\r
-   printMESA (False && True2);\r
-   printMESA (True && False2);\r
-   printMESA (True && True2);\r
-   printMESA (False && False);\r
-   printMESA (False && True);\r
-   printMESA (True && False);\r
-   printMESA (True && True);\r
-   printMESA (false && false);\r
-   printMESA (false && true);\r
-   printMESA (true && false);\r
-   printMESA (true && true);\r
-\r
-   printMESA (False || False2);\r
-   printMESA (False || True2);\r
-   printMESA (True || False2);\r
-   printMESA (True || True2);\r
-   printMESA (False || False);\r
-   printMESA (False || True);\r
-   printMESA (True || False);\r
-   printMESA (True || True);\r
-   printMESA (false || false);\r
-   printMESA (false || true);\r
-   printMESA (true || false);\r
-   printMESA (true || true);\r
-\r
-   //\r
-   // Test short-circuit evaluation of && and ||. The right expression evaluation depends\r
-   // on the value of the left expression. If the right expression has side effects, we\r
-   // can easily test if it happened.\r
-   //\r
-\r
-   bool x;\r
-\r
-   x = false;\r
-   printMESA (x);\r
-   printMESA (False && (x = true));\r
-   printMESA (x);\r
-\r
-   x = false;\r
-   printMESA (x);\r
-   printMESA (false && (x = true));\r
-   printMESA (x);\r
-\r
-   x = true;\r
-   printMESA (x);\r
-   printMESA (True || (x = false));\r
-   printMESA (x);\r
-\r
-   x = true;\r
-   printMESA (x);\r
-   printMESA (true || (x = false));\r
-   printMESA (x);\r
-}\r
-\r
-$output\r
-\r
-0.0\r
-1.0\r
-0.0\r
-1.0\r
-\r
-true\r
-false\r
-true\r
-false\r
-\r
-false\r
-true\r
-true\r
-false\r
-false\r
-true\r
-true\r
-false\r
-false\r
-true\r
-true\r
-false\r
-\r
-false\r
-false\r
-false\r
-true\r
-false\r
-false\r
-false\r
-true\r
-false\r
-false\r
-false\r
-true\r
-\r
-false\r
-true\r
-true\r
-true\r
-false\r
-true\r
-true\r
-true\r
-false\r
-true\r
-true\r
-true\r
-\r
-false\r
-false\r
-false\r
-\r
-false\r
-false\r
-false\r
-\r
-true\r
-true\r
-true\r
-\r
-true\r
-true\r
-true\r
-\r
-\r
-$ /*\r
-$ --------------------------------------------------------------------------------------------------\r
-$ Test subscript operator/array access.\r
-$ */\r
-\r
-$program ARRAY ACCESS TEST\r
-\r
-$attrib gl_Vertex\r
-0.0 0.0 0.0 1.0\r
-\r
-$attrib _Zero\r
-0.0 0.0 0.0 0.0\r
-\r
-$attrib _One\r
-1.1 0.0 0.0 0.0\r
-\r
-$attrib _Two\r
-2.9 0.0 0.0 0.0\r
-\r
-$attrib _Vec\r
-11.11 22.22 33.33 44.44\r
-\r
-$vertex\r
-\r
-$code\r
-\r
-attribute float _Zero;\r
-attribute float _One;\r
-attribute float _Two;\r
-attribute vec4 _Vec;\r
-\r
-void main () {\r
-   gl_Position = gl_ModelViewMatrix * gl_Vertex;\r
-   gl_FrontColor = vec4 (1.0);\r
-\r
-   printMESA (_Zero);\r
-   printMESA (_One);\r
-   printMESA (_Two);\r
-   printMESA (_Vec);\r
-\r
-   printMESA (_Vec[0]);\r
-   printMESA (_Vec[1]);\r
-   printMESA (_Vec[2]);\r
-   printMESA (_Vec[3]);\r
-\r
-   printMESA (_Vec[int (_Zero)]);\r
-   printMESA (_Vec[int (_One)]);\r
-   printMESA (_Vec[int (_Two)]);\r
-}\r
-\r
-$output\r
-\r
-0.0\r
-1.1\r
-2.9\r
-11.11\r
-22.22\r
-33.33\r
-44.44\r
-\r
-11.11\r
-22.22\r
-33.33\r
-44.44\r
-\r
-11.11\r
-22.22\r
-33.33\r
-\r
-\r
-$ /*\r
-$ --------------------------------------------------------------------------------------------------\r
-$ Test pre/post-increment/decrement operators.\r
-$ Note: assumes relational operators being correct.\r
-$ */\r
-\r
-$program PRE/POST-INC/DEC OPERATOR TEST\r
-\r
-$attrib gl_Vertex\r
-0.0 0.0 0.0 1.0\r
-\r
-$attrib _Zero\r
-0.0 0.0 0.0 0.0\r
-\r
-$attrib _One\r
-1.1 0.0 0.0 0.0\r
-\r
-$attrib _Two4\r
-2.1 2.2 2.3 2.4\r
-\r
-$vertex\r
-\r
-$code\r
-\r
-attribute float _Zero;\r
-attribute float _One;\r
-attribute vec4 _Two4;\r
-\r
-float fZero, fOne;\r
-vec4 fTwo4;\r
-int iZero, iOne;\r
-ivec4 iTwo4;\r
-\r
-void reset () {\r
-   fZero = _Zero;\r
-   fOne = _One;\r
-   fTwo4 = _Two4;\r
-   iZero = int (_Zero);\r
-   iOne = int (_One);\r
-   iTwo4 = ivec4 (_Two4);\r
-}\r
-\r
-void main () {\r
-   gl_Position = gl_ModelViewMatrix * gl_Vertex;\r
-   gl_FrontColor = vec4 (1.0);\r
-\r
-   printMESA (_Zero);\r
-   printMESA (_One);\r
-   printMESA (_Two4);\r
-\r
-   // pre-increment\r
-   reset ();\r
-   printMESA (++fZero);\r
-   printMESA (++fOne);\r
-   printMESA (++iZero);\r
-   printMESA (++iOne);\r
-   printMESA (fZero);\r
-   printMESA (fOne);\r
-   printMESA (iZero);\r
-   printMESA (iOne);\r
-   printMESA (++fTwo4 == _Two4 + 1.0);\r
-   printMESA (++iTwo4 == ivec4 (_Two4) + 1);\r
-\r
-   // pre-decrement\r
-   reset ();\r
-   printMESA (--fZero);\r
-   printMESA (--fOne);\r
-   printMESA (--iZero);\r
-   printMESA (--iOne);\r
-   printMESA (fZero);\r
-   printMESA (fOne);\r
-   printMESA (iZero);\r
-   printMESA (iOne);\r
-   printMESA (--fTwo4 == _Two4 - 1.0);\r
-   printMESA (--iTwo4 == ivec4 (_Two4) - 1);\r
-\r
-   // post-increment\r
-   reset ();\r
-   printMESA (fZero++);\r
-   printMESA (fOne++);\r
-   printMESA (iZero++);\r
-   printMESA (iOne++);\r
-   printMESA (fZero);\r
-   printMESA (fOne);\r
-   printMESA (iZero);\r
-   printMESA (iOne);\r
-   printMESA (fTwo4++ == _Two4);\r
-   printMESA (iTwo4++ == ivec4 (_Two4));\r
-\r
-   // post-decrement\r
-   reset ();\r
-   printMESA (fZero--);\r
-   printMESA (fOne--);\r
-   printMESA (iZero--);\r
-   printMESA (iOne--);\r
-   printMESA (fZero);\r
-   printMESA (fOne);\r
-   printMESA (iZero);\r
-   printMESA (iOne);\r
-   printMESA (fTwo4-- == _Two4);\r
-   printMESA (iTwo4-- == ivec4 (_Two4));\r
-}\r
-\r
-$output\r
-\r
-0.0\r
-1.1\r
-2.1\r
-2.2\r
-2.3\r
-2.4\r
-\r
-1.0\r
-2.1\r
-1\r
-2\r
-1.0\r
-2.1\r
-1\r
-2\r
-true\r
-true\r
-\r
--1.0\r
-0.1\r
--1\r
-0\r
--1.0\r
-0.1\r
--1\r
-0\r
-true\r
-true\r
-\r
-0.0\r
-1.1\r
-0\r
-1\r
-1.0\r
-2.1\r
-1\r
-2\r
-true\r
-true\r
-\r
-0.0\r
-1.1\r
-0\r
-1\r
--1.0\r
-0.1\r
--1\r
-0\r
-true\r
-true\r
-\r
-\r
-$ /*\r
-$ --------------------------------------------------------------------------------------------------\r
-$ Test arithmetical operators.\r
-$ */\r
-\r
-$program ARITHMETICAL OPERATOR TEST\r
-\r
-$attrib gl_Vertex\r
-0.0 0.0 0.0 1.0\r
-\r
-$attrib _Zero\r
-0.0 0.0 0.0 0.0\r
-\r
-$attrib _One\r
-1.1 0.0 0.0 0.0\r
-\r
-$attrib _Two4\r
-2.1 2.2 2.3 2.4\r
-\r
-$vertex\r
-\r
-$code\r
-\r
-attribute float _Zero;\r
-attribute float _One;\r
-attribute vec4 _Two4;\r
-\r
-void main () {\r
-   gl_Position = gl_ModelViewMatrix * gl_Vertex;\r
-   gl_FrontColor = vec4 (1.0);\r
-\r
-   printMESA (_Zero);\r
-   printMESA (_One);\r
-   printMESA (_Two4);\r
-\r
-   int iZero = int (_Zero);\r
-   int iOne = int (_One);\r
-   ivec4 iTwo4 = ivec4 (_Two4);\r
-\r
-   printMESA (-_Zero);\r
-   printMESA (-_One);\r
-   printMESA (-_Two4);\r
-   printMESA (-_Two4.z);\r
-\r
-   printMESA (_Zero + 0.0);\r
-   printMESA (_One + 0.0);\r
-   printMESA (_Two4 + 0.0);\r
-   printMESA (_Two4.y + 0.0);\r
-\r
-   printMESA (_Zero + _Zero);\r
-   printMESA (_Zero + _One);\r
-   printMESA (_Zero + _Two4);\r
-   printMESA (_One + _Zero);\r
-   printMESA (_One + _Two4);\r
-   printMESA (_Two4 + _Two4);\r
-\r
-   printMESA (_Zero - 0.0);\r
-   printMESA (_One - 0.0);\r
-   printMESA (_Two4 - 0.0);\r
-   printMESA (_Two4.y - 0.0);\r
-\r
-   printMESA (_Zero - _Zero);\r
-   printMESA (_Zero - _One);\r
-   printMESA (_Zero - _Two4);\r
-   printMESA (_One - _Zero);\r
-   printMESA (_One - _Two4);\r
-   printMESA (_Two4 - _Two4);\r
-\r
-   printMESA (_Zero * 1.0);\r
-   printMESA (_One * 1.0);\r
-   printMESA (_Two4 * 1.0);\r
-   printMESA (_Two4.x * 1.0);\r
-\r
-   printMESA (_Zero * _Zero);\r
-   printMESA (_Zero * _One);\r
-   printMESA (_Zero * _Two4);\r
-   printMESA (_One * _Zero);\r
-   printMESA (_One * _One);\r
-   printMESA (_One * _Two4);\r
-   printMESA (_Two4 * _Two4);\r
-\r
-   printMESA (_Zero / 1.0);\r
-   printMESA (_One / 1.0);\r
-   printMESA (_Two4 / 1.0);\r
-   printMESA (_Two4.x / 1.0);\r
-\r
-   printMESA (_Zero / _One);\r
-   printMESA (_Zero / _Two4);\r
-   printMESA (_One / _One);\r
-   printMESA (_One / _Two4);\r
-   printMESA (_Two4 / _Two4);\r
-}\r
-\r
-$output\r
-\r
-0.0\r
-1.1\r
-2.1\r
-2.2\r
-2.3\r
-2.4\r
-\r
-0.0\r
--1.1\r
--2.1\r
--2.2\r
--2.3\r
--2.4\r
--2.3\r
-\r
-0.0\r
-1.1\r
-2.1\r
-2.2\r
-2.3\r
-2.4\r
-2.2\r
-\r
-0.0\r
-1.1\r
-2.1\r
-2.2\r
-2.3\r
-2.4\r
-1.1\r
-3.2\r
-3.3\r
-3.4\r
-3.5\r
-4.2\r
-4.4\r
-4.6\r
-4.8\r
-\r
-0.0\r
-1.1\r
-2.1\r
-2.2\r
-2.3\r
-2.4\r
-2.2\r
-\r
-0.0\r
--1.1\r
--2.1\r
--2.2\r
--2.3\r
--2.4\r
-1.1\r
--1.0\r
--1.1\r
--1.2\r
--1.3\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-\r
-0.0\r
-1.1\r
-2.1\r
-2.2\r
-2.3\r
-2.4\r
-2.1\r
-\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-1.21\r
-2.31\r
-2.42\r
-2.53\r
-2.64\r
-4.41\r
-4.84\r
-5.29\r
-5.76\r
-\r
-0.0\r
-1.1\r
-2.1\r
-2.2\r
-2.3\r
-2.4\r
-2.1\r
-\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-1.0\r
-0.52381\r
-0.5\r
-0.47826\r
-0.45833\r
-1.0\r
-1.0\r
-1.0\r
-1.0\r
-\r
-\r
-$ /*\r
-$ --------------------------------------------------------------------------------------------------\r
-$ Test matrix operations.\r
-$ Note: assumes relational operators being correct.\r
-$ */\r
-\r
-$program MATRIX TEST\r
-\r
-$attrib gl_Vertex\r
-0.0 0.0 0.0 1.0\r
-\r
-$attrib _Zero\r
-0.0 0.0 0.0 0.0\r
-\r
-$attrib _One\r
-1.0 1.0 1.0 1.0\r
-\r
-$attrib _Two\r
-2.0 2.0 2.0 2.0\r
-\r
-$vertex\r
-\r
-$code\r
-\r
-attribute vec4 _Zero;\r
-attribute vec4 _One;\r
-attribute vec4 _Two;\r
-\r
-void main () {\r
-   gl_Position = gl_ModelViewMatrix * gl_Vertex;\r
-   gl_FrontColor = vec4 (1.0);\r
-\r
-   printMESA (_Zero);\r
-   printMESA (_One);\r
-   printMESA (_Two);\r
-\r
-   mat4 Identity = mat4 (_One.x);\r
-\r
-   printMESA (Identity == mat4 (1.0, 0.0, 0.0, 0.0,\r
-                                0.0, 1.0, 0.0, 0.0,\r
-                                0.0, 0.0, 1.0, 0.0,\r
-                                0.0, 0.0, 0.0, 1.0));\r
-   printMESA (Identity * _Two == _Two);\r
-\r
-   mat4 Matrix = mat4 (1.1, 1.2, 1.3, 1.4,\r
-                       2.1, 2.2, 2.3, 2.4,\r
-                       3.1, 3.2, 3.3, 3.4,\r
-                       4.1, 4.2, 4.3, 4.4);\r
-\r
-   printMESA (Matrix[2].y);\r
-   printMESA (Matrix[1]);\r
-}\r
-\r
-$output\r
-\r
-0.0\r
-0.0\r
-0.0\r
-0.0\r
-1.0\r
-1.0\r
-1.0\r
-1.0\r
-2.0\r
-2.0\r
-2.0\r
-2.0\r
-true\r
-true\r
-3.2\r
-2.1\r
-2.2\r
-2.3\r
-2.4\r
-\r
+$ /*
+$ Shader test script.
+$ 
+$ Author: Michal Krol
+$ 
+$ Comment line starts with dollar sign and white space.
+$ 
+$ $program <name> starts a new test program section called <name>. Contains all other sections.
+$ 
+$ $attrib <name> starts vertex data input section for attrib called <name>. Each line consists of
+$   four values that form single vertex attrib.
+$ 
+$ $vertex starts vertex shader section. Contains $code and &output sections.
+$ 
+$ $code starts source code section. All text in this section gets compiled into appropriate
+$   shader object.
+$ 
+$ $output starts shader execution results section. These are compared, value-by-value,
+$   with results of executing printMESA() functions within a shader.
+$ */
+
+
+$ /*
+$ --------------------------------------------------------------------------------------------------
+$ Test printMESA() function.
+$ */
+
+$program PRINT TEST
+
+$vertex
+
+$code
+
+void main () {
+   gl_Position = gl_ModelViewMatrix * gl_Vertex;
+   gl_FrontColor = vec4 (1.0);
+
+   printMESA (11.1);
+   printMESA (111);
+   printMESA (true);
+
+   printMESA (vec2 (22.1, 22.2));
+   printMESA (vec3 (33.1, 33.2, 33.3));
+   printMESA (vec4 (44.1, 44.2, 44.3, 44.4));
+
+   printMESA (ivec2 (221, 222));
+   printMESA (ivec3 (331, 332, 333));
+   printMESA (ivec4 (441, 442, 443, 444));
+
+   printMESA (bvec2 (false, true));
+   printMESA (bvec3 (true, true, false));
+   printMESA (bvec4 (true, false, true, false));
+
+   printMESA (mat2 (55.11, 55.12, 55.21, 55.22));
+   printMESA (mat3 (66.11, 66.12, 66.13,
+                    66.21, 66.22, 66.23,
+                    66.31, 66.32, 66.33));
+   printMESA (mat4 (77.11, 77.12, 77.13, 77.14,
+                    77.21, 77.22, 77.23, 77.24,
+                    77.31, 77.32, 77.33, 77.34,
+                    77.41, 77.42, 77.43, 77.44));
+}
+
+$output
+
+11.1
+111
+true
+
+22.1
+22.2
+33.1
+33.2
+33.3
+44.1
+44.2
+44.3
+44.4
+
+221
+222
+331
+332
+333
+441
+442
+443
+444
+
+false
+true
+true
+true
+false
+true
+false
+true
+false
+
+55.11
+55.12
+55.21
+55.22
+
+66.11
+66.12
+66.13
+66.21
+66.22
+66.23
+66.31
+66.32
+66.33
+
+77.11
+77.12
+77.13
+77.14
+77.21
+77.22
+77.23
+77.24
+77.31
+77.32
+77.33
+77.34
+77.41
+77.42
+77.43
+77.44
+
+
+$ /*
+$ --------------------------------------------------------------------------------------------------
+$ Test type casting.
+$ */
+
+$program TYPE CAST TEST
+
+$attrib gl_Vertex
+0.0 0.0 0.0 1.0
+
+$attrib _Zero
+0.0 0.0 0.0 0.0
+
+$attrib _One
+1.1 0.0 0.0 0.0
+
+$attrib _Two
+2.2 0.0 0.0 0.0
+
+$attrib _MinusThree
+-3.3 0.0 0.0 0.0
+
+$vertex
+
+$code
+
+attribute float _Zero;
+attribute float _One;
+attribute float _Two;
+attribute float _MinusThree;
+
+void main () {
+   gl_Position = gl_ModelViewMatrix * gl_Vertex;
+   gl_FrontColor = vec4 (1.0);
+
+   printMESA (_Zero);
+   printMESA (_One);
+   printMESA (_Two);
+   printMESA (_MinusThree);
+
+   printMESA (float (_Zero));
+   printMESA (float (_One));
+   printMESA (float (_Two));
+   printMESA (float (_MinusThree));
+   printMESA (float (45.99));
+   printMESA (float (-6.17));
+
+   printMESA (bool (_Zero));
+   printMESA (bool (_One));
+   printMESA (bool (_Two));
+   printMESA (bool (_MinusThree));
+   printMESA (bool (45.99));
+   printMESA (bool (-6.17));
+   printMESA (bool (0.0001));
+   printMESA (bool (0.0));
+
+   printMESA (int (_Zero));
+   printMESA (int (_One));
+   printMESA (int (_Two));
+   printMESA (int (_MinusThree));
+   printMESA (int (45.99));
+   printMESA (int (45.22));
+   printMESA (int (-6.17));
+   printMESA (int (-6.87));
+}
+
+$output
+
+0.0
+1.1
+2.2
+-3.3
+
+0.0
+1.1
+2.2
+-3.3
+45.99
+-6.17
+
+false
+true
+true
+true
+true
+true
+true
+false
+
+0
+1
+2
+-3
+45
+45
+-6
+-6
+
+$ /*
+$ --------------------------------------------------------------------------------------------------
+$ Test vector swizzles.
+$ */
+
+$program SWIZZLE TEST
+
+$attrib gl_Vertex
+0.0 0.0 0.0 1.0
+
+$attrib _One
+1.1 1.2 1.3 1.4
+
+$attrib _Two
+2.1 2.2 2.3 2.4
+
+$vertex
+
+$code
+
+attribute vec4 _One;
+attribute vec4 _Two;
+
+void assign5678 (out vec4 v)
+{
+   v.x = 5.5;
+   v.y = 6.6;
+   v.z = 7.7;
+   v.w = 8.8;
+}
+
+void main () {
+   gl_Position = gl_ModelViewMatrix * gl_Vertex;
+   gl_FrontColor = vec4 (1.0);
+
+   printMESA (_One);
+   printMESA (_Two);
+
+   printMESA (_One.x);
+   printMESA (_One.y);
+   printMESA (_One.z);
+   printMESA (_One.w);
+
+   printMESA (_Two.xy);
+   printMESA (_Two.yx);
+   printMESA (_Two.xw);
+   printMESA (_Two.wx);
+   printMESA (_Two.yz);
+   printMESA (_Two.zy);
+   printMESA (_Two.xz);
+   printMESA (_Two.zx);
+   printMESA (_Two.zw);
+   printMESA (_Two.wz);
+
+   printMESA (_One.xyz);
+   printMESA (_One.yzx);
+   printMESA (_One.zxy);
+   printMESA (_One.xzy);
+   printMESA (_One.yzw);
+   printMESA (_One.zwx);
+
+   printMESA (_Two.xyzw);
+   printMESA (_Two.yzwx);
+   printMESA (_Two.wzyx);
+   printMESA (_Two.zwyx);
+
+   printMESA (_One.xx);
+   printMESA (_One.zz);
+   printMESA (_One.ww);
+
+   printMESA (_Two.xxx);
+   printMESA (_Two.yyy);
+   printMESA (_Two.www);
+
+   printMESA (_One.xxxx);
+   printMESA (_One.zzzz);
+
+   printMESA (_Two.xxyy);
+   printMESA (_Two.wwxx);
+   printMESA (_Two.zxxw);
+
+   vec4 v;
+
+   v.zxwy = vec4 (5.5, 6.6, 7.7, 8.8);
+   printMESA (v);
+
+   assign5678 (v.ywxz);
+   printMESA (v);
+}
+
+$output
+
+1.1
+1.2
+1.3
+1.4
+2.1
+2.2
+2.3
+2.4
+
+1.1
+1.2
+1.3
+1.4
+
+2.1
+2.2
+2.2
+2.1
+2.1
+2.4
+2.4
+2.1
+2.2
+2.3
+2.3
+2.2
+2.1
+2.3
+2.3
+2.1
+2.3
+2.4
+2.4
+2.3
+
+1.1
+1.2
+1.3
+1.2
+1.3
+1.1
+1.3
+1.1
+1.2
+1.1
+1.3
+1.2
+1.2
+1.3
+1.4
+1.3
+1.4
+1.1
+
+2.1
+2.2
+2.3
+2.4
+2.2
+2.3
+2.4
+2.1
+2.4
+2.3
+2.2
+2.1
+2.3
+2.4
+2.2
+2.1
+
+1.1
+1.1
+1.3
+1.3
+1.4
+1.4
+
+2.1
+2.1
+2.1
+2.2
+2.2
+2.2
+2.4
+2.4
+2.4
+
+1.1
+1.1
+1.1
+1.1
+1.3
+1.3
+1.3
+1.3
+
+2.1
+2.1
+2.2
+2.2
+2.4
+2.4
+2.1
+2.1
+2.3
+2.1
+2.1
+2.4
+
+6.6
+8.8
+5.5
+7.7
+
+7.7
+5.5
+8.8
+6.6
+
+
+$ /*
+$ --------------------------------------------------------------------------------------------------
+$ Test relational operators.
+$ */
+
+$program RELATIONAL OPERATOR TEST
+
+$attrib gl_Vertex
+0.0 0.0 0.0 1.0
+
+$attrib _Two
+2.0 0.0 0.0 0.0
+
+$attrib _Two2
+2.0 0.0 0.0 0.0
+
+$attrib _MinusThree
+-3.0 0.0 0.0 0.0
+
+$vertex
+
+$code
+
+attribute float _Two;
+attribute float _Two2;
+attribute float _MinusThree;
+
+struct foo
+{
+       float f;
+       vec4 v4;
+       vec3 v3;
+       mat4 m4;
+       int i;
+       bool b;
+};
+
+void printMESA (const in foo bar)
+{
+       printMESA (bar.f);
+       printMESA (bar.v4);
+       printMESA (bar.v3);
+       printMESA (bar.m4);
+       printMESA (bar.i);
+       printMESA (bar.b);
+}
+
+void main () {
+   gl_Position = gl_ModelViewMatrix * gl_Vertex;
+   gl_FrontColor = vec4 (1.0);
+
+   int iTwo = int (_Two);
+   int iTwo2 = int (_Two2);
+   int iMinusThree = int (_MinusThree);
+
+   printMESA (_Two <= _Two);
+   printMESA (_Two <= _Two2);
+   printMESA (_Two <= _MinusThree);
+   printMESA (_MinusThree <= _Two);
+   printMESA (iTwo <= iTwo);
+   printMESA (iTwo <= iTwo2);
+   printMESA (iTwo <= iMinusThree);
+   printMESA (iMinusThree <= iTwo);
+
+   printMESA (_Two >= _Two);
+   printMESA (_Two >= _Two2);
+   printMESA (_Two >= _MinusThree);
+   printMESA (_MinusThree >= _Two);
+   printMESA (iTwo >= iTwo);
+   printMESA (iTwo >= iTwo2);
+   printMESA (iTwo >= iMinusThree);
+   printMESA (iMinusThree >= iTwo);
+
+   printMESA (_Two < _Two);
+   printMESA (_Two < _Two2);
+   printMESA (_Two < _MinusThree);
+   printMESA (_MinusThree < _Two);
+   printMESA (iTwo < iTwo);
+   printMESA (iTwo < iTwo2);
+   printMESA (iTwo < iMinusThree);
+   printMESA (iMinusThree < iTwo);
+
+   printMESA (_Two > _Two);
+   printMESA (_Two > _Two2);
+   printMESA (_Two > _MinusThree);
+   printMESA (_MinusThree > _Two);
+   printMESA (iTwo > iTwo);
+   printMESA (iTwo > iTwo2);
+   printMESA (iTwo > iMinusThree);
+   printMESA (iMinusThree > iTwo);
+
+   printMESA (_Two == _Two);
+   printMESA (_Two == _Two2);
+   printMESA (_Two == _MinusThree);
+   printMESA (_MinusThree == _MinusThree);
+   printMESA (iTwo == iTwo);
+   printMESA (iTwo == iTwo2);
+   printMESA (iTwo == iMinusThree);
+   printMESA (iMinusThree == iMinusThree);
+
+   printMESA (_Two != _Two);
+   printMESA (_Two != _Two2);
+   printMESA (_Two != _MinusThree);
+   printMESA (_MinusThree != _MinusThree);
+   printMESA (iTwo != iTwo);
+   printMESA (iTwo != iTwo2);
+   printMESA (iTwo != iMinusThree);
+   printMESA (iMinusThree != iMinusThree);
+
+   foo foo1;
+   foo1.f = 13.31;
+   foo1.v4 = vec4 (44.11, 44.22, 44.33, 44.44);
+   foo1.v3 = vec3 (33.11, 33.22, 33.33);
+   foo1.m4 = mat4 (17.88);
+   foo1.i = 666;
+   foo1.b = true;
+   printMESA (foo1);
+
+   // make foo2 the same as foo1
+   foo foo2;
+   foo2.f = 13.31;
+   foo2.v4 = vec4 (44.11, 44.22, 44.33, 44.44);
+   foo2.v3 = vec3 (33.11, 33.22, 33.33);
+   foo2.m4 = mat4 (17.88);
+   foo2.i = 666;
+   foo2.b = true;
+
+   printMESA (foo1 == foo2);
+   printMESA (foo1 != foo2);
+
+   // make them a little bit different
+   foo2.m4[2].y = 333.333;
+   printMESA (foo2);
+
+   printMESA (foo1 == foo2);
+   printMESA (foo1 != foo2);
+}
+
+$output
+
+true
+true
+false
+true
+true
+true
+false
+true
+
+true
+true
+true
+false
+true
+true
+true
+false
+
+false
+false
+false
+true
+false
+false
+false
+true
+
+false
+false
+true
+false
+false
+false
+true
+false
+
+true
+true
+false
+true
+true
+true
+false
+true
+
+false
+false
+true
+false
+false
+false
+true
+false
+
+13.31
+44.11
+44.22
+44.33
+44.44
+33.11
+33.22
+33.33
+17.88
+0.0
+0.0
+0.0
+0.0
+17.88
+0.0
+0.0
+0.0
+0.0
+17.88
+0.0
+0.0
+0.0
+0.0
+17.88
+666
+true
+
+true
+false
+
+13.31
+44.11
+44.22
+44.33
+44.44
+33.11
+33.22
+33.33
+17.88
+0.0
+0.0
+0.0
+0.0
+17.88
+0.0
+0.0
+0.0
+333.333
+17.88
+0.0
+0.0
+0.0
+0.0
+17.88
+666
+true
+
+false
+true
+
+
+$ /*
+$ --------------------------------------------------------------------------------------------------
+$ Test logical operators.
+$ */
+
+$program LOGICAL OPERATOR TEST
+
+$attrib gl_Vertex
+0.0 0.0 0.0 1.0
+
+$attrib _False
+0.0 0.0 0.0 0.0
+
+$attrib _True
+1.0 0.0 0.0 0.0
+
+$attrib _False2
+0.0 0.0 0.0 0.0
+
+$attrib _True2
+1.0 0.0 0.0 0.0
+
+$vertex
+
+$code
+
+attribute float _False;
+attribute float _True;
+attribute float _False2;
+attribute float _True2;
+
+void main () {
+   gl_Position = gl_ModelViewMatrix * gl_Vertex;
+   gl_FrontColor = vec4 (1.0);
+
+   printMESA (_False);
+   printMESA (_True);
+   printMESA (_False2);
+   printMESA (_True2);
+
+   bool False = bool (_False);
+   bool True = bool (_True);
+   bool False2 = bool (_False2);
+   bool True2 = bool (_True2);
+
+   //
+   // It is important to test each operator with the following argument types:
+   // * Both arguments are different variables, even if they have the same values.
+   //   False and False2 are distinct attributes, but are the same in value.
+   // * Both arguments may be the same variables. This case tests possible
+   //   optimizations, e.g. X && X --> X.
+   // * Both arguments are constant. This tests constant folding.
+   //
+
+   printMESA (!False);
+   printMESA (!True);
+   printMESA (!false);
+   printMESA (!true);
+
+   printMESA (False ^^ False2);
+   printMESA (False ^^ True2);
+   printMESA (True ^^ False2);
+   printMESA (True ^^ True2);
+   printMESA (False ^^ False);
+   printMESA (False ^^ True);
+   printMESA (True ^^ False);
+   printMESA (True ^^ True);
+   printMESA (false ^^ false);
+   printMESA (false ^^ true);
+   printMESA (true ^^ false);
+   printMESA (true ^^ true);
+
+   printMESA (False && False2);
+   printMESA (False && True2);
+   printMESA (True && False2);
+   printMESA (True && True2);
+   printMESA (False && False);
+   printMESA (False && True);
+   printMESA (True && False);
+   printMESA (True && True);
+   printMESA (false && false);
+   printMESA (false && true);
+   printMESA (true && false);
+   printMESA (true && true);
+
+   printMESA (False || False2);
+   printMESA (False || True2);
+   printMESA (True || False2);
+   printMESA (True || True2);
+   printMESA (False || False);
+   printMESA (False || True);
+   printMESA (True || False);
+   printMESA (True || True);
+   printMESA (false || false);
+   printMESA (false || true);
+   printMESA (true || false);
+   printMESA (true || true);
+
+   //
+   // Test short-circuit evaluation of && and ||. The right expression evaluation depends
+   // on the value of the left expression. If the right expression has side effects, we
+   // can easily test if it happened.
+   //
+
+   bool x;
+
+   x = false;
+   printMESA (x);
+   printMESA (False && (x = true));
+   printMESA (x);
+
+   x = false;
+   printMESA (x);
+   printMESA (false && (x = true));
+   printMESA (x);
+
+   x = true;
+   printMESA (x);
+   printMESA (True || (x = false));
+   printMESA (x);
+
+   x = true;
+   printMESA (x);
+   printMESA (true || (x = false));
+   printMESA (x);
+}
+
+$output
+
+0.0
+1.0
+0.0
+1.0
+
+true
+false
+true
+false
+
+false
+true
+true
+false
+false
+true
+true
+false
+false
+true
+true
+false
+
+false
+false
+false
+true
+false
+false
+false
+true
+false
+false
+false
+true
+
+false
+true
+true
+true
+false
+true
+true
+true
+false
+true
+true
+true
+
+false
+false
+false
+
+false
+false
+false
+
+true
+true
+true
+
+true
+true
+true
+
+
+$ /*
+$ --------------------------------------------------------------------------------------------------
+$ Test subscript operator/array access.
+$ */
+
+$program ARRAY ACCESS TEST
+
+$attrib gl_Vertex
+0.0 0.0 0.0 1.0
+
+$attrib _Zero
+0.0 0.0 0.0 0.0
+
+$attrib _One
+1.1 0.0 0.0 0.0
+
+$attrib _Two
+2.9 0.0 0.0 0.0
+
+$attrib _Vec
+11.11 22.22 33.33 44.44
+
+$vertex
+
+$code
+
+attribute float _Zero;
+attribute float _One;
+attribute float _Two;
+attribute vec4 _Vec;
+
+void main () {
+   gl_Position = gl_ModelViewMatrix * gl_Vertex;
+   gl_FrontColor = vec4 (1.0);
+
+   printMESA (_Zero);
+   printMESA (_One);
+   printMESA (_Two);
+   printMESA (_Vec);
+
+   printMESA (_Vec[0]);
+   printMESA (_Vec[1]);
+   printMESA (_Vec[2]);
+   printMESA (_Vec[3]);
+
+   printMESA (_Vec[int (_Zero)]);
+   printMESA (_Vec[int (_One)]);
+   printMESA (_Vec[int (_Two)]);
+}
+
+$output
+
+0.0
+1.1
+2.9
+11.11
+22.22
+33.33
+44.44
+
+11.11
+22.22
+33.33
+44.44
+
+11.11
+22.22
+33.33
+
+
+$ /*
+$ --------------------------------------------------------------------------------------------------
+$ Test pre/post-increment/decrement operators.
+$ Note: assumes relational operators being correct.
+$ */
+
+$program PRE/POST-INC/DEC OPERATOR TEST
+
+$attrib gl_Vertex
+0.0 0.0 0.0 1.0
+
+$attrib _Zero
+0.0 0.0 0.0 0.0
+
+$attrib _One
+1.1 0.0 0.0 0.0
+
+$attrib _Two4
+2.1 2.2 2.3 2.4
+
+$vertex
+
+$code
+
+attribute float _Zero;
+attribute float _One;
+attribute vec4 _Two4;
+
+float fZero, fOne;
+vec4 fTwo4;
+int iZero, iOne;
+ivec4 iTwo4;
+
+void reset () {
+   fZero = _Zero;
+   fOne = _One;
+   fTwo4 = _Two4;
+   iZero = int (_Zero);
+   iOne = int (_One);
+   iTwo4 = ivec4 (_Two4);
+}
+
+void main () {
+   gl_Position = gl_ModelViewMatrix * gl_Vertex;
+   gl_FrontColor = vec4 (1.0);
+
+   printMESA (_Zero);
+   printMESA (_One);
+   printMESA (_Two4);
+
+   // pre-increment
+   reset ();
+   printMESA (++fZero);
+   printMESA (++fOne);
+   printMESA (++iZero);
+   printMESA (++iOne);
+   printMESA (fZero);
+   printMESA (fOne);
+   printMESA (iZero);
+   printMESA (iOne);
+   printMESA (++fTwo4 == _Two4 + 1.0);
+   printMESA (++iTwo4 == ivec4 (_Two4) + 1);
+
+   // pre-decrement
+   reset ();
+   printMESA (--fZero);
+   printMESA (--fOne);
+   printMESA (--iZero);
+   printMESA (--iOne);
+   printMESA (fZero);
+   printMESA (fOne);
+   printMESA (iZero);
+   printMESA (iOne);
+   printMESA (--fTwo4 == _Two4 - 1.0);
+   printMESA (--iTwo4 == ivec4 (_Two4) - 1);
+
+   // post-increment
+   reset ();
+   printMESA (fZero++);
+   printMESA (fOne++);
+   printMESA (iZero++);
+   printMESA (iOne++);
+   printMESA (fZero);
+   printMESA (fOne);
+   printMESA (iZero);
+   printMESA (iOne);
+   printMESA (fTwo4++ == _Two4);
+   printMESA (iTwo4++ == ivec4 (_Two4));
+
+   // post-decrement
+   reset ();
+   printMESA (fZero--);
+   printMESA (fOne--);
+   printMESA (iZero--);
+   printMESA (iOne--);
+   printMESA (fZero);
+   printMESA (fOne);
+   printMESA (iZero);
+   printMESA (iOne);
+   printMESA (fTwo4-- == _Two4);
+   printMESA (iTwo4-- == ivec4 (_Two4));
+}
+
+$output
+
+0.0
+1.1
+2.1
+2.2
+2.3
+2.4
+
+1.0
+2.1
+1
+2
+1.0
+2.1
+1
+2
+true
+true
+
+-1.0
+0.1
+-1
+0
+-1.0
+0.1
+-1
+0
+true
+true
+
+0.0
+1.1
+0
+1
+1.0
+2.1
+1
+2
+true
+true
+
+0.0
+1.1
+0
+1
+-1.0
+0.1
+-1
+0
+true
+true
+
+
+$ /*
+$ --------------------------------------------------------------------------------------------------
+$ Test arithmetical operators.
+$ */
+
+$program ARITHMETICAL OPERATOR TEST
+
+$attrib gl_Vertex
+0.0 0.0 0.0 1.0
+
+$attrib _Zero
+0.0 0.0 0.0 0.0
+
+$attrib _One
+1.1 0.0 0.0 0.0
+
+$attrib _Two4
+2.1 2.2 2.3 2.4
+
+$vertex
+
+$code
+
+attribute float _Zero;
+attribute float _One;
+attribute vec4 _Two4;
+
+void main () {
+   gl_Position = gl_ModelViewMatrix * gl_Vertex;
+   gl_FrontColor = vec4 (1.0);
+
+   printMESA (_Zero);
+   printMESA (_One);
+   printMESA (_Two4);
+
+   int iZero = int (_Zero);
+   int iOne = int (_One);
+   ivec4 iTwo4 = ivec4 (_Two4);
+
+   printMESA (-_Zero);
+   printMESA (-_One);
+   printMESA (-_Two4);
+   printMESA (-_Two4.z);
+
+   printMESA (_Zero + 0.0);
+   printMESA (_One + 0.0);
+   printMESA (_Two4 + 0.0);
+   printMESA (_Two4.y + 0.0);
+
+   printMESA (_Zero + _Zero);
+   printMESA (_Zero + _One);
+   printMESA (_Zero + _Two4);
+   printMESA (_One + _Zero);
+   printMESA (_One + _Two4);
+   printMESA (_Two4 + _Two4);
+
+   printMESA (_Zero - 0.0);
+   printMESA (_One - 0.0);
+   printMESA (_Two4 - 0.0);
+   printMESA (_Two4.y - 0.0);
+
+   printMESA (_Zero - _Zero);
+   printMESA (_Zero - _One);
+   printMESA (_Zero - _Two4);
+   printMESA (_One - _Zero);
+   printMESA (_One - _Two4);
+   printMESA (_Two4 - _Two4);
+
+   printMESA (_Zero * 1.0);
+   printMESA (_One * 1.0);
+   printMESA (_Two4 * 1.0);
+   printMESA (_Two4.x * 1.0);
+
+   printMESA (_Zero * _Zero);
+   printMESA (_Zero * _One);
+   printMESA (_Zero * _Two4);
+   printMESA (_One * _Zero);
+   printMESA (_One * _One);
+   printMESA (_One * _Two4);
+   printMESA (_Two4 * _Two4);
+
+   printMESA (_Zero / 1.0);
+   printMESA (_One / 1.0);
+   printMESA (_Two4 / 1.0);
+   printMESA (_Two4.x / 1.0);
+
+   printMESA (_Zero / _One);
+   printMESA (_Zero / _Two4);
+   printMESA (_One / _One);
+   printMESA (_One / _Two4);
+   printMESA (_Two4 / _Two4);
+}
+
+$output
+
+0.0
+1.1
+2.1
+2.2
+2.3
+2.4
+
+0.0
+-1.1
+-2.1
+-2.2
+-2.3
+-2.4
+-2.3
+
+0.0
+1.1
+2.1
+2.2
+2.3
+2.4
+2.2
+
+0.0
+1.1
+2.1
+2.2
+2.3
+2.4
+1.1
+3.2
+3.3
+3.4
+3.5
+4.2
+4.4
+4.6
+4.8
+
+0.0
+1.1
+2.1
+2.2
+2.3
+2.4
+2.2
+
+0.0
+-1.1
+-2.1
+-2.2
+-2.3
+-2.4
+1.1
+-1.0
+-1.1
+-1.2
+-1.3
+0.0
+0.0
+0.0
+0.0
+
+0.0
+1.1
+2.1
+2.2
+2.3
+2.4
+2.1
+
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+0.0
+1.21
+2.31
+2.42
+2.53
+2.64
+4.41
+4.84
+5.29
+5.76
+
+0.0
+1.1
+2.1
+2.2
+2.3
+2.4
+2.1
+
+0.0
+0.0
+0.0
+0.0
+0.0
+1.0
+0.52381
+0.5
+0.47826
+0.45833
+1.0
+1.0
+1.0
+1.0
+
+
+$ /*
+$ --------------------------------------------------------------------------------------------------
+$ Test matrix operations.
+$ Note: assumes relational operators being correct.
+$ */
+
+$program MATRIX TEST
+
+$attrib gl_Vertex
+0.0 0.0 0.0 1.0
+
+$attrib _Zero
+0.0 0.0 0.0 0.0
+
+$attrib _One
+1.0 1.0 1.0 1.0
+
+$attrib _Two
+2.0 2.0 2.0 2.0
+
+$vertex
+
+$code
+
+attribute vec4 _Zero;
+attribute vec4 _One;
+attribute vec4 _Two;
+
+void main () {
+   gl_Position = gl_ModelViewMatrix * gl_Vertex;
+   gl_FrontColor = vec4 (1.0);
+
+   printMESA (_Zero);
+   printMESA (_One);
+   printMESA (_Two);
+
+   mat4 Identity = mat4 (_One.x);
+
+   printMESA (Identity == mat4 (1.0, 0.0, 0.0, 0.0,
+                                0.0, 1.0, 0.0, 0.0,
+                                0.0, 0.0, 1.0, 0.0,
+                                0.0, 0.0, 0.0, 1.0));
+   printMESA (Identity * _Two == _Two);
+
+   mat4 Matrix = mat4 (1.1, 1.2, 1.3, 1.4,
+                       2.1, 2.2, 2.3, 2.4,
+                       3.1, 3.2, 3.3, 3.4,
+                       4.1, 4.2, 4.3, 4.4);
+
+   printMESA (Matrix[2].y);
+   printMESA (Matrix[1]);
+}
+
+$output
+
+0.0
+0.0
+0.0
+0.0
+1.0
+1.0
+1.0
+1.0
+2.0
+2.0
+2.0
+2.0
+true
+true
+3.2
+2.1
+2.2
+2.3
+2.4
+
index 80ee37f637fbe927bf81bb1821828a29e093af11..692cef9c8cb523060b63283e196acc602afae973 100644 (file)
@@ -3,8 +3,10 @@
 /*
  * GL_ARB_multitexture
  */
+#ifndef GL_ARB_multitexture
 PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
 PFNGLMULTITEXCOORD4FVARBPROC glMultiTexCoord4fvARB;
+#endif
 
 /*
  * GL_ARB_shader_objects
@@ -65,8 +67,10 @@ void InitFramework (int *argc, char *argv[])
    glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow (argv[0]);
 
+#ifndef GL_ARB_multitexture
    GETPROCADDR(glClientActiveTextureARB, PFNGLCLIENTACTIVETEXTUREARBPROC);
    GETPROCADDR(glMultiTexCoord4fvARB, PFNGLMULTITEXCOORD4FVARBPROC);
+#endif
 
    GETPROCADDR(glDeleteObjectARB, PFNGLDELETEOBJECTARBPROC);
    GETPROCADDR(glGetHandleARB, PFNGLGETHANDLEARBPROC);
@@ -100,9 +104,6 @@ void InitFramework (int *argc, char *argv[])
 
    InitScene ();
 
-   /*glutReshapeFunc (Reshape);
-   glutKeyboardFunc (Key);
-   glutSpecialFunc (SpecialKey);*/
    glutDisplayFunc (Display);
    glutIdleFunc (Idle);
    glutMainLoop ();
index fe1c4cbd3836d94b112fe7a2d2d0528a4384d183..e023f7da8a6874887bf881381da5aff304ac41a5 100644 (file)
@@ -6,9 +6,10 @@
 #include <windows.h>
 #endif
 
-#include <assert.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
+#include <assert.h>
 #include <math.h>
 #include <GL/gl.h>
 #include <GL/glut.h>
 /*
  * GL_ARB_multitexture
  */
+#ifndef GL_ARB_multitexture
 extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
 extern PFNGLMULTITEXCOORD4FVARBPROC glMultiTexCoord4fvARB;
+#endif
 
 /*
  * GL_ARB_shader_objects
@@ -68,12 +71,12 @@ extern PFNGLFOGCOORDPOINTEREXTPROC glFogCoordPointerEXT;
 extern PFNGLSECONDARYCOLOR3FVEXTPROC glSecondaryColor3fvEXT;
 extern PFNGLSECONDARYCOLORPOINTEREXTPROC glSecondaryColorPointerEXT;
 
-void InitFramework (int *argc, char *argv[]);
+extern void InitFramework (int *argc, char *argv[]);
 
 extern void InitScene (void);
 extern void RenderScene (void);
 
-GLboolean CheckObjectStatus (GLhandleARB);
+extern GLboolean CheckObjectStatus (GLhandleARB);
 
 #endif
 
index 95d2ed6b83b5fbeed23830550804d679ff900ffa..e31f3b16dfb6f9fff98f4c7bca56da4d17af4750 100644 (file)
@@ -210,7 +210,7 @@ static void dl_end ()
 static void load_test_file (const char *filename)
 {
    FILE *f;
-   long size;
+   GLint size;
    char *code;
    GLint i;
 
@@ -230,7 +230,7 @@ static void load_test_file (const char *filename)
    size = fread (code, 1, size, f);
    fclose (f);
 
-   glShaderSourceARB (vert, 1, &code, &size);
+   glShaderSourceARB (vert, 1, (const GLcharARB **) (&code), &size);
    glCompileShaderARB (vert);
    if (!CheckObjectStatus (vert))
       exit (0);
index ac4fceb1c61a732f423bd765236465926795ec50..b049f4206f52f470b24699e6063f0db44bb975b4 100644 (file)
@@ -1,68 +1,68 @@
-/*\r
- * Vertex shader test.\r
- * Uses all conventional attributes and 15 generic attributes to print\r
- * their values, using printMESA() extension function, to the debugger\r
- * to compare them with the actual passed-in values.\r
- * Use different types for generic attributes to check matrix handling.\r
- *\r
- * Author: Michal Krol\r
- */\r
-\r
-#version 110\r
-\r
-//#extension MESA_shader_debug: require\r
-\r
-attribute vec4 Attribute1;\r
-attribute vec4 Attribute2;\r
-attribute vec4 Attribute3;\r
-attribute float Attribute4;\r
-attribute vec2 Attribute5;\r
-attribute vec3 Attribute6;\r
-attribute mat2 Attribute7;\r
-attribute mat3 Attribute9;\r
-attribute mat4 Attribute12;\r
-\r
-void main ()\r
-{\r
-   //\r
-   // Do some legal stuff.\r
-   //\r
-   gl_Position = gl_ModelViewMatrix * gl_Vertex;\r
-   gl_FrontColor = vec4 (1.0);\r
-\r
-   //\r
-   // Conventional attributes - except for gl_Vertex.\r
-   //\r
-   printMESA (gl_Color);\r
-   printMESA (gl_SecondaryColor);\r
-   printMESA (gl_Normal);\r
-   printMESA (gl_MultiTexCoord0);\r
-   printMESA (gl_MultiTexCoord1);\r
-   printMESA (gl_MultiTexCoord2);\r
-   printMESA (gl_MultiTexCoord3);\r
-   printMESA (gl_MultiTexCoord4);\r
-   printMESA (gl_MultiTexCoord5);\r
-   printMESA (gl_MultiTexCoord6);\r
-   printMESA (gl_MultiTexCoord7);\r
-   printMESA (gl_FogCoord);\r
-\r
-   //\r
-   // Generic attributes - attrib with index 0 is not used because it would\r
-   // alias with gl_Vertex, which is not allowed.\r
-   //\r
-   printMESA (Attribute1);\r
-   printMESA (Attribute2);\r
-   printMESA (Attribute3);\r
-   printMESA (Attribute4);\r
-   printMESA (Attribute5);\r
-   printMESA (Attribute6);\r
-   printMESA (Attribute7);\r
-   printMESA (Attribute9);\r
-   printMESA (Attribute12);\r
-\r
-   //\r
-   // Vertex position goes last.\r
-   //\r
-   printMESA (gl_Vertex);\r
-}\r
-\r
+/*
+ * Vertex shader test.
+ * Uses all conventional attributes and 15 generic attributes to print
+ * their values, using printMESA() extension function, to the debugger
+ * to compare them with the actual passed-in values.
+ * Use different types for generic attributes to check matrix handling.
+ *
+ * Author: Michal Krol
+ */
+
+#version 110
+
+//#extension MESA_shader_debug: require
+
+attribute vec4 Attribute1;
+attribute vec4 Attribute2;
+attribute vec4 Attribute3;
+attribute float Attribute4;
+attribute vec2 Attribute5;
+attribute vec3 Attribute6;
+attribute mat2 Attribute7;
+attribute mat3 Attribute9;
+attribute mat4 Attribute12;
+
+void main ()
+{
+   //
+   // Do some legal stuff.
+   //
+   gl_Position = gl_ModelViewMatrix * gl_Vertex;
+   gl_FrontColor = vec4 (1.0);
+
+   //
+   // Conventional attributes - except for gl_Vertex.
+   //
+   printMESA (gl_Color);
+   printMESA (gl_SecondaryColor);
+   printMESA (gl_Normal);
+   printMESA (gl_MultiTexCoord0);
+   printMESA (gl_MultiTexCoord1);
+   printMESA (gl_MultiTexCoord2);
+   printMESA (gl_MultiTexCoord3);
+   printMESA (gl_MultiTexCoord4);
+   printMESA (gl_MultiTexCoord5);
+   printMESA (gl_MultiTexCoord6);
+   printMESA (gl_MultiTexCoord7);
+   printMESA (gl_FogCoord);
+
+   //
+   // Generic attributes - attrib with index 0 is not used because it would
+   // alias with gl_Vertex, which is not allowed.
+   //
+   printMESA (Attribute1);
+   printMESA (Attribute2);
+   printMESA (Attribute3);
+   printMESA (Attribute4);
+   printMESA (Attribute5);
+   printMESA (Attribute6);
+   printMESA (Attribute7);
+   printMESA (Attribute9);
+   printMESA (Attribute12);
+
+   //
+   // Vertex position goes last.
+   //
+   printMESA (gl_Vertex);
+}
+