summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/TextureDecoder.cpp
diff options
context:
space:
mode:
authorNeoBrainX <NeoBrainX@gmail.com>2013-01-09 10:19:18 +0100
committerNeoBrainX <NeoBrainX@gmail.com>2013-01-10 18:30:16 +0100
commit304814e7cca0d9ac1497a955f7a6741a62fe4396 (patch)
treed8411a23f2322aaaa4d64e6ee05cdd76b087c798 /Source/Core/VideoCommon/Src/TextureDecoder.cpp
parent7bf72a6c8476798ecbb9cdb13ec3a8f0b9858da6 (diff)
Video_Software: Implement proper RGBA8 texture loading from tmem.
For RGBA8 textures, AR and GB tiles are stored in separate tmem banks. TextureDecoder did not support that previously.
Diffstat (limited to 'Source/Core/VideoCommon/Src/TextureDecoder.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/TextureDecoder.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/Src/TextureDecoder.cpp b/Source/Core/VideoCommon/Src/TextureDecoder.cpp
index 180c901730..362a42e015 100644
--- a/Source/Core/VideoCommon/Src/TextureDecoder.cpp
+++ b/Source/Core/VideoCommon/Src/TextureDecoder.cpp
@@ -2515,6 +2515,28 @@ void TexDecoder_DecodeTexel(u8 *dst, const u8 *src, int s, int t, int imageWidth
}
}
+void TexDecoder_DecodeTexelRGBA8FromTmem(u8 *dst, const u8 *src_ar, const u8* src_gb, int s, int t, int imageWidth)
+{
+ u16 sBlk = s >> 2;
+ u16 tBlk = t >> 2;
+ u16 widthBlks = (imageWidth >> 2) + 1;
+ u32 base_ar = (tBlk * widthBlks + sBlk) << 4;
+ u32 base_gb = (tBlk * widthBlks + sBlk) << 4;
+ u16 blkS = s & 3;
+ u16 blkT = t & 3;
+ u32 blk_off = (blkT << 2) + blkS;
+
+ u32 offset_ar = (base_ar + blk_off) << 1;
+ u32 offset_gb = (base_gb + blk_off) << 1;
+ const u8* val_addr_ar = src_ar + offset_ar;
+ const u8* val_addr_gb = src_gb + offset_gb;
+
+ dst[3] = val_addr_ar[0]; // A
+ dst[0] = val_addr_ar[1]; // R
+ dst[1] = val_addr_gb[0]; // G
+ dst[2] = val_addr_gb[1]; // B
+}
+
const char* texfmt[] = {
// pixel