diff options
| author | Nolan Check <Nolan.Check@gmail.com> | 2009-07-30 20:29:52 +0000 |
|---|---|---|
| committer | Nolan Check <Nolan.Check@gmail.com> | 2009-07-30 20:29:52 +0000 |
| commit | 8ab4814d73215271f0baaccf5cc51e7eba2b9c17 (patch) | |
| tree | 8e544de45d9bbe9533b5a1120ac35e14de26d37b /Source/Core/VideoCommon/Src/TextureDecoder.cpp | |
| parent | dcae5938c9a9d9d27085746873788cfefbb6270e (diff) | |
Don't use lookup tables. It's better to use CPU registers and reduce memory accesses.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3909 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon/Src/TextureDecoder.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/Src/TextureDecoder.cpp | 54 |
1 files changed, 22 insertions, 32 deletions
diff --git a/Source/Core/VideoCommon/Src/TextureDecoder.cpp b/Source/Core/VideoCommon/Src/TextureDecoder.cpp index 4ff92967a7..c427efaddc 100644 --- a/Source/Core/VideoCommon/Src/TextureDecoder.cpp +++ b/Source/Core/VideoCommon/Src/TextureDecoder.cpp @@ -150,16 +150,6 @@ int TexDecoder_GetPaletteSize(int format) } } -inline u32 decode565(u16 val) -{ - int r,g,b,a; - r=lut5to8[(val>>11) & 0x1f]; - g=lut6to8[(val>>5 ) & 0x3f]; - b=lut5to8[(val ) & 0x1f]; - a=0xFF; - return (a << 24) | (r << 16) | (g << 8) | b; -} - inline u32 decodeIA8(u16 val) { int a = val >> 8; @@ -172,17 +162,17 @@ inline u32 decode5A3(u16 val) int r,g,b,a; if ((val & 0x8000)) { - r=lut5to8[(val >> 10) & 0x1f]; - g=lut5to8[(val >> 5 ) & 0x1f]; - b=lut5to8[(val ) & 0x1f]; - a=0xFF; + a = 0xFF; + r = Convert5To8((val >> 10) & 0x1F); + g = Convert5To8((val >> 5) & 0x1F); + b = Convert5To8(val & 0x1F); } else { - a=lut3to8[(val >> 12) & 0x7]; - r=lut4to8[(val >> 8 ) & 0xf]; - g=lut4to8[(val >> 4 ) & 0xf]; - b=lut4to8[(val ) & 0xf]; + a = Convert3To8((val >> 12) & 0x7); + r = Convert4To8((val >> 8) & 0xF); + g = Convert4To8((val >> 4) & 0xF); + b = Convert4To8(val & 0xF); } return (a << 24) | (r << 16) | (g << 8) | b; } @@ -263,13 +253,13 @@ inline void decodebytesC14X2_To_Raw16(u16* dst, const u16* src, int tlutaddr) //inline void decodebytesIA4(u16 *dst, const u8 *src, int numbytes) inline void decodebytesIA4(u16 *dst, const u8 *src) { - for (int x = 0; x < 8; x++) - { + for (int x = 0; x < 8; x++) + { const u8 val = src[x]; - const u8 a = lut4to8[val >> 4]; - const u8 l = lut4to8[val & 0xF]; - dst[x] = (a << 8) | l; - } + u8 a = Convert4To8(val >> 4); + u8 l = Convert4To8(val & 0xF); + dst[x] = (a << 8) | l; + } } //inline void decodebytesRGB5A3(u32 *dst, const u16 *src, int numpixels) @@ -305,12 +295,12 @@ void decodeDXTBlock(u32 *dst, const DXTBlock *src, int pitch) // S3TC Decoder (Note: GCN decodes differently from PC) u16 c1 = Common::swap16(src->color1); u16 c2 = Common::swap16(src->color2); - int blue1 = lut5to8[c1 & 0x1F]; - int blue2 = lut5to8[c2 & 0x1F]; - int green1 = lut6to8[(c1 >> 5) & 0x3F]; - int green2 = lut6to8[(c2 >> 5) & 0x3F]; - int red1 = lut5to8[(c1 >> 11) & 0x1F]; - int red2 = lut5to8[(c2 >> 11) & 0x1F]; + u8 blue1 = Convert5To8(c1 & 0x1F); + u8 blue2 = Convert5To8(c2 & 0x1F); + u8 green1 = Convert6To8((c1 >> 5) & 0x3F); + u8 green2 = Convert6To8((c2 >> 5) & 0x3F); + u8 red1 = Convert5To8((c1 >> 11) & 0x1F); + u8 red2 = Convert5To8((c2 >> 11) & 0x1F); int colors[4]; @@ -402,8 +392,8 @@ PC_TexFormat TexDecoder_Decode_real(u8 *dst, const u8 *src, int width, int heigh for (int ix = 0; ix < 4; ix++) { int val = src[ix]; - dst[(y + iy) * width + x + ix * 2] = lut4to8[val >> 4]; - dst[(y + iy) * width + x + ix * 2 + 1] = lut4to8[val & 15]; + dst[(y + iy) * width + x + ix * 2] = Convert4To8(val >> 4); + dst[(y + iy) * width + x + ix * 2 + 1] = Convert4To8(val & 0xF); } } return PC_TEX_FMT_I4_AS_I8; |
