Improvements (#286)

* 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 <turanszkij@users.noreply.github.com>
This commit is contained in:
Amer Koleci
2021-07-15 19:03:28 +02:00
committed by GitHub
parent 5b7249e999
commit 5712d91103
4 changed files with 104 additions and 50 deletions
+2
View File
@@ -41,6 +41,8 @@ namespace wiGraphics
SHADERMODEL_6_3,
SHADERMODEL_6_4,
SHADERMODEL_6_5,
SHADERMODEL_6_6,
SHADERMODEL_6_7,
};
enum PRIMITIVETOPOLOGY
{
+23 -21
View File
@@ -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);
}
+7 -26
View File
@@ -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++;
+72 -3
View File
@@ -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);