From 97f302eef584ac5c85baff74d8f453d0067705ae Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Wed, 14 Apr 2021 12:30:58 -0400 Subject: Fix for vector initialization combinations (#1794) * #include an absolute path didn't work - because paths were taken to always be relative. * Made vector init combinations explicit. * Add test for vector initialization. * Small comment change - really just to retrigger TC. --- source/slang/core.meta.slang | 72 ++++++++++++++------------------------------ 1 file changed, 23 insertions(+), 49 deletions(-) (limited to 'source') diff --git a/source/slang/core.meta.slang b/source/slang/core.meta.slang index 6b20dbc3b..934d30c18 100644 --- a/source/slang/core.meta.slang +++ b/source/slang/core.meta.slang @@ -427,60 +427,34 @@ struct ParameterBlock {} //@ hidden: -${{{{ - -static const char* kComponentNames[]{ "x", "y", "z", "w" }; -static const char* kVectorNames[]{ "", "x", "xy", "xyz", "xyzw" }; - // Need to add constructors to the types above -for (int N = 2; N <= 4; ++N) -{ - sb << "__generic __extension vector\n{\n"; - - // initialize from N scalars - sb << "__init("; - for (int ii = 0; ii < N; ++ii) - { - if (ii != 0) sb << ", "; - sb << "T " << kComponentNames[ii]; - } - sb << ");\n"; - - // Initialize from an M-vector and then scalars - for (int M = 2; M < N; ++M) - { - sb << "__init(vector " << kVectorNames[M]; - for (int ii = M; ii < N; ++ii) - { - sb << ", T " << kComponentNames[ii]; - } - sb << ");\n"; - } - // Initialize from two vectors, of size M and N-M - for(int M = 2; M <= (N-2); ++M) - { - int K = N - M; - SLANG_ASSERT(K >= 2); +__generic __extension vector +{ + __init(T x, T y); +} +__generic __extension vector +{ + __init(T x, T y, T z); + __init(vector xy, T z); + __init(T x, vector yz); +} +__generic __extension vector +{ + __init(T x, T y, T z, T w); + __init(vector xy, T z, T w); + __init(T x, vector yz, T w); + __init(T x, T y, vector zw); + __init(vector xy, vector zw); + __init(vector xyz, T w); + __init(T x, vector yzw); +} - sb << "__init(vector " << kVectorNames[M]; - sb << ", vector "; - for (int ii = 0; ii < K; ++ii) - { - // The component names for the second parameter - // must start at `M`, so that we get signatures like: - // - // __init(float2 xy, float2 zw) - // - sb << kComponentNames[M + ii]; - } - sb << ");\n"; - } +${{{{ - sb << "}\n"; -} +static const char* kComponentNames[]{ "x", "y", "z", "w" }; -// The above extension was generic in the *type* of the vector, +// The above extensions are generic in the *type* of the vector, // but explicit in the *size*. We will now declare an extension // for each builtin type that is generic in the size. // -- cgit v1.2.3