diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index bf2ef813..25228fe9 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -2994,10 +2994,6 @@ namespace dxvk { if (curView->imageInfo().sampleCount != refView->imageInfo().sampleCount) return false; - - if (curView->mipLevelExtent(0) - != refView->mipLevelExtent(0)) - return false; } else { // Set reference view. All remaining views // must be compatible to the reference view. diff --git a/src/dxvk/dxvk_framebuffer.cpp b/src/dxvk/dxvk_framebuffer.cpp index 77d0ddd6..c24a7e7d 100644 --- a/src/dxvk/dxvk_framebuffer.cpp +++ b/src/dxvk/dxvk_framebuffer.cpp @@ -94,15 +94,27 @@ namespace dxvk { DxvkFramebufferSize DxvkFramebuffer::computeRenderSize( const DxvkFramebufferSize& defaultSize) const { - if (m_renderTargets.depth.view != nullptr) - return this->computeRenderTargetSize(m_renderTargets.depth.view); + // Some games bind render targets of a different size and + // expect it to work, so we'll compute the minimum size + DxvkFramebufferSize minSize = defaultSize; - for (uint32_t i = 0; i < MaxNumRenderTargets; i++) { - if (m_renderTargets.color[i].view != nullptr) - return this->computeRenderTargetSize(m_renderTargets.color[i].view); + if (m_renderTargets.depth.view != nullptr) { + DxvkFramebufferSize depthSize = this->computeRenderTargetSize(m_renderTargets.depth.view); + minSize.width = std::min(minSize.width, depthSize.width); + minSize.height = std::min(minSize.height, depthSize.height); + minSize.layers = std::min(minSize.layers, depthSize.layers); } - return defaultSize; + for (uint32_t i = 0; i < MaxNumRenderTargets; i++) { + if (m_renderTargets.color[i].view != nullptr) { + DxvkFramebufferSize colorSize = this->computeRenderTargetSize(m_renderTargets.color[i].view); + minSize.width = std::min(minSize.width, colorSize.width); + minSize.height = std::min(minSize.height, colorSize.height); + minSize.layers = std::min(minSize.layers, colorSize.layers); + } + } + + return minSize; }