From 77d60b72daaa045eb8fab8783699e2dcaf297e1e Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 9 Jun 2020 18:17:24 +0100 Subject: [PATCH] Save address space in pointer types --- .../driver/shaders/dxil/dxil_bytecode.cpp | 4 +--- renderdoc/driver/shaders/dxil/dxil_bytecode.h | 19 +++++++++++++++++-- .../driver/shaders/dxil/dxil_disassemble.cpp | 18 +++++++++++++----- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp index bb3f7d17c..628359153 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp @@ -741,9 +741,7 @@ Program::Program(const byte *bytes, size_t length) { m_Types[typeIndex].type = Type::Pointer; m_Types[typeIndex].inner = &m_Types[(size_t)typ.ops[0]]; - - if(typ.ops.size() > 1 && typ.ops[1] != 0) - RDCERR("Ignoring address space on pointer type"); + m_Types[typeIndex].addrSpace = Type::PointerAddrSpace(typ.ops[1]); typeIndex++; } diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.h b/renderdoc/driver/shaders/dxil/dxil_bytecode.h index 1a27c268d..8ae7f3b20 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.h +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.h @@ -62,12 +62,27 @@ struct Type Int, } scalarType = Void; + enum PointerAddrSpace + { + Default = 0, + DeviceMemory = 1, + CBuffer = 2, + GroupShared = 3, + GenericPointer = 4, + ImmediateCBuffer = 5, + }; + bool isVoid() const { return type == Scalar && scalarType == Void; } rdcstr toString() const; rdcstr declFunction(rdcstr funcName) const; - // for scalars, arrays, vectors - uint32_t bitWidth = 0, elemCount = 0; + // for scalars, arrays, vectors, pointers + union + { + uint32_t bitWidth = 0; + PointerAddrSpace addrSpace; + }; + uint32_t elemCount = 0; // the single inner type for pointers, vectors, or arrays, the return type for functions const Type *inner = NULL; diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index 6815f8983..d16730093 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -340,12 +340,16 @@ void Program::MakeDisassemblyString() m_Disassembly += "external "; else m_Disassembly += "internal "; + if(g.type->addrSpace) + m_Disassembly += StringFormat::Fmt("addrspace(%d) ", g.type->addrSpace); if(g.flags & GlobalFlags::LocalUnnamedAddr) m_Disassembly += "local_unnamed_addr "; else if(g.flags & GlobalFlags::GlobalUnnamedAddr) m_Disassembly += "unnamed_addr "; if(g.flags & GlobalFlags::IsConst) m_Disassembly += "constant "; + else + m_Disassembly += "global "; if(g.initialiser.type == SymbolType::Constant) m_Disassembly += m_Values[g.initialiser.idx].toString(true); @@ -1041,16 +1045,20 @@ rdcstr Type::toString() const } } case Vector: return StringFormat::Fmt("<%u x %s>", elemCount, inner->toString().c_str()); - case Pointer: return StringFormat::Fmt("%s*", inner->toString().c_str()); + case Pointer: + if(addrSpace == 0) + return StringFormat::Fmt("%s*", inner->toString().c_str()); + else + return StringFormat::Fmt("%s addrspace(%d)*", inner->toString().c_str(), addrSpace); case Array: return StringFormat::Fmt("[%u x %s]", elemCount, inner->toString().c_str()); case Function: return declFunction(rdcstr()); case Struct: { rdcstr ret; if(packedStruct) - ret = "<{"; + ret = "<{ "; else - ret = "{"; + ret = "{ "; for(size_t i = 0; i < members.size(); i++) { if(i > 0) @@ -1058,9 +1066,9 @@ rdcstr Type::toString() const ret += members[i]->toString(); } if(packedStruct) - ret += "}>"; + ret += " }>"; else - ret += "}"; + ret += " }"; return ret; }