diff options
author | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2022-07-13 14:44:08 +0300 |
---|---|---|
committer | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2022-07-13 15:02:02 +0300 |
commit | 07a67281e9f3a44bb915738fa22c66e519829650 (patch) | |
tree | b5301510d818b27fa465aa88625ef6b5b055a24b | |
parent | 64d22606561433d9ae3f28b45290915849245b65 (diff) |
[d3d9] Fix up unsupported sample countsgodfather-v2
-rw-r--r-- | src/d3d9/d3d9_common_texture.cpp | 4 | ||||
-rw-r--r-- | src/d3d9/d3d9_device.cpp | 4 | ||||
-rw-r--r-- | src/d3d9/d3d9_util.cpp | 13 | ||||
-rw-r--r-- | src/d3d9/d3d9_util.h | 7 |
4 files changed, 18 insertions, 10 deletions
diff --git a/src/d3d9/d3d9_common_texture.cpp b/src/d3d9/d3d9_common_texture.cpp index b0681d49..22bc37c9 100644 --- a/src/d3d9/d3d9_common_texture.cpp +++ b/src/d3d9/d3d9_common_texture.cpp @@ -134,7 +134,7 @@ namespace dxvk { if (pDesc->Width == 0 || pDesc->Height == 0 || pDesc->Depth == 0) return D3DERR_INVALIDCALL; - if (FAILED(DecodeMultiSampleType(pDesc->MultiSample, pDesc->MultisampleQuality, nullptr))) + if (FAILED(DecodeMultiSampleType(pDevice->GetDXVKDevice(), pDesc->MultiSample, pDesc->MultisampleQuality, nullptr))) return D3DERR_INVALIDCALL; // Using MANAGED pool with DYNAMIC usage is illegal @@ -258,7 +258,7 @@ namespace dxvk { imageInfo.stages |= VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; } - DecodeMultiSampleType(m_desc.MultiSample, m_desc.MultisampleQuality, &imageInfo.sampleCount); + DecodeMultiSampleType(m_device->GetDXVKDevice(), m_desc.MultiSample, m_desc.MultisampleQuality, &imageInfo.sampleCount); // The image must be marked as mutable if it can be reinterpreted // by a view with a different format. Depth-stencil formats cannot diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index 0fc7efb0..28febc4a 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -6956,7 +6956,7 @@ namespace dxvk { const D3D9_COMMON_TEXTURE_DESC* dstDesc = dstTextureInfo->Desc(); VkSampleCountFlagBits dstSampleCount; - DecodeMultiSampleType(dstDesc->MultiSample, dstDesc->MultisampleQuality, &dstSampleCount); + DecodeMultiSampleType(m_dxvkDevice, dstDesc->MultiSample, dstDesc->MultisampleQuality, &dstSampleCount); if (unlikely(dstSampleCount != VK_SAMPLE_COUNT_1_BIT)) { Logger::warn("D3D9DeviceEx::ResolveZ: dstSampleCount != 1. Discarding."); @@ -6988,7 +6988,7 @@ namespace dxvk { srcSubresource.arrayLayer, 1 }; VkSampleCountFlagBits srcSampleCount; - DecodeMultiSampleType(srcDesc->MultiSample, srcDesc->MultisampleQuality, &srcSampleCount); + DecodeMultiSampleType(m_dxvkDevice, srcDesc->MultiSample, srcDesc->MultisampleQuality, &srcSampleCount); if (srcSampleCount == VK_SAMPLE_COUNT_1_BIT) { EmitCs([ diff --git a/src/d3d9/d3d9_util.cpp b/src/d3d9/d3d9_util.cpp index b278fed7..b5d24f44 100644 --- a/src/d3d9/d3d9_util.cpp +++ b/src/d3d9/d3d9_util.cpp @@ -37,9 +37,10 @@ namespace dxvk { HRESULT DecodeMultiSampleType( + const Rc<DxvkDevice>& pDevice, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, - VkSampleCountFlagBits* pCount) { + VkSampleCountFlagBits* pSampleCount) { uint32_t sampleCount = std::max<uint32_t>(MultiSample, 1u); // Check if this is a power of two... @@ -49,8 +50,14 @@ namespace dxvk { if (MultiSample == D3DMULTISAMPLE_NONMASKABLE) sampleCount = 1u << MultisampleQuality; - if (pCount != nullptr) - *pCount = VkSampleCountFlagBits(sampleCount); + const auto& limits = pDevice->properties().core.properties.limits; + VkSampleCountFlags supportedSampleCounts = limits.framebufferColorSampleCounts & limits.framebufferDepthSampleCounts; + + while (sampleCount > supportedSampleCounts) + sampleCount >>= 1; + + if (pSampleCount) + *pSampleCount = VkSampleCountFlagBits(sampleCount); return D3D_OK; } diff --git a/src/d3d9/d3d9_util.h b/src/d3d9/d3d9_util.h index 4f337abb..5899cd4c 100644 --- a/src/d3d9/d3d9_util.h +++ b/src/d3d9/d3d9_util.h @@ -95,9 +95,10 @@ namespace dxvk { ID3DBlob** ppDisassembly); HRESULT DecodeMultiSampleType( - D3DMULTISAMPLE_TYPE MultiSample, - DWORD MultisampleQuality, - VkSampleCountFlagBits* pCount); + const Rc<DxvkDevice>& pDevice, + D3DMULTISAMPLE_TYPE MultiSample, + DWORD MultisampleQuality, + VkSampleCountFlagBits* pSampleCount); VkFormat GetPackedDepthStencilFormat(D3D9Format Format); |