Skip to content

Commit f30f49f

Browse files
committed
Determine threadscope for DXBC and DXIL shaders
1 parent 1a6f62c commit f30f49f

File tree

8 files changed

+57
-3
lines changed

8 files changed

+57
-3
lines changed

renderdoc/driver/shaders/dxbc/dxbc_bytecode.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,6 +1126,7 @@ class Program
11261126
uint32_t GetMajorVersion() const { return m_Major; }
11271127
uint32_t GetMinorVersion() const { return m_Minor; }
11281128
bool IsShaderModel51() const { return m_Major == 5 && m_Minor == 1; }
1129+
DXBC::ThreadScope GetThreadScope() const { return m_Threadscope; }
11291130
D3D_PRIMITIVE_TOPOLOGY GetOutputTopology();
11301131
const rdcstr &GetDisassembly()
11311132
{
@@ -1163,6 +1164,7 @@ class Program
11631164

11641165
DXBC::ShaderType m_Type = DXBC::ShaderType::Max;
11651166
uint32_t m_Major = 0, m_Minor = 0;
1167+
DXBC::ThreadScope m_Threadscope = DXBC::ThreadScope::Thread;
11661168

11671169
rdcarray<uint32_t> m_ProgramWords;
11681170

renderdoc/driver/shaders/dxbc/dxbc_bytecode_ops.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,10 @@ void Program::DecodeProgram()
782782
else
783783
m_LateDeclarations.back().push_back(decl);
784784
}
785+
786+
if(decl.declaration == OPCODE_DCL_THREAD_GROUP_SHARED_MEMORY_RAW ||
787+
decl.declaration == OPCODE_DCL_THREAD_GROUP_SHARED_MEMORY_STRUCTURED)
788+
m_Threadscope |= DXBC::ThreadScope::Workgroup;
785789
}
786790
else
787791
{
@@ -791,6 +795,9 @@ void Program::DecodeProgram()
791795
if(op.operation == OPCODE_HS_CONTROL_POINT_PHASE || op.operation == OPCODE_HS_FORK_PHASE ||
792796
op.operation == OPCODE_HS_JOIN_PHASE)
793797
m_LateDeclarations.push_back({});
798+
799+
if(decl.declaration == OPCODE_SYNC)
800+
m_Threadscope |= DXBC::ThreadScope::Workgroup;
794801
}
795802
}
796803

renderdoc/driver/shaders/dxbc/dxbc_common.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,16 @@ enum class ShaderType : uint8_t
8585

8686
ShaderStage GetShaderStage(ShaderType type);
8787

88+
enum class ThreadScope : uint32_t
89+
{
90+
Thread = 0,
91+
Quad = 0x1,
92+
Subgroup = 0x2,
93+
Workgroup = 0x4,
94+
};
95+
96+
BITMASK_OPERATORS(ThreadScope);
97+
8898
/////////////////////////////////////////////////////////////////////////
8999
// the below classes basically mimics the existing reflection interface.
90100
//

renderdoc/driver/shaders/dxbc/dxbc_container.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ const rdcstr &DXBCContainer::GetDisassembly(bool dxcStyle)
661661
globalFlagsString += commentString + " Resource descriptor heap indexing\n";
662662
if(m_GlobalFlags & GlobalShaderFlags::SamplerDescriptorHeapIndexing)
663663
globalFlagsString += commentString + " Sampler descriptor heap indexing\n";
664-
if(m_GlobalFlags & GlobalShaderFlags::Reserved)
664+
if(m_GlobalFlags & GlobalShaderFlags::WaveMatrix)
665665
globalFlagsString += commentString + " Wave Matrix\n";
666666
if(m_GlobalFlags & GlobalShaderFlags::AtomicInt64OnHeapResource)
667667
globalFlagsString += commentString + " 64-bit Atomics on Heap Resources\n";
@@ -697,6 +697,7 @@ const rdcstr &DXBCContainer::GetDisassembly(bool dxcStyle)
697697
m_Disassembly += "// Vendor shader extensions in use\n";
698698

699699
m_Disassembly += m_DXBCByteCode->GetDisassembly();
700+
m_Threadscope = m_DXBCByteCode->GetThreadScope();
700701
}
701702
else if(m_DXILByteCode)
702703
{
@@ -720,7 +721,14 @@ const rdcstr &DXBCContainer::GetDisassembly(bool dxcStyle)
720721
#endif
721722

722723
m_Disassembly += m_DXILByteCode->GetDisassembly(dxcStyle, m_Reflection);
724+
m_Threadscope = m_DXILByteCode->GetThreadScope();
723725
}
726+
727+
if(m_Type == DXBC::ShaderType::Pixel)
728+
m_Threadscope |= ThreadScope::Quad;
729+
730+
if(m_GlobalFlags & GlobalShaderFlags::WaveOps)
731+
m_Threadscope |= ThreadScope::Subgroup;
724732
}
725733

