diff options
| author | venkataram-nv <vedavamadath@nvidia.com> | 2025-08-09 00:46:09 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-09 07:46:09 +0000 |
| commit | b7df3c7aa27301f88e31ed0a7bbf230688adab6a (patch) | |
| tree | c8a123c32d8a54ed49728c9cf504e42f0eec1d74 /source/slang | |
| parent | 06b8e69740a40e5cc9fdaac472a9242534876e5b (diff) | |
Fix atomics error diagnostics (#8117)
Fixes #8116
---------
Co-authored-by: Jay Kwak <82421531+jkwak-work@users.noreply.github.com>
Diffstat (limited to 'source/slang')
| -rw-r--r-- | source/slang/hlsl.meta.slang | 11 | ||||
| -rw-r--r-- | source/slang/slang-emit-metal.cpp | 20 |
2 files changed, 14 insertions, 17 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 07f59ac46..b8243d6e4 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -22582,18 +22582,21 @@ extension _Texture<float, Shape, 0, 0, 0, $(kCoreModule_ResourceAccessReadWrite) [__requiresNVAPI] [ForceInline] __glsl_extension(GL_EXT_shader_atomic_float) - [require(glsl_hlsl_spirv, atomic_glsl_hlsl_nvapi_cuda_metal_float1)] + [require(glsl_hlsl_metal_spirv, atomic_glsl_hlsl_nvapi_cuda_metal_float1)] void InterlockedAddF32(vector<uint, Shape.dimensions> coord, float value, out float originalValue) { __target_switch { - default: - originalValue = __atomic_add(this[coord], value); - return; case hlsl: __intrinsic_asm "$3 = NvInterlockedAddFp32($0, $1, $2)"; case glsl: __intrinsic_asm "$3 = imageAtomicAdd($0, $1, $2)"; + case metal: + originalValue = __atomic_add(this[coord], value); + return; + default: + originalValue = __atomic_add(this[coord], value); + return; } } diff --git a/source/slang/slang-emit-metal.cpp b/source/slang/slang-emit-metal.cpp index 7dd0c19ad..1915be58b 100644 --- a/source/slang/slang-emit-metal.cpp +++ b/source/slang/slang-emit-metal.cpp @@ -400,12 +400,12 @@ bool MetalSourceEmitter::tryEmitInstStmtImpl(IRInst* inst) else m_writer->emit(");\n"); }; - auto diagnoseFloatAtommic = [&]() + auto diagnoseFloatAtomic = [&]() { getSink()->diagnose( inst, Diagnostics::unsupportedTargetIntrinsic, - "floating point atomic operation"); + "Unsupported floating point atomic operation"); }; switch (inst->getOp()) { @@ -433,7 +433,7 @@ bool MetalSourceEmitter::tryEmitInstStmtImpl(IRInst* inst) case kIROp_AtomicLoad: { if (isFloatingType(inst->getDataType())) - diagnoseFloatAtommic(); + diagnoseFloatAtomic(); emitInstResultDecl(inst); bool isImageOp = false; @@ -488,7 +488,7 @@ bool MetalSourceEmitter::tryEmitInstStmtImpl(IRInst* inst) case kIROp_AtomicExchange: { if (isFloatingType(inst->getDataType())) - diagnoseFloatAtommic(); + diagnoseFloatAtomic(); emitAtomicOp("atomic_exchange", "atomic_exchange_explicit"); return true; @@ -496,7 +496,7 @@ bool MetalSourceEmitter::tryEmitInstStmtImpl(IRInst* inst) case kIROp_AtomicCompareExchange: { if (isFloatingType(inst->getDataType())) - diagnoseFloatAtommic(); + diagnoseFloatAtomic(); bool isImageOp = false; auto imageSubscript = isTextureAccess(inst); @@ -543,17 +543,11 @@ bool MetalSourceEmitter::tryEmitInstStmtImpl(IRInst* inst) } case kIROp_AtomicAdd: { - if (isFloatingType(inst->getDataType())) - diagnoseFloatAtommic(); - emitAtomicOp("atomic_fetch_add", "atomic_fetch_add_explicit"); return true; } case kIROp_AtomicSub: { - if (isFloatingType(inst->getDataType())) - diagnoseFloatAtommic(); - emitAtomicOp("atomic_fetch_sub", "atomic_fetch_sub_explicit"); return true; } @@ -575,7 +569,7 @@ bool MetalSourceEmitter::tryEmitInstStmtImpl(IRInst* inst) case kIROp_AtomicMin: { if (isFloatingType(inst->getDataType())) - diagnoseFloatAtommic(); + diagnoseFloatAtomic(); emitAtomicOp("atomic_fetch_min", "atomic_fetch_min_explicit"); return true; @@ -583,7 +577,7 @@ bool MetalSourceEmitter::tryEmitInstStmtImpl(IRInst* inst) case kIROp_AtomicMax: { if (isFloatingType(inst->getDataType())) - diagnoseFloatAtommic(); + diagnoseFloatAtomic(); emitAtomicOp("atomic_fetch_max", "atomic_fetch_max_explicit"); return true; |
