From 5712d91103dfdb6b0a9645fd00d03fc0f46b79fc Mon Sep 17 00:00:00 2001 From: Amer Koleci Date: Thu, 15 Jul 2021 19:03:28 +0200 Subject: [PATCH] Improvements (#286) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Vulkan: Correctly consider IndependentBlendEnable during blend state logic. * D3D12: Correctly handle alpha blend factors. * ENH: Add SHADERMODEL_6_6 and SHADERMODEL_6_7. Co-authored-by: Turánszki János --- WickedEngine/wiGraphics.h | 2 + WickedEngine/wiGraphicsDevice_DX12.cpp | 44 +++++++------- WickedEngine/wiGraphicsDevice_Vulkan.cpp | 33 +++-------- WickedEngine/wiShaderCompiler.cpp | 75 +++++++++++++++++++++++- 4 files changed, 104 insertions(+), 50 deletions(-) diff --git a/WickedEngine/wiGraphics.h b/WickedEngine/wiGraphics.h index 72121a6f5..f06ce9f9d 100644 --- a/WickedEngine/wiGraphics.h +++ b/WickedEngine/wiGraphics.h @@ -41,6 +41,8 @@ namespace wiGraphics SHADERMODEL_6_3, SHADERMODEL_6_4, SHADERMODEL_6_5, + SHADERMODEL_6_6, + SHADERMODEL_6_7, }; enum PRIMITIVETOPOLOGY { diff --git a/WickedEngine/wiGraphicsDevice_DX12.cpp b/WickedEngine/wiGraphicsDevice_DX12.cpp index c71453706..c170be580 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.cpp +++ b/WickedEngine/wiGraphicsDevice_DX12.cpp @@ -342,59 +342,61 @@ namespace DX12_Internal { case BLEND_ZERO: return D3D12_BLEND_ZERO; - break; case BLEND_ONE: return D3D12_BLEND_ONE; - break; case BLEND_SRC_COLOR: return D3D12_BLEND_SRC_COLOR; - break; case BLEND_INV_SRC_COLOR: return D3D12_BLEND_INV_SRC_COLOR; - break; case BLEND_SRC_ALPHA: return D3D12_BLEND_SRC_ALPHA; - break; case BLEND_INV_SRC_ALPHA: return D3D12_BLEND_INV_SRC_ALPHA; - break; case BLEND_DEST_ALPHA: return D3D12_BLEND_DEST_ALPHA; - break; case BLEND_INV_DEST_ALPHA: return D3D12_BLEND_INV_DEST_ALPHA; - break; case BLEND_DEST_COLOR: return D3D12_BLEND_DEST_COLOR; - break; case BLEND_INV_DEST_COLOR: return D3D12_BLEND_INV_DEST_COLOR; - break; case BLEND_SRC_ALPHA_SAT: return D3D12_BLEND_SRC_ALPHA_SAT; - break; case BLEND_BLEND_FACTOR: return D3D12_BLEND_BLEND_FACTOR; - break; case BLEND_INV_BLEND_FACTOR: return D3D12_BLEND_INV_BLEND_FACTOR; - break; case BLEND_SRC1_COLOR: return D3D12_BLEND_SRC1_COLOR; - break; case BLEND_INV_SRC1_COLOR: return D3D12_BLEND_INV_SRC1_COLOR; - break; case BLEND_SRC1_ALPHA: return D3D12_BLEND_SRC1_ALPHA; - break; case BLEND_INV_SRC1_ALPHA: return D3D12_BLEND_INV_SRC1_ALPHA; - break; default: - break; + return D3D12_BLEND_ZERO; + } + } + constexpr D3D12_BLEND _ConvertAlphaBlend(BLEND value) + { + switch (value) + { + case BLEND_SRC_COLOR: + return D3D12_BLEND_SRC_ALPHA; + case BLEND_INV_SRC_COLOR: + return D3D12_BLEND_INV_SRC_ALPHA; + case BLEND_DEST_COLOR: + return D3D12_BLEND_DEST_ALPHA; + case BLEND_INV_DEST_COLOR: + return D3D12_BLEND_INV_DEST_ALPHA; + case BLEND_SRC1_COLOR: + return D3D12_BLEND_SRC1_ALPHA; + case BLEND_INV_SRC1_COLOR: + return D3D12_BLEND_INV_SRC1_ALPHA; + default: + return _ConvertBlend(value); } - return D3D12_BLEND_ZERO; } constexpr D3D12_BLEND_OP _ConvertBlendOp(BLEND_OP value) { @@ -4394,8 +4396,8 @@ using namespace DX12_Internal; bd.RenderTarget[i].SrcBlend = _ConvertBlend(pBlendStateDesc.RenderTarget[i].SrcBlend); bd.RenderTarget[i].DestBlend = _ConvertBlend(pBlendStateDesc.RenderTarget[i].DestBlend); bd.RenderTarget[i].BlendOp = _ConvertBlendOp(pBlendStateDesc.RenderTarget[i].BlendOp); - bd.RenderTarget[i].SrcBlendAlpha = _ConvertBlend(pBlendStateDesc.RenderTarget[i].SrcBlendAlpha); - bd.RenderTarget[i].DestBlendAlpha = _ConvertBlend(pBlendStateDesc.RenderTarget[i].DestBlendAlpha); + bd.RenderTarget[i].SrcBlendAlpha = _ConvertAlphaBlend(pBlendStateDesc.RenderTarget[i].SrcBlendAlpha); + bd.RenderTarget[i].DestBlendAlpha = _ConvertAlphaBlend(pBlendStateDesc.RenderTarget[i].DestBlendAlpha); bd.RenderTarget[i].BlendOpAlpha = _ConvertBlendOp(pBlendStateDesc.RenderTarget[i].BlendOpAlpha); bd.RenderTarget[i].RenderTargetWriteMask = _ParseColorWriteMask(pBlendStateDesc.RenderTarget[i].RenderTargetWriteMask); } diff --git a/WickedEngine/wiGraphicsDevice_Vulkan.cpp b/WickedEngine/wiGraphicsDevice_Vulkan.cpp index e2dcc5bda..8c40e9760 100644 --- a/WickedEngine/wiGraphicsDevice_Vulkan.cpp +++ b/WickedEngine/wiGraphicsDevice_Vulkan.cpp @@ -290,59 +290,42 @@ namespace Vulkan_Internal { case BLEND_ZERO: return VK_BLEND_FACTOR_ZERO; - break; case BLEND_ONE: return VK_BLEND_FACTOR_ONE; - break; case BLEND_SRC_COLOR: return VK_BLEND_FACTOR_SRC_COLOR; - break; case BLEND_INV_SRC_COLOR: return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR; - break; case BLEND_SRC_ALPHA: return VK_BLEND_FACTOR_SRC_ALPHA; - break; case BLEND_INV_SRC_ALPHA: return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; - break; case BLEND_DEST_ALPHA: return VK_BLEND_FACTOR_DST_ALPHA; - break; case BLEND_INV_DEST_ALPHA: return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA; - break; case BLEND_DEST_COLOR: return VK_BLEND_FACTOR_DST_COLOR; - break; case BLEND_INV_DEST_COLOR: return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR; - break; case BLEND_SRC_ALPHA_SAT: return VK_BLEND_FACTOR_SRC_ALPHA_SATURATE; - break; case BLEND_BLEND_FACTOR: return VK_BLEND_FACTOR_CONSTANT_COLOR; - break; case BLEND_INV_BLEND_FACTOR: return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR; break; case BLEND_SRC1_COLOR: return VK_BLEND_FACTOR_SRC1_COLOR; - break; case BLEND_INV_SRC1_COLOR: return VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR; - break; case BLEND_SRC1_ALPHA: return VK_BLEND_FACTOR_SRC1_ALPHA; - break; case BLEND_INV_SRC1_ALPHA: return VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA; - break; default: - break; + return VK_BLEND_FACTOR_ZERO; } - return VK_BLEND_FACTOR_ZERO; } constexpr VkBlendOp _ConvertBlendOp(BLEND_OP value) { @@ -350,23 +333,17 @@ namespace Vulkan_Internal { case BLEND_OP_ADD: return VK_BLEND_OP_ADD; - break; case BLEND_OP_SUBTRACT: return VK_BLEND_OP_SUBTRACT; - break; case BLEND_OP_REV_SUBTRACT: return VK_BLEND_OP_REVERSE_SUBTRACT; - break; case BLEND_OP_MIN: return VK_BLEND_OP_MIN; - break; case BLEND_OP_MAX: return VK_BLEND_OP_MAX; - break; default: - break; + return VK_BLEND_OP_ADD; } - return VK_BLEND_OP_ADD; } constexpr VkSamplerAddressMode _ConvertTextureAddressMode(TEXTURE_ADDRESS_MODE value) { @@ -1851,7 +1828,11 @@ using namespace Vulkan_Internal; continue; } - const auto& desc = pso->desc.bs->RenderTarget[numBlendAttachments]; + size_t attachmentIndex = 0; + if (pso->desc.bs->IndependentBlendEnable) + attachmentIndex = i; + + const auto& desc = pso->desc.bs->RenderTarget[attachmentIndex]; VkPipelineColorBlendAttachmentState& attachment = colorBlendAttachments[numBlendAttachments]; numBlendAttachments++; diff --git a/WickedEngine/wiShaderCompiler.cpp b/WickedEngine/wiShaderCompiler.cpp index b5d492628..31a238aa7 100644 --- a/WickedEngine/wiShaderCompiler.cpp +++ b/WickedEngine/wiShaderCompiler.cpp @@ -89,10 +89,32 @@ namespace wiShaderCompiler switch (input.stage) { case wiGraphics::MS: - args.push_back(L"ms_6_5"); + switch (input.minshadermodel) + { + default: + args.push_back(L"ms_6_5"); + break; + case wiGraphics::SHADERMODEL_6_6: + args.push_back(L"ms_6_6"); + break; + case wiGraphics::SHADERMODEL_6_7: + args.push_back(L"ms_6_7"); + break; + } break; case wiGraphics::AS: - args.push_back(L"as_6_5"); + switch (input.minshadermodel) + { + default: + args.push_back(L"as_6_5"); + break; + case wiGraphics::SHADERMODEL_6_6: + args.push_back(L"as_6_6"); + break; + case wiGraphics::SHADERMODEL_6_7: + args.push_back(L"as_6_7"); + break; + } break; case wiGraphics::VS: switch (input.minshadermodel) @@ -115,6 +137,12 @@ namespace wiShaderCompiler case wiGraphics::SHADERMODEL_6_5: args.push_back(L"vs_6_5"); break; + case wiGraphics::SHADERMODEL_6_6: + args.push_back(L"vs_6_6"); + break; + case wiGraphics::SHADERMODEL_6_7: + args.push_back(L"vs_6_7"); + break; } break; case wiGraphics::HS: @@ -138,6 +166,12 @@ namespace wiShaderCompiler case wiGraphics::SHADERMODEL_6_5: args.push_back(L"hs_6_5"); break; + case wiGraphics::SHADERMODEL_6_6: + args.push_back(L"hs_6_6"); + break; + case wiGraphics::SHADERMODEL_6_7: + args.push_back(L"hs_6_7"); + break; } break; case wiGraphics::DS: @@ -161,6 +195,12 @@ namespace wiShaderCompiler case wiGraphics::SHADERMODEL_6_5: args.push_back(L"ds_6_5"); break; + case wiGraphics::SHADERMODEL_6_6: + args.push_back(L"ds_6_6"); + break; + case wiGraphics::SHADERMODEL_6_7: + args.push_back(L"ds_6_7"); + break; } break; case wiGraphics::GS: @@ -184,6 +224,12 @@ namespace wiShaderCompiler case wiGraphics::SHADERMODEL_6_5: args.push_back(L"gs_6_5"); break; + case wiGraphics::SHADERMODEL_6_6: + args.push_back(L"gs_6_6"); + break; + case wiGraphics::SHADERMODEL_6_7: + args.push_back(L"gs_6_7"); + break; } break; case wiGraphics::PS: @@ -207,6 +253,12 @@ namespace wiShaderCompiler case wiGraphics::SHADERMODEL_6_5: args.push_back(L"ps_6_5"); break; + case wiGraphics::SHADERMODEL_6_6: + args.push_back(L"ps_6_6"); + break; + case wiGraphics::SHADERMODEL_6_7: + args.push_back(L"ps_6_7"); + break; } break; case wiGraphics::CS: @@ -230,10 +282,27 @@ namespace wiShaderCompiler case wiGraphics::SHADERMODEL_6_5: args.push_back(L"cs_6_5"); break; + case wiGraphics::SHADERMODEL_6_6: + args.push_back(L"cs_6_6"); + break; + case wiGraphics::SHADERMODEL_6_7: + args.push_back(L"cs_6_7"); + break; } break; case wiGraphics::LIB: - args.push_back(L"lib_6_5"); + switch (input.minshadermodel) + { + default: + args.push_back(L"lib_6_5"); + break; + case wiGraphics::SHADERMODEL_6_6: + args.push_back(L"lib_6_6"); + break; + case wiGraphics::SHADERMODEL_6_7: + args.push_back(L"lib_6_7"); + break; + } break; default: assert(0);