726734
return m_Disassembly;

renderdoc/driver/shaders/dxbc/dxbc_container.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ enum class GlobalShaderFlags : int64_t
138138
DerivativesInMeshAndAmpShaders = 0x1000000,
139139
ResourceDescriptorHeapIndexing = 0x2000000,
140140
SamplerDescriptorHeapIndexing = 0x4000000,
141-
Reserved = 0x8000000,
141+
WaveMatrix = 0x8000000,
142142
AtomicInt64OnHeapResource = 0x10000000,
143143
AdvancedTextureOps = 0x20000000,
144144
WriteableMSAATextures = 0x40000000,
@@ -207,6 +207,11 @@ class DXBCContainer
207207
const IDebugInfo *GetDebugInfo() const { return m_DebugInfo; }
208208
const Reflection *GetReflection() const { return m_Reflection; }
209209
D3D_PRIMITIVE_TOPOLOGY GetOutputTopology();
210+
ThreadScope GetThreadScope()
211+
{
212+
GetDisassembly(false);
213+
return m_Threadscope;
214+
}
210215

211216
CBufferVariableType GetRayPayload(const ShaderEntryPoint &entry)
212217
{
@@ -306,6 +311,7 @@ class DXBCContainer
306311

307312
rdcflatmap<ShaderEntryPoint, rdcpair<CBufferVariableType, CBufferVariableType>> m_RayPayloads;
308313

314+
ThreadScope m_Threadscope = ThreadScope::Thread;
309315
ShaderStatistics m_ShaderStats;
310316
DXBCBytecode::Program *m_DXBCByteCode = NULL;
311317
DXIL::Program *m_DXILByteCode = NULL;

renderdoc/driver/shaders/dxil/dxil_bytecode.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1617,6 +1617,8 @@ class Program : public DXBC::IDebugInfo
16171617
void FetchEntryPoint();
16181618
DXBC::Reflection *BuildReflection();
16191619

1620+
DXBC::ThreadScope GetThreadScope() const { return m_Threadscope; }
1621+
16201622
rdcstr GetDefaultCommandLine() const { return "-T " + m_Profile; }
16211623

16221624
rdcstr GetDebugStatus();
@@ -1717,6 +1719,7 @@ class Program : public DXBC::IDebugInfo
17171719

17181720
rdcstr m_CompilerSig, m_EntryPoint, m_Profile;
17191721
ShaderCompileFlags m_CompileFlags;
1722+
DXBC::ThreadScope m_Threadscope = DXBC::ThreadScope::Thread;
17201723

17211724
const Type *m_CurParseType = NULL;
17221725

renderdoc/driver/shaders/dxil/dxil_disassemble.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,23 @@ void Program::Parse(const DXBC::Reflection *reflection)
11581158
m_SsaAliases.clear();
11591159
ParseReferences(reflection);
11601160

1161+
if(m_Type == DXBC::ShaderType::Compute || m_Type == DXBC::ShaderType::Amplification ||
1162+
m_Type == DXBC::ShaderType::Mesh)
1163+
{
1164+
for(GlobalVar *g : m_GlobalVars)
1165+
{
1166+
RDCASSERT(g->type->type == Type::Pointer);
1167+
if(g->type->type == Type::Pointer && g->type->addrSpace == Type::PointerAddrSpace::GroupShared)
1168+
m_Threadscope |= DXBC::ThreadScope::Workgroup;
1169+
}
1170+
1171+
for(Function *f : m_Functions)
1172+
{
1173+
if(f->name == "dx.op.barrier")
1174+
m_Threadscope |= DXBC::ThreadScope::Workgroup;
1175+
}
1176+
}
1177+
11611178
m_Parsed = true;
11621179
}
11631180

renderdoc/driver/shaders/spirv/spirv_processor.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,7 @@ struct Section
539539

540540
enum class ThreadScope : uint32_t
541541
{
542+
Thread = 0,
542543
Quad = 0x1,
543544
Subgroup = 0x2,
544545
Workgroup = 0x4,
@@ -637,7 +638,7 @@ class Processor
637638

638639
LogicalSection m_Sections[Section::Count];
639640

640-
ThreadScope m_ThreadScope;
641+
ThreadScope m_ThreadScope = ThreadScope::Thread;
641642

642643
private:
643644
struct DeferredMemberDecoration

0 commit comments

Comments
 (0)