mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 06:09:50 -06:00
Add support for hybrid XFB
This commit is contained in:
@ -3,9 +3,11 @@
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
#include <cmath>
|
||||
|
||||
#include "Common/CommonTypes.h"
|
||||
#include "Common/MathUtil.h"
|
||||
#include "Common/MsgHandler.h"
|
||||
#include "Common/Swap.h"
|
||||
|
||||
@ -46,6 +48,9 @@ int TexDecoder_GetTexelSizeInNibbles(TextureFormat format)
|
||||
// Compressed format
|
||||
case TextureFormat::CMPR:
|
||||
return 1;
|
||||
// Special formats
|
||||
case TextureFormat::XFB:
|
||||
return 4;
|
||||
default:
|
||||
PanicAlert("Invalid Texture Format (0x%X)! (GetTexelSizeInNibbles)", static_cast<int>(format));
|
||||
return 1;
|
||||
@ -82,6 +87,9 @@ int TexDecoder_GetBlockWidthInTexels(TextureFormat format)
|
||||
// Compressed format
|
||||
case TextureFormat::CMPR:
|
||||
return 8;
|
||||
// Special formats
|
||||
case TextureFormat::XFB:
|
||||
return 16;
|
||||
default:
|
||||
PanicAlert("Invalid Texture Format (0x%X)! (GetBlockWidthInTexels)", static_cast<int>(format));
|
||||
return 8;
|
||||
@ -113,6 +121,9 @@ int TexDecoder_GetBlockHeightInTexels(TextureFormat format)
|
||||
// Compressed format
|
||||
case TextureFormat::CMPR:
|
||||
return 8;
|
||||
// Special formats
|
||||
case TextureFormat::XFB:
|
||||
return 1;
|
||||
default:
|
||||
PanicAlert("Invalid Texture Format (0x%X)! (GetBlockHeightInTexels)", static_cast<int>(format));
|
||||
return 4;
|
||||
@ -144,6 +155,9 @@ int TexDecoder_GetEFBCopyBlockWidthInTexels(EFBCopyFormat format)
|
||||
// 32-bit formats
|
||||
case EFBCopyFormat::RGBA8:
|
||||
return 4;
|
||||
// Special formats
|
||||
case EFBCopyFormat::XFB:
|
||||
return 16;
|
||||
default:
|
||||
PanicAlert("Invalid EFB Copy Format (0x%X)! (GetEFBCopyBlockWidthInTexels)",
|
||||
static_cast<int>(format));
|
||||
@ -176,6 +190,9 @@ int TexDecoder_GetEFBCopyBlockHeightInTexels(EFBCopyFormat format)
|
||||
// 32-bit formats
|
||||
case EFBCopyFormat::RGBA8:
|
||||
return 4;
|
||||
// Special formats
|
||||
case EFBCopyFormat::XFB:
|
||||
return 1;
|
||||
default:
|
||||
PanicAlert("Invalid EFB Copy Format (0x%X)! (GetEFBCopyBlockHeightInTexels)",
|
||||
static_cast<int>(format));
|
||||
@ -226,6 +243,8 @@ TextureFormat TexDecoder_GetEFBCopyBaseFormat(EFBCopyFormat format)
|
||||
return TextureFormat::RGB5A3;
|
||||
case EFBCopyFormat::RGBA8:
|
||||
return TextureFormat::RGBA8;
|
||||
case EFBCopyFormat::XFB:
|
||||
return TextureFormat::XFB;
|
||||
default:
|
||||
PanicAlert("Invalid EFB Copy Format (0x%X)! (GetEFBCopyBaseFormat)", static_cast<int>(format));
|
||||
return static_cast<TextureFormat>(format);
|
||||
@ -247,7 +266,7 @@ static const char* texfmt[] = {
|
||||
"0x1C", "0x1D", "0x1E", "0x1F",
|
||||
// pixel + copy
|
||||
"CR4", "0x21", "CRA4", "CRA8", "0x24", "0x25", "CYUVA8", "CA8", "CR8", "CG8", "CB8", "CRG8",
|
||||
"CGB8", "0x2D", "0x2E", "0x2F",
|
||||
"CGB8", "0x2D", "0x2E", "XFB",
|
||||
// Z + copy
|
||||
"CZ4", "0x31", "0x32", "0x33", "0x34", "0x35", "0x36", "0x37", "0x38", "CZ8M", "CZ8L", "0x3B",
|
||||
"CZ16L", "0x3D", "0x3E", "0x3F",
|
||||
@ -619,6 +638,24 @@ void TexDecoder_DecodeTexel(u8* dst, const u8* src, int s, int t, int imageWidth
|
||||
*((u32*)dst) = color;
|
||||
}
|
||||
break;
|
||||
case TextureFormat::XFB:
|
||||
{
|
||||
// TODO: I should kind of like... ACTUALLY TEST THIS!!!!!
|
||||
size_t offset = (t * imageWidth + (s & (~1))) * 2;
|
||||
|
||||
// We do this one color sample (aka 2 RGB pixles) at a time
|
||||
int Y = int((s & 1) == 0 ? src[offset] : src[offset + 2]) - 16;
|
||||
int U = int(src[offset + 1]) - 128;
|
||||
int V = int(src[offset + 3]) - 128;
|
||||
|
||||
// We do the inverse BT.601 conversion for YCbCr to RGB
|
||||
// http://www.equasys.de/colorconversion.html#YCbCr-RGBColorFormatConversion
|
||||
u8 R = MathUtil::Clamp(int(1.164f * Y + 1.596f * V), 0, 255);
|
||||
u8 G = MathUtil::Clamp(int(1.164f * Y - 0.392f * U - 0.813f * V), 0, 255);
|
||||
u8 B = MathUtil::Clamp(int(1.164f * Y + 2.017f * U), 0, 255);
|
||||
dst[t * imageWidth + s] = 0xff000000 | B << 16 | G << 8 | R;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user