From 9e798eec94a8ebe94c1ef8270b504b5698b2a0f5 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 29 Apr 2018 18:52:30 +1000 Subject: Implement EFB copy filter and gamma in hardware backends Also makes y_scale a dynamic parameter for EFB copies, as it doesn't make sense to keep it as part of the uid, otherwise we're generating redundant shaders. --- Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp') diff --git a/Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp b/Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp index 8d48332af7..de0d9716ec 100644 --- a/Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp +++ b/Source/Core/VideoBackends/D3D/PSTextureEncoder.cpp @@ -31,7 +31,11 @@ struct EFBEncodeParams u32 DestWidth; u32 ScaleFactor; float y_scale; - u32 padding[3]; + float gamma_rcp; + float clamp_top; + float clamp_bottom; + s32 filter_coefficients[3]; + u32 padding; }; PSTextureEncoder::PSTextureEncoder() @@ -66,9 +70,11 @@ void PSTextureEncoder::Shutdown() SAFE_RELEASE(m_encode_params); } -void PSTextureEncoder::Encode(u8* dst, const EFBCopyParams& params, u32 native_width, - u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride, - const EFBRectangle& src_rect, bool scale_by_half) +void PSTextureEncoder::Encode( + u8* dst, const EFBCopyParams& params, u32 native_width, u32 bytes_per_row, u32 num_blocks_y, + u32 memory_stride, const EFBRectangle& src_rect, bool scale_by_half, float y_scale, float gamma, + bool clamp_top, bool clamp_bottom, + const TextureCacheBase::CopyFilterCoefficientArray& filter_coefficients) { // Resolve MSAA targets before copying. // FIXME: Instead of resolving EFB, it would be better to pick out a @@ -101,7 +107,13 @@ void PSTextureEncoder::Encode(u8* dst, const EFBCopyParams& params, u32 native_w encode_params.SrcTop = src_rect.top; encode_params.DestWidth = native_width; encode_params.ScaleFactor = scale_by_half ? 2 : 1; - encode_params.y_scale = params.y_scale; + encode_params.y_scale = y_scale; + encode_params.gamma_rcp = 1.0f / gamma; + encode_params.clamp_top = clamp_top ? src_rect.top / float(EFB_HEIGHT) : 0.0f; + encode_params.clamp_bottom = clamp_bottom ? src_rect.bottom / float(EFB_HEIGHT) : 0.0f; + for (size_t i = 0; i < filter_coefficients.size(); i++) + encode_params.filter_coefficients[i] = filter_coefficients[i]; + D3D::context->UpdateSubresource(m_encode_params, 0, nullptr, &encode_params, 0, 0); D3D::stateman->SetPixelConstants(m_encode_params); @@ -109,7 +121,7 @@ void PSTextureEncoder::Encode(u8* dst, const EFBCopyParams& params, u32 native_w // TODO: This only produces perfect downsampling for 2x IR, other resolutions will need more // complex down filtering to average all pixels and produce the correct result. // Also, box filtering won't be correct for anything other than 1x IR - if (scale_by_half || g_renderer->GetEFBScale() != 1 || params.y_scale > 1.0f) + if (scale_by_half || g_renderer->GetEFBScale() != 1 || y_scale > 1.0f) D3D::SetLinearCopySampler(); else D3D::SetPointCopySampler(); -- cgit v1.2.3