[d3d11] Implement min/max filters

This commit is contained in:
Philip Rebohle 2022-08-25 16:18:21 +02:00
parent 0a222aaaf0
commit 790da79512
4 changed files with 36 additions and 10 deletions

View file

@ -1157,8 +1157,11 @@ namespace dxvk {
if (FAILED(D3D11SamplerState::NormalizeDesc(&desc))) if (FAILED(D3D11SamplerState::NormalizeDesc(&desc)))
return E_INVALIDARG; return E_INVALIDARG;
if (ppSamplerState == nullptr) if (IsMinMaxFilter(desc.Filter) && m_tiledResourcesTier < D3D11_TILED_RESOURCES_TIER_2)
return E_INVALIDARG;
if (!ppSamplerState)
return S_FALSE; return S_FALSE;
try { try {

View file

@ -31,10 +31,10 @@ namespace dxvk {
info.addressModeV = DecodeAddressMode(desc.AddressV); info.addressModeV = DecodeAddressMode(desc.AddressV);
info.addressModeW = DecodeAddressMode(desc.AddressW); info.addressModeW = DecodeAddressMode(desc.AddressW);
info.compareToDepth = (filterBits & 0x80) ? VK_TRUE : VK_FALSE; info.compareToDepth = (filterBits & 0x180) == 0x80 ? VK_TRUE : VK_FALSE;
info.compareOp = DecodeCompareOp(desc.ComparisonFunc); info.compareOp = DecodeCompareOp(desc.ComparisonFunc);
info.reductionMode = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE; info.reductionMode = DecodeReductionMode(filterBits);
for (uint32_t i = 0; i < 4; i++) for (uint32_t i = 0; i < 4; i++)
info.borderColor.float32[i] = desc.BorderColor[i]; info.borderColor.float32[i] = desc.BorderColor[i];
@ -100,7 +100,7 @@ namespace dxvk {
HRESULT D3D11SamplerState::NormalizeDesc(D3D11_SAMPLER_DESC* pDesc) { HRESULT D3D11SamplerState::NormalizeDesc(D3D11_SAMPLER_DESC* pDesc) {
const uint32_t filterBits = uint32_t(pDesc->Filter); const uint32_t filterBits = uint32_t(pDesc->Filter);
if (filterBits & 0xFFFFFF2A) { if (filterBits & 0xFFFFFE2A) {
Logger::err(str::format( Logger::err(str::format(
"D3D11SamplerState: Unhandled filter: ", filterBits)); "D3D11SamplerState: Unhandled filter: ", filterBits));
return E_INVALIDARG; return E_INVALIDARG;
@ -114,7 +114,7 @@ namespace dxvk {
pDesc->MaxAnisotropy = 0; pDesc->MaxAnisotropy = 0;
} }
if (filterBits & 0x80 /* compare-to-depth */) { if ((filterBits & 0x180) == 0x80 /* compare-to-depth */) {
if (!ValidateComparisonFunc(pDesc->ComparisonFunc)) if (!ValidateComparisonFunc(pDesc->ComparisonFunc))
return E_INVALIDARG; return E_INVALIDARG;
} else { } else {

View file

@ -64,6 +64,19 @@ namespace dxvk {
} }
VkSamplerReductionMode DecodeReductionMode(
UINT Filter) {
switch (Filter & 0x180) {
default:
return VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE;
case 0x100:
return VK_SAMPLER_REDUCTION_MODE_MIN;
case 0x180:
return VK_SAMPLER_REDUCTION_MODE_MAX;
}
}
VkConservativeRasterizationModeEXT DecodeConservativeRasterizationMode( VkConservativeRasterizationModeEXT DecodeConservativeRasterizationMode(
D3D11_CONSERVATIVE_RASTERIZATION_MODE Mode) { D3D11_CONSERVATIVE_RASTERIZATION_MODE Mode) {
switch (Mode) { switch (Mode) {
@ -125,4 +138,9 @@ namespace dxvk {
} }
} }
BOOL IsMinMaxFilter(D3D11_FILTER Filter) {
return DecodeReductionMode(uint32_t(Filter)) != VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE;
}
} }

View file

@ -21,13 +21,16 @@ namespace dxvk {
HRESULT DecodeSampleCount( HRESULT DecodeSampleCount(
UINT Count, UINT Count,
VkSampleCountFlagBits* pCount); VkSampleCountFlagBits* pCount);
VkSamplerAddressMode DecodeAddressMode( VkSamplerAddressMode DecodeAddressMode(
D3D11_TEXTURE_ADDRESS_MODE mode); D3D11_TEXTURE_ADDRESS_MODE mode);
VkCompareOp DecodeCompareOp( VkCompareOp DecodeCompareOp(
D3D11_COMPARISON_FUNC Mode); D3D11_COMPARISON_FUNC Mode);
VkSamplerReductionMode DecodeReductionMode(
UINT Filter);
VkConservativeRasterizationModeEXT DecodeConservativeRasterizationMode( VkConservativeRasterizationModeEXT DecodeConservativeRasterizationMode(
D3D11_CONSERVATIVE_RASTERIZATION_MODE Mode); D3D11_CONSERVATIVE_RASTERIZATION_MODE Mode);
@ -40,6 +43,8 @@ namespace dxvk {
VkFormat GetPackedDepthStencilFormat( VkFormat GetPackedDepthStencilFormat(
DXGI_FORMAT Format); DXGI_FORMAT Format);
BOOL IsMinMaxFilter(D3D11_FILTER Filter);
/** /**
* \brief Translates D3D11 shader stage to corresponding Vulkan stage * \brief Translates D3D11 shader stage to corresponding Vulkan stage
* *