From 6e686f6ea10c486a6271a6ca7cd084e124776b5a Mon Sep 17 00:00:00 2001 From: iwubcode Date: Wed, 23 Aug 2017 21:46:23 -0500 Subject: Software Backend: Fix xfb output and add vertical scaling support --- .../Core/VideoBackends/Software/TextureEncoder.cpp | 77 +++++++++++++++------- 1 file changed, 53 insertions(+), 24 deletions(-) (limited to 'Source/Core/VideoBackends/Software/TextureEncoder.cpp') 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(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); } } } -- cgit v1.2.3 From 53684701fa1f9a787f8d089d864c5c1c97effa8c Mon Sep 17 00:00:00 2001 From: iwubcode Date: Sat, 2 Sep 2017 21:30:34 -0500 Subject: HybridXFB: Fix lint errors --- .../Core/VideoBackends/Software/TextureEncoder.cpp | 88 +++++++++++----------- 1 file changed, 44 insertions(+), 44 deletions(-) (limited to 'Source/Core/VideoBackends/Software/TextureEncoder.cpp') diff --git a/Source/Core/VideoBackends/Software/TextureEncoder.cpp b/Source/Core/VideoBackends/Software/TextureEncoder.cpp index bceb567524..52a709d04e 100644 --- a/Source/Core/VideoBackends/Software/TextureEncoder.cpp +++ b/Source/Core/VideoBackends/Software/TextureEncoder.cpp @@ -1419,63 +1419,63 @@ static void EncodeZ24halfscale(u8* dst, const u8* src, EFBCopyFormat format) namespace { - 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); +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); - 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; - } + 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; - } + } + 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; } } } +} 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) + u32 num_blocks_y, u32 memory_stride, const EFBRectangle& src_rect, bool scale_by_half) { if (params.copy_format == EFBCopyFormat::XFB) { - EfbInterface::EncodeXFB(reinterpret_cast(dst), native_width, src_rect, params.y_scale); + EfbInterface::EncodeXFB(reinterpret_cast(dst), native_width, + src_rect, params.y_scale); } else { - EncodeEfbCopy(dst, params, native_width, bytes_per_row, num_blocks_y, memory_stride, src_rect, scale_by_half); + EncodeEfbCopy(dst, params, native_width, bytes_per_row, num_blocks_y, memory_stride, src_rect, + scale_by_half); } } } -- cgit v1.2.3 From bf7db3f88835d3b69800c9ed5596e31c7ba96346 Mon Sep 17 00:00:00 2001 From: iwubcode Date: Tue, 24 Oct 2017 00:44:14 -0500 Subject: Software Backend: Remove reinterpret_cast which violates the strict aliasing rule --- Source/Core/VideoBackends/Software/TextureEncoder.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'Source/Core/VideoBackends/Software/TextureEncoder.cpp') diff --git a/Source/Core/VideoBackends/Software/TextureEncoder.cpp b/Source/Core/VideoBackends/Software/TextureEncoder.cpp index 52a709d04e..4d0997ebf5 100644 --- a/Source/Core/VideoBackends/Software/TextureEncoder.cpp +++ b/Source/Core/VideoBackends/Software/TextureEncoder.cpp @@ -1469,8 +1469,7 @@ void Encode(u8* dst, const EFBCopyParams& params, u32 native_width, u32 bytes_pe { if (params.copy_format == EFBCopyFormat::XFB) { - EfbInterface::EncodeXFB(reinterpret_cast(dst), native_width, - src_rect, params.y_scale); + EfbInterface::EncodeXFB(dst, native_width, src_rect, params.y_scale); } else { -- cgit v1.2.3