Not dup barrier in HL level. (#3181)
This commit is contained in:
Родитель
b0c029eebd
Коммит
d0fa5e301b
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
Загрузка…
Ссылка в новой задаче