Selaa lähdekoodia

Not dup barrier in HL level. (#3181)

Xiang Li 4 vuotta sitten
vanhempi
commit
d0fa5e301b

+ 15 - 1
lib/HLSL/HLOperations.cpp

@@ -455,9 +455,23 @@ static void SetHLFunctionAttribute(Function *F, HLOpcodeGroup group,
     F->addFnAttr(Attribute::ReadNone);
     F->addFnAttr(Attribute::NoUnwind);
   } break;
+  case HLOpcodeGroup::HLIntrinsic: {
+    IntrinsicOp intrinsicOp = static_cast<IntrinsicOp>(opcode);
+    switch (intrinsicOp) {
+    default:
+      break;
+    case IntrinsicOp::IOP_DeviceMemoryBarrierWithGroupSync:
+    case IntrinsicOp::IOP_DeviceMemoryBarrier:
+    case IntrinsicOp::IOP_GroupMemoryBarrierWithGroupSync:
+    case IntrinsicOp::IOP_GroupMemoryBarrier:
+    case IntrinsicOp::IOP_AllMemoryBarrierWithGroupSync:
+    case IntrinsicOp::IOP_AllMemoryBarrier:
+      F->addFnAttr(Attribute::NoDuplicate);
+      break;
+    }
+  } break;
   case HLOpcodeGroup::NotHL:
   case HLOpcodeGroup::HLExtIntrinsic:
-  case HLOpcodeGroup::HLIntrinsic:
   case HLOpcodeGroup::HLSelect:
   case HLOpcodeGroup::NumOfHLOps:
     // No default attributes for these opcodes.

+ 33 - 0
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/barrier/no_dup.hlsl

@@ -0,0 +1,33 @@
+// RUN: %dxc -T cs_6_3 %s | FileCheck %s
+
+// Make sure only 2 barrier.
+// CHECK: call void @dx.op.barrier(i32 80, i32 9)
+// CHECK: call void @dx.op.barrier(i32 80, i32 9)
+// CHECK-NOT: call void @dx.op.barrier(i32 80, i32 9)
+
+RWStructuredBuffer<uint> _CoarseStencilBuffer;
+uint stencilBufferWidth;
+
+groupshared uint g_GroupsharedValue;
+
+[numthreads(8, 8, 1)]
+void main(uint3 groupId : SV_GroupID,
+          uint threadIndex : SV_GroupIndex)
+{
+	uint threadValue = 1 << (threadIndex/2);
+
+    bool isFirstThreadInGroup = threadIndex == 0;
+
+    if (isFirstThreadInGroup)
+        g_GroupsharedValue = 0;
+
+    GroupMemoryBarrierWithGroupSync();
+    InterlockedOr(g_GroupsharedValue, threadValue);
+    GroupMemoryBarrierWithGroupSync();
+
+    if (isFirstThreadInGroup)
+    {
+        uint addressIndex = groupId.y * stencilBufferWidth + groupId.x;
+        _CoarseStencilBuffer[addressIndex] = g_GroupsharedValue;
+    }
+}