diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.h b/renderdoc/driver/shaders/dxil/dxil_bytecode.h index ace93c961..b03d0c373 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.h +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.h @@ -31,6 +31,7 @@ #include "common/common.h" #include "driver/dx/official/d3dcommon.h" #include "driver/shaders/dxbc/dxbc_common.h" +#include "driver/shaders/dxil/dxil_common.h" #define DXC_COMPATIBLE_DISASM OPTION_OFF @@ -1142,6 +1143,29 @@ private: void assignTypeId(const Constant *c); }; +struct EntryPoint +{ + EntryPoint(const Metadata *entryPoint); + + struct Signature + { + Signature(const Metadata *signature); + rdcstr name; + ComponentType type; + D3D_INTERPOLATION_MODE interpolation; + uint32_t rows; + uint32_t cols; + int32_t startRow; + int32_t startCol; + }; + + rdcstr name; + const Type *function; + rdcarray inputs; + rdcarray outputs; + rdcarray patchConstants; +}; + class Program : public DXBC::IDebugInfo { public: @@ -1196,6 +1220,7 @@ protected: uint32_t GetMetaSlot(const DebugLocation *l) const; void AssignMetaSlot(rdcarray &metaSlots, uint32_t &nextMetaSlot, DebugLocation &l); + void FetchEntryPoints(rdcarray &entryPoints); const Metadata *FindMetadata(uint32_t slot) const; rdcstr ArgToString(const Value *v, bool withTypes, const rdcstr &attrString = "") const; rdcstr DisassembleComDats(int &instructionLine) const; diff --git a/renderdoc/driver/shaders/dxil/dxil_reflect.cpp b/renderdoc/driver/shaders/dxil/dxil_reflect.cpp index a495b5f7e..4fbb355cb 100644 --- a/renderdoc/driver/shaders/dxil/dxil_reflect.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_reflect.cpp @@ -245,6 +245,110 @@ struct TypeInfo } }; +EntryPoint::Signature::Signature(const Metadata *signature) +{ + /* + static const unsigned kDxilSignatureElementID = 0; // Unique element ID. + static const unsigned kDxilSignatureElementName = 1; // Element name. + static const unsigned kDxilSignatureElementType = 2; // Element type. + static const unsigned kDxilSignatureElementSystemValue = 3; // Effective system value. + static const unsigned kDxilSignatureElementIndexVector = 4; // Semantic index vector. + static const unsigned kDxilSignatureElementInterpMode = 5; // Interpolation mode. + static const unsigned kDxilSignatureElementRows = 6; // Number of rows. + static const unsigned kDxilSignatureElementCols = 7; // Number of columns. + static const unsigned kDxilSignatureElementStartRow = 8; // Element packing start row. + static const unsigned kDxilSignatureElementStartCol = 9; // Element packing start column. + static const unsigned kDxilSignatureElementNameValueList = 10; // Name-value list for extended +properties. + + // Extended properties + static const unsigned kDxilSignatureElementOutputStreamTag = 0; + static const unsigned kHLSignatureElementGlobalSymbolTag = 1; + static const unsigned kDxilSignatureElementDynIdxCompMaskTag = 2; + static const unsigned kDxilSignatureElementUsageCompMaskTag = 3; + */ + + name = signature->children[1]->str; + type = getival(signature->children[2]); + interpolation = getival(signature->children[5]); + rows = getival(signature->children[6]); + cols = getival(signature->children[7]); + startRow = getival(signature->children[8]); + startCol = getival(signature->children[9]); +} + +EntryPoint::EntryPoint(const Metadata *entryPoint) +{ + function = entryPoint->children[0]->type; + name = entryPoint->children[1]->str; + + const Metadata *signatures = entryPoint->children[2]; + { + const Metadata *ins = signatures->children[0]; + if(ins) + { + for(size_t i = 0; i < ins->children.size(); ++i) + inputs.push_back(ins->children[i]); + } + const Metadata *outs = signatures->children[1]; + if(outs) + { + for(size_t i = 0; i < outs->children.size(); ++i) + outputs.push_back(outs->children[i]); + } + const Metadata *patchCons = signatures->children[2]; + if(patchCons) + { + for(size_t i = 0; i < patchCons->children.size(); ++i) + patchConstants.push_back(patchCons->children[i]); + } + } + + // SRVs, UAVs, CBs, Samplers + // const Metadata *resources = entryPoint->children[3]; + /* + static const unsigned kDxilShaderFlagsTag = 0; + static const unsigned kDxilGSStateTag = 1; + static const unsigned kDxilDSStateTag = 2; + static const unsigned kDxilHSStateTag = 3; + static const unsigned kDxilNumThreadsTag = 4; + static const unsigned kDxilAutoBindingSpaceTag = 5; + static const unsigned kDxilRayPayloadSizeTag = 6; + static const unsigned kDxilRayAttribSizeTag = 7; + static const unsigned kDxilShaderKindTag = 8; + static const unsigned kDxilMSStateTag = 9; + static const unsigned kDxilASStateTag = 10; + static const unsigned kDxilWaveSizeTag = 11; + static const unsigned kDxilEntryRootSigTag = 12; + static const unsigned kDxilNodeLaunchTypeTag = 13; + static const unsigned kDxilNodeIsProgramEntryTag = 14; + static const unsigned kDxilNodeIdTag = 15; + static const unsigned kDxilNodeLocalRootArgumentsTableIndexTag = 16; + static const unsigned kDxilShareInputOfTag = 17; + static const unsigned kDxilNodeDispatchGridTag = 18; + static const unsigned kDxilNodeMaxRecursionDepthTag = 19; + static const unsigned kDxilNodeInputsTag = 20; + static const unsigned kDxilNodeOutputsTag = 21; + static const unsigned kDxilNodeMaxDispatchGridTag = 22; + static const unsigned kDxilRangedWaveSizeTag = 23; + */ + // const Metadata *properties = entryPoint->children[4]; +} + +struct EntryPointsInfo +{ + EntryPointsInfo(const Metadata *entryPoints) + { + if(!entryPoints) + return; + + for(size_t c = 0; c < entryPoints->children.size(); ++c) + entryPointsData.emplace_back(entryPoints->children[c]); + } + + rdcarray entryPointsData; +}; + static DXBC::CBufferVariableType MakePayloadType(const TypeInfo &typeInfo, const Type *t) { using namespace DXBC; @@ -331,6 +435,14 @@ static DXBC::CBufferVariableType MakePayloadType(const TypeInfo &typeInfo, const return ret; } +void Program::FetchEntryPoints(rdcarray &entryPoints) +{ + DXMeta dx(m_NamedMeta); + + EntryPointsInfo entryPointsInfo(dx.entryPoints); + entryPoints = entryPointsInfo.entryPointsData; +} + void Program::FetchComputeProperties(DXBC::Reflection *reflection) { DXMeta dx(m_NamedMeta);