| <!DOCTYPE html> |
| <html> |
| <meta charset=utf-8> |
| <meta name="timeout" content="long"> |
| <title>Test the WHLSL test harness.</title> |
| <script src="js/test-harness.js"></script> |
| <script src="../js/webgpu-functions.js"></script> |
| <script src="../../resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| <script> |
| const whlslTests = {}; |
| |
| whlslTests.builtinMatrices = async () => { |
| let program = ` |
| float foo() |
| { |
| float2x2 a; |
| a[0][0] = 1; |
| a[0][1] = 2; |
| a[1][0] = 3; |
| a[1][1] = 4; |
| return a[0][0]; |
| } |
| float foo2() |
| { |
| float2x3 a; |
| a[0][0] = 1; |
| a[0][1] = 2; |
| a[0][2] = 3; |
| a[1][0] = 4; |
| a[1][1] = 5; |
| a[1][2] = 6; |
| return a[1][2]; |
| } |
| float foo3() |
| { |
| float2x2 a; |
| return a[0][0]; |
| } |
| bool foo4() |
| { |
| float2x2 a; |
| a[0][0] = 1; |
| a[0][1] = 2; |
| a[1][0] = 3; |
| a[1][1] = 4; |
| float2x2 b; |
| b[0][0] = 5; |
| b[0][1] = 6; |
| b[1][0] = 7; |
| b[1][1] = 8; |
| for (uint i = 0; i < 2; ++i) { |
| for (uint j = 0; j < 2; ++j) { |
| a[i][j] += 4; |
| } |
| } |
| return all(a == b); |
| } |
| bool foo5() |
| { |
| float2x2 a; |
| a[0] = float2(1, 2); |
| a[1] = float2(3, 4); |
| float2x2 b; |
| b[0][0] = 1; |
| b[0][1] = 2; |
| b[1][0] = 3; |
| b[1][1] = 4; |
| return all(a == b); |
| } |
| bool foo6() |
| { |
| float2x2 a; |
| a[0][0] = 1; |
| a[0][1] = 2; |
| a[1][0] = 3; |
| a[1][1] = 4; |
| float2x2 b; |
| b[0][0] = 5; |
| b[0][1] = 10; |
| b[1][0] = 18; |
| b[1][1] = 24; |
| a[0] *= 5; |
| a[1] *= 6; |
| return all(a == b); |
| } |
| float foo7() |
| { |
| float2x3 a = float2x3(float3(3, 4, 5), float3(6, 7, 8)); |
| return a[0][2]; |
| } |
| `; |
| assert_equals(await callFloatFunction(program, "foo", []), 1); |
| assert_equals(await callFloatFunction(program, "foo2", []), 6); |
| assert_equals(await callFloatFunction(program, "foo3", []), 0); |
| assert_equals(await callBoolFunction(program, "foo4", []), true); |
| assert_equals(await callBoolFunction(program, "foo5", []), true); |
| assert_equals(await callBoolFunction(program, "foo6", []), true); |
| assert_equals(await callFloatFunction(program, "foo7", []), 5); |
| }; |
| |
| whlslTests.matrixMultiplication = async () => { |
| let program = ` |
| float2x4 multiply(float2x3 x, float3x4 y) { |
| // Copied and pasted from the standard library |
| float2x4 result; |
| result[0][0] = 0; |
| result[0][0] += x[0][0] * y[0][0]; |
| result[0][0] += x[0][1] * y[1][0]; |
| result[0][0] += x[0][2] * y[2][0]; |
| result[0][1] = 0; |
| result[0][1] += x[0][0] * y[0][1]; |
| result[0][1] += x[0][1] * y[1][1]; |
| result[0][1] += x[0][2] * y[2][1]; |
| result[0][2] = 0; |
| result[0][2] += x[0][0] * y[0][2]; |
| result[0][2] += x[0][1] * y[1][2]; |
| result[0][2] += x[0][2] * y[2][2]; |
| result[0][3] = 0; |
| result[0][3] += x[0][0] * y[0][3]; |
| result[0][3] += x[0][1] * y[1][3]; |
| result[0][3] += x[0][2] * y[2][3]; |
| result[1][0] = 0; |
| result[1][0] += x[1][0] * y[0][0]; |
| result[1][0] += x[1][1] * y[1][0]; |
| result[1][0] += x[1][2] * y[2][0]; |
| result[1][1] = 0; |
| result[1][1] += x[1][0] * y[0][1]; |
| result[1][1] += x[1][1] * y[1][1]; |
| result[1][1] += x[1][2] * y[2][1]; |
| result[1][2] = 0; |
| result[1][2] += x[1][0] * y[0][2]; |
| result[1][2] += x[1][1] * y[1][2]; |
| result[1][2] += x[1][2] * y[2][2]; |
| result[1][3] = 0; |
| result[1][3] += x[1][0] * y[0][3]; |
| result[1][3] += x[1][1] * y[1][3]; |
| result[1][3] += x[1][2] * y[2][3]; |
| return result; |
| } |
| float2x3 matrix1() { |
| float2x3 x; |
| x[0][0] = 2; |
| x[0][1] = 3; |
| x[0][2] = 5; |
| x[1][0] = 7; |
| x[1][1] = 11; |
| x[1][2] = 13; |
| return x; |
| } |
| float3x4 matrix2() { |
| float3x4 y; |
| y[0][0] = 17; |
| y[0][1] = 19; |
| y[0][2] = 23; |
| y[0][3] = 29; |
| y[1][0] = 31; |
| y[1][1] = 37; |
| y[1][2] = 41; |
| y[1][3] = 43; |
| y[2][0] = 47; |
| y[2][1] = 53; |
| y[2][2] = 59; |
| y[2][3] = 61; |
| return y; |
| } |
| float foo00() { |
| return multiply(matrix1(), matrix2())[0][0]; |
| } |
| float foo01() { |
| return multiply(matrix1(), matrix2())[0][1]; |
| } |
| float foo02() { |
| return multiply(matrix1(), matrix2())[0][2]; |
| } |
| float foo03() { |
| return multiply(matrix1(), matrix2())[0][3]; |
| } |
| float foo10() { |
| return multiply(matrix1(), matrix2())[1][0]; |
| } |
| float foo11() { |
| return multiply(matrix1(), matrix2())[1][1]; |
| } |
| float foo12() { |
| return multiply(matrix1(), matrix2())[1][2]; |
| } |
| float foo13() { |
| return multiply(matrix1(), matrix2())[1][3]; |
| } |
| `; |
| assert_equals(await callFloatFunction(program, "foo00", []), 17 * 2 + 31 * 3 + 47 * 5); |
| assert_equals(await callFloatFunction(program, "foo01", []), 19 * 2 + 37 * 3 + 53 * 5); |
| assert_equals(await callFloatFunction(program, "foo02", []), 23 * 2 + 41 * 3 + 59 * 5); |
| assert_equals(await callFloatFunction(program, "foo03", []), 29 * 2 + 43 * 3 + 61 * 5); |
| assert_equals(await callFloatFunction(program, "foo10", []), 17 * 7 + 31 * 11 + 47 * 13); |
| assert_equals(await callFloatFunction(program, "foo11", []), 19 * 7 + 37 * 11 + 53 * 13); |
| assert_equals(await callFloatFunction(program, "foo12", []), 23 * 7 + 41 * 11 + 59 * 13); |
| assert_equals(await callFloatFunction(program, "foo13", []), 29 * 7 + 43 * 11 + 61 * 13); |
| }; |
| |
| runTests(whlslTests); |
| </script> |
| </html> |