summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/D3D/TextureCache.cpp
diff options
context:
space:
mode:
authorYuriy O'Donnell <yuriyo@gmail.com>2014-12-13 00:32:08 +0100
committerYuriy O'Donnell <yuriyo@gmail.com>2014-12-13 00:32:08 +0100
commit764aee6995d50bf758452d3ced882d2e6b8af94e (patch)
tree3d39123a2b79ea75259b757446ccbb4cdc997b08 /Source/Core/VideoBackends/D3D/TextureCache.cpp
parent971a95aecef1c4fc3e5aa8799a296d2734526cfc (diff)
D3D: Fixed D3D validation error during EFB to texture copy
Texture was being bound as a render target while still being set as a shader resource. D3D automatically unbinds the SRV in this case and generates a validation error. The fix is to manually unbind SRV, render into it and then re-bind to old slots.
Diffstat (limited to 'Source/Core/VideoBackends/D3D/TextureCache.cpp')
-rw-r--r--Source/Core/VideoBackends/D3D/TextureCache.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/Source/Core/VideoBackends/D3D/TextureCache.cpp b/Source/Core/VideoBackends/D3D/TextureCache.cpp
index 4ed4d6045f..e679398d50 100644
--- a/Source/Core/VideoBackends/D3D/TextureCache.cpp
+++ b/Source/Core/VideoBackends/D3D/TextureCache.cpp
@@ -156,6 +156,10 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
else
D3D::SetPointCopySampler();
+ // if texture is currently in use, it needs to be temporarily unset
+ u32 textureSlotMask = D3D::stateman->UnsetTexture(texture->GetSRV());
+ D3D::stateman->Apply();
+
D3D::context->OMSetRenderTargets(1, &texture->GetRTV(), nullptr);
// Create texture copy
@@ -168,6 +172,15 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
D3D::context->OMSetRenderTargets(1, &FramebufferManager::GetEFBColorTexture()->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV());
g_renderer->RestoreAPIState();
+
+ // Restore old texture in all previously used slots, if any
+ while (textureSlotMask)
+ {
+ unsigned long index;
+ _BitScanForward(&index, textureSlotMask);
+ D3D::stateman->SetTexture(index, texture->GetSRV());
+ textureSlotMask &= ~(1 << index);
+ }
}
if (!g_ActiveConfig.bCopyEFBToTexture)