uniform float2x2 testMatrix2x2; uniform float3x3 testMatrix3x3; uniform float4 testInputs; uniform half4 colorRed, colorGreen; uniform half unknownInput; bool test_no_op_scalar_X_mat2() { float2x2 m, mm; const float2x2 z = float2x2(0.0); // Test meaningful matrix X no-op scalar. m = testMatrix2x2 * 1; m = 1 * testMatrix2x2; m *= 1; if (m != testMatrix2x2) return false; m = m / 1; m /= 1; if (m != testMatrix2x2) return false; m = m + 0; m = 0 + m; m += 0; if (m != testMatrix2x2) return false; m = m - 0; m = 0 - m; // negates m -= 0; if (m != -testMatrix2x2) return false; mm = m * 0; mm = 0 * m; return mm == z; } bool test_no_op_scalar_X_mat3() { float3x3 m, mm; const float3x3 z = float3x3(0.0); // Test meaningful matrix X no-op scalar. m = testMatrix3x3 * 1; m = 1 * testMatrix3x3; m *= 1; if (m != testMatrix3x3) return false; m = m / 1; m /= 1; if (m != testMatrix3x3) return false; m = m + 0; m = 0 + m; m += 0; if (m != testMatrix3x3) return false; m = m - 0; m = 0 - m; // negates m -= 0; if (m != -testMatrix3x3) return false; mm = m * 0; mm = 0 * m; return mm == z; } bool test_no_op_scalar_X_mat4() { float4x4 testMatrix4x4 = float4x4(testInputs, testInputs, testInputs, testInputs); float4x4 m, mm; const float4x4 z = float4x4(0.0); // Test meaningful matrix X no-op scalar. m = testMatrix4x4 * 1; m = 1 * testMatrix4x4; m *= 1; if (m != testMatrix4x4) return false; m = m / 1; m /= 1; if (m != testMatrix4x4) return false; m = m + 0; m = 0 + m; m += 0; if (m != testMatrix4x4) return false; m = m - 0; m = 0 - m; // negates m -= 0; if (m != -testMatrix4x4) return false; mm = m * 0; mm = 0 * m; return mm == z; } bool test_no_op_mat2_X_scalar() { float2x2 m, mm; const float2x2 i = float2x2(1.0); const float2x2 z = float2x2(0.0); const float2x2 s = float2x2(float4(1.0)); float scalar = testInputs.x; // These operations can be optimized, because multiplying a scalar across an identity matrix // is conceptually the same as passing a scalar into the diagonal-matrix constructor. m = scalar * i; m = i * scalar; if (m != float2x2(scalar)) return false; // These operations are left alone, as they splat the scalar across the matrix. m = scalar / s; if (m != float2x2(scalar, scalar, scalar, scalar)) return false; m = scalar + z; m = z + scalar; if (m != float2x2(scalar, scalar, scalar, scalar)) return false; m = scalar - z; m = z - scalar; // splats `-scalar` across the matrix if (m != -float2x2(scalar, scalar, scalar, scalar)) return false; mm = scalar * z; mm = z * scalar; return mm == z; } bool test_no_op_mat3_X_scalar() { float3x3 m, mm; const float3x3 i = float3x3(1.0); const float3x3 z = float3x3(0.0); const float3x3 s = float3x3(float3(1.0), float3(1.0), float3(1.0)); float scalar = testInputs.x; float3 scalar3 = scalar.xxx; // These operations can be optimized, because multiplying a scalar across an identity matrix // is conceptually the same as passing a scalar into the diagonal-matrix constructor. m = scalar * i; m = i * scalar; if (m != float3x3(scalar)) return false; // These operations are left alone, as they splat the scalar across the matrix. m = scalar / s; if (m != float3x3(scalar3, scalar3, scalar3)) return false; m = scalar + z; m = z + scalar; if (m != float3x3(scalar3, scalar3, scalar3)) return false; m = scalar - z; m = z - scalar; // splats `-scalar` across the matrix if (m != -float3x3(scalar3, scalar3, scalar3)) return false; mm = scalar * z; mm = z * scalar; return mm == z; } bool test_no_op_mat4_X_scalar() { float4x4 m, mm; const float4x4 i = float4x4(1.0); const float4x4 z = float4x4(0.0); const float4x4 s = float4x4(float4(1.0), float4(1.0), float4(1.0), float4(1.0)); float scalar = testInputs.x; float4 scalar4 = scalar.xxxx; // These operations can be optimized, because multiplying a scalar across an identity matrix // is conceptually the same as passing a scalar into the diagonal-matrix constructor. m = scalar * i; m = i * scalar; if (m != float4x4(scalar)) return false; // These operations are left alone, as they splat the scalar across the matrix. m = scalar / s; if (m != float4x4(scalar4, scalar4, scalar4, scalar4)) return false; m = scalar + z; m = z + scalar; if (m != float4x4(scalar4, scalar4, scalar4, scalar4)) return false; m = scalar - z; m = z - scalar; // splats `-scalar` across the matrix if (m != -float4x4(scalar4, scalar4, scalar4, scalar4)) return false; mm = scalar * z; mm = z * scalar; return mm == z; } half4 main(float2 coords) { return test_no_op_scalar_X_mat2() && test_no_op_scalar_X_mat3() && test_no_op_scalar_X_mat4() && test_no_op_mat2_X_scalar() && test_no_op_mat3_X_scalar() && test_no_op_mat4_X_scalar() ? colorGreen : colorRed; }