1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00

[d3d11] Implemented border color support

This commit is contained in:
Philip Rebohle 2017-12-21 16:54:20 +01:00
parent 3e4e5191a8
commit 289da8065d
3 changed files with 49 additions and 33 deletions

View File

@ -808,12 +808,13 @@ namespace dxvk {
info.addressModeW = DecodeAddressMode(pSamplerDesc->AddressW); info.addressModeW = DecodeAddressMode(pSamplerDesc->AddressW);
info.compareOp = DecodeCompareOp(pSamplerDesc->ComparisonFunc); info.compareOp = DecodeCompareOp(pSamplerDesc->ComparisonFunc);
info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK; info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
info.usePixelCoord = VK_FALSE; info.usePixelCoord = VK_FALSE; // Not supported in D3D11
// Try to find a matching border color if clamp to border is enabled
if (info.addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER if (info.addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER
|| info.addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER || info.addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER
|| info.addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) || info.addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)
Logger::warn("D3D11: Border color not supported yet"); info.borderColor = DecodeBorderColor(pSamplerDesc->BorderColor);
// Create sampler object if the application requests it // Create sampler object if the application requests it
if (ppSamplerState == nullptr) if (ppSamplerState == nullptr)

View File

@ -15,44 +15,56 @@ namespace dxvk {
} }
VkCompareOp DecodeCompareOp( VkBorderColor DecodeBorderColor(const FLOAT BorderColor[4]) {
D3D11_COMPARISON_FUNC mode) { struct BorderColorEntry {
switch (mode) { float r, g, b, a;
case D3D11_COMPARISON_NEVER: VkBorderColor bc;
return VK_COMPARE_OP_NEVER; };
case D3D11_COMPARISON_LESS: // Vulkan only supports a very limited set of border colors
return VK_COMPARE_OP_LESS; const std::array<BorderColorEntry, 3> borderColorMap = {{
{ 0.0f, 0.0f, 0.0f, 0.0f, VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK },
case D3D11_COMPARISON_EQUAL: { 0.0f, 0.0f, 0.0f, 1.0f, VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK },
return VK_COMPARE_OP_EQUAL; { 1.0f, 1.0f, 1.0f, 1.0f, VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK },
}};
case D3D11_COMPARISON_LESS_EQUAL:
return VK_COMPARE_OP_LESS_OR_EQUAL; for (const auto& e : borderColorMap) {
if (e.r == BorderColor[0] && e.g == BorderColor[1]
case D3D11_COMPARISON_GREATER: && e.b == BorderColor[2] && e.a == BorderColor[3])
return VK_COMPARE_OP_GREATER; return e.bc;
}
case D3D11_COMPARISON_NOT_EQUAL:
return VK_COMPARE_OP_NOT_EQUAL; Logger::warn(str::format(
"D3D11Device: No matching border color found for (",
case D3D11_COMPARISON_GREATER_EQUAL: BorderColor[0], ",", BorderColor[1], ",",
return VK_COMPARE_OP_GREATER_OR_EQUAL; BorderColor[2], ",", BorderColor[3], ")"));
case D3D11_COMPARISON_ALWAYS: return VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
return VK_COMPARE_OP_ALWAYS; }
VkCompareOp DecodeCompareOp(D3D11_COMPARISON_FUNC Mode) {
switch (Mode) {
case D3D11_COMPARISON_NEVER: return VK_COMPARE_OP_NEVER;
case D3D11_COMPARISON_LESS: return VK_COMPARE_OP_LESS;
case D3D11_COMPARISON_EQUAL: return VK_COMPARE_OP_EQUAL;
case D3D11_COMPARISON_LESS_EQUAL: return VK_COMPARE_OP_LESS_OR_EQUAL;
case D3D11_COMPARISON_GREATER: return VK_COMPARE_OP_GREATER;
case D3D11_COMPARISON_NOT_EQUAL: return VK_COMPARE_OP_NOT_EQUAL;
case D3D11_COMPARISON_GREATER_EQUAL: return VK_COMPARE_OP_GREATER_OR_EQUAL;
case D3D11_COMPARISON_ALWAYS: return VK_COMPARE_OP_ALWAYS;
default: default:
Logger::err(str::format("D3D11: Unsupported compare op: ", mode)); Logger::err(str::format("D3D11: Unsupported compare op: ", Mode));
return VK_COMPARE_OP_ALWAYS; return VK_COMPARE_OP_ALWAYS;
} }
} }
VkMemoryPropertyFlags GetMemoryFlagsForUsage(D3D11_USAGE usage) { VkMemoryPropertyFlags GetMemoryFlagsForUsage(D3D11_USAGE Usage) {
VkMemoryPropertyFlags memoryFlags = 0; VkMemoryPropertyFlags memoryFlags = 0;
switch (usage) { switch (Usage) {
case D3D11_USAGE_DEFAULT: case D3D11_USAGE_DEFAULT:
case D3D11_USAGE_IMMUTABLE: case D3D11_USAGE_IMMUTABLE:
memoryFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; memoryFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;

View File

@ -12,10 +12,13 @@ namespace dxvk {
UINT Count, UINT Count,
VkSampleCountFlagBits* pCount); VkSampleCountFlagBits* pCount);
VkBorderColor DecodeBorderColor(
const FLOAT BorderColor[4]);
VkCompareOp DecodeCompareOp( VkCompareOp DecodeCompareOp(
D3D11_COMPARISON_FUNC mode); D3D11_COMPARISON_FUNC Mode);
VkMemoryPropertyFlags GetMemoryFlagsForUsage( VkMemoryPropertyFlags GetMemoryFlagsForUsage(
D3D11_USAGE usage); D3D11_USAGE Usage);
} }