SPV: HLSL: Move to correct HLSL barrier semantics, per Khronos recommendation.

This commit is contained in:
John Kessenich 2017-12-12 22:50:53 -07:00
parent c72e5937dd
commit 838d7afc61
5 changed files with 46 additions and 37 deletions

View File

@ -1762,8 +1762,9 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
case glslang::EOpMemoryBarrierImage: case glslang::EOpMemoryBarrierImage:
case glslang::EOpMemoryBarrierShared: case glslang::EOpMemoryBarrierShared:
case glslang::EOpGroupMemoryBarrier: case glslang::EOpGroupMemoryBarrier:
case glslang::EOpDeviceMemoryBarrier:
case glslang::EOpAllMemoryBarrierWithGroupSync: case glslang::EOpAllMemoryBarrierWithGroupSync:
case glslang::EOpGroupMemoryBarrierWithGroupSync: case glslang::EOpDeviceMemoryBarrierWithGroupSync:
case glslang::EOpWorkgroupMemoryBarrier: case glslang::EOpWorkgroupMemoryBarrier:
case glslang::EOpWorkgroupMemoryBarrierWithGroupSync: case glslang::EOpWorkgroupMemoryBarrierWithGroupSync:
noReturnValue = true; noReturnValue = true;
@ -5466,21 +5467,28 @@ spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv:
spv::MemorySemanticsAcquireReleaseMask); spv::MemorySemanticsAcquireReleaseMask);
return 0; return 0;
case glslang::EOpAllMemoryBarrierWithGroupSync: case glslang::EOpAllMemoryBarrierWithGroupSync:
// Control barrier with non-"None" semantic is also a memory barrier. builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeDevice,
builder.createControlBarrier(spv::ScopeDevice, spv::ScopeDevice,
spv::MemorySemanticsAllMemory | spv::MemorySemanticsAllMemory |
spv::MemorySemanticsSequentiallyConsistentMask); spv::MemorySemanticsAcquireReleaseMask);
return 0; return 0;
case glslang::EOpGroupMemoryBarrierWithGroupSync: case glslang::EOpDeviceMemoryBarrier:
// Control barrier with non-"None" semantic is also a memory barrier. builder.createMemoryBarrier(spv::ScopeDevice, spv::MemorySemanticsUniformMemoryMask |
builder.createControlBarrier(spv::ScopeDevice, spv::ScopeDevice, spv::MemorySemanticsCrossWorkgroupMemoryMask); spv::MemorySemanticsImageMemoryMask |
spv::MemorySemanticsAcquireReleaseMask);
return 0;
case glslang::EOpDeviceMemoryBarrierWithGroupSync:
builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeDevice, spv::MemorySemanticsUniformMemoryMask |
spv::MemorySemanticsImageMemoryMask |
spv::MemorySemanticsAcquireReleaseMask);
return 0; return 0;
case glslang::EOpWorkgroupMemoryBarrier: case glslang::EOpWorkgroupMemoryBarrier:
builder.createMemoryBarrier(spv::ScopeWorkgroup, spv::MemorySemanticsWorkgroupMemoryMask); builder.createMemoryBarrier(spv::ScopeWorkgroup, spv::MemorySemanticsWorkgroupMemoryMask |
spv::MemorySemanticsAcquireReleaseMask);
return 0; return 0;
case glslang::EOpWorkgroupMemoryBarrierWithGroupSync: case glslang::EOpWorkgroupMemoryBarrierWithGroupSync:
// Control barrier with non-"None" semantic is also a memory barrier. builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeWorkgroup,
builder.createControlBarrier(spv::ScopeWorkgroup, spv::ScopeWorkgroup, spv::MemorySemanticsWorkgroupMemoryMask); spv::MemorySemanticsWorkgroupMemoryMask |
spv::MemorySemanticsAcquireReleaseMask);
return 0; return 0;
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
case glslang::EOpTime: case glslang::EOpTime:

View File

