diff options
| author | Connor McLaughlin <stenzek@gmail.com> | 2019-04-28 23:37:51 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-04-28 23:37:51 +1000 |
| commit | 1b1662773eff56d4c25818b7470ff2d6de19cb53 (patch) | |
| tree | 94e95f47b04119d90fb68e62fdecae3e9995e41d /Source/Core | |
| parent | d2d8d7ce90f92bb45e2d8b645ec72f104fee5e6b (diff) | |
| parent | 53af27b1338827d6f08ef87a8f360dc1ceb550f8 (diff) | |
Merge pull request #8048 from stenzek/vulkan-negative-scissor-rect
Vulkan: Don't set a negative offset in scissor rect
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/VideoBackends/Vulkan/Renderer.cpp | 13 | ||||
| -rw-r--r-- | Source/Core/VideoCommon/FramebufferManager.cpp | 7 | ||||
| -rw-r--r-- | Source/Core/VideoCommon/TextureCacheBase.cpp | 2 |
3 files changed, 16 insertions, 6 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp index 8d702adb45..ac3dbe4c2a 100644 --- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp +++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp @@ -561,6 +561,19 @@ void Renderer::SetScissorRect(const MathUtil::Rectangle<int>& rc) { VkRect2D scissor = {{rc.left, rc.top}, {static_cast<u32>(rc.GetWidth()), static_cast<u32>(rc.GetHeight())}}; + + // See Vulkan spec for vkCmdSetScissor: + // The x and y members of offset must be greater than or equal to 0. + if (scissor.offset.x < 0) + { + scissor.extent.width -= -scissor.offset.x; + scissor.offset.x = 0; + } + if (scissor.offset.y < 0) + { + scissor.extent.height -= -scissor.offset.y; + scissor.offset.y = 0; + } StateTracker::GetInstance()->SetScissor(scissor); } diff --git a/Source/Core/VideoCommon/FramebufferManager.cpp b/Source/Core/VideoCommon/FramebufferManager.cpp index 39b389e283..6f4e132c06 100644 --- a/Source/Core/VideoCommon/FramebufferManager.cpp +++ b/Source/Core/VideoCommon/FramebufferManager.cpp @@ -223,10 +223,7 @@ AbstractTexture* FramebufferManager::ResolveEFBColorTexture(const MathUtil::Rect { // Return the normal EFB texture if multisampling is off. if (!IsEFBMultisampled()) - { - m_efb_color_texture->FinishedRendering(); return m_efb_color_texture.get(); - } // It's not valid to resolve an out-of-range rectangle. MathUtil::Rectangle<int> clamped_region = region; @@ -246,10 +243,7 @@ AbstractTexture* FramebufferManager::ResolveEFBColorTexture(const MathUtil::Rect AbstractTexture* FramebufferManager::ResolveEFBDepthTexture(const MathUtil::Rectangle<int>& region) { if (!IsEFBMultisampled()) - { - m_efb_depth_texture->FinishedRendering(); return m_efb_depth_texture.get(); - } // It's not valid to resolve an out-of-range rectangle. MathUtil::Rectangle<int> clamped_region = region; @@ -566,6 +560,7 @@ void FramebufferManager::PopulateEFBCache(bool depth, u32 tile_index) // Downsample from internal resolution to 1x. // TODO: This won't produce correct results at IRs above 2x. More samples are required. // This is the same issue as with EFB copies. + src_texture->FinishedRendering(); g_renderer->BeginUtilityDrawing(); const float rcp_src_width = 1.0f / m_efb_framebuffer->GetWidth(); diff --git a/Source/Core/VideoCommon/TextureCacheBase.cpp b/Source/Core/VideoCommon/TextureCacheBase.cpp index 441ca33145..22ccf8185f 100644 --- a/Source/Core/VideoCommon/TextureCacheBase.cpp +++ b/Source/Core/VideoCommon/TextureCacheBase.cpp @@ -2185,6 +2185,7 @@ void TextureCacheBase::CopyEFBToCacheEntry(TCacheEntry* entry, bool is_depth_cop is_depth_copy ? g_framebuffer_manager->ResolveEFBDepthTexture(framebuffer_rect) : g_framebuffer_manager->ResolveEFBColorTexture(framebuffer_rect); + src_texture->FinishedRendering(); g_renderer->BeginUtilityDrawing(); // Fill uniform buffer. @@ -2252,6 +2253,7 @@ void TextureCacheBase::CopyEFB(AbstractStagingTexture* dst, const EFBCopyParams& params.depth ? g_framebuffer_manager->ResolveEFBDepthTexture(framebuffer_rect) : g_framebuffer_manager->ResolveEFBColorTexture(framebuffer_rect); + src_texture->FinishedRendering(); g_renderer->BeginUtilityDrawing(); // Fill uniform buffer. |
