From fc5c58a6c98aa12fee0137cbf1d449abd846cf5c Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 16 Jun 2020 12:53:06 +0100 Subject: [PATCH] Move reflection to separate file, implement GetOutputTopology() --- .../driver/shaders/dxil/dxil_bytecode.cpp | 97 ----------- .../driver/shaders/dxil/dxil_reflect.cpp | 159 ++++++++++++++++++ .../shaders/dxil/renderdoc_dxil.vcxproj | 1 + .../dxil/renderdoc_dxil.vcxproj.filters | 1 + 4 files changed, 161 insertions(+), 97 deletions(-) create mode 100644 renderdoc/driver/shaders/dxil/dxil_reflect.cpp diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp index b5d61ee07..7216c111f 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp @@ -51,15 +51,6 @@ struct ProgramHeader uint32_t BitcodeSize; // Size of LLVM bitcode. }; -enum class ShaderTag -{ - ShaderFlags = 0, - Geometry = 1, - Domain = 2, - Hull = 3, - Compute = 4, -}; - enum class KnownBlocks : uint32_t { BLOCKINFO = 0, @@ -2220,94 +2211,6 @@ Program::Program(const byte *bytes, size_t length) RDCASSERT(functionDecls.empty()); } -void Program::FetchComputeProperties(DXBC::Reflection *reflection) -{ - for(const Function &f : m_Functions) - { - if(f.name.beginsWith("dx.op.threadId")) - { - SigParameter param; - param.systemValue = ShaderBuiltin::DispatchThreadIndex; - param.compCount = 3; - param.regChannelMask = param.channelUsedMask = 0x7; - param.semanticIdxName = param.semanticName = "threadId"; - reflection->InputSig.push_back(param); - } - else if(f.name.beginsWith("dx.op.groupId")) - { - SigParameter param; - param.systemValue = ShaderBuiltin::GroupIndex; - param.compCount = 3; - param.regChannelMask = param.channelUsedMask = 0x7; - param.semanticIdxName = param.semanticName = "groupID"; - reflection->InputSig.push_back(param); - } - else if(f.name.beginsWith("dx.op.threadIdInGroup")) - { - SigParameter param; - param.systemValue = ShaderBuiltin::GroupThreadIndex; - param.compCount = 3; - param.regChannelMask = param.channelUsedMask = 0x7; - param.semanticIdxName = param.semanticName = "threadIdInGroup"; - reflection->InputSig.push_back(param); - } - else if(f.name.beginsWith("dx.op.flattenedThreadIdInGroup")) - { - SigParameter param; - param.systemValue = ShaderBuiltin::GroupFlatIndex; - param.compCount = 1; - param.regChannelMask = param.channelUsedMask = 0x1; - param.semanticIdxName = param.semanticName = "flattenedThreadIdInGroup"; - reflection->InputSig.push_back(param); - } - } - - for(size_t i = 0; i < m_NamedMeta.size(); i++) - { - if(m_NamedMeta[i].name == "dx.entryPoints") - { - // expect only one child for this, DX doesn't support multiple entry points for compute - // shaders - RDCASSERTEQUAL(m_NamedMeta[i].children.size(), 1); - Metadata &entry = *m_NamedMeta[i].children[0]; - RDCASSERTEQUAL(entry.children.size(), 5); - Metadata &tags = *entry.children[4]; - - for(size_t t = 0; t < tags.children.size(); t += 2) - { - RDCASSERT(tags.children[t]->value); - if(ShaderTag(tags.children[t]->val->val.uv[0]) == ShaderTag::Compute) - { - Metadata &threadDim = *tags.children[t + 1]; - RDCASSERTEQUAL(threadDim.children.size(), 3); - reflection->DispatchThreadsDimension[0] = threadDim.children[0]->val->val.uv[0]; - reflection->DispatchThreadsDimension[1] = threadDim.children[1]->val->val.uv[0]; - reflection->DispatchThreadsDimension[2] = threadDim.children[2]->val->val.uv[0]; - return; - } - } - - break; - } - } - RDCERR("Couldn't find thread dimension tag in shader"); - reflection->DispatchThreadsDimension[0] = 1; - reflection->DispatchThreadsDimension[1] = 1; - reflection->DispatchThreadsDimension[2] = 1; -} - -DXBC::Reflection *Program::GetReflection() -{ - RDCWARN("Unimplemented DXIL::Program::GetReflection()"); - return new DXBC::Reflection; -} - -D3D_PRIMITIVE_TOPOLOGY Program::GetOutputTopology() -{ - RDCERR("Unimplemented DXIL::Program::GetOutputTopology()"); - return D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; -} - uint32_t Program::GetOrAssignMetaID(Metadata *m) { if(m->id != ~0U) diff --git a/renderdoc/driver/shaders/dxil/dxil_reflect.cpp b/renderdoc/driver/shaders/dxil/dxil_reflect.cpp new file mode 100644 index 000000000..28146c1db --- /dev/null +++ b/renderdoc/driver/shaders/dxil/dxil_reflect.cpp @@ -0,0 +1,159 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2019-2020 Baldur Karlsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +#include "common/formatting.h" +#include "dxil_bytecode.h" + +namespace DXIL +{ +enum class ShaderTag +{ + ShaderFlags = 0, + Geometry = 1, + Domain = 2, + Hull = 3, + Compute = 4, +}; + +void Program::FetchComputeProperties(DXBC::Reflection *reflection) +{ + for(const Function &f : m_Functions) + { + if(f.name.beginsWith("dx.op.threadId")) + { + SigParameter param; + param.systemValue = ShaderBuiltin::DispatchThreadIndex; + param.compCount = 3; + param.regChannelMask = param.channelUsedMask = 0x7; + param.semanticIdxName = param.semanticName = "threadId"; + reflection->InputSig.push_back(param); + } + else if(f.name.beginsWith("dx.op.groupId")) + { + SigParameter param; + param.systemValue = ShaderBuiltin::GroupIndex; + param.compCount = 3; + param.regChannelMask = param.channelUsedMask = 0x7; + param.semanticIdxName = param.semanticName = "groupID"; + reflection->InputSig.push_back(param); + } + else if(f.name.beginsWith("dx.op.threadIdInGroup")) + { + SigParameter param; + param.systemValue = ShaderBuiltin::GroupThreadIndex; + param.compCount = 3; + param.regChannelMask = param.channelUsedMask = 0x7; + param.semanticIdxName = param.semanticName = "threadIdInGroup"; + reflection->InputSig.push_back(param); + } + else if(f.name.beginsWith("dx.op.flattenedThreadIdInGroup")) + { + SigParameter param; + param.systemValue = ShaderBuiltin::GroupFlatIndex; + param.compCount = 1; + param.regChannelMask = param.channelUsedMask = 0x1; + param.semanticIdxName = param.semanticName = "flattenedThreadIdInGroup"; + reflection->InputSig.push_back(param); + } + } + + for(size_t i = 0; i < m_NamedMeta.size(); i++) + { + if(m_NamedMeta[i].name == "dx.entryPoints") + { + // expect only one child for this, DX doesn't support multiple entry points for compute + // shaders + RDCASSERTEQUAL(m_NamedMeta[i].children.size(), 1); + Metadata &entry = *m_NamedMeta[i].children[0]; + RDCASSERTEQUAL(entry.children.size(), 5); + Metadata &tags = *entry.children[4]; + + for(size_t t = 0; t < tags.children.size(); t += 2) + { + RDCASSERT(tags.children[t]->value); + if(ShaderTag(tags.children[t]->val->val.uv[0]) == ShaderTag::Compute) + { + Metadata &threadDim = *tags.children[t + 1]; + RDCASSERTEQUAL(threadDim.children.size(), 3); + reflection->DispatchThreadsDimension[0] = threadDim.children[0]->val->val.uv[0]; + reflection->DispatchThreadsDimension[1] = threadDim.children[1]->val->val.uv[0]; + reflection->DispatchThreadsDimension[2] = threadDim.children[2]->val->val.uv[0]; + return; + } + } + + break; + } + } + + RDCERR("Couldn't find thread dimension tag in shader"); + + reflection->DispatchThreadsDimension[0] = 1; + reflection->DispatchThreadsDimension[1] = 1; + reflection->DispatchThreadsDimension[2] = 1; +} + +DXBC::Reflection *Program::GetReflection() +{ + RDCWARN("Unimplemented DXIL::Program::GetReflection()"); + return new DXBC::Reflection; +} + +D3D_PRIMITIVE_TOPOLOGY Program::GetOutputTopology() +{ + if(m_Type != DXBC::ShaderType::Geometry && m_Type != DXBC::ShaderType::Domain) + return D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; + + for(size_t i = 0; i < m_NamedMeta.size(); i++) + { + if(m_NamedMeta[i].name == "dx.entryPoints") + { + // expect only one child for this, DX doesn't support multiple entry points for compute + // shaders + RDCASSERTEQUAL(m_NamedMeta[i].children.size(), 1); + Metadata &entry = *m_NamedMeta[i].children[0]; + RDCASSERTEQUAL(entry.children.size(), 5); + Metadata &tags = *entry.children[4]; + + for(size_t t = 0; t < tags.children.size(); t += 2) + { + RDCASSERT(tags.children[t]->value); + if(ShaderTag(tags.children[t]->val->val.uv[0]) == ShaderTag::Geometry) + { + Metadata &geomData = *tags.children[t + 1]; + RDCASSERTEQUAL(geomData.children.size(), 5); + return (D3D_PRIMITIVE_TOPOLOGY)geomData.children[3]->val->val.uv[0]; + } + } + + break; + } + } + + RDCERR("Couldn't find topology tag in shader"); + + return D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST; +} + +}; // namespace DXIL diff --git a/renderdoc/driver/shaders/dxil/renderdoc_dxil.vcxproj b/renderdoc/driver/shaders/dxil/renderdoc_dxil.vcxproj index bce780867..f8539798c 100644 --- a/renderdoc/driver/shaders/dxil/renderdoc_dxil.vcxproj +++ b/renderdoc/driver/shaders/dxil/renderdoc_dxil.vcxproj @@ -104,6 +104,7 @@ + Create diff --git a/renderdoc/driver/shaders/dxil/renderdoc_dxil.vcxproj.filters b/renderdoc/driver/shaders/dxil/renderdoc_dxil.vcxproj.filters index a18d63d64..69fffce90 100644 --- a/renderdoc/driver/shaders/dxil/renderdoc_dxil.vcxproj.filters +++ b/renderdoc/driver/shaders/dxil/renderdoc_dxil.vcxproj.filters @@ -8,6 +8,7 @@ +