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:
@@ -41,6 +41,8 @@ namespace wiGraphics
|
||||
SHADERMODEL_6_3,
|
||||
SHADERMODEL_6_4,
|
||||
SHADERMODEL_6_5,
|
||||
SHADERMODEL_6_6,
|
||||
SHADERMODEL_6_7,
|
||||
};
|
||||
enum PRIMITIVETOPOLOGY
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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++;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user