From c053912608b929c29006e68912b9a3bd24f697c2 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 20 Jul 2022 13:49:03 +0100 Subject: [PATCH] Add explicit DXIL shader encoding --- qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp | 4 +++- renderdoc/api/replay/renderdoc_tostr.inl | 1 + renderdoc/api/replay/replay_enums.h | 7 +++++++ renderdoc/driver/d3d12/d3d12_replay.h | 4 ++-- renderdoc/driver/ihv/amd/amd_isa.cpp | 2 +- renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp | 2 ++ 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp index af244c177..2d64e1b01 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp @@ -1120,7 +1120,8 @@ void PipelineStateViewer::SetupShaderEditButton(QToolButton *button, ResourceId }); }); } - else if(shaderDetails->encoding == ShaderEncoding::DXBC) + else if(shaderDetails->encoding == ShaderEncoding::DXBC || + shaderDetails->encoding == ShaderEncoding::DXIL) { entry = lit("EditedShader%1S").arg(ToQStr(shaderDetails->stage, GraphicsAPI::D3D11)[0]); @@ -1490,6 +1491,7 @@ bool PipelineStateViewer::SaveShaderFile(const ShaderReflection *shader) case ShaderEncoding::GLSL: filter = tr("GLSL files (*.glsl)"); break; case ShaderEncoding::SPIRV: filter = tr("SPIR-V files (*.spv)"); break; case ShaderEncoding::SPIRVAsm: filter = tr("SPIR-V assembly files (*.spvasm)"); break; + case ShaderEncoding::DXIL: filter = tr("DXIL Shader files (*.dxbc)"); break; case ShaderEncoding::Unknown: case ShaderEncoding::Count: filter = tr("All files (*.*)"); break; } diff --git a/renderdoc/api/replay/renderdoc_tostr.inl b/renderdoc/api/replay/renderdoc_tostr.inl index c28750696..cbcfd9f6c 100644 --- a/renderdoc/api/replay/renderdoc_tostr.inl +++ b/renderdoc/api/replay/renderdoc_tostr.inl @@ -1029,6 +1029,7 @@ rdcstr DoStringise(const ShaderEncoding &el) STRINGISE_ENUM_CLASS_NAMED(SPIRV, "SPIR-V"); STRINGISE_ENUM_CLASS_NAMED(SPIRVAsm, "SPIR-V Asm"); STRINGISE_ENUM_CLASS(HLSL); + STRINGISE_ENUM_CLASS(DXIL); } END_ENUM_STRINGISE(); } diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index 9c4b7e294..7fb06d835 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -1806,6 +1806,12 @@ DOCUMENT(R"(Identifies a shader encoding used to pass shader code to an API. .. data:: HLSL HLSL in string format, used by D3D11, D3D12, and Vulkan/GL via compilation to SPIR-V. + +.. data:: DXIL + + DXIL binary shader, used by D3D12. Note that although the container is still DXBC format this is + used to distinguish from :data:`DXBC` for compiler I/O matching. + )"); enum class ShaderEncoding : uint32_t { @@ -1816,6 +1822,7 @@ enum class ShaderEncoding : uint32_t SPIRV, SPIRVAsm, HLSL, + DXIL, Count, }; diff --git a/renderdoc/driver/d3d12/d3d12_replay.h b/renderdoc/driver/d3d12/d3d12_replay.h index 1e316b6b6..a03b02e57 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.h +++ b/renderdoc/driver/d3d12/d3d12_replay.h @@ -189,12 +189,12 @@ public: rdcarray GetCustomShaderEncodings() { - return {ShaderEncoding::DXBC, ShaderEncoding::HLSL}; + return {ShaderEncoding::DXBC, ShaderEncoding::DXIL, ShaderEncoding::HLSL}; } rdcarray GetCustomShaderSourcePrefixes(); rdcarray GetTargetShaderEncodings() { - return {ShaderEncoding::DXBC, ShaderEncoding::HLSL}; + return {ShaderEncoding::DXBC, ShaderEncoding::DXIL, ShaderEncoding::HLSL}; } void BuildTargetShader(ShaderEncoding sourceEncoding, const bytebuf &source, const rdcstr &entry, const ShaderCompileFlags &compileFlags, ShaderStage type, ResourceId &id, diff --git a/renderdoc/driver/ihv/amd/amd_isa.cpp b/renderdoc/driver/ihv/amd/amd_isa.cpp index 16df9e9cb..089c00343 100644 --- a/renderdoc/driver/ihv/amd/amd_isa.cpp +++ b/renderdoc/driver/ihv/amd/amd_isa.cpp @@ -97,7 +97,7 @@ static void GetEncodings(GraphicsAPI api, ShaderEncoding &primary, ShaderEncodin if(IsD3D(api)) { primary = ShaderEncoding::DXBC; - secondary = ShaderEncoding::DXBC; + secondary = ShaderEncoding::DXIL; } else if(api == GraphicsAPI::OpenGL) { diff --git a/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp b/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp index 84e27fdf5..3b68b36e4 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp +++ b/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp @@ -342,6 +342,8 @@ void MakeShaderReflection(DXBC::DXBCContainer *dxbc, ShaderReflection *refl, } refl->encoding = ShaderEncoding::DXBC; + if(dxbc->GetDXILByteCode()) + refl->encoding = ShaderEncoding::DXIL; refl->rawBytes = dxbc->GetShaderBlob(); refl->dispatchThreadsDimension[0] = dxbc->GetReflection()->DispatchThreadsDimension[0];