summaryrefslogtreecommitdiff
path: root/source/slang/hlsl.meta.slang
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2018-05-29 11:39:55 -0700
committerGitHub <noreply@github.com>2018-05-29 11:39:55 -0700
commite7a83323bfc4dd698ef491375a37c65c83915951 (patch)
tree4dc8d7ac5c192817a6d3fa680b731723ff9eba27 /source/slang/hlsl.meta.slang
parentace9a8dc7e4353b1cf8e846abe2b8dc53ecdbc59 (diff)
Fix global atomic functions (#582)
Fixes #581 This change adds a new parameter passing mode `__ref` to exist alongisde `in`, `out`, and `inout`. The `__ref` modifier indicates true by-reference parameter passing (whereas `inout` is copy-in-copy-out). This is not intended to be something that users interact with directly, but rather a low-level feature that lets us provide a correct signature for the `Interlocked*()` operations in the standard library. Most of the support for passing what are logically addresses around already exists in the IR, so the majority of the work here is just in introducing the new type `Ref<T>` and then using it appropriately when lowering `__ref` parameters/arguments to the IR.
Diffstat (limited to 'source/slang/hlsl.meta.slang')
-rw-r--r--source/slang/hlsl.meta.slang32
1 files changed, 16 insertions, 16 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index bf235eb3c..152e9faa1 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -617,32 +617,32 @@ __target_intrinsic(glsl, "groupMemoryBarrier()); (barrier()")
void GroupMemoryBarrierWithGroupSync();
// Atomics
-void InterlockedAdd(in out int dest, int value, out int original_value);
-void InterlockedAdd(in out uint dest, uint value, out uint original_value);
+void InterlockedAdd(__ref int dest, int value, out int original_value);
+void InterlockedAdd(__ref uint dest, uint value, out uint original_value);
-void InterlockedAnd(in out int dest, int value, out int original_value);
-void InterlockedAnd(in out uint dest, uint value, out uint original_value);
+void InterlockedAnd(__ref int dest, int value, out int original_value);
+void InterlockedAnd(__ref uint dest, uint value, out uint original_value);
-void InterlockedCompareExchange(in out int dest, int compare_value, int value, out int original_value);
-void InterlockedCompareExchange(in out uint dest, uint compare_value, uint value, out uint original_value);
+void InterlockedCompareExchange(__ref int dest, int compare_value, int value, out int original_value);
+void InterlockedCompareExchange(__ref uint dest, uint compare_value, uint value, out uint original_value);
-void InterlockedCompareStore(in out int dest, int compare_value, int value);
-void InterlockedCompareStore(in out uint dest, uint compare_value, uint value);
+void InterlockedCompareStore(__ref int dest, int compare_value, int value);
+void InterlockedCompareStore(__ref uint dest, uint compare_value, uint value);
-void InterlockedExchange(in out int dest, int value, out int original_value);
-void InterlockedExchange(in out uint dest, uint value, out uint original_value);
+void InterlockedExchange(__ref int dest, int value, out int original_value);
+void InterlockedExchange(__ref uint dest, uint value, out uint original_value);
-void InterlockedMax(in out int dest, int value, out int original_value);
-void InterlockedMax(in out uint dest, uint value, out uint original_value);
+void InterlockedMax(__ref int dest, int value, out int original_value);
+void InterlockedMax(__ref uint dest, uint value, out uint original_value);
void InterlockedMin(in out int dest, int value, out int original_value);
void InterlockedMin(in out uint dest, uint value, out uint original_value);
-void InterlockedOr(in out int dest, int value, out int original_value);
-void InterlockedOr(in out uint dest, uint value, out uint original_value);
+void InterlockedOr(__ref int dest, int value, out int original_value);
+void InterlockedOr(__ref uint dest, uint value, out uint original_value);
-void InterlockedXor(in out int dest, int value, out int original_value);
-void InterlockedXor(in out uint dest, uint value, out uint original_value);
+void InterlockedXor(__ref int dest, int value, out int original_value);
+void InterlockedXor(__ref uint dest, uint value, out uint original_value);
// Is floating-point value finite?
__generic<T : __BuiltinFloatingPointType> bool isfinite(T x);