summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2015-11-28 21:33:47 +1000
committerStenzek <stenzek@gmail.com>2015-12-08 20:29:21 +1000
commit63264ac23f3b9cfaa725cf90d995497ba1601449 (patch)
tree2e3934b26e064f9e794006223ed4a2d3ee3c657c /Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp
parent5e803c3db3fa27b943d3d7789086789946eed6a7 (diff)
D3D: Fix EFB depth buffer copies, filtering on scaled EFB copies when MSAA is enabled, real XFB filtering
Since ResolveSubresource cannot be used with depth textures (and throws an error with the debug layer enabled), use a shader which selects the minimum depth value from all samples. Changes the sampler by XFBEncoder to use a linear filter, rather than point, to match GL behavior.
Diffstat (limited to 'Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp')
-rw-r--r--Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp15
1 files changed, 8 insertions, 7 deletions
diff --git a/Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp b/Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp
index 68a7a84d6a..5698077817 100644
--- a/Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp
+++ b/Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp
@@ -96,6 +96,14 @@ void PSTextureEncoder::Encode(u8* dst, u32 format, u32 native_width, u32 bytes_p
HRESULT hr;
+ // Resolve MSAA targets before copying.
+ ID3D11ShaderResourceView* pEFB = (srcFormat == PEControl::Z24) ?
+ FramebufferManager::GetResolvedEFBDepthTexture()->GetSRV() :
+ // FIXME: Instead of resolving EFB, it would be better to pick out a
+ // single sample from each pixel. The game may break if it isn't
+ // expecting the blurred edges around multisampled shapes.
+ FramebufferManager::GetResolvedEFBColorTexture()->GetSRV();
+
// Reset API
g_renderer->ResetAPIState();
@@ -111,13 +119,6 @@ void PSTextureEncoder::Encode(u8* dst, u32 format, u32 native_width, u32 bytes_p
D3D::context->OMSetRenderTargets(1, &m_outRTV, nullptr);
- ID3D11ShaderResourceView* pEFB = (srcFormat == PEControl::Z24) ?
- FramebufferManager::GetResolvedEFBDepthTexture()->GetSRV() :
- // FIXME: Instead of resolving EFB, it would be better to pick out a
- // single sample from each pixel. The game may break if it isn't
- // expecting the blurred edges around multisampled shapes.
- FramebufferManager::GetResolvedEFBColorTexture()->GetSRV();
-
EFBEncodeParams params;
params.SrcLeft = srcRect.left;
params.SrcTop = srcRect.top;