diff options
| -rw-r--r-- | source/slang/core.meta.slang | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/source/slang/core.meta.slang b/source/slang/core.meta.slang index 36e9d6885..19421735c 100644 --- a/source/slang/core.meta.slang +++ b/source/slang/core.meta.slang @@ -1988,8 +1988,18 @@ extension vector<T,N> : IFloat [OverloadRank(-1)] [__unsafeForceInlineEarly] __init(float v) { this = vector<T,N>(T(v)); } - // IDifferentiable +} + +__intrinsic_op($(kIROp_Add)) +T __internal_add<T>(T a, T b); +__intrinsic_op($(kIROp_Mul)) +T __internal_mul<T, U>(U a, T b); + +__generic<T:IDifferentiable, let N : int> +extension vector<T,N> : IDifferentiable +{ + // IDifferentiable typedef vector<T, N> Differential; [__unsafeForceInlineEarly] @@ -2003,7 +2013,7 @@ extension vector<T,N> : IFloat [BackwardDifferentiable] static Differential dadd(Differential a, Differential b) { - return a + b; + return __internal_add(a, b); } __generic<U : __BuiltinRealType> @@ -2011,7 +2021,7 @@ extension vector<T,N> : IFloat [BackwardDifferentiable] static Differential dmul(U a, Differential b) { - return __realCast<T, U>(a) * b; + return __internal_mul(__realCast<float>(a), b); } } @@ -2042,7 +2052,11 @@ extension matrix<T,N,M,L> : IFloat [__unsafeForceInlineEarly] __implicit_conversion($(kConversionCost_ScalarToMatrix)) __init(float v) { this = matrix<T,N,M>(T(v)); } +} +__generic<T:IDifferentiable, let N : int, let M : int, let L : int> +extension matrix<T,N,M,L> : IDifferentiable +{ // IDifferentiable. typedef matrix<T, N,M,L> Differential; @@ -2057,15 +2071,15 @@ extension matrix<T,N,M,L> : IFloat [BackwardDifferentiable] static Differential dadd(Differential a, Differential b) { - return a + b; + return __internal_add(a, b); } - + __generic<U : __BuiltinRealType> [__unsafeForceInlineEarly] [BackwardDifferentiable] static Differential dmul(U a, Differential b) { - return __realCast<T, U>(a) * b; + return __internal_mul(__realCast<float>(a), b); } } |
