diff options
| author | Jay Kwak <82421531+jkwak-work@users.noreply.github.com> | 2024-03-22 09:07:44 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-22 09:07:44 -0700 |
| commit | 9b0df14cdf9d9ea8857b5b9d59505b18020f8414 (patch) | |
| tree | 6003da52928259e4b38d05ad62c022211f090268 /source | |
| parent | 00474731a90add7c0aaffc3a76d713ae2cecdbbe (diff) | |
Changes to make UE TSR working with Slang. (#3815)
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/core.meta.slang | 53 | ||||
| -rw-r--r-- | source/slang/hlsl.meta.slang | 1 | ||||
| -rw-r--r-- | source/slang/slang-ast-support-types.h | 8 |
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, |
