summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/compiler/translator/emulated_builtin_function_data_hlsl.json
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/compiler/translator/emulated_builtin_function_data_hlsl.json')
-rw-r--r--src/3rdparty/angle/src/compiler/translator/emulated_builtin_function_data_hlsl.json1382
1 files changed, 0 insertions, 1382 deletions
diff --git a/src/3rdparty/angle/src/compiler/translator/emulated_builtin_function_data_hlsl.json b/src/3rdparty/angle/src/compiler/translator/emulated_builtin_function_data_hlsl.json
deleted file mode 100644
index 32e500fe67..0000000000
--- a/src/3rdparty/angle/src/compiler/translator/emulated_builtin_function_data_hlsl.json
+++ /dev/null
@@ -1,1382 +0,0 @@
-[
- {
- "op":"mod",
- "return_type":"float",
- "args":[
- "float x",
- "float y"
- ],
- "body":[
- "return x - y * floor(x / y);"
- ]
- },
- {
- "op":"mod",
- "return_type":"float2",
- "args":[
- "float2 x",
- "float2 y"
- ],
- "body":[
- "return x - y * floor(x / y);"
- ]
- },
- {
- "op":"mod",
- "return_type":"float2",
- "args":[
- "float2 x",
- "float y"
- ],
- "body":[
- "return x - y * floor(x / y);"
- ]
- },
- {
- "op":"mod",
- "return_type":"float3",
- "args":[
- "float3 x",
- "float3 y"
- ],
- "body":[
- "return x - y * floor(x / y);"
- ]
- },
- {
- "op":"mod",
- "return_type":"float3",
- "args":[
- "float3 x",
- "float y"
- ],
- "body":[
- "return x - y * floor(x / y);"
- ]
- },
- {
- "op":"mod",
- "return_type":"float4",
- "args":[
- "float4 x",
- "float4 y"
- ],
- "body":[
- "return x - y * floor(x / y);"
- ]
- },
- {
- "op":"mod",
- "return_type":"float4",
- "args":[
- "float4 x",
- "float y"
- ],
- "body":[
- "return x - y * floor(x / y);"
- ]
- },
- {
- "op":"frexp",
- "return_type":"float",
- "args":[
- "float x",
- "out int exp"
- ],
- "body":[
- "float fexp;",
- "float mantissa = frexp(abs(x), fexp) * sign(x);",
- "exp = int(fexp);",
- "return mantissa;"
- ]
- },
- {
- "op":"frexp",
- "return_type":"float2",
- "args":[
- "float2 x",
- "out int2 exp"
- ],
- "body":[
- "float2 fexp;",
- "float2 mantissa = frexp(abs(x), fexp) * sign(x);",
- "exp = int2(fexp);",
- "return mantissa;"
- ]
- },
- {
- "op":"frexp",
- "return_type":"float3",
- "args":[
- "float3 x",
- "out int3 exp"
- ],
- "body":[
- "float3 fexp;",
- "float3 mantissa = frexp(abs(x), fexp) * sign(x);",
- "exp = int3(fexp);",
- "return mantissa;"
- ]
- },
- {
- "op":"frexp",
- "return_type":"float4",
- "args":[
- "float4 x",
- "out int4 exp"
- ],
- "body":[
- "float4 fexp;",
- "float4 mantissa = frexp(abs(x), fexp) * sign(x);",
- "exp = int4(fexp);",
- "return mantissa;"
- ]
- },
- {
- "op":"ldexp",
- "return_type":"float",
- "args":[
- "float x",
- "int exp"
- ],
- "body":[
- "return ldexp(x, float(exp));"
- ]
- },
- {
- "op":"ldexp",
- "return_type":"float2",
- "args":[
- "float2 x",
- "int2 exp"
- ],
- "body":[
- "return ldexp(x, float2(exp));"
- ]
- },
- {
- "op":"ldexp",
- "return_type":"float3",
- "args":[
- "float3 x",
- "int3 exp"
- ],
- "body":[
- "return ldexp(x, float3(exp));"
- ]
- },
- {
- "op":"ldexp",
- "return_type":"float4",
- "args":[
- "float4 x",
- "int4 exp"
- ],
- "body":[
- "return ldexp(x, float4(exp));"
- ]
- },
- {
- "op":"faceforward",
- "return_type":"float",
- "args":[
- "float N",
- "float I",
- "float Nref"
- ],
- "body":[
- "if(dot(Nref, I) >= 0)",
- "{",
- " return -N;",
- "}",
- "else",
- "{",
- " return N;",
- "}"
- ]
- },
- {
- "op":"faceforward",
- "return_type":"float2",
- "args":[
- "float2 N",
- "float2 I",
- "float2 Nref"
- ],
- "body":[
- "if(dot(Nref, I) >= 0)",
- "{",
- " return -N;",
- "}",
- "else",
- "{",
- " return N;",
- "}"
- ]
- },
- {
- "op":"faceforward",
- "return_type":"float3",
- "args":[
- "float3 N",
- "float3 I",
- "float3 Nref"
- ],
- "body":[
- "if(dot(Nref, I) >= 0)",
- "{",
- " return -N;",
- "}",
- "else",
- "{",
- " return N;",
- "}"
- ]
- },
- {
- "op":"faceforward",
- "return_type":"float4",
- "args":[
- "float4 N",
- "float4 I",
- "float4 Nref"
- ],
- "body":[
- "if(dot(Nref, I) >= 0)",
- "{",
- " return -N;",
- "}",
- "else",
- "{",
- " return N;",
- "}"
- ]
- },
- {
- "op":"atan",
- "return_type":"float",
- "args":[
- "float y",
- "float x"
- ],
- "body":[
- "if(x == 0 && y == 0) x = 1;",
- "return atan2(y, x);"
- ]
- },
- {
- "op":"atan",
- "return_type":"float2",
- "args":[
- "float2 y",
- "float2 x"
- ],
- "body":[
- "if(x[0] == 0 && y[0] == 0) x[0] = 1;",
- "if(x[1] == 0 && y[1] == 0) x[1] = 1;",
- "return float2(atan2(y[0], x[0]), atan2(y[1], x[1]));"
- ]
- },
- {
- "op":"atan",
- "return_type":"float3",
- "args":[
- "float3 y",
- "float3 x"
- ],
- "body":[
- "if(x[0] == 0 && y[0] == 0) x[0] = 1;",
- "if(x[1] == 0 && y[1] == 0) x[1] = 1;",
- "if(x[2] == 0 && y[2] == 0) x[2] = 1;",
- "return float3(atan2(y[0], x[0]), atan2(y[1], x[1]), atan2(y[2], x[2]));"
- ]
- },
- {
- "op":"atan",
- "return_type":"float4",
- "args":[
- "float4 y",
- "float4 x"
- ],
- "body":[
- "if(x[0] == 0 && y[0] == 0) x[0] = 1;",
- "if(x[1] == 0 && y[1] == 0) x[1] = 1;",
- "if(x[2] == 0 && y[2] == 0) x[2] = 1;",
- "if(x[3] == 0 && y[3] == 0) x[3] = 1;",
- "return float4(atan2(y[0], x[0]), atan2(y[1], x[1]), atan2(y[2], ",
- "x[2]), atan2(y[3], x[3]));"
- ]
- },
- {
- "op":"asinh",
- "return_type":"float",
- "args":[
- "in float x"
- ],
- "body":[
- "return log(x + sqrt(pow(x, 2.0) + 1.0));"
- ]
- },
- {
- "op":"asinh",
- "return_type":"float2",
- "args":[
- "in float2 x"
- ],
- "body":[
- "return log(x + sqrt(pow(x, 2.0) + 1.0));"
- ]
- },
- {
- "op":"asinh",
- "return_type":"float3",
- "args":[
- "in float3 x"
- ],
- "body":[
- "return log(x + sqrt(pow(x, 2.0) + 1.0));"
- ]
- },
- {
- "op":"asinh",
- "return_type":"float4",
- "args":[
- "in float4 x"
- ],
- "body":[
- "return log(x + sqrt(pow(x, 2.0) + 1.0));"
- ]
- },
- {
- "op":"acosh",
- "return_type":"float",
- "args":[
- "in float x"
- ],
- "body":[
- "return log(x + sqrt(x + 1.0) * sqrt(x - 1.0));"
- ]
- },
- {
- "op":"acosh",
- "return_type":"float2",
- "args":[
- "in float2 x"
- ],
- "body":[
- "return log(x + sqrt(x + 1.0) * sqrt(x - 1.0));"
- ]
- },
- {
- "op":"acosh",
- "return_type":"float3",
- "args":[
- "in float3 x"
- ],
- "body":[
- "return log(x + sqrt(x + 1.0) * sqrt(x - 1.0));"
- ]
- },
- {
- "op":"acosh",
- "return_type":"float4",
- "args":[
- "in float4 x"
- ],
- "body":[
- "return log(x + sqrt(x + 1.0) * sqrt(x - 1.0));"
- ]
- },
- {
- "op":"atanh",
- "return_type":"float",
- "args":[
- "in float x"
- ],
- "body":[
- "return 0.5 * log((1.0 + x) / (1.0 - x));"
- ]
- },
- {
- "op":"atanh",
- "return_type":"float2",
- "args":[
- "in float2 x"
- ],
- "body":[
- "return 0.5 * log((1.0 + x) / (1.0 - x));"
- ]
- },
- {
- "op":"atanh",
- "return_type":"float3",
- "args":[
- "in float3 x"
- ],
- "body":[
- "return 0.5 * log((1.0 + x) / (1.0 - x));"
- ]
- },
- {
- "op":"atanh",
- "return_type":"float4",
- "args":[
- "in float4 x"
- ],
- "body":[
- "return 0.5 * log((1.0 + x) / (1.0 - x));"
- ]
- },
- {
- "op":"roundEven",
- "return_type":"float",
- "args":[
- "in float x"
- ],
- "body":[
- "return (frac(x) == 0.5 && trunc(x) % 2.0 == 0.0) ? trunc(x) : round(x);"
- ]
- },
- {
- "op":"roundEven",
- "return_type":"float2",
- "args":[
- "in float2 x"
- ],
- "body":[
- "float2 v;",
- "v[0] = (frac(x[0]) == 0.5 && trunc(x[0]) % 2.0 == 0.0) ? trunc(x[0]) : round(x[0]);",
- "v[1] = (frac(x[1]) == 0.5 && trunc(x[1]) % 2.0 == 0.0) ? trunc(x[1]) : round(x[1]);",
- "return v;"
- ]
- },
- {
- "op":"roundEven",
- "return_type":"float3",
- "args":[
- "in float3 x"
- ],
- "body":[
- "float3 v;",
- "v[0] = (frac(x[0]) == 0.5 && trunc(x[0]) % 2.0 == 0.0) ? trunc(x[0]) : round(x[0]);",
- "v[1] = (frac(x[1]) == 0.5 && trunc(x[1]) % 2.0 == 0.0) ? trunc(x[1]) : round(x[1]);",
- "v[2] = (frac(x[2]) == 0.5 && trunc(x[2]) % 2.0 == 0.0) ? trunc(x[2]) : round(x[2]);",
- "return v;"
- ]
- },
- {
- "op":"roundEven",
- "return_type":"float4",
- "args":[
- "in float4 x"
- ],
- "body":[
- "float4 v;",
- "v[0] = (frac(x[0]) == 0.5 && trunc(x[0]) % 2.0 == 0.0) ? trunc(x[0]) : round(x[0]);",
- "v[1] = (frac(x[1]) == 0.5 && trunc(x[1]) % 2.0 == 0.0) ? trunc(x[1]) : round(x[1]);",
- "v[2] = (frac(x[2]) == 0.5 && trunc(x[2]) % 2.0 == 0.0) ? trunc(x[2]) : round(x[2]);",
- "v[3] = (frac(x[3]) == 0.5 && trunc(x[3]) % 2.0 == 0.0) ? trunc(x[3]) : round(x[3]);",
- "return v;"
- ]
- },
- {
- "op":"packSnorm2x16",
- "return_type":"uint",
- "args":[
- "in float2 v"
- ],
- "helper":[
- "int webgl_toSnorm16(in float x) {",
- " return int(round(clamp(x, -1.0, 1.0) * 32767.0));",
- "}"
- ],
- "body":[
- "int x = webgl_toSnorm16(v.x);",
- "int y = webgl_toSnorm16(v.y);",
- "return (asuint(y) << 16) | (asuint(x) & 0xffffu);"
- ]
- },
- {
- "op":"packUnorm2x16",
- "return_type":"uint",
- "args":[
- "in float2 v"
- ],
- "helper":[
- "uint webgl_toUnorm16(in float x) {",
- " return uint(round(clamp(x, 0.0, 1.0) * 65535.0));",
- "}"
- ],
- "body":[
- "uint x = webgl_toUnorm16(v.x);",
- "uint y = webgl_toUnorm16(v.y);",
- "return (y << 16) | x;"
- ]
- },
- {
- "op":"packHalf2x16",
- "return_type":"uint",
- "args":[
- "in float2 v"
- ],
- "body":[
- "uint x = f32tof16(v.x);",
- "uint y = f32tof16(v.y);",
- "return (y << 16) | x;"
- ]
- },
- {
- "op":"unpackSnorm2x16",
- "return_type":"float2",
- "args":[
- "in uint u"
- ],
- "helper":[
- "float webgl_fromSnorm16(in uint x) {",
- " int xi = asint(x & 0x7fffu) - asint(x & 0x8000u);",
- " return clamp(float(xi) / 32767.0, -1.0, 1.0);",
- "}"
- ],
- "body":[
- "uint y = (u >> 16);",
- "uint x = u;",
- "return float2(webgl_fromSnorm16(x), webgl_fromSnorm16(y));"
- ]
- },
- {
- "op":"unpackUnorm2x16",
- "return_type":"float2",
- "args":[
- "in uint u"
- ],
- "helper":[
- "float webgl_fromUnorm16(in uint x) {",
- " return float(x) / 65535.0;",
- "}"
- ],
- "body":[
- "uint y = (u >> 16);",
- "uint x = u & 0xffffu;",
- "return float2(webgl_fromUnorm16(x), webgl_fromUnorm16(y));"
- ]
- },
- {
- "op":"unpackHalf2x16",
- "return_type":"float2",
- "args":[
- "in uint u"
- ],
- "body":[
- "uint y = (u >> 16);",
- "uint x = u & 0xffffu;",
- "return float2(f16tof32(x), f16tof32(y));"
- ]
- },
- {
- "op":"packSnorm4x8",
- "return_type":"uint",
- "args":[
- "in float4 v"
- ],
- "helper":[
- "int webgl_toSnorm8(in float x) {",
- " return int(round(clamp(x, -1.0, 1.0) * 127.0));",
- "}"
- ],
- "body":[
- "int x = webgl_toSnorm8(v.x);",
- "int y = webgl_toSnorm8(v.y);",
- "int z = webgl_toSnorm8(v.z);",
- "int w = webgl_toSnorm8(v.w);",
- "return ((asuint(w) & 0xffu) << 24) | ((asuint(z) & 0xffu) << 16) ",
- "| ((asuint(y) & 0xffu) << 8) | (asuint(x) & 0xffu);"
- ]
- },
- {
- "op":"packUnorm4x8",
- "return_type":"uint",
- "args":[
- "in float4 v"
- ],
- "helper":[
- "uint webgl_toUnorm8(in float x) {",
- " return uint(round(clamp(x, 0.0, 1.0) * 255.0));",
- "}"
- ],
- "body":[
- "uint x = webgl_toUnorm8(v.x);",
- "uint y = webgl_toUnorm8(v.y);",
- "uint z = webgl_toUnorm8(v.z);",
- "uint w = webgl_toUnorm8(v.w);",
- "return (w << 24) | (z << 16) | (y << 8) | x;"
- ]
- },
- {
- "op":"unpackSnorm4x8",
- "return_type":"float4",
- "args":[
- "in uint u"
- ],
- "helper":[
- "float webgl_fromSnorm8(in uint x) {",
- " int xi = asint(x & 0x7fu) - asint(x & 0x80u);",
- " return clamp(float(xi) / 127.0, -1.0, 1.0);",
- "}"
- ],
- "body":[
- "uint w = (u >> 24);",
- "uint z = (u >> 16);",
- "uint y = (u >> 8);",
- "uint x = u;",
- "return float4(webgl_fromSnorm8(x), webgl_fromSnorm8(y), ",
- "webgl_fromSnorm8(z), webgl_fromSnorm8(w));"
- ]
- },
- {
- "op":"unpackUnorm4x8",
- "return_type":"float4",
- "args":[
- "in uint u"
- ],
- "helper":[
- "float webgl_fromUnorm8(in uint x) {",
- " return float(x) / 255.0;",
- "}"
- ],
- "body":[
- "uint w = (u >> 24) & 0xffu;",
- "uint z = (u >> 16) & 0xffu;",
- "uint y = (u >> 8) & 0xffu;",
- "uint x = u & 0xffu;",
- "return float4(webgl_fromUnorm8(x), webgl_fromUnorm8(y), ",
- "webgl_fromUnorm8(z), webgl_fromUnorm8(w));"
- ]
- },
- {
- "comment":[
- "The matrix resulting from outer product needs to be transposed",
- "(matrices are stored as transposed to simplify element access in HLSL).",
- "So the function should return transpose(c * r) where c is a column vector",
- "and r is a row vector. This can be simplified by using the following",
- "formula:",
- "transpose(c * r) = transpose(r) * transpose(c)",
- "transpose(r) and transpose(c) are in a sense free, since to get the",
- "transpose of r, we simply can build a column matrix out of the original",
- "vector instead of a row matrix."
- ],
- "op":"outerProduct",
- "return_type":"float2x2",
- "args":[
- "in float2 c",
- "in float2 r"
- ],
- "body":[
- "return mul(float2x1(r), float1x2(c));"
- ]
- },
- {
- "op":"outerProduct",
- "return_type":"float3x3",
- "args":[
- "in float3 c",
- "in float3 r"
- ],
- "body":[
- "return mul(float3x1(r), float1x3(c));"
- ]
- },
- {
- "op":"outerProduct",
- "return_type":"float4x4",
- "args":[
- "in float4 c",
- "in float4 r"
- ],
- "body":[
- "return mul(float4x1(r), float1x4(c));"
- ]
- },
- {
- "op":"outerProduct",
- "return_type":"float2x3",
- "args":[
- "in float3 c",
- "in float2 r"
- ],
- "body":[
- "return mul(float2x1(r), float1x3(c));"
- ]
- },
- {
- "op":"outerProduct",
- "return_type":"float3x2",
- "args":[
- "in float2 c",
- "in float3 r"
- ],
- "body":[
- "return mul(float3x1(r), float1x2(c));"
- ]
- },
- {
- "op":"outerProduct",
- "return_type":"float2x4",
- "args":[
- "in float4 c",
- "in float2 r"
- ],
- "body":[
- "return mul(float2x1(r), float1x4(c));"
- ]
- },
- {
- "op":"outerProduct",
- "return_type":"float4x2",
- "args":[
- "in float2 c",
- "in float4 r"
- ],
- "body":[
- "return mul(float4x1(r), float1x2(c));"
- ]
- },
- {
- "op":"outerProduct",
- "return_type":"float3x4",
- "args":[
- "in float4 c",
- "in float3 r"
- ],
- "body":[
- "return mul(float3x1(r), float1x4(c));"
- ]
- },
- {
- "op":"outerProduct",
- "return_type":"float4x3",
- "args":[
- "in float3 c",
- "in float4 r"
- ],
- "body":[
- "return mul(float4x1(r), float1x3(c));"
- ]
- },
- {
- "comment":[
- "Remember here that the parameter matrix is actually the transpose",
- "of the matrix that we're trying to invert, and the resulting matrix",
- "should also be the transpose of the inverse.",
- "When accessing the parameter matrix with m[a][b] it can be thought of so",
- "that a is the column and b is the row of the matrix that we're inverting.",
- "We calculate the inverse as the adjugate matrix divided by the",
- "determinant of the matrix being inverted. However, as the result needs",
- "to be transposed, we actually use of the transpose of the adjugate matrix",
- "which happens to be the cofactor matrix. That's stored in 'cof'.",
- "We don't need to care about divide-by-zero since results are undefined",
- "for singular or poorly-conditioned matrices."
- ],
- "op":"inverse",
- "return_type":"float2x2",
- "args":[
- "in float2x2 m"
- ],
- "body":[
- "float2x2 cof = { m[1][1], -m[0][1], -m[1][0], m[0][0] };",
- "return cof / determinant(transpose(m));"
- ]
- },
- {
- "comment":[
- "cofAB is the cofactor for column A and row B."
- ],
- "op":"inverse",
- "return_type":"float3x3",
- "args":[
- "in float3x3 m"
- ],
- "body":[
- "float cof00 = m[1][1] * m[2][2] - m[2][1] * m[1][2];",
- "float cof01 = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]);",
- "float cof02 = m[1][0] * m[2][1] - m[2][0] * m[1][1];",
- "float cof10 = -(m[0][1] * m[2][2] - m[2][1] * m[0][2]);",
- "float cof11 = m[0][0] * m[2][2] - m[2][0] * m[0][2];",
- "float cof12 = -(m[0][0] * m[2][1] - m[2][0] * m[0][1]);",
- "float cof20 = m[0][1] * m[1][2] - m[1][1] * m[0][2];",
- "float cof21 = -(m[0][0] * m[1][2] - m[1][0] * m[0][2]);",
- "float cof22 = m[0][0] * m[1][1] - m[1][0] * m[0][1];",
- "float3x3 cof = { cof00, cof10, cof20, cof01, cof11, cof21, cof02, cof12, cof22 };",
- "return cof / determinant(transpose(m));"
- ]
- },
- {
- "op":"inverse",
- "return_type":"float4x4",
- "args":[
- "in float4x4 m"
- ],
- "body":[
- "float cof00 = m[1][1] * m[2][2] * m[3][3] + m[2][1] * m[3][2] * m[1][3] + m[3][1] * ",
- "m[1][2] * m[2][3]",
- " - m[1][1] * m[3][2] * m[2][3] - m[2][1] * m[1][2] * m[3][3] - m[3][1] * m[2][2] * ",
- "m[1][3];",
- "float cof01 = -(m[1][0] * m[2][2] * m[3][3] + m[2][0] * m[3][2] * m[1][3] + m[3][0] * ",
- "m[1][2] * m[2][3]",
- " - m[1][0] * m[3][2] * m[2][3] - m[2][0] * m[1][2] * m[3][3] - m[3][0] * m[2][2] * ",
- "m[1][3]);",
- "float cof02 = m[1][0] * m[2][1] * m[3][3] + m[2][0] * m[3][1] * m[1][3] + m[3][0] * ",
- "m[1][1] * m[2][3]",
- " - m[1][0] * m[3][1] * m[2][3] - m[2][0] * m[1][1] * m[3][3] - m[3][0] * m[2][1] * ",
- "m[1][3];",
- "float cof03 = -(m[1][0] * m[2][1] * m[3][2] + m[2][0] * m[3][1] * m[1][2] + m[3][0] * ",
- "m[1][1] * m[2][2]",
- " - m[1][0] * m[3][1] * m[2][2] - m[2][0] * m[1][1] * m[3][2] - m[3][0] * m[2][1] * ",
- "m[1][2]);",
- "float cof10 = -(m[0][1] * m[2][2] * m[3][3] + m[2][1] * m[3][2] * m[0][3] + m[3][1] * ",
- "m[0][2] * m[2][3]",
- " - m[0][1] * m[3][2] * m[2][3] - m[2][1] * m[0][2] * m[3][3] - m[3][1] * m[2][2] * ",
- "m[0][3]);",
- "float cof11 = m[0][0] * m[2][2] * m[3][3] + m[2][0] * m[3][2] * m[0][3] + m[3][0] * ",
- "m[0][2] * m[2][3]",
- " - m[0][0] * m[3][2] * m[2][3] - m[2][0] * m[0][2] * m[3][3] - m[3][0] * m[2][2] * ",
- "m[0][3];",
- "float cof12 = -(m[0][0] * m[2][1] * m[3][3] + m[2][0] * m[3][1] * m[0][3] + m[3][0] * ",
- "m[0][1] * m[2][3]",
- " - m[0][0] * m[3][1] * m[2][3] - m[2][0] * m[0][1] * m[3][3] - m[3][0] * m[2][1] * ",
- "m[0][3]);",
- "float cof13 = m[0][0] * m[2][1] * m[3][2] + m[2][0] * m[3][1] * m[0][2] + m[3][0] * ",
- "m[0][1] * m[2][2]",
- " - m[0][0] * m[3][1] * m[2][2] - m[2][0] * m[0][1] * m[3][2] - m[3][0] * m[2][1] * ",
- "m[0][2];",
- "float cof20 = m[0][1] * m[1][2] * m[3][3] + m[1][1] * m[3][2] * m[0][3] + m[3][1] * ",
- "m[0][2] * m[1][3]",
- " - m[0][1] * m[3][2] * m[1][3] - m[1][1] * m[0][2] * m[3][3] - m[3][1] * m[1][2] * ",
- "m[0][3];",
- "float cof21 = -(m[0][0] * m[1][2] * m[3][3] + m[1][0] * m[3][2] * m[0][3] + m[3][0] * ",
- "m[0][2] * m[1][3]",
- " - m[0][0] * m[3][2] * m[1][3] - m[1][0] * m[0][2] * m[3][3] - m[3][0] * m[1][2] * ",
- "m[0][3]);",
- "float cof22 = m[0][0] * m[1][1] * m[3][3] + m[1][0] * m[3][1] * m[0][3] + m[3][0] * ",
- "m[0][1] * m[1][3]",
- " - m[0][0] * m[3][1] * m[1][3] - m[1][0] * m[0][1] * m[3][3] - m[3][0] * m[1][1] * ",
- "m[0][3];",
- "float cof23 = -(m[0][0] * m[1][1] * m[3][2] + m[1][0] * m[3][1] * m[0][2] + m[3][0] * ",
- "m[0][1] * m[1][2]",
- " - m[0][0] * m[3][1] * m[1][2] - m[1][0] * m[0][1] * m[3][2] - m[3][0] * m[1][1] * ",
- "m[0][2]);",
- "float cof30 = -(m[0][1] * m[1][2] * m[2][3] + m[1][1] * m[2][2] * m[0][3] + m[2][1] * ",
- "m[0][2] * m[1][3]",
- " - m[0][1] * m[2][2] * m[1][3] - m[1][1] * m[0][2] * m[2][3] - m[2][1] * m[1][2] * ",
- "m[0][3]);",
- "float cof31 = m[0][0] * m[1][2] * m[2][3] + m[1][0] * m[2][2] * m[0][3] + m[2][0] * ",
- "m[0][2] * m[1][3]",
- " - m[0][0] * m[2][2] * m[1][3] - m[1][0] * m[0][2] * m[2][3] - m[2][0] * m[1][2] * ",
- "m[0][3];",
- "float cof32 = -(m[0][0] * m[1][1] * m[2][3] + m[1][0] * m[2][1] * m[0][3] + m[2][0] * ",
- "m[0][1] * m[1][3]",
- " - m[0][0] * m[2][1] * m[1][3] - m[1][0] * m[0][1] * m[2][3] - m[2][0] * m[1][1] * ",
- "m[0][3]);",
- "float cof33 = m[0][0] * m[1][1] * m[2][2] + m[1][0] * m[2][1] * m[0][2] + m[2][0] * ",
- "m[0][1] * m[1][2]",
- " - m[0][0] * m[2][1] * m[1][2] - m[1][0] * m[0][1] * m[2][2] - m[2][0] * m[1][1] * ",
- "m[0][2];",
- "float4x4 cof = { cof00, cof10, cof20, cof30, cof01, cof11, cof21, cof31,",
- " cof02, cof12, cof22, cof32, cof03, cof13, cof23, cof33 };",
- "return cof / determinant(transpose(m));"
- ]
- },
- {
- "comment":[
- "Emulate ESSL3 variant of mix that takes last argument as boolean vector.",
- "genType mix(genType x, genType y, genBType a): Selects which vector each returned component",
- "comes from. For a component of 'a' that is false, the corresponding component of 'x' is",
- "returned. For a component of 'a' that is true, the corresponding component of 'y' is returned."
- ],
- "op":"mix",
- "return_type":"float",
- "args":[
- "float x",
- "float y",
- "bool a"
- ],
- "body":[
- "return a ? y : x;"
- ]
- },
- {
- "op":"mix",
- "return_type":"float2",
- "args":[
- "float2 x",
- "float2 y",
- "bool2 a"
- ],
- "body":[
- "return a ? y : x;"
- ]
- },
- {
- "op":"mix",
- "return_type":"float3",
- "args":[
- "float3 x",
- "float3 y",
- "bool3 a"
- ],
- "body":[
- "return a ? y : x;"
- ]
- },
- {
- "op":"mix",
- "return_type":"float4",
- "args":[
- "float4 x",
- "float4 y",
- "bool4 a"
- ],
- "body":[
- "return a ? y : x;"
- ]
- },
- {
- "op":"bitfieldExtract",
- "return_type":"uint",
- "args":[
- "uint value",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return 0u;",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint mask = ((maskMsb - 1u) | maskMsb) << offset;",
- "return (value & mask) >> offset;"
- ]
- },
- {
- "op":"bitfieldExtract",
- "return_type":"uint2",
- "args":[
- "uint2 value",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return uint2(0u, 0u);",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint mask = ((maskMsb - 1u) | maskMsb) << offset;",
- "return (value & mask) >> offset;"
- ]
- },
- {
- "op":"bitfieldExtract",
- "return_type":"uint3",
- "args":[
- "uint3 value",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return uint3(0u, 0u, 0u);",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint mask = ((maskMsb - 1u) | maskMsb) << offset;",
- "return (value & mask) >> offset;"
- ]
- },
- {
- "op":"bitfieldExtract",
- "return_type":"uint4",
- "args":[
- "uint4 value",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return uint4(0u, 0u, 0u, 0u);",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint mask = ((maskMsb - 1u) | maskMsb) << offset;",
- "return (value & mask) >> offset;"
- ]
- },
- {
- "op":"bitfieldExtract",
- "return_type":"int",
- "args":[
- "int value",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return 0;",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint mask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint resultUnsigned = (asuint(value) & mask) >> offset;",
- "if (bits != 32 && (resultUnsigned & maskMsb) != 0)",
- "{",
- " uint higherBitsMask = ((1u << (32 - bits)) - 1u) << bits;",
- " resultUnsigned |= higherBitsMask;",
- "}",
- "return asint(resultUnsigned);"
- ]
- },
- {
- "op":"bitfieldExtract",
- "return_type":"int2",
- "args":[
- "int2 value",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return int2(0, 0);",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint mask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint2 resultUnsigned = (asuint(value) & mask) >> offset;",
- "if (bits != 32)",
- "{",
- " uint higherBitsMask = ((1u << (32 - bits)) - 1u) << bits;",
- " resultUnsigned |= ((resultUnsigned & maskMsb) >> (bits - 1)) * higherBitsMask;",
- "}",
- "return asint(resultUnsigned);"
- ]
- },
- {
- "op":"bitfieldExtract",
- "return_type":"int3",
- "args":[
- "int3 value",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return int3(0, 0, 0);",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint mask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint3 resultUnsigned = (asuint(value) & mask) >> offset;",
- "if (bits != 32)",
- "{",
- " uint higherBitsMask = ((1u << (32 - bits)) - 1u) << bits;",
- " resultUnsigned |= ((resultUnsigned & maskMsb) >> (bits - 1)) * higherBitsMask;",
- "}",
- "return asint(resultUnsigned);"
- ]
- },
- {
- "op":"bitfieldExtract",
- "return_type":"int4",
- "args":[
- "int4 value",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return int4(0, 0, 0, 0);",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint mask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint4 resultUnsigned = (asuint(value) & mask) >> offset;",
- "if (bits != 32)",
- "{",
- " uint higherBitsMask = ((1u << (32 - bits)) - 1u) << bits;",
- " resultUnsigned |= ((resultUnsigned & maskMsb) >> (bits - 1)) * higherBitsMask;",
- "}",
- "return asint(resultUnsigned);"
- ]
- },
- {
- "op":"bitfieldInsert",
- "return_type":"uint",
- "args":[
- "uint base",
- "uint insert",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return base;",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint insertMask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint baseMask = ~insertMask;",
- "return (base & baseMask) | ((insert << offset) & insertMask);"
- ]
- },
- {
- "op":"bitfieldInsert",
- "return_type":"uint2",
- "args":[
- "uint2 base",
- "uint2 insert",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return base;",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint insertMask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint baseMask = ~insertMask;",
- "return (base & baseMask) | ((insert << offset) & insertMask);"
- ]
- },
- {
- "op":"bitfieldInsert",
- "return_type":"uint3",
- "args":[
- "uint3 base",
- "uint3 insert",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return base;",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint insertMask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint baseMask = ~insertMask;",
- "return (base & baseMask) | ((insert << offset) & insertMask);"
- ]
- },
- {
- "op":"bitfieldInsert",
- "return_type":"uint4",
- "args":[
- "uint4 base",
- "uint4 insert",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return base;",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint insertMask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint baseMask = ~insertMask;",
- "return (base & baseMask) | ((insert << offset) & insertMask);"
- ]
- },
- {
- "op":"bitfieldInsert",
- "return_type":"int",
- "args":[
- "int base",
- "int insert",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return base;",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint insertMask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint baseMask = ~insertMask;",
- "uint resultUnsigned = (asuint(base) & baseMask) | ((asuint(insert) << offset) & ",
- " insertMask);",
- "return asint(resultUnsigned);"
- ]
- },
- {
- "op":"bitfieldInsert",
- "return_type":"int2",
- "args":[
- "int2 base",
- "int2 insert",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return base;",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint insertMask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint baseMask = ~insertMask;",
- "uint2 resultUnsigned = (asuint(base) & baseMask) | ((asuint(insert) << offset) & ",
- " insertMask);",
- "return asint(resultUnsigned);"
- ]
- },
- {
- "op":"bitfieldInsert",
- "return_type":"int3",
- "args":[
- "int3 base",
- "int3 insert",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return base;",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint insertMask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint baseMask = ~insertMask;",
- "uint3 resultUnsigned = (asuint(base) & baseMask) | ((asuint(insert) << offset) & ",
- " insertMask);",
- "return asint(resultUnsigned);"
- ]
- },
- {
- "op":"bitfieldInsert",
- "return_type":"int4",
- "args":[
- "int4 base",
- "int4 insert",
- "int offset",
- "int bits"
- ],
- "body":[
- "if (offset < 0 || bits <= 0 || offset >= 32 || bits > 32 || offset + bits > 32)",
- "{",
- " return base;",
- "}",
- "uint maskMsb = (1u << (bits - 1));",
- "uint insertMask = ((maskMsb - 1u) | maskMsb) << offset;",
- "uint baseMask = ~insertMask;",
- "uint4 resultUnsigned = (asuint(base) & baseMask) | ((asuint(insert) << offset) & ",
- "insertMask);",
- "return asint(resultUnsigned);"
- ]
- },
- {
- "op":"uaddCarry",
- "return_type":"uint",
- "args":[
- "uint x",
- "uint y",
- "out uint carry"
- ],
- "body":[
- "carry = uint(x > (0xffffffffu - y));",
- "return x + y;"
- ]
- },
- {
- "op":"uaddCarry",
- "return_type":"uint2",
- "args":[
- "uint2 x",
- "uint2 y",
- "out uint2 carry"
- ],
- "body":[
- "carry = uint2(x > (0xffffffffu - y));",
- "return x + y;"
- ]
- },
- {
- "op":"uaddCarry",
- "return_type":"uint3",
- "args":[
- "uint3 x",
- "uint3 y",
- "out uint3 carry"
- ],
- "body":[
- "carry = uint3(x > (0xffffffffu - y));",
- "return x + y;"
- ]
- },
- {
- "op":"uaddCarry",
- "return_type":"uint4",
- "args":[
- "uint4 x",
- "uint4 y",
- "out uint4 carry"
- ],
- "body":[
- "carry = uint4(x > (0xffffffffu - y));",
- "return x + y;"
- ]
- },
- {
- "op":"usubBorrow",
- "return_type":"uint",
- "args":[
- "uint x",
- "uint y",
- "out uint borrow"
- ],
- "body":[
- "borrow = uint(x < y);",
- "return x - y;"
- ]
- },
- {
- "op":"usubBorrow",
- "return_type":"uint2",
- "args":[
- "uint2 x",
- "uint2 y",
- "out uint2 borrow"
- ],
- "body":[
- "borrow = uint2(x < y);",
- "return x - y;"
- ]
- },
- {
- "op":"usubBorrow",
- "return_type":"uint3",
- "args":[
- "uint3 x",
- "uint3 y",
- "out uint3 borrow"
- ],
- "body":[
- "borrow = uint3(x < y);",
- "return x - y;"
- ]
- },
- {
- "op":"usubBorrow",
- "return_type":"uint4",
- "args":[
- "uint4 x",
- "uint4 y",
- "out uint4 borrow"
- ],
- "body":[
- "borrow = uint4(x < y);",
- "return x - y;"
- ]
- }
-]