Skip to content

Commit 969dd4c

Browse files
authored
Support atomic intrinsics for Metal (shader-slang#4473)
* Support atomic intrinsics for Metal This commit adds a support for the atomic intrinsics in Metal. The atomic member functions for buffers is not implemented yet. Metal requires the first argument for the atomic functions to be an atomic data type. This implementation rely on the fact that we can do a C-style type casting from a regular data type to an atomic data type.
1 parent 63e0064 commit 969dd4c

8 files changed

+598
-77
lines changed

source/slang/hlsl.meta.slang

+223-74
Large diffs are not rendered by default.

source/slang/slang-emit-c-like.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2889,6 +2889,7 @@ void CLikeSourceEmitter::_emitInst(IRInst* inst)
28892889
case kIROp_AtomicCounterIncrement:
28902890
case kIROp_AtomicCounterDecrement:
28912891
case kIROp_StructuredBufferGetDimensions:
2892+
case kIROp_MetalAtomicCast:
28922893
emitInstStmt(inst);
28932894
break;
28942895

source/slang/slang-emit-metal.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,24 @@ bool MetalSourceEmitter::tryEmitInstStmtImpl(IRInst* inst)
253253
case kIROp_discard:
254254
m_writer->emit("discard_fragment();\n");
255255
return true;
256+
case kIROp_MetalAtomicCast:
257+
{
258+
auto oldValName = getName(inst);
259+
auto op0 = inst->getOperand(0);
260+
261+
m_writer->emit("atomic_");
262+
emitType(op0->getDataType());
263+
m_writer->emit(" ");
264+
m_writer->emit(oldValName);
265+
m_writer->emit(" = ");
266+
267+
m_writer->emit("((atomic_");
268+
emitType(op0->getDataType());
269+
m_writer->emit(")(");
270+
emitOperand(op0, getInfo(EmitOp::General));
271+
m_writer->emit("));\n");
272+
return true;
273+
}
256274
}
257275
return false;
258276
}

source/slang/slang-ir-inst-defs.h

+1
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,7 @@ INST(GetLegalizedSPIRVGlobalParamAddr, GetLegalizedSPIRVGlobalParamAddr, 1, 0)
685685
INST(GetPerVertexInputArray, GetPerVertexInputArray, 1, 0)
686686

687687
INST(ForceVarIntoStructTemporarily, ForceVarIntoStructTemporarily, 1, 0)
688+
INST(MetalAtomicCast, MetalAtomicCast, 1, 0)
688689

689690
INST(MakeArrayList, makeArrayList, 0, 0)
690691
INST(MakeTensorView, makeTensorView, 0, 0)

tests/bugs/atomic-coerce.slang

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj
22
//TEST(compute,vulkan):COMPARE_COMPUTE_EX:-vk -slang -compute -shaderobj
3-
//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
3+
//TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
44

55
//TEST_INPUT:ubuffer(data=[0 0 0 0 ], stride=4):out,name outputBuffer
66
RWStructuredBuffer<int> outputBuffer;

tests/compute/atomics-groupshared.slang

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
55
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -vk -shaderobj
66
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -cuda -shaderobj
7-
//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
7+
//TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
88

99
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
1010

tests/compute/atomics.slang

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj
55
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -vk -shaderobj
66
//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -cuda -shaderobj
7-
//DISABLE_TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
7+
//TEST(compute):COMPARE_COMPUTE:-slang -shaderobj -mtl
88

99
//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out, name outputBuffer
1010

0 commit comments

Comments
 (0)