From 289da8065d4d7b62bfb88844ccd7575ba476c8ea Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 21 Dec 2017 16:54:20 +0100 Subject: [PATCH] [d3d11] Implemented border color support --- src/d3d11/d3d11_device.cpp | 5 +-- src/d3d11/d3d11_util.cpp | 70 ++++++++++++++++++++++---------------- src/d3d11/d3d11_util.h | 7 ++-- 3 files changed, 49 insertions(+), 33 deletions(-) diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 7b12c2b4c..9bbb7591c 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -808,12 +808,13 @@ namespace dxvk { info.addressModeW = DecodeAddressMode(pSamplerDesc->AddressW); info.compareOp = DecodeCompareOp(pSamplerDesc->ComparisonFunc); 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 || info.addressModeV == 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 if (ppSamplerState == nullptr) diff --git a/src/d3d11/d3d11_util.cpp b/src/d3d11/d3d11_util.cpp index 7fd588723..367ac4a7f 100644 --- a/src/d3d11/d3d11_util.cpp +++ b/src/d3d11/d3d11_util.cpp @@ -15,44 +15,56 @@ namespace dxvk { } - 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; + VkBorderColor DecodeBorderColor(const FLOAT BorderColor[4]) { + struct BorderColorEntry { + float r, g, b, a; + VkBorderColor bc; + }; + + // Vulkan only supports a very limited set of border colors + const std::array borderColorMap = {{ + { 0.0f, 0.0f, 0.0f, 0.0f, VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK }, + { 0.0f, 0.0f, 0.0f, 1.0f, VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK }, + { 1.0f, 1.0f, 1.0f, 1.0f, VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK }, + }}; + + for (const auto& e : borderColorMap) { + if (e.r == BorderColor[0] && e.g == BorderColor[1] + && e.b == BorderColor[2] && e.a == BorderColor[3]) + return e.bc; + } + + Logger::warn(str::format( + "D3D11Device: No matching border color found for (", + BorderColor[0], ",", BorderColor[1], ",", + BorderColor[2], ",", BorderColor[3], ")")); + + return VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK; + } + + + 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: - Logger::err(str::format("D3D11: Unsupported compare op: ", mode)); + Logger::err(str::format("D3D11: Unsupported compare op: ", Mode)); return VK_COMPARE_OP_ALWAYS; } } - VkMemoryPropertyFlags GetMemoryFlagsForUsage(D3D11_USAGE usage) { + VkMemoryPropertyFlags GetMemoryFlagsForUsage(D3D11_USAGE Usage) { VkMemoryPropertyFlags memoryFlags = 0; - switch (usage) { + switch (Usage) { case D3D11_USAGE_DEFAULT: case D3D11_USAGE_IMMUTABLE: memoryFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; diff --git a/src/d3d11/d3d11_util.h b/src/d3d11/d3d11_util.h index 5fc3fd3bc..2d8487e38 100644 --- a/src/d3d11/d3d11_util.h +++ b/src/d3d11/d3d11_util.h @@ -12,10 +12,13 @@ namespace dxvk { UINT Count, VkSampleCountFlagBits* pCount); + VkBorderColor DecodeBorderColor( + const FLOAT BorderColor[4]); + VkCompareOp DecodeCompareOp( - D3D11_COMPARISON_FUNC mode); + D3D11_COMPARISON_FUNC Mode); VkMemoryPropertyFlags GetMemoryFlagsForUsage( - D3D11_USAGE usage); + D3D11_USAGE Usage); } \ No newline at end of file