163 lines
4.3 KiB
Plaintext
163 lines
4.3 KiB
Plaintext
|
|
uniform float2x2 testMatrix2x2;
|
||
|
|
uniform float3x3 testMatrix3x3;
|
||
|
|
uniform float4 testInputs;
|
||
|
|
uniform half4 colorRed, colorGreen;
|
||
|
|
uniform half unknownInput;
|
||
|
|
|
||
|
|
bool test_no_op_mat2_X_vec2() {
|
||
|
|
const float2x2 i = float2x2(1.0);
|
||
|
|
const float2x2 z = float2x2(0.0);
|
||
|
|
const float2x2 n = float2x2(-1.0);
|
||
|
|
|
||
|
|
float2 v, vv;
|
||
|
|
v = testInputs.xy * i;
|
||
|
|
v = i * testInputs.xy;
|
||
|
|
if (v != testInputs.xy) return false;
|
||
|
|
|
||
|
|
v = v * i;
|
||
|
|
v = i * v;
|
||
|
|
v *= i;
|
||
|
|
if (v != testInputs.xy) return false;
|
||
|
|
|
||
|
|
v = testInputs.xy * n;
|
||
|
|
v = n * testInputs.xy;
|
||
|
|
if (v != -testInputs.xy) return false;
|
||
|
|
|
||
|
|
vv = v * z;
|
||
|
|
vv = z * v;
|
||
|
|
return vv == z[0];
|
||
|
|
}
|
||
|
|
|
||
|
|
bool test_no_op_mat3_X_vec3() {
|
||
|
|
const float3x3 i = float3x3(1.0);
|
||
|
|
const float3x3 z = float3x3(0.0);
|
||
|
|
const float3x3 n = float3x3(-1.0);
|
||
|
|
|
||
|
|
float3 v, vv;
|
||
|
|
v = testInputs.xyz * i;
|
||
|
|
v = i * testInputs.xyz;
|
||
|
|
if (v != testInputs.xyz) return false;
|
||
|
|
|
||
|
|
v = v * i;
|
||
|
|
v = i * v;
|
||
|
|
v *= i;
|
||
|
|
if (v != testInputs.xyz) return false;
|
||
|
|
|
||
|
|
v = testInputs.xyz * n;
|
||
|
|
v = n * testInputs.xyz;
|
||
|
|
if (v != -testInputs.xyz) return false;
|
||
|
|
|
||
|
|
vv = v * z;
|
||
|
|
vv = z * v;
|
||
|
|
return vv == z[0];
|
||
|
|
}
|
||
|
|
|
||
|
|
bool test_no_op_mat4_X_vec4() {
|
||
|
|
const float4x4 i = float4x4(1.0);
|
||
|
|
const float4x4 z = float4x4(0.0);
|
||
|
|
const float4x4 n = float4x4(-1.0);
|
||
|
|
|
||
|
|
float4 v, vv;
|
||
|
|
v = testInputs * i;
|
||
|
|
v = i * testInputs;
|
||
|
|
if (v != testInputs) return false;
|
||
|
|
|
||
|
|
v = v * i;
|
||
|
|
v = i * v;
|
||
|
|
v *= i;
|
||
|
|
if (v != testInputs) return false;
|
||
|
|
|
||
|
|
v = testInputs * n;
|
||
|
|
v = n * testInputs;
|
||
|
|
if (v != -testInputs) return false;
|
||
|
|
|
||
|
|
vv = v * z;
|
||
|
|
vv = z * v;
|
||
|
|
return vv == z[0];
|
||
|
|
}
|
||
|
|
|
||
|
|
bool test_no_op_vec2_X_mat2() {
|
||
|
|
const float2 n = float2(-1.0);
|
||
|
|
const float2 i = float2(1.0);
|
||
|
|
const float2 z = float2(0.0);
|
||
|
|
|
||
|
|
// These operations can be optimized; multiplying a zero vector across any matrix always results
|
||
|
|
// in a zero vector.
|
||
|
|
float2 v, vv;
|
||
|
|
vv = z * testMatrix2x2;
|
||
|
|
vv = testMatrix2x2 * z;
|
||
|
|
if (vv != z) return false;
|
||
|
|
|
||
|
|
// These operations can't be simplified; they do real work.
|
||
|
|
v = i * testMatrix2x2;
|
||
|
|
if (v != float2(3, 7)) return false;
|
||
|
|
v = testMatrix2x2 * i;
|
||
|
|
if (v != float2(4, 6)) return false;
|
||
|
|
|
||
|
|
v = n * testMatrix2x2;
|
||
|
|
if (v != -float2(3, 7)) return false;
|
||
|
|
v = testMatrix2x2 * n;
|
||
|
|
return v == -float2(4, 6);
|
||
|
|
}
|
||
|
|
|
||
|
|
bool test_no_op_vec3_X_mat3() {
|
||
|
|
const float3 n = float3(-1.0);
|
||
|
|
const float3 i = float3(1.0);
|
||
|
|
const float3 z = float3(0.0);
|
||
|
|
|
||
|
|
// These operations can be optimized; multiplying a zero vector across any matrix always results
|
||
|
|
// in a zero vector.
|
||
|
|
float3 v, vv;
|
||
|
|
vv = z * testMatrix3x3;
|
||
|
|
vv = testMatrix3x3 * z;
|
||
|
|
if (vv != z) return false;
|
||
|
|
|
||
|
|
// These operations can't be simplified; they do real work.
|
||
|
|
v = i * testMatrix3x3;
|
||
|
|
if (v != float3(6, 15, 24)) return false;
|
||
|
|
v = testMatrix3x3 * i;
|
||
|
|
if (v != float3(12, 15, 18)) return false;
|
||
|
|
|
||
|
|
v = n * testMatrix3x3;
|
||
|
|
if (v != -float3(6, 15, 24)) return false;
|
||
|
|
v = testMatrix3x3 * n;
|
||
|
|
return v == -float3(12, 15, 18);
|
||
|
|
}
|
||
|
|
|
||
|
|
bool test_no_op_vec4_X_mat4() {
|
||
|
|
const float4 n = float4(-1.0);
|
||
|
|
const float4 i = float4(1.0);
|
||
|
|
const float4 z = float4(0.0);
|
||
|
|
float4x4 testMatrix4x4 = float4x4(testMatrix2x2[0], testMatrix2x2[1],
|
||
|
|
testMatrix2x2[0], testMatrix2x2[1],
|
||
|
|
testMatrix2x2[0], testMatrix2x2[1],
|
||
|
|
testMatrix2x2[0], testMatrix2x2[1]);
|
||
|
|
|
||
|
|
// These operations can be optimized; multiplying a zero vector across any matrix always results
|
||
|
|
// in a zero vector.
|
||
|
|
float4 v, vv;
|
||
|
|
vv = z * testMatrix4x4;
|
||
|
|
vv = testMatrix4x4 * z;
|
||
|
|
if (vv != z) return false;
|
||
|
|
|
||
|
|
// These operations can't be simplified; they do real work.
|
||
|
|
v = i * testMatrix4x4;
|
||
|
|
if (v != float4(10, 10, 10, 10)) return false;
|
||
|
|
v = testMatrix4x4 * i;
|
||
|
|
if (v != float4(4, 8, 12, 16)) return false;
|
||
|
|
|
||
|
|
v = n * testMatrix4x4;
|
||
|
|
if (v != -float4(10, 10, 10, 10)) return false;
|
||
|
|
v = testMatrix4x4 * n;
|
||
|
|
return v == -float4(4, 8, 12, 16);
|
||
|
|
}
|
||
|
|
|
||
|
|
half4 main(float2 coords) {
|
||
|
|
return test_no_op_mat2_X_vec2() &&
|
||
|
|
test_no_op_mat3_X_vec3() &&
|
||
|
|
test_no_op_mat4_X_vec4() &&
|
||
|
|
test_no_op_vec2_X_mat2() &&
|
||
|
|
test_no_op_vec3_X_mat3() &&
|
||
|
|
test_no_op_vec4_X_mat4() ? colorGreen : colorRed;
|
||
|
|
}
|