From 6f86cf0e9a3aa7f675fad67877398b7d261f778c Mon Sep 17 00:00:00 2001 From: assiduous Date: Wed, 9 Sep 2020 09:40:36 -0700 Subject: Fixed merge conflicts --- .../include/RenderDeviceD3D12Impl.hpp | 2 +- .../GraphicsEngineD3D12/src/ShaderD3D12Impl.cpp | 24 ++++++++++------ .../src/ShaderResourcesD3D12.cpp | 33 +++++++--------------- 3 files changed, 27 insertions(+), 32 deletions(-) (limited to 'Graphics/GraphicsEngineD3D12') diff --git a/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp b/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp index dc8d594e..bac52b9e 100644 --- a/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp +++ b/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp @@ -158,7 +158,7 @@ public: ID3D12Device2* GetD3D12Device2(); #endif - D3D_SHADER_MODEL GetMaxShaderModel() const; + ShaderVersion GetMaxShaderModel() const; D3D_FEATURE_LEVEL GetD3DFeatureLevel() const; private: diff --git a/Graphics/GraphicsEngineD3D12/src/ShaderD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/ShaderD3D12Impl.cpp index 753fcbf8..80025b36 100644 --- a/Graphics/GraphicsEngineD3D12/src/ShaderD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/ShaderD3D12Impl.cpp @@ -38,15 +38,23 @@ namespace Diligent static ShaderVersion GetD3D12ShaderModel(RenderDeviceD3D12Impl* pDevice, const ShaderVersion& HLSLVersion, SHADER_COMPILER ShaderCompiler) { + if (ShaderCompiler != SHADER_COMPILER_DXC) + return HLSLVersion.Major == 0 ? ShaderVersion{5, 1} : HLSLVersion; + + ShaderVersion DeviceSM = pDevice->GetMaxShaderModel(); + ShaderVersion CompilerSM = pDevice->GetDxCompiler() && pDevice->GetDxCompiler()->IsLoaded() ? pDevice->GetDxCompiler()->GetMaxShaderModel() : ShaderVersion{5, 1}; + ShaderVersion MaxSM; + + MaxSM = DeviceSM.Major == CompilerSM.Major ? + (DeviceSM.Minor > CompilerSM.Minor ? CompilerSM : DeviceSM) : + (DeviceSM.Major > CompilerSM.Major ? CompilerSM : DeviceSM); + if (HLSLVersion.Major == 0 && HLSLVersion.Minor == 0) - { - D3D_SHADER_MODEL ver = pDevice->GetMaxShaderModel(); - return ShaderVersion{Uint8((ver >> 4) & 0xF), Uint8(ver & 0xF)}; - } - else - { - return HLSLVersion; - } + return MaxSM; + + return HLSLVersion.Major == MaxSM.Major ? + (HLSLVersion.Minor > MaxSM.Minor ? MaxSM : HLSLVersion) : + (HLSLVersion.Major > MaxSM.Major ? MaxSM : HLSLVersion); } ShaderD3D12Impl::ShaderD3D12Impl(IReferenceCounters* pRefCounters, diff --git a/Graphics/GraphicsEngineD3D12/src/ShaderResourcesD3D12.cpp b/Graphics/GraphicsEngineD3D12/src/ShaderResourcesD3D12.cpp index fb061ca0..01726d00 100644 --- a/Graphics/GraphicsEngineD3D12/src/ShaderResourcesD3D12.cpp +++ b/Graphics/GraphicsEngineD3D12/src/ShaderResourcesD3D12.cpp @@ -32,13 +32,16 @@ #include "ShaderD3DBase.hpp" #include "ShaderBase.hpp" #include "DXILUtils.hpp" -#include "dxc/dxcapi.h" +#include "RenderDeviceD3D12Impl.hpp" namespace Diligent { -ShaderResourcesD3D12::ShaderResourcesD3D12(ID3DBlob* pShaderBytecode, bool isDXIL, const ShaderDesc& ShdrDesc, const char* CombinedSamplerSuffix) : +ShaderResourcesD3D12::ShaderResourcesD3D12(ID3DBlob* pShaderBytecode, + const ShaderDesc& ShdrDesc, + const char* CombinedSamplerSuffix, + RenderDeviceD3D12Impl* pRenderDeviceD3D12) : ShaderResources{ShdrDesc.ShaderType} { class NewResourceHandler @@ -55,29 +58,13 @@ ShaderResourcesD3D12::ShaderResourcesD3D12(ID3DBlob* pShaderBytecode, bool isDXI }; CComPtr pShaderReflection; + auto* DxCompiler = pRenderDeviceD3D12->GetDxCompiler(); - if (isDXIL) + // At first try to get shader reflection with a DXC. + if (!DxcGetShaderReflection(DxCompiler, reinterpret_cast(pShaderBytecode), &pShaderReflection)) { - CComPtr pReflection; - - auto hr = D3D12DxcCreateInstance(CLSID_DxcContainerReflection, IID_PPV_ARGS(&pReflection)); - CHECK_D3D_RESULT_THROW(hr, "Failed to create shader reflection instance"); - - hr = pReflection->Load(reinterpret_cast(pShaderBytecode)); - CHECK_D3D_RESULT_THROW(hr, "Failed to load shader reflection from bytecode"); - - UINT32 shaderIdx = 0; - constexpr UINT32 DFCC_DXIL = UINT32{'D'} | (UINT32{'X'} << 8) | (UINT32{'I'} << 16) | (UINT32{'L'} << 24); - - hr = pReflection->FindFirstPartKind(DFCC_DXIL, &shaderIdx); - CHECK_D3D_RESULT_THROW(hr, "Failed to find DXIL part"); - - hr = pReflection->GetPartReflection(shaderIdx, __uuidof(pShaderReflection), reinterpret_cast(&pShaderReflection)); - CHECK_D3D_RESULT_THROW(hr, "Failed to get the shader reflection"); - } - else - { - auto hr = D3DReflect(pShaderBytecode->GetBufferPointer(), pShaderBytecode->GetBufferSize(), __uuidof(pShaderReflection), reinterpret_cast(&pShaderReflection)); + // Use FXC to get reflection. + HRESULT hr = D3DReflect(pShaderBytecode->GetBufferPointer(), pShaderBytecode->GetBufferSize(), __uuidof(pShaderReflection), reinterpret_cast(&pShaderReflection)); CHECK_D3D_RESULT_THROW(hr, "Failed to get the shader reflection"); } -- cgit v1.2.3