Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rebohle <philip.rebohle@tu-dortmund.de>2022-07-13 14:44:08 +0300
committerPhilip Rebohle <philip.rebohle@tu-dortmund.de>2022-07-13 15:02:02 +0300
commit07a67281e9f3a44bb915738fa22c66e519829650 (patch)
treeb5301510d818b27fa465aa88625ef6b5b055a24b
parent64d22606561433d9ae3f28b45290915849245b65 (diff)
[d3d9] Fix up unsupported sample countsgodfather-v2
-rw-r--r--src/d3d9/d3d9_common_texture.cpp4
-rw-r--r--src/d3d9/d3d9_device.cpp4
-rw-r--r--src/d3d9/d3d9_util.cpp13
-rw-r--r--src/d3d9/d3d9_util.h7
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);