1616 lines
21 KiB
Plaintext
1616 lines
21 KiB
Plaintext
$ /*
|
|
$ 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
|
|
|
|
#version 110
|
|
|
|
#extension MESA_shader_debug: require
|
|
|
|
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
|
|
|
|
#version 110
|
|
|
|
#extension MESA_shader_debug: require
|
|
|
|
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
|
|
|
|
#version 110
|
|
|
|
#extension MESA_shader_debug: require
|
|
|
|
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
|
|
|
|
#version 110
|
|
|
|
#extension MESA_shader_debug: require
|
|
|
|
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
|
|
|
|
#version 110
|
|
|
|
#extension MESA_shader_debug: require
|
|
|
|
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
|
|
|
|
#version 110
|
|
|
|
#extension MESA_shader_debug: require
|
|
|
|
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
|
|
|
|
#version 110
|
|
|
|
#extension MESA_shader_debug: require
|
|
|
|
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
|
|
|
|
#version 110
|
|
|
|
#extension MESA_shader_debug: require
|
|
|
|
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
|
|
|
|
#version 110
|
|
|
|
#extension MESA_shader_debug: require
|
|
|
|
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
|
|
|
|
|
|
$ /*
|
|
$ --------------------------------------------------------------------------------------------------
|
|
$ Test vec4 extension operations.
|
|
$ */
|
|
|
|
$program VEC4 EXTENSION OPERATIONS
|
|
|
|
$attrib gl_Vertex
|
|
0.0 0.0 0.0 1.0
|
|
|
|
$attrib _One
|
|
1.1 0.0 0.0 0.0
|
|
|
|
$attrib _Two4
|
|
2.1 2.2 2.3 2.4
|
|
|
|
$attrib _Three4
|
|
3.1 3.2 3.3 3.4
|
|
|
|
$vertex
|
|
|
|
$code
|
|
|
|
#version 110
|
|
|
|
#extension MESA_shader_debug: require
|
|
|
|
attribute float _One;
|
|
attribute vec4 _Two4;
|
|
attribute vec4 _Three4;
|
|
|
|
void main () {
|
|
gl_Position = gl_ModelViewMatrix * gl_Vertex;
|
|
gl_FrontColor = vec4 (1.0);
|
|
|
|
printMESA (_One);
|
|
printMESA (_Two4);
|
|
printMESA (_Three4);
|
|
|
|
printMESA (vec4 (_One));
|
|
|
|
printMESA (_Two4 + _Three4);
|
|
printMESA (_Two4 - _Three4);
|
|
printMESA (_Two4 * _Three4);
|
|
printMESA (_Two4 / _Three4);
|
|
|
|
printMESA (_Two4 + _One);
|
|
printMESA (_Two4 - _One);
|
|
printMESA (_Two4 * _One);
|
|
printMESA (_Two4 / _One);
|
|
|
|
printMESA (_One + _Two4);
|
|
printMESA (_One - _Two4);
|
|
printMESA (_One * _Two4);
|
|
printMESA (_One / _Two4);
|
|
|
|
printMESA (-_Three4);
|
|
|
|
printMESA (dot (_Two4.xyz, _Three4.xyz));
|
|
printMESA (dot (_Two4, _Three4));
|
|
|
|
printMESA (length (_Two4.xyz));
|
|
printMESA (length (_Three4));
|
|
|
|
printMESA (normalize (_Two4.xyz));
|
|
printMESA (normalize (_Three4));
|
|
|
|
vec4 tmp = _Two4;
|
|
printMESA (tmp);
|
|
|
|
printMESA (_Two4 == _Three4);
|
|
printMESA (_Two4 != _Three4);
|
|
printMESA (_Two4 == _Two4);
|
|
printMESA (_Three4 != _Three4);
|
|
printMESA (_Two4 != vec4 (_Two4.xyz, 999.0));
|
|
printMESA (_Two4 != vec4 (999.0, _Two4.yzw));
|
|
}
|
|
|
|
$output
|
|
|
|
1.1
|
|
2.1
|
|
2.2
|
|
2.3
|
|
2.4
|
|
3.1
|
|
3.2
|
|
3.3
|
|
3.4
|
|
|
|
1.1
|
|
1.1
|
|
1.1
|
|
1.1
|
|
|
|
5.2
|
|
5.4
|
|
5.6
|
|
5.8
|
|
-1.0
|
|
-1.0
|
|
-1.0
|
|
-1.0
|
|
6.51
|
|
7.04
|
|
7.59
|
|
8.16
|
|
0.677419
|
|
0.6875
|
|
0.69697
|
|
0.705882
|
|
|
|
3.2
|
|
3.3
|
|
3.4
|
|
3.5
|
|
1.0
|
|
1.1
|
|
1.2
|
|
1.3
|
|
2.31
|
|
2.42
|
|
2.53
|
|
2.64
|
|
1.909091
|
|
2.0
|
|
2.090909
|
|
2.181818
|
|
|
|
3.2
|
|
3.3
|
|
3.4
|
|
3.5
|
|
-1.0
|
|
-1.1
|
|
-1.2
|
|
-1.3
|
|
2.31
|
|
2.42
|
|
2.53
|
|
2.64
|
|
0.52381
|
|
0.5
|
|
0.478261
|
|
0.458333
|
|
|
|
-3.1
|
|
-3.2
|
|
-3.3
|
|
-3.4
|
|
|
|
21.14
|
|
29.3
|
|
|
|
3.813135
|
|
6.503845
|
|
|
|
0.550728
|
|
0.576953
|
|
0.603178
|
|
0.476641
|
|
0.492017
|
|
0.507392
|
|
0.522768
|
|
|
|
2.1
|
|
2.2
|
|
2.3
|
|
2.4
|
|
|
|
false
|
|
true
|
|
true
|
|
false
|
|
true
|
|
true
|