@ -7,8 +7,8 @@ local_size = (1, 1, 1)
0:? Sequence 0:? Sequence
0:4 MemoryBarrier ( temp void) 0:4 MemoryBarrier ( temp void)
0:5 AllMemoryBarrierWithGroupSync ( temp void) 0:5 AllMemoryBarrierWithGroupSync ( temp void)
0:6 GroupMemoryBarrier ( temp void) 0:6 DeviceMemoryBarrier ( temp void)
0:7 GroupMemoryBarrierWithGroupSync ( temp void) 0:7 DeviceMemoryBarrierWithGroupSync ( temp void)
0:8 WorkgroupMemoryBarrier ( temp void) 0:8 WorkgroupMemoryBarrier ( temp void)
0:9 WorkgroupMemoryBarrierWithGroupSync ( temp void) 0:9 WorkgroupMemoryBarrierWithGroupSync ( temp void)
0:11 Branch: Return with expression 0:11 Branch: Return with expression
@ -35,8 +35,8 @@ local_size = (1, 1, 1)
0:? Sequence 0:? Sequence
0:4 MemoryBarrier ( temp void) 0:4 MemoryBarrier ( temp void)
0:5 AllMemoryBarrierWithGroupSync ( temp void) 0:5 AllMemoryBarrierWithGroupSync ( temp void)
0:6 GroupMemoryBarrier ( temp void) 0:6 DeviceMemoryBarrier ( temp void)
0:7 GroupMemoryBarrierWithGroupSync ( temp void) 0:7 DeviceMemoryBarrierWithGroupSync ( temp void)
0:8 WorkgroupMemoryBarrier ( temp void) 0:8 WorkgroupMemoryBarrier ( temp void)
0:9 WorkgroupMemoryBarrierWithGroupSync ( temp void) 0:9 WorkgroupMemoryBarrierWithGroupSync ( temp void)
0:11 Branch: Return with expression 0:11 Branch: Return with expression
@ -53,18 +53,18 @@ local_size = (1, 1, 1)
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80003 // Generated by (magic number): 80003
// Id's are bound by 23 // Id's are bound by 22
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint GLCompute 4 "ComputeShaderFunction" 21 EntryPoint GLCompute 4 "ComputeShaderFunction" 20
ExecutionMode 4 LocalSize 1 1 1 ExecutionMode 4 LocalSize 1 1 1
Source HLSL 500 Source HLSL 500
Name 4 "ComputeShaderFunction" Name 4 "ComputeShaderFunction"
Name 8 "@ComputeShaderFunction(" Name 8 "@ComputeShaderFunction("
Name 21 "@entryPointOutput" Name 20 "@entryPointOutput"
Decorate 21(@entryPointOutput) Location 0 Decorate 20(@entryPointOutput) Location 0
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeFloat 32 6: TypeFloat 32
@ -72,26 +72,25 @@ local_size = (1, 1, 1)
10: TypeInt 32 0 10: TypeInt 32 0
11: 10(int) Constant 1 11: 10(int) Constant 1
12: 10(int) Constant 4040 12: 10(int) Constant 4040
13: 10(int) Constant 4048 13: 10(int) Constant 2
14: 10(int) Constant 2 14: 10(int) Constant 2120
15: 10(int) Constant 512 15: 10(int) Constant 264
16: 10(int) Constant 256 16: 6(float) Constant 0
17: 6(float) Constant 0 19: TypePointer Output 6(float)
20: TypePointer Output 6(float) 20(@entryPointOutput): 19(ptr) Variable Output
21(@entryPointOutput): 20(ptr) Variable Output
4(ComputeShaderFunction): 2 Function None 3 4(ComputeShaderFunction): 2 Function None 3
5: Label 5: Label
22: 6(float) FunctionCall 8(@ComputeShaderFunction() 21: 6(float) FunctionCall 8(@ComputeShaderFunction()
Store 21(@entryPointOutput) 22 Store 20(@entryPointOutput) 21
Return Return
FunctionEnd FunctionEnd
8(@ComputeShaderFunction(): 6(float) Function None 7 8(@ComputeShaderFunction(): 6(float) Function None 7
9: Label 9: Label
MemoryBarrier 11 12 MemoryBarrier 11 12
ControlBarrier 11 11 13 ControlBarrier 13 11 12
MemoryBarrier 14 12 MemoryBarrier 11 14
ControlBarrier 11 11 15 ControlBarrier 13 11 14
MemoryBarrier 14 16 MemoryBarrier 13 15
ControlBarrier 14 14 16 ControlBarrier 13 13 15
ReturnValue 17 ReturnValue 16
FunctionEnd FunctionEnd

View File

@ -722,7 +722,8 @@ enum TOperator {
EOpInterlockedOr, // ... EOpInterlockedOr, // ...
EOpInterlockedXor, // ... EOpInterlockedXor, // ...
EOpAllMemoryBarrierWithGroupSync, // memory barriers without non-hlsl AST equivalents EOpAllMemoryBarrierWithGroupSync, // memory barriers without non-hlsl AST equivalents
EOpGroupMemoryBarrierWithGroupSync, // ... EOpDeviceMemoryBarrier, // ...
EOpDeviceMemoryBarrierWithGroupSync, // ...
EOpWorkgroupMemoryBarrier, // ... EOpWorkgroupMemoryBarrier, // ...
EOpWorkgroupMemoryBarrierWithGroupSync, // ... EOpWorkgroupMemoryBarrierWithGroupSync, // ...
EOpEvaluateAttributeSnapped, // InterpolateAtOffset with int position on 16x16 grid EOpEvaluateAttributeSnapped, // InterpolateAtOffset with int position on 16x16 grid

View File

@ -791,7 +791,8 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
case EOpGenMul: out.debug << "mul"; break; case EOpGenMul: out.debug << "mul"; break;
case EOpAllMemoryBarrierWithGroupSync: out.debug << "AllMemoryBarrierWithGroupSync"; break; case EOpAllMemoryBarrierWithGroupSync: out.debug << "AllMemoryBarrierWithGroupSync"; break;
case EOpGroupMemoryBarrierWithGroupSync: out.debug << "GroupMemoryBarrierWithGroupSync"; break; case EOpDeviceMemoryBarrier: out.debug << "DeviceMemoryBarrier"; break;
case EOpDeviceMemoryBarrierWithGroupSync: out.debug << "DeviceMemoryBarrierWithGroupSync"; break;
case EOpWorkgroupMemoryBarrier: out.debug << "WorkgroupMemoryBarrier"; break; case EOpWorkgroupMemoryBarrier: out.debug << "WorkgroupMemoryBarrier"; break;
case EOpWorkgroupMemoryBarrierWithGroupSync: out.debug << "WorkgroupMemoryBarrierWithGroupSync"; break; case EOpWorkgroupMemoryBarrierWithGroupSync: out.debug << "WorkgroupMemoryBarrierWithGroupSync"; break;

View File

@ -1087,8 +1087,8 @@ void TBuiltInParseablesHlsl::identifyBuiltIns(int /*version*/, EProfile /*profil
symbolTable.relateToOperator("ddy_fine", EOpDPdyFine); symbolTable.relateToOperator("ddy_fine", EOpDPdyFine);
symbolTable.relateToOperator("degrees", EOpDegrees); symbolTable.relateToOperator("degrees", EOpDegrees);
symbolTable.relateToOperator("determinant", EOpDeterminant); symbolTable.relateToOperator("determinant", EOpDeterminant);
symbolTable.relateToOperator("DeviceMemoryBarrier", EOpGroupMemoryBarrier); symbolTable.relateToOperator("DeviceMemoryBarrier", EOpDeviceMemoryBarrier);
symbolTable.relateToOperator("DeviceMemoryBarrierWithGroupSync", EOpGroupMemoryBarrierWithGroupSync); // ... symbolTable.relateToOperator("DeviceMemoryBarrierWithGroupSync", EOpDeviceMemoryBarrierWithGroupSync);
symbolTable.relateToOperator("distance", EOpDistance); symbolTable.relateToOperator("distance", EOpDistance);
symbolTable.relateToOperator("dot", EOpDot); symbolTable.relateToOperator("dot", EOpDot);
symbolTable.relateToOperator("dst", EOpDst); symbolTable.relateToOperator("dst", EOpDst);