[WHLSL] Allow uniform buffers to be used in the interpreter
[WebKit-https.git] / Tools / WebGPUShadingLanguageRI / StandardLibrary.js
index fea56ec..4624e6d 100644 (file)
@@ -35,7 +35,7 @@ let standardLibrary = (function() {
     (function() {
         print(`// This was autogenerated from Generate_Standard_Library.swift! Do not edit!!`);
         print();
-        
+
         for (let type of [`void`, `bool`, `uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`, `atomic_int`, `atomic_uint`]) {
             print(`native typedef ${type};`);
         }
@@ -46,7 +46,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`half`, `float`]) {
             for (let i of [2, 3, 4]) {
                 for (let j of [2, 3, 4]) {
@@ -69,7 +69,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type1 of [`uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             for (let type2 of [`uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
                 if (type1 != type2) {
@@ -78,38 +78,38 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             print(`operator bool(${type} x) {`);
             print(`    return x != 0;`);
             print(`}`);
         }
         print();
-        
+
         print(`native operator int(atomic_int);`);
         print(`native operator uint(atomic_uint);`);
         print();
-        
+
         print(`native bool operator==(bool, bool);`);
-        
+
         print(`bool operator&(bool a, bool b) {`);
         print(`    return a && b;`);
         print(`}`);
-        
+
         print(`bool operator|(bool a, bool b) {`);
         print(`    return a || b;`);
         print(`}`);
-        
+
         print(`bool operator^(bool a, bool b) {`);
         print(`    if (a)`);
         print(`        return !b;`);
         print(`    return b;`);
         print(`}`);
-        
+
         print(`bool operator~(bool value) {`);
         print(`    return !value;`);
         print(`}`);
-        
+
         for (let type of [`int`, `uint`, `float`]) {
             print(`native ${type} operator+(${type}, ${type});`);
             print(`native ${type} operator-(${type}, ${type});`);
@@ -121,7 +121,7 @@ let standardLibrary = (function() {
             print(`native bool operator>(${type}, ${type});`);
             print(`native bool operator>=(${type}, ${type});`);
         }
-        
+
         for (let type of [`int`, `uint`]) {
             print(`native ${type} operator&(${type}, ${type});`);
             print(`native ${type} operator|(${type}, ${type});`);
@@ -130,7 +130,7 @@ let standardLibrary = (function() {
             print(`native ${type} operator<<(${type}, uint);`);
             print(`native ${type} operator>>(${type}, uint);`);
         }
-        
+
         for (let type of [`uchar`, `ushort`]) {
             print(`${type} operator+(${type} a, ${type} b) {`);
             print(`    return ${type}(uint(a) + uint(b));`);
@@ -184,7 +184,7 @@ let standardLibrary = (function() {
         print(`ushort operator>>(ushort a, uint b) {`);
         print(`    return ushort(uint(a) >> (b & 65535));`);
         print(`}`);
-        
+
         for (let type of [`char`, `short`]) {
             print(`${type} operator+(${type} a, ${type} b) {`);
             print(`    return ${type}(int(a) + int(b));`);
@@ -238,7 +238,7 @@ let standardLibrary = (function() {
         print(`short operator>>(short a, uint b) {`);
         print(`    return short(int(a) >> (b & 65535));`);
         print(`}`);
-        
+
         for (let type of [`uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             print(`${type} operator++(${type} value) {`);
             print(`    return value + 1;`);
@@ -247,7 +247,7 @@ let standardLibrary = (function() {
             print(`    return value - 1;`);
             print(`}`);
         }
-        
+
         print(`half operator+(half a, half b) {`);
         print(`    return half(float(a) + float(b));`);
         print(`}`);
@@ -287,7 +287,7 @@ let standardLibrary = (function() {
         print(`native int operator-(int);`);
         print(`native float operator-(float);`);
         print();
-        
+
         for (let type of [`uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             for (let size of [2, 3, 4]) {
                 print(`${type}${size} operator+(${type}${size} a, ${type}${size} b) {`);
@@ -446,7 +446,7 @@ let standardLibrary = (function() {
                 }
             }
         }
-        
+
         for (let type of [`bool`, `uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             print(`operator ${type}2(${type} x, ${type} y) {`);
             print(`    ${type}2 result;`);
@@ -542,7 +542,7 @@ let standardLibrary = (function() {
             print(`}`);
         }
         print();
-        
+
         for (let type of [`half`, `float`]) {
             let variables = [`a`, `b`, `c`, `d`];
             for (let m of [2, 3, 4]) {
@@ -566,7 +566,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`bool`, `uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             print(`bool operator==(${type}2 a, ${type}2 b) {`);
             print(`    return a.x == b.x && a.y == b.y;`);
@@ -681,7 +681,7 @@ let standardLibrary = (function() {
             print(`}`);
         }
         print();
-        
+
         for (let type of [`half`, `float`]) {
             for (let m of [2, 3, 4]) {
                 for (let n of [2, 3, 4]) {
@@ -691,7 +691,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`half`, `float`]) {
             for (let i of [2, 3, 4]) {
                 for (let j of [2, 3, 4]) {
@@ -707,7 +707,7 @@ let standardLibrary = (function() {
                 }
             }
         }
-        
+
         function computeSwizzle(components, maxValue, maxLength) {
             if (components.length == maxLength) {
                 return [components];
@@ -719,7 +719,7 @@ let standardLibrary = (function() {
                 return result;
             }
         }
-        
+
         function component(value) {
             switch (value) {
                 case 0:
@@ -734,7 +734,7 @@ let standardLibrary = (function() {
                     fatalError();
             }
         }
-        
+
         function uniqueLength(swizzle) {
             let has0 = false;
             let has1 = false;
@@ -799,28 +799,28 @@ let standardLibrary = (function() {
                 }
             }
         }
-        
+
         // These functions are unary floating-point scalar functions,
         // which can also be applied to vectors and matrices component-wise.
         (function() {
             let nativeFunctions = [`cos`, `sin`, `tan`, `acos`, `asin`, `atan`, `cosh`, `sinh`, `tanh`, `ceil`, `exp`, `floor`, `log`, `round`, `trunc`];
             let nativeFragmentFunctions = [`ddx`, `ddy`];
             let nonNativeFunctions = [`sqrt`, `log2`, `log10`, `frac`, `exp2`, `degrees`, `radians`, `rcp`, `rsqrt`, `saturate`, `ddx_coarse`, `ddx_fine`, `ddy_coarse`, `ddy_fine`, `fwidth`];
-        
+
             for (let nativeFunction of nativeFunctions) {
                 print(`native float ${nativeFunction}(float);`);
                 print(`half ${nativeFunction}(half x) {`);
                 print(`    return half(${nativeFunction}(float(x)));`);
                 print(`}`);
             }
-        
+
             for (let nativeFunction of nativeFragmentFunctions) {
                 print(`native fragment float ${nativeFunction}(float);`);
                 print(`half ${nativeFunction}(half x) {`);
                 print(`    return half(${nativeFunction}(float(x)));`);
                 print(`}`);
             }
-        
+
             for (let type of [`half`, `float`]) {
                 print(`${type} sqrt(${type} x) {`);
                 print(`    return pow(x, 0.5);`);
@@ -867,7 +867,7 @@ let standardLibrary = (function() {
                 print(`${type} fwidth(${type} x) {`);
                 print(`    return abs(ddx(x)) + abs(ddy(x));`);
                 print(`}`);
-        
+
                 for (let outputFunction of nativeFunctions.concat(nativeFragmentFunctions.concat(nonNativeFunctions))) {
                     for (let size of [2, 3, 4]) {
                         print(`${type}${size} ${outputFunction}(${type}${size} x) {`);
@@ -895,22 +895,22 @@ let standardLibrary = (function() {
                 print();
             }
         })();
-        
+
         // These functions are binary floating-point scalar functions,
         // which can also be applied to vectors and matrices component-wise.
         (function() {
             let nativeFunctions = [`pow`];
-        
+
             for (let nativeFunction of nativeFunctions) {
                 print(`native float ${nativeFunction}(float, float);`);
                 print(`half ${nativeFunction}(half x, half y) {`);
                 print(`    return half(${nativeFunction}(float(x), float(y)));`);
                 print(`}`);
             }
-        
+
             for (let type of [`half`, `float`]) {
                 let nonNativeFunctions = [`step`, `ldexp`, `fmod`];
-        
+
                 print(`${type} step(${type} y, ${type} x) {`);
                 print(`    return x >= y ? 1 : 0;`);
                 print(`}`);
@@ -922,7 +922,7 @@ let standardLibrary = (function() {
                 print(`    ${type} multiple = ${type}(whole) * y;`);
                 print(`    return x - multiple;`);
                 print(`}`);
-        
+
                 for (let outputFunction of nativeFunctions.concat(nonNativeFunctions)) {
                     for (let size of [2, 3, 4]) {
                         print(`${type}${size} ${outputFunction}(${type}${size} x, ${type}${size} y) {`);
@@ -950,12 +950,12 @@ let standardLibrary = (function() {
                 print();
             }
         })();
-        
+
         // These functions are ternary floating-point scalar functions,
         // which can also be applied to vectors and matrices component-wise.
         for (let type of [`half`, `float`]) {
             let nonNativeFunctions = [`smoothstep`, `lerp`, `fma`, `mad`];
-        
+
             print(`${type} smoothstep(${type} edge0, ${type} edge1, ${type} x) {`);
             print(`    ${type} t = clamp((x - edge0) / (edge1 - edge0), 0, 1);`);
             print(`    return t * t * (3 - 2 * t);`);
@@ -969,7 +969,7 @@ let standardLibrary = (function() {
             print(`${type} mad(${type} x, ${type} y, ${type} z) {`);
             print(`    return x * y + z;`);
             print(`}`);
-        
+
             for (let nonNativeFunction of nonNativeFunctions) {
                 for (let size of [2, 3, 4]) {
                     print(`${type}${size} ${nonNativeFunction}(${type}${size} x, ${type}${size} y, ${type}${size} z) {`);
@@ -996,7 +996,7 @@ let standardLibrary = (function() {
             }
             print();
         }
-        
+
         print(`native bool isnormal(half);`);
         print(`native bool isnormal(float);`);
         for (let type of [`half`, `float`]) {
@@ -1011,17 +1011,17 @@ let standardLibrary = (function() {
             }
             print();
         }
-        
+
         (function() {
             let nativeFunctions = [`isfinite`, `isinf`, `isnan`];
-        
+
             for (let nativeFunction of nativeFunctions) {
                 print(`native bool ${nativeFunction}(float);`);
                 print(`bool ${nativeFunction}(half x) {`);
                 print(`    return ${nativeFunction}(float(x));`);
                 print(`}`);
             }
-        
+
             for (let type of [`half`, `float`]) {
                 for (let nativeFunction of nativeFunctions) {
                     for (let size of [2, 3, 4]) {
@@ -1037,17 +1037,17 @@ let standardLibrary = (function() {
                 print();
             }
         })()
-        
+
         for (let type of [`half`, `float`]) {
             let nonNativeFunctions = [`isordered`, `isunordered`];
-        
+
             print(`bool isordered(${type} x, ${type} y) {`);
             print(`    return (x == x) && (y == y);`);
             print(`}`);
             print(`bool isunordered(${type} x, ${type} y) {`);
             print(`    return isnan(x) || isnan(y);`);
             print(`}`);
-        
+
             for (let nonNativeFunction of nonNativeFunctions) {
                 for (let size of [2, 3, 4]) {
                     print(`bool${size} ${nonNativeFunction}(${type}${size} x, ${type}${size} y) {`);
@@ -1061,7 +1061,7 @@ let standardLibrary = (function() {
             }
             print();
         }
-        
+
         print(`native float atan2(float, float);`);
         print(`half atan2(half x, half y) {`);
         print(`    return half(atan2(float(x), float(y)));`);
@@ -1091,49 +1091,53 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
-        for (let type of [`half`, `float`]) {
-            print(`void sincos(${type} x, thread ${type}* y, thread ${type}* z) {`);
-            print(`    if (y != null)`);
-            print(`        *y = sin(x);`);
-            print(`    if (z != null)`);
-            print(`        *z = cos(x);`);
-            print(`}`);
-            for (let size of [2, 3, 4]) {
-                print(`void sincos(${type}${size} x, thread ${type}${size}* y, thread ${type}${size}* z) {`);
-                // Can't take a pointer to a member of a vector.
-                print(`    ${type} sinResult;`);
-                print(`    ${type} cosResult;`);
-                for (let i = 0; i < size; ++i) {
-                    print(`    sincos(x[${i}], &sinResult, &cosResult);`);
+
+        for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+            for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                for (let type of [`half`, `float`]) {
+                    print(`void sincos(${type} x, ${addressSpace1} ${type}* y, ${addressSpace2} ${type}* z) {`);
                     print(`    if (y != null)`);
-                    print(`        (*y)[${i}] = sinResult;`);
+                    print(`        *y = sin(x);`);
                     print(`    if (z != null)`);
-                    print(`        (*z)[${i}] = cosResult;`);
-                }
-                print(`}`);
-            }
-            for (let i of [2, 3, 4]) {
-                for (let j of [2, 3, 4]) {
-                    print(`void sincos(${type}${i}x${j} x, thread ${type}${i}x${j}* y, thread ${type}${i}x${j}* z) {`);
-                    // Can't take a pointer to a member of a matrix.
-                    print(`    ${type} sinResult;`);
-                    print(`    ${type} cosResult;`);
-                    for (let m = 0; m < i; ++m) {
-                        for (let n = 0; n < j; ++n) {
-                            print(`    sincos(x[${m}][${n}], &sinResult, &cosResult);`);
+                    print(`        *z = cos(x);`);
+                    print(`}`);
+                    for (let size of [2, 3, 4]) {
+                        print(`void sincos(${type}${size} x, ${addressSpace1} ${type}${size}* y, ${addressSpace2} ${type}${size}* z) {`);
+                        // Can't take a pointer to a member of a vector.
+                        print(`    ${type} sinResult;`);
+                        print(`    ${type} cosResult;`);
+                        for (let i = 0; i < size; ++i) {
+                            print(`    sincos(x[${i}], &sinResult, &cosResult);`);
                             print(`    if (y != null)`);
-                            print(`        (*y)[${m}][${n}] = sinResult;`);
+                            print(`        (*y)[${i}] = sinResult;`);
                             print(`    if (z != null)`);
-                            print(`        (*z)[${m}][${n}] = cosResult;`);
+                            print(`        (*z)[${i}] = cosResult;`);
+                        }
+                        print(`}`);
+                    }
+                    for (let i of [2, 3, 4]) {
+                        for (let j of [2, 3, 4]) {
+                            print(`void sincos(${type}${i}x${j} x, ${addressSpace1} ${type}${i}x${j}* y, ${addressSpace2} ${type}${i}x${j}* z) {`);
+                            // Can't take a pointer to a member of a matrix.
+                            print(`    ${type} sinResult;`);
+                            print(`    ${type} cosResult;`);
+                            for (let m = 0; m < i; ++m) {
+                                for (let n = 0; n < j; ++n) {
+                                    print(`    sincos(x[${m}][${n}], &sinResult, &cosResult);`);
+                                    print(`    if (y != null)`);
+                                    print(`        (*y)[${m}][${n}] = sinResult;`);
+                                    print(`    if (z != null)`);
+                                    print(`        (*z)[${m}][${n}] = cosResult;`);
+                                }
+                            }
+                            print(`}`);
                         }
                     }
-                    print(`}`);
                 }
             }
         }
         print();
-        
+
         for (let binaryFunction of [[`all`, `true`, `&&`], [`any`, `false`, `||`]]) {
             print(`bool ${binaryFunction[0]}(bool x) {`);
             print(`    return x;`);
@@ -1178,7 +1182,7 @@ let standardLibrary = (function() {
             }
             print();
         }
-        
+
         for (let type of [`uchar`, `ushort`, `uint`]) {
             print(`${type} abs(${type} x) {`);
             print(`    return x;`);
@@ -1218,7 +1222,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`uchar`, `ushort`, `uint`]) {
             print(`${type} sign(${type} x) {`);
             print(`    return x == 0 ? 0 : 1;`);
@@ -1260,17 +1264,17 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             let nonNativeFunctions = [`min`, `max`];
-        
+
             print(`${type} min(${type} x, ${type} y) {`);
             print(`    return x > y ? y : x;`);
             print(`}`);
             print(`${type} max(${type} x, ${type} y) {`);
             print(`    return x > y ? x : y;`);
             print(`}`);
-        
+
             for (let nonNativeFunction of nonNativeFunctions) {
                 for (let size of [2, 3, 4]) {
                     print(`${type}${size} ${nonNativeFunction}(${type}${size} x, ${type}${size} y) {`);
@@ -1299,14 +1303,14 @@ let standardLibrary = (function() {
             }
             print();
         }
-        
+
         for (let type of [`uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             let nonNativeFunctions = [`clamp`];
-        
+
             print(`${type} clamp(${type} x, ${type} lower, ${type} upper) {`);
             print(`    return max(min(upper, x), lower);`);
             print(`}`);
-        
+
             for (let nonNativeFunction of nonNativeFunctions) {
                 for (let size of [2, 3, 4]) {
                     print(`${type}${size} ${nonNativeFunction}(${type}${size} x, ${type}${size} y, ${type}${size} z) {`);
@@ -1335,48 +1339,50 @@ let standardLibrary = (function() {
             }
             print();
         }
-        
-        for (let type of [`half`, `float`]) {
-            print(`${type} modf(${type} x, thread ${type}* ip) {`);
-            print(`    uint result = uint(x);`);
-            print(`    if (ip != null)`);
-            print(`        *ip = x - ${type}(result);`);
-            print(`    return ${type}(result);`);
-            print(`}`);
-        
-            for (let size of [2, 3, 4]) {
-                print(`${type}${size} modf(${type}${size} x, thread ${type}${size}* y) {`);
-                print(`    ${type}${size} result;`);
-                // Can't take a pointer to a member of a vector.
-                print(`    ${type} buffer;`);
-                for (let i = 0; i < size; ++i) {
-                    print(`    result[${i}] = modf(x[${i}], &buffer);`);
-                    print(`    if (y != null)`);
-                    print(`        (*y)[${i}] = buffer;`);
-                }
-                print(`    return result;`);
+
+        for (let addressSpace of [`thread`, `device`, `threadgroup`]) {
+            for (let type of [`half`, `float`]) {
+                print(`${type} modf(${type} x, ${addressSpace} ${type}* ip) {`);
+                print(`    uint result = uint(x);`);
+                print(`    if (ip != null)`);
+                print(`        *ip = x - ${type}(result);`);
+                print(`    return ${type}(result);`);
                 print(`}`);
-            }
-            for (let i of [2, 3, 4]) {
-                for (let j of [2, 3, 4]) {
-                    print(`${type}${i}x${j} modf(${type}${i}x${j} x, thread ${type}${i}x${j}* y) {`);
-                    print(`    ${type}${i}x${j} result;`);
-                    // Can't take a pointer to a member of a matrix.
+
+                for (let size of [2, 3, 4]) {
+                    print(`${type}${size} modf(${type}${size} x, ${addressSpace} ${type}${size}* y) {`);
+                    print(`    ${type}${size} result;`);
+                    // Can't take a pointer to a member of a vector.
                     print(`    ${type} buffer;`);
-                    for (let m = 0; m < i; ++m) {
-                        for (let n = 0; n < j; ++n) {
-                            print(`    result[${m}][${n}] = modf(x[${m}][${n}], &buffer);`);
-                            print(`    if (y != null)`);
-                            print(`        (*y)[${m}][${n}] = buffer;`);
-                        }
+                    for (let i = 0; i < size; ++i) {
+                        print(`    result[${i}] = modf(x[${i}], &buffer);`);
+                        print(`    if (y != null)`);
+                        print(`        (*y)[${i}] = buffer;`);
                     }
                     print(`    return result;`);
                     print(`}`);
                 }
+                for (let i of [2, 3, 4]) {
+                    for (let j of [2, 3, 4]) {
+                        print(`${type}${i}x${j} modf(${type}${i}x${j} x, ${addressSpace} ${type}${i}x${j}* y) {`);
+                        print(`    ${type}${i}x${j} result;`);
+                        // Can't take a pointer to a member of a matrix.
+                        print(`    ${type} buffer;`);
+                        for (let m = 0; m < i; ++m) {
+                            for (let n = 0; n < j; ++n) {
+                                print(`    result[${m}][${n}] = modf(x[${m}][${n}], &buffer);`);
+                                print(`    if (y != null)`);
+                                print(`        (*y)[${m}][${n}] = buffer;`);
+                            }
+                        }
+                        print(`    return result;`);
+                        print(`}`);
+                    }
+                }
+                print();
             }
-            print();
         }
-        
+
         print(`uchar count_bits(uchar x) {`);
         print(`    return uchar(((x | uchar(1 << 0)) == 0 ? 0 : 1) +`);
         for (let i = 1; i < 7; ++i) {
@@ -1445,7 +1451,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         print(`uint firstbithigh(uchar x) {`);
         for (let i = 0; i <= 7; ++i) {
             print(`    if ((x & uchar(1 << ${7 - i})) != 0)`);
@@ -1520,7 +1526,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         // Row-major, so the first index selects which row, and the second index selects which column
         for (let type of [`half`, `float`]) {
             print(`${type} determinant(${type} x) {`);
@@ -1584,7 +1590,7 @@ let standardLibrary = (function() {
             print(`}`);
         }
         print();
-        
+
         for (let type of [`uchar4`, `ushort4`, `uint4`, `char4`, `short4`, `int4`, `half4`, `float4`]) {
             print(`${type} dst(${type} src0, ${type} src1) {`);
             print(`    ${type} result;`);
@@ -1596,7 +1602,7 @@ let standardLibrary = (function() {
             print(`}`);
         }
         print();
-        
+
         for (let type of [`half`, `float`]) {
             print(`${type} distance(${type} x, ${type} y) {`);
             print(`    return length(x - y);`);
@@ -1608,7 +1614,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`half3`, `float3`]) {
             print(`${type} cross(${type} u, ${type} v) {`);
             print(`    ${type} result;`);
@@ -1619,7 +1625,7 @@ let standardLibrary = (function() {
             print(`}`);
         }
         print();
-        
+
         for (let type of [`uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             print(`${type} dot(${type} a, ${type} b) {`);
             print(`    return a * b;`);
@@ -1635,7 +1641,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`half`, `float`]) {
             for (let size of [``, `2`, `3`, `4`]) {
                 print(`${type}${size} faceforward(${type}${size} n, ${type}${size} i, ${type}${size} ng) {`);
@@ -1644,7 +1650,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`half`, `float`]) {
             for (let size of [``, `2`, `3`, `4`]) {
                 print(`${type} length(${type}${size} x) {`);
@@ -1653,7 +1659,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`half`, `float`]) {
             print(`${type}4 lit(${type} n_dot_l, ${type} n_dot_h, ${type} m) {`);
             print(`    ${type} ambient = 1;`);
@@ -1668,7 +1674,7 @@ let standardLibrary = (function() {
             print(`}`);
         }
         print();
-        
+
         for (let type of [`half`, `float`]) {
             for (let size of [``, `2`, `3`, `4`]) {
                 print(`${type}${size} normalize(${type}${size} x) {`);
@@ -1677,7 +1683,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`half`, `float`]) {
             for (let size of [``, `2`, `3`, `4`]) {
                 print(`${type}${size} reflect(${type}${size} i, ${type}${size} n) {`);
@@ -1686,7 +1692,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         // OpenGL ES v3.30 section 8.4
         for (let type of [`half`, `float`]) {
             for (let size of [``, `2`, `3`, `4`]) {
@@ -1700,7 +1706,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let type of [`half`, `float`]) {
             print(`${type} transpose(${type} x) {`);
             print(`    return x;`);
@@ -1720,7 +1726,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         for (let resultType of [`int`, `uint`, `float`]) {
             for (let type of [`int`, `uint`, `float`]) {
                 if (type == resultType) {
@@ -1773,7 +1779,7 @@ let standardLibrary = (function() {
             }
         }
         print();
-        
+
         print(`native float f16tof32(uint);`);
         print(`native uint f32tof16(float);`);
         for (let size of [2, 3, 4]) {
@@ -1793,18 +1799,18 @@ let standardLibrary = (function() {
             print(`}`);
         }
         print();
-        
+
         print(`native compute void AllMemoryBarrierWithGroupSync();`);
         print(`native compute void DeviceMemoryBarrierWithGroupSync();`);
         print(`native compute void GroupMemoryBarrierWithGroupSync();`);
         print();
-        
+
         for (let type of [`uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             print(`${type} mul(${type} x, ${type} y) {`);
             print(`    return x * y;`);
             print(`}`);
         }
-        
+
         for (let type of [`uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             for (let size of [2, 3, 4]) {
                 print(`${type}${size} mul(${type} x, ${type}${size} y) {`);
@@ -1823,7 +1829,7 @@ let standardLibrary = (function() {
                 print(`}`);
             }
         }
-        
+
         for (let type of [`half`, `float`]) {
             for (let i of [2, 3, 4]) {
                 for (let j of [2, 3, 4]) {
@@ -1848,7 +1854,7 @@ let standardLibrary = (function() {
                 }
             }
         }
-        
+
         for (let type of [`uchar`, `ushort`, `uint`, `char`, `short`, `int`, `half`, `float`]) {
             for (let size of [2, 3, 4]) {
                 print(`${type} mul(${type}${size} x, ${type}${size} y) {`);
@@ -1856,7 +1862,7 @@ let standardLibrary = (function() {
                 print(`}`);
             }
         }
-        
+
         for (let type of [`half`, `float`]) {
             for (let i of [2, 3, 4]) {
                 for (let j of [2, 3, 4]) {
@@ -1883,7 +1889,7 @@ let standardLibrary = (function() {
                 }
             }
         }
-        
+
         for (let type of [`half`, `float`]) {
             for (let i of [2, 3, 4]) {
                 for (let j of [2, 3, 4]) {
@@ -1906,15 +1912,14 @@ let standardLibrary = (function() {
         }
         print();
 
-        for (let type of [`uint`, `int`]) {
-            for (let functionName of [`Add`, `And`, `Exchange`, `Max`, `Min`, `Or`, `Xor`]) {
-                print(`native void Interlocked${functionName}(thread atomic_${type}*, ${type}, thread ${type}*);`);
-                print(`native void Interlocked${functionName}(threadgroup atomic_${type}*, ${type}, thread ${type}*);`);
-                print(`native void Interlocked${functionName}(device atomic_${type}*, ${type}, thread ${type}*);`);
+        for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+            for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                for (let type of [`uint`, `int`]) {
+                    for (let functionName of [`Add`, `And`, `Exchange`, `Max`, `Min`, `Or`, `Xor`])
+                        print(`native void Interlocked${functionName}(${addressSpace1} atomic_${type}*, ${type}, ${addressSpace2} ${type}*);`);
+                    print(`native void InterlockedCompareExchange(${addressSpace1} atomic_${type}*, ${type}, ${type}, ${addressSpace2} ${type}*);`);
+                }
             }
-            print(`native void InterlockedCompareExchange(thread atomic_${type}*, ${type}, ${type}, thread ${type}*);`);
-            print(`native void InterlockedCompareExchange(threadgroup atomic_${type}*, ${type}, ${type}, thread ${type}*);`);
-            print(`native void InterlockedCompareExchange(device atomic_${type}*, ${type}, ${type}, thread ${type}*);`);
         }
         print();
 
@@ -1926,13 +1931,21 @@ let standardLibrary = (function() {
                 print(`native ${type}${length} Sample(Texture1D<${type}${length}>, sampler, float location, int offset);`);
                 print(`native ${type}${length} Load(Texture1D<${type}${length}>, int2 location);`);
                 print(`native ${type}${length} Load(Texture1D<${type}${length}>, int2 location, int offset);`);
-                print(`native void GetDimensions(Texture1D<${type}${length}>, uint MipLevel, thread uint* Width, thread uint* NumberOfLevels);`);
+                for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace2 of [`thread`, `device`, `threadgroup`])
+                        print(`native void GetDimensions(Texture1D<${type}${length}>, uint MipLevel, ${addressSpace1} uint* Width, ${addressSpace2} uint* NumberOfLevels);`);
+                }
                 print();
                 print(`native ${type}${length} Sample(Texture1DArray<${type}${length}>, sampler, float2 location);`);
                 print(`native ${type}${length} Sample(Texture1DArray<${type}${length}>, sampler, float2 location, int offset);`);
                 print(`native ${type}${length} Load(Texture1DArray<${type}${length}>, int3 location);`);
                 print(`native ${type}${length} Load(Texture1DArray<${type}${length}>, int3 location, int offset);`);
-                print(`native void GetDimensions(Texture1DArray<${type}${length}>, uint MipLevel, thread uint* Width, thread uint* Elements, thread uint* NumberOfLevels);`);
+                for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                        for (let addressSpace3 of [`thread`, `device`, `threadgroup`])
+                            print(`native void GetDimensions(Texture1DArray<${type}${length}>, uint MipLevel, ${addressSpace1} uint* Width, ${addressSpace2} uint* Elements, ${addressSpace3} uint* NumberOfLevels);`);
+                    }
+                }
                 print();
                 print(`native ${type}${length} Sample(Texture2D<${type}${length}>, sampler, float2 location);`);
                 print(`native ${type}${length} Sample(Texture2D<${type}${length}>, sampler, float2 location, int2 offset);`);
@@ -1960,7 +1973,12 @@ let standardLibrary = (function() {
                 }
                 print(`native ${type}${length} Load(Texture2D<${type}${length}>, int3 location);`);
                 print(`native ${type}${length} Load(Texture2D<${type}${length}>, int3 location, int2 offset);`);
-                print(`native void GetDimensions(Texture2D<${type}${length}>, uint MipLevel, thread uint* Width, thread uint* Height, thread uint* NumberOfLevels);`);
+                for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace2 of [`thread`, `device`, `threadgroup`])
+                        for (let addressSpace3 of [`thread`, `device`, `threadgroup`]) {
+                            print(`native void GetDimensions(Texture2D<${type}${length}>, uint MipLevel, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height, ${addressSpace3} uint* NumberOfLevels);`);
+                    }
+                }
                 print();
                 print(`native ${type}${length} Sample(Texture2DArray<${type}${length}>, sampler, float3 location);`);
                 print(`native ${type}${length} Sample(Texture2DArray<${type}${length}>, sampler, float3 location, int2 offset);`);
@@ -1988,13 +2006,27 @@ let standardLibrary = (function() {
                 }
                 print(`native ${type}${length} Load(Texture2DArray<${type}${length}>, int4 location);`);
                 print(`native ${type}${length} Load(Texture2DArray<${type}${length}>, int4 location, int2 offset);`);
-                print(`native void GetDimensions(Texture2DArray<${type}${length}>, uint MipLevel, thread uint* Width, thread uint* Height, thread uint* Elements, thread uint* NumberOfLevels);`);
+                for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                        for (let addressSpace3 of [`thread`, `device`, `threadgroup`]) {
+                            for (let addressSpace4 of [`thread`, `device`, `threadgroup`])
+                                print(`native void GetDimensions(Texture2DArray<${type}${length}>, uint MipLevel, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height, ${addressSpace3} uint* Elements, ${addressSpace4} uint* NumberOfLevels);`);
+                        }
+                    }
+                }
                 print();
                 print(`native ${type}${length} Sample(Texture3D<${type}${length}>, sampler, float3 location);`);
                 print(`native ${type}${length} Sample(Texture3D<${type}${length}>, sampler, float3 location, int3 offset);`);
                 print(`native ${type}${length} Load(Texture3D<${type}${length}>, int4 location);`);
                 print(`native ${type}${length} Load(Texture3D<${type}${length}>, int4 location, int3 offset);`);
-                print(`native void GetDimensions(Texture3D<${type}${length}>, uint MipLevel, thread uint* Width, thread uint* Height, thread uint* Depth, thread uint* NumberOfLevels);`);
+                for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                        for (let addressSpace3 of [`thread`, `device`, `threadgroup`]) {
+                            for (let addressSpace4 of [`thread`, `device`, `threadgroup`])
+                                print(`native void GetDimensions(Texture3D<${type}${length}>, uint MipLevel, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height, ${addressSpace3} uint* Depth, ${addressSpace4} uint* NumberOfLevels);`);
+                        }
+                    }
+                }
                 print();
                 print(`native ${type}${length} Sample(TextureCube<${type}${length}>, sampler, float3 location);`);
                 print(`native ${type}${length} SampleBias(TextureCube<${type}${length}>, sampler, float3 location, float Bias);`);
@@ -2010,30 +2042,57 @@ let standardLibrary = (function() {
                             print(`native ${type}4 GatherAlpha(TextureCube<${type}${length}>, sampler, float3 location);`);
                     }
                 }
-                print(`native void GetDimensions(TextureCube<${type}${length}>, uint MipLevel, thread uint* Width, thread uint* Height, thread uint* NumberOfLevels);`);
+                for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                        for (let addressSpace3 of [`thread`, `device`, `threadgroup`])
+                            print(`native void GetDimensions(TextureCube<${type}${length}>, uint MipLevel, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height, ${addressSpace3} uint* NumberOfLevels);`);
+                    }
+                }
                 print();
-                print(`native void GetDimensions(RWTexture1D<${type}${length}>, thread uint* Width);`);
-                print(`native void GetDimensions(RWTexture1D<${type}${length}>, thread float* Width);`);
+                for (let addressSpace of [`thread`, `device`, `threadgroup`]) {
+                    print(`native void GetDimensions(RWTexture1D<${type}${length}>, ${addressSpace} uint* Width);`);
+                    print(`native void GetDimensions(RWTexture1D<${type}${length}>, ${addressSpace} float* Width);`);
+                }
                 print(`native ${type}${length} Load(RWTexture1D<${type}${length}>, int location);`);
                 print(`native void Store(RWTexture1D<${type}${length}>, ${type}${length}, uint location);`);
                 print();
-                print(`native void GetDimensions(RWTexture1DArray<${type}${length}>, thread uint* Width, thread uint* Elements);`);
-                print(`native void GetDimensions(RWTexture1DArray<${type}${length}>, thread float* Width, thread uint* Elements);`);
+                for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                        print(`native void GetDimensions(RWTexture1DArray<${type}${length}>, ${addressSpace1} uint* Width, ${addressSpace2} uint* Elements);`);
+                        print(`native void GetDimensions(RWTexture1DArray<${type}${length}>, ${addressSpace1} float* Width, ${addressSpace2} uint* Elements);`);
+                    }
+                }
                 print(`native ${type}${length} Load(RWTexture1DArray<${type}${length}>, int2 location);`);
                 print(`native void Store(RWTexture1DArray<${type}${length}>, ${type}${length}, uint2 location);`);
                 print();
-                print(`native void GetDimensions(RWTexture2D<${type}${length}>, thread uint* Width, thread uint* Height);`);
-                print(`native void GetDimensions(RWTexture2D<${type}${length}>, thread float* Width, thread float* Height);`);
+                for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                        print(`native void GetDimensions(RWTexture2D<${type}${length}>, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height);`);
+                        print(`native void GetDimensions(RWTexture2D<${type}${length}>, ${addressSpace1} float* Width, ${addressSpace2} float* Height);`);
+                    }
+                }
                 print(`native ${type}${length} Load(RWTexture2D<${type}${length}>, int2 location);`);
                 print(`native void Store(RWTexture2D<${type}${length}>, ${type}${length}, uint2 location);`);
                 print();
-                print(`native void GetDimensions(RWTexture2DArray<${type}${length}>, thread uint* Width, thread uint* Height, thread uint* Elements);`);
-                print(`native void GetDimensions(RWTexture2DArray<${type}${length}>, thread float* Width, thread float* Height, thread float* Elements);`);
+                for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                        for (let addressSpace3 of [`thread`, `device`, `threadgroup`]) {
+                            print(`native void GetDimensions(RWTexture2DArray<${type}${length}>, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height, ${addressSpace3} uint* Elements);`);
+                            print(`native void GetDimensions(RWTexture2DArray<${type}${length}>, ${addressSpace1} float* Width, ${addressSpace2} float* Height, ${addressSpace3} float* Elements);`);
+                        }
+                    }
+                }
                 print(`native ${type}${length} Load(RWTexture2DArray<${type}${length}>, int3 location);`);
                 print(`native void Store(RWTexture2DArray<${type}${length}>, ${type}${length}, uint3 location);`);
                 print();
-                print(`native void GetDimensions(RWTexture3D<${type}${length}>, thread uint* Width, thread uint* Height, thread uint* Depth);`);
-                print(`native void GetDimensions(RWTexture3D<${type}${length}>, thread float* Width, thread float* Height, thread float* Depth);`);
+                for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                        for (let addressSpace3 of [`thread`, `device`, `threadgroup`]) {
+                            print(`native void GetDimensions(RWTexture3D<${type}${length}>, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height, ${addressSpace3} uint* Depth);`);
+                            print(`native void GetDimensions(RWTexture3D<${type}${length}>, ${addressSpace1} float* Width, ${addressSpace2} float* Height, ${addressSpace3} float* Depth);`);
+                        }
+                    }
+                }
                 print(`native ${type}${length} Load(RWTexture3D<${type}${length}>, int3 location);`);
                 print(`native void Store(RWTexture3D<${type}${length}>, ${type}${length}, uint3 location);`);
                 print();
@@ -2063,7 +2122,12 @@ let standardLibrary = (function() {
             print(`native ${type}4 GatherCmpRed(TextureDepth2D<${type}>, sampler, float2 location, float compare_value, int2 offset);`);
             print(`native ${type} Load(TextureDepth2D<${type}>, int3 location);`);
             print(`native ${type} Load(TextureDepth2D<${type}>, int3 location, int2 offset);`);
-            print(`native void GetDimensions(TextureDepth2D<${type}>, uint MipLevel, thread uint* Width, thread uint* Height, thread uint* NumberOfLevels);`);
+            for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace3 of [`thread`, `device`, `threadgroup`])
+                        print(`native void GetDimensions(TextureDepth2D<${type}>, uint MipLevel, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height, ${addressSpace3} uint* NumberOfLevels);`);
+                }
+            }
             print();
             print(`native ${type} Sample(TextureDepth2DArray<${type}>, sampler, float3 location);`);
             print(`native ${type} Sample(TextureDepth2DArray<${type}>, sampler, float3 location, int2 offset);`);
@@ -2087,7 +2151,14 @@ let standardLibrary = (function() {
             print(`native ${type}4 GatherCmpRed(TextureDepth2DArray<${type}>, sampler, float3 location, float compare_value, int2 offset);`);
             print(`native ${type} Load(TextureDepth2DArray<${type}>, int4 location);`);
             print(`native ${type} Load(TextureDepth2DArray<${type}>, int4 location, int2 offset);`);
-            print(`native void GetDimensions(TextureDepth2DArray<${type}>, uint MipLevel, thread uint* Width, thread uint* Height, thread uint* Elements, thread uint* NumberOfLevels);`);
+            for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace3 of [`thread`, `device`, `threadgroup`]) {
+                        for (let addressSpace4 of [`thread`, `device`, `threadgroup`])
+                            print(`native void GetDimensions(TextureDepth2DArray<${type}>, uint MipLevel, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height, ${addressSpace3} uint* Elements, ${addressSpace4} uint* NumberOfLevels);`);
+                    }
+                }
+            }
             print();
             print(`native ${type} Sample(TextureDepthCube<${type}>, sampler, float3 location);`);
             print(`native ${type} SampleCmp(TextureDepthCube<${type}>, sampler, float3 location, ${type} CompareValue);`);
@@ -2099,15 +2170,30 @@ let standardLibrary = (function() {
             print(`native ${type}4 GatherRed(TextureDepthCube<${type}>, sampler, float3 location);`);
             print(`native ${type}4 GatherCmp(TextureDepthCube<${type}>, sampler, float3 location, float compare_value);`);
             print(`native ${type}4 GatherCmpRed(TextureDepthCube<${type}>, sampler, float3 location, float compare_value);`);
-            print(`native void GetDimensions(TextureDepthCube<${type}>, uint MipLevel, thread uint* Width, thread uint* Height, thread uint* NumberOfLevels);`);
+            for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace3 of [`thread`, `device`, `threadgroup`])
+                        print(`native void GetDimensions(TextureDepthCube<${type}>, uint MipLevel, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height, ${addressSpace3} uint* NumberOfLevels);`);
+                }
+            }
             print();
-            print(`native void GetDimensions(RWTextureDepth2D<${type}>, thread uint* Width, thread uint* Height);`);
-            print(`native void GetDimensions(RWTextureDepth2D<${type}>, thread float* Width, thread float* Height);`);
+            for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                    print(`native void GetDimensions(RWTextureDepth2D<${type}>, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height);`);
+                    print(`native void GetDimensions(RWTextureDepth2D<${type}>, ${addressSpace1} float* Width, ${addressSpace2} float* Height);`);
+                }
+            }
             print(`native ${type} Load(RWTextureDepth2D<${type}>, int2 location);`);
             print(`native void Store(RWTextureDepth2D<${type}>, ${type}, uint2 location);`);
             print();
-            print(`native void GetDimensions(RWTextureDepth2DArray<${type}>, thread uint* Width, thread uint* Height, thread uint* Elements);`);
-            print(`native void GetDimensions(RWTextureDepth2DArray<${type}>, thread float* Width, thread float* Height, thread float* Elements);`);
+            for (let addressSpace1 of [`thread`, `device`, `threadgroup`]) {
+                for (let addressSpace2 of [`thread`, `device`, `threadgroup`]) {
+                    for (let addressSpace3 of [`thread`, `device`, `threadgroup`]) {
+                        print(`native void GetDimensions(RWTextureDepth2DArray<${type}>, ${addressSpace1} uint* Width, ${addressSpace2} uint* Height, ${addressSpace3} uint* Elements);`);
+                        print(`native void GetDimensions(RWTextureDepth2DArray<${type}>, ${addressSpace1} float* Width, ${addressSpace2} float* Height, ${addressSpace3} float* Elements);`);
+                    }
+                }
+            }
             print(`native ${type} Load(RWTextureDepth2DArray<${type}>, int3 location);`);
             print(`native void Store(RWTextureDepth2DArray<${type}>, ${type}, uint3 location);`);
             print();