diff options
| author | Jay Kwak <82421531+jkwak-work@users.noreply.github.com> | 2024-04-29 14:14:05 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-29 14:14:05 -0700 |
| commit | 019d68fc14dd006c179417ffdb06827abe089a53 (patch) | |
| tree | 3c408be9438a8205ac5b90ffdc5c970315aa51b9 /source/slang/core.meta.slang | |
| parent | 1a40819995a1089db8942cad7e770bda85cc0b77 (diff) | |
Replace __target_intrinsics and __specialize_for_target, part 1 (#4050)
* Replace __target_intrinsics and __specialize_for_target
Partially resolves #3906
Most but not all __target_intrinsics are replaced with __target_switch.
All __specialize_for_target are replaced with __target_switch.
This change is mostly processed by a temporary c++ program mechanically.
Because the change is already too big, the remaining __target_intrinsics
will be replaced later in another commit.
* Fix indentations
* Add diff.meta.slang
* Revert the change in __sizeOf<>().
"$G0" doesn't seem to work. It needs to be addressed later.
* Revert more functions that use `$G0` keyword
Diffstat (limited to 'source/slang/core.meta.slang')
| -rw-r--r-- | source/slang/core.meta.slang | 97 |
1 files changed, 70 insertions, 27 deletions
diff --git a/source/slang/core.meta.slang b/source/slang/core.meta.slang index f8012af1d..85d530254 100644 --- a/source/slang/core.meta.slang +++ b/source/slang/core.meta.slang @@ -891,26 +891,31 @@ __magic_type(StringType) __intrinsic_type($(kIROp_StringType)) struct String { - __target_intrinsic(cpp) + [require(cpp)] __intrinsic_op($(kIROp_MakeString)) __init(int val); - __target_intrinsic(cpp) + + [require(cpp)] __intrinsic_op($(kIROp_MakeString)) __init(uint val); - __target_intrinsic(cpp) + + [require(cpp)] __intrinsic_op($(kIROp_MakeString)) __init(int64_t val); - __target_intrinsic(cpp) + + [require(cpp)] __intrinsic_op($(kIROp_MakeString)) __init(uint64_t val); - __target_intrinsic(cpp) + + [require(cpp)] __intrinsic_op($(kIROp_MakeString)) __init(float val); - __target_intrinsic(cpp) + + [require(cpp)] __intrinsic_op($(kIROp_MakeString)) __init(double val); - __target_intrinsic(cpp) + [require(cpp)] int64_t getLength(); property int length @@ -925,11 +930,23 @@ __magic_type(NativeStringType) __intrinsic_type($(kIROp_NativeStringType)) struct NativeString { - __target_intrinsic(cpp, "int(strlen($0))") - int getLength(); + [require(cpp)] + int getLength() + { + __target_switch + { + case cpp: __intrinsic_asm "int(strlen($0))"; + } + } - __target_intrinsic(cpp, "(void*)((const char*)($0))") - Ptr<void> getBuffer(); + [require(cpp)] + Ptr<void> getBuffer() + { + __target_switch + { + case cpp: __intrinsic_asm "(void*)((const char*)($0))"; + } + } property int length { [__unsafeForceInlineEarly] get{return getLength();} } @@ -1968,45 +1985,71 @@ int getStringHash(String string); /// Use will produce a syntax error in downstream compiler /// Useful for testing diagnostics around compilation errors of downstream compiler /// It 'returns' an int so can be used in expressions without the front end complaining. -__target_intrinsic(hlsl, " @ ") -__target_intrinsic(glsl, " @ ") -__target_intrinsic(cuda, " @ ") -__target_intrinsic(cpp, " @ ") -int __SyntaxError(); +[require(cpp_cuda_glsl_hlsl)] +int __SyntaxError() +{ + __target_switch + { + case cpp: __intrinsic_asm " @ "; + case cuda: __intrinsic_asm " @ "; + case glsl: __intrinsic_asm " @ "; + case hlsl: __intrinsic_asm " @ "; + } +} /// For downstream compilers that allow sizeof/alignof/offsetof /// Can't be called in the C/C++ style. Need to use __size_of<some_type>() as opposed to sizeof(some_type). __generic<T> -__target_intrinsic(cuda, "sizeof($G0)") __target_intrinsic(cpp, "sizeof($G0)") +__target_intrinsic(cuda, "sizeof($G0)") [__readNone] +[require(cpp_cuda)] int __sizeOf(); __generic<T> -__target_intrinsic(cuda, "sizeof($T0)") -__target_intrinsic(cpp, "sizeof($T0)") [__readNone] -int __sizeOf(T v); +[require(cpp_cuda)] +int __sizeOf(T v) +{ + __target_switch + { + case cpp: __intrinsic_asm "sizeof($T0)"; + case cuda: __intrinsic_asm "sizeof($T0)"; + } +} __generic<T> __target_intrinsic(cuda, "SLANG_ALIGN_OF($G0)") __target_intrinsic(cpp, "SLANG_ALIGN_OF($G0)") [__readNone] +[require(cpp_cuda)] int __alignOf(); __generic<T> -__target_intrinsic(cuda, "SLANG_ALIGN_OF($T0)") -__target_intrinsic(cpp, "SLANG_ALIGN_OF($T0)") [__readNone] -int __alignOf(T v); +[require(cpp_cuda)] +int __alignOf(T v) +{ + __target_switch + { + case cpp: __intrinsic_asm "SLANG_ALIGN_OF($T0)"; + case cuda: __intrinsic_asm "SLANG_ALIGN_OF($T0)"; + } +} // It would be nice to have offsetof equivalent, but it's not clear how that would work in terms of the Slang language. // Here we allow calculating the offset of a field in bytes from an *instance* of the type. __generic<T,F> -__target_intrinsic(cuda, "int(((char*)&($1)) - ((char*)&($0)))") -__target_intrinsic(cpp, "int(((char*)&($1)) - ((char*)&($0))") [__readNone] -int __offsetOf(in T t, in F field); +[require(cpp_cuda)] +int __offsetOf(in T t, in F field) +{ + __target_switch + { + case cpp: __intrinsic_asm "int(((char*)&($1)) - ((char*)&($0))"; + case cuda: __intrinsic_asm "int(((char*)&($1)) - ((char*)&($0)))"; + } +} /// Mark beginning of "interlocked" operations in a fragment shader. __glsl_extension(GL_ARB_fragment_shader_interlock) @@ -2639,4 +2682,4 @@ __attributeTarget(FuncDecl) attribute_syntax [DerivativeGroupLinear] : DerivativeGroupLinearAttribute; __attributeTarget(FuncDecl) -attribute_syntax [noRefInline] : NoRefInlineAttribute;
\ No newline at end of file +attribute_syntax [noRefInline] : NoRefInlineAttribute; |
