<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[235493] trunk/Tools</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/235493">235493</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2018-08-29 18:50:21 -0700 (Wed, 29 Aug 2018)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WHLSL] Test row-majorness of matrices
https://bugs.webkit.org/show_bug.cgi?id=189101

The matrix multiplication functions are temporarily commented out of the standard library,
so I've temporarily copy/pasted them into the test. Matrix multiplication is not
commutative, so it requires the right indexing order.

Reviewed by Dean Jackson and Thomas Denney.

* WebGPUShadingLanguageRI/Intrinsics.js:
* WebGPUShadingLanguageRI/StandardLibrary.js:
(let.standardLibrary):
* WebGPUShadingLanguageRI/Test.js:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsWebGPUShadingLanguageRIIntrinsicsjs">trunk/Tools/WebGPUShadingLanguageRI/Intrinsics.js</a></li>
<li><a href="#trunkToolsWebGPUShadingLanguageRIStandardLibraryjs">trunk/Tools/WebGPUShadingLanguageRI/StandardLibrary.js</a></li>
<li><a href="#trunkToolsWebGPUShadingLanguageRITestjs">trunk/Tools/WebGPUShadingLanguageRI/Test.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (235492 => 235493)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog    2018-08-30 01:22:40 UTC (rev 235492)
+++ trunk/Tools/ChangeLog       2018-08-30 01:50:21 UTC (rev 235493)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2018-08-29  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [WHLSL] Test row-majorness of matrices
+        https://bugs.webkit.org/show_bug.cgi?id=189101
+
+        The matrix multiplication functions are temporarily commented out of the standard library,
+        so I've temporarily copy/pasted them into the test. Matrix multiplication is not
+        commutative, so it requires the right indexing order.
+
+        Reviewed by Dean Jackson and Thomas Denney.
+
+        * WebGPUShadingLanguageRI/Intrinsics.js:
+        * WebGPUShadingLanguageRI/StandardLibrary.js:
+        (let.standardLibrary):
+        * WebGPUShadingLanguageRI/Test.js:
+
</ins><span class="cx"> 2018-08-29  Jer Noble  <jer.noble@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Unreviewed test gardening; NowPlayingTest API tests require High Sierra.
</span></span></pre></div>
<a id="trunkToolsWebGPUShadingLanguageRIIntrinsicsjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebGPUShadingLanguageRI/Intrinsics.js (235492 => 235493)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebGPUShadingLanguageRI/Intrinsics.js        2018-08-30 01:22:40 UTC (rev 235492)
+++ trunk/Tools/WebGPUShadingLanguageRI/Intrinsics.js   2018-08-30 01:50:21 UTC (rev 235493)
</span><span class="lines">@@ -316,11 +316,11 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        for (let type of ["half", "float"]) {
</del><ins>+        for (let typeName of ["half", "float"]) {
</ins><span class="cx">             for (let height = 2; height <= 4; ++height) {
</span><span class="cx">                 for (let width = 2; width <= 4; ++width) {
</span><del>-                    this._map.set(`native typedef matrix<${type}, ${height}, ${width}>`, type => {
-                        this[`matrix<${type}, ${height}, ${width}>`] = type;
</del><ins>+                    this._map.set(`native typedef matrix<${typeName}, ${height}, ${width}>`, type => {
+                        this[`matrix<${typeName}, ${height}, ${width}>`] = type;
</ins><span class="cx">                     });
</span><span class="cx">                 }
</span><span class="cx">             }
</span></span></pre></div>
<a id="trunkToolsWebGPUShadingLanguageRIStandardLibraryjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebGPUShadingLanguageRI/StandardLibrary.js (235492 => 235493)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebGPUShadingLanguageRI/StandardLibrary.js   2018-08-30 01:22:40 UTC (rev 235492)
+++ trunk/Tools/WebGPUShadingLanguageRI/StandardLibrary.js      2018-08-30 01:50:21 UTC (rev 235493)
</span><span class="lines">@@ -1876,9 +1876,9 @@
</span><span class="cx">                         print(`    ${type}${i}x${k} result;`);
</span><span class="cx">                         for (var p = 0; p < i; ++p) {
</span><span class="cx">                             for (var r = 0; r < k; ++r) {
</span><del>-                                print(`    result[${p}][${k}] = 0;`);
</del><ins>+                                print(`    result[${p}][${r}] = 0;`);
</ins><span class="cx">                                 for (var q = 0; q < j; ++q) {
</span><del>-                                    print(`    result[${p}][${k}] += x[${p}][${q}] * y[${q}][${r}];`);
</del><ins>+                                    print(`    result[${p}][${r}] += x[${p}][${q}] * y[${q}][${r}];`);
</ins><span class="cx">                                 }
</span><span class="cx">                             }
</span><span class="cx">                         }
</span></span></pre></div>
<a id="trunkToolsWebGPUShadingLanguageRITestjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebGPUShadingLanguageRI/Test.js (235492 => 235493)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebGPUShadingLanguageRI/Test.js      2018-08-30 01:22:40 UTC (rev 235492)
+++ trunk/Tools/WebGPUShadingLanguageRI/Test.js 2018-08-30 01:50:21 UTC (rev 235493)
</span><span class="lines">@@ -5451,6 +5451,106 @@
</span><span class="cx">     checkHalf(program, callFunction(program, "foo", [makeHalf(program, 7), makeHalf(program, -2)]), -3.5);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+tests.matrixMultiplication = function() {
+    let program = doPrep(`
+        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];
+        }
+    `);
+    checkFloat(program, callFunction(program, "foo00", []), 17 * 2 + 31 * 3 + 47 * 5);
+    checkFloat(program, callFunction(program, "foo01", []), 19 * 2 + 37 * 3 + 53 * 5);
+    checkFloat(program, callFunction(program, "foo02", []), 23 * 2 + 41 * 3 + 59 * 5);
+    checkFloat(program, callFunction(program, "foo03", []), 29 * 2 + 43 * 3 + 61 * 5);
+    checkFloat(program, callFunction(program, "foo10", []), 17 * 7 + 31 * 11 + 47 * 13);
+    checkFloat(program, callFunction(program, "foo11", []), 19 * 7 + 37 * 11 + 53 * 13);
+    checkFloat(program, callFunction(program, "foo12", []), 23 * 7 + 41 * 11 + 59 * 13);
+    checkFloat(program, callFunction(program, "foo13", []), 29 * 7 + 43 * 11 + 61 * 13);
+}
+
</ins><span class="cx"> okToTest = true;
</span><span class="cx"> 
</span><span class="cx"> let testFilter = /.*/; // run everything by default
</span></span></pre>
</div>
</div>

</body>
</html>