summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorJay Kwak <82421531+jkwak-work@users.noreply.github.com>2024-03-22 09:07:44 -0700
committerGitHub <noreply@github.com>2024-03-22 09:07:44 -0700
commit9b0df14cdf9d9ea8857b5b9d59505b18020f8414 (patch)
tree6003da52928259e4b38d05ad62c022211f090268 /source
parent00474731a90add7c0aaffc3a76d713ae2cecdbbe (diff)
Changes to make UE TSR working with Slang. (#3815)
Diffstat (limited to 'source')
-rw-r--r--source/slang/core.meta.slang53
-rw-r--r--source/slang/hlsl.meta.slang1
-rw-r--r--source/slang/slang-ast-support-types.h8
3 files changed, 57 insertions, 5 deletions
diff --git a/source/slang/core.meta.slang b/source/slang/core.meta.slang
index 27da512fa..1f4a2908d 100644
--- a/source/slang/core.meta.slang
+++ b/source/slang/core.meta.slang
@@ -1073,6 +1073,7 @@ __magic_type(MatrixExpressionType)
struct matrix : IArray<vector<T,C>>
{
__intrinsic_op($(kIROp_MakeMatrixFromScalar))
+ __implicit_conversion($(kConversionCost_ScalarToMatrix))
[TreatAsDifferentiable]
__init(T val);
@@ -1107,9 +1108,9 @@ extension vector<T,N> : IFloat
[__unsafeForceInlineEarly] float toFloat() { return __realCast<float>(this[0]); }
[OverloadRank(-1)]
- [__unsafeForceInlineEarly] __init(int v) { return vector<T,N>(T(v)); }
+ [__unsafeForceInlineEarly] __init(int v) { this = vector<T,N>(T(v)); }
[OverloadRank(-1)]
- [__unsafeForceInlineEarly] __init(float v) { return vector<T,N>(T(v)); }
+ [__unsafeForceInlineEarly] __init(float v) { this = vector<T,N>(T(v)); }
// IDifferentiable
@@ -1155,9 +1156,16 @@ extension matrix<T,N,M,L> : IFloat
[TreatAsDifferentiable][__unsafeForceInlineEarly] float toFloat() { return __realCast<float>(this[0][0]); }
[OverloadRank(-1)]
- [TreatAsDifferentiable][__unsafeForceInlineEarly] __init(int v) { return matrix<T,N,M>(T(v)); }
+ [TreatAsDifferentiable]
+ [__unsafeForceInlineEarly]
+ __implicit_conversion($(kConversionCost_ScalarIntegerToFloatMatrix))
+ __init(int v) { this = matrix<T,N,M>(T(v)); }
+
[OverloadRank(-1)]
- [TreatAsDifferentiable][__unsafeForceInlineEarly] __init(float v) { return matrix<T,N,M>(T(v)); }
+ [TreatAsDifferentiable]
+ [__unsafeForceInlineEarly]
+ __implicit_conversion($(kConversionCost_ScalarToMatrix))
+ __init(float v) { this = matrix<T,N,M>(T(v)); }
// IDifferentiable.
typedef matrix<T, N,M,L> Differential;
@@ -1185,6 +1193,14 @@ extension matrix<T,N,M,L> : IFloat
}
}
+__generic<let R : int, let C : int, let L : int>
+extension matrix<int16_t,R,C,L>
+{
+ typealias T = int16_t;
+ __implicit_conversion($(kConversionCost_IntegerTruncate))
+ __init(int value) { this = matrix<T,R,C,L>(T(value)); }
+}
+
${{{{
static const struct {
char const* name;
@@ -1232,6 +1248,22 @@ for (int tt = 0; tt < kTypeCount; ++tt)
}
}
+sb << "\n\n";
+sb << "// Cast from vector<T,1> to T, which is a scalar type\n";
+
+for (int tt = 0; tt < kBaseTypeCount; ++tt)
+{
+ if(kBaseTypes[tt].tag == BaseType::Void) continue;
+
+ const char* tname = kBaseTypes[tt].name;
+
+ sb << "extension " << tname << "\n";
+ sb << "{\n";
+ sb << " __implicit_conversion(" << kConversionCost_OneVectorToScalar << ")\n";
+ sb << " __init(vector<" << tname << ",1> v) { this = v[0]; }\n";
+ sb << "}\n";
+}
+
// Declare additional built-in generic types
}}}}
@@ -1426,6 +1458,19 @@ for( int C = 2; C <= 4; ++C )
if(rr == R && cc == C) continue;
sb << "__intrinsic_op(" << int(kIROp_MatrixReshape) << ") __init(matrix<T," << rr << "," << cc << ", L> value);\n";
}
+
+ // Initialize from matrix and vector
+ if (R > 2)
+ {
+ sb << "__init(matrix<T," << (R - 1) << "," << C << "> m, vector<T," << C << "> row" << (R - 1) << ") ";
+ sb << "{ this = This(";
+ for (int ii = 0; ii < R - 1; ++ii)
+ {
+ sb << "m[" << ii << "], ";
+ }
+ sb << "row" << (R - 1) << "); }\n";
+ }
+
sb << "}\n";
}
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index d2dfe6267..27ac6c415 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -7172,6 +7172,7 @@ __target_intrinsic(glsl)
__target_intrinsic(spirv, "OpTranspose resultType resultId _0")
[__readNone]
[PreferRecompute]
+[OverloadRank(-1)]
matrix<T, M, N> transpose(matrix<T, N, M> x)
{
matrix<T, M, N> result;
diff --git a/source/slang/slang-ast-support-types.h b/source/slang/slang-ast-support-types.h
index d3529b963..4ad5fc432 100644
--- a/source/slang/slang-ast-support-types.h
+++ b/source/slang/slang-ast-support-types.h
@@ -143,6 +143,9 @@ namespace Slang
// Default case (usable for user-defined conversions)
kConversionCost_Default = 500,
+ // Cost of converting an integer to int16_t
+ kConversionCost_IntegerTruncate = 700,
+
// Catch-all for conversions that should be discouraged
// (i.e., that really shouldn't be made implicitly)
//
@@ -156,7 +159,10 @@ namespace Slang
// Additional conversion cost to add when promoting from a scalar to
// a vector (this will be added to the cost, if any, of converting
// the element type of the vector)
- kConversionCost_ScalarToVector = 1,
+ kConversionCost_OneVectorToScalar = 1,
+ kConversionCost_ScalarToVector = 2,
+ kConversionCost_ScalarToMatrix = 10,
+ kConversionCost_ScalarIntegerToFloatMatrix = kConversionCost_IntegerToFloatConversion + kConversionCost_ScalarToMatrix,
// Additional cost when casting an LValue.
kConversionCost_LValueCast = 800,