diff options
| author | iwubcode <iwubcode@users.noreply.github.com> | 2017-08-23 21:46:23 -0500 |
|---|---|---|
| committer | iwubcode <iwubcode@users.noreply.github.com> | 2017-11-17 22:11:31 -0600 |
| commit | 6e686f6ea10c486a6271a6ca7cd084e124776b5a (patch) | |
| tree | 55e0c3ae1a9735b4b80515a6dc60f72bebcd726e /Source/Core/VideoBackends/Software/TextureEncoder.cpp | |
| parent | e6d85b0915681a3f8162d45468f2c488d6df8114 (diff) | |
Software Backend: Fix xfb output and add vertical scaling support
Diffstat (limited to 'Source/Core/VideoBackends/Software/TextureEncoder.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Software/TextureEncoder.cpp | 77 |
1 files changed, 53 insertions, 24 deletions
diff --git a/Source/Core/VideoBackends/Software/TextureEncoder.cpp b/Source/Core/VideoBackends/Software/TextureEncoder.cpp index 6181d56dd4..bceb567524 100644 --- a/Source/Core/VideoBackends/Software/TextureEncoder.cpp +++ b/Source/Core/VideoBackends/Software/TextureEncoder.cpp @@ -14,6 +14,7 @@ #include "VideoCommon/BPMemory.h" #include "VideoCommon/LookUpTables.h" +#include "VideoCommon/TextureCacheBase.h" #include "VideoCommon/TextureDecoder.h" namespace TextureEncoder @@ -1416,37 +1417,65 @@ static void EncodeZ24halfscale(u8* dst, const u8* src, EFBCopyFormat format) } } -void Encode(u8* dest_ptr) +namespace { - auto pixelformat = bpmem.zcontrol.pixel_format; - bool bFromZBuffer = pixelformat == PEControl::Z24; - bool bIsIntensityFmt = bpmem.triggerEFBCopy.intensity_fmt > 0; - EFBCopyFormat copyfmt = bpmem.triggerEFBCopy.tp_realFormat(); + void EncodeEfbCopy(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) + { + const u8* src = + EfbInterface::GetPixelPointer(src_rect.left, src_rect.top, params.depth); - const u8* src = - EfbInterface::GetPixelPointer(bpmem.copyTexSrcXY.x, bpmem.copyTexSrcXY.y, bFromZBuffer); + if (scale_by_half) + { + switch (params.efb_format) + { + case PEControl::RGBA6_Z24: + EncodeRGBA6halfscale(dst, src, params.copy_format, params.yuv); + break; + case PEControl::RGB8_Z24: + EncodeRGB8halfscale(dst, src, params.copy_format, params.yuv); + break; + case PEControl::RGB565_Z16: + EncodeRGB8halfscale(dst, src, params.copy_format, params.yuv); + break; + case PEControl::Z24: + EncodeZ24halfscale(dst, src, params.copy_format); + break; + } + } + else + { + switch (params.efb_format) + { + case PEControl::RGBA6_Z24: + EncodeRGBA6(dst, src, params.copy_format, params.yuv); + break; + case PEControl::RGB8_Z24: + EncodeRGB8(dst, src, params.copy_format, params.yuv); + break; + case PEControl::RGB565_Z16: + EncodeRGB8(dst, src, params.copy_format, params.yuv); + break; + case PEControl::Z24: + EncodeZ24(dst, src, params.copy_format); + break; + } + } + } +} - if (bpmem.triggerEFBCopy.half_scale) +void 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) +{ + if (params.copy_format == EFBCopyFormat::XFB) { - if (pixelformat == PEControl::RGBA6_Z24) - EncodeRGBA6halfscale(dest_ptr, src, copyfmt, bIsIntensityFmt); - else if (pixelformat == PEControl::RGB8_Z24) - EncodeRGB8halfscale(dest_ptr, src, copyfmt, bIsIntensityFmt); - else if (pixelformat == PEControl::RGB565_Z16) // not supported - EncodeRGB8halfscale(dest_ptr, src, copyfmt, bIsIntensityFmt); - else if (pixelformat == PEControl::Z24) - EncodeZ24halfscale(dest_ptr, src, copyfmt); + EfbInterface::EncodeXFB(reinterpret_cast<EfbInterface::yuv422_packed*>(dst), native_width, src_rect, params.y_scale); } else { - if (pixelformat == PEControl::RGBA6_Z24) - EncodeRGBA6(dest_ptr, src, copyfmt, bIsIntensityFmt); - else if (pixelformat == PEControl::RGB8_Z24) - EncodeRGB8(dest_ptr, src, copyfmt, bIsIntensityFmt); - else if (pixelformat == PEControl::RGB565_Z16) // not supported - EncodeRGB8(dest_ptr, src, copyfmt, bIsIntensityFmt); - else if (pixelformat == PEControl::Z24) - EncodeZ24(dest_ptr, src, copyfmt); + EncodeEfbCopy(dst, params, native_width, bytes_per_row, num_blocks_y, memory_stride, src_rect, scale_by_half); } } } |
