From 53cf42fb0649fe2e5eea79d56e1f6e2cb9f2269a Mon Sep 17 00:00:00 2001 From: Stenzek Date: Thu, 18 Feb 2016 20:22:55 +1000 Subject: [PATCH] D3D11: Fix some cases where render target switches desynced StateManager This was occuring in certain EFB copy patterns, leaving the textures unbound for the next draw call. --- Source/Core/VideoBackends/D3D/TextureCache.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/Core/VideoBackends/D3D/TextureCache.cpp b/Source/Core/VideoBackends/D3D/TextureCache.cpp index ac8271fbb5..f30d0309ef 100644 --- a/Source/Core/VideoBackends/D3D/TextureCache.cpp +++ b/Source/Core/VideoBackends/D3D/TextureCache.cpp @@ -118,6 +118,9 @@ void TextureCache::TCacheEntry::CopyRectangleFromTexture( float(dstrect.GetWidth()), float(dstrect.GetHeight())); + D3D::stateman->UnsetTexture(texture->GetSRV()); + D3D::stateman->Apply(); + D3D::context->OMSetRenderTargets(1, &texture->GetRTV(), nullptr); D3D::context->RSSetViewports(1, &vp); D3D::SetLinearCopySampler(); @@ -234,6 +237,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u8* dst, PEControl::PixelFormat // Make sure we don't draw with the texture set as both a source and target. // (This can happen because we don't unbind textures when we free them.) D3D::stateman->UnsetTexture(texture->GetSRV()); + D3D::stateman->Apply(); D3D::context->OMSetRenderTargets(1, &texture->GetRTV(), nullptr); @@ -364,6 +368,7 @@ void TextureCache::ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* uncon // Make sure we don't draw with the texture set as both a source and target. // (This can happen because we don't unbind textures when we free them.) D3D::stateman->UnsetTexture(static_cast(entry)->texture->GetSRV()); + D3D::stateman->Apply(); D3D::context->OMSetRenderTargets(1, &static_cast(entry)->texture->GetRTV(), nullptr);