summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Software/TextureEncoder.cpp
diff options
context:
space:
mode:
authorPierre Bourdon <delroth@gmail.com>2017-11-19 04:58:59 +0100
committerGitHub <noreply@github.com>2017-11-19 04:58:59 +0100
commit609a17a0cd41a12c0fbf9a7c47c8889232594778 (patch)
tree0a5f6f4b0a7d480accc4dfbcc3e9c1c6e3652dc0 /Source/Core/VideoBackends/Software/TextureEncoder.cpp
parentd800b0f79868a28356b4e40cb9b2e5af43977042 (diff)
parent1f1574b7ab032afa7b3a600a071699f2cbea124e (diff)
Merge pull request #5498 from iwubcode/hybrid_xfb
Hybrid xfb
Diffstat (limited to 'Source/Core/VideoBackends/Software/TextureEncoder.cpp')
-rw-r--r--Source/Core/VideoBackends/Software/TextureEncoder.cpp76
1 files changed, 52 insertions, 24 deletions
diff --git a/Source/Core/VideoBackends/Software/TextureEncoder.cpp b/Source/Core/VideoBackends/Software/TextureEncoder.cpp
index 6181d56dd4..4d0997ebf5 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,64 @@ 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(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);
}
}
}