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.
This commit is contained in:
Stenzek 2016-02-18 20:22:55 +10:00
parent 63e4e07683
commit 53cf42fb06
1 changed files with 5 additions and 0 deletions

View File

@ -118,6 +118,9 @@ void TextureCache::TCacheEntry::CopyRectangleFromTexture(
float(dstrect.GetWidth()), float(dstrect.GetWidth()),
float(dstrect.GetHeight())); float(dstrect.GetHeight()));
D3D::stateman->UnsetTexture(texture->GetSRV());
D3D::stateman->Apply();
D3D::context->OMSetRenderTargets(1, &texture->GetRTV(), nullptr); D3D::context->OMSetRenderTargets(1, &texture->GetRTV(), nullptr);
D3D::context->RSSetViewports(1, &vp); D3D::context->RSSetViewports(1, &vp);
D3D::SetLinearCopySampler(); 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. // 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.) // (This can happen because we don't unbind textures when we free them.)
D3D::stateman->UnsetTexture(texture->GetSRV()); D3D::stateman->UnsetTexture(texture->GetSRV());
D3D::stateman->Apply();
D3D::context->OMSetRenderTargets(1, &texture->GetRTV(), nullptr); 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. // 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.) // (This can happen because we don't unbind textures when we free them.)
D3D::stateman->UnsetTexture(static_cast<TCacheEntry*>(entry)->texture->GetSRV()); D3D::stateman->UnsetTexture(static_cast<TCacheEntry*>(entry)->texture->GetSRV());
D3D::stateman->Apply();
D3D::context->OMSetRenderTargets(1, &static_cast<TCacheEntry*>(entry)->texture->GetRTV(), nullptr); D3D::context->OMSetRenderTargets(1, &static_cast<TCacheEntry*>(entry)->texture->GetRTV(), nullptr);