mirror of https://github.com/PCSX2/pcsx2.git
GS: Switch integer typedefs to match rest of pcsx2
Had to capitalize the names of some struct params that had the same names
This commit is contained in:
parent
2351431d71
commit
b74be70ffc
|
@ -194,7 +194,6 @@ static const int __pagesize = PCSX2_PAGESIZE;
|
|||
#define __fc __fastcall
|
||||
|
||||
// Makes sure that if anyone includes xbyak, it doesn't do anything bad
|
||||
#define MIE_INTEGER_TYPE_DEFINED
|
||||
#define XBYAK_ENABLE_OMITTED_OPERAND
|
||||
|
||||
#ifdef __x86_64__
|
||||
|
|
|
@ -46,7 +46,7 @@ static HRESULT s_hr = E_FAIL;
|
|||
#undef None
|
||||
|
||||
static GSRenderer* s_gs = NULL;
|
||||
static uint8* s_basemem = NULL;
|
||||
static u8* s_basemem = NULL;
|
||||
static int s_vsync = 0;
|
||||
static bool s_exclusive = true;
|
||||
static std::string s_renderer_name;
|
||||
|
@ -59,7 +59,7 @@ static int s_new_gs_window_width = 0;
|
|||
static int s_new_gs_window_height = 0;
|
||||
#endif
|
||||
|
||||
void GSsetBaseMem(uint8* mem)
|
||||
void GSsetBaseMem(u8* mem)
|
||||
{
|
||||
s_basemem = mem;
|
||||
|
||||
|
@ -267,19 +267,19 @@ int _GSopen(const WindowInfo& wi, const char* title, GSRendererType renderer, in
|
|||
return 0;
|
||||
}
|
||||
|
||||
void GSosdLog(const char* utf8, uint32 color)
|
||||
void GSosdLog(const char* utf8, u32 color)
|
||||
{
|
||||
if (s_gs && s_gs->m_dev)
|
||||
s_gs->m_dev->m_osd.Log(utf8);
|
||||
}
|
||||
|
||||
void GSosdMonitor(const char* key, const char* value, uint32 color)
|
||||
void GSosdMonitor(const char* key, const char* value, u32 color)
|
||||
{
|
||||
if (s_gs && s_gs->m_dev)
|
||||
s_gs->m_dev->m_osd.Monitor(key, value);
|
||||
}
|
||||
|
||||
int GSopen2(const WindowInfo& wi, uint32 flags)
|
||||
int GSopen2(const WindowInfo& wi, u32 flags)
|
||||
{
|
||||
static bool stored_toggle_state = false;
|
||||
const bool toggle_state = !!(flags & 4);
|
||||
|
@ -344,7 +344,7 @@ void GSreset()
|
|||
}
|
||||
}
|
||||
|
||||
void GSgifSoftReset(uint32 mask)
|
||||
void GSgifSoftReset(u32 mask)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -355,7 +355,7 @@ void GSgifSoftReset(uint32 mask)
|
|||
}
|
||||
}
|
||||
|
||||
void GSwriteCSR(uint32 csr)
|
||||
void GSwriteCSR(u32 csr)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -366,7 +366,7 @@ void GSwriteCSR(uint32 csr)
|
|||
}
|
||||
}
|
||||
|
||||
void GSinitReadFIFO(uint8* mem)
|
||||
void GSinitReadFIFO(u8* mem)
|
||||
{
|
||||
GL_PERF("Init Read FIFO1");
|
||||
try
|
||||
|
@ -382,7 +382,7 @@ void GSinitReadFIFO(uint8* mem)
|
|||
}
|
||||
}
|
||||
|
||||
void GSreadFIFO(uint8* mem)
|
||||
void GSreadFIFO(u8* mem)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -397,7 +397,7 @@ void GSreadFIFO(uint8* mem)
|
|||
}
|
||||
}
|
||||
|
||||
void GSinitReadFIFO2(uint8* mem, uint32 size)
|
||||
void GSinitReadFIFO2(u8* mem, u32 size)
|
||||
{
|
||||
GL_PERF("Init Read FIFO2");
|
||||
try
|
||||
|
@ -413,7 +413,7 @@ void GSinitReadFIFO2(uint8* mem, uint32 size)
|
|||
}
|
||||
}
|
||||
|
||||
void GSreadFIFO2(uint8* mem, uint32 size)
|
||||
void GSreadFIFO2(u8* mem, u32 size)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -428,7 +428,7 @@ void GSreadFIFO2(uint8* mem, uint32 size)
|
|||
}
|
||||
}
|
||||
|
||||
void GSgifTransfer(const uint8* mem, uint32 size)
|
||||
void GSgifTransfer(const u8* mem, u32 size)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -439,33 +439,33 @@ void GSgifTransfer(const uint8* mem, uint32 size)
|
|||
}
|
||||
}
|
||||
|
||||
void GSgifTransfer1(uint8* mem, uint32 addr)
|
||||
void GSgifTransfer1(u8* mem, u32 addr)
|
||||
{
|
||||
try
|
||||
{
|
||||
s_gs->Transfer<0>(const_cast<uint8*>(mem) + addr, (0x4000 - addr) / 16);
|
||||
s_gs->Transfer<0>(const_cast<u8*>(mem) + addr, (0x4000 - addr) / 16);
|
||||
}
|
||||
catch (GSRecoverableError)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void GSgifTransfer2(uint8* mem, uint32 size)
|
||||
void GSgifTransfer2(u8* mem, u32 size)
|
||||
{
|
||||
try
|
||||
{
|
||||
s_gs->Transfer<1>(const_cast<uint8*>(mem), size);
|
||||
s_gs->Transfer<1>(const_cast<u8*>(mem), size);
|
||||
}
|
||||
catch (GSRecoverableError)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void GSgifTransfer3(uint8* mem, uint32 size)
|
||||
void GSgifTransfer3(u8* mem, u32 size)
|
||||
{
|
||||
try
|
||||
{
|
||||
s_gs->Transfer<2>(const_cast<uint8*>(mem), size);
|
||||
s_gs->Transfer<2>(const_cast<u8*>(mem), size);
|
||||
}
|
||||
catch (GSRecoverableError)
|
||||
{
|
||||
|
@ -487,7 +487,7 @@ void GSvsync(int field)
|
|||
}
|
||||
}
|
||||
|
||||
uint32 GSmakeSnapshot(char* path)
|
||||
u32 GSmakeSnapshot(char* path)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -629,7 +629,7 @@ void GSendRecording()
|
|||
pt(" - Capture ended\n");
|
||||
}
|
||||
|
||||
void GSsetGameCRC(uint32 crc, int options)
|
||||
void GSsetGameCRC(u32 crc, int options)
|
||||
{
|
||||
s_gs->SetGameCRC(crc, options);
|
||||
}
|
||||
|
@ -746,7 +746,7 @@ void vmfree(void* ptr, size_t size)
|
|||
}
|
||||
|
||||
static HANDLE s_fh = NULL;
|
||||
static uint8* s_Next[8];
|
||||
static u8* s_Next[8];
|
||||
|
||||
void* fifo_alloc(size_t size, size_t repeat)
|
||||
{
|
||||
|
@ -770,8 +770,8 @@ void* fifo_alloc(size_t size, size_t repeat)
|
|||
void* fifo = MapViewOfFile(s_fh, FILE_MAP_ALL_ACCESS, 0, 0, size);
|
||||
for (size_t i = 1; i < repeat; i++)
|
||||
{
|
||||
void* base = (uint8*)fifo + size * i;
|
||||
s_Next[i] = (uint8*)MapViewOfFileEx(s_fh, FILE_MAP_ALL_ACCESS, 0, 0, size, base);
|
||||
void* base = (u8*)fifo + size * i;
|
||||
s_Next[i] = (u8*)MapViewOfFileEx(s_fh, FILE_MAP_ALL_ACCESS, 0, 0, size, base);
|
||||
errorID = ::GetLastError();
|
||||
if (s_Next[i] != base)
|
||||
{
|
||||
|
@ -881,8 +881,8 @@ void* fifo_alloc(size_t size, size_t repeat)
|
|||
|
||||
for (size_t i = 1; i < repeat; i++)
|
||||
{
|
||||
void* base = (uint8*)fifo + size * i;
|
||||
uint8* next = (uint8*)mmap(base, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, s_shm_fd, 0);
|
||||
void* base = (u8*)fifo + size * i;
|
||||
u8* next = (u8*)mmap(base, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, s_shm_fd, 0);
|
||||
if (next != base)
|
||||
fprintf(stderr, "Fail to mmap contiguous segment\n");
|
||||
}
|
||||
|
@ -1081,16 +1081,16 @@ void GSApp::Init()
|
|||
m_section = "Settings";
|
||||
|
||||
#ifdef _WIN32
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::DX1011_HW), "Direct3D 11", ""));
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::OGL_HW), "OpenGL", ""));
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::OGL_SW), "Software", ""));
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<u32>(GSRendererType::DX1011_HW), "Direct3D 11", ""));
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<u32>(GSRendererType::OGL_HW), "OpenGL", ""));
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<u32>(GSRendererType::OGL_SW), "Software", ""));
|
||||
#else // Linux
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::OGL_HW), "OpenGL", ""));
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::OGL_SW), "Software", ""));
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<u32>(GSRendererType::OGL_HW), "OpenGL", ""));
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<u32>(GSRendererType::OGL_SW), "Software", ""));
|
||||
#endif
|
||||
|
||||
// The null renderer goes third, it has use for benchmarking purposes in a release build
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<uint32>(GSRendererType::Null), "Null", ""));
|
||||
m_gs_renderers.push_back(GSSetting(static_cast<u32>(GSRendererType::Null), "Null", ""));
|
||||
|
||||
m_gs_interlace.push_back(GSSetting(0, "None", ""));
|
||||
m_gs_interlace.push_back(GSSetting(1, "Weave tff", "saw-tooth"));
|
||||
|
@ -1120,14 +1120,14 @@ void GSApp::Init()
|
|||
m_gs_dithering.push_back(GSSetting(2, "Unscaled", "Default"));
|
||||
m_gs_dithering.push_back(GSSetting(1, "Scaled", ""));
|
||||
|
||||
m_gs_bifilter.push_back(GSSetting(static_cast<uint32>(BiFiltering::Nearest), "Nearest", ""));
|
||||
m_gs_bifilter.push_back(GSSetting(static_cast<uint32>(BiFiltering::Forced_But_Sprite), "Bilinear", "Forced excluding sprite"));
|
||||
m_gs_bifilter.push_back(GSSetting(static_cast<uint32>(BiFiltering::Forced), "Bilinear", "Forced"));
|
||||
m_gs_bifilter.push_back(GSSetting(static_cast<uint32>(BiFiltering::PS2), "Bilinear", "PS2"));
|
||||
m_gs_bifilter.push_back(GSSetting(static_cast<u32>(BiFiltering::Nearest), "Nearest", ""));
|
||||
m_gs_bifilter.push_back(GSSetting(static_cast<u32>(BiFiltering::Forced_But_Sprite), "Bilinear", "Forced excluding sprite"));
|
||||
m_gs_bifilter.push_back(GSSetting(static_cast<u32>(BiFiltering::Forced), "Bilinear", "Forced"));
|
||||
m_gs_bifilter.push_back(GSSetting(static_cast<u32>(BiFiltering::PS2), "Bilinear", "PS2"));
|
||||
|
||||
m_gs_trifilter.push_back(GSSetting(static_cast<uint32>(TriFiltering::None), "None", "Default"));
|
||||
m_gs_trifilter.push_back(GSSetting(static_cast<uint32>(TriFiltering::PS2), "Trilinear", ""));
|
||||
m_gs_trifilter.push_back(GSSetting(static_cast<uint32>(TriFiltering::Forced), "Trilinear", "Ultra/Slow"));
|
||||
m_gs_trifilter.push_back(GSSetting(static_cast<u32>(TriFiltering::None), "None", "Default"));
|
||||
m_gs_trifilter.push_back(GSSetting(static_cast<u32>(TriFiltering::PS2), "Trilinear", ""));
|
||||
m_gs_trifilter.push_back(GSSetting(static_cast<u32>(TriFiltering::Forced), "Trilinear", "Ultra/Slow"));
|
||||
|
||||
m_gs_generic_list.push_back(GSSetting(-1, "Automatic", "Default"));
|
||||
m_gs_generic_list.push_back(GSSetting(0, "Force-Disabled", ""));
|
||||
|
@ -1202,7 +1202,7 @@ void GSApp::Init()
|
|||
m_default_configuration["capture_threads"] = "4";
|
||||
m_default_configuration["CaptureHeight"] = "480";
|
||||
m_default_configuration["CaptureWidth"] = "640";
|
||||
m_default_configuration["crc_hack_level"] = std::to_string(static_cast<int8>(CRCHackLevel::Automatic));
|
||||
m_default_configuration["crc_hack_level"] = std::to_string(static_cast<s8>(CRCHackLevel::Automatic));
|
||||
m_default_configuration["CrcHacksExclusions"] = "";
|
||||
m_default_configuration["debug_glsl_shader"] = "0";
|
||||
m_default_configuration["debug_opengl"] = "0";
|
||||
|
@ -1211,7 +1211,7 @@ void GSApp::Init()
|
|||
m_default_configuration["dump"] = "0";
|
||||
m_default_configuration["extrathreads"] = "2";
|
||||
m_default_configuration["extrathreads_height"] = "4";
|
||||
m_default_configuration["filter"] = std::to_string(static_cast<int8>(BiFiltering::PS2));
|
||||
m_default_configuration["filter"] = std::to_string(static_cast<s8>(BiFiltering::PS2));
|
||||
m_default_configuration["force_texture_clear"] = "0";
|
||||
m_default_configuration["fxaa"] = "0";
|
||||
m_default_configuration["interlace"] = "7";
|
||||
|
@ -1288,7 +1288,7 @@ void GSApp::Init()
|
|||
m_default_configuration["UserHacks_TCOffsetX"] = "0";
|
||||
m_default_configuration["UserHacks_TCOffsetY"] = "0";
|
||||
m_default_configuration["UserHacks_TextureInsideRt"] = "0";
|
||||
m_default_configuration["UserHacks_TriFilter"] = std::to_string(static_cast<int8>(TriFiltering::None));
|
||||
m_default_configuration["UserHacks_TriFilter"] = std::to_string(static_cast<s8>(TriFiltering::None));
|
||||
m_default_configuration["UserHacks_WildHack"] = "0";
|
||||
m_default_configuration["wrap_gs_mem"] = "0";
|
||||
m_default_configuration["vsync"] = "0";
|
||||
|
|
1042
pcsx2/GS/GS.h
1042
pcsx2/GS/GS.h
File diff suppressed because it is too large
Load Diff
|
@ -47,11 +47,11 @@ class GSBlock
|
|||
static const GSVector4i m_uw8hmask3;
|
||||
|
||||
public:
|
||||
template <int i, int alignment, uint32 mask>
|
||||
__forceinline static void WriteColumn32(uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
template <int i, int alignment, u32 mask>
|
||||
__forceinline static void WriteColumn32(u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
const uint8* RESTRICT s0 = &src[srcpitch * 0];
|
||||
const uint8* RESTRICT s1 = &src[srcpitch * 1];
|
||||
const u8* RESTRICT s0 = &src[srcpitch * 0];
|
||||
const u8* RESTRICT s1 = &src[srcpitch * 1];
|
||||
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
|
@ -173,12 +173,12 @@ public:
|
|||
}
|
||||
|
||||
template <int i, int alignment>
|
||||
__forceinline static void WriteColumn16(uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
__forceinline static void WriteColumn16(u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
const uint8* RESTRICT s0 = &src[srcpitch * 0];
|
||||
const uint8* RESTRICT s1 = &src[srcpitch * 1];
|
||||
const u8* RESTRICT s0 = &src[srcpitch * 0];
|
||||
const u8* RESTRICT s1 = &src[srcpitch * 1];
|
||||
|
||||
// for(int j = 0; j < 16; j++) {((uint16*)s0)[j] = columnTable16[0][j]; ((uint16*)s1)[j] = columnTable16[1][j];}
|
||||
// for(int j = 0; j < 16; j++) {((u16*)s0)[j] = columnTable16[0][j]; ((u16*)s1)[j] = columnTable16[1][j];}
|
||||
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
|
@ -247,7 +247,7 @@ public:
|
|||
}
|
||||
|
||||
template <int i, int alignment>
|
||||
__forceinline static void WriteColumn8(uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
__forceinline static void WriteColumn8(u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
// TODO: read unaligned as WriteColumn32 does and try saving a few shuffles
|
||||
|
||||
|
@ -310,7 +310,7 @@ public:
|
|||
}
|
||||
|
||||
template <int i, int alignment>
|
||||
__forceinline static void WriteColumn4(uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
__forceinline static void WriteColumn4(u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
//printf("WriteColumn4\n");
|
||||
|
||||
|
@ -345,8 +345,8 @@ public:
|
|||
((GSVector4i*)dst)[i * 4 + 3] = v3;
|
||||
}
|
||||
|
||||
template <int alignment, uint32 mask>
|
||||
static void WriteColumn32(int y, uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
template <int alignment, u32 mask>
|
||||
static void WriteColumn32(int y, u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
switch ((y >> 1) & 3)
|
||||
{
|
||||
|
@ -359,7 +359,7 @@ public:
|
|||
}
|
||||
|
||||
template <int alignment>
|
||||
static void WriteColumn16(int y, uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
static void WriteColumn16(int y, u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
switch ((y >> 1) & 3)
|
||||
{
|
||||
|
@ -372,7 +372,7 @@ public:
|
|||
}
|
||||
|
||||
template <int alignment>
|
||||
static void WriteColumn8(int y, uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
static void WriteColumn8(int y, u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
switch ((y >> 2) & 3)
|
||||
{
|
||||
|
@ -385,7 +385,7 @@ public:
|
|||
}
|
||||
|
||||
template <int alignment>
|
||||
static void WriteColumn4(int y, uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
static void WriteColumn4(int y, u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
switch ((y >> 2) & 3)
|
||||
{
|
||||
|
@ -397,8 +397,8 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
template <int alignment, uint32 mask>
|
||||
static void WriteBlock32(uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
template <int alignment, u32 mask>
|
||||
static void WriteBlock32(u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
WriteColumn32<0, alignment, mask>(dst, src, srcpitch);
|
||||
src += srcpitch * 2;
|
||||
|
@ -410,7 +410,7 @@ public:
|
|||
}
|
||||
|
||||
template <int alignment>
|
||||
static void WriteBlock16(uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
static void WriteBlock16(u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
WriteColumn16<0, alignment>(dst, src, srcpitch);
|
||||
src += srcpitch * 2;
|
||||
|
@ -422,7 +422,7 @@ public:
|
|||
}
|
||||
|
||||
template <int alignment>
|
||||
static void WriteBlock8(uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
static void WriteBlock8(u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
WriteColumn8<0, alignment>(dst, src, srcpitch);
|
||||
src += srcpitch * 4;
|
||||
|
@ -434,7 +434,7 @@ public:
|
|||
}
|
||||
|
||||
template <int alignment>
|
||||
static void WriteBlock4(uint8* RESTRICT dst, const uint8* RESTRICT src, int srcpitch)
|
||||
static void WriteBlock4(u8* RESTRICT dst, const u8* RESTRICT src, int srcpitch)
|
||||
{
|
||||
WriteColumn4<0, alignment>(dst, src, srcpitch);
|
||||
src += srcpitch * 4;
|
||||
|
@ -446,7 +446,7 @@ public:
|
|||
}
|
||||
|
||||
template <int i>
|
||||
__forceinline static void ReadColumn32(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
__forceinline static void ReadColumn32(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
|
@ -484,7 +484,7 @@ public:
|
|||
}
|
||||
|
||||
template <int i>
|
||||
__forceinline static void ReadColumn16(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
__forceinline static void ReadColumn16(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
|
@ -526,10 +526,10 @@ public:
|
|||
}
|
||||
|
||||
template <int i>
|
||||
__forceinline static void ReadColumn8(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
__forceinline static void ReadColumn8(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
|
||||
//for(int j = 0; j < 64; j++) ((uint8*)src)[j] = (uint8)j;
|
||||
//for(int j = 0; j < 64; j++) ((u8*)src)[j] = (u8)j;
|
||||
|
||||
#if 0 //_M_SSE >= 0x501
|
||||
|
||||
|
@ -593,7 +593,7 @@ public:
|
|||
}
|
||||
|
||||
template <int i>
|
||||
__forceinline static void ReadColumn4(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
__forceinline static void ReadColumn4(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
//printf("ReadColumn4\n");
|
||||
|
||||
|
@ -628,7 +628,7 @@ public:
|
|||
GSVector4i::store<true>(&dst[dstpitch * 3], v3);
|
||||
}
|
||||
|
||||
static void ReadColumn32(int y, const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
static void ReadColumn32(int y, const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
switch ((y >> 1) & 3)
|
||||
{
|
||||
|
@ -640,7 +640,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
static void ReadColumn16(int y, const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
static void ReadColumn16(int y, const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
switch ((y >> 1) & 3)
|
||||
{
|
||||
|
@ -652,7 +652,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
static void ReadColumn8(int y, const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
static void ReadColumn8(int y, const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
switch ((y >> 2) & 3)
|
||||
{
|
||||
|
@ -664,7 +664,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
static void ReadColumn4(int y, const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
static void ReadColumn4(int y, const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
switch ((y >> 2) & 3)
|
||||
{
|
||||
|
@ -676,7 +676,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
static void ReadBlock32(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
static void ReadBlock32(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
ReadColumn32<0>(src, dst, dstpitch);
|
||||
dst += dstpitch * 2;
|
||||
|
@ -687,7 +687,7 @@ public:
|
|||
ReadColumn32<3>(src, dst, dstpitch);
|
||||
}
|
||||
|
||||
static void ReadBlock16(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
static void ReadBlock16(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
ReadColumn16<0>(src, dst, dstpitch);
|
||||
dst += dstpitch * 2;
|
||||
|
@ -698,7 +698,7 @@ public:
|
|||
ReadColumn16<3>(src, dst, dstpitch);
|
||||
}
|
||||
|
||||
static void ReadBlock8(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
static void ReadBlock8(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
ReadColumn8<0>(src, dst, dstpitch);
|
||||
dst += dstpitch * 4;
|
||||
|
@ -709,7 +709,7 @@ public:
|
|||
ReadColumn8<3>(src, dst, dstpitch);
|
||||
}
|
||||
|
||||
static void ReadBlock4(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
static void ReadBlock4(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
ReadColumn4<0>(src, dst, dstpitch);
|
||||
dst += dstpitch * 4;
|
||||
|
@ -720,7 +720,7 @@ public:
|
|||
ReadColumn4<3>(src, dst, dstpitch);
|
||||
}
|
||||
|
||||
__forceinline static void ReadBlock4P(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
__forceinline static void ReadBlock4P(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
//printf("ReadBlock4P\n");
|
||||
|
||||
|
@ -784,12 +784,12 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline static void ReadBlock8HP(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
__forceinline static void ReadBlock8HP(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
uint8* RESTRICT d0 = &dst[dstpitch * 0];
|
||||
uint8* RESTRICT d1 = &dst[dstpitch * 4];
|
||||
u8* RESTRICT d0 = &dst[dstpitch * 0];
|
||||
u8* RESTRICT d1 = &dst[dstpitch * 4];
|
||||
|
||||
const GSVector8i* s = (const GSVector8i*)src;
|
||||
|
||||
|
@ -855,12 +855,12 @@ public:
|
|||
#endif
|
||||
}
|
||||
|
||||
__forceinline static void ReadBlock4HLP(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
__forceinline static void ReadBlock4HLP(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
uint8* RESTRICT d0 = &dst[dstpitch * 0];
|
||||
uint8* RESTRICT d1 = &dst[dstpitch * 4];
|
||||
u8* RESTRICT d0 = &dst[dstpitch * 0];
|
||||
u8* RESTRICT d1 = &dst[dstpitch * 4];
|
||||
|
||||
const GSVector8i* s = (const GSVector8i*)src;
|
||||
|
||||
|
@ -929,12 +929,12 @@ public:
|
|||
#endif
|
||||
}
|
||||
|
||||
__forceinline static void ReadBlock4HHP(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch)
|
||||
__forceinline static void ReadBlock4HHP(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch)
|
||||
{
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
uint8* RESTRICT d0 = &dst[dstpitch * 0];
|
||||
uint8* RESTRICT d1 = &dst[dstpitch * 4];
|
||||
u8* RESTRICT d0 = &dst[dstpitch * 0];
|
||||
u8* RESTRICT d1 = &dst[dstpitch * 4];
|
||||
|
||||
const GSVector8i* s = (const GSVector8i*)src;
|
||||
|
||||
|
@ -1013,7 +1013,7 @@ public:
|
|||
}
|
||||
|
||||
template <bool AEM>
|
||||
static void ExpandBlock24(const uint32* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
static void ExpandBlock24(const u32* RESTRICT src, u8* RESTRICT dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
|
@ -1061,7 +1061,7 @@ public:
|
|||
}
|
||||
|
||||
template <bool AEM>
|
||||
static void ExpandBlock16(const uint16* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const GIFRegTEXA& TEXA) // do not inline, uses too many xmm regs
|
||||
static void ExpandBlock16(const u16* RESTRICT src, u8* RESTRICT dst, int dstpitch, const GIFRegTEXA& TEXA) // do not inline, uses too many xmm regs
|
||||
{
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
|
@ -1101,7 +1101,7 @@ public:
|
|||
#endif
|
||||
}
|
||||
|
||||
__forceinline static void ExpandBlock8_32(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ExpandBlock8_32(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
for (int j = 0; j < 16; j++, dst += dstpitch)
|
||||
{
|
||||
|
@ -1109,7 +1109,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline static void ExpandBlock8_16(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ExpandBlock8_16(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
for (int j = 0; j < 16; j++, dst += dstpitch)
|
||||
{
|
||||
|
@ -1117,7 +1117,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline static void ExpandBlock4_32(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint64* RESTRICT pal)
|
||||
__forceinline static void ExpandBlock4_32(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u64* RESTRICT pal)
|
||||
{
|
||||
for (int j = 0; j < 16; j++, dst += dstpitch)
|
||||
{
|
||||
|
@ -1125,7 +1125,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline static void ExpandBlock4_16(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint64* RESTRICT pal)
|
||||
__forceinline static void ExpandBlock4_16(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u64* RESTRICT pal)
|
||||
{
|
||||
for (int j = 0; j < 16; j++, dst += dstpitch)
|
||||
{
|
||||
|
@ -1133,7 +1133,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline static void ExpandBlock8H_32(uint32* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ExpandBlock8H_32(u32* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
for (int j = 0; j < 8; j++, dst += dstpitch)
|
||||
{
|
||||
|
@ -1144,7 +1144,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline static void ExpandBlock8H_16(uint32* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ExpandBlock8H_16(u32* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
for (int j = 0; j < 8; j++, dst += dstpitch)
|
||||
{
|
||||
|
@ -1158,7 +1158,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline static void ExpandBlock4HL_32(uint32* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ExpandBlock4HL_32(u32* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
for (int j = 0; j < 8; j++, dst += dstpitch)
|
||||
{
|
||||
|
@ -1169,7 +1169,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline static void ExpandBlock4HL_16(uint32* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ExpandBlock4HL_16(u32* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
for (int j = 0; j < 8; j++, dst += dstpitch)
|
||||
{
|
||||
|
@ -1182,7 +1182,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline static void ExpandBlock4HH_32(uint32* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ExpandBlock4HH_32(u32* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
for (int j = 0; j < 8; j++, dst += dstpitch)
|
||||
{
|
||||
|
@ -1193,7 +1193,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline static void ExpandBlock4HH_16(uint32* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ExpandBlock4HH_16(u32* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
for (int j = 0; j < 8; j++, dst += dstpitch)
|
||||
{
|
||||
|
@ -1206,14 +1206,14 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline static void UnpackAndWriteBlock24(const uint8* RESTRICT src, int srcpitch, uint8* RESTRICT dst)
|
||||
__forceinline static void UnpackAndWriteBlock24(const u8* RESTRICT src, int srcpitch, u8* RESTRICT dst)
|
||||
{
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
const uint8* RESTRICT s0 = &src[srcpitch * 0];
|
||||
const uint8* RESTRICT s1 = &src[srcpitch * 1];
|
||||
const uint8* RESTRICT s2 = &src[srcpitch * 2];
|
||||
const uint8* RESTRICT s3 = &src[srcpitch * 3];
|
||||
const u8* RESTRICT s0 = &src[srcpitch * 0];
|
||||
const u8* RESTRICT s1 = &src[srcpitch * 1];
|
||||
const u8* RESTRICT s2 = &src[srcpitch * 2];
|
||||
const u8* RESTRICT s3 = &src[srcpitch * 3];
|
||||
|
||||
GSVector8i v0, v1, v2, v3, v4, v5, v6;
|
||||
GSVector8i mask = GSVector8i::x00ffffff();
|
||||
|
@ -1293,7 +1293,7 @@ public:
|
|||
#endif
|
||||
}
|
||||
|
||||
__forceinline static void UnpackAndWriteBlock8H(const uint8* RESTRICT src, int srcpitch, uint8* RESTRICT dst)
|
||||
__forceinline static void UnpackAndWriteBlock8H(const u8* RESTRICT src, int srcpitch, u8* RESTRICT dst)
|
||||
{
|
||||
|
||||
#if _M_SSE >= 0x501
|
||||
|
@ -1367,13 +1367,13 @@ public:
|
|||
#endif
|
||||
}
|
||||
|
||||
__forceinline static void UnpackAndWriteBlock4HL(const uint8* RESTRICT src, int srcpitch, uint8* RESTRICT dst)
|
||||
__forceinline static void UnpackAndWriteBlock4HL(const u8* RESTRICT src, int srcpitch, u8* RESTRICT dst)
|
||||
{
|
||||
//printf("4HL\n");
|
||||
|
||||
if (0)
|
||||
{
|
||||
uint8* s = (uint8*)src;
|
||||
u8* s = (u8*)src;
|
||||
for (int j = 0; j < 8; j++, s += srcpitch)
|
||||
for (int i = 0; i < 4; i++)
|
||||
s[i] = (columnTable32[j][i * 2] & 0x0f) | (columnTable32[j][i * 2 + 1] << 4);
|
||||
|
@ -1385,7 +1385,7 @@ public:
|
|||
GSVector8i v0, v1, v2, v3;
|
||||
GSVector8i mask(0x0f000000);
|
||||
|
||||
v6 = GSVector4i(*(uint32*)&src[srcpitch * 0], *(uint32*)&src[srcpitch * 2], *(uint32*)&src[srcpitch * 1], *(uint32*)&src[srcpitch * 3]);
|
||||
v6 = GSVector4i(*(u32*)&src[srcpitch * 0], *(u32*)&src[srcpitch * 2], *(u32*)&src[srcpitch * 1], *(u32*)&src[srcpitch * 3]);
|
||||
|
||||
v4 = v6.upl8(v6 >> 4);
|
||||
v5 = v6.uph8(v6 >> 4);
|
||||
|
@ -1405,7 +1405,7 @@ public:
|
|||
|
||||
src += srcpitch * 4;
|
||||
|
||||
v6 = GSVector4i(*(uint32*)&src[srcpitch * 0], *(uint32*)&src[srcpitch * 2], *(uint32*)&src[srcpitch * 1], *(uint32*)&src[srcpitch * 3]);
|
||||
v6 = GSVector4i(*(u32*)&src[srcpitch * 0], *(u32*)&src[srcpitch * 2], *(u32*)&src[srcpitch * 1], *(u32*)&src[srcpitch * 3]);
|
||||
|
||||
v4 = v6.upl8(v6 >> 4);
|
||||
v5 = v6.uph8(v6 >> 4);
|
||||
|
@ -1434,7 +1434,7 @@ public:
|
|||
|
||||
for (int i = 0; i < 2; i++, src += srcpitch * 4)
|
||||
{
|
||||
GSVector4i v(*(uint32*)&src[srcpitch * 0], *(uint32*)&src[srcpitch * 1], *(uint32*)&src[srcpitch * 2], *(uint32*)&src[srcpitch * 3]);
|
||||
GSVector4i v(*(u32*)&src[srcpitch * 0], *(u32*)&src[srcpitch * 1], *(u32*)&src[srcpitch * 2], *(u32*)&src[srcpitch * 3]);
|
||||
|
||||
v4 = v.upl8(v >> 4);
|
||||
v5 = v.uph8(v >> 4);
|
||||
|
@ -1463,7 +1463,7 @@ public:
|
|||
#endif
|
||||
}
|
||||
|
||||
__forceinline static void UnpackAndWriteBlock4HH(const uint8* RESTRICT src, int srcpitch, uint8* RESTRICT dst)
|
||||
__forceinline static void UnpackAndWriteBlock4HH(const u8* RESTRICT src, int srcpitch, u8* RESTRICT dst)
|
||||
{
|
||||
|
||||
#if _M_SSE >= 0x501
|
||||
|
@ -1472,7 +1472,7 @@ public:
|
|||
GSVector8i v0, v1, v2, v3;
|
||||
GSVector8i mask = GSVector8i::xf0000000();
|
||||
|
||||
v6 = GSVector4i(*(uint32*)&src[srcpitch * 0], *(uint32*)&src[srcpitch * 2], *(uint32*)&src[srcpitch * 1], *(uint32*)&src[srcpitch * 3]);
|
||||
v6 = GSVector4i(*(u32*)&src[srcpitch * 0], *(u32*)&src[srcpitch * 2], *(u32*)&src[srcpitch * 1], *(u32*)&src[srcpitch * 3]);
|
||||
|
||||
v4 = (v6 << 4).upl8(v6);
|
||||
v5 = (v6 << 4).uph8(v6);
|
||||
|
@ -1492,7 +1492,7 @@ public:
|
|||
|
||||
src += srcpitch * 4;
|
||||
|
||||
v6 = GSVector4i(*(uint32*)&src[srcpitch * 0], *(uint32*)&src[srcpitch * 2], *(uint32*)&src[srcpitch * 1], *(uint32*)&src[srcpitch * 3]);
|
||||
v6 = GSVector4i(*(u32*)&src[srcpitch * 0], *(u32*)&src[srcpitch * 2], *(u32*)&src[srcpitch * 1], *(u32*)&src[srcpitch * 3]);
|
||||
|
||||
v4 = (v6 << 4).upl8(v6);
|
||||
v5 = (v6 << 4).uph8(v6);
|
||||
|
@ -1521,7 +1521,7 @@ public:
|
|||
|
||||
for (int i = 0; i < 2; i++, src += srcpitch * 4)
|
||||
{
|
||||
GSVector4i v(*(uint32*)&src[srcpitch * 0], *(uint32*)&src[srcpitch * 1], *(uint32*)&src[srcpitch * 2], *(uint32*)&src[srcpitch * 3]);
|
||||
GSVector4i v(*(u32*)&src[srcpitch * 0], *(u32*)&src[srcpitch * 1], *(u32*)&src[srcpitch * 2], *(u32*)&src[srcpitch * 3]);
|
||||
|
||||
v4 = (v << 4).upl8(v);
|
||||
v5 = (v << 4).uph8(v);
|
||||
|
@ -1551,7 +1551,7 @@ public:
|
|||
}
|
||||
|
||||
template <bool AEM>
|
||||
__forceinline static void ReadAndExpandBlock24(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
__forceinline static void ReadAndExpandBlock24(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
|
@ -1628,7 +1628,7 @@ public:
|
|||
}
|
||||
|
||||
template <bool AEM>
|
||||
__forceinline static void ReadAndExpandBlock16(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
__forceinline static void ReadAndExpandBlock16(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
|
@ -1656,16 +1656,16 @@ public:
|
|||
|
||||
#else
|
||||
|
||||
alignas(32) uint16 block[16 * 8];
|
||||
alignas(32) u16 block[16 * 8];
|
||||
|
||||
ReadBlock16(src, (uint8*)block, sizeof(block) / 8);
|
||||
ReadBlock16(src, (u8*)block, sizeof(block) / 8);
|
||||
|
||||
ExpandBlock16<AEM>(block, dst, dstpitch, TEXA);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
__forceinline static void ReadAndExpandBlock8_32(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ReadAndExpandBlock8_32(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
//printf("ReadAndExpandBlock8_32\n");
|
||||
|
||||
|
@ -1714,7 +1714,7 @@ public:
|
|||
|
||||
// TODO: ReadAndExpandBlock8_16
|
||||
|
||||
__forceinline static void ReadAndExpandBlock4_32(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint64* RESTRICT pal)
|
||||
__forceinline static void ReadAndExpandBlock4_32(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u64* RESTRICT pal)
|
||||
{
|
||||
//printf("ReadAndExpandBlock4_32\n");
|
||||
|
||||
|
@ -1779,7 +1779,7 @@ public:
|
|||
|
||||
// TODO: ReadAndExpandBlock4_16
|
||||
|
||||
__forceinline static void ReadAndExpandBlock8H_32(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ReadAndExpandBlock8H_32(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
//printf("ReadAndExpandBlock8H_32\n");
|
||||
|
||||
|
@ -1810,7 +1810,7 @@ public:
|
|||
|
||||
// TODO: ReadAndExpandBlock8H_16
|
||||
|
||||
__forceinline static void ReadAndExpandBlock4HL_32(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ReadAndExpandBlock4HL_32(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
//printf("ReadAndExpandBlock4HL_32\n");
|
||||
const GSVector4i* s = (const GSVector4i*)src;
|
||||
|
@ -1840,7 +1840,7 @@ public:
|
|||
|
||||
// TODO: ReadAndExpandBlock4HL_16
|
||||
|
||||
__forceinline static void ReadAndExpandBlock4HH_32(const uint8* RESTRICT src, uint8* RESTRICT dst, int dstpitch, const uint32* RESTRICT pal)
|
||||
__forceinline static void ReadAndExpandBlock4HH_32(const u8* RESTRICT src, u8* RESTRICT dst, int dstpitch, const u32* RESTRICT pal)
|
||||
{
|
||||
//printf("ReadAndExpandBlock4HH_32\n");
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ GSSource : public CBaseFilter, private CCritSec, public IGSSource
|
|||
vih.bmiHeader.biPlanes = 1;
|
||||
vih.bmiHeader.biBitCount = 16;
|
||||
vih.bmiHeader.biSizeImage = m_size.x * m_size.y * 2;
|
||||
mt.SetFormat((uint8*)&vih, sizeof(vih));
|
||||
mt.SetFormat((u8*)&vih, sizeof(vih));
|
||||
|
||||
m_mts.push_back(mt);
|
||||
|
||||
|
@ -139,7 +139,7 @@ GSSource : public CBaseFilter, private CCritSec, public IGSSource
|
|||
vih.bmiHeader.biPlanes = 1;
|
||||
vih.bmiHeader.biBitCount = 32;
|
||||
vih.bmiHeader.biSizeImage = m_size.x * m_size.y * 4;
|
||||
mt.SetFormat((uint8*)&vih, sizeof(vih));
|
||||
mt.SetFormat((u8*)&vih, sizeof(vih));
|
||||
|
||||
if (colorspace == 1)
|
||||
m_mts.insert(m_mts.begin(), mt);
|
||||
|
@ -272,8 +272,8 @@ public:
|
|||
|
||||
const CMediaType& mt = m_output->CurrentMediaType();
|
||||
|
||||
uint8* src = (uint8*)bits;
|
||||
uint8* dst = NULL;
|
||||
u8* src = (u8*)bits;
|
||||
u8* dst = NULL;
|
||||
|
||||
sample->GetPointer(&dst);
|
||||
|
||||
|
@ -300,8 +300,8 @@ public:
|
|||
|
||||
for (int j = 0; j < h; j++, dst += dstpitch, src += srcpitch)
|
||||
{
|
||||
uint32* s = (uint32*)src;
|
||||
uint16* d = (uint16*)dst;
|
||||
u32* s = (u32*)src;
|
||||
u16* d = (u16*)dst;
|
||||
|
||||
for (int i = 0; i < w; i += 2)
|
||||
{
|
||||
|
@ -314,7 +314,7 @@ public:
|
|||
|
||||
GSVector4 c = lo.hadd(hi) + offset;
|
||||
|
||||
*((uint32*)&d[i]) = GSVector4i(c).rgba32();
|
||||
*((u32*)&d[i]) = GSVector4i(c).rgba32();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -568,8 +568,8 @@ bool GSCapture::DeliverFrame(const void* bits, int pitch, bool rgba)
|
|||
#elif defined(__unix__)
|
||||
|
||||
std::string out_file = m_out_dir + format("/frame.%010d.png", m_frame);
|
||||
//GSPng::Save(GSPng::RGB_PNG, out_file, (uint8*)bits, m_size.x, m_size.y, pitch, m_compression_level);
|
||||
m_workers[m_frame % m_threads]->Push(std::make_shared<GSPng::Transaction>(GSPng::RGB_PNG, out_file, static_cast<const uint8*>(bits), m_size.x, m_size.y, pitch, m_compression_level));
|
||||
//GSPng::Save(GSPng::RGB_PNG, out_file, (u8*)bits, m_size.x, m_size.y, pitch, m_compression_level);
|
||||
m_workers[m_frame % m_threads]->Push(std::make_shared<GSPng::Transaction>(GSPng::RGB_PNG, out_file, static_cast<const u8*>(bits), m_size.x, m_size.y, pitch, m_compression_level));
|
||||
|
||||
m_frame++;
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ class GSCapture
|
|||
std::recursive_mutex m_lock;
|
||||
bool m_capturing;
|
||||
GSVector2i m_size;
|
||||
uint64 m_frame;
|
||||
u64 m_frame;
|
||||
std::string m_out_dir;
|
||||
int m_threads;
|
||||
|
||||
|
|
|
@ -22,11 +22,11 @@
|
|||
GSClut::GSClut(GSLocalMemory* mem)
|
||||
: m_mem(mem)
|
||||
{
|
||||
uint8* p = (uint8*)vmalloc(CLUT_ALLOC_SIZE, false);
|
||||
u8* p = (u8*)vmalloc(CLUT_ALLOC_SIZE, false);
|
||||
|
||||
m_clut = (uint16*)&p[0]; // 1k + 1k for mirrored area simulating wrapping memory
|
||||
m_buff32 = (uint32*)&p[2048]; // 1k
|
||||
m_buff64 = (uint64*)&p[4096]; // 2k
|
||||
m_clut = (u16*)&p[0]; // 1k + 1k for mirrored area simulating wrapping memory
|
||||
m_buff32 = (u32*)&p[2048]; // 1k
|
||||
m_buff64 = (u64*)&p[4096]; // 2k
|
||||
m_write.dirty = true;
|
||||
m_read.dirty = true;
|
||||
|
||||
|
@ -107,7 +107,7 @@ void GSClut::Invalidate()
|
|||
m_write.dirty = true;
|
||||
}
|
||||
|
||||
void GSClut::Invalidate(uint32 block)
|
||||
void GSClut::Invalidate(u32 block)
|
||||
{
|
||||
if (block == m_write.TEX0.CBP)
|
||||
{
|
||||
|
@ -163,34 +163,34 @@ void GSClut::Write(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT)
|
|||
void GSClut::WriteCLUT32_I8_CSM1(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT)
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
WriteCLUT_T32_I8_CSM1((uint32*)m_mem->BlockPtr32(0, 0, TEX0.CBP, 1), m_clut, (TEX0.CSA & 15));
|
||||
WriteCLUT_T32_I8_CSM1((u32*)m_mem->BlockPtr32(0, 0, TEX0.CBP, 1), m_clut, (TEX0.CSA & 15));
|
||||
}
|
||||
|
||||
void GSClut::WriteCLUT32_I4_CSM1(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT)
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
WriteCLUT_T32_I4_CSM1((uint32*)m_mem->BlockPtr32(0, 0, TEX0.CBP, 1), m_clut + ((TEX0.CSA & 15) << 4));
|
||||
WriteCLUT_T32_I4_CSM1((u32*)m_mem->BlockPtr32(0, 0, TEX0.CBP, 1), m_clut + ((TEX0.CSA & 15) << 4));
|
||||
}
|
||||
|
||||
void GSClut::WriteCLUT16_I8_CSM1(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT)
|
||||
{
|
||||
WriteCLUT_T16_I8_CSM1((uint16*)m_mem->BlockPtr16(0, 0, TEX0.CBP, 1), m_clut + (TEX0.CSA << 4));
|
||||
WriteCLUT_T16_I8_CSM1((u16*)m_mem->BlockPtr16(0, 0, TEX0.CBP, 1), m_clut + (TEX0.CSA << 4));
|
||||
}
|
||||
|
||||
void GSClut::WriteCLUT16_I4_CSM1(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT)
|
||||
{
|
||||
WriteCLUT_T16_I4_CSM1((uint16*)m_mem->BlockPtr16(0, 0, TEX0.CBP, 1), m_clut + (TEX0.CSA << 4));
|
||||
WriteCLUT_T16_I4_CSM1((u16*)m_mem->BlockPtr16(0, 0, TEX0.CBP, 1), m_clut + (TEX0.CSA << 4));
|
||||
}
|
||||
|
||||
void GSClut::WriteCLUT16S_I8_CSM1(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT)
|
||||
{
|
||||
WriteCLUT_T16_I8_CSM1((uint16*)m_mem->BlockPtr16S(0, 0, TEX0.CBP, 1), m_clut + (TEX0.CSA << 4));
|
||||
WriteCLUT_T16_I8_CSM1((u16*)m_mem->BlockPtr16S(0, 0, TEX0.CBP, 1), m_clut + (TEX0.CSA << 4));
|
||||
}
|
||||
|
||||
void GSClut::WriteCLUT16S_I4_CSM1(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT)
|
||||
{
|
||||
WriteCLUT_T16_I4_CSM1((uint16*)m_mem->BlockPtr16S(0, 0, TEX0.CBP, 1), m_clut + (TEX0.CSA << 4));
|
||||
WriteCLUT_T16_I4_CSM1((u16*)m_mem->BlockPtr16S(0, 0, TEX0.CBP, 1), m_clut + (TEX0.CSA << 4));
|
||||
}
|
||||
|
||||
template <int n>
|
||||
|
@ -199,14 +199,14 @@ void GSClut::WriteCLUT32_CSM2(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCL
|
|||
GSOffset off = GSOffset::fromKnownPSM(TEX0.CBP, TEXCLUT.CBW, PSM_PSMCT32);
|
||||
auto pa = off.paMulti(m_mem->m_vm32, TEXCLUT.COU << 4, TEXCLUT.COV);
|
||||
|
||||
uint16* RESTRICT clut = m_clut + ((TEX0.CSA & 15) << 4);
|
||||
u16* RESTRICT clut = m_clut + ((TEX0.CSA & 15) << 4);
|
||||
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
uint32 c = *pa.value(i);
|
||||
u32 c = *pa.value(i);
|
||||
|
||||
clut[i] = (uint16)(c & 0xffff);
|
||||
clut[i + 256] = (uint16)(c >> 16);
|
||||
clut[i] = (u16)(c & 0xffff);
|
||||
clut[i + 256] = (u16)(c >> 16);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -216,7 +216,7 @@ void GSClut::WriteCLUT16_CSM2(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCL
|
|||
GSOffset off = GSOffset::fromKnownPSM(TEX0.CBP, TEXCLUT.CBW, PSM_PSMCT16);
|
||||
auto pa = off.paMulti(m_mem->m_vm16, TEXCLUT.COU << 4, TEXCLUT.COV);
|
||||
|
||||
uint16* RESTRICT clut = m_clut + (TEX0.CSA << 4);
|
||||
u16* RESTRICT clut = m_clut + (TEX0.CSA << 4);
|
||||
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
|
@ -230,7 +230,7 @@ void GSClut::WriteCLUT16S_CSM2(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXC
|
|||
GSOffset off = GSOffset::fromKnownPSM(TEX0.CBP, TEXCLUT.CBW, PSM_PSMCT16S);
|
||||
auto pa = off.paMulti(m_mem->m_vm16, TEXCLUT.COU << 4, TEXCLUT.COV);
|
||||
|
||||
uint16* RESTRICT clut = m_clut + (TEX0.CSA << 4);
|
||||
u16* RESTRICT clut = m_clut + (TEX0.CSA << 4);
|
||||
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
|
@ -252,7 +252,7 @@ void GSClut::Read(const GIFRegTEX0& TEX0)
|
|||
m_read.TEX0 = TEX0;
|
||||
m_read.dirty = false;
|
||||
|
||||
uint16* clut = m_clut;
|
||||
u16* clut = m_clut;
|
||||
|
||||
if(TEX0.CPSM == PSM_PSMCT32 || TEX0.CPSM == PSM_PSMCT24)
|
||||
{
|
||||
|
@ -301,7 +301,7 @@ void GSClut::Read32(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA)
|
|||
m_read.dirty = false;
|
||||
m_read.adirty = true;
|
||||
|
||||
uint16* clut = m_clut;
|
||||
u16* clut = m_clut;
|
||||
|
||||
if (TEX0.CPSM == PSM_PSMCT32 || TEX0.CPSM == PSM_PSMCT24)
|
||||
{
|
||||
|
@ -317,7 +317,7 @@ void GSClut::Read32(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA)
|
|||
clut += (TEX0.CSA & 15) << 4;
|
||||
// TODO: merge these functions
|
||||
ReadCLUT_T32_I4(clut, m_buff32);
|
||||
ExpandCLUT64_T32_I8(m_buff32, (uint64*)m_buff64); // sw renderer does not need m_buff64 anymore
|
||||
ExpandCLUT64_T32_I8(m_buff32, (u64*)m_buff64); // sw renderer does not need m_buff64 anymore
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -336,7 +336,7 @@ void GSClut::Read32(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA)
|
|||
clut += TEX0.CSA << 4;
|
||||
// TODO: merge these functions
|
||||
Expand16(clut, m_buff32, 16, TEXA);
|
||||
ExpandCLUT64_T32_I8(m_buff32, (uint64*)m_buff64); // sw renderer does not need m_buff64 anymore
|
||||
ExpandCLUT64_T32_I8(m_buff32, (u64*)m_buff64); // sw renderer does not need m_buff64 anymore
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -412,7 +412,7 @@ void GSClut::GetAlphaMinMax32(int& amin_out, int& amax_out)
|
|||
|
||||
//
|
||||
|
||||
void GSClut::WriteCLUT_T32_I8_CSM1(const uint32* RESTRICT src, uint16* RESTRICT clut, uint16 offset)
|
||||
void GSClut::WriteCLUT_T32_I8_CSM1(const u32* RESTRICT src, u16* RESTRICT clut, u16 offset)
|
||||
{
|
||||
// This is required when CSA is offset from the base of the CLUT so we point to the right data
|
||||
for (int i = offset; i < 16; i ++)
|
||||
|
@ -425,7 +425,7 @@ void GSClut::WriteCLUT_T32_I8_CSM1(const uint32* RESTRICT src, uint16* RESTRICT
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline void GSClut::WriteCLUT_T32_I4_CSM1(const uint32* RESTRICT src, uint16* RESTRICT clut)
|
||||
__forceinline void GSClut::WriteCLUT_T32_I4_CSM1(const u32* RESTRICT src, u16* RESTRICT clut)
|
||||
{
|
||||
// 1 block
|
||||
|
||||
|
@ -466,7 +466,7 @@ __forceinline void GSClut::WriteCLUT_T32_I4_CSM1(const uint32* RESTRICT src, uin
|
|||
#endif
|
||||
}
|
||||
|
||||
void GSClut::WriteCLUT_T16_I8_CSM1(const uint16* RESTRICT src, uint16* RESTRICT clut)
|
||||
void GSClut::WriteCLUT_T16_I8_CSM1(const u16* RESTRICT src, u16* RESTRICT clut)
|
||||
{
|
||||
// 2 blocks
|
||||
|
||||
|
@ -491,7 +491,7 @@ void GSClut::WriteCLUT_T16_I8_CSM1(const uint16* RESTRICT src, uint16* RESTRICT
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline void GSClut::WriteCLUT_T16_I4_CSM1(const uint16* RESTRICT src, uint16* RESTRICT clut)
|
||||
__forceinline void GSClut::WriteCLUT_T16_I4_CSM1(const u16* RESTRICT src, u16* RESTRICT clut)
|
||||
{
|
||||
// 1 block (half)
|
||||
|
||||
|
@ -501,7 +501,7 @@ __forceinline void GSClut::WriteCLUT_T16_I4_CSM1(const uint16* RESTRICT src, uin
|
|||
}
|
||||
}
|
||||
|
||||
void GSClut::ReadCLUT_T32_I8(const uint16* RESTRICT clut, uint32* RESTRICT dst, int offset)
|
||||
void GSClut::ReadCLUT_T32_I8(const u16* RESTRICT clut, u32* RESTRICT dst, int offset)
|
||||
{
|
||||
// Okay this deserves a small explanation
|
||||
// T32 I8 can address up to 256 colors however the offset can be "more than zero" when reading
|
||||
|
@ -516,7 +516,7 @@ void GSClut::ReadCLUT_T32_I8(const uint16* RESTRICT clut, uint32* RESTRICT dst,
|
|||
}
|
||||
}
|
||||
|
||||
__forceinline void GSClut::ReadCLUT_T32_I4(const uint16* RESTRICT clut, uint32* RESTRICT dst)
|
||||
__forceinline void GSClut::ReadCLUT_T32_I4(const u16* RESTRICT clut, u32* RESTRICT dst)
|
||||
{
|
||||
GSVector4i* s = (GSVector4i*)clut;
|
||||
GSVector4i* d = (GSVector4i*)dst;
|
||||
|
@ -535,7 +535,7 @@ __forceinline void GSClut::ReadCLUT_T32_I4(const uint16* RESTRICT clut, uint32*
|
|||
}
|
||||
|
||||
#if 0
|
||||
__forceinline void GSClut::ReadCLUT_T32_I4(const uint16* RESTRICT clut, uint32* RESTRICT dst32, uint64* RESTRICT dst64)
|
||||
__forceinline void GSClut::ReadCLUT_T32_I4(const u16* RESTRICT clut, u32* RESTRICT dst32, u64* RESTRICT dst64)
|
||||
{
|
||||
GSVector4i* s = (GSVector4i*)clut;
|
||||
GSVector4i* d32 = (GSVector4i*)dst32;
|
||||
|
@ -561,7 +561,7 @@ __forceinline void GSClut::ReadCLUT_T32_I4(const uint16* RESTRICT clut, uint32*
|
|||
#endif
|
||||
|
||||
#if 0
|
||||
void GSClut::ReadCLUT_T16_I8(const uint16* RESTRICT clut, uint32* RESTRICT dst)
|
||||
void GSClut::ReadCLUT_T16_I8(const u16* RESTRICT clut, u32* RESTRICT dst)
|
||||
{
|
||||
for(int i = 0; i < 256; i += 16)
|
||||
{
|
||||
|
@ -571,7 +571,7 @@ void GSClut::ReadCLUT_T16_I8(const uint16* RESTRICT clut, uint32* RESTRICT dst)
|
|||
#endif
|
||||
|
||||
#if 0
|
||||
__forceinline void GSClut::ReadCLUT_T16_I4(const uint16* RESTRICT clut, uint32* RESTRICT dst)
|
||||
__forceinline void GSClut::ReadCLUT_T16_I4(const u16* RESTRICT clut, u32* RESTRICT dst)
|
||||
{
|
||||
GSVector4i* s = (GSVector4i*)clut;
|
||||
GSVector4i* d = (GSVector4i*)dst;
|
||||
|
@ -587,7 +587,7 @@ __forceinline void GSClut::ReadCLUT_T16_I4(const uint16* RESTRICT clut, uint32*
|
|||
#endif
|
||||
|
||||
#if 0
|
||||
__forceinline void GSClut::ReadCLUT_T16_I4(const uint16* RESTRICT clut, uint32* RESTRICT dst32, uint64* RESTRICT dst64)
|
||||
__forceinline void GSClut::ReadCLUT_T16_I4(const u16* RESTRICT clut, u32* RESTRICT dst32, u64* RESTRICT dst64)
|
||||
{
|
||||
GSVector4i* s = (GSVector4i*)clut;
|
||||
GSVector4i* d32 = (GSVector4i*)dst32;
|
||||
|
@ -613,7 +613,7 @@ __forceinline void GSClut::ReadCLUT_T16_I4(const uint16* RESTRICT clut, uint32*
|
|||
}
|
||||
#endif
|
||||
|
||||
void GSClut::ExpandCLUT64_T32_I8(const uint32* RESTRICT src, uint64* RESTRICT dst)
|
||||
void GSClut::ExpandCLUT64_T32_I8(const u32* RESTRICT src, u64* RESTRICT dst)
|
||||
{
|
||||
GSVector4i* s = (GSVector4i*)src;
|
||||
GSVector4i* d = (GSVector4i*)dst;
|
||||
|
@ -656,7 +656,7 @@ __forceinline void GSClut::ExpandCLUT64_T32(const GSVector4i& hi, const GSVector
|
|||
}
|
||||
|
||||
#if 0
|
||||
void GSClut::ExpandCLUT64_T16_I8(const uint32* RESTRICT src, uint64* RESTRICT dst)
|
||||
void GSClut::ExpandCLUT64_T16_I8(const u32* RESTRICT src, u64* RESTRICT dst)
|
||||
{
|
||||
GSVector4i* s = (GSVector4i*)src;
|
||||
GSVector4i* d = (GSVector4i*)dst;
|
||||
|
@ -705,7 +705,7 @@ CONSTINIT const GSVector4i GSClut::m_bm = GSVector4i::cxpr(0x00007c00);
|
|||
CONSTINIT const GSVector4i GSClut::m_gm = GSVector4i::cxpr(0x000003e0);
|
||||
CONSTINIT const GSVector4i GSClut::m_rm = GSVector4i::cxpr(0x0000001f);
|
||||
|
||||
void GSClut::Expand16(const uint16* RESTRICT src, uint32* RESTRICT dst, int w, const GIFRegTEXA& TEXA)
|
||||
void GSClut::Expand16(const u16* RESTRICT src, u32* RESTRICT dst, int w, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
ASSERT((w & 7) == 0);
|
||||
|
||||
|
|
|
@ -30,10 +30,10 @@ class alignas(32) GSClut : public GSAlignedClass<32>
|
|||
|
||||
GSLocalMemory* m_mem;
|
||||
|
||||
uint32 m_CBP[2];
|
||||
uint16* m_clut;
|
||||
uint32* m_buff32;
|
||||
uint64* m_buff64;
|
||||
u32 m_CBP[2];
|
||||
u16* m_clut;
|
||||
u32* m_buff32;
|
||||
u64* m_buff64;
|
||||
|
||||
struct alignas(32) WriteState
|
||||
{
|
||||
|
@ -74,42 +74,42 @@ class alignas(32) GSClut : public GSAlignedClass<32>
|
|||
|
||||
void WriteCLUT_NULL(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT);
|
||||
|
||||
static void WriteCLUT_T32_I8_CSM1(const uint32* RESTRICT src, uint16* RESTRICT clut, uint16 offset);
|
||||
static void WriteCLUT_T32_I4_CSM1(const uint32* RESTRICT src, uint16* RESTRICT clut);
|
||||
static void WriteCLUT_T16_I8_CSM1(const uint16* RESTRICT src, uint16* RESTRICT clut);
|
||||
static void WriteCLUT_T16_I4_CSM1(const uint16* RESTRICT src, uint16* RESTRICT clut);
|
||||
static void ReadCLUT_T32_I8(const uint16* RESTRICT clut, uint32* RESTRICT dst, int offset);
|
||||
static void ReadCLUT_T32_I4(const uint16* RESTRICT clut, uint32* RESTRICT dst);
|
||||
//static void ReadCLUT_T32_I4(const uint16* RESTRICT clut, uint32* RESTRICT dst32, uint64* RESTRICT dst64);
|
||||
//static void ReadCLUT_T16_I8(const uint16* RESTRICT clut, uint32* RESTRICT dst);
|
||||
//static void ReadCLUT_T16_I4(const uint16* RESTRICT clut, uint32* RESTRICT dst);
|
||||
//static void ReadCLUT_T16_I4(const uint16* RESTRICT clut, uint32* RESTRICT dst32, uint64* RESTRICT dst64);
|
||||
static void WriteCLUT_T32_I8_CSM1(const u32* RESTRICT src, u16* RESTRICT clut, u16 offset);
|
||||
static void WriteCLUT_T32_I4_CSM1(const u32* RESTRICT src, u16* RESTRICT clut);
|
||||
static void WriteCLUT_T16_I8_CSM1(const u16* RESTRICT src, u16* RESTRICT clut);
|
||||
static void WriteCLUT_T16_I4_CSM1(const u16* RESTRICT src, u16* RESTRICT clut);
|
||||
static void ReadCLUT_T32_I8(const u16* RESTRICT clut, u32* RESTRICT dst, int offset);
|
||||
static void ReadCLUT_T32_I4(const u16* RESTRICT clut, u32* RESTRICT dst);
|
||||
//static void ReadCLUT_T32_I4(const u16* RESTRICT clut, u32* RESTRICT dst32, u64* RESTRICT dst64);
|
||||
//static void ReadCLUT_T16_I8(const u16* RESTRICT clut, u32* RESTRICT dst);
|
||||
//static void ReadCLUT_T16_I4(const u16* RESTRICT clut, u32* RESTRICT dst);
|
||||
//static void ReadCLUT_T16_I4(const u16* RESTRICT clut, u32* RESTRICT dst32, u64* RESTRICT dst64);
|
||||
public:
|
||||
static void ExpandCLUT64_T32_I8(const uint32* RESTRICT src, uint64* RESTRICT dst);
|
||||
static void ExpandCLUT64_T32_I8(const u32* RESTRICT src, u64* RESTRICT dst);
|
||||
|
||||
private:
|
||||
static void ExpandCLUT64_T32(const GSVector4i& hi, const GSVector4i& lo0, const GSVector4i& lo1, const GSVector4i& lo2, const GSVector4i& lo3, GSVector4i* dst);
|
||||
static void ExpandCLUT64_T32(const GSVector4i& hi, const GSVector4i& lo, GSVector4i* dst);
|
||||
//static void ExpandCLUT64_T16_I8(const uint32* RESTRICT src, uint64* RESTRICT dst);
|
||||
//static void ExpandCLUT64_T16_I8(const u32* RESTRICT src, u64* RESTRICT dst);
|
||||
static void ExpandCLUT64_T16(const GSVector4i& hi, const GSVector4i& lo0, const GSVector4i& lo1, const GSVector4i& lo2, const GSVector4i& lo3, GSVector4i* dst);
|
||||
static void ExpandCLUT64_T16(const GSVector4i& hi, const GSVector4i& lo, GSVector4i* dst);
|
||||
|
||||
static void Expand16(const uint16* RESTRICT src, uint32* RESTRICT dst, int w, const GIFRegTEXA& TEXA);
|
||||
static void Expand16(const u16* RESTRICT src, u32* RESTRICT dst, int w, const GIFRegTEXA& TEXA);
|
||||
|
||||
public:
|
||||
GSClut(GSLocalMemory* mem);
|
||||
virtual ~GSClut();
|
||||
|
||||
void Invalidate();
|
||||
void Invalidate(uint32 block);
|
||||
void Invalidate(u32 block);
|
||||
bool WriteTest(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT);
|
||||
void Write(const GIFRegTEX0& TEX0, const GIFRegTEXCLUT& TEXCLUT);
|
||||
//void Read(const GIFRegTEX0& TEX0);
|
||||
void Read32(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA);
|
||||
void GetAlphaMinMax32(int& amin, int& amax);
|
||||
|
||||
uint32 operator[](size_t i) const { return m_buff32[i]; }
|
||||
u32 operator[](size_t i) const { return m_buff32[i]; }
|
||||
|
||||
operator const uint32*() const { return m_buff32; }
|
||||
operator const uint64*() const { return m_buff64; }
|
||||
operator const u32*() const { return m_buff32; }
|
||||
operator const u64*() const { return m_buff64; }
|
||||
};
|
||||
|
|
|
@ -42,14 +42,14 @@ void* GSCodeBuffer::GetBuffer(size_t size)
|
|||
|
||||
if (m_ptr == NULL || m_pos + size > m_blocksize)
|
||||
{
|
||||
m_ptr = (uint8*)vmalloc(m_blocksize, true);
|
||||
m_ptr = (u8*)vmalloc(m_blocksize, true);
|
||||
|
||||
m_pos = 0;
|
||||
|
||||
m_buffers.push_back(m_ptr);
|
||||
}
|
||||
|
||||
uint8* ptr = &m_ptr[m_pos];
|
||||
u8* ptr = &m_ptr[m_pos];
|
||||
|
||||
m_reserved = size;
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ class GSCodeBuffer
|
|||
std::vector<void*> m_buffers;
|
||||
size_t m_blocksize;
|
||||
size_t m_pos, m_reserved;
|
||||
uint8* m_ptr;
|
||||
u8* m_ptr;
|
||||
|
||||
public:
|
||||
GSCodeBuffer(size_t blocksize = 4096 * 64); // 256k
|
||||
|
|
|
@ -505,7 +505,7 @@ const CRC::Game CRC::m_games[] =
|
|||
{0xB1BE3E51, Whiplash, EU, 0},
|
||||
};
|
||||
|
||||
std::map<uint32, const CRC::Game*> CRC::m_map;
|
||||
std::map<u32, const CRC::Game*> CRC::m_map;
|
||||
|
||||
std::string ToLower(std::string str)
|
||||
{
|
||||
|
@ -517,14 +517,14 @@ std::string ToLower(std::string str)
|
|||
// The list is case insensitive and order insensitive.
|
||||
// E.g. Disable all CRC hacks: CrcHacksExclusions=all
|
||||
// E.g. Disable hacks for these CRCs: CrcHacksExclusions=0x0F0C4A9C, 0x0EE5646B, 0x7ACF7E03
|
||||
bool IsCrcExcluded(std::string exclusionList, uint32 crc)
|
||||
bool IsCrcExcluded(std::string exclusionList, u32 crc)
|
||||
{
|
||||
std::string target = format("0x%08x", crc);
|
||||
exclusionList = ToLower(exclusionList);
|
||||
return exclusionList.find(target) != std::string::npos || exclusionList.find("all") != std::string::npos;
|
||||
}
|
||||
|
||||
const CRC::Game& CRC::Lookup(uint32 crc)
|
||||
const CRC::Game& CRC::Lookup(u32 crc)
|
||||
{
|
||||
printf("GS Lookup CRC:%08X\n", crc);
|
||||
if (m_map.empty())
|
||||
|
|
|
@ -170,16 +170,16 @@ public:
|
|||
|
||||
struct Game
|
||||
{
|
||||
uint32 crc;
|
||||
u32 crc;
|
||||
Title title;
|
||||
Region region;
|
||||
uint32 flags;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
private:
|
||||
static const Game m_games[];
|
||||
static std::map<uint32, const Game*> m_map;
|
||||
static std::map<u32, const Game*> m_map;
|
||||
|
||||
public:
|
||||
static const Game& Lookup(uint32 crc);
|
||||
static const Game& Lookup(u32 crc);
|
||||
};
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
#pragma once
|
||||
#ifdef __clang__
|
||||
// Ignore format for this file, as it spams a lot of warnings about uint64 and %llu.
|
||||
// Ignore format for this file, as it spams a lot of warnings about u64 and %llu.
|
||||
#pragma clang diagnostic ignored "-Wformat"
|
||||
#endif
|
||||
|
||||
|
@ -102,10 +102,10 @@ public:
|
|||
{
|
||||
ASSERT(XYOFFSET.OFX <= 0xf800 && XYOFFSET.OFY <= 0xf800);
|
||||
|
||||
scissor.ex.u16[0] = (uint16)((SCISSOR.SCAX0 << 4) + XYOFFSET.OFX - 0x8000);
|
||||
scissor.ex.u16[1] = (uint16)((SCISSOR.SCAY0 << 4) + XYOFFSET.OFY - 0x8000);
|
||||
scissor.ex.u16[2] = (uint16)((SCISSOR.SCAX1 << 4) + XYOFFSET.OFX - 0x8000);
|
||||
scissor.ex.u16[3] = (uint16)((SCISSOR.SCAY1 << 4) + XYOFFSET.OFY - 0x8000);
|
||||
scissor.ex.U16[0] = (u16)((SCISSOR.SCAX0 << 4) + XYOFFSET.OFX - 0x8000);
|
||||
scissor.ex.U16[1] = (u16)((SCISSOR.SCAY0 << 4) + XYOFFSET.OFY - 0x8000);
|
||||
scissor.ex.U16[2] = (u16)((SCISSOR.SCAX1 << 4) + XYOFFSET.OFX - 0x8000);
|
||||
scissor.ex.U16[3] = (u16)((SCISSOR.SCAY1 << 4) + XYOFFSET.OFY - 0x8000);
|
||||
|
||||
scissor.ofex = GSVector4(
|
||||
(int)((SCISSOR.SCAX0 << 4) + XYOFFSET.OFX),
|
||||
|
|
|
@ -31,7 +31,7 @@ GSDumpBase::~GSDumpBase()
|
|||
fclose(m_gs);
|
||||
}
|
||||
|
||||
void GSDumpBase::AddHeader(uint32 crc, const freezeData& fd, const GSPrivRegSet* regs)
|
||||
void GSDumpBase::AddHeader(u32 crc, const freezeData& fd, const GSPrivRegSet* regs)
|
||||
{
|
||||
AppendRawData(&crc, 4);
|
||||
AppendRawData(&fd.size, 4);
|
||||
|
@ -39,18 +39,18 @@ void GSDumpBase::AddHeader(uint32 crc, const freezeData& fd, const GSPrivRegSet*
|
|||
AppendRawData(regs, sizeof(*regs));
|
||||
}
|
||||
|
||||
void GSDumpBase::Transfer(int index, const uint8* mem, size_t size)
|
||||
void GSDumpBase::Transfer(int index, const u8* mem, size_t size)
|
||||
{
|
||||
if (size == 0)
|
||||
return;
|
||||
|
||||
AppendRawData(0);
|
||||
AppendRawData(static_cast<uint8>(index));
|
||||
AppendRawData(static_cast<u8>(index));
|
||||
AppendRawData(&size, 4);
|
||||
AppendRawData(mem, size);
|
||||
}
|
||||
|
||||
void GSDumpBase::ReadFIFO(uint32 size)
|
||||
void GSDumpBase::ReadFIFO(u32 size)
|
||||
{
|
||||
if (size == 0)
|
||||
return;
|
||||
|
@ -69,7 +69,7 @@ bool GSDumpBase::VSync(int field, bool last, const GSPrivRegSet* regs)
|
|||
AppendRawData(regs, sizeof(*regs));
|
||||
|
||||
AppendRawData(1);
|
||||
AppendRawData(static_cast<uint8>(field));
|
||||
AppendRawData(static_cast<u8>(field));
|
||||
|
||||
if (last)
|
||||
m_extra_frames--;
|
||||
|
@ -91,7 +91,7 @@ void GSDumpBase::Write(const void* data, size_t size)
|
|||
// GSDump implementation
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
GSDump::GSDump(const std::string& fn, uint32 crc, const freezeData& fd, const GSPrivRegSet* regs)
|
||||
GSDump::GSDump(const std::string& fn, u32 crc, const freezeData& fd, const GSPrivRegSet* regs)
|
||||
: GSDumpBase(fn + ".gs")
|
||||
{
|
||||
AddHeader(crc, fd, regs);
|
||||
|
@ -102,7 +102,7 @@ void GSDump::AppendRawData(const void* data, size_t size)
|
|||
Write(data, size);
|
||||
}
|
||||
|
||||
void GSDump::AppendRawData(uint8 c)
|
||||
void GSDump::AppendRawData(u8 c)
|
||||
{
|
||||
Write(&c, 1);
|
||||
}
|
||||
|
@ -111,7 +111,7 @@ void GSDump::AppendRawData(uint8 c)
|
|||
// GSDumpXz implementation
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
GSDumpXz::GSDumpXz(const std::string& fn, uint32 crc, const freezeData& fd, const GSPrivRegSet* regs)
|
||||
GSDumpXz::GSDumpXz(const std::string& fn, u32 crc, const freezeData& fd, const GSPrivRegSet* regs)
|
||||
: GSDumpBase(fn + ".gs.xz")
|
||||
{
|
||||
m_strm = LZMA_STREAM_INIT;
|
||||
|
@ -150,7 +150,7 @@ void GSDumpXz::AppendRawData(const void* data, size_t size)
|
|||
Flush();
|
||||
}
|
||||
|
||||
void GSDumpXz::AppendRawData(uint8 c)
|
||||
void GSDumpXz::AppendRawData(u8 c)
|
||||
{
|
||||
m_in_buff.push_back(c);
|
||||
}
|
||||
|
@ -170,7 +170,7 @@ void GSDumpXz::Flush()
|
|||
|
||||
void GSDumpXz::Compress(lzma_action action, lzma_ret expected_status)
|
||||
{
|
||||
std::vector<uint8> out_buff(1024 * 1024);
|
||||
std::vector<u8> out_buff(1024 * 1024);
|
||||
do
|
||||
{
|
||||
m_strm.next_out = out_buff.data();
|
||||
|
|
|
@ -45,28 +45,28 @@ class GSDumpBase
|
|||
FILE* m_gs;
|
||||
|
||||
protected:
|
||||
void AddHeader(uint32 crc, const freezeData& fd, const GSPrivRegSet* regs);
|
||||
void AddHeader(u32 crc, const freezeData& fd, const GSPrivRegSet* regs);
|
||||
void Write(const void* data, size_t size);
|
||||
|
||||
virtual void AppendRawData(const void* data, size_t size) = 0;
|
||||
virtual void AppendRawData(uint8 c) = 0;
|
||||
virtual void AppendRawData(u8 c) = 0;
|
||||
|
||||
public:
|
||||
GSDumpBase(const std::string& fn);
|
||||
virtual ~GSDumpBase();
|
||||
|
||||
void ReadFIFO(uint32 size);
|
||||
void Transfer(int index, const uint8* mem, size_t size);
|
||||
void ReadFIFO(u32 size);
|
||||
void Transfer(int index, const u8* mem, size_t size);
|
||||
bool VSync(int field, bool last, const GSPrivRegSet* regs);
|
||||
};
|
||||
|
||||
class GSDump final : public GSDumpBase
|
||||
{
|
||||
void AppendRawData(const void* data, size_t size) final;
|
||||
void AppendRawData(uint8 c) final;
|
||||
void AppendRawData(u8 c) final;
|
||||
|
||||
public:
|
||||
GSDump(const std::string& fn, uint32 crc, const freezeData& fd, const GSPrivRegSet* regs);
|
||||
GSDump(const std::string& fn, u32 crc, const freezeData& fd, const GSPrivRegSet* regs);
|
||||
virtual ~GSDump() = default;
|
||||
};
|
||||
|
||||
|
@ -74,14 +74,14 @@ class GSDumpXz final : public GSDumpBase
|
|||
{
|
||||
lzma_stream m_strm;
|
||||
|
||||
std::vector<uint8> m_in_buff;
|
||||
std::vector<u8> m_in_buff;
|
||||
|
||||
void Flush();
|
||||
void Compress(lzma_action action, lzma_ret expected_status);
|
||||
void AppendRawData(const void* data, size_t size);
|
||||
void AppendRawData(uint8 c);
|
||||
void AppendRawData(u8 c);
|
||||
|
||||
public:
|
||||
GSDumpXz(const std::string& fn, uint32 crc, const freezeData& fd, const GSPrivRegSet* regs);
|
||||
GSDumpXz(const std::string& fn, u32 crc, const freezeData& fd, const GSPrivRegSet* regs);
|
||||
virtual ~GSDumpXz();
|
||||
};
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include "GS.h"
|
||||
|
||||
template <typename Fn>
|
||||
static void foreachBlock(const GSOffset& off, GSLocalMemory* mem, const GSVector4i& r, uint8* dst, int dstpitch, int bpp, Fn&& fn)
|
||||
static void foreachBlock(const GSOffset& off, GSLocalMemory* mem, const GSVector4i& r, u8* dst, int dstpitch, int bpp, Fn&& fn)
|
||||
{
|
||||
ASSERT(off.isBlockAligned(r));
|
||||
GSOffset::BNHelper bn = off.bnMulti(r.left, r.top);
|
||||
|
@ -32,8 +32,8 @@ static void foreachBlock(const GSOffset& off, GSLocalMemory* mem, const GSVector
|
|||
{
|
||||
for (int x = 0; bn.blkX() < right; bn.nextBlockX(), x += xAdd)
|
||||
{
|
||||
const uint8* src = mem->BlockPtr(bn.value());
|
||||
uint8* read_dst = dst + x;
|
||||
const u8* src = mem->BlockPtr(bn.value());
|
||||
u8* read_dst = dst + x;
|
||||
fn(read_dst, src);
|
||||
}
|
||||
}
|
||||
|
@ -70,19 +70,19 @@ GSLocalMemory::GSLocalMemory()
|
|||
}
|
||||
|
||||
if (m_use_fifo_alloc)
|
||||
m_vm8 = (uint8*)fifo_alloc(m_vmsize, 4);
|
||||
m_vm8 = (u8*)fifo_alloc(m_vmsize, 4);
|
||||
else
|
||||
m_vm8 = nullptr;
|
||||
|
||||
// Either we don't use fifo alloc or we get an error.
|
||||
if (m_vm8 == nullptr)
|
||||
{
|
||||
m_vm8 = (uint8*)vmalloc(m_vmsize * 4, false);
|
||||
m_vm8 = (u8*)vmalloc(m_vmsize * 4, false);
|
||||
m_use_fifo_alloc = false;
|
||||
}
|
||||
|
||||
m_vm16 = (uint16*)m_vm8;
|
||||
m_vm32 = (uint32*)m_vm8;
|
||||
m_vm16 = (u16*)m_vm8;
|
||||
m_vm32 = (u32*)m_vm8;
|
||||
|
||||
memset(m_vm8, 0, m_vmsize);
|
||||
|
||||
|
@ -341,20 +341,20 @@ GSLocalMemory::~GSLocalMemory()
|
|||
|
||||
GSPixelOffset* GSLocalMemory::GetPixelOffset(const GIFRegFRAME& FRAME, const GIFRegZBUF& ZBUF)
|
||||
{
|
||||
uint32 fbp = FRAME.Block();
|
||||
uint32 zbp = ZBUF.Block();
|
||||
uint32 fpsm = FRAME.PSM;
|
||||
uint32 zpsm = ZBUF.PSM;
|
||||
uint32 bw = FRAME.FBW;
|
||||
u32 fbp = FRAME.Block();
|
||||
u32 zbp = ZBUF.Block();
|
||||
u32 fpsm = FRAME.PSM;
|
||||
u32 zpsm = ZBUF.PSM;
|
||||
u32 bw = FRAME.FBW;
|
||||
|
||||
ASSERT(m_psm[fpsm].trbpp > 8 || m_psm[zpsm].trbpp > 8);
|
||||
|
||||
// "(psm & 0x0f) ^ ((psm & 0xf0) >> 2)" creates 4 bit unique identifiers for render target formats (only)
|
||||
|
||||
uint32 fpsm_hash = (fpsm & 0x0f) ^ ((fpsm & 0x30) >> 2);
|
||||
uint32 zpsm_hash = (zpsm & 0x0f) ^ ((zpsm & 0x30) >> 2);
|
||||
u32 fpsm_hash = (fpsm & 0x0f) ^ ((fpsm & 0x30) >> 2);
|
||||
u32 zpsm_hash = (zpsm & 0x0f) ^ ((zpsm & 0x30) >> 2);
|
||||
|
||||
uint32 hash = (FRAME.FBP << 0) | (ZBUF.ZBP << 9) | (bw << 18) | (fpsm_hash << 24) | (zpsm_hash << 28);
|
||||
u32 hash = (FRAME.FBP << 0) | (ZBUF.ZBP << 9) | (bw << 18) | (fpsm_hash << 24) | (zpsm_hash << 28);
|
||||
|
||||
auto it = m_pomap.find(hash);
|
||||
|
||||
|
@ -394,20 +394,20 @@ GSPixelOffset* GSLocalMemory::GetPixelOffset(const GIFRegFRAME& FRAME, const GIF
|
|||
|
||||
GSPixelOffset4* GSLocalMemory::GetPixelOffset4(const GIFRegFRAME& FRAME, const GIFRegZBUF& ZBUF)
|
||||
{
|
||||
uint32 fbp = FRAME.Block();
|
||||
uint32 zbp = ZBUF.Block();
|
||||
uint32 fpsm = FRAME.PSM;
|
||||
uint32 zpsm = ZBUF.PSM;
|
||||
uint32 bw = FRAME.FBW;
|
||||
u32 fbp = FRAME.Block();
|
||||
u32 zbp = ZBUF.Block();
|
||||
u32 fpsm = FRAME.PSM;
|
||||
u32 zpsm = ZBUF.PSM;
|
||||
u32 bw = FRAME.FBW;
|
||||
|
||||
ASSERT(m_psm[fpsm].trbpp > 8 || m_psm[zpsm].trbpp > 8);
|
||||
|
||||
// "(psm & 0x0f) ^ ((psm & 0xf0) >> 2)" creates 4 bit unique identifiers for render target formats (only)
|
||||
|
||||
uint32 fpsm_hash = (fpsm & 0x0f) ^ ((fpsm & 0x30) >> 2);
|
||||
uint32 zpsm_hash = (zpsm & 0x0f) ^ ((zpsm & 0x30) >> 2);
|
||||
u32 fpsm_hash = (fpsm & 0x0f) ^ ((fpsm & 0x30) >> 2);
|
||||
u32 zpsm_hash = (zpsm & 0x0f) ^ ((zpsm & 0x30) >> 2);
|
||||
|
||||
uint32 hash = (FRAME.FBP << 0) | (ZBUF.ZBP << 9) | (bw << 18) | (fpsm_hash << 24) | (zpsm_hash << 28);
|
||||
u32 hash = (FRAME.FBP << 0) | (ZBUF.ZBP << 9) | (bw << 18) | (fpsm_hash << 24) | (zpsm_hash << 28);
|
||||
|
||||
auto it = m_po4map.find(hash);
|
||||
|
||||
|
@ -449,7 +449,7 @@ static bool cmp_vec2x(const GSVector2i& a, const GSVector2i& b) { return a.x < b
|
|||
|
||||
std::vector<GSVector2i>* GSLocalMemory::GetPage2TileMap(const GIFRegTEX0& TEX0)
|
||||
{
|
||||
uint64 hash = TEX0.u64 & 0x3ffffffffull; // TBP0 TBW PSM TW TH
|
||||
u64 hash = TEX0.U64 & 0x3ffffffffull; // TBP0 TBW PSM TW TH
|
||||
|
||||
auto it = m_p2tmap.find(hash);
|
||||
|
||||
|
@ -466,34 +466,34 @@ std::vector<GSVector2i>* GSLocalMemory::GetPage2TileMap(const GIFRegTEX0& TEX0)
|
|||
GSOffset off = GetOffset(TEX0.TBP0, TEX0.TBW, TEX0.PSM);
|
||||
GSOffset::BNHelper bn = off.bnMulti(0, 0);
|
||||
|
||||
std::unordered_map<uint32, std::unordered_set<uint32>> tmp; // key = page, value = y:x, 7 bits each, max 128x128 tiles for the worst case (1024x1024 32bpp 8x8 blocks)
|
||||
std::unordered_map<u32, std::unordered_set<u32>> tmp; // key = page, value = y:x, 7 bits each, max 128x128 tiles for the worst case (1024x1024 32bpp 8x8 blocks)
|
||||
|
||||
for (; bn.blkY() < (th >> off.blockShiftY()); bn.nextBlockY())
|
||||
{
|
||||
for (; bn.blkX() < (tw >> off.blockShiftX()); bn.nextBlockX())
|
||||
{
|
||||
uint32 page = (bn.value() >> 5) % MAX_PAGES;
|
||||
u32 page = (bn.value() >> 5) % MAX_PAGES;
|
||||
|
||||
tmp[page].insert((bn.blkY() << 7) + bn.blkX());
|
||||
}
|
||||
}
|
||||
|
||||
// combine the lower 5 bits of the address into a 9:5 pointer:mask form, so the "valid bits" can be tested against an uint32 array
|
||||
// combine the lower 5 bits of the address into a 9:5 pointer:mask form, so the "valid bits" can be tested against an u32 array
|
||||
|
||||
auto p2t = new std::vector<GSVector2i>[MAX_PAGES];
|
||||
|
||||
for (const auto& i : tmp)
|
||||
{
|
||||
uint32 page = i.first;
|
||||
u32 page = i.first;
|
||||
|
||||
auto& tiles = i.second;
|
||||
|
||||
std::unordered_map<uint32, uint32> m;
|
||||
std::unordered_map<u32, u32> m;
|
||||
|
||||
for (const auto addr : tiles)
|
||||
{
|
||||
uint32 row = addr >> 5;
|
||||
uint32 col = 1 << (addr & 31);
|
||||
u32 row = addr >> 5;
|
||||
u32 col = 1 << (addr & 31);
|
||||
|
||||
auto k = m.find(row);
|
||||
|
||||
|
@ -528,10 +528,10 @@ std::vector<GSVector2i>* GSLocalMemory::GetPage2TileMap(const GIFRegTEX0& TEX0)
|
|||
////////////////////
|
||||
|
||||
template <int psm, int bsx, int bsy, int alignment>
|
||||
void GSLocalMemory::WriteImageColumn(int l, int r, int y, int h, const uint8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF)
|
||||
void GSLocalMemory::WriteImageColumn(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF)
|
||||
{
|
||||
uint32 bp = BITBLTBUF.DBP;
|
||||
uint32 bw = BITBLTBUF.DBW;
|
||||
u32 bp = BITBLTBUF.DBP;
|
||||
u32 bw = BITBLTBUF.DBW;
|
||||
|
||||
const int csy = bsy / 4;
|
||||
|
||||
|
@ -557,10 +557,10 @@ void GSLocalMemory::WriteImageColumn(int l, int r, int y, int h, const uint8* sr
|
|||
}
|
||||
|
||||
template <int psm, int bsx, int bsy, int alignment>
|
||||
void GSLocalMemory::WriteImageBlock(int l, int r, int y, int h, const uint8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF)
|
||||
void GSLocalMemory::WriteImageBlock(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF)
|
||||
{
|
||||
uint32 bp = BITBLTBUF.DBP;
|
||||
uint32 bw = BITBLTBUF.DBW;
|
||||
u32 bp = BITBLTBUF.DBP;
|
||||
u32 bw = BITBLTBUF.DBW;
|
||||
|
||||
for (int offset = srcpitch * bsy; h >= bsy; h -= bsy, y += bsy, src += offset)
|
||||
{
|
||||
|
@ -584,10 +584,10 @@ void GSLocalMemory::WriteImageBlock(int l, int r, int y, int h, const uint8* src
|
|||
}
|
||||
|
||||
template <int psm, int bsx, int bsy>
|
||||
void GSLocalMemory::WriteImageLeftRight(int l, int r, int y, int h, const uint8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF)
|
||||
void GSLocalMemory::WriteImageLeftRight(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF)
|
||||
{
|
||||
uint32 bp = BITBLTBUF.DBP;
|
||||
uint32 bw = BITBLTBUF.DBW;
|
||||
u32 bp = BITBLTBUF.DBP;
|
||||
u32 bw = BITBLTBUF.DBW;
|
||||
|
||||
for (; h > 0; y++, h--, src += srcpitch)
|
||||
{
|
||||
|
@ -595,14 +595,14 @@ void GSLocalMemory::WriteImageLeftRight(int l, int r, int y, int h, const uint8*
|
|||
{
|
||||
switch (psm)
|
||||
{
|
||||
case PSM_PSMCT32: WritePixel32(x, y, *(uint32*)&src[x * 4], bp, bw); break;
|
||||
case PSM_PSMCT16: WritePixel16(x, y, *(uint16*)&src[x * 2], bp, bw); break;
|
||||
case PSM_PSMCT16S: WritePixel16S(x, y, *(uint16*)&src[x * 2], bp, bw); break;
|
||||
case PSM_PSMCT32: WritePixel32(x, y, *(u32*)&src[x * 4], bp, bw); break;
|
||||
case PSM_PSMCT16: WritePixel16(x, y, *(u16*)&src[x * 2], bp, bw); break;
|
||||
case PSM_PSMCT16S: WritePixel16S(x, y, *(u16*)&src[x * 2], bp, bw); break;
|
||||
case PSM_PSMT8: WritePixel8(x, y, src[x], bp, bw); break;
|
||||
case PSM_PSMT4: WritePixel4(x, y, src[x >> 1] >> ((x & 1) << 2), bp, bw); break;
|
||||
case PSM_PSMZ32: WritePixel32Z(x, y, *(uint32*)&src[x * 4], bp, bw); break;
|
||||
case PSM_PSMZ16: WritePixel16Z(x, y, *(uint16*)&src[x * 2], bp, bw); break;
|
||||
case PSM_PSMZ16S: WritePixel16SZ(x, y, *(uint16*)&src[x * 2], bp, bw); break;
|
||||
case PSM_PSMZ32: WritePixel32Z(x, y, *(u32*)&src[x * 4], bp, bw); break;
|
||||
case PSM_PSMZ16: WritePixel16Z(x, y, *(u16*)&src[x * 2], bp, bw); break;
|
||||
case PSM_PSMZ16S: WritePixel16SZ(x, y, *(u16*)&src[x * 2], bp, bw); break;
|
||||
// TODO
|
||||
default: __assume(0);
|
||||
}
|
||||
|
@ -611,12 +611,12 @@ void GSLocalMemory::WriteImageLeftRight(int l, int r, int y, int h, const uint8*
|
|||
}
|
||||
|
||||
template <int psm, int bsx, int bsy, int trbpp>
|
||||
void GSLocalMemory::WriteImageTopBottom(int l, int r, int y, int h, const uint8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF)
|
||||
void GSLocalMemory::WriteImageTopBottom(int l, int r, int y, int h, const u8* src, int srcpitch, const GIFRegBITBLTBUF& BITBLTBUF)
|
||||
{
|
||||
alignas(32) uint8 buff[64]; // merge buffer for one column
|
||||
alignas(32) u8 buff[64]; // merge buffer for one column
|
||||
|
||||
uint32 bp = BITBLTBUF.DBP;
|
||||
uint32 bw = BITBLTBUF.DBW;
|
||||
u32 bp = BITBLTBUF.DBP;
|
||||
u32 bw = BITBLTBUF.DBW;
|
||||
|
||||
const int csy = bsy / 4;
|
||||
|
||||
|
@ -630,7 +630,7 @@ void GSLocalMemory::WriteImageTopBottom(int l, int r, int y, int h, const uint8*
|
|||
|
||||
for (int x = l; x < r; x += bsx)
|
||||
{
|
||||
uint8* dst = NULL;
|
||||
u8* dst = NULL;
|
||||
|
||||
switch (psm)
|
||||
{
|
||||
|
@ -719,7 +719,7 @@ void GSLocalMemory::WriteImageTopBottom(int l, int r, int y, int h, const uint8*
|
|||
{
|
||||
for (int x = l; x < r; x += bsx)
|
||||
{
|
||||
uint8* dst = NULL;
|
||||
u8* dst = NULL;
|
||||
|
||||
switch (psm)
|
||||
{
|
||||
|
@ -772,7 +772,7 @@ void GSLocalMemory::WriteImageTopBottom(int l, int r, int y, int h, const uint8*
|
|||
}
|
||||
|
||||
template <int psm, int bsx, int bsy, int trbpp>
|
||||
void GSLocalMemory::WriteImage(int& tx, int& ty, const uint8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
void GSLocalMemory::WriteImage(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
{
|
||||
if (TRXREG.RRW == 0)
|
||||
return;
|
||||
|
@ -797,7 +797,7 @@ void GSLocalMemory::WriteImage(int& tx, int& ty, const uint8* src, int len, GIFR
|
|||
|
||||
if (ra - la >= bsx && h > 0) // "transfer width" >= "block width" && there is at least one full row
|
||||
{
|
||||
const uint8* s = &src[-l * trbpp >> 3];
|
||||
const u8* s = &src[-l * trbpp >> 3];
|
||||
|
||||
src += srcpitch * h;
|
||||
len -= srcpitch * h;
|
||||
|
@ -890,13 +890,13 @@ static bool IsTopLeftAligned(int dsax, int tx, int ty, int bw, int bh)
|
|||
return ((dsax & (bw - 1)) == 0 && (tx & (bw - 1)) == 0 && dsax == tx && (ty & (bh - 1)) == 0);
|
||||
}
|
||||
|
||||
void GSLocalMemory::WriteImage24(int& tx, int& ty, const uint8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
void GSLocalMemory::WriteImage24(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
{
|
||||
if (TRXREG.RRW == 0)
|
||||
return;
|
||||
|
||||
uint32 bp = BITBLTBUF.DBP;
|
||||
uint32 bw = BITBLTBUF.DBW;
|
||||
u32 bp = BITBLTBUF.DBP;
|
||||
u32 bw = BITBLTBUF.DBW;
|
||||
|
||||
int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW * 3;
|
||||
int th = len / srcpitch;
|
||||
|
@ -925,13 +925,13 @@ void GSLocalMemory::WriteImage24(int& tx, int& ty, const uint8* src, int len, GI
|
|||
}
|
||||
}
|
||||
|
||||
void GSLocalMemory::WriteImage8H(int& tx, int& ty, const uint8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
void GSLocalMemory::WriteImage8H(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
{
|
||||
if (TRXREG.RRW == 0)
|
||||
return;
|
||||
|
||||
uint32 bp = BITBLTBUF.DBP;
|
||||
uint32 bw = BITBLTBUF.DBW;
|
||||
u32 bp = BITBLTBUF.DBP;
|
||||
u32 bw = BITBLTBUF.DBW;
|
||||
|
||||
int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW;
|
||||
int th = len / srcpitch;
|
||||
|
@ -960,13 +960,13 @@ void GSLocalMemory::WriteImage8H(int& tx, int& ty, const uint8* src, int len, GI
|
|||
}
|
||||
}
|
||||
|
||||
void GSLocalMemory::WriteImage4HL(int& tx, int& ty, const uint8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
void GSLocalMemory::WriteImage4HL(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
{
|
||||
if (TRXREG.RRW == 0)
|
||||
return;
|
||||
|
||||
uint32 bp = BITBLTBUF.DBP;
|
||||
uint32 bw = BITBLTBUF.DBW;
|
||||
u32 bp = BITBLTBUF.DBP;
|
||||
u32 bw = BITBLTBUF.DBW;
|
||||
|
||||
int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW / 2;
|
||||
int th = len / srcpitch;
|
||||
|
@ -995,13 +995,13 @@ void GSLocalMemory::WriteImage4HL(int& tx, int& ty, const uint8* src, int len, G
|
|||
}
|
||||
}
|
||||
|
||||
void GSLocalMemory::WriteImage4HH(int& tx, int& ty, const uint8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
void GSLocalMemory::WriteImage4HH(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
{
|
||||
if (TRXREG.RRW == 0)
|
||||
return;
|
||||
|
||||
uint32 bp = BITBLTBUF.DBP;
|
||||
uint32 bw = BITBLTBUF.DBW;
|
||||
u32 bp = BITBLTBUF.DBP;
|
||||
u32 bw = BITBLTBUF.DBW;
|
||||
|
||||
int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW / 2;
|
||||
int th = len / srcpitch;
|
||||
|
@ -1030,13 +1030,13 @@ void GSLocalMemory::WriteImage4HH(int& tx, int& ty, const uint8* src, int len, G
|
|||
}
|
||||
}
|
||||
|
||||
void GSLocalMemory::WriteImage24Z(int& tx, int& ty, const uint8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
void GSLocalMemory::WriteImage24Z(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
{
|
||||
if (TRXREG.RRW == 0)
|
||||
return;
|
||||
|
||||
uint32 bp = BITBLTBUF.DBP;
|
||||
uint32 bw = BITBLTBUF.DBW;
|
||||
u32 bp = BITBLTBUF.DBP;
|
||||
u32 bw = BITBLTBUF.DBW;
|
||||
|
||||
int tw = TRXPOS.DSAX + TRXREG.RRW, srcpitch = TRXREG.RRW * 3;
|
||||
int th = len / srcpitch;
|
||||
|
@ -1122,17 +1122,17 @@ static void readWriteHelper(VM* vm, int& tx, int& ty, int len, int xinc, int sx,
|
|||
readWriteHelperImpl(tx, ty, len, xinc, sx, w, [&](int x, int y){ return off.paMulti(vm, x, y); }, std::forward<Fn>(fn));
|
||||
}
|
||||
|
||||
void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
void GSLocalMemory::WriteImageX(int& tx, int& ty, const u8* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG)
|
||||
{
|
||||
if (len <= 0)
|
||||
return;
|
||||
|
||||
const uint8* pb = (uint8*)src;
|
||||
const uint16* pw = (uint16*)src;
|
||||
const uint32* pd = (uint32*)src;
|
||||
const u8* pb = (u8*)src;
|
||||
const u16* pw = (u16*)src;
|
||||
const u32* pd = (u32*)src;
|
||||
|
||||
uint32 bp = BITBLTBUF.DBP;
|
||||
uint32 bw = BITBLTBUF.DBW;
|
||||
u32 bp = BITBLTBUF.DBP;
|
||||
u32 bw = BITBLTBUF.DBW;
|
||||
|
||||
int sx = TRXPOS.DSAX;
|
||||
int w = TRXREG.RRW;
|
||||
|
@ -1154,7 +1154,7 @@ void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIF
|
|||
case PSM_PSMZ24:
|
||||
readWriteHelper(m_vm32, tx, ty, len / 3, 1, sx, w, off.assertSizesMatch(swizzle32), [&](auto& pa, int x)
|
||||
{
|
||||
WritePixel24(pa.value(x), *(uint32*)pb);
|
||||
WritePixel24(pa.value(x), *(u32*)pb);
|
||||
pb += 3;
|
||||
});
|
||||
break;
|
||||
|
@ -1217,17 +1217,17 @@ void GSLocalMemory::WriteImageX(int& tx, int& ty, const uint8* src, int len, GIF
|
|||
|
||||
//
|
||||
|
||||
void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) const
|
||||
void GSLocalMemory::ReadImageX(int& tx, int& ty, u8* dst, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG) const
|
||||
{
|
||||
if (len <= 0)
|
||||
return;
|
||||
|
||||
uint8* RESTRICT pb = (uint8*)dst;
|
||||
uint16* RESTRICT pw = (uint16*)dst;
|
||||
uint32* RESTRICT pd = (uint32*)dst;
|
||||
u8* RESTRICT pb = (u8*)dst;
|
||||
u16* RESTRICT pw = (u16*)dst;
|
||||
u32* RESTRICT pd = (u32*)dst;
|
||||
|
||||
uint32 bp = BITBLTBUF.SBP;
|
||||
uint32 bw = BITBLTBUF.SBW;
|
||||
u32 bp = BITBLTBUF.SBP;
|
||||
u32 bw = BITBLTBUF.SBW;
|
||||
|
||||
int sx = TRXPOS.SSAX;
|
||||
int w = TRXREG.RRW;
|
||||
|
@ -1262,7 +1262,7 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB
|
|||
|
||||
for (int ex8 = ex - 8; len >= 8 && x <= ex8; len -= 8, x += 8, pd += 8)
|
||||
{
|
||||
uint32* ps = pa.value(x);
|
||||
u32* ps = pa.value(x);
|
||||
|
||||
GSVector4i::store<false>(&pd[0], GSVector4i::load(ps + 0, ps + 4));
|
||||
GSVector4i::store<false>(&pd[4], GSVector4i::load(ps + 8, ps + 12));
|
||||
|
@ -1293,10 +1293,10 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB
|
|||
case PSM_PSMZ24:
|
||||
readWriteHelper(m_vm32, tx, ty, len / 3, 1, sx, w, off.assertSizesMatch(swizzle32), [&](auto& pa, int x)
|
||||
{
|
||||
uint32 c = *pa.value(x);
|
||||
pb[0] = (uint8)(c);
|
||||
pb[1] = (uint8)(c >> 8);
|
||||
pb[2] = (uint8)(c >> 16);
|
||||
u32 c = *pa.value(x);
|
||||
pb[0] = (u8)(c);
|
||||
pb[1] = (u8)(c >> 8);
|
||||
pb[2] = (u8)(c >> 16);
|
||||
pb += 3;
|
||||
});
|
||||
break;
|
||||
|
@ -1323,8 +1323,8 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB
|
|||
case PSM_PSMT4:
|
||||
readWriteHelper(tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4), [&](GSOffset::PAHelper& pa, int x)
|
||||
{
|
||||
uint8 low = ReadPixel4(pa.value(x));
|
||||
uint8 high = ReadPixel4(pa.value(x + 1));
|
||||
u8 low = ReadPixel4(pa.value(x));
|
||||
u8 high = ReadPixel4(pa.value(x + 1));
|
||||
*pb = low | (high << 4);
|
||||
});
|
||||
break;
|
||||
|
@ -1332,7 +1332,7 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB
|
|||
case PSM_PSMT8H:
|
||||
readWriteHelper(m_vm32, tx, ty, len, 1, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT8H), [&](auto& pa, int x)
|
||||
{
|
||||
*pb = (uint8)(*pa.value(x) >> 24);
|
||||
*pb = (u8)(*pa.value(x) >> 24);
|
||||
pb++;
|
||||
});
|
||||
break;
|
||||
|
@ -1340,9 +1340,9 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB
|
|||
case PSM_PSMT4HL:
|
||||
readWriteHelper(m_vm32, tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HL), [&](auto& pa, int x)
|
||||
{
|
||||
uint32 c0 = *pa.value(x) >> 24 & 0x0f;
|
||||
uint32 c1 = *pa.value(x + 1) >> 20 & 0xf0;
|
||||
*pb = (uint8)(c0 | c1);
|
||||
u32 c0 = *pa.value(x) >> 24 & 0x0f;
|
||||
u32 c1 = *pa.value(x + 1) >> 20 & 0xf0;
|
||||
*pb = (u8)(c0 | c1);
|
||||
pb++;
|
||||
});
|
||||
break;
|
||||
|
@ -1350,9 +1350,9 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB
|
|||
case PSM_PSMT4HH:
|
||||
readWriteHelper(m_vm32, tx, ty, len * 2, 2, sx, w, GSOffset::fromKnownPSM(bp, bw, PSM_PSMT4HH), [&](auto& pa, int x)
|
||||
{
|
||||
uint32 c0 = *pa.value(x) >> 28 & 0x0f;
|
||||
uint32 c1 = *pa.value(x + 1) >> 24 & 0xf0;
|
||||
*pb = (uint8)(c0 | c1);
|
||||
u32 c0 = *pa.value(x) >> 28 & 0x0f;
|
||||
u32 c1 = *pa.value(x + 1) >> 24 & 0xf0;
|
||||
*pb = (u8)(c0 | c1);
|
||||
pb++;
|
||||
});
|
||||
break;
|
||||
|
@ -1361,35 +1361,35 @@ void GSLocalMemory::ReadImageX(int& tx, int& ty, uint8* dst, int len, GIFRegBITB
|
|||
|
||||
///////////////////
|
||||
|
||||
void GSLocalMemory::ReadTexture32(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture32(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadBlock32(src, read_dst, dstpitch);
|
||||
});
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTexture24(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture24(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
if (TEXA.AEM)
|
||||
{
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadAndExpandBlock24<true>(src, read_dst, dstpitch, TEXA);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadAndExpandBlock24<false>(src, read_dst, dstpitch, TEXA);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureGPU24(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTextureGPU24(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 16, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 16, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadBlock16(src, read_dst, dstpitch);
|
||||
});
|
||||
|
@ -1398,78 +1398,78 @@ void GSLocalMemory::ReadTextureGPU24(const GSOffset& off, const GSVector4i& r, u
|
|||
ASSERT(dstpitch >= r.width() * 4);
|
||||
for (int y = r.top; y < r.bottom; y++)
|
||||
{
|
||||
uint8* line = dst + y * dstpitch;
|
||||
u8* line = dst + y * dstpitch;
|
||||
|
||||
for (int x = r.right; x >= r.left; x--)
|
||||
{
|
||||
*(uint32*)&line[x * 4] = *(uint32*)&line[x * 3] & 0xFFFFFF;
|
||||
*(u32*)&line[x * 4] = *(u32*)&line[x * 3] & 0xFFFFFF;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTexture16(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture16(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
if (TEXA.AEM)
|
||||
{
|
||||
foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadAndExpandBlock16<true>(src, read_dst, dstpitch, TEXA);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle16), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadAndExpandBlock16<false>(src, read_dst, dstpitch, TEXA);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTexture8(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture8(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
const uint32* pal = m_clut;
|
||||
const u32* pal = m_clut;
|
||||
|
||||
foreachBlock(off.assertSizesMatch(swizzle8), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle8), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadAndExpandBlock8_32(src, read_dst, dstpitch, pal);
|
||||
});
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTexture4(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture4(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
const uint64* pal = m_clut;
|
||||
const u64* pal = m_clut;
|
||||
|
||||
foreachBlock(off.assertSizesMatch(swizzle4), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle4), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadAndExpandBlock4_32(src, read_dst, dstpitch, pal);
|
||||
});
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTexture8H(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture8H(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
const uint32* pal = m_clut;
|
||||
const u32* pal = m_clut;
|
||||
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadAndExpandBlock8H_32(src, read_dst, dstpitch, pal);
|
||||
});
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTexture4HL(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture4HL(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
const uint32* pal = m_clut;
|
||||
const u32* pal = m_clut;
|
||||
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadAndExpandBlock4HL_32(src, read_dst, dstpitch, pal);
|
||||
});
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTexture4HH(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture4HH(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
const uint32* pal = m_clut;
|
||||
const u32* pal = m_clut;
|
||||
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 32, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadAndExpandBlock4HH_32(src, read_dst, dstpitch, pal);
|
||||
});
|
||||
|
@ -1477,14 +1477,14 @@ void GSLocalMemory::ReadTexture4HH(const GSOffset& off, const GSVector4i& r, uin
|
|||
|
||||
///////////////////
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock32(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock32(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
GSBlock::ReadBlock32(BlockPtr(bp), dst, dstpitch);
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock24(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock24(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
|
@ -1498,7 +1498,7 @@ void GSLocalMemory::ReadTextureBlock24(uint32 bp, uint8* dst, int dstpitch, cons
|
|||
}
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock16(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock16(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
|
@ -1512,35 +1512,35 @@ void GSLocalMemory::ReadTextureBlock16(uint32 bp, uint8* dst, int dstpitch, cons
|
|||
}
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock8(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock8(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
GSBlock::ReadAndExpandBlock8_32(BlockPtr(bp), dst, dstpitch, m_clut);
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock4(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock4(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
GSBlock::ReadAndExpandBlock4_32(BlockPtr(bp), dst, dstpitch, m_clut);
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock8H(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock8H(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
GSBlock::ReadAndExpandBlock8H_32(BlockPtr(bp), dst, dstpitch, m_clut);
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock4HL(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock4HL(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
GSBlock::ReadAndExpandBlock4HL_32(BlockPtr(bp), dst, dstpitch, m_clut);
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock4HH(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock4HH(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
|
@ -1549,7 +1549,7 @@ void GSLocalMemory::ReadTextureBlock4HH(uint32 bp, uint8* dst, int dstpitch, con
|
|||
|
||||
///////////////////
|
||||
|
||||
void GSLocalMemory::ReadTexture(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
const psm_t& psm = m_psm[off.psm()];
|
||||
|
||||
|
@ -1566,7 +1566,7 @@ void GSLocalMemory::ReadTexture(const GSOffset& off, const GSVector4i& r, uint8*
|
|||
|
||||
GSVector4i cr = r.ralign<Align_Inside>(psm.bs);
|
||||
|
||||
bool aligned = ((size_t)(dst + (cr.left - r.left) * sizeof(uint32)) & 0xf) == 0;
|
||||
bool aligned = ((size_t)(dst + (cr.left - r.left) * sizeof(u32)) & 0xf) == 0;
|
||||
|
||||
if (cr.rempty() || !aligned)
|
||||
{
|
||||
|
@ -1579,7 +1579,7 @@ void GSLocalMemory::ReadTexture(const GSOffset& off, const GSVector4i& r, uint8*
|
|||
{
|
||||
for (int x = r.left, i = 0; x < r.right; x++, i++)
|
||||
{
|
||||
((uint32*)dst)[i] = (this->*rt)(x, y, TEX0, TEXA);
|
||||
((u32*)dst)[i] = (this->*rt)(x, y, TEX0, TEXA);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1589,7 +1589,7 @@ void GSLocalMemory::ReadTexture(const GSOffset& off, const GSVector4i& r, uint8*
|
|||
{
|
||||
for (int x = r.left, i = 0; x < r.right; x++, i++)
|
||||
{
|
||||
((uint32*)dst)[i] = (this->*rt)(x, y, TEX0, TEXA);
|
||||
((u32*)dst)[i] = (this->*rt)(x, y, TEX0, TEXA);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1597,7 +1597,7 @@ void GSLocalMemory::ReadTexture(const GSOffset& off, const GSVector4i& r, uint8*
|
|||
{
|
||||
for (int x = r.left, i = 0; x < r.right; x++, i++)
|
||||
{
|
||||
((uint32*)dst)[i] = (this->*rt)(x, y, TEX0, TEXA);
|
||||
((u32*)dst)[i] = (this->*rt)(x, y, TEX0, TEXA);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1605,18 +1605,18 @@ void GSLocalMemory::ReadTexture(const GSOffset& off, const GSVector4i& r, uint8*
|
|||
{
|
||||
for (int x = r.left, i = 0; x < cr.left; x++, i++)
|
||||
{
|
||||
((uint32*)dst)[i] = (this->*rt)(x, y, TEX0, TEXA);
|
||||
((u32*)dst)[i] = (this->*rt)(x, y, TEX0, TEXA);
|
||||
}
|
||||
|
||||
for (int x = cr.right, i = x - r.left; x < r.right; x++, i++)
|
||||
{
|
||||
((uint32*)dst)[i] = (this->*rt)(x, y, TEX0, TEXA);
|
||||
((u32*)dst)[i] = (this->*rt)(x, y, TEX0, TEXA);
|
||||
}
|
||||
}
|
||||
|
||||
if (!cr.rempty())
|
||||
{
|
||||
(this->*rtx)(off, cr, dst + (cr.left - r.left) * sizeof(uint32), dstpitch, TEXA);
|
||||
(this->*rtx)(off, cr, dst + (cr.left - r.left) * sizeof(u32), dstpitch, TEXA);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1628,41 +1628,41 @@ void GSLocalMemory::ReadTexture(const GSOffset& off, const GSVector4i& r, uint8*
|
|||
|
||||
// 32/8
|
||||
|
||||
void GSLocalMemory::ReadTexture8P(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture8P(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
foreachBlock(off.assertSizesMatch(swizzle8), this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle8), this, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadBlock8(src, read_dst, dstpitch);
|
||||
});
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTexture4P(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture4P(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
foreachBlock(off.assertSizesMatch(swizzle4), this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle4), this, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadBlock4P(src, read_dst, dstpitch);
|
||||
});
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTexture8HP(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture8HP(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadBlock8HP(src, read_dst, dstpitch);
|
||||
});
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTexture4HLP(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture4HLP(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadBlock4HLP(src, read_dst, dstpitch);
|
||||
});
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTexture4HHP(const GSOffset& off, const GSVector4i& r, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
void GSLocalMemory::ReadTexture4HHP(const GSOffset& off, const GSVector4i& r, u8* dst, int dstpitch, const GIFRegTEXA& TEXA)
|
||||
{
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](uint8* read_dst, const uint8* src)
|
||||
foreachBlock(off.assertSizesMatch(swizzle32), this, r, dst, dstpitch, 8, [&](u8* read_dst, const u8* src)
|
||||
{
|
||||
GSBlock::ReadBlock4HHP(src, read_dst, dstpitch);
|
||||
});
|
||||
|
@ -1670,33 +1670,33 @@ void GSLocalMemory::ReadTexture4HHP(const GSOffset& off, const GSVector4i& r, ui
|
|||
|
||||
//
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock8P(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock8P(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
GSBlock::ReadBlock8(BlockPtr(bp), dst, dstpitch);
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock4P(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock4P(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
GSBlock::ReadBlock4P(BlockPtr(bp), dst, dstpitch);
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock8HP(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock8HP(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
GSBlock::ReadBlock8HP(BlockPtr(bp), dst, dstpitch);
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock4HLP(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock4HLP(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
GSBlock::ReadBlock4HLP(BlockPtr(bp), dst, dstpitch);
|
||||
}
|
||||
|
||||
void GSLocalMemory::ReadTextureBlock4HHP(uint32 bp, uint8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
void GSLocalMemory::ReadTextureBlock4HHP(u32 bp, u8* dst, int dstpitch, const GIFRegTEXA& TEXA) const
|
||||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
|
@ -1707,7 +1707,7 @@ void GSLocalMemory::ReadTextureBlock4HHP(uint32 bp, uint8* dst, int dstpitch, co
|
|||
|
||||
#include "Renderers/SW/GSTextureSW.h"
|
||||
|
||||
void GSLocalMemory::SaveBMP(const std::string& fn, uint32 bp, uint32 bw, uint32 psm, int w, int h)
|
||||
void GSLocalMemory::SaveBMP(const std::string& fn, u32 bp, u32 bw, u32 psm, int w, int h)
|
||||
{
|
||||
int pitch = w * 4;
|
||||
int size = pitch * h;
|
||||
|
@ -1721,13 +1721,13 @@ void GSLocalMemory::SaveBMP(const std::string& fn, uint32 bp, uint32 bw, uint32
|
|||
|
||||
readPixel rp = m_psm[psm].rp;
|
||||
|
||||
uint8* p = (uint8*)bits;
|
||||
u8* p = (u8*)bits;
|
||||
|
||||
for (int j = 0; j < h; j++, p += pitch)
|
||||
{
|
||||
for (int i = 0; i < w; i++)
|
||||
{
|
||||
((uint32*)p)[i] = (this->*rp)(i, j, TEX0.TBP0, TEX0.TBW);
|
||||
((u32*)p)[i] = (this->*rp)(i, j, TEX0.TBP0, TEX0.TBW);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -40,7 +40,7 @@ void GSPerfMon::Put(counter_t c, double val)
|
|||
# else
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||
# endif
|
||||
uint64 now = (uint64)ts.tv_sec * (uint64)1e6 + (uint64)ts.tv_nsec / (uint64)1e3;
|
||||
u64 now = (u64)ts.tv_sec * (u64)1e6 + (u64)ts.tv_nsec / (u64)1e3;
|
||||
#else
|
||||
clock_t now = clock();
|
||||
#endif
|
||||
|
|
|
@ -45,8 +45,8 @@ public:
|
|||
protected:
|
||||
double m_counters[CounterLast];
|
||||
double m_stats[CounterLast];
|
||||
uint64 m_begin[TimerLast], m_total[TimerLast], m_start[TimerLast];
|
||||
uint64 m_frame;
|
||||
u64 m_begin[TimerLast], m_total[TimerLast], m_start[TimerLast];
|
||||
u64 m_frame;
|
||||
clock_t m_lastframe;
|
||||
int m_count;
|
||||
|
||||
|
@ -55,8 +55,8 @@ protected:
|
|||
public:
|
||||
GSPerfMon();
|
||||
|
||||
void SetFrame(uint64 frame) { m_frame = frame; }
|
||||
uint64 GetFrame() { return m_frame; }
|
||||
void SetFrame(u64 frame) { m_frame = frame; }
|
||||
u64 GetFrame() { return m_frame; }
|
||||
|
||||
void Put(counter_t c, double val = 0);
|
||||
double Get(counter_t c) { return m_stats[c]; }
|
||||
|
|
|
@ -38,8 +38,8 @@ struct
|
|||
namespace GSPng
|
||||
{
|
||||
|
||||
bool SaveFile(const std::string& file, const Format fmt, const uint8* const image,
|
||||
uint8* const row, const int width, const int height, const int pitch,
|
||||
bool SaveFile(const std::string& file, const Format fmt, const u8* const image,
|
||||
u8* const row, const int width, const int height, const int pitch,
|
||||
const int compression, const bool rb_swapped = false, const bool first_image = false)
|
||||
{
|
||||
const int channel_bit_depth = pixel[fmt].channel_bit_depth;
|
||||
|
@ -105,7 +105,7 @@ namespace GSPng
|
|||
return success;
|
||||
}
|
||||
|
||||
bool Save(GSPng::Format fmt, const std::string& file, uint8* image, int w, int h, int pitch, int compression, bool rb_swapped)
|
||||
bool Save(GSPng::Format fmt, const std::string& file, u8* image, int w, int h, int pitch, int compression, bool rb_swapped)
|
||||
{
|
||||
std::string root = file;
|
||||
root.replace(file.length() - 4, 4, "");
|
||||
|
@ -115,7 +115,7 @@ namespace GSPng
|
|||
if (compression < 0 || compression > Z_BEST_COMPRESSION)
|
||||
compression = Z_BEST_SPEED;
|
||||
|
||||
std::unique_ptr<uint8[]> row(new uint8[pixel[fmt].bytes_per_pixel_out * w]);
|
||||
std::unique_ptr<u8[]> row(new u8[pixel[fmt].bytes_per_pixel_out * w]);
|
||||
|
||||
std::string filename = root + pixel[fmt].extension[0];
|
||||
if (!SaveFile(filename, fmt, image, row.get(), w, h, pitch, compression, rb_swapped, true))
|
||||
|
@ -129,11 +129,11 @@ namespace GSPng
|
|||
return SaveFile(filename, fmt, image, row.get(), w, h, pitch, compression);
|
||||
}
|
||||
|
||||
Transaction::Transaction(GSPng::Format fmt, const std::string& file, const uint8* image, int w, int h, int pitch, int compression)
|
||||
Transaction::Transaction(GSPng::Format fmt, const std::string& file, const u8* image, int w, int h, int pitch, int compression)
|
||||
: m_fmt(fmt), m_file(file), m_w(w), m_h(h), m_pitch(pitch), m_compression(compression)
|
||||
{
|
||||
// Note: yes it would be better to use shared pointer
|
||||
m_image = (uint8*)_aligned_malloc(pitch * h, 32);
|
||||
m_image = (u8*)_aligned_malloc(pitch * h, 32);
|
||||
if (m_image)
|
||||
memcpy(m_image, image, pitch * h);
|
||||
}
|
||||
|
|
|
@ -37,17 +37,17 @@ namespace GSPng
|
|||
public:
|
||||
Format m_fmt;
|
||||
const std::string m_file;
|
||||
uint8* m_image;
|
||||
u8* m_image;
|
||||
int m_w;
|
||||
int m_h;
|
||||
int m_pitch;
|
||||
int m_compression;
|
||||
|
||||
Transaction(GSPng::Format fmt, const std::string& file, const uint8* image, int w, int h, int pitch, int compression);
|
||||
Transaction(GSPng::Format fmt, const std::string& file, const u8* image, int w, int h, int pitch, int compression);
|
||||
~Transaction();
|
||||
};
|
||||
|
||||
bool Save(GSPng::Format fmt, const std::string& file, uint8* image, int w, int h, int pitch, int compression, bool rb_swapped = false);
|
||||
bool Save(GSPng::Format fmt, const std::string& file, u8* image, int w, int h, int pitch, int compression, bool rb_swapped = false);
|
||||
|
||||
void Process(std::shared_ptr<Transaction>& item);
|
||||
|
||||
|
|
|
@ -148,7 +148,7 @@ GSState::~GSState()
|
|||
_aligned_free(m_index.buff);
|
||||
}
|
||||
|
||||
void GSState::SetRegsMem(uint8* basemem)
|
||||
void GSState::SetRegsMem(u8* basemem)
|
||||
{
|
||||
ASSERT(basemem);
|
||||
|
||||
|
@ -338,8 +338,8 @@ GSVideoMode GSState::GetVideoMode()
|
|||
// Other videomodes can't be detected on our side without the help of the data from core
|
||||
// You can only identify a limited number of video modes based on the info from CRTC registers.
|
||||
|
||||
const uint8 Colorburst = m_regs->SMODE1.CMOD; // Subcarrier frequency
|
||||
const uint8 PLL_Divider = m_regs->SMODE1.LC; // Phased lock loop divider
|
||||
const u8 Colorburst = m_regs->SMODE1.CMOD; // Subcarrier frequency
|
||||
const u8 PLL_Divider = m_regs->SMODE1.LC; // Phased lock loop divider
|
||||
|
||||
switch (Colorburst)
|
||||
{
|
||||
|
@ -438,13 +438,13 @@ GSVector4i GSState::GetDisplayRect(int i)
|
|||
|
||||
const auto& DISP = m_regs->DISP[i].DISPLAY;
|
||||
|
||||
const uint32 DW = DISP.DW + 1;
|
||||
const uint32 DH = DISP.DH + 1;
|
||||
const uint32 DX = DISP.DX;
|
||||
const uint32 DY = DISP.DY;
|
||||
const u32 DW = DISP.DW + 1;
|
||||
const u32 DH = DISP.DH + 1;
|
||||
const u32 DX = DISP.DX;
|
||||
const u32 DY = DISP.DY;
|
||||
|
||||
const uint32 MAGH = DISP.MAGH + 1;
|
||||
const uint32 MAGV = DISP.MAGV + 1;
|
||||
const u32 MAGH = DISP.MAGH + 1;
|
||||
const u32 MAGV = DISP.MAGV + 1;
|
||||
|
||||
const GSVector2i magnification(MAGH, MAGV);
|
||||
|
||||
|
@ -478,8 +478,8 @@ GSVector4i GSState::GetFrameRect(int i)
|
|||
if (isinterlaced() && m_regs->SMODE2.FFMD && h > 1)
|
||||
h >>= 1;
|
||||
|
||||
const uint32 DBX = m_regs->DISP[i].DISPFB.DBX;
|
||||
const uint32 DBY = m_regs->DISP[i].DISPFB.DBY;
|
||||
const u32 DBX = m_regs->DISP[i].DISPFB.DBX;
|
||||
const u32 DBY = m_regs->DISP[i].DISPFB.DBY;
|
||||
|
||||
rectangle.left = DBX;
|
||||
rectangle.top = DBY;
|
||||
|
@ -560,16 +560,16 @@ void GSState::GIFPackedRegHandlerRGBA(const GIFPackedReg* RESTRICT r)
|
|||
const GSVector4i mask = GSVector4i::load(0x0c080400);
|
||||
const GSVector4i v = GSVector4i::load<false>(r).shuffle8(mask);
|
||||
|
||||
m_v.RGBAQ.u32[0] = (uint32)GSVector4i::store(v);
|
||||
m_v.RGBAQ.U32[0] = (u32)GSVector4i::store(v);
|
||||
|
||||
m_v.RGBAQ.Q = m_q;
|
||||
}
|
||||
|
||||
void GSState::GIFPackedRegHandlerSTQ(const GIFPackedReg* RESTRICT r)
|
||||
{
|
||||
const GSVector4i st = GSVector4i::loadl(&r->u64[0]);
|
||||
const GSVector4i st = GSVector4i::loadl(&r->U64[0]);
|
||||
|
||||
GSVector4i q = GSVector4i::loadl(&r->u64[1]);
|
||||
GSVector4i q = GSVector4i::loadl(&r->U64[1]);
|
||||
GSVector4i::storel(&m_v.ST, st);
|
||||
|
||||
// Vexx (character shadow)
|
||||
|
@ -593,23 +593,23 @@ void GSState::GIFPackedRegHandlerUV(const GIFPackedReg* RESTRICT r)
|
|||
{
|
||||
const GSVector4i v = GSVector4i::loadl(r) & GSVector4i::x00003fff();
|
||||
|
||||
m_v.UV = (uint32)GSVector4i::store(v.ps32(v));
|
||||
m_v.UV = (u32)GSVector4i::store(v.ps32(v));
|
||||
}
|
||||
|
||||
void GSState::GIFPackedRegHandlerUV_Hack(const GIFPackedReg* RESTRICT r)
|
||||
{
|
||||
const GSVector4i v = GSVector4i::loadl(r) & GSVector4i::x00003fff();
|
||||
|
||||
m_v.UV = (uint32)GSVector4i::store(v.ps32(v));
|
||||
m_v.UV = (u32)GSVector4i::store(v.ps32(v));
|
||||
|
||||
m_isPackedUV_HackFlag = true;
|
||||
}
|
||||
|
||||
template <uint32 prim, uint32 adc, bool auto_flush>
|
||||
template <u32 prim, u32 adc, bool auto_flush>
|
||||
void GSState::GIFPackedRegHandlerXYZF2(const GIFPackedReg* RESTRICT r)
|
||||
{
|
||||
GSVector4i xy = GSVector4i::loadl(&r->u64[0]);
|
||||
GSVector4i zf = GSVector4i::loadl(&r->u64[1]);
|
||||
GSVector4i xy = GSVector4i::loadl(&r->U64[0]);
|
||||
GSVector4i zf = GSVector4i::loadl(&r->U64[1]);
|
||||
|
||||
xy = xy.upl16(xy.srl<4>()).upl32(GSVector4i::load((int)m_v.UV));
|
||||
zf = zf.srl32(4) & GSVector4i::x00ffffff().upl32(GSVector4i::x000000ff());
|
||||
|
@ -619,11 +619,11 @@ void GSState::GIFPackedRegHandlerXYZF2(const GIFPackedReg* RESTRICT r)
|
|||
VertexKick<prim, auto_flush>(adc ? 1 : r->XYZF2.Skip());
|
||||
}
|
||||
|
||||
template <uint32 prim, uint32 adc, bool auto_flush>
|
||||
template <u32 prim, u32 adc, bool auto_flush>
|
||||
void GSState::GIFPackedRegHandlerXYZ2(const GIFPackedReg* RESTRICT r)
|
||||
{
|
||||
const GSVector4i xy = GSVector4i::loadl(&r->u64[0]);
|
||||
const GSVector4i z = GSVector4i::loadl(&r->u64[1]);
|
||||
const GSVector4i xy = GSVector4i::loadl(&r->U64[0]);
|
||||
const GSVector4i z = GSVector4i::loadl(&r->U64[1]);
|
||||
const GSVector4i xyz = xy.upl16(xy.srl<4>()).upl32(z);
|
||||
|
||||
m_v.m[1] = xyz.upl64(GSVector4i::loadl(&m_v.UV));
|
||||
|
@ -645,8 +645,8 @@ void GSState::GIFPackedRegHandlerNOP(const GIFPackedReg* RESTRICT r)
|
|||
{
|
||||
}
|
||||
|
||||
template <uint32 prim, bool auto_flush>
|
||||
void GSState::GIFPackedRegHandlerSTQRGBAXYZF2(const GIFPackedReg* RESTRICT r, uint32 size)
|
||||
template <u32 prim, bool auto_flush>
|
||||
void GSState::GIFPackedRegHandlerSTQRGBAXYZF2(const GIFPackedReg* RESTRICT r, u32 size)
|
||||
{
|
||||
ASSERT(size > 0 && size % 3 == 0);
|
||||
|
||||
|
@ -654,16 +654,16 @@ void GSState::GIFPackedRegHandlerSTQRGBAXYZF2(const GIFPackedReg* RESTRICT r, ui
|
|||
|
||||
while (r < r_end)
|
||||
{
|
||||
GSVector4i st = GSVector4i::loadl(&r[0].u64[0]);
|
||||
GSVector4i q = GSVector4i::loadl(&r[0].u64[1]);
|
||||
GSVector4i st = GSVector4i::loadl(&r[0].U64[0]);
|
||||
GSVector4i q = GSVector4i::loadl(&r[0].U64[1]);
|
||||
GSVector4i rgba = (GSVector4i::load<false>(&r[1]) & GSVector4i::x000000ff()).ps32().pu16();
|
||||
|
||||
q = q.blend8(GSVector4i::cast(GSVector4::m_one), q == GSVector4i::zero()); // see GIFPackedRegHandlerSTQ
|
||||
|
||||
m_v.m[0] = st.upl64(rgba.upl32(q)); // TODO: only store the last one
|
||||
|
||||
GSVector4i xy = GSVector4i::loadl(&r[2].u64[0]);
|
||||
GSVector4i zf = GSVector4i::loadl(&r[2].u64[1]);
|
||||
GSVector4i xy = GSVector4i::loadl(&r[2].U64[0]);
|
||||
GSVector4i zf = GSVector4i::loadl(&r[2].U64[1]);
|
||||
xy = xy.upl16(xy.srl<4>()).upl32(GSVector4i::load((int)m_v.UV));
|
||||
zf = zf.srl32(4) & GSVector4i::x00ffffff().upl32(GSVector4i::x000000ff());
|
||||
|
||||
|
@ -677,8 +677,8 @@ void GSState::GIFPackedRegHandlerSTQRGBAXYZF2(const GIFPackedReg* RESTRICT r, ui
|
|||
m_q = r[-3].STQ.Q; // remember the last one, STQ outputs this to the temp Q each time
|
||||
}
|
||||
|
||||
template <uint32 prim, bool auto_flush>
|
||||
void GSState::GIFPackedRegHandlerSTQRGBAXYZ2(const GIFPackedReg* RESTRICT r, uint32 size)
|
||||
template <u32 prim, bool auto_flush>
|
||||
void GSState::GIFPackedRegHandlerSTQRGBAXYZ2(const GIFPackedReg* RESTRICT r, u32 size)
|
||||
{
|
||||
ASSERT(size > 0 && size % 3 == 0);
|
||||
|
||||
|
@ -686,16 +686,16 @@ void GSState::GIFPackedRegHandlerSTQRGBAXYZ2(const GIFPackedReg* RESTRICT r, uin
|
|||
|
||||
while (r < r_end)
|
||||
{
|
||||
GSVector4i st = GSVector4i::loadl(&r[0].u64[0]);
|
||||
GSVector4i q = GSVector4i::loadl(&r[0].u64[1]);
|
||||
GSVector4i st = GSVector4i::loadl(&r[0].U64[0]);
|
||||
GSVector4i q = GSVector4i::loadl(&r[0].U64[1]);
|
||||
GSVector4i rgba = (GSVector4i::load<false>(&r[1]) & GSVector4i::x000000ff()).ps32().pu16();
|
||||
|
||||
q = q.blend8(GSVector4i::cast(GSVector4::m_one), q == GSVector4i::zero()); // see GIFPackedRegHandlerSTQ
|
||||
|
||||
m_v.m[0] = st.upl64(rgba.upl32(q)); // TODO: only store the last one
|
||||
|
||||
GSVector4i xy = GSVector4i::loadl(&r[2].u64[0]);
|
||||
GSVector4i z = GSVector4i::loadl(&r[2].u64[1]);
|
||||
GSVector4i xy = GSVector4i::loadl(&r[2].U64[0]);
|
||||
GSVector4i z = GSVector4i::loadl(&r[2].U64[1]);
|
||||
GSVector4i xyz = xy.upl16(xy.srl<4>()).upl32(z);
|
||||
|
||||
m_v.m[1] = xyz.upl64(GSVector4i::loadl(&m_v.UV)); // TODO: only store the last one
|
||||
|
@ -708,7 +708,7 @@ void GSState::GIFPackedRegHandlerSTQRGBAXYZ2(const GIFPackedReg* RESTRICT r, uin
|
|||
m_q = r[-3].STQ.Q; // remember the last one, STQ outputs this to the temp Q each time
|
||||
}
|
||||
|
||||
void GSState::GIFPackedRegHandlerNOP(const GIFPackedReg* RESTRICT r, uint32 size)
|
||||
void GSState::GIFPackedRegHandlerNOP(const GIFPackedReg* RESTRICT r, u32 size)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -716,11 +716,11 @@ void GSState::GIFRegHandlerNull(const GIFReg* RESTRICT r)
|
|||
{
|
||||
}
|
||||
|
||||
__forceinline void GSState::ApplyPRIM(uint32 prim)
|
||||
__forceinline void GSState::ApplyPRIM(u32 prim)
|
||||
{
|
||||
if (GSUtil::GetPrimClass(m_env.PRIM.PRIM) == GSUtil::GetPrimClass(prim & 7)) // NOTE: assume strips/fans are converted to lists
|
||||
{
|
||||
if (m_env.PRMODECONT.AC == 1 && (m_env.PRIM.u32[0] ^ prim) & 0x7f8) // all fields except PRIM
|
||||
if (m_env.PRMODECONT.AC == 1 && (m_env.PRIM.U32[0] ^ prim) & 0x7f8) // all fields except PRIM
|
||||
Flush();
|
||||
}
|
||||
else
|
||||
|
@ -730,7 +730,7 @@ __forceinline void GSState::ApplyPRIM(uint32 prim)
|
|||
|
||||
if (m_env.PRMODECONT.AC == 1)
|
||||
{
|
||||
m_env.PRIM.u32[0] = prim;
|
||||
m_env.PRIM.U32[0] = prim;
|
||||
|
||||
UpdateContext();
|
||||
}
|
||||
|
@ -753,7 +753,7 @@ void GSState::GIFRegHandlerPRIM(const GIFReg* RESTRICT r)
|
|||
{
|
||||
ALIGN_STACK(32);
|
||||
|
||||
ApplyPRIM(r->PRIM.u32[0]);
|
||||
ApplyPRIM(r->PRIM.U32[0]);
|
||||
}
|
||||
|
||||
void GSState::GIFRegHandlerRGBAQ(const GIFReg* RESTRICT r)
|
||||
|
@ -782,17 +782,17 @@ void GSState::GIFRegHandlerST(const GIFReg* RESTRICT r)
|
|||
|
||||
void GSState::GIFRegHandlerUV(const GIFReg* RESTRICT r)
|
||||
{
|
||||
m_v.UV = r->UV.u32[0] & 0x3fff3fff;
|
||||
m_v.UV = r->UV.U32[0] & 0x3fff3fff;
|
||||
}
|
||||
|
||||
void GSState::GIFRegHandlerUV_Hack(const GIFReg* RESTRICT r)
|
||||
{
|
||||
m_v.UV = r->UV.u32[0] & 0x3fff3fff;
|
||||
m_v.UV = r->UV.U32[0] & 0x3fff3fff;
|
||||
|
||||
m_isPackedUV_HackFlag = false;
|
||||
}
|
||||
|
||||
template <uint32 prim, uint32 adc, bool auto_flush>
|
||||
template <u32 prim, u32 adc, bool auto_flush>
|
||||
void GSState::GIFRegHandlerXYZF2(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GSVector4i xyzf = GSVector4i::loadl(&r->XYZF);
|
||||
|
@ -804,7 +804,7 @@ void GSState::GIFRegHandlerXYZF2(const GIFReg* RESTRICT r)
|
|||
VertexKick<prim, auto_flush>(adc);
|
||||
}
|
||||
|
||||
template <uint32 prim, uint32 adc, bool auto_flush>
|
||||
template <u32 prim, u32 adc, bool auto_flush>
|
||||
void GSState::GIFRegHandlerXYZ2(const GIFReg* RESTRICT r)
|
||||
{
|
||||
m_v.m[1] = GSVector4i::load(&r->XYZ, &m_v.UV);
|
||||
|
@ -828,21 +828,21 @@ void GSState::ApplyTEX0(GIFRegTEX0& TEX0)
|
|||
// extremely broken for the same reasons as MLB Power Pros in that it spams TEX0 with
|
||||
// complete garbage making for a nice 1G heap of GSOffset.
|
||||
|
||||
GL_REG("Apply TEX0_%d = 0x%x_%x", i, TEX0.u32[1], TEX0.u32[0]);
|
||||
GL_REG("Apply TEX0_%d = 0x%x_%x", i, TEX0.U32[1], TEX0.U32[0]);
|
||||
|
||||
// even if TEX0 did not change, a new palette may have been uploaded and will overwrite the currently queued for drawing
|
||||
const bool wt = m_mem.m_clut.WriteTest(TEX0, m_env.TEXCLUT);
|
||||
|
||||
// clut loading already covered with WriteTest, for drawing only have to check CPSM and CSA (MGS3 intro skybox would be drawn piece by piece without this)
|
||||
|
||||
constexpr uint64 mask = 0x1f78001fffffffffull; // TBP0 TBW PSM TW TH TCC TFX CPSM CSA
|
||||
constexpr u64 mask = 0x1f78001fffffffffull; // TBP0 TBW PSM TW TH TCC TFX CPSM CSA
|
||||
|
||||
if (wt || PRIM->CTXT == i && ((TEX0.u64 ^ m_env.CTXT[i].TEX0.u64) & mask))
|
||||
if (wt || PRIM->CTXT == i && ((TEX0.U64 ^ m_env.CTXT[i].TEX0.U64) & mask))
|
||||
Flush();
|
||||
|
||||
TEX0.CPSM &= 0xa; // 1010b
|
||||
|
||||
if ((TEX0.u32[0] ^ m_env.CTXT[i].TEX0.u32[0]) & 0x3ffffff) // TBP0 TBW PSM
|
||||
if ((TEX0.U32[0] ^ m_env.CTXT[i].TEX0.U32[0]) & 0x3ffffff) // TBP0 TBW PSM
|
||||
m_env.CTXT[i].offset.tex = m_mem.GetOffset(TEX0.TBP0, TEX0.TBW, TEX0.PSM);
|
||||
|
||||
m_env.CTXT[i].TEX0 = (GSVector4i)TEX0;
|
||||
|
@ -895,7 +895,7 @@ void GSState::ApplyTEX0(GIFRegTEX0& TEX0)
|
|||
template <int i>
|
||||
void GSState::GIFRegHandlerTEX0(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("TEX0_%d = 0x%x_%x", i, r->u32[1], r->u32[0]);
|
||||
GL_REG("TEX0_%d = 0x%x_%x", i, r->U32[1], r->U32[0]);
|
||||
|
||||
GIFRegTEX0 TEX0 = r->TEX0;
|
||||
|
||||
|
@ -910,8 +910,8 @@ void GSState::GIFRegHandlerTEX0(const GIFReg* RESTRICT r)
|
|||
// Sets TW/TH to 0
|
||||
// there used to be a case to force this to 10
|
||||
// but GetSizeFixedTEX0 sorts this now
|
||||
TEX0.TW = std::clamp<uint32>(TEX0.TW, 0, 10);
|
||||
TEX0.TH = std::clamp<uint32>(TEX0.TH, 0, 10);
|
||||
TEX0.TW = std::clamp<u32>(TEX0.TW, 0, 10);
|
||||
TEX0.TH = std::clamp<u32>(TEX0.TH, 0, 10);
|
||||
|
||||
ApplyTEX0<i>(TEX0);
|
||||
|
||||
|
@ -921,36 +921,36 @@ void GSState::GIFRegHandlerTEX0(const GIFReg* RESTRICT r)
|
|||
// NOTE 2: Mipmap levels are tightly packed, if (tbw << 6) > (1 << tw) then the left-over space to the right is used. (common for PSM_PSMT4)
|
||||
// NOTE 3: Non-rectangular textures are treated as rectangular when calculating the occupied space (height is extended, not sure about width)
|
||||
|
||||
uint32 bp = TEX0.TBP0;
|
||||
uint32 bw = TEX0.TBW;
|
||||
uint32 w = 1u << TEX0.TW;
|
||||
uint32 h = 1u << TEX0.TH;
|
||||
u32 bp = TEX0.TBP0;
|
||||
u32 bw = TEX0.TBW;
|
||||
u32 w = 1u << TEX0.TW;
|
||||
u32 h = 1u << TEX0.TH;
|
||||
|
||||
const uint32 bpp = GSLocalMemory::m_psm[TEX0.PSM].bpp;
|
||||
const u32 bpp = GSLocalMemory::m_psm[TEX0.PSM].bpp;
|
||||
|
||||
if (h < w)
|
||||
h = w;
|
||||
|
||||
bp += ((w * h * bpp >> 3) + 255) >> 8;
|
||||
bw = std::max<uint32>(bw >> 1, 1);
|
||||
w = std::max<uint32>(w >> 1, 1);
|
||||
h = std::max<uint32>(h >> 1, 1);
|
||||
bw = std::max<u32>(bw >> 1, 1);
|
||||
w = std::max<u32>(w >> 1, 1);
|
||||
h = std::max<u32>(h >> 1, 1);
|
||||
|
||||
m_env.CTXT[i].MIPTBP1.TBP1 = bp;
|
||||
m_env.CTXT[i].MIPTBP1.TBW1 = bw;
|
||||
|
||||
bp += ((w * h * bpp >> 3) + 255) >> 8;
|
||||
bw = std::max<uint32>(bw >> 1, 1);
|
||||
w = std::max<uint32>(w >> 1, 1);
|
||||
h = std::max<uint32>(h >> 1, 1);
|
||||
bw = std::max<u32>(bw >> 1, 1);
|
||||
w = std::max<u32>(w >> 1, 1);
|
||||
h = std::max<u32>(h >> 1, 1);
|
||||
|
||||
m_env.CTXT[i].MIPTBP1.TBP2 = bp;
|
||||
m_env.CTXT[i].MIPTBP1.TBW2 = bw;
|
||||
|
||||
bp += ((w * h * bpp >> 3) + 255) >> 8;
|
||||
bw = std::max<uint32>(bw >> 1, 1);
|
||||
w = std::max<uint32>(w >> 1, 1);
|
||||
h = std::max<uint32>(h >> 1, 1);
|
||||
bw = std::max<u32>(bw >> 1, 1);
|
||||
w = std::max<u32>(w >> 1, 1);
|
||||
h = std::max<u32>(h >> 1, 1);
|
||||
|
||||
m_env.CTXT[i].MIPTBP1.TBP3 = bp;
|
||||
m_env.CTXT[i].MIPTBP1.TBW3 = bw;
|
||||
|
@ -960,7 +960,7 @@ void GSState::GIFRegHandlerTEX0(const GIFReg* RESTRICT r)
|
|||
template <int i>
|
||||
void GSState::GIFRegHandlerCLAMP(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("CLAMP_%d = 0x%x_%x", i, r->u32[1], r->u32[0]);
|
||||
GL_REG("CLAMP_%d = 0x%x_%x", i, r->U32[1], r->U32[0]);
|
||||
|
||||
if (PRIM->CTXT == i && r->CLAMP != m_env.CTXT[i].CLAMP)
|
||||
Flush();
|
||||
|
@ -980,7 +980,7 @@ void GSState::GIFRegHandlerNOP(const GIFReg* RESTRICT r)
|
|||
template <int i>
|
||||
void GSState::GIFRegHandlerTEX1(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("TEX1_%d = 0x%x_%x", i, r->u32[1], r->u32[0]);
|
||||
GL_REG("TEX1_%d = 0x%x_%x", i, r->U32[1], r->U32[0]);
|
||||
|
||||
if (PRIM->CTXT == i && r->TEX1 != m_env.CTXT[i].TEX1)
|
||||
Flush();
|
||||
|
@ -991,7 +991,7 @@ void GSState::GIFRegHandlerTEX1(const GIFReg* RESTRICT r)
|
|||
template <int i>
|
||||
void GSState::GIFRegHandlerTEX2(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("TEX2_%d = 0x%x_%x", i, r->u32[1], r->u32[0]);
|
||||
GL_REG("TEX2_%d = 0x%x_%x", i, r->U32[1], r->U32[0]);
|
||||
|
||||
// TEX2 is a masked write to TEX0, for performing CLUT swaps (palette swaps).
|
||||
// It only applies the following fields:
|
||||
|
@ -999,11 +999,11 @@ void GSState::GIFRegHandlerTEX2(const GIFReg* RESTRICT r)
|
|||
// It ignores these fields (uses existing values in the context):
|
||||
// TFX, TCC, TH, TW, TBW, and TBP0
|
||||
|
||||
constexpr uint64 mask = 0xFFFFFFE003F00000ull; // TEX2 bits
|
||||
constexpr u64 mask = 0xFFFFFFE003F00000ull; // TEX2 bits
|
||||
|
||||
GIFRegTEX0 TEX0;
|
||||
|
||||
TEX0.u64 = (m_env.CTXT[i].TEX0.u64 & ~mask) | (r->u64 & mask);
|
||||
TEX0.U64 = (m_env.CTXT[i].TEX0.U64 & ~mask) | (r->U64 & mask);
|
||||
|
||||
ApplyTEX0<i>(TEX0);
|
||||
}
|
||||
|
@ -1011,7 +1011,7 @@ void GSState::GIFRegHandlerTEX2(const GIFReg* RESTRICT r)
|
|||
template <int i>
|
||||
void GSState::GIFRegHandlerXYOFFSET(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("XYOFFSET_%d = 0x%x_%x", i, r->u32[1], r->u32[0]);
|
||||
GL_REG("XYOFFSET_%d = 0x%x_%x", i, r->U32[1], r->U32[0]);
|
||||
|
||||
const GSVector4i o = (GSVector4i)r->XYOFFSET & GSVector4i::x0000ffff();
|
||||
|
||||
|
@ -1027,18 +1027,18 @@ void GSState::GIFRegHandlerXYOFFSET(const GIFReg* RESTRICT r)
|
|||
|
||||
void GSState::GIFRegHandlerPRMODECONT(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("PRMODECONT = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
GL_REG("PRMODECONT = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
|
||||
m_env.PRMODECONT.AC = r->PRMODECONT.AC;
|
||||
}
|
||||
|
||||
void GSState::GIFRegHandlerPRMODE(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("PRMODE = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
GL_REG("PRMODE = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
|
||||
if (!m_env.PRMODECONT.AC)
|
||||
{
|
||||
if ((m_env.PRIM.u32[0] ^ r->PRMODE.u32[0]) & 0x7f8)
|
||||
if ((m_env.PRIM.U32[0] ^ r->PRMODE.U32[0]) & 0x7f8)
|
||||
Flush();
|
||||
}
|
||||
else
|
||||
|
@ -1046,7 +1046,7 @@ void GSState::GIFRegHandlerPRMODE(const GIFReg* RESTRICT r)
|
|||
return;
|
||||
}
|
||||
|
||||
const uint32 _PRIM = m_env.PRIM.PRIM;
|
||||
const u32 _PRIM = m_env.PRIM.PRIM;
|
||||
m_env.PRIM = (GSVector4i)r->PRMODE;
|
||||
m_env.PRIM.PRIM = _PRIM;
|
||||
|
||||
|
@ -1055,7 +1055,7 @@ void GSState::GIFRegHandlerPRMODE(const GIFReg* RESTRICT r)
|
|||
|
||||
void GSState::GIFRegHandlerTEXCLUT(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("TEXCLUT = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
GL_REG("TEXCLUT = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
|
||||
if (r->TEXCLUT != m_env.TEXCLUT)
|
||||
Flush();
|
||||
|
@ -1074,7 +1074,7 @@ void GSState::GIFRegHandlerSCANMSK(const GIFReg* RESTRICT r)
|
|||
template <int i>
|
||||
void GSState::GIFRegHandlerMIPTBP1(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("MIPTBP1_%d = 0x%x_%x", i, r->u32[1], r->u32[0]);
|
||||
GL_REG("MIPTBP1_%d = 0x%x_%x", i, r->U32[1], r->U32[0]);
|
||||
|
||||
if (PRIM->CTXT == i && r->MIPTBP1 != m_env.CTXT[i].MIPTBP1)
|
||||
Flush();
|
||||
|
@ -1085,7 +1085,7 @@ void GSState::GIFRegHandlerMIPTBP1(const GIFReg* RESTRICT r)
|
|||
template <int i>
|
||||
void GSState::GIFRegHandlerMIPTBP2(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("MIPTBP2_%d = 0x%x_%x", i, r->u32[1], r->u32[0]);
|
||||
GL_REG("MIPTBP2_%d = 0x%x_%x", i, r->U32[1], r->U32[0]);
|
||||
|
||||
if (PRIM->CTXT == i && r->MIPTBP2 != m_env.CTXT[i].MIPTBP2)
|
||||
Flush();
|
||||
|
@ -1095,7 +1095,7 @@ void GSState::GIFRegHandlerMIPTBP2(const GIFReg* RESTRICT r)
|
|||
|
||||
void GSState::GIFRegHandlerTEXA(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("TEXA = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
GL_REG("TEXA = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
if (r->TEXA != m_env.TEXA)
|
||||
Flush();
|
||||
|
||||
|
@ -1104,7 +1104,7 @@ void GSState::GIFRegHandlerTEXA(const GIFReg* RESTRICT r)
|
|||
|
||||
void GSState::GIFRegHandlerFOGCOL(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("FOGCOL = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
GL_REG("FOGCOL = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
|
||||
if (r->FOGCOL != m_env.FOGCOL)
|
||||
Flush();
|
||||
|
@ -1114,7 +1114,7 @@ void GSState::GIFRegHandlerFOGCOL(const GIFReg* RESTRICT r)
|
|||
|
||||
void GSState::GIFRegHandlerTEXFLUSH(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("TEXFLUSH = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
GL_REG("TEXFLUSH = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
}
|
||||
|
||||
template <int i>
|
||||
|
@ -1133,8 +1133,7 @@ void GSState::GIFRegHandlerSCISSOR(const GIFReg* RESTRICT r)
|
|||
template <int i>
|
||||
void GSState::GIFRegHandlerALPHA(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("ALPHA = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
|
||||
GL_REG("ALPHA = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
if (PRIM->CTXT == i && r->ALPHA != m_env.CTXT[i].ALPHA)
|
||||
Flush();
|
||||
|
||||
|
@ -1142,10 +1141,10 @@ void GSState::GIFRegHandlerALPHA(const GIFReg* RESTRICT r)
|
|||
|
||||
// value of 4 is not allowed by the spec
|
||||
// acts has 3 on real hw, so just clamp it
|
||||
m_env.CTXT[i].ALPHA.A = std::clamp<uint32>(r->ALPHA.A, 0, 3);
|
||||
m_env.CTXT[i].ALPHA.B = std::clamp<uint32>(r->ALPHA.B, 0, 3);
|
||||
m_env.CTXT[i].ALPHA.C = std::clamp<uint32>(r->ALPHA.C, 0, 3);
|
||||
m_env.CTXT[i].ALPHA.D = std::clamp<uint32>(r->ALPHA.D, 0, 3);
|
||||
m_env.CTXT[i].ALPHA.A = std::clamp<u32>(r->ALPHA.A, 0, 3);
|
||||
m_env.CTXT[i].ALPHA.B = std::clamp<u32>(r->ALPHA.B, 0, 3);
|
||||
m_env.CTXT[i].ALPHA.C = std::clamp<u32>(r->ALPHA.C, 0, 3);
|
||||
m_env.CTXT[i].ALPHA.D = std::clamp<u32>(r->ALPHA.D, 0, 3);
|
||||
}
|
||||
|
||||
void GSState::GIFRegHandlerDIMX(const GIFReg* RESTRICT r)
|
||||
|
@ -1210,12 +1209,12 @@ void GSState::GIFRegHandlerFBA(const GIFReg* RESTRICT r)
|
|||
template <int i>
|
||||
void GSState::GIFRegHandlerFRAME(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("FRAME_%d = 0x%x_%x", i, r->u32[1], r->u32[0]);
|
||||
GL_REG("FRAME_%d = 0x%x_%x", i, r->U32[1], r->U32[0]);
|
||||
|
||||
if (PRIM->CTXT == i && r->FRAME != m_env.CTXT[i].FRAME)
|
||||
Flush();
|
||||
|
||||
if ((m_env.CTXT[i].FRAME.u32[0] ^ r->FRAME.u32[0]) & 0x3f3f01ff) // FBP FBW PSM
|
||||
if ((m_env.CTXT[i].FRAME.U32[0] ^ r->FRAME.U32[0]) & 0x3f3f01ff) // FBP FBW PSM
|
||||
{
|
||||
m_env.CTXT[i].offset.fb = m_mem.GetOffset(r->FRAME.Block(), r->FRAME.FBW, r->FRAME.PSM);
|
||||
m_env.CTXT[i].offset.zb = m_mem.GetOffset(m_env.CTXT[i].ZBUF.Block(), r->FRAME.FBW, m_env.CTXT[i].ZBUF.PSM);
|
||||
|
@ -1251,7 +1250,7 @@ void GSState::GIFRegHandlerFRAME(const GIFReg* RESTRICT r)
|
|||
template <int i>
|
||||
void GSState::GIFRegHandlerZBUF(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("ZBUF_%d = 0x%x_%x", i, r->u32[1], r->u32[0]);
|
||||
GL_REG("ZBUF_%d = 0x%x_%x", i, r->U32[1], r->U32[0]);
|
||||
|
||||
GIFRegZBUF ZBUF = r->ZBUF;
|
||||
|
||||
|
@ -1264,7 +1263,7 @@ void GSState::GIFRegHandlerZBUF(const GIFReg* RESTRICT r)
|
|||
if (PRIM->CTXT == i && ZBUF != m_env.CTXT[i].ZBUF)
|
||||
Flush();
|
||||
|
||||
if ((m_env.CTXT[i].ZBUF.u32[0] ^ ZBUF.u32[0]) & 0x3f0001ff) // ZBP PSM
|
||||
if ((m_env.CTXT[i].ZBUF.U32[0] ^ ZBUF.U32[0]) & 0x3f0001ff) // ZBP PSM
|
||||
{
|
||||
m_env.CTXT[i].offset.zb = m_mem.GetOffset(ZBUF.Block(), m_env.CTXT[i].FRAME.FBW, ZBUF.PSM);
|
||||
m_env.CTXT[i].offset.fzb = m_mem.GetPixelOffset(m_env.CTXT[i].FRAME, ZBUF);
|
||||
|
@ -1286,7 +1285,7 @@ void GSState::GIFRegHandlerBITBLTBUF(const GIFReg* RESTRICT r)
|
|||
// documentation on this problem, nothing in the game to suggest
|
||||
// it is broken and the code here for it was likely incorrect to begin with.
|
||||
|
||||
GL_REG("BITBLTBUF = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
GL_REG("BITBLTBUF = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
|
||||
if (r->BITBLTBUF != m_env.BITBLTBUF)
|
||||
FlushWrite();
|
||||
|
@ -1296,7 +1295,7 @@ void GSState::GIFRegHandlerBITBLTBUF(const GIFReg* RESTRICT r)
|
|||
|
||||
void GSState::GIFRegHandlerTRXPOS(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("TRXPOS = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
GL_REG("TRXPOS = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
|
||||
if (r->TRXPOS != m_env.TRXPOS)
|
||||
FlushWrite();
|
||||
|
@ -1306,8 +1305,7 @@ void GSState::GIFRegHandlerTRXPOS(const GIFReg* RESTRICT r)
|
|||
|
||||
void GSState::GIFRegHandlerTRXREG(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("TRXREG = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
|
||||
GL_REG("TRXREG = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
if (r->TRXREG != m_env.TRXREG)
|
||||
FlushWrite();
|
||||
|
||||
|
@ -1316,7 +1314,7 @@ void GSState::GIFRegHandlerTRXREG(const GIFReg* RESTRICT r)
|
|||
|
||||
void GSState::GIFRegHandlerTRXDIR(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("TRXDIR = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
GL_REG("TRXDIR = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
|
||||
Flush();
|
||||
|
||||
|
@ -1341,14 +1339,14 @@ void GSState::GIFRegHandlerTRXDIR(const GIFReg* RESTRICT r)
|
|||
|
||||
void GSState::GIFRegHandlerHWREG(const GIFReg* RESTRICT r)
|
||||
{
|
||||
GL_REG("HWREG = 0x%x_%x", r->u32[1], r->u32[0]);
|
||||
GL_REG("HWREG = 0x%x_%x", r->U32[1], r->U32[0]);
|
||||
|
||||
// don't bother if not host -> local
|
||||
// real hw ignores
|
||||
if (m_env.TRXDIR.XDIR != 0)
|
||||
return;
|
||||
|
||||
Write(reinterpret_cast<const uint8*>(r), 8); // haunting ground
|
||||
Write(reinterpret_cast<const u8*>(r), 8); // haunting ground
|
||||
}
|
||||
|
||||
void GSState::Flush()
|
||||
|
@ -1482,7 +1480,7 @@ void GSState::FlushPrim()
|
|||
}
|
||||
}
|
||||
|
||||
void GSState::Write(const uint8* mem, int len)
|
||||
void GSState::Write(const u8* mem, int len)
|
||||
{
|
||||
int w = m_env.TRXREG.RRW;
|
||||
int h = m_env.TRXREG.RRH;
|
||||
|
@ -1555,7 +1553,7 @@ void GSState::Write(const uint8* mem, int len)
|
|||
m_mem.m_clut.Invalidate();
|
||||
}
|
||||
|
||||
void GSState::InitReadFIFO(uint8* mem, int len)
|
||||
void GSState::InitReadFIFO(u8* mem, int len)
|
||||
{
|
||||
if (len <= 0)
|
||||
return;
|
||||
|
@ -1565,7 +1563,7 @@ void GSState::InitReadFIFO(uint8* mem, int len)
|
|||
const int w = m_env.TRXREG.RRW;
|
||||
const int h = m_env.TRXREG.RRH;
|
||||
|
||||
const uint16 bpp = GSLocalMemory::m_psm[m_env.BITBLTBUF.SPSM].trbpp;
|
||||
const u16 bpp = GSLocalMemory::m_psm[m_env.BITBLTBUF.SPSM].trbpp;
|
||||
|
||||
if (!m_tr.Update(w, h, bpp, len))
|
||||
return;
|
||||
|
@ -1575,7 +1573,7 @@ void GSState::InitReadFIFO(uint8* mem, int len)
|
|||
}
|
||||
|
||||
// NOTE: called from outside MTGS
|
||||
void GSState::Read(uint8* mem, int len)
|
||||
void GSState::Read(u8* mem, int len)
|
||||
{
|
||||
if (len <= 0)
|
||||
return;
|
||||
|
@ -1587,7 +1585,7 @@ void GSState::Read(uint8* mem, int len)
|
|||
|
||||
const GSVector4i r(sx, sy, sx + w, sy + h);
|
||||
|
||||
const uint16 bpp = GSLocalMemory::m_psm[m_env.BITBLTBUF.SPSM].trbpp;
|
||||
const u16 bpp = GSLocalMemory::m_psm[m_env.BITBLTBUF.SPSM].trbpp;
|
||||
|
||||
if (!m_tr.Update(w, h, bpp, len))
|
||||
return;
|
||||
|
@ -1710,21 +1708,21 @@ void GSState::Move()
|
|||
{
|
||||
if (spsm.trbpp == 32)
|
||||
{
|
||||
copyFast(m_mem.m_vm32, dpo.assertSizesMatch(GSLocalMemory::swizzle32), spo.assertSizesMatch(GSLocalMemory::swizzle32), [](uint32* d, uint32* s)
|
||||
copyFast(m_mem.m_vm32, dpo.assertSizesMatch(GSLocalMemory::swizzle32), spo.assertSizesMatch(GSLocalMemory::swizzle32), [](u32* d, u32* s)
|
||||
{
|
||||
*d = *s;
|
||||
});
|
||||
}
|
||||
else if (spsm.trbpp == 24)
|
||||
{
|
||||
copyFast(m_mem.m_vm32, dpo.assertSizesMatch(GSLocalMemory::swizzle32), spo.assertSizesMatch(GSLocalMemory::swizzle32), [](uint32* d, uint32* s)
|
||||
copyFast(m_mem.m_vm32, dpo.assertSizesMatch(GSLocalMemory::swizzle32), spo.assertSizesMatch(GSLocalMemory::swizzle32), [](u32* d, u32* s)
|
||||
{
|
||||
*d = (*d & 0xff000000) | (*s & 0x00ffffff);
|
||||
});
|
||||
}
|
||||
else // if(spsm.trbpp == 16)
|
||||
{
|
||||
copyFast(m_mem.m_vm16, dpo.assertSizesMatch(GSLocalMemory::swizzle16), spo.assertSizesMatch(GSLocalMemory::swizzle16), [](uint16* d, uint16* s)
|
||||
copyFast(m_mem.m_vm16, dpo.assertSizesMatch(GSLocalMemory::swizzle16), spo.assertSizesMatch(GSLocalMemory::swizzle16), [](u16* d, u16* s)
|
||||
{
|
||||
*d = *s;
|
||||
});
|
||||
|
@ -1732,28 +1730,28 @@ void GSState::Move()
|
|||
}
|
||||
else if (m_env.BITBLTBUF.SPSM == PSM_PSMT8 && m_env.BITBLTBUF.DPSM == PSM_PSMT8)
|
||||
{
|
||||
copyFast(m_mem.m_vm8, GSOffset::fromKnownPSM(dbp, dbw, PSM_PSMT8), GSOffset::fromKnownPSM(sbp, sbw, PSM_PSMT8), [](uint8* d, uint8* s)
|
||||
copyFast(m_mem.m_vm8, GSOffset::fromKnownPSM(dbp, dbw, PSM_PSMT8), GSOffset::fromKnownPSM(sbp, sbw, PSM_PSMT8), [](u8* d, u8* s)
|
||||
{
|
||||
*d = *s;
|
||||
});
|
||||
}
|
||||
else if (m_env.BITBLTBUF.SPSM == PSM_PSMT4 && m_env.BITBLTBUF.DPSM == PSM_PSMT4)
|
||||
{
|
||||
copy(GSOffset::fromKnownPSM(dbp, dbw, PSM_PSMT4), GSOffset::fromKnownPSM(sbp, sbw, PSM_PSMT4), [&](uint32 doff, uint32 soff)
|
||||
copy(GSOffset::fromKnownPSM(dbp, dbw, PSM_PSMT4), GSOffset::fromKnownPSM(sbp, sbw, PSM_PSMT4), [&](u32 doff, u32 soff)
|
||||
{
|
||||
m_mem.WritePixel4(doff, m_mem.ReadPixel4(soff));
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
copy(dpo, spo, [&](uint32 doff, uint32 soff)
|
||||
copy(dpo, spo, [&](u32 doff, u32 soff)
|
||||
{
|
||||
(m_mem.*dpsm.wpa)(doff, (m_mem.*spsm.rpa)(soff));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void GSState::SoftReset(uint32 mask)
|
||||
void GSState::SoftReset(u32 mask)
|
||||
{
|
||||
if (mask & 1)
|
||||
{
|
||||
|
@ -1772,7 +1770,7 @@ void GSState::SoftReset(uint32 mask)
|
|||
m_q = 1.0f;
|
||||
}
|
||||
|
||||
void GSState::ReadFIFO(uint8* mem, int size)
|
||||
void GSState::ReadFIFO(u8* mem, int size)
|
||||
{
|
||||
GSPerfMonAutoTimer pmat(&m_perfmon);
|
||||
|
||||
|
@ -1786,17 +1784,17 @@ void GSState::ReadFIFO(uint8* mem, int size)
|
|||
m_dump->ReadFIFO(size);
|
||||
}
|
||||
|
||||
template void GSState::Transfer<0>(const uint8* mem, uint32 size);
|
||||
template void GSState::Transfer<1>(const uint8* mem, uint32 size);
|
||||
template void GSState::Transfer<2>(const uint8* mem, uint32 size);
|
||||
template void GSState::Transfer<3>(const uint8* mem, uint32 size);
|
||||
template void GSState::Transfer<0>(const u8* mem, u32 size);
|
||||
template void GSState::Transfer<1>(const u8* mem, u32 size);
|
||||
template void GSState::Transfer<2>(const u8* mem, u32 size);
|
||||
template void GSState::Transfer<3>(const u8* mem, u32 size);
|
||||
|
||||
template <int index>
|
||||
void GSState::Transfer(const uint8* mem, uint32 size)
|
||||
void GSState::Transfer(const u8* mem, u32 size)
|
||||
{
|
||||
GSPerfMonAutoTimer pmat(&m_perfmon);
|
||||
|
||||
const uint8* start = mem;
|
||||
const u8* start = mem;
|
||||
|
||||
GIFPath& path = m_path[index];
|
||||
|
||||
|
@ -1823,7 +1821,7 @@ void GSState::Transfer(const uint8* mem, uint32 size)
|
|||
}
|
||||
else
|
||||
{
|
||||
uint32 total;
|
||||
u32 total;
|
||||
|
||||
switch (path.tag.FLG)
|
||||
{
|
||||
|
@ -1852,7 +1850,7 @@ void GSState::Transfer(const uint8* mem, uint32 size)
|
|||
{
|
||||
case GIFPath::TYPE_UNKNOWN:
|
||||
{
|
||||
uint32 reg = 0;
|
||||
u32 reg = 0;
|
||||
|
||||
do
|
||||
{
|
||||
|
@ -2058,9 +2056,9 @@ int GSState::Freeze(freezeData* fd, bool sizeonly)
|
|||
path.tag.NLOOP = path.nloop;
|
||||
path.tag.REGS = 0;
|
||||
|
||||
for (size_t j = 0; j < std::size(path.regs.u8); j++)
|
||||
for (size_t j = 0; j < std::size(path.regs.U8); j++)
|
||||
{
|
||||
path.tag.u32[2 + (j >> 3)] |= path.regs.u8[j] << ((j & 7) << 2);
|
||||
path.tag.U32[2 + (j >> 3)] |= path.regs.U8[j] << ((j & 7) << 2);
|
||||
}
|
||||
|
||||
WriteState(data, &path.tag);
|
||||
|
@ -2145,7 +2143,7 @@ int GSState::Defrost(const freezeData* fd)
|
|||
m_env.CTXT[i].XYOFFSET.OFY &= 0xffff;
|
||||
|
||||
if (version <= 4)
|
||||
data += sizeof(uint32) * 7; // skip
|
||||
data += sizeof(u32) * 7; // skip
|
||||
}
|
||||
|
||||
ReadState(&m_v.RGBAQ, data);
|
||||
|
@ -2196,7 +2194,7 @@ int GSState::Defrost(const freezeData* fd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void GSState::SetGameCRC(uint32 crc, int options)
|
||||
void GSState::SetGameCRC(u32 crc, int options)
|
||||
{
|
||||
m_crc = crc;
|
||||
m_options = options;
|
||||
|
@ -2229,7 +2227,7 @@ void GSState::UpdateVertexKick()
|
|||
if (m_frameskip)
|
||||
return;
|
||||
|
||||
const uint32 prim = PRIM->PRIM;
|
||||
const u32 prim = PRIM->PRIM;
|
||||
|
||||
m_fpGIFPackedRegHandlers[GIF_REG_XYZF2] = m_fpGIFPackedRegHandlerXYZ[prim][0];
|
||||
m_fpGIFPackedRegHandlers[GIF_REG_XYZF3] = m_fpGIFPackedRegHandlerXYZ[prim][1];
|
||||
|
@ -2250,12 +2248,12 @@ void GSState::GrowVertexBuffer()
|
|||
const size_t maxcount = std::max<size_t>(m_vertex.maxcount * 3 / 2, 10000);
|
||||
|
||||
GSVertex* vertex = (GSVertex*)_aligned_malloc(sizeof(GSVertex) * maxcount, 32);
|
||||
uint32* index = (uint32*)_aligned_malloc(sizeof(uint32) * maxcount * 3, 32); // worst case is slightly less than vertex number * 3
|
||||
u32* index = (u32*)_aligned_malloc(sizeof(u32) * maxcount * 3, 32); // worst case is slightly less than vertex number * 3
|
||||
|
||||
if (vertex == NULL || index == NULL)
|
||||
{
|
||||
const size_t vert_byte_count = sizeof(GSVertex) * maxcount;
|
||||
const size_t idx_byte_count = sizeof(uint32) * maxcount * 3;
|
||||
const size_t idx_byte_count = sizeof(u32) * maxcount * 3;
|
||||
|
||||
Console.Error("GS: failed to allocate %zu bytes for verticles and %zu for indices.",
|
||||
vert_byte_count, idx_byte_count);
|
||||
|
@ -2272,7 +2270,7 @@ void GSState::GrowVertexBuffer()
|
|||
|
||||
if (m_index.buff != NULL)
|
||||
{
|
||||
memcpy(index, m_index.buff, sizeof(uint32) * m_index.tail);
|
||||
memcpy(index, m_index.buff, sizeof(u32) * m_index.tail);
|
||||
|
||||
_aligned_free(m_index.buff);
|
||||
}
|
||||
|
@ -2282,8 +2280,8 @@ void GSState::GrowVertexBuffer()
|
|||
m_index.buff = index;
|
||||
}
|
||||
|
||||
template <uint32 prim, bool auto_flush>
|
||||
__forceinline void GSState::VertexKick(uint32 skip)
|
||||
template <u32 prim, bool auto_flush>
|
||||
__forceinline void GSState::VertexKick(u32 skip)
|
||||
{
|
||||
ASSERT(m_vertex.tail < m_vertex.maxcount + 3);
|
||||
|
||||
|
@ -2441,7 +2439,7 @@ __forceinline void GSState::VertexKick(uint32 skip)
|
|||
if (tail >= m_vertex.maxcount)
|
||||
GrowVertexBuffer();
|
||||
|
||||
uint32* RESTRICT buff = &m_index.buff[m_index.tail];
|
||||
u32* RESTRICT buff = &m_index.buff[m_index.tail];
|
||||
|
||||
switch (prim)
|
||||
{
|
||||
|
@ -2726,7 +2724,7 @@ void GSState::GetAlphaMinMax()
|
|||
m_vt.m_alpha.valid = true;
|
||||
}
|
||||
|
||||
bool GSState::TryAlphaTest(uint32& fm, uint32& zm)
|
||||
bool GSState::TryAlphaTest(u32& fm, u32& zm)
|
||||
{
|
||||
// Shortcut for the easy case
|
||||
if (m_context->TEST.ATST == ATST_ALWAYS)
|
||||
|
@ -2901,7 +2899,7 @@ bool GSState::IsMipMapActive()
|
|||
return m_mipmap && IsMipMapDraw();
|
||||
}
|
||||
|
||||
GIFRegTEX0 GSState::GetTex0Layer(uint32 lod)
|
||||
GIFRegTEX0 GSState::GetTex0Layer(u32 lod)
|
||||
{
|
||||
// Shortcut
|
||||
if (lod == 0)
|
||||
|
@ -2962,7 +2960,7 @@ GSState::GSTransferBuffer::GSTransferBuffer()
|
|||
start = end = total = 0;
|
||||
|
||||
constexpr size_t alloc_size = 1024 * 1024 * 4;
|
||||
buff = reinterpret_cast<uint8*>(_aligned_malloc(alloc_size, 32));
|
||||
buff = reinterpret_cast<u8*>(_aligned_malloc(alloc_size, 32));
|
||||
}
|
||||
|
||||
GSState::GSTransferBuffer::~GSTransferBuffer()
|
||||
|
|
|
@ -31,12 +31,12 @@
|
|||
|
||||
struct GSFrameInfo
|
||||
{
|
||||
uint32 FBP;
|
||||
uint32 FPSM;
|
||||
uint32 FBMSK;
|
||||
uint32 TBP0;
|
||||
uint32 TPSM;
|
||||
uint32 TZTST;
|
||||
u32 FBP;
|
||||
u32 FPSM;
|
||||
u32 FBMSK;
|
||||
u32 TBP0;
|
||||
u32 TPSM;
|
||||
u32 TZTST;
|
||||
bool TME;
|
||||
};
|
||||
|
||||
|
@ -56,8 +56,8 @@ class GSState : public GSAlignedClass<32>
|
|||
void GIFPackedRegHandlerSTQ(const GIFPackedReg* RESTRICT r);
|
||||
void GIFPackedRegHandlerUV(const GIFPackedReg* RESTRICT r);
|
||||
void GIFPackedRegHandlerUV_Hack(const GIFPackedReg* RESTRICT r);
|
||||
template<uint32 prim, uint32 adc, bool auto_flush> void GIFPackedRegHandlerXYZF2(const GIFPackedReg* RESTRICT r);
|
||||
template<uint32 prim, uint32 adc, bool auto_flush> void GIFPackedRegHandlerXYZ2(const GIFPackedReg* RESTRICT r);
|
||||
template<u32 prim, u32 adc, bool auto_flush> void GIFPackedRegHandlerXYZF2(const GIFPackedReg* RESTRICT r);
|
||||
template<u32 prim, u32 adc, bool auto_flush> void GIFPackedRegHandlerXYZ2(const GIFPackedReg* RESTRICT r);
|
||||
void GIFPackedRegHandlerFOG(const GIFPackedReg* RESTRICT r);
|
||||
void GIFPackedRegHandlerA_D(const GIFPackedReg* RESTRICT r);
|
||||
void GIFPackedRegHandlerNOP(const GIFPackedReg* RESTRICT r);
|
||||
|
@ -67,18 +67,18 @@ class GSState : public GSAlignedClass<32>
|
|||
GIFRegHandler m_fpGIFRegHandlers[256];
|
||||
GIFRegHandler m_fpGIFRegHandlerXYZ[8][4];
|
||||
|
||||
typedef void (GSState::*GIFPackedRegHandlerC)(const GIFPackedReg* RESTRICT r, uint32 size);
|
||||
typedef void (GSState::*GIFPackedRegHandlerC)(const GIFPackedReg* RESTRICT r, u32 size);
|
||||
|
||||
GIFPackedRegHandlerC m_fpGIFPackedRegHandlersC[2];
|
||||
GIFPackedRegHandlerC m_fpGIFPackedRegHandlerSTQRGBAXYZF2[8];
|
||||
GIFPackedRegHandlerC m_fpGIFPackedRegHandlerSTQRGBAXYZ2[8];
|
||||
|
||||
template<uint32 prim, bool auto_flush> void GIFPackedRegHandlerSTQRGBAXYZF2(const GIFPackedReg* RESTRICT r, uint32 size);
|
||||
template<uint32 prim, bool auto_flush> void GIFPackedRegHandlerSTQRGBAXYZ2(const GIFPackedReg* RESTRICT r, uint32 size);
|
||||
void GIFPackedRegHandlerNOP(const GIFPackedReg* RESTRICT r, uint32 size);
|
||||
template<u32 prim, bool auto_flush> void GIFPackedRegHandlerSTQRGBAXYZF2(const GIFPackedReg* RESTRICT r, u32 size);
|
||||
template<u32 prim, bool auto_flush> void GIFPackedRegHandlerSTQRGBAXYZ2(const GIFPackedReg* RESTRICT r, u32 size);
|
||||
void GIFPackedRegHandlerNOP(const GIFPackedReg* RESTRICT r, u32 size);
|
||||
|
||||
template<int i> void ApplyTEX0(GIFRegTEX0& TEX0);
|
||||
void ApplyPRIM(uint32 prim);
|
||||
void ApplyPRIM(u32 prim);
|
||||
|
||||
void GIFRegHandlerNull(const GIFReg* RESTRICT r);
|
||||
void GIFRegHandlerPRIM(const GIFReg* RESTRICT r);
|
||||
|
@ -86,8 +86,8 @@ class GSState : public GSAlignedClass<32>
|
|||
void GIFRegHandlerST(const GIFReg* RESTRICT r);
|
||||
void GIFRegHandlerUV(const GIFReg* RESTRICT r);
|
||||
void GIFRegHandlerUV_Hack(const GIFReg* RESTRICT r);
|
||||
template<uint32 prim, uint32 adc, bool auto_flush> void GIFRegHandlerXYZF2(const GIFReg* RESTRICT r);
|
||||
template<uint32 prim, uint32 adc, bool auto_flush> void GIFRegHandlerXYZ2(const GIFReg* RESTRICT r);
|
||||
template<u32 prim, u32 adc, bool auto_flush> void GIFRegHandlerXYZF2(const GIFReg* RESTRICT r);
|
||||
template<u32 prim, u32 adc, bool auto_flush> void GIFRegHandlerXYZ2(const GIFReg* RESTRICT r);
|
||||
template<int i> void GIFRegHandlerTEX0(const GIFReg* RESTRICT r);
|
||||
template<int i> void GIFRegHandlerCLAMP(const GIFReg* RESTRICT r);
|
||||
void GIFRegHandlerFOG(const GIFReg* RESTRICT r);
|
||||
|
@ -128,7 +128,7 @@ class GSState : public GSAlignedClass<32>
|
|||
int x, y;
|
||||
int start, end, total;
|
||||
bool overflow;
|
||||
uint8* buff;
|
||||
u8* buff;
|
||||
GIFRegBITBLTBUF m_blit;
|
||||
|
||||
GSTransferBuffer();
|
||||
|
@ -163,12 +163,12 @@ protected:
|
|||
GSVertex* buff;
|
||||
size_t head, tail, next, maxcount; // head: first vertex, tail: last vertex + 1, next: last indexed + 1
|
||||
size_t xy_tail;
|
||||
uint64 xy[4];
|
||||
u64 xy[4];
|
||||
} m_vertex;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32* buff;
|
||||
u32* buff;
|
||||
size_t tail;
|
||||
} m_index;
|
||||
|
||||
|
@ -179,8 +179,8 @@ protected:
|
|||
|
||||
void GrowVertexBuffer();
|
||||
|
||||
template <uint32 prim, bool auto_flush>
|
||||
void VertexKick(uint32 skip);
|
||||
template <u32 prim, bool auto_flush>
|
||||
void VertexKick(u32 skip);
|
||||
|
||||
// following functions need m_vt to be initialized
|
||||
|
||||
|
@ -188,11 +188,11 @@ protected:
|
|||
|
||||
void GetTextureMinMax(GSVector4i& r, const GIFRegTEX0& TEX0, const GIFRegCLAMP& CLAMP, bool linear);
|
||||
void GetAlphaMinMax();
|
||||
bool TryAlphaTest(uint32& fm, uint32& zm);
|
||||
bool TryAlphaTest(u32& fm, u32& zm);
|
||||
bool IsOpaque();
|
||||
bool IsMipMapDraw();
|
||||
bool IsMipMapActive();
|
||||
GIFRegTEX0 GetTex0Layer(uint32 lod);
|
||||
GIFRegTEX0 GetTex0Layer(u32 lod);
|
||||
|
||||
public:
|
||||
GIFPath m_path[4];
|
||||
|
@ -202,7 +202,7 @@ public:
|
|||
GSDrawingEnvironment m_env;
|
||||
GSDrawingContext* m_context;
|
||||
GSPerfMon m_perfmon;
|
||||
uint32 m_crc;
|
||||
u32 m_crc;
|
||||
CRC::Game m_game;
|
||||
std::unique_ptr<GSDumpBase> m_dump;
|
||||
int m_options;
|
||||
|
@ -248,17 +248,17 @@ public:
|
|||
virtual void InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut = false) {}
|
||||
|
||||
void Move();
|
||||
void Write(const uint8* mem, int len);
|
||||
void Read(uint8* mem, int len);
|
||||
void InitReadFIFO(uint8* mem, int len);
|
||||
void Write(const u8* mem, int len);
|
||||
void Read(u8* mem, int len);
|
||||
void InitReadFIFO(u8* mem, int len);
|
||||
|
||||
void SoftReset(uint32 mask);
|
||||
void WriteCSR(uint32 csr) { m_regs->CSR.u32[1] = csr; }
|
||||
void ReadFIFO(uint8* mem, int size);
|
||||
template<int index> void Transfer(const uint8* mem, uint32 size);
|
||||
void SoftReset(u32 mask);
|
||||
void WriteCSR(u32 csr) { m_regs->CSR.U32[1] = csr; }
|
||||
void ReadFIFO(u8* mem, int size);
|
||||
template<int index> void Transfer(const u8* mem, u32 size);
|
||||
int Freeze(freezeData* fd, bool sizeonly);
|
||||
int Defrost(const freezeData* fd);
|
||||
virtual void SetGameCRC(uint32 crc, int options);
|
||||
virtual void SetGameCRC(u32 crc, int options);
|
||||
void SetFrameSkip(int skip);
|
||||
void SetRegsMem(uint8* basemem);
|
||||
void SetRegsMem(u8* basemem);
|
||||
};
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#include "GS_types.h"
|
||||
|
||||
template <int Width, int Height>
|
||||
static constexpr GSSizedBlockSwizzleTable<Height, Width> makeSwizzleTable(const uint8 (&arr)[Height][Width]) {
|
||||
static constexpr GSSizedBlockSwizzleTable<Height, Width> makeSwizzleTable(const u8 (&arr)[Height][Width]) {
|
||||
GSSizedBlockSwizzleTable<Height, Width> table = {};
|
||||
for (int y = 0; y < 8; y++) {
|
||||
for (int x = 0; x < 8; x++) {
|
||||
|
@ -30,7 +30,7 @@ static constexpr GSSizedBlockSwizzleTable<Height, Width> makeSwizzleTable(const
|
|||
return table;
|
||||
}
|
||||
|
||||
static constexpr uint8 _blockTable32[4][8] =
|
||||
static constexpr u8 _blockTable32[4][8] =
|
||||
{
|
||||
{ 0, 1, 4, 5, 16, 17, 20, 21},
|
||||
{ 2, 3, 6, 7, 18, 19, 22, 23},
|
||||
|
@ -38,7 +38,7 @@ static constexpr uint8 _blockTable32[4][8] =
|
|||
{ 10, 11, 14, 15, 26, 27, 30, 31}
|
||||
};
|
||||
|
||||
static constexpr uint8 _blockTable32Z[4][8] =
|
||||
static constexpr u8 _blockTable32Z[4][8] =
|
||||
{
|
||||
{ 24, 25, 28, 29, 8, 9, 12, 13},
|
||||
{ 26, 27, 30, 31, 10, 11, 14, 15},
|
||||
|
@ -46,7 +46,7 @@ static constexpr uint8 _blockTable32Z[4][8] =
|
|||
{ 18, 19, 22, 23, 2, 3, 6, 7}
|
||||
};
|
||||
|
||||
static constexpr uint8 _blockTable16[8][4] =
|
||||
static constexpr u8 _blockTable16[8][4] =
|
||||
{
|
||||
{ 0, 2, 8, 10 },
|
||||
{ 1, 3, 9, 11 },
|
||||
|
@ -58,7 +58,7 @@ static constexpr uint8 _blockTable16[8][4] =
|
|||
{ 21, 23, 29, 31 }
|
||||
};
|
||||
|
||||
static constexpr uint8 _blockTable16S[8][4] =
|
||||
static constexpr u8 _blockTable16S[8][4] =
|
||||
{
|
||||
{ 0, 2, 16, 18 },
|
||||
{ 1, 3, 17, 19 },
|
||||
|
@ -70,7 +70,7 @@ static constexpr uint8 _blockTable16S[8][4] =
|
|||
{ 13, 15, 29, 31 }
|
||||
};
|
||||
|
||||
static constexpr uint8 _blockTable16Z[8][4] =
|
||||
static constexpr u8 _blockTable16Z[8][4] =
|
||||
{
|
||||
{ 24, 26, 16, 18 },
|
||||
{ 25, 27, 17, 19 },
|
||||
|
@ -82,7 +82,7 @@ static constexpr uint8 _blockTable16Z[8][4] =
|
|||
{ 13, 15, 5, 7 }
|
||||
};
|
||||
|
||||
static constexpr uint8 _blockTable16SZ[8][4] =
|
||||
static constexpr u8 _blockTable16SZ[8][4] =
|
||||
{
|
||||
{ 24, 26, 8, 10 },
|
||||
{ 25, 27, 9, 11 },
|
||||
|
@ -94,7 +94,7 @@ static constexpr uint8 _blockTable16SZ[8][4] =
|
|||
{ 21, 23, 5, 7 }
|
||||
};
|
||||
|
||||
static constexpr uint8 _blockTable8[4][8] =
|
||||
static constexpr u8 _blockTable8[4][8] =
|
||||
{
|
||||
{ 0, 1, 4, 5, 16, 17, 20, 21},
|
||||
{ 2, 3, 6, 7, 18, 19, 22, 23},
|
||||
|
@ -102,7 +102,7 @@ static constexpr uint8 _blockTable8[4][8] =
|
|||
{ 10, 11, 14, 15, 26, 27, 30, 31}
|
||||
};
|
||||
|
||||
static constexpr uint8 _blockTable4[8][4] =
|
||||
static constexpr u8 _blockTable4[8][4] =
|
||||
{
|
||||
{ 0, 2, 8, 10 },
|
||||
{ 1, 3, 9, 11 },
|
||||
|
@ -123,7 +123,7 @@ constexpr GSSizedBlockSwizzleTable<8, 4> blockTable16SZ = makeSwizzleTable(_bloc
|
|||
constexpr GSSizedBlockSwizzleTable<4, 8> blockTable8 = makeSwizzleTable(_blockTable8);
|
||||
constexpr GSSizedBlockSwizzleTable<8, 4> blockTable4 = makeSwizzleTable(_blockTable4);
|
||||
|
||||
constexpr uint8 columnTable32[8][8] =
|
||||
constexpr u8 columnTable32[8][8] =
|
||||
{
|
||||
{ 0, 1, 4, 5, 8, 9, 12, 13 },
|
||||
{ 2, 3, 6, 7, 10, 11, 14, 15 },
|
||||
|
@ -135,7 +135,7 @@ constexpr uint8 columnTable32[8][8] =
|
|||
{ 50, 51, 54, 55, 58, 59, 62, 63 },
|
||||
};
|
||||
|
||||
constexpr uint8 columnTable16[8][16] =
|
||||
constexpr u8 columnTable16[8][16] =
|
||||
{
|
||||
{ 0, 2, 8, 10, 16, 18, 24, 26,
|
||||
1, 3, 9, 11, 17, 19, 25, 27 },
|
||||
|
@ -155,7 +155,7 @@ constexpr uint8 columnTable16[8][16] =
|
|||
101, 103, 109, 111, 117, 119, 125, 127 },
|
||||
};
|
||||
|
||||
constexpr uint8 columnTable8[16][16] =
|
||||
constexpr u8 columnTable8[16][16] =
|
||||
{
|
||||
{ 0, 4, 16, 20, 32, 36, 48, 52, // column 0
|
||||
2, 6, 18, 22, 34, 38, 50, 54 },
|
||||
|
@ -191,7 +191,7 @@ constexpr uint8 columnTable8[16][16] =
|
|||
203, 207, 219, 223, 235, 239, 251, 255 },
|
||||
};
|
||||
|
||||
constexpr uint16 columnTable4[16][32] =
|
||||
constexpr u16 columnTable4[16][32] =
|
||||
{
|
||||
{ 0, 8, 32, 40, 64, 72, 96, 104, // column 0
|
||||
2, 10, 34, 42, 66, 74, 98, 106,
|
||||
|
@ -259,7 +259,7 @@ constexpr uint16 columnTable4[16][32] =
|
|||
407, 415, 439, 447, 471, 479, 503, 511 },
|
||||
};
|
||||
|
||||
constexpr uint8 clutTableT32I8[128] =
|
||||
constexpr u8 clutTableT32I8[128] =
|
||||
{
|
||||
0, 1, 4, 5, 8, 9, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15,
|
||||
64, 65, 68, 69, 72, 73, 76, 77, 66, 67, 70, 71, 74, 75, 78, 79,
|
||||
|
@ -271,13 +271,13 @@ constexpr uint8 clutTableT32I8[128] =
|
|||
112, 113, 116, 117, 120, 121, 124, 125, 114, 115, 118, 119, 122, 123, 126, 127
|
||||
};
|
||||
|
||||
constexpr uint8 clutTableT32I4[16] =
|
||||
constexpr u8 clutTableT32I4[16] =
|
||||
{
|
||||
0, 1, 4, 5, 8, 9, 12, 13,
|
||||
2, 3, 6, 7, 10, 11, 14, 15
|
||||
};
|
||||
|
||||
constexpr uint8 clutTableT16I8[32] =
|
||||
constexpr u8 clutTableT16I8[32] =
|
||||
{
|
||||
0, 2, 8, 10, 16, 18, 24, 26,
|
||||
4, 6, 12, 14, 20, 22, 28, 30,
|
||||
|
@ -285,14 +285,14 @@ constexpr uint8 clutTableT16I8[32] =
|
|||
5, 7, 13, 15, 21, 23, 29, 31
|
||||
};
|
||||
|
||||
constexpr uint8 clutTableT16I4[16] =
|
||||
constexpr u8 clutTableT16I4[16] =
|
||||
{
|
||||
0, 2, 8, 10, 16, 18, 24, 26,
|
||||
4, 6, 12, 14, 20, 22, 28, 30
|
||||
};
|
||||
|
||||
template <int BlocksHigh, int BlocksWide, int ColHeight, int ColWidth, typename Col>
|
||||
constexpr int pxOffset(const uint8 (&blockTable)[BlocksHigh][BlocksWide], Col (&colTable)[ColHeight][ColWidth], int x, int y)
|
||||
constexpr int pxOffset(const u8 (&blockTable)[BlocksHigh][BlocksWide], Col (&colTable)[ColHeight][ColWidth], int x, int y)
|
||||
{
|
||||
int blockSize = ColHeight * ColWidth;
|
||||
int pageSize = blockSize * BlocksHigh * BlocksWide;
|
||||
|
@ -305,7 +305,7 @@ constexpr int pxOffset(const uint8 (&blockTable)[BlocksHigh][BlocksWide], Col (&
|
|||
}
|
||||
|
||||
template <int BlocksHigh, int BlocksWide, int ColHeight, int ColWidth, typename Col>
|
||||
constexpr GSPixelColOffsetTable<BlocksHigh * ColHeight> makeColOffsetTable(const uint8 (&blockTable)[BlocksHigh][BlocksWide], Col (&colTable)[ColHeight][ColWidth])
|
||||
constexpr GSPixelColOffsetTable<BlocksHigh * ColHeight> makeColOffsetTable(const u8 (&blockTable)[BlocksHigh][BlocksWide], Col (&colTable)[ColHeight][ColWidth])
|
||||
{
|
||||
constexpr int size = BlocksHigh * ColHeight;
|
||||
GSPixelColOffsetTable<size> table = {};
|
||||
|
@ -317,7 +317,7 @@ constexpr GSPixelColOffsetTable<BlocksHigh * ColHeight> makeColOffsetTable(const
|
|||
}
|
||||
|
||||
template <int BlocksHigh, int BlocksWide, int ColHeight, int ColWidth, typename Col>
|
||||
constexpr GSSizedPixelRowOffsetTable<BlocksWide * ColWidth> makeRowOffsetTable(const uint8 (&blockTable)[BlocksHigh][BlocksWide], Col (&colTable)[ColHeight][ColWidth], int y)
|
||||
constexpr GSSizedPixelRowOffsetTable<BlocksWide * ColWidth> makeRowOffsetTable(const u8 (&blockTable)[BlocksHigh][BlocksWide], Col (&colTable)[ColHeight][ColWidth], int y)
|
||||
{
|
||||
int base = pxOffset(blockTable, colTable, 0, y);
|
||||
GSSizedPixelRowOffsetTable<BlocksWide * ColWidth> table = {};
|
||||
|
|
|
@ -21,9 +21,9 @@
|
|||
struct alignas(64) GSBlockSwizzleTable
|
||||
{
|
||||
// Some swizzles are 4x8 and others are 8x4. An 8x8 table can store either at the cost of 2x size
|
||||
uint8 value[8][8];
|
||||
u8 value[8][8];
|
||||
|
||||
constexpr uint8 lookup(int x, int y) const
|
||||
constexpr u8 lookup(int x, int y) const
|
||||
{
|
||||
return value[y & 7][x & 7];
|
||||
}
|
||||
|
@ -111,14 +111,14 @@ extern const GSSizedBlockSwizzleTable<8, 4> blockTable16Z;
|
|||
extern const GSSizedBlockSwizzleTable<8, 4> blockTable16SZ;
|
||||
extern const GSSizedBlockSwizzleTable<4, 8> blockTable8;
|
||||
extern const GSSizedBlockSwizzleTable<8, 4> blockTable4;
|
||||
extern const uint8 columnTable32[8][8];
|
||||
extern const uint8 columnTable16[8][16];
|
||||
extern const uint8 columnTable8[16][16];
|
||||
extern const uint16 columnTable4[16][32];
|
||||
extern const uint8 clutTableT32I8[128];
|
||||
extern const uint8 clutTableT32I4[16];
|
||||
extern const uint8 clutTableT16I8[32];
|
||||
extern const uint8 clutTableT16I4[16];
|
||||
extern const u8 columnTable32[8][8];
|
||||
extern const u8 columnTable16[8][16];
|
||||
extern const u8 columnTable8[16][16];
|
||||
extern const u16 columnTable4[16][32];
|
||||
extern const u8 clutTableT32I8[128];
|
||||
extern const u8 clutTableT32I4[16];
|
||||
extern const u8 clutTableT16I8[32];
|
||||
extern const u8 clutTableT16I4[16];
|
||||
extern const GSPixelColOffsetTable< 32> pixelColOffset32;
|
||||
extern const GSPixelColOffsetTable< 32> pixelColOffset32Z;
|
||||
extern const GSPixelColOffsetTable< 64> pixelColOffset16;
|
||||
|
|
|
@ -50,7 +50,7 @@ private:
|
|||
|
||||
l.unlock();
|
||||
|
||||
uint32 waited = 0;
|
||||
u32 waited = 0;
|
||||
while (true)
|
||||
{
|
||||
while (m_queue.consume_one(*this))
|
||||
|
@ -110,7 +110,7 @@ public:
|
|||
|
||||
void Wait()
|
||||
{
|
||||
uint32 waited = 0;
|
||||
u32 waited = 0;
|
||||
while (true)
|
||||
{
|
||||
if (IsEmpty())
|
||||
|
|
|
@ -32,11 +32,11 @@ Xbyak::util::Cpu g_cpu;
|
|||
static class GSUtilMaps
|
||||
{
|
||||
public:
|
||||
uint8 PrimClassField[8];
|
||||
uint8 VertexCountField[8];
|
||||
uint8 ClassVertexCountField[4];
|
||||
uint32 CompatibleBitsField[64][2];
|
||||
uint32 SharedBitsField[64][2];
|
||||
u8 PrimClassField[8];
|
||||
u8 VertexCountField[8];
|
||||
u8 ClassVertexCountField[4];
|
||||
u32 CompatibleBitsField[64][2];
|
||||
u32 SharedBitsField[64][2];
|
||||
|
||||
// Defer init to avoid AVX2 illegal instructions
|
||||
void Init()
|
||||
|
@ -105,42 +105,42 @@ void GSUtil::Init()
|
|||
s_maps.Init();
|
||||
}
|
||||
|
||||
GS_PRIM_CLASS GSUtil::GetPrimClass(uint32 prim)
|
||||
GS_PRIM_CLASS GSUtil::GetPrimClass(u32 prim)
|
||||
{
|
||||
return (GS_PRIM_CLASS)s_maps.PrimClassField[prim];
|
||||
}
|
||||
|
||||
int GSUtil::GetVertexCount(uint32 prim)
|
||||
int GSUtil::GetVertexCount(u32 prim)
|
||||
{
|
||||
return s_maps.VertexCountField[prim];
|
||||
}
|
||||
|
||||
int GSUtil::GetClassVertexCount(uint32 primclass)
|
||||
int GSUtil::GetClassVertexCount(u32 primclass)
|
||||
{
|
||||
return s_maps.ClassVertexCountField[primclass];
|
||||
}
|
||||
|
||||
const uint32* GSUtil::HasSharedBitsPtr(uint32 dpsm)
|
||||
const u32* GSUtil::HasSharedBitsPtr(u32 dpsm)
|
||||
{
|
||||
return s_maps.SharedBitsField[dpsm];
|
||||
}
|
||||
|
||||
bool GSUtil::HasSharedBits(uint32 spsm, const uint32* RESTRICT ptr)
|
||||
bool GSUtil::HasSharedBits(u32 spsm, const u32* RESTRICT ptr)
|
||||
{
|
||||
return (ptr[spsm >> 5] & (1 << (spsm & 0x1f))) == 0;
|
||||
}
|
||||
|
||||
bool GSUtil::HasSharedBits(uint32 spsm, uint32 dpsm)
|
||||
bool GSUtil::HasSharedBits(u32 spsm, u32 dpsm)
|
||||
{
|
||||
return (s_maps.SharedBitsField[dpsm][spsm >> 5] & (1 << (spsm & 0x1f))) == 0;
|
||||
}
|
||||
|
||||
bool GSUtil::HasSharedBits(uint32 sbp, uint32 spsm, uint32 dbp, uint32 dpsm)
|
||||
bool GSUtil::HasSharedBits(u32 sbp, u32 spsm, u32 dbp, u32 dpsm)
|
||||
{
|
||||
return ((sbp ^ dbp) | (s_maps.SharedBitsField[dpsm][spsm >> 5] & (1 << (spsm & 0x1f)))) == 0;
|
||||
}
|
||||
|
||||
bool GSUtil::HasCompatibleBits(uint32 spsm, uint32 dpsm)
|
||||
bool GSUtil::HasCompatibleBits(u32 spsm, u32 dpsm)
|
||||
{
|
||||
return (s_maps.CompatibleBitsField[spsm][dpsm >> 5] & (1 << (dpsm & 0x1f))) != 0;
|
||||
}
|
||||
|
|
|
@ -24,15 +24,15 @@ class GSUtil
|
|||
public:
|
||||
static void Init();
|
||||
|
||||
static GS_PRIM_CLASS GetPrimClass(uint32 prim);
|
||||
static int GetVertexCount(uint32 prim);
|
||||
static int GetClassVertexCount(uint32 primclass);
|
||||
static GS_PRIM_CLASS GetPrimClass(u32 prim);
|
||||
static int GetVertexCount(u32 prim);
|
||||
static int GetClassVertexCount(u32 primclass);
|
||||
|
||||
static const uint32* HasSharedBitsPtr(uint32 dpsm);
|
||||
static bool HasSharedBits(uint32 spsm, const uint32* ptr);
|
||||
static bool HasSharedBits(uint32 spsm, uint32 dpsm);
|
||||
static bool HasSharedBits(uint32 sbp, uint32 spsm, uint32 dbp, uint32 dpsm);
|
||||
static bool HasCompatibleBits(uint32 spsm, uint32 dpsm);
|
||||
static const u32* HasSharedBitsPtr(u32 dpsm);
|
||||
static bool HasSharedBits(u32 spsm, const u32* ptr);
|
||||
static bool HasSharedBits(u32 spsm, u32 dpsm);
|
||||
static bool HasSharedBits(u32 sbp, u32 spsm, u32 dbp, u32 dpsm);
|
||||
static bool HasCompatibleBits(u32 spsm, u32 dpsm);
|
||||
|
||||
static bool CheckSSE();
|
||||
static CRCHackLevel GetRecommendedCRCHackLevel(GSRendererType type);
|
||||
|
|
|
@ -50,15 +50,15 @@ public:
|
|||
struct { float r, g, b, a; };
|
||||
struct { float left, top, right, bottom; };
|
||||
float v[4];
|
||||
float f32[4];
|
||||
int8 i8[16];
|
||||
int16 i16[8];
|
||||
int32 i32[4];
|
||||
int64 i64[2];
|
||||
uint8 u8[16];
|
||||
uint16 u16[8];
|
||||
uint32 u32[4];
|
||||
uint64 u64[2];
|
||||
float F32[4];
|
||||
s8 I8[16];
|
||||
s16 I16[8];
|
||||
s32 I32[4];
|
||||
s64 I64[2];
|
||||
u8 U8[16];
|
||||
u16 U16[8];
|
||||
u32 U32[4];
|
||||
u64 U64[2];
|
||||
__m128 m;
|
||||
};
|
||||
|
||||
|
@ -154,7 +154,7 @@ public:
|
|||
#endif
|
||||
}
|
||||
|
||||
__forceinline explicit GSVector4(uint32 u)
|
||||
__forceinline explicit GSVector4(u32 u)
|
||||
{
|
||||
GSVector4i v((int)u);
|
||||
|
||||
|
@ -216,17 +216,17 @@ public:
|
|||
return *this;
|
||||
}
|
||||
|
||||
__forceinline uint32 rgba32() const
|
||||
__forceinline u32 rgba32() const
|
||||
{
|
||||
return GSVector4i(*this).rgba32();
|
||||
}
|
||||
|
||||
__forceinline static GSVector4 rgba32(uint32 rgba)
|
||||
__forceinline static GSVector4 rgba32(u32 rgba)
|
||||
{
|
||||
return GSVector4(GSVector4i::load((int)rgba).u8to32());
|
||||
}
|
||||
|
||||
__forceinline static GSVector4 rgba32(uint32 rgba, int shift)
|
||||
__forceinline static GSVector4 rgba32(u32 rgba, int shift)
|
||||
{
|
||||
return GSVector4(GSVector4i::load((int)rgba).u8to32() << shift);
|
||||
}
|
||||
|
@ -634,7 +634,7 @@ GSVector.h:2973:15: error: shadows template parm 'int i'
|
|||
return GSVector4(_mm_load_ss(&f));
|
||||
}
|
||||
|
||||
__forceinline static GSVector4 load(uint32 u)
|
||||
__forceinline static GSVector4 load(u32 u)
|
||||
{
|
||||
GSVector4i v = GSVector4i::load((int)u);
|
||||
|
||||
|
|
|
@ -54,15 +54,15 @@ public:
|
|||
struct { int r, g, b, a; };
|
||||
struct { int left, top, right, bottom; };
|
||||
int v[4];
|
||||
float f32[4];
|
||||
int8 i8[16];
|
||||
int16 i16[8];
|
||||
int32 i32[4];
|
||||
int64 i64[2];
|
||||
uint8 u8[16];
|
||||
uint16 u16[8];
|
||||
uint32 u32[4];
|
||||
uint64 u64[2];
|
||||
float F32[4];
|
||||
s8 I8[16];
|
||||
s16 I16[8];
|
||||
s32 I32[4];
|
||||
s64 I64[2];
|
||||
u8 U8[16];
|
||||
u16 U16[8];
|
||||
u32 U32[4];
|
||||
u64 U64[2];
|
||||
__m128i m;
|
||||
};
|
||||
|
||||
|
@ -286,14 +286,14 @@ public:
|
|||
|
||||
//
|
||||
|
||||
__forceinline uint32 rgba32() const
|
||||
__forceinline u32 rgba32() const
|
||||
{
|
||||
GSVector4i v = *this;
|
||||
|
||||
v = v.ps32(v);
|
||||
v = v.pu16(v);
|
||||
|
||||
return (uint32)store(v);
|
||||
return (u32)store(v);
|
||||
}
|
||||
|
||||
__forceinline GSVector4i sat_i8(const GSVector4i& a, const GSVector4i& b) const
|
||||
|
@ -1073,13 +1073,13 @@ public:
|
|||
#ifdef _M_AMD64
|
||||
|
||||
template <int i>
|
||||
__forceinline GSVector4i insert64(int64 a) const
|
||||
__forceinline GSVector4i insert64(s64 a) const
|
||||
{
|
||||
return GSVector4i(_mm_insert_epi64(m, a, i));
|
||||
}
|
||||
|
||||
template <int i>
|
||||
__forceinline int64 extract64() const
|
||||
__forceinline s64 extract64() const
|
||||
{
|
||||
if (i == 0)
|
||||
return GSVector4i::storeq(*this);
|
||||
|
@ -1321,8 +1321,8 @@ public:
|
|||
{
|
||||
GSVector4i v;
|
||||
|
||||
v = loadq((int64)ptr[extract8<src + 0>() & 0xf]);
|
||||
v = v.insert64<1>((int64)ptr[extract8<src + 0>() >> 4]);
|
||||
v = loadq((s64)ptr[extract8<src + 0>() & 0xf]);
|
||||
v = v.insert64<1>((s64)ptr[extract8<src + 0>() >> 4]);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
@ -1332,8 +1332,8 @@ public:
|
|||
{
|
||||
GSVector4i v;
|
||||
|
||||
v = loadq((int64)ptr[extract8<src + 0>()]);
|
||||
v = v.insert64<1>((int64)ptr[extract8<src + 1>()]);
|
||||
v = loadq((s64)ptr[extract8<src + 0>()]);
|
||||
v = v.insert64<1>((s64)ptr[extract8<src + 1>()]);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
@ -1343,8 +1343,8 @@ public:
|
|||
{
|
||||
GSVector4i v;
|
||||
|
||||
v = loadq((int64)ptr[extract16<src + 0>()]);
|
||||
v = v.insert64<1>((int64)ptr[extract16<src + 1>()]);
|
||||
v = loadq((s64)ptr[extract16<src + 0>()]);
|
||||
v = v.insert64<1>((s64)ptr[extract16<src + 1>()]);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
@ -1354,8 +1354,8 @@ public:
|
|||
{
|
||||
GSVector4i v;
|
||||
|
||||
v = loadq((int64)ptr[extract32<src + 0>()]);
|
||||
v = v.insert64<1>((int64)ptr[extract32<src + 1>()]);
|
||||
v = loadq((s64)ptr[extract32<src + 0>()]);
|
||||
v = v.insert64<1>((s64)ptr[extract32<src + 1>()]);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
@ -1365,8 +1365,8 @@ public:
|
|||
{
|
||||
GSVector4i v;
|
||||
|
||||
v = loadq((int64)ptr[extract64<0>()]);
|
||||
v = v.insert64<1>((int64)ptr[extract64<1>()]);
|
||||
v = loadq((s64)ptr[extract64<0>()]);
|
||||
v = v.insert64<1>((s64)ptr[extract64<1>()]);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
@ -1422,7 +1422,7 @@ public:
|
|||
dst[1] = gather8_4<8>(ptr);
|
||||
}
|
||||
|
||||
__forceinline void gather8_8(const uint8* RESTRICT ptr, GSVector4i* RESTRICT dst) const
|
||||
__forceinline void gather8_8(const u8* RESTRICT ptr, GSVector4i* RESTRICT dst) const
|
||||
{
|
||||
dst[0] = gather8_8<>(ptr);
|
||||
}
|
||||
|
@ -1590,7 +1590,7 @@ public:
|
|||
|
||||
#ifdef _M_AMD64
|
||||
|
||||
__forceinline static GSVector4i loadq(int64 i)
|
||||
__forceinline static GSVector4i loadq(s64 i)
|
||||
{
|
||||
return GSVector4i(_mm_cvtsi64_si128(i));
|
||||
}
|
||||
|
@ -1634,7 +1634,7 @@ public:
|
|||
|
||||
#ifdef _M_AMD64
|
||||
|
||||
__forceinline static int64 storeq(const GSVector4i& v)
|
||||
__forceinline static s64 storeq(const GSVector4i& v)
|
||||
{
|
||||
return _mm_cvtsi128_si64(v.m);
|
||||
}
|
||||
|
|
|
@ -59,15 +59,15 @@ public:
|
|||
struct { float x0, y0, z0, w0, x1, y1, z1, w1; };
|
||||
struct { float r0, g0, b0, a0, r1, g1, b1, a1; };
|
||||
float v[8];
|
||||
float f32[8];
|
||||
int8 i8[32];
|
||||
int16 i16[16];
|
||||
int32 i32[8];
|
||||
int64 i64[4];
|
||||
uint8 u8[32];
|
||||
uint16 u16[16];
|
||||
uint32 u32[8];
|
||||
uint64 u64[4];
|
||||
float F32[8];
|
||||
s8 I8[32];
|
||||
s16 I16[16];
|
||||
s32 I32[8];
|
||||
s64 I64[4];
|
||||
u8 U8[32];
|
||||
u16 U16[16];
|
||||
u32 U32[8];
|
||||
u64 U64[4];
|
||||
__m256 m;
|
||||
__m128 m0, m1;
|
||||
};
|
||||
|
@ -103,7 +103,7 @@ public:
|
|||
return GSVector8(cxpr_setr_epi32(x, x, x, x, x, x, x, x));
|
||||
}
|
||||
|
||||
static constexpr GSVector8 cxpr(uint32 x)
|
||||
static constexpr GSVector8 cxpr(u32 x)
|
||||
{
|
||||
return cxpr(static_cast<int>(x));
|
||||
}
|
||||
|
|
|
@ -69,15 +69,15 @@ public:
|
|||
struct { int x0, y0, z0, w0, x1, y1, z1, w1; };
|
||||
struct { int r0, g0, b0, a0, r1, g1, b1, a1; };
|
||||
int v[8];
|
||||
float f32[8];
|
||||
int8 i8[32];
|
||||
int16 i16[16];
|
||||
int32 i32[8];
|
||||
int64 i64[4];
|
||||
uint8 u8[32];
|
||||
uint16 u16[16];
|
||||
uint32 u32[8];
|
||||
uint64 u64[4];
|
||||
float F32[8];
|
||||
s8 I8[32];
|
||||
s16 I16[16];
|
||||
s32 I32[8];
|
||||
s64 I64[4];
|
||||
u8 U8[32];
|
||||
u16 U16[16];
|
||||
u32 U32[8];
|
||||
u64 U64[4];
|
||||
__m256i m;
|
||||
__m128i m0, m1;
|
||||
};
|
||||
|
@ -1055,17 +1055,17 @@ public:
|
|||
return cast(v0).insert<1>(v1);
|
||||
}
|
||||
|
||||
__forceinline GSVector8i gather32_32(const uint8* ptr) const
|
||||
__forceinline GSVector8i gather32_32(const u8* ptr) const
|
||||
{
|
||||
return GSVector8i(_mm256_i32gather_epi32((const int*)ptr, m, 1)) & GSVector8i::x000000ff();
|
||||
}
|
||||
|
||||
__forceinline GSVector8i gather32_32(const uint16* ptr) const
|
||||
__forceinline GSVector8i gather32_32(const u16* ptr) const
|
||||
{
|
||||
return GSVector8i(_mm256_i32gather_epi32((const int*)ptr, m, 2)) & GSVector8i::x0000ffff();
|
||||
}
|
||||
|
||||
__forceinline GSVector8i gather32_32(const uint32* ptr) const
|
||||
__forceinline GSVector8i gather32_32(const u32* ptr) const
|
||||
{
|
||||
return GSVector8i(_mm256_i32gather_epi32((const int*)ptr, m, 4));
|
||||
}
|
||||
|
@ -1092,14 +1092,14 @@ public:
|
|||
return cast(v0).insert<1>(v1);
|
||||
}
|
||||
|
||||
__forceinline GSVector8i gather32_32(const uint8* ptr1, const uint32* ptr2) const
|
||||
__forceinline GSVector8i gather32_32(const u8* ptr1, const u32* ptr2) const
|
||||
{
|
||||
return gather32_32<uint8>(ptr1).gather32_32<uint32>(ptr2);
|
||||
return gather32_32<u8>(ptr1).gather32_32<u32>(ptr2);
|
||||
}
|
||||
|
||||
__forceinline GSVector8i gather32_32(const uint32* ptr1, const uint32* ptr2) const
|
||||
__forceinline GSVector8i gather32_32(const u32* ptr1, const u32* ptr2) const
|
||||
{
|
||||
return gather32_32<uint32>(ptr1).gather32_32<uint32>(ptr2);
|
||||
return gather32_32<u32>(ptr1).gather32_32<u32>(ptr2);
|
||||
}
|
||||
|
||||
template <class T>
|
||||
|
@ -1169,7 +1169,7 @@ public:
|
|||
|
||||
#ifdef _M_AMD64
|
||||
|
||||
__forceinline static GSVector8i loadq(int64 i)
|
||||
__forceinline static GSVector8i loadq(s64 i)
|
||||
{
|
||||
return cast(GSVector4i::loadq(i));
|
||||
}
|
||||
|
@ -1213,7 +1213,7 @@ public:
|
|||
|
||||
#ifdef _M_AMD64
|
||||
|
||||
__forceinline static int64 storeq(const GSVector8i& v)
|
||||
__forceinline static s64 storeq(const GSVector8i& v)
|
||||
{
|
||||
return GSVector4i::storeq(GSVector4i::cast(v));
|
||||
}
|
||||
|
|
|
@ -15,17 +15,6 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
typedef unsigned char uint8;
|
||||
typedef signed char int8;
|
||||
typedef unsigned short uint16;
|
||||
typedef signed short int16;
|
||||
typedef unsigned int uint32;
|
||||
typedef signed int int32;
|
||||
typedef unsigned long long uint64;
|
||||
typedef signed long long int64;
|
||||
typedef signed long long sint64;
|
||||
|
||||
|
||||
#include <cfloat>
|
||||
|
||||
// clang-format off
|
||||
|
|
|
@ -126,7 +126,7 @@ GSTexture* GSDevice::FetchSurface(int type, int w, int h, int format)
|
|||
void GSDevice::PrintMemoryUsage()
|
||||
{
|
||||
#ifdef ENABLE_OGL_DEBUG
|
||||
uint32 pool = 0;
|
||||
u32 pool = 0;
|
||||
for (auto t : m_pool)
|
||||
{
|
||||
if (t)
|
||||
|
@ -422,7 +422,7 @@ HWBlend GSDevice::GetBlend(size_t index)
|
|||
return blend;
|
||||
}
|
||||
|
||||
uint16 GSDevice::GetBlendFlags(size_t index) { return m_blendMap[index].flags; }
|
||||
u16 GSDevice::GetBlendFlags(size_t index) { return m_blendMap[index].flags; }
|
||||
|
||||
// clang-format off
|
||||
|
||||
|
|
|
@ -120,7 +120,7 @@ enum HWBlendFlags
|
|||
// Determines the HW blend function for DX11/OGL
|
||||
struct HWBlend
|
||||
{
|
||||
uint16 flags, op, src, dst;
|
||||
u16 flags, op, src, dst;
|
||||
};
|
||||
|
||||
class GSDevice : public GSAlignedClass<32>
|
||||
|
@ -130,7 +130,7 @@ private:
|
|||
static std::array<HWBlend, 3*3*3*3 + 1> m_blendMap;
|
||||
|
||||
protected:
|
||||
enum : uint16
|
||||
enum : u16
|
||||
{
|
||||
// HW blend factors
|
||||
SRC_COLOR, INV_SRC_COLOR, DST_COLOR, INV_DST_COLOR,
|
||||
|
@ -172,7 +172,7 @@ protected:
|
|||
virtual void DoFXAA(GSTexture* sTex, GSTexture* dTex) {}
|
||||
virtual void DoShadeBoost(GSTexture* sTex, GSTexture* dTex) {}
|
||||
virtual void DoExternalFX(GSTexture* sTex, GSTexture* dTex) {}
|
||||
virtual uint16 ConvertBlendEnum(uint16 generic) = 0; // Convert blend factors/ops from the generic enum to DX11/OGl specific.
|
||||
virtual u16 ConvertBlendEnum(u16 generic) = 0; // Convert blend factors/ops from the generic enum to DX11/OGl specific.
|
||||
|
||||
public:
|
||||
GSOsdManager m_osd;
|
||||
|
@ -208,9 +208,9 @@ public:
|
|||
virtual bool HasColorSparse() { return false; }
|
||||
|
||||
virtual void ClearRenderTarget(GSTexture* t, const GSVector4& c) {}
|
||||
virtual void ClearRenderTarget(GSTexture* t, uint32 c) {}
|
||||
virtual void ClearRenderTarget(GSTexture* t, u32 c) {}
|
||||
virtual void ClearDepth(GSTexture* t) {}
|
||||
virtual void ClearStencil(GSTexture* t, uint8 c) {}
|
||||
virtual void ClearStencil(GSTexture* t, u8 c) {}
|
||||
|
||||
GSTexture* CreateSparseRenderTarget(int w, int h, int format = 0);
|
||||
GSTexture* CreateSparseDepthStencil(int w, int h, int format = 0);
|
||||
|
@ -257,15 +257,15 @@ public:
|
|||
// Convert the GS blend equations to HW specific blend factors/ops
|
||||
// Index is computed as ((((A * 3 + B) * 3) + C) * 3) + D. A, B, C, D taken from ALPHA register.
|
||||
HWBlend GetBlend(size_t index);
|
||||
uint16 GetBlendFlags(size_t index);
|
||||
u16 GetBlendFlags(size_t index);
|
||||
};
|
||||
|
||||
struct GSAdapter
|
||||
{
|
||||
uint32 vendor;
|
||||
uint32 device;
|
||||
uint32 subsys;
|
||||
uint32 rev;
|
||||
u32 vendor;
|
||||
u32 device;
|
||||
u32 subsys;
|
||||
u32 rev;
|
||||
|
||||
operator std::string() const;
|
||||
bool operator==(const GSAdapter&) const;
|
||||
|
|
|
@ -22,7 +22,7 @@ GSDirtyRect::GSDirtyRect()
|
|||
left = top = right = bottom = 0;
|
||||
}
|
||||
|
||||
GSDirtyRect::GSDirtyRect(const GSVector4i& r, uint32 psm)
|
||||
GSDirtyRect::GSDirtyRect(const GSVector4i& r, u32 psm)
|
||||
: psm(psm)
|
||||
{
|
||||
left = r.left;
|
||||
|
|
|
@ -24,11 +24,11 @@ class GSDirtyRect
|
|||
int right;
|
||||
int bottom;
|
||||
|
||||
uint32 psm;
|
||||
u32 psm;
|
||||
|
||||
public:
|
||||
GSDirtyRect();
|
||||
GSDirtyRect(const GSVector4i& r, uint32 psm);
|
||||
GSDirtyRect(const GSVector4i& r, u32 psm);
|
||||
const GSVector4i GetDirtyRect(const GIFRegTEX0& TEX0) const;
|
||||
};
|
||||
|
||||
|
|
|
@ -21,8 +21,8 @@ template <class T>
|
|||
struct Element
|
||||
{
|
||||
T data;
|
||||
uint16 next_index;
|
||||
uint16 prev_index;
|
||||
u16 next_index;
|
||||
u16 prev_index;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
|
@ -47,11 +47,11 @@ private:
|
|||
// the relevant iterator (or the index alone) are erased from the list.
|
||||
// m_buffer[0] is always present as auxiliary Element<T> of the list
|
||||
Element<T>* m_buffer;
|
||||
uint16 m_capacity;
|
||||
uint16 m_free_indexes_stack_top;
|
||||
u16 m_capacity;
|
||||
u16 m_free_indexes_stack_top;
|
||||
// m_free_indexes_stack has dynamic size (m_capacity - 1)
|
||||
// m_buffer indexes that are free to be used are stacked here
|
||||
uint16* m_free_indexes_stack;
|
||||
u16* m_free_indexes_stack;
|
||||
|
||||
public:
|
||||
__forceinline FastList()
|
||||
|
@ -74,8 +74,8 @@ public:
|
|||
// Initialize m_buffer and m_free_indexes_stack as a contiguous block of memory starting at m_buffer
|
||||
// This should increase cache locality and reduce memory fragmentation
|
||||
_aligned_free(m_buffer);
|
||||
m_buffer = (Element<T>*)_aligned_malloc(m_capacity * sizeof(Element<T>) + (m_capacity - 1) * sizeof(uint16), 64);
|
||||
m_free_indexes_stack = (uint16*)&m_buffer[m_capacity];
|
||||
m_buffer = (Element<T>*)_aligned_malloc(m_capacity * sizeof(Element<T>) + (m_capacity - 1) * sizeof(u16), 64);
|
||||
m_free_indexes_stack = (u16*)&m_buffer[m_capacity];
|
||||
|
||||
// Initialize m_buffer[0], data field is unused but initialized using default T constructor
|
||||
m_buffer[0] = {T(), 0, 0};
|
||||
|
@ -84,14 +84,14 @@ public:
|
|||
m_free_indexes_stack_top = 0;
|
||||
|
||||
// m_buffer index 0 is reserved for auxiliary element
|
||||
for (uint16 i = 0; i < m_capacity - 1; i++)
|
||||
for (u16 i = 0; i < m_capacity - 1; i++)
|
||||
{
|
||||
m_free_indexes_stack[i] = i + 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Insert the element in front of the list and return its position in m_buffer
|
||||
__forceinline uint16 InsertFront(const T& data)
|
||||
__forceinline u16 InsertFront(const T& data)
|
||||
{
|
||||
if (Full())
|
||||
{
|
||||
|
@ -99,7 +99,7 @@ public:
|
|||
}
|
||||
|
||||
// Pop a free index from the stack
|
||||
const uint16 free_index = m_free_indexes_stack[m_free_indexes_stack_top++];
|
||||
const u16 free_index = m_free_indexes_stack[m_free_indexes_stack_top++];
|
||||
m_buffer[free_index].data = data;
|
||||
ListInsertFront(free_index);
|
||||
return free_index;
|
||||
|
@ -120,7 +120,7 @@ public:
|
|||
EraseIndex(LastIndex());
|
||||
}
|
||||
|
||||
__forceinline uint16 size() const
|
||||
__forceinline u16 size() const
|
||||
{
|
||||
return m_free_indexes_stack_top;
|
||||
}
|
||||
|
@ -130,13 +130,13 @@ public:
|
|||
return size() == 0;
|
||||
}
|
||||
|
||||
__forceinline void EraseIndex(const uint16 index)
|
||||
__forceinline void EraseIndex(const u16 index)
|
||||
{
|
||||
ListRemove(index);
|
||||
m_free_indexes_stack[--m_free_indexes_stack_top] = index;
|
||||
}
|
||||
|
||||
__forceinline void MoveFront(const uint16 index)
|
||||
__forceinline void MoveFront(const u16 index)
|
||||
{
|
||||
if (FirstIndex() != index)
|
||||
{
|
||||
|
@ -163,29 +163,29 @@ public:
|
|||
|
||||
private:
|
||||
// Accessed by FastListIterator<T> using class friendship
|
||||
__forceinline const T& Data(const uint16 index) const
|
||||
__forceinline const T& Data(const u16 index) const
|
||||
{
|
||||
return m_buffer[index].data;
|
||||
}
|
||||
|
||||
// Accessed by FastListIterator<T> using class friendship
|
||||
__forceinline uint16 NextIndex(const uint16 index) const
|
||||
__forceinline u16 NextIndex(const u16 index) const
|
||||
{
|
||||
return m_buffer[index].next_index;
|
||||
}
|
||||
|
||||
// Accessed by FastListIterator<T> using class friendship
|
||||
__forceinline uint16 PrevIndex(const uint16 index) const
|
||||
__forceinline u16 PrevIndex(const u16 index) const
|
||||
{
|
||||
return m_buffer[index].prev_index;
|
||||
}
|
||||
|
||||
__forceinline uint16 FirstIndex() const
|
||||
__forceinline u16 FirstIndex() const
|
||||
{
|
||||
return m_buffer[0].next_index;
|
||||
}
|
||||
|
||||
__forceinline uint16 LastIndex() const
|
||||
__forceinline u16 LastIndex() const
|
||||
{
|
||||
return m_buffer[0].prev_index;
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ private:
|
|||
return size() == m_capacity - 1;
|
||||
}
|
||||
|
||||
__forceinline void ListInsertFront(const uint16 index)
|
||||
__forceinline void ListInsertFront(const u16 index)
|
||||
{
|
||||
// Update prev / next indexes to add m_buffer[index] to the chain
|
||||
Element<T>& head = m_buffer[0];
|
||||
|
@ -206,7 +206,7 @@ private:
|
|||
head.next_index = index;
|
||||
}
|
||||
|
||||
__forceinline void ListRemove(const uint16 index)
|
||||
__forceinline void ListRemove(const u16 index)
|
||||
{
|
||||
// Update prev / next indexes to remove m_buffer[index] from the chain
|
||||
const Element<T>& to_remove = m_buffer[index];
|
||||
|
@ -221,13 +221,13 @@ private:
|
|||
throw std::runtime_error("FastList size maxed out at USHRT_MAX (65535) elements, cannot grow futhermore.");
|
||||
}
|
||||
|
||||
const uint16 new_capacity = m_capacity <= (USHRT_MAX / 2) ? (m_capacity * 2) : USHRT_MAX;
|
||||
const u16 new_capacity = m_capacity <= (USHRT_MAX / 2) ? (m_capacity * 2) : USHRT_MAX;
|
||||
|
||||
Element<T>* new_buffer = (Element<T>*)_aligned_malloc(new_capacity * sizeof(Element<T>) + (new_capacity - 1) * sizeof(uint16), 64);
|
||||
uint16* new_free_indexes_stack = (uint16*)&new_buffer[new_capacity];
|
||||
Element<T>* new_buffer = (Element<T>*)_aligned_malloc(new_capacity * sizeof(Element<T>) + (new_capacity - 1) * sizeof(u16), 64);
|
||||
u16* new_free_indexes_stack = (u16*)&new_buffer[new_capacity];
|
||||
|
||||
memcpy(new_buffer, m_buffer, m_capacity * sizeof(Element<T>));
|
||||
memcpy(new_free_indexes_stack, m_free_indexes_stack, (m_capacity - 1) * sizeof(uint16));
|
||||
memcpy(new_free_indexes_stack, m_free_indexes_stack, (m_capacity - 1) * sizeof(u16));
|
||||
|
||||
_aligned_free(m_buffer);
|
||||
|
||||
|
@ -235,7 +235,7 @@ private:
|
|||
m_free_indexes_stack = new_free_indexes_stack;
|
||||
|
||||
// Initialize the additional space in the stack
|
||||
for (uint16 i = m_capacity - 1; i < new_capacity - 1; i++)
|
||||
for (u16 i = m_capacity - 1; i < new_capacity - 1; i++)
|
||||
{
|
||||
m_free_indexes_stack[i] = i + 1;
|
||||
}
|
||||
|
@ -251,10 +251,10 @@ class FastListIterator
|
|||
{
|
||||
private:
|
||||
const FastList<T>* m_fastlist;
|
||||
uint16 m_index;
|
||||
u16 m_index;
|
||||
|
||||
public:
|
||||
__forceinline FastListIterator(const FastList<T>* fastlist, const uint16 index)
|
||||
__forceinline FastListIterator(const FastList<T>* fastlist, const u16 index)
|
||||
{
|
||||
m_fastlist = fastlist;
|
||||
m_index = index;
|
||||
|
@ -305,7 +305,7 @@ public:
|
|||
return m_fastlist->Data(m_index);
|
||||
}
|
||||
|
||||
__forceinline uint16 Index() const
|
||||
__forceinline u16 Index() const
|
||||
{
|
||||
return m_index;
|
||||
}
|
||||
|
|
|
@ -29,8 +29,8 @@ class GSFunctionMap
|
|||
protected:
|
||||
struct ActivePtr
|
||||
{
|
||||
uint64 frame, frames, prims;
|
||||
uint64 ticks, actual, total;
|
||||
u64 frame, frames, prims;
|
||||
u64 ticks, actual, total;
|
||||
VALUE f;
|
||||
};
|
||||
|
||||
|
@ -68,7 +68,7 @@ public:
|
|||
|
||||
memset(p, 0, sizeof(*p));
|
||||
|
||||
p->frame = (uint64)-1;
|
||||
p->frame = (u64)-1;
|
||||
|
||||
p->f = GetDefaultFunction(key);
|
||||
|
||||
|
@ -80,7 +80,7 @@ public:
|
|||
return m_active->f;
|
||||
}
|
||||
|
||||
void UpdateStats(uint64 frame, uint64 ticks, int actual, int total, int prims)
|
||||
void UpdateStats(u64 frame, u64 ticks, int actual, int total, int prims)
|
||||
{
|
||||
if (m_active)
|
||||
{
|
||||
|
@ -101,7 +101,7 @@ public:
|
|||
|
||||
virtual void PrintStats()
|
||||
{
|
||||
uint64 totalTicks = 0;
|
||||
u64 totalTicks = 0;
|
||||
|
||||
for (const auto& i : m_map_active)
|
||||
{
|
||||
|
@ -128,10 +128,10 @@ public:
|
|||
|
||||
if (p->frames && p->actual)
|
||||
{
|
||||
uint64 tpf = p->ticks / p->frames;
|
||||
u64 tpf = p->ticks / p->frames;
|
||||
|
||||
printf("%016llx | %6llu | %5llu | %5.2f%% %5.1f %6.1f | %8llu %6llu %5.2f%%\n",
|
||||
(uint64)key,
|
||||
(u64)key,
|
||||
p->frames,
|
||||
p->prims / p->frames,
|
||||
(double)(p->ticks * 100) / totalTicks,
|
||||
|
@ -162,7 +162,7 @@ class GSCodeGeneratorFunctionMap : public GSFunctionMap<KEY, VALUE>
|
|||
{
|
||||
std::string m_name;
|
||||
void* m_param;
|
||||
std::unordered_map<uint64, VALUE> m_cgmap;
|
||||
std::unordered_map<u64, VALUE> m_cgmap;
|
||||
GSCodeBuffer m_cb;
|
||||
size_t m_total_code_size;
|
||||
|
||||
|
@ -201,7 +201,7 @@ public:
|
|||
ASSERT(cg->getSize() < MAX_SIZE);
|
||||
|
||||
#if 0
|
||||
fprintf(stderr, "%s Location:%p Size:%zu Key:%llx\n", m_name.c_str(), code_ptr, cg->getSize(), (uint64)key);
|
||||
fprintf(stderr, "%s Location:%p Size:%zu Key:%llx\n", m_name.c_str(), code_ptr, cg->getSize(), (u64)key);
|
||||
GSScanlineSelector sel(key);
|
||||
sel.Print();
|
||||
#endif
|
||||
|
@ -220,7 +220,7 @@ public:
|
|||
|
||||
// if(iJIT_IsProfilingActive()) // always > 0
|
||||
{
|
||||
std::string name = format("%s<%016llx>()", m_name.c_str(), (uint64)key);
|
||||
std::string name = format("%s<%016llx>()", m_name.c_str(), (u64)key);
|
||||
|
||||
iJIT_Method_Load ml;
|
||||
|
||||
|
@ -233,7 +233,7 @@ public:
|
|||
|
||||
iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, &ml);
|
||||
/*
|
||||
name = format("c:/temp1/%s_%016llx.bin", m_name.c_str(), (uint64)key);
|
||||
name = format("c:/temp1/%s_%016llx.bin", m_name.c_str(), (u64)key);
|
||||
|
||||
if(FILE* fp = fopen(name.c_str(), "wb"))
|
||||
{
|
||||
|
|
|
@ -276,7 +276,7 @@ void GSOsdManager::Monitor(const char* key, const char* value)
|
|||
}
|
||||
}
|
||||
|
||||
void GSOsdManager::RenderGlyph(GSVertexPT1* dst, const glyph_info g, float x, float y, uint32 color)
|
||||
void GSOsdManager::RenderGlyph(GSVertexPT1* dst, const glyph_info g, float x, float y, u32 color)
|
||||
{
|
||||
float x2 = x + g.bl * (2.0f / m_real_size.x);
|
||||
float y2 = -y - g.bt * (2.0f / m_real_size.y);
|
||||
|
@ -309,7 +309,7 @@ void GSOsdManager::RenderGlyph(GSVertexPT1* dst, const glyph_info g, float x, fl
|
|||
++dst;
|
||||
}
|
||||
|
||||
void GSOsdManager::RenderString(GSVertexPT1* dst, const std::u32string msg, float x, float y, uint32 color)
|
||||
void GSOsdManager::RenderString(GSVertexPT1* dst, const std::u32string msg, float x, float y, u32 color)
|
||||
{
|
||||
char32_t p = 0;
|
||||
for (const auto& c : msg)
|
||||
|
@ -435,8 +435,8 @@ size_t GSOsdManager::GeneratePrimitives(GSVertexPT1* dst, size_t count)
|
|||
ratio = ratio > 1.0f ? 1.0f : ratio < 0.0f ? 0.0f : ratio;
|
||||
|
||||
y += offset += ((m_size + 2) * (2.0f / m_real_size.y)) * ratio;
|
||||
uint32 color = m_color;
|
||||
((uint8*)&color)[3] = (uint8)(((uint8*)&color)[3] * (1.0f - ratio) * opacity);
|
||||
u32 color = m_color;
|
||||
((u8*)&color)[3] = (u8)(((u8*)&color)[3] * (1.0f - ratio) * opacity);
|
||||
RenderString(dst, it->msg, x, y, color);
|
||||
dst += it->msg.size() * 6;
|
||||
drawn += it->msg.size() * 6;
|
||||
|
@ -473,8 +473,8 @@ size_t GSOsdManager::GeneratePrimitives(GSVertexPT1* dst, size_t count)
|
|||
float x = 1.0f - 8 * (2.0f / m_real_size.x) - first_max - m_char_info[' '].ax * (2.0f / m_real_size.x) - second_max;
|
||||
float y = -1.0f + ((m_size + 2) * (2.0f / m_real_size.y)) * line++;
|
||||
|
||||
uint32 color = m_color;
|
||||
((uint8*)&color)[3] = (uint8)(((uint8*)&color)[3] * opacity);
|
||||
u32 color = m_color;
|
||||
((u8*)&color)[3] = (u8)(((u8*)&color)[3] * opacity);
|
||||
|
||||
// Render the key
|
||||
RenderString(dst, pair.first, x, y, color);
|
||||
|
|
|
@ -26,14 +26,14 @@ class GSOsdManager
|
|||
{
|
||||
struct glyph_info
|
||||
{
|
||||
int32 ax; // advance.x
|
||||
int32 ay; // advance.y
|
||||
s32 ax; // advance.x
|
||||
s32 ay; // advance.y
|
||||
|
||||
uint32 bw; // bitmap.width;
|
||||
uint32 bh; // bitmap.rows;
|
||||
u32 bw; // bitmap.width;
|
||||
u32 bh; // bitmap.rows;
|
||||
|
||||
int32 bl; // bitmap_left;
|
||||
int32 bt; // bitmap_top;
|
||||
s32 bl; // bitmap_left;
|
||||
s32 bt; // bitmap_top;
|
||||
|
||||
float tx; // x offset of glyph
|
||||
float ty; // y offset of glyph
|
||||
|
@ -47,10 +47,10 @@ class GSOsdManager
|
|||
FT_Face m_face;
|
||||
FT_UInt m_size;
|
||||
|
||||
uint32 m_atlas_h;
|
||||
uint32 m_atlas_w;
|
||||
int32 m_max_width;
|
||||
int32 m_onscreen_messages;
|
||||
u32 m_atlas_h;
|
||||
u32 m_atlas_w;
|
||||
s32 m_max_width;
|
||||
s32 m_onscreen_messages;
|
||||
|
||||
struct log_info
|
||||
{
|
||||
|
@ -62,15 +62,15 @@ class GSOsdManager
|
|||
std::map<std::u32string, std::u32string> m_monitor;
|
||||
|
||||
void AddGlyph(char32_t codepoint);
|
||||
void RenderGlyph(GSVertexPT1* dst, const glyph_info g, float x, float y, uint32 color);
|
||||
void RenderString(GSVertexPT1* dst, const std::u32string msg, float x, float y, uint32 color);
|
||||
void RenderGlyph(GSVertexPT1* dst, const glyph_info g, float x, float y, u32 color);
|
||||
void RenderString(GSVertexPT1* dst, const std::u32string msg, float x, float y, u32 color);
|
||||
float StringSize(const std::u32string msg);
|
||||
|
||||
bool m_log_enabled;
|
||||
int m_log_timeout;
|
||||
bool m_monitor_enabled;
|
||||
int m_opacity;
|
||||
uint32 m_color;
|
||||
u32 m_color;
|
||||
int m_max_onscreen_messages;
|
||||
|
||||
public:
|
||||
|
|
|
@ -31,7 +31,7 @@ protected:
|
|||
public:
|
||||
struct GSMap
|
||||
{
|
||||
uint8* bits;
|
||||
u8* bits;
|
||||
int pitch;
|
||||
};
|
||||
|
||||
|
@ -61,7 +61,7 @@ public:
|
|||
virtual void Unmap() = 0;
|
||||
virtual void GenerateMipmap() {}
|
||||
virtual bool Save(const std::string& fn) = 0;
|
||||
virtual uint32 GetID() { return 0; }
|
||||
virtual u32 GetID() { return 0; }
|
||||
|
||||
GSVector2 GetScale() const { return m_scale; }
|
||||
void SetScale(const GSVector2& scale) { m_scale = scale; }
|
||||
|
@ -90,5 +90,5 @@ public:
|
|||
float OffsetHack_mody;
|
||||
|
||||
// Typical size of a RGBA texture
|
||||
virtual uint32 GetMemUsage() { return m_size.x * m_size.y * 4; }
|
||||
virtual u32 GetMemUsage() { return m_size.x * m_size.y * 4; }
|
||||
};
|
||||
|
|
|
@ -31,8 +31,8 @@ struct alignas(32) GSVertex
|
|||
GIFRegST ST; // S:0, T:4
|
||||
GIFRegRGBAQ RGBAQ; // RGBA:8, Q:12
|
||||
GIFRegXYZ XYZ; // XY:16, Z:20
|
||||
union { uint32 UV; struct { uint16 U, V; }; }; // UV:24
|
||||
uint32 FOG; // FOG:28
|
||||
union { u32 UV; struct { u16 U, V; }; }; // UV:24
|
||||
u32 FOG; // FOG:28
|
||||
};
|
||||
|
||||
#if _M_SSE >= 0x500
|
||||
|
@ -73,7 +73,7 @@ struct alignas(32) GSVertexPT1
|
|||
GSVector4 p;
|
||||
GSVector2 t;
|
||||
char pad[4];
|
||||
union { uint32 c; struct { uint8 r, g, b, a; }; };
|
||||
union { u32 c; struct { u8 r, g, b, a; }; };
|
||||
};
|
||||
|
||||
struct GSVertexPT2
|
||||
|
|
|
@ -47,14 +47,14 @@ GSVertexTrace::GSVertexTrace(const GSState* state)
|
|||
InitUpdate(GS_SPRITE_CLASS);
|
||||
}
|
||||
|
||||
void GSVertexTrace::Update(const void* vertex, const uint32* index, int v_count, int i_count, GS_PRIM_CLASS primclass)
|
||||
void GSVertexTrace::Update(const void* vertex, const u32* index, int v_count, int i_count, GS_PRIM_CLASS primclass)
|
||||
{
|
||||
m_primclass = primclass;
|
||||
|
||||
uint32 iip = m_state->PRIM->IIP;
|
||||
uint32 tme = m_state->PRIM->TME;
|
||||
uint32 fst = m_state->PRIM->FST;
|
||||
uint32 color = !(m_state->PRIM->TME && m_state->m_context->TEX0.TFX == TFX_DECAL && m_state->m_context->TEX0.TCC);
|
||||
u32 iip = m_state->PRIM->IIP;
|
||||
u32 tme = m_state->PRIM->TME;
|
||||
u32 fst = m_state->PRIM->FST;
|
||||
u32 color = !(m_state->PRIM->TME && m_state->m_context->TEX0.TFX == TFX_DECAL && m_state->m_context->TEX0.TCC);
|
||||
|
||||
(this->*m_fmm[color][fst][tme][iip][primclass])(vertex, index, i_count);
|
||||
|
||||
|
@ -148,8 +148,8 @@ void GSVertexTrace::Update(const void* vertex, const uint32* index, int v_count,
|
|||
}
|
||||
}
|
||||
|
||||
template <GS_PRIM_CLASS primclass, uint32 iip, uint32 tme, uint32 fst, uint32 color>
|
||||
void GSVertexTrace::FindMinMax(const void* vertex, const uint32* index, int count)
|
||||
template <GS_PRIM_CLASS primclass, u32 iip, u32 tme, u32 fst, u32 color>
|
||||
void GSVertexTrace::FindMinMax(const void* vertex, const u32* index, int count)
|
||||
{
|
||||
const GSDrawingContext* context = m_state->m_context;
|
||||
|
||||
|
@ -184,8 +184,8 @@ void GSVertexTrace::FindMinMax(const void* vertex, const uint32* index, int coun
|
|||
{
|
||||
if (color)
|
||||
{
|
||||
GSVector4i c0 = GSVector4i::load(v0.RGBAQ.u32[0]);
|
||||
GSVector4i c1 = GSVector4i::load(v1.RGBAQ.u32[0]);
|
||||
GSVector4i c0 = GSVector4i::load(v0.RGBAQ.U32[0]);
|
||||
GSVector4i c1 = GSVector4i::load(v1.RGBAQ.U32[0]);
|
||||
if (iip || finalVertex)
|
||||
{
|
||||
cmin = cmin.min_u8(c0.min_u8(c1));
|
||||
|
@ -304,8 +304,8 @@ void GSVertexTrace::FindMinMax(const void* vertex, const uint32* index, int coun
|
|||
m_max.p = (GSVector4(pmax) - o) * s;
|
||||
|
||||
// Fix signed int conversion
|
||||
m_min.p = m_min.p.insert32<0, 2>(GSVector4::load((float)(uint32)pmin.extract32<2>()));
|
||||
m_max.p = m_max.p.insert32<0, 2>(GSVector4::load((float)(uint32)pmax.extract32<2>()));
|
||||
m_min.p = m_min.p.insert32<0, 2>(GSVector4::load((float)(u32)pmin.extract32<2>()));
|
||||
m_max.p = m_max.p.insert32<0, 2>(GSVector4::load((float)(u32)pmax.extract32<2>()));
|
||||
|
||||
if (tme)
|
||||
{
|
||||
|
@ -354,7 +354,7 @@ void GSVertexTrace::CorrectDepthTrace(const void* vertex, int count)
|
|||
|
||||
|
||||
const GSVertex* RESTRICT v = (GSVertex*)vertex;
|
||||
uint32 z = v[0].XYZ.Z;
|
||||
u32 z = v[0].XYZ.Z;
|
||||
|
||||
// ought to check only 1/2 for sprite
|
||||
if (z & 1)
|
||||
|
|
|
@ -45,12 +45,12 @@ protected:
|
|||
|
||||
static const GSVector4 s_minmax;
|
||||
|
||||
typedef void (GSVertexTrace::*FindMinMaxPtr)(const void* vertex, const uint32* index, int count);
|
||||
typedef void (GSVertexTrace::*FindMinMaxPtr)(const void* vertex, const u32* index, int count);
|
||||
|
||||
FindMinMaxPtr m_fmm[2][2][2][2][4];
|
||||
|
||||
template <GS_PRIM_CLASS primclass, uint32 iip, uint32 tme, uint32 fst, uint32 color>
|
||||
void FindMinMax(const void* vertex, const uint32* index, int count);
|
||||
template <GS_PRIM_CLASS primclass, u32 iip, u32 tme, u32 fst, u32 color>
|
||||
void FindMinMax(const void* vertex, const u32* index, int count);
|
||||
|
||||
public:
|
||||
GS_PRIM_CLASS m_primclass;
|
||||
|
@ -61,14 +61,14 @@ public:
|
|||
|
||||
union
|
||||
{
|
||||
uint32 value;
|
||||
struct { uint32 r:4, g:4, b:4, a:4, x:1, y:1, z:1, f:1, s:1, t:1, q:1, _pad:1; };
|
||||
struct { uint32 rgba:16, xyzf:4, stq:4; };
|
||||
u32 value;
|
||||
struct { u32 r:4, g:4, b:4, a:4, x:1, y:1, z:1, f:1, s:1, t:1, q:1, _pad:1; };
|
||||
struct { u32 rgba:16, xyzf:4, stq:4; };
|
||||
} m_eq;
|
||||
|
||||
union
|
||||
{
|
||||
struct { uint32 mmag:1, mmin:1, linear:1, opt_linear:1; };
|
||||
struct { u32 mmag:1, mmin:1, linear:1, opt_linear:1; };
|
||||
} m_filter;
|
||||
|
||||
GSVector2 m_lod; // x = min, y = max
|
||||
|
@ -77,7 +77,7 @@ public:
|
|||
GSVertexTrace(const GSState* state);
|
||||
virtual ~GSVertexTrace() {}
|
||||
|
||||
void Update(const void* vertex, const uint32* index, int v_count, int i_count, GS_PRIM_CLASS primclass);
|
||||
void Update(const void* vertex, const u32* index, int v_count, int i_count, GS_PRIM_CLASS primclass);
|
||||
|
||||
bool IsLinear() const { return m_filter.opt_linear; }
|
||||
bool IsRealLinear() const { return m_filter.linear; }
|
||||
|
|
|
@ -113,7 +113,7 @@ bool GSDevice11::Create(const WindowInfo& wi)
|
|||
|
||||
// device creation
|
||||
{
|
||||
uint32 flags = D3D11_CREATE_DEVICE_SINGLETHREADED;
|
||||
u32 flags = D3D11_CREATE_DEVICE_SINGLETHREADED;
|
||||
|
||||
if(enable_debugging)
|
||||
flags |= D3D11_CREATE_DEVICE_DEBUG;
|
||||
|
@ -536,7 +536,7 @@ void GSDevice11::ClearRenderTarget(GSTexture* t, const GSVector4& c)
|
|||
m_ctx->ClearRenderTargetView(*(GSTexture11*)t, c.v);
|
||||
}
|
||||
|
||||
void GSDevice11::ClearRenderTarget(GSTexture* t, uint32 c)
|
||||
void GSDevice11::ClearRenderTarget(GSTexture* t, u32 c)
|
||||
{
|
||||
if (!t)
|
||||
return;
|
||||
|
@ -552,7 +552,7 @@ void GSDevice11::ClearDepth(GSTexture* t)
|
|||
m_ctx->ClearDepthStencilView(*(GSTexture11*)t, D3D11_CLEAR_DEPTH, 0.0f, 0);
|
||||
}
|
||||
|
||||
void GSDevice11::ClearStencil(GSTexture* t, uint8 c)
|
||||
void GSDevice11::ClearStencil(GSTexture* t, u8 c)
|
||||
{
|
||||
if (!t)
|
||||
return;
|
||||
|
@ -714,7 +714,7 @@ void GSDevice11::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture*
|
|||
{
|
||||
D3D11_BLEND_DESC bd = {};
|
||||
|
||||
uint8 write_mask = 0;
|
||||
u8 write_mask = 0;
|
||||
|
||||
if (red) write_mask |= D3D11_COLOR_WRITE_ENABLE_RED;
|
||||
if (green) write_mask |= D3D11_COLOR_WRITE_ENABLE_GREEN;
|
||||
|
@ -1087,7 +1087,7 @@ bool GSDevice11::IAMapVertexBuffer(void** vertex, size_t stride, size_t count)
|
|||
return false;
|
||||
}
|
||||
|
||||
*vertex = (uint8*)m.pData + m_vertex.start * stride;
|
||||
*vertex = (u8*)m.pData + m_vertex.start * stride;
|
||||
|
||||
m_vertex.count = count;
|
||||
m_vertex.stride = stride;
|
||||
|
@ -1109,8 +1109,8 @@ void GSDevice11::IASetVertexBuffer(ID3D11Buffer* vb, size_t stride)
|
|||
m_state.vb = vb;
|
||||
m_state.vb_stride = stride;
|
||||
|
||||
const uint32 stride2 = stride;
|
||||
const uint32 offset = 0;
|
||||
const u32 stride2 = stride;
|
||||
const u32 offset = 0;
|
||||
|
||||
m_ctx->IASetVertexBuffers(0, 1, &vb, &stride2, &offset);
|
||||
}
|
||||
|
@ -1135,7 +1135,7 @@ void GSDevice11::IASetIndexBuffer(const void* index, size_t count)
|
|||
memset(&bd, 0, sizeof(bd));
|
||||
|
||||
bd.Usage = D3D11_USAGE_DYNAMIC;
|
||||
bd.ByteWidth = m_index.limit * sizeof(uint32);
|
||||
bd.ByteWidth = m_index.limit * sizeof(u32);
|
||||
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
|
||||
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||
|
||||
|
@ -1158,7 +1158,7 @@ void GSDevice11::IASetIndexBuffer(const void* index, size_t count)
|
|||
|
||||
if (SUCCEEDED(m_ctx->Map(m_ib.get(), 0, type, 0, &m)))
|
||||
{
|
||||
memcpy((uint8*)m.pData + m_index.start * sizeof(uint32), index, count * sizeof(uint32));
|
||||
memcpy((u8*)m.pData + m_index.start * sizeof(u32), index, count * sizeof(u32));
|
||||
|
||||
m_ctx->Unmap(m_ib.get(), 0);
|
||||
}
|
||||
|
@ -1297,7 +1297,7 @@ void GSDevice11::PSUpdateShaderState()
|
|||
m_ctx->PSSetSamplers(0, std::size(m_state.ps_ss), m_state.ps_ss);
|
||||
}
|
||||
|
||||
void GSDevice11::OMSetDepthStencilState(ID3D11DepthStencilState* dss, uint8 sref)
|
||||
void GSDevice11::OMSetDepthStencilState(ID3D11DepthStencilState* dss, u8 sref)
|
||||
{
|
||||
if (m_state.dss != dss || m_state.sref != sref)
|
||||
{
|
||||
|
@ -1464,7 +1464,7 @@ void GSDevice11::CompileShader(const std::vector<char>& source, const char* fn,
|
|||
throw GSRecoverableError();
|
||||
}
|
||||
|
||||
uint16 GSDevice11::ConvertBlendEnum(uint16 generic)
|
||||
u16 GSDevice11::ConvertBlendEnum(u16 generic)
|
||||
{
|
||||
switch (generic)
|
||||
{
|
||||
|
|
|
@ -73,22 +73,22 @@ public:
|
|||
{
|
||||
struct
|
||||
{
|
||||
uint32 tme : 1;
|
||||
uint32 fst : 1;
|
||||
u32 tme : 1;
|
||||
u32 fst : 1;
|
||||
|
||||
uint32 _free : 30;
|
||||
u32 _free : 30;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
u32 key;
|
||||
};
|
||||
|
||||
operator uint32() const { return key; }
|
||||
operator u32() const { return key; }
|
||||
|
||||
VSSelector()
|
||||
: key(0)
|
||||
{
|
||||
}
|
||||
VSSelector(uint32 k)
|
||||
VSSelector(u32 k)
|
||||
: key(k)
|
||||
{
|
||||
}
|
||||
|
@ -179,25 +179,25 @@ public:
|
|||
{
|
||||
struct
|
||||
{
|
||||
uint32 iip : 1;
|
||||
uint32 prim : 2;
|
||||
uint32 point : 1;
|
||||
uint32 line : 1;
|
||||
uint32 cpu_sprite : 1;
|
||||
u32 iip : 1;
|
||||
u32 prim : 2;
|
||||
u32 point : 1;
|
||||
u32 line : 1;
|
||||
u32 cpu_sprite : 1;
|
||||
|
||||
uint32 _free : 26;
|
||||
u32 _free : 26;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
u32 key;
|
||||
};
|
||||
|
||||
operator uint32() { return key; }
|
||||
operator u32() { return key; }
|
||||
|
||||
GSSelector()
|
||||
: key(0)
|
||||
{
|
||||
}
|
||||
GSSelector(uint32 k)
|
||||
GSSelector(u32 k)
|
||||
: key(k)
|
||||
{
|
||||
}
|
||||
|
@ -211,61 +211,61 @@ public:
|
|||
{
|
||||
// *** Word 1
|
||||
// Format
|
||||
uint32 fmt : 4;
|
||||
uint32 dfmt : 2;
|
||||
uint32 depth_fmt : 2;
|
||||
u32 fmt : 4;
|
||||
u32 dfmt : 2;
|
||||
u32 depth_fmt : 2;
|
||||
// Alpha extension/Correction
|
||||
uint32 aem : 1;
|
||||
uint32 fba : 1;
|
||||
u32 aem : 1;
|
||||
u32 fba : 1;
|
||||
// Fog
|
||||
uint32 fog : 1;
|
||||
u32 fog : 1;
|
||||
// Pixel test
|
||||
uint32 atst : 3;
|
||||
u32 atst : 3;
|
||||
// Color sampling
|
||||
uint32 fst : 1;
|
||||
uint32 tfx : 3;
|
||||
uint32 tcc : 1;
|
||||
uint32 wms : 2;
|
||||
uint32 wmt : 2;
|
||||
uint32 ltf : 1;
|
||||
u32 fst : 1;
|
||||
u32 tfx : 3;
|
||||
u32 tcc : 1;
|
||||
u32 wms : 2;
|
||||
u32 wmt : 2;
|
||||
u32 ltf : 1;
|
||||
// Shuffle and fbmask effect
|
||||
uint32 shuffle : 1;
|
||||
uint32 read_ba : 1;
|
||||
uint32 fbmask : 1;
|
||||
u32 shuffle : 1;
|
||||
u32 read_ba : 1;
|
||||
u32 fbmask : 1;
|
||||
|
||||
// Blend and Colclip
|
||||
uint32 hdr : 1;
|
||||
uint32 blend_a : 2;
|
||||
uint32 blend_b : 2; // bit30/31
|
||||
uint32 blend_c : 2; // bit0
|
||||
uint32 blend_d : 2;
|
||||
uint32 clr1 : 1;
|
||||
uint32 colclip : 1;
|
||||
uint32 pabe : 1;
|
||||
u32 hdr : 1;
|
||||
u32 blend_a : 2;
|
||||
u32 blend_b : 2; // bit30/31
|
||||
u32 blend_c : 2; // bit0
|
||||
u32 blend_d : 2;
|
||||
u32 clr1 : 1;
|
||||
u32 colclip : 1;
|
||||
u32 pabe : 1;
|
||||
|
||||
// Others ways to fetch the texture
|
||||
uint32 channel : 3;
|
||||
u32 channel : 3;
|
||||
|
||||
// Dithering
|
||||
uint32 dither : 2;
|
||||
u32 dither : 2;
|
||||
|
||||
// Depth clamp
|
||||
uint32 zclamp : 1;
|
||||
u32 zclamp : 1;
|
||||
|
||||
// Hack
|
||||
uint32 tcoffsethack : 1;
|
||||
uint32 urban_chaos_hle : 1;
|
||||
uint32 tales_of_abyss_hle : 1;
|
||||
uint32 point_sampler : 1;
|
||||
uint32 invalid_tex0 : 1; // Lupin the 3rd
|
||||
u32 tcoffsethack : 1;
|
||||
u32 urban_chaos_hle : 1;
|
||||
u32 tales_of_abyss_hle : 1;
|
||||
u32 point_sampler : 1;
|
||||
u32 invalid_tex0 : 1; // Lupin the 3rd
|
||||
|
||||
uint32 _free : 14;
|
||||
u32 _free : 14;
|
||||
};
|
||||
|
||||
uint64 key;
|
||||
u64 key;
|
||||
};
|
||||
|
||||
operator uint64() { return key; }
|
||||
operator u64() { return key; }
|
||||
|
||||
PSSelector()
|
||||
: key(0)
|
||||
|
@ -279,15 +279,15 @@ public:
|
|||
{
|
||||
struct
|
||||
{
|
||||
uint32 tau : 1;
|
||||
uint32 tav : 1;
|
||||
uint32 ltf : 1;
|
||||
u32 tau : 1;
|
||||
u32 tav : 1;
|
||||
u32 ltf : 1;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
u32 key;
|
||||
};
|
||||
|
||||
operator uint32() { return key & 0x7; }
|
||||
operator u32() { return key & 0x7; }
|
||||
|
||||
PSSamplerSelector()
|
||||
: key(0)
|
||||
|
@ -301,17 +301,17 @@ public:
|
|||
{
|
||||
struct
|
||||
{
|
||||
uint32 ztst : 2;
|
||||
uint32 zwe : 1;
|
||||
uint32 date : 1;
|
||||
uint32 fba : 1;
|
||||
uint32 date_one : 1;
|
||||
u32 ztst : 2;
|
||||
u32 zwe : 1;
|
||||
u32 date : 1;
|
||||
u32 fba : 1;
|
||||
u32 date_one : 1;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
u32 key;
|
||||
};
|
||||
|
||||
operator uint32() { return key & 0x3f; }
|
||||
operator u32() { return key & 0x3f; }
|
||||
|
||||
OMDepthStencilSelector()
|
||||
: key(0)
|
||||
|
@ -326,26 +326,26 @@ public:
|
|||
struct
|
||||
{
|
||||
// Color mask
|
||||
uint32 wr : 1;
|
||||
uint32 wg : 1;
|
||||
uint32 wb : 1;
|
||||
uint32 wa : 1;
|
||||
u32 wr : 1;
|
||||
u32 wg : 1;
|
||||
u32 wb : 1;
|
||||
u32 wa : 1;
|
||||
// Alpha blending
|
||||
uint32 blend_index : 7;
|
||||
uint32 abe : 1;
|
||||
uint32 accu_blend : 1;
|
||||
u32 blend_index : 7;
|
||||
u32 abe : 1;
|
||||
u32 accu_blend : 1;
|
||||
};
|
||||
|
||||
struct
|
||||
{
|
||||
// Color mask
|
||||
uint32 wrgba : 4;
|
||||
u32 wrgba : 4;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
u32 key;
|
||||
};
|
||||
|
||||
operator uint32() { return key & 0x1fff; }
|
||||
operator u32() { return key & 0x1fff; }
|
||||
|
||||
OMBlendSelector()
|
||||
: key(0)
|
||||
|
@ -405,7 +405,7 @@ private:
|
|||
void BeforeDraw();
|
||||
void AfterDraw();
|
||||
|
||||
uint16 ConvertBlendEnum(uint16 generic) final;
|
||||
u16 ConvertBlendEnum(u16 generic) final;
|
||||
|
||||
wil::com_ptr_nothrow<ID3D11Device> m_dev;
|
||||
wil::com_ptr_nothrow<ID3D11DeviceContext> m_ctx;
|
||||
|
@ -432,7 +432,7 @@ private:
|
|||
GSVector2i viewport;
|
||||
GSVector4i scissor;
|
||||
ID3D11DepthStencilState* dss;
|
||||
uint8 sref;
|
||||
u8 sref;
|
||||
ID3D11BlendState* bs;
|
||||
float bf;
|
||||
ID3D11RenderTargetView* rt_view;
|
||||
|
@ -494,16 +494,16 @@ private:
|
|||
|
||||
// Shaders...
|
||||
|
||||
std::unordered_map<uint32, GSVertexShader11> m_vs;
|
||||
std::unordered_map<u32, GSVertexShader11> m_vs;
|
||||
wil::com_ptr_nothrow<ID3D11Buffer> m_vs_cb;
|
||||
std::unordered_map<uint32, wil::com_ptr_nothrow<ID3D11GeometryShader>> m_gs;
|
||||
std::unordered_map<u32, wil::com_ptr_nothrow<ID3D11GeometryShader>> m_gs;
|
||||
wil::com_ptr_nothrow<ID3D11Buffer> m_gs_cb;
|
||||
std::unordered_map<uint64, wil::com_ptr_nothrow<ID3D11PixelShader>> m_ps;
|
||||
std::unordered_map<u64, wil::com_ptr_nothrow<ID3D11PixelShader>> m_ps;
|
||||
wil::com_ptr_nothrow<ID3D11Buffer> m_ps_cb;
|
||||
std::unordered_map<uint32, wil::com_ptr_nothrow<ID3D11SamplerState>> m_ps_ss;
|
||||
std::unordered_map<u32, wil::com_ptr_nothrow<ID3D11SamplerState>> m_ps_ss;
|
||||
wil::com_ptr_nothrow<ID3D11SamplerState> m_palette_ss;
|
||||
std::unordered_map<uint32, wil::com_ptr_nothrow<ID3D11DepthStencilState>> m_om_dss;
|
||||
std::unordered_map<uint32, wil::com_ptr_nothrow<ID3D11BlendState>> m_om_bs;
|
||||
std::unordered_map<u32, wil::com_ptr_nothrow<ID3D11DepthStencilState>> m_om_dss;
|
||||
std::unordered_map<u32, wil::com_ptr_nothrow<ID3D11BlendState>> m_om_bs;
|
||||
|
||||
VSConstantBuffer m_vs_cb_cache;
|
||||
GSConstantBuffer m_gs_cb_cache;
|
||||
|
@ -535,9 +535,9 @@ public:
|
|||
void DrawIndexedPrimitive(int offset, int count) final;
|
||||
|
||||
void ClearRenderTarget(GSTexture* t, const GSVector4& c) final;
|
||||
void ClearRenderTarget(GSTexture* t, uint32 c) final;
|
||||
void ClearRenderTarget(GSTexture* t, u32 c) final;
|
||||
void ClearDepth(GSTexture* t) final;
|
||||
void ClearStencil(GSTexture* t, uint8 c) final;
|
||||
void ClearStencil(GSTexture* t, u8 c) final;
|
||||
|
||||
GSTexture* CopyOffscreen(GSTexture* src, const GSVector4& sRect, int w, int h, int format = 0, int ps_shader = 0) final;
|
||||
|
||||
|
@ -571,7 +571,7 @@ public:
|
|||
void PSUpdateShaderState();
|
||||
void PSSetSamplerState(ID3D11SamplerState* ss0, ID3D11SamplerState* ss1);
|
||||
|
||||
void OMSetDepthStencilState(ID3D11DepthStencilState* dss, uint8 sref);
|
||||
void OMSetDepthStencilState(ID3D11DepthStencilState* dss, u8 sref);
|
||||
void OMSetBlendState(ID3D11BlendState* bs, float bf);
|
||||
void OMSetRenderTargets(GSTexture* rt, GSTexture* ds, const GSVector4i* scissor = NULL) final;
|
||||
|
||||
|
@ -579,7 +579,7 @@ public:
|
|||
void SetupVS(VSSelector sel, const VSConstantBuffer* cb);
|
||||
void SetupGS(GSSelector sel, const GSConstantBuffer* cb);
|
||||
void SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel);
|
||||
void SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix);
|
||||
void SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, u8 afix);
|
||||
|
||||
ID3D11Device* operator->() { return m_dev.get(); }
|
||||
operator ID3D11Device*() { return m_dev.get(); }
|
||||
|
|
|
@ -117,8 +117,8 @@ void GSRendererDX11::EmulateZbuffer()
|
|||
|
||||
// On the real GS we appear to do clamping on the max z value the format allows.
|
||||
// Clamping is done after rasterization.
|
||||
const uint32 max_z = 0xFFFFFFFF >> (GSLocalMemory::m_psm[m_context->ZBUF.PSM].fmt * 8);
|
||||
const bool clamp_z = (uint32)(GSVector4i(m_vt.m_max.p).z) > max_z;
|
||||
const u32 max_z = 0xFFFFFFFF >> (GSLocalMemory::m_psm[m_context->ZBUF.PSM].fmt * 8);
|
||||
const bool clamp_z = (u32)(GSVector4i(m_vt.m_max.p).z) > max_z;
|
||||
|
||||
vs_cb.MaxDepth = GSVector2i(0xFFFFFFFF);
|
||||
//ps_cb.Af_MaxDepth.y = 1.0f;
|
||||
|
@ -197,11 +197,11 @@ void GSRendererDX11::EmulateTextureShuffleAndFbmask()
|
|||
|
||||
// Please bang my head against the wall!
|
||||
// 1/ Reduce the frame mask to a 16 bit format
|
||||
const uint32& m = m_context->FRAME.FBMSK;
|
||||
const uint32 fbmask = ((m >> 3) & 0x1F) | ((m >> 6) & 0x3E0) | ((m >> 9) & 0x7C00) | ((m >> 16) & 0x8000);
|
||||
const u32& m = m_context->FRAME.FBMSK;
|
||||
const u32 fbmask = ((m >> 3) & 0x1F) | ((m >> 6) & 0x3E0) | ((m >> 9) & 0x7C00) | ((m >> 16) & 0x8000);
|
||||
// FIXME GSVector will be nice here
|
||||
const uint8 rg_mask = fbmask & 0xFF;
|
||||
const uint8 ba_mask = (fbmask >> 8) & 0xFF;
|
||||
const u8 rg_mask = fbmask & 0xFF;
|
||||
const u8 ba_mask = (fbmask >> 8) & 0xFF;
|
||||
m_om_bsel.wrgba = 0;
|
||||
|
||||
// 2 Select the new mask (Please someone put SSE here)
|
||||
|
@ -421,10 +421,10 @@ void GSRendererDX11::EmulateChannelShuffle(GSTexture** rt, const GSTextureCache:
|
|||
// the rendered size of the framebuffer
|
||||
|
||||
GSVertex* s = &m_vertex.buff[0];
|
||||
s[0].XYZ.X = (uint16)(m_context->XYOFFSET.OFX + 0);
|
||||
s[1].XYZ.X = (uint16)(m_context->XYOFFSET.OFX + 16384);
|
||||
s[0].XYZ.Y = (uint16)(m_context->XYOFFSET.OFY + 0);
|
||||
s[1].XYZ.Y = (uint16)(m_context->XYOFFSET.OFY + 16384);
|
||||
s[0].XYZ.X = (u16)(m_context->XYOFFSET.OFX + 0);
|
||||
s[1].XYZ.X = (u16)(m_context->XYOFFSET.OFX + 16384);
|
||||
s[0].XYZ.Y = (u16)(m_context->XYOFFSET.OFY + 0);
|
||||
s[1].XYZ.Y = (u16)(m_context->XYOFFSET.OFY + 16384);
|
||||
|
||||
m_vertex.head = m_vertex.tail = m_vertex.next = 2;
|
||||
m_index.tail = 2;
|
||||
|
@ -448,7 +448,7 @@ void GSRendererDX11::EmulateBlending()
|
|||
return;
|
||||
|
||||
m_om_bsel.abe = 1;
|
||||
m_om_bsel.blend_index = uint8(((ALPHA.A * 3 + ALPHA.B) * 3 + ALPHA.C) * 3 + ALPHA.D);
|
||||
m_om_bsel.blend_index = u8(((ALPHA.A * 3 + ALPHA.B) * 3 + ALPHA.C) * 3 + ALPHA.D);
|
||||
const int blend_flag = m_dev->GetBlendFlags(m_om_bsel.blend_index);
|
||||
|
||||
// Do the multiplication in shader for blending accumulation: Cs*As + Cd or Cs*Af + Cd
|
||||
|
@ -567,8 +567,8 @@ void GSRendererDX11::EmulateTextureSampler(const GSTextureCache::Source* tex)
|
|||
const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[tex->m_TEX0.PSM];
|
||||
const GSLocalMemory::psm_t& cpsm = psm.pal > 0 ? GSLocalMemory::m_psm[m_context->TEX0.CPSM] : psm;
|
||||
|
||||
const uint8 wms = m_context->CLAMP.WMS;
|
||||
const uint8 wmt = m_context->CLAMP.WMT;
|
||||
const u8 wms = m_context->CLAMP.WMS;
|
||||
const u8 wmt = m_context->CLAMP.WMT;
|
||||
const bool complex_wms_wmt = !!((wms | wmt) & 2);
|
||||
|
||||
bool bilinear = m_vt.IsLinear();
|
||||
|
@ -937,7 +937,7 @@ void GSRendererDX11::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sou
|
|||
{
|
||||
m_ps_sel.fog = 1;
|
||||
|
||||
const GSVector4 fc = GSVector4::rgba32(m_env.FOGCOL.u32[0]);
|
||||
const GSVector4 fc = GSVector4::rgba32(m_env.FOGCOL.U32[0]);
|
||||
// Blend AREF to avoid to load a random value for alpha (dirty cache)
|
||||
ps_cb.FogColor_AREF = fc.blend32<8>(ps_cb.FogColor_AREF);
|
||||
}
|
||||
|
@ -948,7 +948,7 @@ void GSRendererDX11::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sou
|
|||
// pass to handle the depth based on the alpha test.
|
||||
bool ate_RGBA_then_Z = false;
|
||||
bool ate_RGB_then_ZA = false;
|
||||
uint8 ps_atst = 0;
|
||||
u8 ps_atst = 0;
|
||||
if (ate_first_pass & ate_second_pass)
|
||||
{
|
||||
// fprintf(stdout, "%d: Complex Alpha Test\n", s_n);
|
||||
|
@ -1025,7 +1025,7 @@ void GSRendererDX11::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sou
|
|||
|
||||
if (!tex->m_palette)
|
||||
{
|
||||
const uint16 pal = GSLocalMemory::m_psm[tex->m_TEX0.PSM].pal;
|
||||
const u16 pal = GSLocalMemory::m_psm[tex->m_TEX0.PSM].pal;
|
||||
m_tc->AttachPaletteToSource(tex, pal, true);
|
||||
}
|
||||
}
|
||||
|
@ -1045,7 +1045,7 @@ void GSRendererDX11::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sou
|
|||
|
||||
SetupIA(sx, sy);
|
||||
|
||||
const uint8 afix = m_context->ALPHA.FIX;
|
||||
const u8 afix = m_context->ALPHA.FIX;
|
||||
dev->SetupOM(m_om_dssel, m_om_bsel, afix);
|
||||
dev->SetupVS(m_vs_sel, &vs_cb);
|
||||
dev->SetupGS(m_gs_sel, &gs_cb);
|
||||
|
|
|
@ -80,7 +80,7 @@ bool GSTexture11::Map(GSMap& m, const GSVector4i* r, int layer)
|
|||
|
||||
if (SUCCEEDED(m_ctx->Map(m_texture.get(), subresource, D3D11_MAP_READ_WRITE, 0, &map)))
|
||||
{
|
||||
m.bits = (uint8*)map.pData;
|
||||
m.bits = (u8*)map.pData;
|
||||
m.pitch = (int)map.RowPitch;
|
||||
|
||||
m_layer = layer;
|
||||
|
@ -152,14 +152,14 @@ bool GSTexture11::Save(const std::string& fn)
|
|||
m_ctx->Unmap(dst.get(), 0);
|
||||
});
|
||||
|
||||
const uint8* s = static_cast<const uint8*>(sm.pData);
|
||||
uint8* d = static_cast<uint8*>(dm.pData);
|
||||
const u8* s = static_cast<const u8*>(sm.pData);
|
||||
u8* d = static_cast<u8*>(dm.pData);
|
||||
|
||||
for (uint32 y = 0; y < desc.Height; y++, s += sm.RowPitch, d += dm.RowPitch)
|
||||
for (u32 y = 0; y < desc.Height; y++, s += sm.RowPitch, d += dm.RowPitch)
|
||||
{
|
||||
for (uint32 x = 0; x < desc.Width; x++)
|
||||
for (u32 x = 0; x < desc.Width; x++)
|
||||
{
|
||||
reinterpret_cast<uint32*>(d)[x] = static_cast<uint32>(ldexpf(reinterpret_cast<const float*>(s)[x * 2], 32));
|
||||
reinterpret_cast<u32*>(d)[x] = static_cast<u32>(ldexpf(reinterpret_cast<const float*>(s)[x * 2], 32));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -193,7 +193,7 @@ bool GSTexture11::Save(const std::string& fn)
|
|||
}
|
||||
|
||||
int compression = theApp.GetConfigI("png_compression_level");
|
||||
bool success = GSPng::Save(format, fn, static_cast<uint8*>(sm.pData), desc.Width, desc.Height, sm.RowPitch, compression);
|
||||
bool success = GSPng::Save(format, fn, static_cast<u8*>(sm.pData), desc.Width, desc.Height, sm.RowPitch, compression);
|
||||
|
||||
m_ctx->Unmap(res.get(), 0);
|
||||
|
||||
|
|
|
@ -279,7 +279,7 @@ void GSDevice11::SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSe
|
|||
PSSetShader(i->second.get(), m_ps_cb.get());
|
||||
}
|
||||
|
||||
void GSDevice11::SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, uint8 afix)
|
||||
void GSDevice11::SetupOM(OMDepthStencilSelector dssel, OMBlendSelector bsel, u8 afix)
|
||||
{
|
||||
auto i = std::as_const(m_om_dss).find(dssel);
|
||||
|
||||
|
|
|
@ -188,7 +188,7 @@ GSRendererHW::~GSRendererHW()
|
|||
delete m_tc;
|
||||
}
|
||||
|
||||
void GSRendererHW::SetGameCRC(uint32 crc, int options)
|
||||
void GSRendererHW::SetGameCRC(u32 crc, int options)
|
||||
{
|
||||
GSRenderer::SetGameCRC(crc, options);
|
||||
|
||||
|
@ -389,7 +389,7 @@ void GSRendererHW::Lines2Sprites()
|
|||
int i = (int)count * 2 - 4;
|
||||
GSVertex* s = &m_vertex.buff[count - 2];
|
||||
GSVertex* q = &m_vertex.buff[count * 2 - 4];
|
||||
uint32* RESTRICT index = &m_index.buff[count * 3 - 6];
|
||||
u32* RESTRICT index = &m_index.buff[count * 3 - 6];
|
||||
|
||||
for (; i >= 0; i -= 4, s -= 2, q -= 4, index -= 6)
|
||||
{
|
||||
|
@ -402,13 +402,13 @@ void GSRendererHW::Lines2Sprites()
|
|||
|
||||
if (PRIM->TME && !PRIM->FST)
|
||||
{
|
||||
GSVector4 st0 = GSVector4::loadl(&v0.ST.u64);
|
||||
GSVector4 st1 = GSVector4::loadl(&v1.ST.u64);
|
||||
GSVector4 st0 = GSVector4::loadl(&v0.ST.U64);
|
||||
GSVector4 st1 = GSVector4::loadl(&v1.ST.U64);
|
||||
GSVector4 Q = GSVector4(v1.RGBAQ.Q, v1.RGBAQ.Q, v1.RGBAQ.Q, v1.RGBAQ.Q);
|
||||
GSVector4 st = st0.upld(st1) / Q;
|
||||
|
||||
GSVector4::storel(&v0.ST.u64, st);
|
||||
GSVector4::storeh(&v1.ST.u64, st);
|
||||
GSVector4::storel(&v0.ST.U64, st);
|
||||
GSVector4::storeh(&v1.ST.U64, st);
|
||||
|
||||
v0.RGBAQ.Q = 1.0f;
|
||||
v1.RGBAQ.Q = 1.0f;
|
||||
|
@ -419,7 +419,7 @@ void GSRendererHW::Lines2Sprites()
|
|||
|
||||
// swap x, s, u
|
||||
|
||||
const uint16 x = v0.XYZ.X;
|
||||
const u16 x = v0.XYZ.X;
|
||||
v0.XYZ.X = v1.XYZ.X;
|
||||
v1.XYZ.X = x;
|
||||
|
||||
|
@ -427,7 +427,7 @@ void GSRendererHW::Lines2Sprites()
|
|||
v0.ST.S = v1.ST.S;
|
||||
v1.ST.S = s;
|
||||
|
||||
const uint16 u = v0.U;
|
||||
const u16 u = v0.U;
|
||||
v0.U = v1.U;
|
||||
v1.U = u;
|
||||
|
||||
|
@ -447,9 +447,9 @@ void GSRendererHW::Lines2Sprites()
|
|||
}
|
||||
}
|
||||
|
||||
void GSRendererHW::EmulateAtst(GSVector4& FogColor_AREF, uint8& ps_atst, const bool pass_2)
|
||||
void GSRendererHW::EmulateAtst(GSVector4& FogColor_AREF, u8& ps_atst, const bool pass_2)
|
||||
{
|
||||
static const uint32 inverted_atst[] = {ATST_ALWAYS, ATST_NEVER, ATST_GEQUAL, ATST_GREATER, ATST_NOTEQUAL, ATST_LESS, ATST_LEQUAL, ATST_EQUAL};
|
||||
static const u32 inverted_atst[] = {ATST_ALWAYS, ATST_NEVER, ATST_GEQUAL, ATST_GREATER, ATST_NOTEQUAL, ATST_LESS, ATST_LEQUAL, ATST_EQUAL};
|
||||
|
||||
if (!m_context->TEST.ATE)
|
||||
return;
|
||||
|
@ -570,10 +570,10 @@ void GSRendererHW::ConvertSpriteTextureShuffle(bool& write_ba, bool& read_ba)
|
|||
GSVector4i tmp(v[i].XYZ.Y, v[i].V, v[i + 1].XYZ.Y, v[i + 1].V);
|
||||
tmp = GSVector4i(tmp - offset).srl32(1) + offset;
|
||||
|
||||
v[i].XYZ.Y = (uint16)tmp.x;
|
||||
v[i].V = (uint16)tmp.y;
|
||||
v[i + 1].XYZ.Y = (uint16)tmp.z;
|
||||
v[i + 1].V = (uint16)tmp.w;
|
||||
v[i].XYZ.Y = (u16)tmp.x;
|
||||
v[i].V = (u16)tmp.y;
|
||||
v[i + 1].XYZ.Y = (u16)tmp.z;
|
||||
v[i + 1].V = (u16)tmp.w;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -603,9 +603,9 @@ void GSRendererHW::ConvertSpriteTextureShuffle(bool& write_ba, bool& read_ba)
|
|||
tmp = GSVector4i(tmp - offset).srl32(1) + offset;
|
||||
|
||||
//fprintf(stderr, "Before %d, After %d\n", v[i + 1].XYZ.Y, tmp.y);
|
||||
v[i].XYZ.Y = (uint16)tmp.x;
|
||||
v[i].XYZ.Y = (u16)tmp.x;
|
||||
v[i].ST.T /= 2.0f;
|
||||
v[i + 1].XYZ.Y = (uint16)tmp.y;
|
||||
v[i + 1].XYZ.Y = (u16)tmp.y;
|
||||
v[i + 1].ST.T /= 2.0f;
|
||||
}
|
||||
}
|
||||
|
@ -757,15 +757,15 @@ void GSRendererHW::MergeSprite(GSTextureCache::Source* tex)
|
|||
// Replace all sprite with a single fullscreen sprite.
|
||||
GSVertex* s = &m_vertex.buff[0];
|
||||
|
||||
s[0].XYZ.X = static_cast<uint16>((16.0f * m_vt.m_min.p.x) + m_context->XYOFFSET.OFX);
|
||||
s[1].XYZ.X = static_cast<uint16>((16.0f * m_vt.m_max.p.x) + m_context->XYOFFSET.OFX);
|
||||
s[0].XYZ.Y = static_cast<uint16>((16.0f * m_vt.m_min.p.y) + m_context->XYOFFSET.OFY);
|
||||
s[1].XYZ.Y = static_cast<uint16>((16.0f * m_vt.m_max.p.y) + m_context->XYOFFSET.OFY);
|
||||
s[0].XYZ.X = static_cast<u16>((16.0f * m_vt.m_min.p.x) + m_context->XYOFFSET.OFX);
|
||||
s[1].XYZ.X = static_cast<u16>((16.0f * m_vt.m_max.p.x) + m_context->XYOFFSET.OFX);
|
||||
s[0].XYZ.Y = static_cast<u16>((16.0f * m_vt.m_min.p.y) + m_context->XYOFFSET.OFY);
|
||||
s[1].XYZ.Y = static_cast<u16>((16.0f * m_vt.m_max.p.y) + m_context->XYOFFSET.OFY);
|
||||
|
||||
s[0].U = static_cast<uint16>(16.0f * m_vt.m_min.t.x);
|
||||
s[0].V = static_cast<uint16>(16.0f * m_vt.m_min.t.y);
|
||||
s[1].U = static_cast<uint16>(16.0f * m_vt.m_max.t.x);
|
||||
s[1].V = static_cast<uint16>(16.0f * m_vt.m_max.t.y);
|
||||
s[0].U = static_cast<u16>(16.0f * m_vt.m_min.t.x);
|
||||
s[0].V = static_cast<u16>(16.0f * m_vt.m_min.t.y);
|
||||
s[1].U = static_cast<u16>(16.0f * m_vt.m_max.t.x);
|
||||
s[1].V = static_cast<u16>(16.0f * m_vt.m_max.t.y);
|
||||
|
||||
m_vertex.head = m_vertex.tail = m_vertex.next = 2;
|
||||
m_index.tail = 2;
|
||||
|
@ -791,10 +791,10 @@ void GSRendererHW::InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GS
|
|||
m_tc->InvalidateLocalMem(m_mem.GetOffset(BITBLTBUF.SBP, BITBLTBUF.SBW, BITBLTBUF.SPSM), r);
|
||||
}
|
||||
|
||||
uint16 GSRendererHW::Interpolate_UV(float alpha, int t0, int t1)
|
||||
u16 GSRendererHW::Interpolate_UV(float alpha, int t0, int t1)
|
||||
{
|
||||
const float t = (1.0f - alpha) * t0 + alpha * t1;
|
||||
return (uint16)t & ~0xF; // cheap rounding
|
||||
return (u16)t & ~0xF; // cheap rounding
|
||||
}
|
||||
|
||||
float GSRendererHW::alpha0(int L, int X0, int X1)
|
||||
|
@ -899,28 +899,28 @@ void GSRendererHW::SwSpriteRender()
|
|||
const bool fb_mask_enabled = m_context->FRAME.FBMSK != 0x0;
|
||||
const GSVector4i fb_mask = GSVector4i(m_context->FRAME.FBMSK).u8to16(); // 0x00AA00BB00GG00RR00AA00BB00GG00RR
|
||||
|
||||
const uint8 tex0_tfx = m_context->TEX0.TFX;
|
||||
const uint8 tex0_tcc = m_context->TEX0.TCC;
|
||||
const uint8 alpha_b = m_context->ALPHA.B;
|
||||
const uint8 alpha_c = m_context->ALPHA.C;
|
||||
const uint8 alpha_fix = m_context->ALPHA.FIX;
|
||||
const u8 tex0_tfx = m_context->TEX0.TFX;
|
||||
const u8 tex0_tcc = m_context->TEX0.TCC;
|
||||
const u8 alpha_b = m_context->ALPHA.B;
|
||||
const u8 alpha_c = m_context->ALPHA.C;
|
||||
const u8 alpha_fix = m_context->ALPHA.FIX;
|
||||
|
||||
for (int y = 0; y < h; y++, ++sy, ++dy)
|
||||
{
|
||||
auto spa = texture_mapping_enabled ? spo.paMulti(m_mem.m_vm32, sx, sy) : GSOffset::PAPtrHelper<uint32>();
|
||||
auto spa = texture_mapping_enabled ? spo.paMulti(m_mem.m_vm32, sx, sy) : GSOffset::PAPtrHelper<u32>();
|
||||
auto dpa = dpo.paMulti(m_mem.m_vm32, dx, dy);
|
||||
|
||||
ASSERT(w % 2 == 0);
|
||||
|
||||
for (int x = 0; x < w; x += 2)
|
||||
{
|
||||
uint32* di = dpa.value(x);
|
||||
u32* di = dpa.value(x);
|
||||
ASSERT(*di + 1 == *dpa.value(x + 1)); // Destination pixel pair is adjacent in memory
|
||||
|
||||
GSVector4i sc;
|
||||
if (texture_mapping_enabled)
|
||||
{
|
||||
uint32* si = spa.value(x);
|
||||
u32* si = spa.value(x);
|
||||
// Read 2 source pixel colors
|
||||
ASSERT((*si + 1) == *spa.value(x + 1)); // Source pixel pair is adjacent in memory
|
||||
sc = GSVector4i::loadl(si).u8to16(); // 0x00AA00BB00GG00RR00aa00bb00gg00rr
|
||||
|
@ -1079,8 +1079,8 @@ void GSRendererHW::RoundSpriteOffset()
|
|||
const int Lx = (v[i + 1].XYZ.X - v[i].XYZ.X);
|
||||
const float ax0 = alpha0(Lx, X0, X1);
|
||||
const float ax1 = alpha1(Lx, X0, X1);
|
||||
const uint16 tx0 = Interpolate_UV(ax0, v[i].U, v[i + 1].U);
|
||||
const uint16 tx1 = Interpolate_UV(ax1, v[i].U, v[i + 1].U);
|
||||
const u16 tx0 = Interpolate_UV(ax0, v[i].U, v[i + 1].U);
|
||||
const u16 tx1 = Interpolate_UV(ax1, v[i].U, v[i + 1].U);
|
||||
#ifdef DEBUG_U
|
||||
if (debug)
|
||||
{
|
||||
|
@ -1096,8 +1096,8 @@ void GSRendererHW::RoundSpriteOffset()
|
|||
const int Ly = (v[i + 1].XYZ.Y - v[i].XYZ.Y);
|
||||
const float ay0 = alpha0(Ly, Y0, Y1);
|
||||
const float ay1 = alpha1(Ly, Y0, Y1);
|
||||
const uint16 ty0 = Interpolate_UV(ay0, v[i].V, v[i + 1].V);
|
||||
const uint16 ty1 = Interpolate_UV(ay1, v[i].V, v[i + 1].V);
|
||||
const u16 ty0 = Interpolate_UV(ay0, v[i].V, v[i + 1].V);
|
||||
const u16 ty1 = Interpolate_UV(ay1, v[i].V, v[i + 1].V);
|
||||
#ifdef DEBUG_V
|
||||
if (debug)
|
||||
{
|
||||
|
@ -1206,8 +1206,8 @@ void GSRendererHW::Draw()
|
|||
const GIFRegFRAME FRAME = context->FRAME;
|
||||
const GIFRegZBUF ZBUF = context->ZBUF;
|
||||
|
||||
uint32 fm = context->FRAME.FBMSK;
|
||||
uint32 zm = context->ZBUF.ZMSK || context->TEST.ZTE == 0 ? 0xffffffff : 0;
|
||||
u32 fm = context->FRAME.FBMSK;
|
||||
u32 zm = context->ZBUF.ZMSK || context->TEST.ZTE == 0 ? 0xffffffff : 0;
|
||||
|
||||
// Note required to compute TryAlphaTest below. So do it now.
|
||||
if (PRIM->TME && tex_psm.pal > 0)
|
||||
|
@ -1469,7 +1469,7 @@ void GSRendererHW::Draw()
|
|||
|
||||
if (s_dump)
|
||||
{
|
||||
const uint64 frame = m_perfmon.GetFrame();
|
||||
const u64 frame = m_perfmon.GetFrame();
|
||||
|
||||
std::string s;
|
||||
|
||||
|
@ -1651,7 +1651,7 @@ void GSRendererHW::Draw()
|
|||
|
||||
if (s_dump)
|
||||
{
|
||||
const uint64 frame = m_perfmon.GetFrame();
|
||||
const u64 frame = m_perfmon.GetFrame();
|
||||
|
||||
std::string s;
|
||||
|
||||
|
@ -1715,7 +1715,7 @@ GSRendererHW::Hacks::Hacks()
|
|||
|
||||
void GSRendererHW::Hacks::SetGameCRC(const CRC::Game& game)
|
||||
{
|
||||
const uint32 hash = (uint32)((game.region << 24) | game.title);
|
||||
const u32 hash = (u32)((game.region << 24) | game.title);
|
||||
|
||||
m_oi = m_oi_map[hash];
|
||||
m_oo = m_oo_map[hash];
|
||||
|
@ -1744,7 +1744,7 @@ void GSRendererHW::OI_DoubleHalfClear(GSTexture* rt, GSTexture* ds)
|
|||
//const GSLocalMemory::psm_t& depth_psm = GSLocalMemory::m_psm[m_context->ZBUF.PSM];
|
||||
|
||||
// Z and color must be constant and the same
|
||||
if (m_vt.m_eq.rgba != 0xFFFF || !m_vt.m_eq.z || v[1].XYZ.Z != v[1].RGBAQ.u32[0])
|
||||
if (m_vt.m_eq.rgba != 0xFFFF || !m_vt.m_eq.z || v[1].XYZ.Z != v[1].RGBAQ.U32[0])
|
||||
return;
|
||||
|
||||
// Format doesn't have the same size. It smells fishy (xmen...)
|
||||
|
@ -1752,12 +1752,12 @@ void GSRendererHW::OI_DoubleHalfClear(GSTexture* rt, GSTexture* ds)
|
|||
// return;
|
||||
|
||||
// Size of the current draw
|
||||
const uint32 w_pages = static_cast<uint32>(roundf(m_vt.m_max.p.x / frame_psm.pgs.x));
|
||||
const uint32 h_pages = static_cast<uint32>(roundf(m_vt.m_max.p.y / frame_psm.pgs.y));
|
||||
const uint32 written_pages = w_pages * h_pages;
|
||||
const u32 w_pages = static_cast<u32>(roundf(m_vt.m_max.p.x / frame_psm.pgs.x));
|
||||
const u32 h_pages = static_cast<u32>(roundf(m_vt.m_max.p.y / frame_psm.pgs.y));
|
||||
const u32 written_pages = w_pages * h_pages;
|
||||
|
||||
// Frame and depth pointer can be inverted
|
||||
uint32 base = 0, half = 0;
|
||||
u32 base = 0, half = 0;
|
||||
if (m_context->FRAME.FBP > m_context->ZBUF.ZBP)
|
||||
{
|
||||
base = m_context->ZBUF.ZBP;
|
||||
|
@ -1772,7 +1772,7 @@ void GSRendererHW::OI_DoubleHalfClear(GSTexture* rt, GSTexture* ds)
|
|||
// If both buffers are side by side we can expect a fast clear in on-going
|
||||
if (half <= (base + written_pages))
|
||||
{
|
||||
const uint32 color = v[1].RGBAQ.u32[0];
|
||||
const u32 color = v[1].RGBAQ.U32[0];
|
||||
const bool clear_depth = (m_context->FRAME.FBP > m_context->ZBUF.ZBP);
|
||||
|
||||
GL_INS("OI_DoubleHalfClear:%s: base %x half %x. w_pages %d h_pages %d fbw %d. Color %x",
|
||||
|
@ -1953,7 +1953,7 @@ bool GSRendererHW::OI_BigMuthaTruckers(GSTexture* rt, GSTexture* ds, GSTextureCa
|
|||
|
||||
const size_t count = m_vertex.next;
|
||||
GSVertex* v = &m_vertex.buff[0];
|
||||
const uint16 offset = (uint16)m_r.y * 16;
|
||||
const u16 offset = (u16)m_r.y * 16;
|
||||
|
||||
for (size_t i = 0; i < count; i++)
|
||||
v[i].V += offset;
|
||||
|
@ -1978,7 +1978,7 @@ bool GSRendererHW::OI_DBZBTGames(GSTexture* rt, GSTexture* ds, GSTextureCache::S
|
|||
|
||||
bool GSRendererHW::OI_FFXII(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t)
|
||||
{
|
||||
static uint32* video = NULL;
|
||||
static u32* video = NULL;
|
||||
static size_t lines = 0;
|
||||
|
||||
if (lines == 0)
|
||||
|
@ -1997,7 +1997,7 @@ bool GSRendererHW::OI_FFXII(GSTexture* rt, GSTexture* ds, GSTextureCache::Source
|
|||
// incoming pixels are stored in columns, one column is 16x512, total res 448x512 or 448x454
|
||||
|
||||
if (!video)
|
||||
video = new uint32[512 * 512];
|
||||
video = new u32[512 * 512];
|
||||
|
||||
const int ox = m_context->XYOFFSET.OFX - 8;
|
||||
const int oy = m_context->XYOFFSET.OFY - 8;
|
||||
|
@ -2012,7 +2012,7 @@ bool GSRendererHW::OI_FFXII(GSTexture* rt, GSTexture* ds, GSTextureCache::Source
|
|||
if (x < 0 || x >= 448 || y < 0 || y >= (int)lines)
|
||||
return false; // le sigh
|
||||
|
||||
video[(y << 8) + (y << 7) + (y << 6) + x] = v->RGBAQ.u32[0];
|
||||
video[(y << 8) + (y << 7) + (y << 6) + x] = v->RGBAQ.U32[0];
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -2062,9 +2062,9 @@ bool GSRendererHW::OI_FFXII(GSTexture* rt, GSTexture* ds, GSTextureCache::Source
|
|||
|
||||
bool GSRendererHW::OI_FFX(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t)
|
||||
{
|
||||
const uint32 FBP = m_context->FRAME.Block();
|
||||
const uint32 ZBP = m_context->ZBUF.Block();
|
||||
const uint32 TBP = m_context->TEX0.TBP0;
|
||||
const u32 FBP = m_context->FRAME.Block();
|
||||
const u32 ZBP = m_context->ZBUF.Block();
|
||||
const u32 TBP = m_context->TEX0.TBP0;
|
||||
|
||||
if ((FBP == 0x00d00 || FBP == 0x00000) && ZBP == 0x02100 && PRIM->TME && TBP == 0x01a00 && m_context->TEX0.PSM == PSM_PSMCT16S)
|
||||
{
|
||||
|
@ -2086,15 +2086,15 @@ bool GSRendererHW::OI_MetalSlug6(GSTexture* rt, GSTexture* ds, GSTextureCache::S
|
|||
|
||||
for (int i = (int)m_vertex.next; i > 0; i--, v++)
|
||||
{
|
||||
const uint32 c = v->RGBAQ.u32[0];
|
||||
const u32 c = v->RGBAQ.U32[0];
|
||||
|
||||
const uint32 r = (c >> 0) & 0xff;
|
||||
const uint32 g = (c >> 8) & 0xff;
|
||||
const uint32 b = (c >> 16) & 0xff;
|
||||
const u32 r = (c >> 0) & 0xff;
|
||||
const u32 g = (c >> 8) & 0xff;
|
||||
const u32 b = (c >> 16) & 0xff;
|
||||
|
||||
if (r == 0 && g != 0 && b != 0)
|
||||
{
|
||||
v->RGBAQ.u32[0] = (c & 0xffffff00) | ((g + b + 1) >> 1);
|
||||
v->RGBAQ.U32[0] = (c & 0xffffff00) | ((g + b + 1) >> 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2107,8 +2107,8 @@ bool GSRendererHW::OI_RozenMaidenGebetGarden(GSTexture* rt, GSTexture* ds, GSTex
|
|||
{
|
||||
if (!PRIM->TME)
|
||||
{
|
||||
const uint32 FBP = m_context->FRAME.Block();
|
||||
const uint32 ZBP = m_context->ZBUF.Block();
|
||||
const u32 FBP = m_context->FRAME.Block();
|
||||
const u32 ZBP = m_context->ZBUF.Block();
|
||||
|
||||
if (FBP == 0x008c0 && ZBP == 0x01a40)
|
||||
{
|
||||
|
@ -2193,8 +2193,8 @@ bool GSRendererHW::OI_PointListPalette(GSTexture* rt, GSTexture* ds, GSTextureCa
|
|||
{
|
||||
if (m_vt.m_primclass == GS_POINT_CLASS && !PRIM->TME)
|
||||
{
|
||||
const uint32 FBP = m_context->FRAME.Block();
|
||||
const uint32 FBW = m_context->FRAME.FBW;
|
||||
const u32 FBP = m_context->FRAME.Block();
|
||||
const u32 FBW = m_context->FRAME.FBW;
|
||||
|
||||
if (FBP >= 0x03f40 && (FBP & 0x1f) == 0)
|
||||
{
|
||||
|
@ -2204,12 +2204,12 @@ bool GSRendererHW::OI_PointListPalette(GSTexture* rt, GSTexture* ds, GSTextureCa
|
|||
|
||||
for (int i = 0; i < 16; i++, v++)
|
||||
{
|
||||
uint32 c = v->RGBAQ.u32[0];
|
||||
const uint32 a = c >> 24;
|
||||
u32 c = v->RGBAQ.U32[0];
|
||||
const u32 a = c >> 24;
|
||||
|
||||
c = (a >= 0x80 ? 0xff000000 : (a << 25)) | (c & 0x00ffffff);
|
||||
|
||||
v->RGBAQ.u32[0] = c;
|
||||
v->RGBAQ.U32[0] = c;
|
||||
|
||||
m_mem.WritePixel32(i & 7, i >> 3, c, FBP, FBW);
|
||||
}
|
||||
|
@ -2224,12 +2224,12 @@ bool GSRendererHW::OI_PointListPalette(GSTexture* rt, GSTexture* ds, GSTextureCa
|
|||
|
||||
for (int i = 0; i < 256; i++, v++)
|
||||
{
|
||||
uint32 c = v->RGBAQ.u32[0];
|
||||
const uint32 a = c >> 24;
|
||||
u32 c = v->RGBAQ.U32[0];
|
||||
const u32 a = c >> 24;
|
||||
|
||||
c = (a >= 0x80 ? 0xff000000 : (a << 25)) | (c & 0x00ffffff);
|
||||
|
||||
v->RGBAQ.u32[0] = c;
|
||||
v->RGBAQ.U32[0] = c;
|
||||
|
||||
m_mem.WritePixel32(i & 15, i >> 4, c, FBP, FBW);
|
||||
}
|
||||
|
@ -2329,7 +2329,7 @@ void GSRendererHW::OO_MajokkoALaMode2()
|
|||
{
|
||||
// palette readback
|
||||
|
||||
const uint32 FBP = m_context->FRAME.Block();
|
||||
const u32 FBP = m_context->FRAME.Block();
|
||||
|
||||
if (!PRIM->TME && FBP == 0x03f40)
|
||||
{
|
||||
|
@ -2349,7 +2349,7 @@ bool GSRendererHW::CU_MajokkoALaMode2()
|
|||
{
|
||||
// palette should stay 16 x 16
|
||||
|
||||
const uint32 FBP = m_context->FRAME.Block();
|
||||
const u32 FBP = m_context->FRAME.Block();
|
||||
|
||||
return FBP != 0x03f40;
|
||||
}
|
||||
|
@ -2358,7 +2358,7 @@ bool GSRendererHW::CU_TalesOfAbyss()
|
|||
{
|
||||
// full image blur and brightening
|
||||
|
||||
const uint32 FBP = m_context->FRAME.Block();
|
||||
const u32 FBP = m_context->FRAME.Block();
|
||||
|
||||
return FBP != 0x036e0 && FBP != 0x03560 && FBP != 0x038e0;
|
||||
}
|
||||
|
|
|
@ -84,11 +84,11 @@ private:
|
|||
};
|
||||
|
||||
template <class T>
|
||||
class FunctionMap : public GSFunctionMap<uint32, T>
|
||||
class FunctionMap : public GSFunctionMap<u32, T>
|
||||
{
|
||||
std::list<HackEntry<T>>& m_tbl;
|
||||
|
||||
T GetDefaultFunction(uint32 key)
|
||||
T GetDefaultFunction(u32 key)
|
||||
{
|
||||
CRC::Title title = (CRC::Title)(key & 0xffffff);
|
||||
CRC::Region region = (CRC::Region)(key >> 24);
|
||||
|
@ -132,7 +132,7 @@ private:
|
|||
|
||||
#pragma endregion
|
||||
|
||||
uint16 Interpolate_UV(float alpha, int t0, int t1);
|
||||
u16 Interpolate_UV(float alpha, int t0, int t1);
|
||||
float alpha0(int L, int X0, int X1);
|
||||
float alpha1(int L, int X0, int X1);
|
||||
void SwSpriteRender();
|
||||
|
@ -168,13 +168,13 @@ public:
|
|||
GSRendererHW(GSTextureCache* tc);
|
||||
virtual ~GSRendererHW();
|
||||
|
||||
void SetGameCRC(uint32 crc, int options);
|
||||
void SetGameCRC(u32 crc, int options);
|
||||
bool CanUpscale();
|
||||
int GetUpscaleMultiplier();
|
||||
GSVector2i GetCustomResolution();
|
||||
void SetScaling();
|
||||
void Lines2Sprites();
|
||||
void EmulateAtst(GSVector4& FogColor_AREF, uint8& atst, const bool pass_2);
|
||||
void EmulateAtst(GSVector4& FogColor_AREF, u8& atst, const bool pass_2);
|
||||
void ConvertSpriteTextureShuffle(bool& write_ba, bool& read_ba);
|
||||
GSVector4 RealignTargetTextureCoordinate(const GSTextureCache::Source* tex);
|
||||
GSVector4i ComputeBoundingBox(const GSVector2& rtscale, const GSVector2i& rtsize);
|
||||
|
|
|
@ -54,7 +54,7 @@ GSTextureCache::GSTextureCache(GSRenderer* r)
|
|||
// In theory 4MB is enough but 9MB is safer for overflow (8MB
|
||||
// isn't enough in custom resolution)
|
||||
// Test: onimusha 3 PAL 60Hz
|
||||
m_temp = (uint8*)_aligned_malloc(9 * 1024 * 1024, 32);
|
||||
m_temp = (u8*)_aligned_malloc(9 * 1024 * 1024, 32);
|
||||
|
||||
m_texture_inside_rt_cache.reserve(m_texture_inside_rt_cache_size);
|
||||
}
|
||||
|
@ -119,8 +119,8 @@ GSTextureCache::Source* GSTextureCache::LookupDepthSource(const GIFRegTEX0& TEX0
|
|||
Target* dst = NULL;
|
||||
|
||||
// Check only current frame, I guess it is only used as a postprocessing effect
|
||||
uint32 bp = TEX0.TBP0;
|
||||
uint32 psm = TEX0.PSM;
|
||||
u32 bp = TEX0.TBP0;
|
||||
u32 psm = TEX0.PSM;
|
||||
|
||||
for (auto t : m_dst[DepthStencil])
|
||||
{
|
||||
|
@ -224,7 +224,7 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con
|
|||
if (psm_s.pal > 0)
|
||||
m_renderer->m_mem.m_clut.Read32(TEX0, TEXA);
|
||||
|
||||
const uint32* clut = m_renderer->m_mem.m_clut;
|
||||
const u32* clut = m_renderer->m_mem.m_clut;
|
||||
|
||||
Source* src = NULL;
|
||||
|
||||
|
@ -234,7 +234,7 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con
|
|||
{
|
||||
Source* s = *i;
|
||||
|
||||
if (((TEX0.u32[0] ^ s->m_TEX0.u32[0]) | ((TEX0.u32[1] ^ s->m_TEX0.u32[1]) & 3)) != 0) // TBP0 TBW PSM TW TH
|
||||
if (((TEX0.U32[0] ^ s->m_TEX0.U32[0]) | ((TEX0.U32[1] ^ s->m_TEX0.U32[1]) & 3)) != 0) // TBP0 TBW PSM TW TH
|
||||
continue;
|
||||
|
||||
// Target are converted (AEM & palette) on the fly by the GPU. They don't need extra check
|
||||
|
@ -248,7 +248,7 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con
|
|||
|
||||
// We request a 24/16 bit RGBA texture. Alpha expansion was done by
|
||||
// the CPU. We need to check that TEXA is identical
|
||||
if (psm_s.pal == 0 && psm_s.fmt > 0 && s->m_TEXA.u64 != TEXA.u64)
|
||||
if (psm_s.pal == 0 && psm_s.fmt > 0 && s->m_TEXA.U64 != TEXA.U64)
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -270,13 +270,13 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con
|
|||
if (src == NULL)
|
||||
#endif
|
||||
{
|
||||
uint32 bp = TEX0.TBP0;
|
||||
uint32 psm = TEX0.PSM;
|
||||
u32 bp = TEX0.TBP0;
|
||||
u32 psm = TEX0.PSM;
|
||||
|
||||
uint32 bw = TEX0.TBW;
|
||||
u32 bw = TEX0.TBW;
|
||||
int tw = 1 << TEX0.TW;
|
||||
int th = 1 << TEX0.TH;
|
||||
uint32 bp_end = psm_s.info.bn(tw - 1, th - 1, bp, bw); // Valid only for color formats
|
||||
u32 bp_end = psm_s.info.bn(tw - 1, th - 1, bp, bw); // Valid only for color formats
|
||||
|
||||
// Arc the Lad finds the wrong surface here when looking for a depth stencil.
|
||||
// Since we're currently not caching depth stencils (check ToDo in CreateSource) we should not look for it here.
|
||||
|
@ -297,7 +297,7 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con
|
|||
// because of the previous draw call format
|
||||
//
|
||||
// Solution: consider the RT as 32 bits if the alpha was used in the past
|
||||
uint32 t_psm = (t->m_dirty_alpha) ? t->m_TEX0.PSM & ~0x1 : t->m_TEX0.PSM;
|
||||
u32 t_psm = (t->m_dirty_alpha) ? t->m_TEX0.PSM & ~0x1 : t->m_TEX0.PSM;
|
||||
|
||||
if (GSUtil::HasSharedBits(bp, psm, t->m_TEX0.TBP0, t_psm))
|
||||
{
|
||||
|
@ -376,7 +376,7 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con
|
|||
{
|
||||
if (candidate_x_offset == 0 && candidate_y_offset == 0)
|
||||
continue;
|
||||
uint32 candidate_bp = psm_s.info.bn(candidate_x_offset, candidate_y_offset, t->m_TEX0.TBP0, bw);
|
||||
u32 candidate_bp = psm_s.info.bn(candidate_x_offset, candidate_y_offset, t->m_TEX0.TBP0, bw);
|
||||
if (bp == candidate_bp && bp_end <= t->m_end_block)
|
||||
{
|
||||
// SWEEP HIT: <x,y> offset found
|
||||
|
@ -442,8 +442,8 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con
|
|||
if (psm_s.bpp > 8)
|
||||
{
|
||||
GIFRegTEX0 depth_TEX0;
|
||||
depth_TEX0.u32[0] = TEX0.u32[0] | (0x30u << 20u);
|
||||
depth_TEX0.u32[1] = TEX0.u32[1];
|
||||
depth_TEX0.U32[0] = TEX0.U32[0] | (0x30u << 20u);
|
||||
depth_TEX0.U32[1] = TEX0.U32[1];
|
||||
return LookupDepthSource(depth_TEX0, TEXA, r);
|
||||
}
|
||||
else
|
||||
|
@ -521,10 +521,10 @@ bool GSTextureCache::ShallSearchTextureInsideRt()
|
|||
return m_texture_inside_rt || (m_renderer->m_game.flags & CRC::Flags::TextureInsideRt);
|
||||
}
|
||||
|
||||
GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, int w, int h, int type, bool used, uint32 fbmask)
|
||||
GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, int w, int h, int type, bool used, u32 fbmask)
|
||||
{
|
||||
const GSLocalMemory::psm_t& psm_s = GSLocalMemory::m_psm[TEX0.PSM];
|
||||
uint32 bp = TEX0.TBP0;
|
||||
u32 bp = TEX0.TBP0;
|
||||
|
||||
Target* dst = NULL;
|
||||
|
||||
|
@ -655,7 +655,7 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, int
|
|||
|
||||
GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, int w, int h, int real_h)
|
||||
{
|
||||
uint32 bp = TEX0.TBP0;
|
||||
u32 bp = TEX0.TBP0;
|
||||
|
||||
Target* dst = NULL;
|
||||
|
||||
|
@ -771,7 +771,7 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, int
|
|||
// Goal: Depth And Target at the same address is not possible. On GS it is
|
||||
// the same memory but not on the Dx/GL. Therefore a write to the Depth/Target
|
||||
// must invalidate the Target/Depth respectively
|
||||
void GSTextureCache::InvalidateVideoMemType(int type, uint32 bp)
|
||||
void GSTextureCache::InvalidateVideoMemType(int type, u32 bp)
|
||||
{
|
||||
if (!m_can_convert_depth)
|
||||
return;
|
||||
|
@ -799,9 +799,9 @@ void GSTextureCache::InvalidateVideoMemType(int type, uint32 bp)
|
|||
// Called each time you want to write to the GS memory
|
||||
void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& rect, bool target)
|
||||
{
|
||||
uint32 bp = off.bp();
|
||||
uint32 bw = off.bw();
|
||||
uint32 psm = off.psm();
|
||||
u32 bp = off.bp();
|
||||
u32 bw = off.bw();
|
||||
u32 psm = off.psm();
|
||||
|
||||
if (!target)
|
||||
{
|
||||
|
@ -820,7 +820,7 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r
|
|||
}
|
||||
}
|
||||
|
||||
uint32 bbp = bp + bw * 0x10;
|
||||
u32 bbp = bp + bw * 0x10;
|
||||
if (bw >= 16 && bbp < 16384)
|
||||
{
|
||||
// Detect half of the render target (fix snow engine game)
|
||||
|
@ -844,7 +844,7 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r
|
|||
// we are screwed.
|
||||
if (m_renderer->m_game.title == CRC::HauntingGround)
|
||||
{
|
||||
uint32 end_block = GSLocalMemory::m_psm[psm].info.bn(rect.z - 1, rect.w - 1, bp, bw); // Valid only for color formats
|
||||
u32 end_block = GSLocalMemory::m_psm[psm].info.bn(rect.z - 1, rect.w - 1, bp, bw); // Valid only for color formats
|
||||
auto type = RenderTarget;
|
||||
|
||||
for (auto t : m_dst[type])
|
||||
|
@ -872,7 +872,7 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r
|
|||
|
||||
GSVector4i r = rect.ralign<Align_Outside>((bp & 31) == 0 ? GSLocalMemory::m_psm[psm].pgs : GSLocalMemory::m_psm[psm].bs);
|
||||
|
||||
off.loopPages(rect, [&](uint32 page)
|
||||
off.loopPages(rect, [&](u32 page)
|
||||
{
|
||||
auto& list = m_src.m_map[page];
|
||||
for (auto i = list.begin(); i != list.end();)
|
||||
|
@ -892,7 +892,7 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r
|
|||
}
|
||||
else
|
||||
{
|
||||
uint32* RESTRICT valid = s->m_valid;
|
||||
u32* RESTRICT valid = s->m_valid;
|
||||
|
||||
// Invalidate data of input texture
|
||||
if (s->m_repeating)
|
||||
|
@ -982,8 +982,8 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r
|
|||
{
|
||||
if (bp < t->m_TEX0.TBP0)
|
||||
{
|
||||
uint32 rowsize = bw * 8192;
|
||||
uint32 offset = (uint32)((t->m_TEX0.TBP0 - bp) * 256);
|
||||
u32 rowsize = bw * 8192;
|
||||
u32 offset = (u32)((t->m_TEX0.TBP0 - bp) * 256);
|
||||
|
||||
if (rowsize > 0 && offset % rowsize == 0)
|
||||
{
|
||||
|
@ -1011,8 +1011,8 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r
|
|||
// (128 pixels) target
|
||||
if (bw > 2 && t->m_TEX0.TBW == bw && t->Inside(bp, bw, psm, rect) && GSUtil::HasCompatibleBits(psm, t->m_TEX0.PSM))
|
||||
{
|
||||
uint32 rowsize = bw * 8192u;
|
||||
uint32 offset = (uint32)((bp - t->m_TEX0.TBP0) * 256);
|
||||
u32 rowsize = bw * 8192u;
|
||||
u32 offset = (u32)((bp - t->m_TEX0.TBP0) * 256);
|
||||
|
||||
if (rowsize > 0 && offset % rowsize == 0)
|
||||
{
|
||||
|
@ -1038,9 +1038,9 @@ void GSTextureCache::InvalidateVideoMem(const GSOffset& off, const GSVector4i& r
|
|||
// Called each time you want to read from the GS memory
|
||||
void GSTextureCache::InvalidateLocalMem(const GSOffset& off, const GSVector4i& r)
|
||||
{
|
||||
uint32 bp = off.bp();
|
||||
uint32 psm = off.psm();
|
||||
//uint32 bw = off->bw;
|
||||
u32 bp = off.bp();
|
||||
u32 psm = off.psm();
|
||||
//u32 bw = off->bw;
|
||||
|
||||
// No depth handling please.
|
||||
if (psm == PSM_PSMZ32 || psm == PSM_PSMZ24 || psm == PSM_PSMZ16 || psm == PSM_PSMZ16S)
|
||||
|
@ -1155,8 +1155,8 @@ void GSTextureCache::InvalidateLocalMem(const GSOffset& off, const GSVector4i& r
|
|||
// && ((t->m_TEX0.TBP0 == 0) || (t->m_TEX0.TBP0==3328) || (t->m_TEX0.TBP0==3584)))
|
||||
// {
|
||||
// //printf("first : %d-%d child : %d-%d\n", psm, bp, t->m_TEX0.PSM, t->m_TEX0.TBP0);
|
||||
// uint32 rowsize = bw * 8192;
|
||||
// uint32 offset = (uint32)((bp - t->m_TEX0.TBP0) * 256);
|
||||
// u32 rowsize = bw * 8192;
|
||||
// u32 offset = (u32)((bp - t->m_TEX0.TBP0) * 256);
|
||||
|
||||
// if (rowsize > 0 && offset % rowsize == 0)
|
||||
// {
|
||||
|
@ -1656,10 +1656,10 @@ GSTextureCache::Target* GSTextureCache::CreateTarget(const GIFRegTEX0& TEX0, int
|
|||
void GSTextureCache::PrintMemoryUsage()
|
||||
{
|
||||
#ifdef ENABLE_OGL_DEBUG
|
||||
uint32 tex = 0;
|
||||
uint32 tex_rt = 0;
|
||||
uint32 rt = 0;
|
||||
uint32 dss = 0;
|
||||
u32 tex = 0;
|
||||
u32 tex_rt = 0;
|
||||
u32 rt = 0;
|
||||
u32 dss = 0;
|
||||
for (auto s : m_src.m_surfaces)
|
||||
{
|
||||
if (s && !s->m_shared_texture)
|
||||
|
@ -1687,7 +1687,7 @@ void GSTextureCache::PrintMemoryUsage()
|
|||
|
||||
// GSTextureCache::Surface
|
||||
|
||||
GSTextureCache::Surface::Surface(GSRenderer* r, uint8* temp)
|
||||
GSTextureCache::Surface::Surface(GSRenderer* r, u8* temp)
|
||||
: m_renderer(r)
|
||||
, m_texture(NULL)
|
||||
, m_age(0)
|
||||
|
@ -1712,24 +1712,24 @@ void GSTextureCache::Surface::UpdateAge()
|
|||
m_age = 0;
|
||||
}
|
||||
|
||||
bool GSTextureCache::Surface::Inside(uint32 bp, uint32 bw, uint32 psm, const GSVector4i& rect)
|
||||
bool GSTextureCache::Surface::Inside(u32 bp, u32 bw, u32 psm, const GSVector4i& rect)
|
||||
{
|
||||
// Valid only for color formats.
|
||||
uint32 const end_block = GSLocalMemory::m_psm[psm].info.bn(rect.z - 1, rect.w - 1, bp, bw);
|
||||
u32 const end_block = GSLocalMemory::m_psm[psm].info.bn(rect.z - 1, rect.w - 1, bp, bw);
|
||||
return bp >= m_TEX0.TBP0 && end_block <= m_end_block;
|
||||
}
|
||||
|
||||
bool GSTextureCache::Surface::Overlaps(uint32 bp, uint32 bw, uint32 psm, const GSVector4i& rect)
|
||||
bool GSTextureCache::Surface::Overlaps(u32 bp, u32 bw, u32 psm, const GSVector4i& rect)
|
||||
{
|
||||
// Valid only for color formats.
|
||||
uint32 const end_block = GSLocalMemory::m_psm[psm].info.bn(rect.z - 1, rect.w - 1, bp, bw);
|
||||
u32 const end_block = GSLocalMemory::m_psm[psm].info.bn(rect.z - 1, rect.w - 1, bp, bw);
|
||||
return (m_TEX0.TBP0 <= bp && bp <= m_end_block)
|
||||
|| (m_TEX0.TBP0 <= end_block && end_block <= m_end_block);
|
||||
}
|
||||
|
||||
// GSTextureCache::Source
|
||||
|
||||
GSTextureCache::Source::Source(GSRenderer* r, const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, uint8* temp, bool dummy_container)
|
||||
GSTextureCache::Source::Source(GSRenderer* r, const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, u8* temp, bool dummy_container)
|
||||
: Surface(r, temp)
|
||||
, m_palette_obj(nullptr)
|
||||
, m_palette(nullptr)
|
||||
|
@ -1801,7 +1801,7 @@ void GSTextureCache::Source::Update(const GSVector4i& rect, int layer)
|
|||
const GSOffset& off = m_renderer->m_context->offset.tex;
|
||||
GSOffset::BNHelper bn = off.bnMulti(r.left, r.top);
|
||||
|
||||
uint32 blocks = 0;
|
||||
u32 blocks = 0;
|
||||
|
||||
if (m_repeating)
|
||||
{
|
||||
|
@ -1810,14 +1810,14 @@ void GSTextureCache::Source::Update(const GSVector4i& rect, int layer)
|
|||
for (int x = r.left; x < r.right; bn.nextBlockX(), x += bs.x)
|
||||
{
|
||||
int i = (bn.blkY() << 7) + bn.blkX();
|
||||
uint32 block = bn.valueNoWrap();
|
||||
u32 block = bn.valueNoWrap();
|
||||
|
||||
if (block < MAX_BLOCKS || m_wrap_gs_mem)
|
||||
{
|
||||
uint32 addr = i % MAX_BLOCKS;
|
||||
u32 addr = i % MAX_BLOCKS;
|
||||
|
||||
uint32 row = addr >> 5u;
|
||||
uint32 col = 1 << (addr & 31u);
|
||||
u32 row = addr >> 5u;
|
||||
u32 col = 1 << (addr & 31u);
|
||||
|
||||
if ((m_valid[row] & col) == 0)
|
||||
{
|
||||
|
@ -1837,14 +1837,14 @@ void GSTextureCache::Source::Update(const GSVector4i& rect, int layer)
|
|||
{
|
||||
for (int x = r.left; x < r.right; x += bs.x, bn.nextBlockX())
|
||||
{
|
||||
uint32 block = bn.valueNoWrap();
|
||||
u32 block = bn.valueNoWrap();
|
||||
|
||||
if (block < MAX_BLOCKS || m_wrap_gs_mem)
|
||||
{
|
||||
block %= MAX_BLOCKS;
|
||||
|
||||
uint32 row = block >> 5u;
|
||||
uint32 col = 1 << (block & 31u);
|
||||
u32 row = block >> 5u;
|
||||
u32 col = 1 << (block & 31u);
|
||||
|
||||
if ((m_valid[row] & col) == 0)
|
||||
{
|
||||
|
@ -1921,7 +1921,7 @@ void GSTextureCache::Source::Write(const GSVector4i& r, int layer)
|
|||
}
|
||||
}
|
||||
|
||||
void GSTextureCache::Source::Flush(uint32 count, int layer)
|
||||
void GSTextureCache::Source::Flush(u32 count, int layer)
|
||||
{
|
||||
// This function as written will not work for paletted formats copied from framebuffers
|
||||
// because they are 8 or 4 bit formats on the GS and the GS local memory module reads
|
||||
|
@ -1935,7 +1935,7 @@ void GSTextureCache::Source::Flush(uint32 count, int layer)
|
|||
|
||||
GSVector4i tr(0, 0, tw, th);
|
||||
|
||||
int pitch = std::max(tw, psm.bs.x) * sizeof(uint32);
|
||||
int pitch = std::max(tw, psm.bs.x) * sizeof(u32);
|
||||
|
||||
GSLocalMemory& mem = m_renderer->m_mem;
|
||||
|
||||
|
@ -1949,9 +1949,9 @@ void GSTextureCache::Source::Flush(uint32 count, int layer)
|
|||
rtx = psm.rtxP;
|
||||
}
|
||||
|
||||
uint8* buff = m_temp;
|
||||
u8* buff = m_temp;
|
||||
|
||||
for (uint32 i = 0; i < count; i++)
|
||||
for (u32 i = 0; i < count; i++)
|
||||
{
|
||||
GSVector4i r = m_write.rect[i];
|
||||
|
||||
|
@ -1996,7 +1996,7 @@ bool GSTextureCache::Source::ClutMatch(PaletteKey palette_key)
|
|||
|
||||
// GSTextureCache::Target
|
||||
|
||||
GSTextureCache::Target::Target(GSRenderer* r, const GIFRegTEX0& TEX0, uint8* temp, bool depth_supported)
|
||||
GSTextureCache::Target::Target(GSRenderer* r, const GIFRegTEX0& TEX0, u8* temp, bool depth_supported)
|
||||
: Surface(r, temp)
|
||||
, m_type(-1)
|
||||
, m_used(false)
|
||||
|
@ -2135,7 +2135,7 @@ void GSTextureCache::SourceMap::Add(Source* s, const GIFRegTEX0& TEX0, const GSO
|
|||
}
|
||||
|
||||
// The source pointer will be stored/duplicated in all m_map[array of pages]
|
||||
s->m_pages.loopPages([this, s](uint32 page)
|
||||
s->m_pages.loopPages([this, s](u32 page)
|
||||
{
|
||||
s->m_erase_it[page] = m_map[page].InsertFront(s);
|
||||
});
|
||||
|
@ -2169,7 +2169,7 @@ void GSTextureCache::SourceMap::RemoveAt(Source* s)
|
|||
}
|
||||
else
|
||||
{
|
||||
s->m_pages.loopPages([this, s](uint32 page)
|
||||
s->m_pages.loopPages([this, s](u32 page)
|
||||
{
|
||||
m_map[page].EraseIndex(s->m_erase_it[page]);
|
||||
});
|
||||
|
@ -2178,7 +2178,7 @@ void GSTextureCache::SourceMap::RemoveAt(Source* s)
|
|||
delete s;
|
||||
}
|
||||
|
||||
void GSTextureCache::AttachPaletteToSource(Source* s, uint16 pal, bool need_gs_texture)
|
||||
void GSTextureCache::AttachPaletteToSource(Source* s, u16 pal, bool need_gs_texture)
|
||||
{
|
||||
s->m_palette_obj = m_palette_map.LookupPalette(pal, need_gs_texture);
|
||||
s->m_palette = need_gs_texture ? s->m_palette_obj->GetPaletteGSTexture() : nullptr;
|
||||
|
@ -2186,14 +2186,14 @@ void GSTextureCache::AttachPaletteToSource(Source* s, uint16 pal, bool need_gs_t
|
|||
|
||||
// GSTextureCache::Palette
|
||||
|
||||
GSTextureCache::Palette::Palette(const GSRenderer* renderer, uint16 pal, bool need_gs_texture)
|
||||
GSTextureCache::Palette::Palette(const GSRenderer* renderer, u16 pal, bool need_gs_texture)
|
||||
: m_pal(pal)
|
||||
, m_tex_palette(nullptr)
|
||||
, m_renderer(renderer)
|
||||
{
|
||||
uint16 palette_size = pal * sizeof(uint32);
|
||||
m_clut = (uint32*)_aligned_malloc(palette_size, 64);
|
||||
memcpy(m_clut, (const uint32*)m_renderer->m_mem.m_clut, palette_size);
|
||||
u16 palette_size = pal * sizeof(u32);
|
||||
m_clut = (u32*)_aligned_malloc(palette_size, 64);
|
||||
memcpy(m_clut, (const u32*)m_renderer->m_mem.m_clut, palette_size);
|
||||
if (need_gs_texture)
|
||||
{
|
||||
InitializeTexture();
|
||||
|
@ -2234,20 +2234,20 @@ void GSTextureCache::Palette::InitializeTexture()
|
|||
|
||||
// Hashes the content of the clut.
|
||||
// The hashing function is implemented by taking two things into account:
|
||||
// 1) The clut can be an array of 16 or 256 uint32 (depending on the pal parameter) and in order to speed up the computation of the hash
|
||||
// the array is hashed in blocks of 16 uint32, so for clut of size 16 uint32 the hashing is computed in one pass and for clut of 256 uint32
|
||||
// 1) The clut can be an array of 16 or 256 u32 (depending on the pal parameter) and in order to speed up the computation of the hash
|
||||
// the array is hashed in blocks of 16 u32, so for clut of size 16 u32 the hashing is computed in one pass and for clut of 256 u32
|
||||
// it is computed in 16 passes,
|
||||
// 2) The clut can contain many 0s, so as a way to increase the spread of hashing values for small changes in the input clut the hashing function
|
||||
// is using addition in combination with logical XOR operator; The addition constants are large prime numbers, which may help in achieving what intended.
|
||||
std::size_t GSTextureCache::PaletteKeyHash::operator()(const PaletteKey& key) const
|
||||
{
|
||||
uint16 pal = key.pal;
|
||||
const uint32* clut = key.clut;
|
||||
u16 pal = key.pal;
|
||||
const u32* clut = key.clut;
|
||||
|
||||
ASSERT((pal & 15) == 0);
|
||||
|
||||
size_t clut_hash = 3831179159;
|
||||
for (uint16 i = 0; i < pal; i += 16)
|
||||
for (u16 i = 0; i < pal; i += 16)
|
||||
{
|
||||
clut_hash = (clut_hash + 1488000301) ^ (clut[i ] + 33644011);
|
||||
clut_hash = (clut_hash + 3831179159) ^ (clut[i + 1] + 47627467);
|
||||
|
@ -2295,7 +2295,7 @@ GSTextureCache::PaletteMap::PaletteMap(const GSRenderer* renderer)
|
|||
}
|
||||
}
|
||||
|
||||
std::shared_ptr<GSTextureCache::Palette> GSTextureCache::PaletteMap::LookupPalette(uint16 pal, bool need_gs_texture)
|
||||
std::shared_ptr<GSTextureCache::Palette> GSTextureCache::PaletteMap::LookupPalette(u16 pal, bool need_gs_texture)
|
||||
{
|
||||
ASSERT(pal == 16 || pal == 256);
|
||||
|
||||
|
@ -2304,7 +2304,7 @@ std::shared_ptr<GSTextureCache::Palette> GSTextureCache::PaletteMap::LookupPalet
|
|||
// pal == 256 : index 1
|
||||
auto& map = m_maps[pal == 16 ? 0 : 1];
|
||||
|
||||
const uint32* clut = (const uint32*)m_renderer->m_mem.m_clut;
|
||||
const u32* clut = (const u32*)m_renderer->m_mem.m_clut;
|
||||
|
||||
// Create PaletteKey for searching into map (clut is actually not copied, so do not store this key into the map)
|
||||
PaletteKey palette_key = {clut, pal};
|
||||
|
@ -2327,9 +2327,9 @@ std::shared_ptr<GSTextureCache::Palette> GSTextureCache::PaletteMap::LookupPalet
|
|||
if (map.size() > MAX_SIZE)
|
||||
{
|
||||
// If the map is too big, try to clean it by disposing and removing unused palettes, before adding the new one
|
||||
GL_INS("WARNING, %u-bit PaletteMap (Size %u): Max size %u exceeded, clearing unused palettes.", pal * sizeof(uint32), map.size(), MAX_SIZE);
|
||||
GL_INS("WARNING, %u-bit PaletteMap (Size %u): Max size %u exceeded, clearing unused palettes.", pal * sizeof(u32), map.size(), MAX_SIZE);
|
||||
|
||||
uint32 current_size = map.size();
|
||||
u32 current_size = map.size();
|
||||
|
||||
for (auto it = map.begin(); it != map.end();)
|
||||
{
|
||||
|
@ -2347,16 +2347,16 @@ std::shared_ptr<GSTextureCache::Palette> GSTextureCache::PaletteMap::LookupPalet
|
|||
}
|
||||
}
|
||||
|
||||
uint32 cleared_palette_count = current_size - (uint32)map.size();
|
||||
u32 cleared_palette_count = current_size - (u32)map.size();
|
||||
|
||||
if (cleared_palette_count == 0)
|
||||
{
|
||||
GL_INS("ERROR, %u-bit PaletteMap (Size %u): Max size %u exceeded, could not clear any palette, negative performance impact.", pal * sizeof(uint32), map.size(), MAX_SIZE);
|
||||
GL_INS("ERROR, %u-bit PaletteMap (Size %u): Max size %u exceeded, could not clear any palette, negative performance impact.", pal * sizeof(u32), map.size(), MAX_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
map.reserve(MAX_SIZE); // Ensure map capacity is not modified by the clearing
|
||||
GL_INS("INFO, %u-bit PaletteMap (Size %u): Cleared %u palettes.", pal * sizeof(uint32), map.size(), cleared_palette_count);
|
||||
GL_INS("INFO, %u-bit PaletteMap (Size %u): Cleared %u palettes.", pal * sizeof(u32), map.size(), cleared_palette_count);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2364,7 +2364,7 @@ std::shared_ptr<GSTextureCache::Palette> GSTextureCache::PaletteMap::LookupPalet
|
|||
|
||||
map.emplace(palette->GetPaletteKey(), palette);
|
||||
|
||||
GL_CACHE("TC, %u-bit PaletteMap (Size %u): Added new palette.", pal * sizeof(uint32), map.size());
|
||||
GL_CACHE("TC, %u-bit PaletteMap (Size %u): Added new palette.", pal * sizeof(u32), map.size());
|
||||
|
||||
return palette;
|
||||
}
|
||||
|
|
|
@ -38,36 +38,36 @@ public:
|
|||
GIFRegTEX0 m_TEX0;
|
||||
GIFRegTEXA m_TEXA;
|
||||
int m_age;
|
||||
uint8* m_temp;
|
||||
u8* m_temp;
|
||||
bool m_32_bits_fmt; // Allow to detect the casting of 32 bits as 16 bits texture
|
||||
bool m_shared_texture;
|
||||
uint32 m_end_block; // Hint of the surface area.
|
||||
u32 m_end_block; // Hint of the surface area.
|
||||
|
||||
public:
|
||||
Surface(GSRenderer* r, uint8* temp);
|
||||
Surface(GSRenderer* r, u8* temp);
|
||||
virtual ~Surface();
|
||||
|
||||
void UpdateAge();
|
||||
bool Inside(uint32 bp, uint32 bw, uint32 psm, const GSVector4i& rect);
|
||||
bool Overlaps(uint32 bp, uint32 bw, uint32 psm, const GSVector4i& rect);
|
||||
bool Inside(u32 bp, u32 bw, u32 psm, const GSVector4i& rect);
|
||||
bool Overlaps(u32 bp, u32 bw, u32 psm, const GSVector4i& rect);
|
||||
};
|
||||
|
||||
struct PaletteKey
|
||||
{
|
||||
const uint32* clut;
|
||||
uint16 pal;
|
||||
const u32* clut;
|
||||
u16 pal;
|
||||
};
|
||||
|
||||
class Palette
|
||||
{
|
||||
private:
|
||||
uint32* m_clut;
|
||||
uint16 m_pal;
|
||||
u32* m_clut;
|
||||
u16 m_pal;
|
||||
GSTexture* m_tex_palette;
|
||||
const GSRenderer* m_renderer;
|
||||
|
||||
public:
|
||||
Palette(const GSRenderer* renderer, uint16 pal, bool need_gs_texture);
|
||||
Palette(const GSRenderer* renderer, u16 pal, bool need_gs_texture);
|
||||
~Palette();
|
||||
|
||||
// Disable copy constructor and copy operator
|
||||
|
@ -102,16 +102,16 @@ public:
|
|||
struct
|
||||
{
|
||||
GSVector4i* rect;
|
||||
uint32 count;
|
||||
u32 count;
|
||||
} m_write;
|
||||
|
||||
void Write(const GSVector4i& r, int layer);
|
||||
void Flush(uint32 count, int layer);
|
||||
void Flush(u32 count, int layer);
|
||||
|
||||
public:
|
||||
std::shared_ptr<Palette> m_palette_obj;
|
||||
GSTexture* m_palette;
|
||||
uint32 m_valid[MAX_PAGES]; // each uint32 bits map to the 32 blocks of that page
|
||||
u32 m_valid[MAX_PAGES]; // each u32 bits map to the 32 blocks of that page
|
||||
GSVector4i m_valid_rect;
|
||||
bool m_target;
|
||||
bool m_complete;
|
||||
|
@ -124,11 +124,11 @@ public:
|
|||
GIFRegTEX0 m_from_target_TEX0; // TEX0 of the target texture, if any, else equal to texture TEX0
|
||||
GIFRegTEX0 m_layer_TEX0[7]; // Detect already loaded value
|
||||
// Keep a GSTextureCache::SourceMap::m_map iterator to allow fast erase
|
||||
std::array<uint16, MAX_PAGES> m_erase_it;
|
||||
std::array<u16, MAX_PAGES> m_erase_it;
|
||||
GSOffset::PageLooper m_pages;
|
||||
|
||||
public:
|
||||
Source(GSRenderer* r, const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, uint8* temp, bool dummy_container = false);
|
||||
Source(GSRenderer* r, const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, u8* temp, bool dummy_container = false);
|
||||
virtual ~Source();
|
||||
|
||||
void Update(const GSVector4i& rect, int layer = 0);
|
||||
|
@ -148,7 +148,7 @@ public:
|
|||
bool m_dirty_alpha;
|
||||
|
||||
public:
|
||||
Target(GSRenderer* r, const GIFRegTEX0& TEX0, uint8* temp, bool depth_supported);
|
||||
Target(GSRenderer* r, const GIFRegTEX0& TEX0, u8* temp, bool depth_supported);
|
||||
|
||||
void UpdateValidity(const GSVector4i& rect);
|
||||
|
||||
|
@ -158,7 +158,7 @@ public:
|
|||
class PaletteMap
|
||||
{
|
||||
private:
|
||||
static const uint16 MAX_SIZE = 65535; // Max size of each map.
|
||||
static const u16 MAX_SIZE = 65535; // Max size of each map.
|
||||
const GSRenderer* m_renderer;
|
||||
|
||||
// Array of 2 maps, the first for 64B palettes and the second for 1024B palettes.
|
||||
|
@ -170,7 +170,7 @@ public:
|
|||
PaletteMap(const GSRenderer* renderer);
|
||||
|
||||
// Retrieves a shared pointer to a valid Palette from m_maps or creates a new one adding it to the data structure
|
||||
std::shared_ptr<Palette> LookupPalette(uint16 pal, bool need_gs_texture);
|
||||
std::shared_ptr<Palette> LookupPalette(u16 pal, bool need_gs_texture);
|
||||
|
||||
void Clear(); // Clears m_maps, thus deletes Palette objects
|
||||
};
|
||||
|
@ -180,7 +180,7 @@ public:
|
|||
public:
|
||||
std::unordered_set<Source*> m_surfaces;
|
||||
std::array<FastList<Source*>, MAX_PAGES> m_map;
|
||||
uint32 m_pages[16]; // bitmap of all pages
|
||||
u32 m_pages[16]; // bitmap of all pages
|
||||
bool m_used;
|
||||
|
||||
SourceMap()
|
||||
|
@ -197,12 +197,12 @@ public:
|
|||
|
||||
struct TexInsideRtCacheEntry
|
||||
{
|
||||
uint32 psm;
|
||||
uint32 bp;
|
||||
uint32 bp_end;
|
||||
uint32 bw;
|
||||
uint32 t_tex0_tbp0;
|
||||
uint32 m_end_block;
|
||||
u32 psm;
|
||||
u32 bp;
|
||||
u32 bp_end;
|
||||
u32 bw;
|
||||
u32 t_tex0_tbp0;
|
||||
u32 m_end_block;
|
||||
bool has_valid_offset;
|
||||
int x_offset;
|
||||
int y_offset;
|
||||
|
@ -215,14 +215,14 @@ protected:
|
|||
FastList<Target*> m_dst[2];
|
||||
bool m_paltex;
|
||||
bool m_preload_frame;
|
||||
uint8* m_temp;
|
||||
u8* m_temp;
|
||||
bool m_can_convert_depth;
|
||||
bool m_cpu_fb_conversion;
|
||||
CRCHackLevel m_crc_hack_level;
|
||||
static bool m_disable_partial_invalidation;
|
||||
bool m_texture_inside_rt;
|
||||
static bool m_wrap_gs_mem;
|
||||
uint8 m_texture_inside_rt_cache_size = 255;
|
||||
u8 m_texture_inside_rt_cache_size = 255;
|
||||
std::vector<TexInsideRtCacheEntry> m_texture_inside_rt_cache;
|
||||
|
||||
virtual Source* CreateSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, Target* t = NULL, bool half_right = false, int x_offset = 0, int y_offset = 0);
|
||||
|
@ -244,10 +244,10 @@ public:
|
|||
Source* LookupSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, const GSVector4i& r);
|
||||
Source* LookupDepthSource(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, const GSVector4i& r, bool palette = false);
|
||||
|
||||
Target* LookupTarget(const GIFRegTEX0& TEX0, int w, int h, int type, bool used, uint32 fbmask = 0);
|
||||
Target* LookupTarget(const GIFRegTEX0& TEX0, int w, int h, int type, bool used, u32 fbmask = 0);
|
||||
Target* LookupTarget(const GIFRegTEX0& TEX0, int w, int h, int real_h);
|
||||
|
||||
void InvalidateVideoMemType(int type, uint32 bp);
|
||||
void InvalidateVideoMemType(int type, u32 bp);
|
||||
void InvalidateVideoMemSubTarget(GSTextureCache::Target* rt);
|
||||
void InvalidateVideoMem(const GSOffset& off, const GSVector4i& r, bool target = true);
|
||||
void InvalidateLocalMem(const GSOffset& off, const GSVector4i& r);
|
||||
|
@ -265,5 +265,5 @@ public:
|
|||
|
||||
void PrintMemoryUsage();
|
||||
|
||||
void AttachPaletteToSource(Source* s, uint16 pal, bool need_gs_texture);
|
||||
void AttachPaletteToSource(Source* s, u16 pal, bool need_gs_texture);
|
||||
};
|
||||
|
|
|
@ -25,8 +25,8 @@ struct alignas(32) GSVertexHW9
|
|||
GSVector4 t;
|
||||
GSVector4 p;
|
||||
|
||||
// t.z = union {struct {uint8 r, g, b, a;}; uint32 c0;};
|
||||
// t.w = union {struct {uint8 ta0, ta1, res, f;}; uint32 c1;}
|
||||
// t.z = union {struct {u8 r, g, b, a;}; u32 c0;};
|
||||
// t.w = union {struct {u8 ta0, ta1, res, f;}; u32 c1;}
|
||||
|
||||
GSVertexHW9& operator=(GSVertexHW9& v)
|
||||
{
|
||||
|
|
|
@ -25,7 +25,7 @@ private:
|
|||
|
||||
void DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex, GSVector4* dRect, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) {}
|
||||
void DoInterlace(GSTexture* sTex, GSTexture* dTex, int shader, bool linear, float yoffset = 0) {}
|
||||
uint16 ConvertBlendEnum(uint16 generic) { return 0xFFFF; }
|
||||
u16 ConvertBlendEnum(u16 generic) { return 0xFFFF; }
|
||||
|
||||
public:
|
||||
GSDeviceNull() {}
|
||||
|
|
|
@ -23,11 +23,11 @@ namespace GLState
|
|||
GSVector4i scissor;
|
||||
|
||||
bool blend;
|
||||
uint16 eq_RGB;
|
||||
uint16 f_sRGB;
|
||||
uint16 f_dRGB;
|
||||
uint8 bf;
|
||||
uint32 wrgba;
|
||||
u16 eq_RGB;
|
||||
u16 f_sRGB;
|
||||
u16 f_dRGB;
|
||||
u8 bf;
|
||||
u32 wrgba;
|
||||
|
||||
bool depth;
|
||||
GLenum depth_func;
|
||||
|
@ -50,7 +50,7 @@ namespace GLState
|
|||
GLuint program;
|
||||
GLuint pipeline;
|
||||
|
||||
int64 available_vram;
|
||||
s64 available_vram;
|
||||
|
||||
void Clear()
|
||||
{
|
||||
|
|
|
@ -25,11 +25,11 @@ namespace GLState
|
|||
extern GSVector4i scissor;
|
||||
|
||||
extern bool blend;
|
||||
extern uint16 eq_RGB;
|
||||
extern uint16 f_sRGB;
|
||||
extern uint16 f_dRGB;
|
||||
extern uint8 bf;
|
||||
extern uint32 wrgba;
|
||||
extern u16 eq_RGB;
|
||||
extern u16 f_sRGB;
|
||||
extern u16 f_dRGB;
|
||||
extern u8 bf;
|
||||
extern u32 wrgba;
|
||||
|
||||
extern bool depth;
|
||||
extern GLenum depth_func;
|
||||
|
@ -52,7 +52,7 @@ namespace GLState
|
|||
extern GLuint program;
|
||||
extern GLuint pipeline;
|
||||
|
||||
extern int64 available_vram;
|
||||
extern s64 available_vram;
|
||||
|
||||
extern void Clear();
|
||||
} // namespace GLState
|
||||
|
|
|
@ -30,17 +30,17 @@
|
|||
|
||||
// TODO port those value into PerfMon API
|
||||
#ifdef ENABLE_OGL_DEBUG_MEM_BW
|
||||
uint64 g_real_texture_upload_byte = 0;
|
||||
uint64 g_vertex_upload_byte = 0;
|
||||
uint64 g_uniform_upload_byte = 0;
|
||||
u64 g_real_texture_upload_byte = 0;
|
||||
u64 g_vertex_upload_byte = 0;
|
||||
u64 g_uniform_upload_byte = 0;
|
||||
#endif
|
||||
|
||||
static constexpr uint32 g_merge_cb_index = 10;
|
||||
static constexpr uint32 g_interlace_cb_index = 11;
|
||||
static constexpr uint32 g_fx_cb_index = 14;
|
||||
static constexpr uint32 g_convert_index = 15;
|
||||
static constexpr uint32 g_vs_cb_index = 20;
|
||||
static constexpr uint32 g_ps_cb_index = 21;
|
||||
static constexpr u32 g_merge_cb_index = 10;
|
||||
static constexpr u32 g_interlace_cb_index = 11;
|
||||
static constexpr u32 g_fx_cb_index = 14;
|
||||
static constexpr u32 g_convert_index = 15;
|
||||
static constexpr u32 g_vs_cb_index = 20;
|
||||
static constexpr u32 g_ps_cb_index = 21;
|
||||
|
||||
static constexpr u32 VERTEX_BUFFER_SIZE = 32 * 1024 * 1024;
|
||||
static constexpr u32 INDEX_BUFFER_SIZE = 16 * 1024 * 1024;
|
||||
|
@ -179,10 +179,10 @@ void GSDeviceOGL::GenerateProfilerData()
|
|||
const int first_query = replay > 1 ? m_profiler.last_query / replay : 0;
|
||||
|
||||
glGetQueryObjectui64v(m_profiler.timer_query[first_query], GL_QUERY_RESULT, &time_start);
|
||||
for (uint32 q = first_query + 1; q < m_profiler.last_query; q++)
|
||||
for (u32 q = first_query + 1; q < m_profiler.last_query; q++)
|
||||
{
|
||||
glGetQueryObjectui64v(m_profiler.timer_query[q], GL_QUERY_RESULT, &time_end);
|
||||
uint64 t = time_end - time_start;
|
||||
u64 t = time_end - time_start;
|
||||
times.push_back((double)t * ms);
|
||||
|
||||
time_start = time_end;
|
||||
|
@ -207,7 +207,7 @@ void GSDeviceOGL::GenerateProfilerData()
|
|||
sd += pow(t - mean, 2);
|
||||
sd = sqrt(sd / frames);
|
||||
|
||||
uint32 time_repartition[16] = {0};
|
||||
u32 time_repartition[16] = {0};
|
||||
for (auto t : times)
|
||||
{
|
||||
size_t slot = std::min<size_t>(t / 2.0, std::size(time_repartition) - 1);
|
||||
|
@ -221,7 +221,7 @@ void GSDeviceOGL::GenerateProfilerData()
|
|||
fprintf(stderr, "SD %4.2f ms\n", sd);
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "Frame Repartition\n");
|
||||
for (uint32 i = 0; i < std::size(time_repartition); i++)
|
||||
for (u32 i = 0; i < std::size(time_repartition); i++)
|
||||
{
|
||||
fprintf(stderr, "%3u ms => %3u ms\t%4u\n", 2 * i, 2 * (i + 1), time_repartition[i]);
|
||||
}
|
||||
|
@ -420,7 +420,7 @@ bool GSDeviceOGL::Create(const WindowInfo& wi)
|
|||
{
|
||||
GL_PUSH("GSDeviceOGL::Sampler");
|
||||
|
||||
for (uint32 key = 0; key < std::size(m_ps_ss); key++)
|
||||
for (u32 key = 0; key < std::size(m_ps_ss); key++)
|
||||
{
|
||||
m_ps_ss[key] = CreateSampler(PSSamplerSelector(key));
|
||||
}
|
||||
|
@ -606,7 +606,7 @@ bool GSDeviceOGL::Create(const WindowInfo& wi)
|
|||
// When VRAM is below 2GB, we add a factor 2 because RAM can be used. Potentially
|
||||
// low VRAM gpu can go higher but perf will be bad anyway.
|
||||
if (vram[0] > 0 && vram[0] < 1800000)
|
||||
GLState::available_vram = (int64)(vram[0]) * 1024ul * 2ul;
|
||||
GLState::available_vram = (s64)(vram[0]) * 1024ul * 2ul;
|
||||
|
||||
fprintf(stdout, "Available VRAM/RAM:%lldMB for textures\n", GLState::available_vram >> 20u);
|
||||
|
||||
|
@ -654,14 +654,14 @@ void GSDeviceOGL::CreateTextureFX()
|
|||
m_gs[2] = CompileGS(GSSelector(2));
|
||||
m_gs[4] = CompileGS(GSSelector(4));
|
||||
|
||||
for (uint32 key = 0; key < std::size(m_vs); key++)
|
||||
for (u32 key = 0; key < std::size(m_vs); key++)
|
||||
m_vs[key] = CompileVS(VSSelector(key));
|
||||
|
||||
// Enable all bits for stencil operations. Technically 1 bit is
|
||||
// enough but buffer is polluted with noise. Clear will be limited
|
||||
// to the mask.
|
||||
glStencilMask(0xFF);
|
||||
for (uint32 key = 0; key < std::size(m_om_dss); key++)
|
||||
for (u32 key = 0; key < std::size(m_om_dss); key++)
|
||||
{
|
||||
m_om_dss[key] = CreateDepthStencil(OMDepthStencilSelector(key));
|
||||
}
|
||||
|
@ -747,7 +747,7 @@ void GSDeviceOGL::ClearRenderTarget(GSTexture* t, const GSVector4& c)
|
|||
// TODO: check size of scissor before toggling it
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
|
||||
const uint32 old_color_mask = GLState::wrgba;
|
||||
const u32 old_color_mask = GLState::wrgba;
|
||||
OMSetColorMaskState();
|
||||
|
||||
if (T->IsBackbuffer())
|
||||
|
@ -773,7 +773,7 @@ void GSDeviceOGL::ClearRenderTarget(GSTexture* t, const GSVector4& c)
|
|||
T->WasCleaned();
|
||||
}
|
||||
|
||||
void GSDeviceOGL::ClearRenderTarget(GSTexture* t, uint32 c)
|
||||
void GSDeviceOGL::ClearRenderTarget(GSTexture* t, u32 c)
|
||||
{
|
||||
if (!t)
|
||||
return;
|
||||
|
@ -828,7 +828,7 @@ void GSDeviceOGL::ClearDepth(GSTexture* t)
|
|||
}
|
||||
}
|
||||
|
||||
void GSDeviceOGL::ClearStencil(GSTexture* t, uint8 c)
|
||||
void GSDeviceOGL::ClearStencil(GSTexture* t, u8 c)
|
||||
{
|
||||
if (!t)
|
||||
return;
|
||||
|
@ -1404,7 +1404,7 @@ void GSDeviceOGL::StretchRect(GSTexture* sTex, const GSVector4& sRect, GSTexture
|
|||
else
|
||||
OMSetRenderTargets(dTex, NULL);
|
||||
|
||||
OMSetBlendState((uint8)bs);
|
||||
OMSetBlendState((u8)bs);
|
||||
OMSetColorMaskState(cms);
|
||||
|
||||
// ************************************
|
||||
|
@ -1475,7 +1475,7 @@ void GSDeviceOGL::RenderOsd(GSTexture* dt)
|
|||
m_shader->BindPipeline(m_convert.ps[ShaderConvert_OSD]);
|
||||
|
||||
OMSetDepthStencilState(m_convert.dss);
|
||||
OMSetBlendState((uint8)GSDeviceOGL::m_MERGE_BLEND);
|
||||
OMSetBlendState((u8)GSDeviceOGL::m_MERGE_BLEND);
|
||||
OMSetRenderTargets(dt, NULL);
|
||||
|
||||
if (m_osd.m_texture_dirty)
|
||||
|
@ -1839,7 +1839,7 @@ void GSDeviceOGL::OMSetColorMaskState(OMColorMaskSelector sel)
|
|||
}
|
||||
}
|
||||
|
||||
void GSDeviceOGL::OMSetBlendState(uint8 blend_index, uint8 blend_factor, bool is_blend_constant, bool accumulation_blend)
|
||||
void GSDeviceOGL::OMSetBlendState(u8 blend_index, u8 blend_factor, bool is_blend_constant, bool accumulation_blend)
|
||||
{
|
||||
if (blend_index)
|
||||
{
|
||||
|
@ -2137,7 +2137,7 @@ void GSDeviceOGL::DebugOutputToFile(GLenum gl_source, GLenum gl_type, GLuint id,
|
|||
#endif
|
||||
}
|
||||
|
||||
uint16 GSDeviceOGL::ConvertBlendEnum(uint16 generic)
|
||||
u16 GSDeviceOGL::ConvertBlendEnum(u16 generic)
|
||||
{
|
||||
switch (generic)
|
||||
{
|
||||
|
|
|
@ -25,8 +25,8 @@
|
|||
#include "GLState.h"
|
||||
|
||||
#ifdef ENABLE_OGL_DEBUG_MEM_BW
|
||||
extern uint64 g_real_texture_upload_byte;
|
||||
extern uint64 g_vertex_upload_byte;
|
||||
extern u64 g_real_texture_upload_byte;
|
||||
extern u64 g_vertex_upload_byte;
|
||||
#endif
|
||||
|
||||
class GSDepthStencilOGL
|
||||
|
@ -164,20 +164,20 @@ public:
|
|||
{
|
||||
struct
|
||||
{
|
||||
uint32 int_fst : 1;
|
||||
uint32 _free : 31;
|
||||
u32 int_fst : 1;
|
||||
u32 _free : 31;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
u32 key;
|
||||
};
|
||||
|
||||
operator uint32() const { return key; }
|
||||
operator u32() const { return key; }
|
||||
|
||||
VSSelector()
|
||||
: key(0)
|
||||
{
|
||||
}
|
||||
VSSelector(uint32 k)
|
||||
VSSelector(u32 k)
|
||||
: key(k)
|
||||
{
|
||||
}
|
||||
|
@ -189,23 +189,23 @@ public:
|
|||
{
|
||||
struct
|
||||
{
|
||||
uint32 sprite : 1;
|
||||
uint32 point : 1;
|
||||
uint32 line : 1;
|
||||
u32 sprite : 1;
|
||||
u32 point : 1;
|
||||
u32 line : 1;
|
||||
|
||||
uint32 _free : 29;
|
||||
u32 _free : 29;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
u32 key;
|
||||
};
|
||||
|
||||
operator uint32() const { return key; }
|
||||
operator u32() const { return key; }
|
||||
|
||||
GSSelector()
|
||||
: key(0)
|
||||
{
|
||||
}
|
||||
GSSelector(uint32 k)
|
||||
GSSelector(u32 k)
|
||||
: key(k)
|
||||
{
|
||||
}
|
||||
|
@ -287,72 +287,72 @@ public:
|
|||
{
|
||||
// *** Word 1
|
||||
// Format
|
||||
uint32 tex_fmt : 4;
|
||||
uint32 dfmt : 2;
|
||||
uint32 depth_fmt : 2;
|
||||
u32 tex_fmt : 4;
|
||||
u32 dfmt : 2;
|
||||
u32 depth_fmt : 2;
|
||||
// Alpha extension/Correction
|
||||
uint32 aem : 1;
|
||||
uint32 fba : 1;
|
||||
u32 aem : 1;
|
||||
u32 fba : 1;
|
||||
// Fog
|
||||
uint32 fog : 1;
|
||||
u32 fog : 1;
|
||||
// Flat/goround shading
|
||||
uint32 iip : 1;
|
||||
u32 iip : 1;
|
||||
// Pixel test
|
||||
uint32 date : 3;
|
||||
uint32 atst : 3;
|
||||
u32 date : 3;
|
||||
u32 atst : 3;
|
||||
// Color sampling
|
||||
uint32 fst : 1; // Investigate to do it on the VS
|
||||
uint32 tfx : 3;
|
||||
uint32 tcc : 1;
|
||||
uint32 wms : 2;
|
||||
uint32 wmt : 2;
|
||||
uint32 ltf : 1;
|
||||
u32 fst : 1; // Investigate to do it on the VS
|
||||
u32 tfx : 3;
|
||||
u32 tcc : 1;
|
||||
u32 wms : 2;
|
||||
u32 wmt : 2;
|
||||
u32 ltf : 1;
|
||||
// Shuffle and fbmask effect
|
||||
uint32 shuffle : 1;
|
||||
uint32 read_ba : 1;
|
||||
uint32 write_rg : 1;
|
||||
uint32 fbmask : 1;
|
||||
u32 shuffle : 1;
|
||||
u32 read_ba : 1;
|
||||
u32 write_rg : 1;
|
||||
u32 fbmask : 1;
|
||||
|
||||
//uint32 _free1:0;
|
||||
//u32 _free1:0;
|
||||
|
||||
// *** Word 2
|
||||
// Blend and Colclip
|
||||
uint32 blend_a : 2;
|
||||
uint32 blend_b : 2;
|
||||
uint32 blend_c : 2;
|
||||
uint32 blend_d : 2;
|
||||
uint32 clr1 : 1; // useful?
|
||||
uint32 hdr : 1;
|
||||
uint32 colclip : 1;
|
||||
uint32 pabe : 1;
|
||||
u32 blend_a : 2;
|
||||
u32 blend_b : 2;
|
||||
u32 blend_c : 2;
|
||||
u32 blend_d : 2;
|
||||
u32 clr1 : 1; // useful?
|
||||
u32 hdr : 1;
|
||||
u32 colclip : 1;
|
||||
u32 pabe : 1;
|
||||
|
||||
// Others ways to fetch the texture
|
||||
uint32 channel : 3;
|
||||
u32 channel : 3;
|
||||
|
||||
// Dithering
|
||||
uint32 dither : 2;
|
||||
u32 dither : 2;
|
||||
|
||||
// Depth clamp
|
||||
uint32 zclamp : 1;
|
||||
u32 zclamp : 1;
|
||||
|
||||
// Hack
|
||||
uint32 tcoffsethack : 1;
|
||||
uint32 urban_chaos_hle : 1;
|
||||
uint32 tales_of_abyss_hle : 1;
|
||||
uint32 tex_is_fb : 1; // Jak Shadows
|
||||
uint32 automatic_lod : 1;
|
||||
uint32 manual_lod : 1;
|
||||
uint32 point_sampler : 1;
|
||||
uint32 invalid_tex0 : 1; // Lupin the 3rd
|
||||
u32 tcoffsethack : 1;
|
||||
u32 urban_chaos_hle : 1;
|
||||
u32 tales_of_abyss_hle : 1;
|
||||
u32 tex_is_fb : 1; // Jak Shadows
|
||||
u32 automatic_lod : 1;
|
||||
u32 manual_lod : 1;
|
||||
u32 point_sampler : 1;
|
||||
u32 invalid_tex0 : 1; // Lupin the 3rd
|
||||
|
||||
uint32 _free2 : 6;
|
||||
u32 _free2 : 6;
|
||||
};
|
||||
|
||||
uint64 key;
|
||||
u64 key;
|
||||
};
|
||||
|
||||
// FIXME is the & useful ?
|
||||
operator uint64() const { return key; }
|
||||
operator u64() const { return key; }
|
||||
|
||||
PSSelector()
|
||||
: key(0)
|
||||
|
@ -366,25 +366,25 @@ public:
|
|||
{
|
||||
struct
|
||||
{
|
||||
uint32 tau : 1;
|
||||
uint32 tav : 1;
|
||||
uint32 biln : 1;
|
||||
uint32 triln : 3;
|
||||
uint32 aniso : 1;
|
||||
u32 tau : 1;
|
||||
u32 tav : 1;
|
||||
u32 biln : 1;
|
||||
u32 triln : 3;
|
||||
u32 aniso : 1;
|
||||
|
||||
uint32 _free : 25;
|
||||
u32 _free : 25;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
u32 key;
|
||||
};
|
||||
|
||||
operator uint32() { return key; }
|
||||
operator u32() { return key; }
|
||||
|
||||
PSSamplerSelector()
|
||||
: key(0)
|
||||
{
|
||||
}
|
||||
PSSamplerSelector(uint32 k)
|
||||
PSSamplerSelector(u32 k)
|
||||
: key(k)
|
||||
{
|
||||
}
|
||||
|
@ -396,25 +396,25 @@ public:
|
|||
{
|
||||
struct
|
||||
{
|
||||
uint32 ztst : 2;
|
||||
uint32 zwe : 1;
|
||||
uint32 date : 1;
|
||||
uint32 date_one : 1;
|
||||
u32 ztst : 2;
|
||||
u32 zwe : 1;
|
||||
u32 date : 1;
|
||||
u32 date_one : 1;
|
||||
|
||||
uint32 _free : 27;
|
||||
u32 _free : 27;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
u32 key;
|
||||
};
|
||||
|
||||
// FIXME is the & useful ?
|
||||
operator uint32() { return key; }
|
||||
operator u32() { return key; }
|
||||
|
||||
OMDepthStencilSelector()
|
||||
: key(0)
|
||||
{
|
||||
}
|
||||
OMDepthStencilSelector(uint32 k)
|
||||
OMDepthStencilSelector(u32 k)
|
||||
: key(k)
|
||||
{
|
||||
}
|
||||
|
@ -426,30 +426,30 @@ public:
|
|||
{
|
||||
struct
|
||||
{
|
||||
uint32 wr : 1;
|
||||
uint32 wg : 1;
|
||||
uint32 wb : 1;
|
||||
uint32 wa : 1;
|
||||
u32 wr : 1;
|
||||
u32 wg : 1;
|
||||
u32 wb : 1;
|
||||
u32 wa : 1;
|
||||
|
||||
uint32 _free : 28;
|
||||
u32 _free : 28;
|
||||
};
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 wrgba : 4;
|
||||
u32 wrgba : 4;
|
||||
};
|
||||
|
||||
uint32 key;
|
||||
u32 key;
|
||||
};
|
||||
|
||||
// FIXME is the & useful ?
|
||||
operator uint32() { return key & 0xf; }
|
||||
operator u32() { return key & 0xf; }
|
||||
|
||||
OMColorMaskSelector()
|
||||
: key(0xF)
|
||||
{
|
||||
}
|
||||
OMColorMaskSelector(uint32 c) { wrgba = c; }
|
||||
OMColorMaskSelector(u32 c) { wrgba = c; }
|
||||
};
|
||||
|
||||
struct alignas(32) MiscConstantBuffer
|
||||
|
@ -539,7 +539,7 @@ private:
|
|||
|
||||
struct
|
||||
{
|
||||
uint16 last_query;
|
||||
u16 last_query;
|
||||
GLuint timer_query[1 << 16];
|
||||
|
||||
GLuint timer() { return timer_query[last_query]; }
|
||||
|
@ -549,7 +549,7 @@ private:
|
|||
GLuint m_gs[1 << 3];
|
||||
GLuint m_ps_ss[1 << 7];
|
||||
GSDepthStencilOGL* m_om_dss[1 << 5];
|
||||
std::unordered_map<uint64, GLuint> m_ps;
|
||||
std::unordered_map<u64, GLuint> m_ps;
|
||||
GLuint m_apitrace;
|
||||
|
||||
GLuint m_palette_ss;
|
||||
|
@ -574,7 +574,7 @@ private:
|
|||
void OMAttachDs(GSTextureOGL* ds = NULL);
|
||||
void OMSetFBO(GLuint fbo);
|
||||
|
||||
uint16 ConvertBlendEnum(uint16 generic) final;
|
||||
u16 ConvertBlendEnum(u16 generic) final;
|
||||
|
||||
public:
|
||||
GSShaderOGL* m_shader;
|
||||
|
@ -597,9 +597,9 @@ public:
|
|||
void DrawIndexedPrimitive(int offset, int count) final;
|
||||
|
||||
void ClearRenderTarget(GSTexture* t, const GSVector4& c) final;
|
||||
void ClearRenderTarget(GSTexture* t, uint32 c) final;
|
||||
void ClearRenderTarget(GSTexture* t, u32 c) final;
|
||||
void ClearDepth(GSTexture* t) final;
|
||||
void ClearStencil(GSTexture* t, uint8 c) final;
|
||||
void ClearStencil(GSTexture* t, u8 c) final;
|
||||
|
||||
void InitPrimDateTexture(GSTexture* rt, const GSVector4i& area);
|
||||
void RecycleDateTexture();
|
||||
|
@ -624,7 +624,7 @@ public:
|
|||
void PSSetSamplerState(GLuint ss);
|
||||
|
||||
void OMSetDepthStencilState(GSDepthStencilOGL* dss);
|
||||
void OMSetBlendState(uint8 blend_index = 0, uint8 blend_factor = 0, bool is_blend_constant = false, bool accumulation_blend = false);
|
||||
void OMSetBlendState(u8 blend_index = 0, u8 blend_factor = 0, bool is_blend_constant = false, bool accumulation_blend = false);
|
||||
void OMSetRenderTargets(GSTexture* rt, GSTexture* ds, const GSVector4i* scissor = NULL) final;
|
||||
void OMSetColorMaskState(OMColorMaskSelector sel = OMColorMaskSelector());
|
||||
|
||||
|
|
|
@ -131,8 +131,8 @@ void GSRendererOGL::EmulateZbuffer()
|
|||
|
||||
// On the real GS we appear to do clamping on the max z value the format allows.
|
||||
// Clamping is done after rasterization.
|
||||
const uint32 max_z = 0xFFFFFFFF >> (GSLocalMemory::m_psm[m_context->ZBUF.PSM].fmt * 8);
|
||||
const bool clamp_z = (uint32)(GSVector4i(m_vt.m_max.p).z) > max_z;
|
||||
const u32 max_z = 0xFFFFFFFF >> (GSLocalMemory::m_psm[m_context->ZBUF.PSM].fmt * 8);
|
||||
const bool clamp_z = (u32)(GSVector4i(m_vt.m_max.p).z) > max_z;
|
||||
|
||||
vs_cb.MaxDepth = GSVector2i(0xFFFFFFFF);
|
||||
//ps_cb.MaxDepth = GSVector4(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
|
@ -184,11 +184,11 @@ void GSRendererOGL::EmulateTextureShuffleAndFbmask()
|
|||
|
||||
// Please bang my head against the wall!
|
||||
// 1/ Reduce the frame mask to a 16 bit format
|
||||
const uint32& m = m_context->FRAME.FBMSK;
|
||||
const uint32 fbmask = ((m >> 3) & 0x1F) | ((m >> 6) & 0x3E0) | ((m >> 9) & 0x7C00) | ((m >> 16) & 0x8000);
|
||||
const u32& m = m_context->FRAME.FBMSK;
|
||||
const u32 fbmask = ((m >> 3) & 0x1F) | ((m >> 6) & 0x3E0) | ((m >> 9) & 0x7C00) | ((m >> 16) & 0x8000);
|
||||
// FIXME GSVector will be nice here
|
||||
const uint8 rg_mask = fbmask & 0xFF;
|
||||
const uint8 ba_mask = (fbmask >> 8) & 0xFF;
|
||||
const u8 rg_mask = fbmask & 0xFF;
|
||||
const u8 ba_mask = (fbmask >> 8) & 0xFF;
|
||||
m_om_csel.wrgba = 0;
|
||||
|
||||
// 2 Select the new mask (Please someone put SSE here)
|
||||
|
@ -443,10 +443,10 @@ void GSRendererOGL::EmulateChannelShuffle(GSTexture** rt, const GSTextureCache::
|
|||
// the rendered size of the framebuffer
|
||||
|
||||
GSVertex* s = &m_vertex.buff[0];
|
||||
s[0].XYZ.X = (uint16)(m_context->XYOFFSET.OFX + 0);
|
||||
s[1].XYZ.X = (uint16)(m_context->XYOFFSET.OFX + 16384);
|
||||
s[0].XYZ.Y = (uint16)(m_context->XYOFFSET.OFY + 0);
|
||||
s[1].XYZ.Y = (uint16)(m_context->XYOFFSET.OFY + 16384);
|
||||
s[0].XYZ.X = (u16)(m_context->XYOFFSET.OFX + 0);
|
||||
s[1].XYZ.X = (u16)(m_context->XYOFFSET.OFX + 16384);
|
||||
s[0].XYZ.Y = (u16)(m_context->XYOFFSET.OFY + 0);
|
||||
s[1].XYZ.Y = (u16)(m_context->XYOFFSET.OFY + 16384);
|
||||
|
||||
m_vertex.head = m_vertex.tail = m_vertex.next = 2;
|
||||
m_index.tail = 2;
|
||||
|
@ -473,7 +473,7 @@ void GSRendererOGL::EmulateBlending(bool& DATE_GL42, bool& DATE_GL45)
|
|||
}
|
||||
|
||||
// Compute the blending equation to detect special case
|
||||
const uint8 blend_index = uint8(((ALPHA.A * 3 + ALPHA.B) * 3 + ALPHA.C) * 3 + ALPHA.D);
|
||||
const u8 blend_index = u8(((ALPHA.A * 3 + ALPHA.B) * 3 + ALPHA.C) * 3 + ALPHA.D);
|
||||
const int blend_flag = m_dev->GetBlendFlags(blend_index);
|
||||
|
||||
// SW Blend is (nearly) free. Let's use it.
|
||||
|
@ -627,7 +627,7 @@ void GSRendererOGL::EmulateBlending(bool& DATE_GL42, bool& DATE_GL45)
|
|||
if (m_ps_sel.dfmt == 1 && ALPHA.C == 1)
|
||||
{
|
||||
// 24 bits doesn't have an alpha channel so use 1.0f fix factor as equivalent
|
||||
const uint8 hacked_blend_index = blend_index + 3; // +3 <=> +1 on C
|
||||
const u8 hacked_blend_index = blend_index + 3; // +3 <=> +1 on C
|
||||
dev->OMSetBlendState(hacked_blend_index, 128, true);
|
||||
}
|
||||
else
|
||||
|
@ -646,8 +646,8 @@ void GSRendererOGL::EmulateTextureSampler(const GSTextureCache::Source* tex)
|
|||
const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[tex->m_TEX0.PSM];
|
||||
const GSLocalMemory::psm_t& cpsm = psm.pal > 0 ? GSLocalMemory::m_psm[m_context->TEX0.CPSM] : psm;
|
||||
|
||||
const uint8 wms = m_context->CLAMP.WMS;
|
||||
const uint8 wmt = m_context->CLAMP.WMT;
|
||||
const u8 wms = m_context->CLAMP.WMS;
|
||||
const u8 wmt = m_context->CLAMP.WMT;
|
||||
const bool complex_wms_wmt = !!((wms | wmt) & 2);
|
||||
|
||||
const bool need_mipmap = IsMipMapDraw();
|
||||
|
@ -660,7 +660,7 @@ void GSRendererOGL::EmulateTextureSampler(const GSTextureCache::Source* tex)
|
|||
switch (UserHacks_tri_filter)
|
||||
{
|
||||
case TriFiltering::Forced:
|
||||
trilinear = static_cast<uint8>(GS_MIN_FILTER::Linear_Mipmap_Linear);
|
||||
trilinear = static_cast<u8>(GS_MIN_FILTER::Linear_Mipmap_Linear);
|
||||
trilinear_auto = m_mipmap != 2;
|
||||
break;
|
||||
|
||||
|
@ -1323,7 +1323,7 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
|
|||
{
|
||||
m_ps_sel.fog = 1;
|
||||
|
||||
const GSVector4 fc = GSVector4::rgba32(m_env.FOGCOL.u32[0]);
|
||||
const GSVector4 fc = GSVector4::rgba32(m_env.FOGCOL.U32[0]);
|
||||
// Blend AREF to avoid to load a random value for alpha (dirty cache)
|
||||
ps_cb.FogColor_AREF = fc.blend32<8>(ps_cb.FogColor_AREF);
|
||||
}
|
||||
|
@ -1334,7 +1334,7 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
|
|||
// pass to handle the depth based on the alpha test.
|
||||
bool ate_RGBA_then_Z = false;
|
||||
bool ate_RGB_then_ZA = false;
|
||||
uint8 ps_atst = 0;
|
||||
u8 ps_atst = 0;
|
||||
if (ate_first_pass & ate_second_pass)
|
||||
{
|
||||
GL_DBG("Complex Alpha Test");
|
||||
|
@ -1405,7 +1405,7 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
|
|||
// We need the palette to convert the depth to the correct alpha value.
|
||||
if (!tex->m_palette)
|
||||
{
|
||||
const uint16 pal = GSLocalMemory::m_psm[tex->m_TEX0.PSM].pal;
|
||||
const u16 pal = GSLocalMemory::m_psm[tex->m_TEX0.PSM].pal;
|
||||
m_tc->AttachPaletteToSource(tex, pal, true);
|
||||
dev->PSSetShaderResource(1, tex->m_palette);
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@ GLuint GSShaderOGL::LinkPipeline(const std::string& pretty_print, GLuint vs, GLu
|
|||
|
||||
GLuint GSShaderOGL::LinkProgram(GLuint vs, GLuint gs, GLuint ps)
|
||||
{
|
||||
uint32 hash = ((vs ^ gs) << 24) ^ ps;
|
||||
u32 hash = ((vs ^ gs) << 24) ^ ps;
|
||||
auto it = m_program.find(hash);
|
||||
if (it != m_program.end())
|
||||
return it->second;
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
class GSShaderOGL
|
||||
{
|
||||
GLuint m_pipeline;
|
||||
std::unordered_map<uint32, GLuint> m_program;
|
||||
std::unordered_map<u32, GLuint> m_program;
|
||||
const bool m_debug_shader;
|
||||
|
||||
std::vector<GLuint> m_shad_to_delete;
|
||||
|
|
|
@ -20,20 +20,20 @@
|
|||
#include "GS/GSPng.h"
|
||||
|
||||
#ifdef ENABLE_OGL_DEBUG_MEM_BW
|
||||
extern uint64 g_real_texture_upload_byte;
|
||||
extern u64 g_real_texture_upload_byte;
|
||||
#endif
|
||||
|
||||
// FIXME OGL4: investigate, only 1 unpack buffer always bound
|
||||
namespace PboPool
|
||||
{
|
||||
|
||||
const uint32 m_pbo_size = 64 * 1024 * 1024;
|
||||
const uint32 m_seg_size = 16 * 1024 * 1024;
|
||||
const u32 m_pbo_size = 64 * 1024 * 1024;
|
||||
const u32 m_seg_size = 16 * 1024 * 1024;
|
||||
|
||||
GLuint m_buffer;
|
||||
uptr m_offset;
|
||||
char* m_map;
|
||||
uint32 m_size;
|
||||
u32 m_size;
|
||||
GLsync m_fence[m_pbo_size / m_seg_size];
|
||||
|
||||
// Option for buffer storage
|
||||
|
@ -61,7 +61,7 @@ namespace PboPool
|
|||
UnbindPbo();
|
||||
}
|
||||
|
||||
char* Map(uint32 size)
|
||||
char* Map(u32 size)
|
||||
{
|
||||
char* map;
|
||||
// Note: keep offset aligned for SSE/AVX
|
||||
|
@ -113,8 +113,8 @@ namespace PboPool
|
|||
|
||||
void Sync()
|
||||
{
|
||||
uint32 segment_current = m_offset / m_seg_size;
|
||||
uint32 segment_next = (m_offset + m_size) / m_seg_size;
|
||||
u32 segment_current = m_offset / m_seg_size;
|
||||
u32 segment_next = (m_offset + m_size) / m_seg_size;
|
||||
|
||||
if (segment_current != segment_next)
|
||||
{
|
||||
|
@ -256,7 +256,7 @@ GSTextureOGL::GSTextureOGL(int type, int w, int h, int format, GLuint fbo_read,
|
|||
return; // backbuffer isn't a real texture
|
||||
case GSTexture::Offscreen:
|
||||
// Offscreen is only used to read color. So it only requires 4B by pixel
|
||||
m_local_buffer = (uint8*)_aligned_malloc(m_size.x * m_size.y * 4, 32);
|
||||
m_local_buffer = (u8*)_aligned_malloc(m_size.x * m_size.y * 4, 32);
|
||||
break;
|
||||
case GSTexture::Texture:
|
||||
// Only 32 bits input texture will be supported for mipmap
|
||||
|
@ -391,8 +391,8 @@ bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch, int
|
|||
|
||||
m_clean = false;
|
||||
|
||||
uint32 row_byte = r.width() << m_int_shift;
|
||||
uint32 map_size = r.height() * row_byte;
|
||||
u32 row_byte = r.width() << m_int_shift;
|
||||
u32 map_size = r.height() * row_byte;
|
||||
#ifdef ENABLE_OGL_DEBUG_MEM_BW
|
||||
g_real_texture_upload_byte += map_size;
|
||||
#endif
|
||||
|
@ -457,7 +457,7 @@ bool GSTextureOGL::Map(GSMap& m, const GSVector4i* _r, int layer)
|
|||
ASSERT(r.width() != 0);
|
||||
ASSERT(r.height() != 0);
|
||||
|
||||
uint32 row_byte = r.width() << m_int_shift;
|
||||
u32 row_byte = r.width() << m_int_shift;
|
||||
m.pitch = row_byte;
|
||||
|
||||
if (m_type == GSTexture::Offscreen)
|
||||
|
@ -495,9 +495,9 @@ bool GSTextureOGL::Map(GSMap& m, const GSVector4i* _r, int layer)
|
|||
|
||||
m_clean = false;
|
||||
|
||||
uint32 map_size = r.height() * row_byte;
|
||||
u32 map_size = r.height() * row_byte;
|
||||
|
||||
m.bits = (uint8*)PboPool::Map(map_size);
|
||||
m.bits = (u8*)PboPool::Map(map_size);
|
||||
|
||||
#ifdef ENABLE_OGL_DEBUG_MEM_BW
|
||||
g_real_texture_upload_byte += map_size;
|
||||
|
@ -586,9 +586,9 @@ void GSTextureOGL::CommitPages(const GSVector2i& region, bool commit)
|
|||
bool GSTextureOGL::Save(const std::string& fn)
|
||||
{
|
||||
// Collect the texture data
|
||||
uint32 pitch = 4 * m_committed_size.x;
|
||||
uint32 buf_size = pitch * m_committed_size.y * 2; // Note *2 for security (depth/stencil)
|
||||
std::unique_ptr<uint8[]> image(new uint8[buf_size]);
|
||||
u32 pitch = 4 * m_committed_size.x;
|
||||
u32 buf_size = pitch * m_committed_size.y * 2; // Note *2 for security (depth/stencil)
|
||||
std::unique_ptr<u8[]> image(new u8[buf_size]);
|
||||
#ifdef ENABLE_OGL_DEBUG
|
||||
GSPng::Format fmt = GSPng::RGB_A_PNG;
|
||||
#else
|
||||
|
@ -646,7 +646,7 @@ bool GSTextureOGL::Save(const std::string& fn)
|
|||
return GSPng::Save(fmt, fn, image.get(), m_committed_size.x, m_committed_size.y, pitch, compression);
|
||||
}
|
||||
|
||||
uint32 GSTextureOGL::GetMemUsage()
|
||||
u32 GSTextureOGL::GetMemUsage()
|
||||
{
|
||||
return m_mem_usage;
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ namespace PboPool
|
|||
inline void UnbindPbo();
|
||||
inline void Sync();
|
||||
|
||||
inline char* Map(uint32 size);
|
||||
inline char* Map(u32 size);
|
||||
inline void Unmap();
|
||||
inline uptr Offset();
|
||||
inline void EndTransfer();
|
||||
|
@ -41,7 +41,7 @@ private:
|
|||
bool m_clean;
|
||||
bool m_generate_mipmap;
|
||||
|
||||
uint8* m_local_buffer;
|
||||
u8* m_local_buffer;
|
||||
// Avoid alignment constrain
|
||||
//GSVector4i m_r;
|
||||
int m_r_x;
|
||||
|
@ -54,10 +54,10 @@ private:
|
|||
// internal opengl format/type/alignment
|
||||
GLenum m_int_format;
|
||||
GLenum m_int_type;
|
||||
uint32 m_int_shift;
|
||||
u32 m_int_shift;
|
||||
|
||||
// Allow to track size of allocated memory
|
||||
uint32 m_mem_usage;
|
||||
u32 m_mem_usage;
|
||||
|
||||
public:
|
||||
explicit GSTextureOGL(int type, int w, int h, int format, GLuint fbo_read, bool mipmap);
|
||||
|
@ -72,7 +72,7 @@ public:
|
|||
bool IsBackbuffer() { return (m_type == GSTexture::Backbuffer); }
|
||||
bool IsDss() { return (m_type == GSTexture::DepthStencil || m_type == GSTexture::SparseDepthStencil); }
|
||||
|
||||
uint32 GetID() final { return m_texture_id; }
|
||||
u32 GetID() final { return m_texture_id; }
|
||||
bool HasBeenCleaned() { return m_clean; }
|
||||
void WasAttached() { m_clean = false; }
|
||||
void WasCleaned() { m_clean = true; }
|
||||
|
@ -82,5 +82,5 @@ public:
|
|||
|
||||
void CommitPages(const GSVector2i& region, bool commit) final;
|
||||
|
||||
uint32 GetMemUsage();
|
||||
u32 GetMemUsage();
|
||||
};
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include "GLState.h"
|
||||
|
||||
#ifdef ENABLE_OGL_DEBUG_MEM_BW
|
||||
extern uint64 g_uniform_upload_byte;
|
||||
extern u64 g_uniform_upload_byte;
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -26,11 +26,11 @@ class GSUniformBufferOGL
|
|||
{
|
||||
GLuint m_buffer; // data object
|
||||
GLuint m_index; // GLSL slot
|
||||
uint32 m_size; // size of the data
|
||||
uint8* m_cache; // content of the previous upload
|
||||
u32 m_size; // size of the data
|
||||
u8* m_cache; // content of the previous upload
|
||||
|
||||
public:
|
||||
GSUniformBufferOGL(const std::string& pretty_name, GLuint index, uint32 size)
|
||||
GSUniformBufferOGL(const std::string& pretty_name, GLuint index, u32 size)
|
||||
: m_index(index), m_size(size)
|
||||
{
|
||||
glGenBuffers(1, &m_buffer);
|
||||
|
@ -38,7 +38,7 @@ public:
|
|||
glObjectLabel(GL_BUFFER, m_buffer, pretty_name.size(), pretty_name.c_str());
|
||||
allocate();
|
||||
attach();
|
||||
m_cache = (uint8*)_aligned_malloc(m_size, 32);
|
||||
m_cache = (u8*)_aligned_malloc(m_size, 32);
|
||||
memset(m_cache, 0, m_size);
|
||||
}
|
||||
|
||||
|
|
|
@ -103,14 +103,14 @@ void GSDrawScanline::BeginDraw(const GSRasterizerData* data)
|
|||
m_sp = m_sp_map[sel];
|
||||
}
|
||||
|
||||
void GSDrawScanline::EndDraw(uint64 frame, uint64 ticks, int actual, int total, int prims)
|
||||
void GSDrawScanline::EndDraw(u64 frame, u64 ticks, int actual, int total, int prims)
|
||||
{
|
||||
m_ds_map.UpdateStats(frame, ticks, actual, total, prims);
|
||||
}
|
||||
|
||||
#ifndef ENABLE_JIT_RASTERIZER
|
||||
|
||||
void GSDrawScanline::SetupPrim(const GSVertexSW* vertex, const uint32* index, const GSVertexSW& dscan)
|
||||
void GSDrawScanline::SetupPrim(const GSVertexSW* vertex, const u32* index, const GSVertexSW& dscan)
|
||||
{
|
||||
GSScanlineSelector sel = m_global.sel;
|
||||
|
||||
|
@ -162,7 +162,7 @@ void GSDrawScanline::SetupPrim(const GSVertexSW* vertex, const uint32* index, co
|
|||
|
||||
if (has_z)
|
||||
{
|
||||
m_local.p.z = vertex[index[1]].t.u32[3]; // uint32 z is bypassed in t.w
|
||||
m_local.p.z = vertex[index[1]].t.U32[3]; // u32 z is bypassed in t.w
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -315,7 +315,7 @@ void GSDrawScanline::SetupPrim(const GSVertexSW* vertex, const uint32* index, co
|
|||
|
||||
if (has_z)
|
||||
{
|
||||
m_local.p.z = vertex[index[1]].t.u32[3]; // uint32 z is bypassed in t.w
|
||||
m_local.p.z = vertex[index[1]].t.U32[3]; // u32 z is bypassed in t.w
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -564,8 +564,8 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
if (sel.ztest)
|
||||
{
|
||||
zd = GSVector8i::load(
|
||||
(uint8*)m_global.vm + za * 2, (uint8*)m_global.vm + za * 2 + 16,
|
||||
(uint8*)m_global.vm + za * 2 + 32, (uint8*)m_global.vm + za * 2 + 48);
|
||||
(u8*)m_global.vm + za * 2, (u8*)m_global.vm + za * 2 + 16,
|
||||
(u8*)m_global.vm + za * 2 + 32, (u8*)m_global.vm + za * 2 + 48);
|
||||
|
||||
switch (sel.zpsm)
|
||||
{
|
||||
|
@ -717,24 +717,24 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
const uint8* tex = (const uint8*)m_global.tex[lodi.u32[i]];
|
||||
const u8* tex = (const u8*)m_global.tex[lodi.U32[i]];
|
||||
|
||||
c00.u32[i] = m_global.clut[tex[addr00.u32[i]]];
|
||||
c01.u32[i] = m_global.clut[tex[addr01.u32[i]]];
|
||||
c10.u32[i] = m_global.clut[tex[addr10.u32[i]]];
|
||||
c11.u32[i] = m_global.clut[tex[addr11.u32[i]]];
|
||||
c00.U32[i] = m_global.clut[tex[addr00.U32[i]]];
|
||||
c01.U32[i] = m_global.clut[tex[addr01.U32[i]]];
|
||||
c10.U32[i] = m_global.clut[tex[addr10.U32[i]]];
|
||||
c11.U32[i] = m_global.clut[tex[addr11.U32[i]]];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
const uint32* tex = (const uint32*)m_global.tex[lodi.u32[i]];
|
||||
const u32* tex = (const u32*)m_global.tex[lodi.U32[i]];
|
||||
|
||||
c00.u32[i] = tex[addr00.u32[i]];
|
||||
c01.u32[i] = tex[addr01.u32[i]];
|
||||
c10.u32[i] = tex[addr10.u32[i]];
|
||||
c11.u32[i] = tex[addr11.u32[i]];
|
||||
c00.U32[i] = tex[addr00.U32[i]];
|
||||
c01.U32[i] = tex[addr01.U32[i]];
|
||||
c10.U32[i] = tex[addr10.U32[i]];
|
||||
c11.U32[i] = tex[addr11.U32[i]];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -765,14 +765,14 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
c00.u32[i] = m_global.clut[((const uint8*)m_global.tex[lodi.u32[i]])[addr00.u32[i]]];
|
||||
c00.U32[i] = m_global.clut[((const u8*)m_global.tex[lodi.U32[i]])[addr00.U32[i]]];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
c00.u32[i] = ((const uint32*)m_global.tex[lodi.u32[i]])[addr00.u32[i]];
|
||||
c00.U32[i] = ((const u32*)m_global.tex[lodi.U32[i]])[addr00.U32[i]];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -838,24 +838,24 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
const uint8* tex = (const uint8*)m_global.tex[lodi.u32[i]];
|
||||
const u8* tex = (const u8*)m_global.tex[lodi.U32[i]];
|
||||
|
||||
c00.u32[i] = m_global.clut[tex[addr00.u32[i]]];
|
||||
c01.u32[i] = m_global.clut[tex[addr01.u32[i]]];
|
||||
c10.u32[i] = m_global.clut[tex[addr10.u32[i]]];
|
||||
c11.u32[i] = m_global.clut[tex[addr11.u32[i]]];
|
||||
c00.U32[i] = m_global.clut[tex[addr00.U32[i]]];
|
||||
c01.U32[i] = m_global.clut[tex[addr01.U32[i]]];
|
||||
c10.U32[i] = m_global.clut[tex[addr10.U32[i]]];
|
||||
c11.U32[i] = m_global.clut[tex[addr11.U32[i]]];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
const uint32* tex = (const uint32*)m_global.tex[lodi.u32[i]];
|
||||
const u32* tex = (const u32*)m_global.tex[lodi.U32[i]];
|
||||
|
||||
c00.u32[i] = tex[addr00.u32[i]];
|
||||
c01.u32[i] = tex[addr01.u32[i]];
|
||||
c10.u32[i] = tex[addr10.u32[i]];
|
||||
c11.u32[i] = tex[addr11.u32[i]];
|
||||
c00.U32[i] = tex[addr00.U32[i]];
|
||||
c01.U32[i] = tex[addr01.U32[i]];
|
||||
c10.U32[i] = tex[addr10.U32[i]];
|
||||
c11.U32[i] = tex[addr11.U32[i]];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -886,14 +886,14 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
c00.u32[i] = m_global.clut[((const uint8*)m_global.tex[lodi.u32[i]])[addr00.u32[i]]];
|
||||
c00.U32[i] = m_global.clut[((const u8*)m_global.tex[lodi.U32[i]])[addr00.U32[i]]];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
c00.u32[i] = ((const uint32*)m_global.tex[lodi.u32[i]])[addr00.u32[i]];
|
||||
c00.U32[i] = ((const u32*)m_global.tex[lodi.U32[i]])[addr00.U32[i]];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -977,7 +977,7 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
|
||||
if (sel.tlu)
|
||||
{
|
||||
const uint8* tex = (const uint8*)m_global.tex[0];
|
||||
const u8* tex = (const u8*)m_global.tex[0];
|
||||
|
||||
c00 = addr00.gather32_32(tex, m_global.clut);
|
||||
c01 = addr01.gather32_32(tex, m_global.clut);
|
||||
|
@ -986,7 +986,7 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
}
|
||||
else
|
||||
{
|
||||
const uint32* tex = (const uint32*)m_global.tex[0];
|
||||
const u32* tex = (const u32*)m_global.tex[0];
|
||||
|
||||
c00 = addr00.gather32_32(tex);
|
||||
c01 = addr01.gather32_32(tex);
|
||||
|
@ -1019,11 +1019,11 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
|
||||
if (sel.tlu)
|
||||
{
|
||||
c00 = addr00.gather32_32((const uint8*)m_global.tex[0], m_global.clut);
|
||||
c00 = addr00.gather32_32((const u8*)m_global.tex[0], m_global.clut);
|
||||
}
|
||||
else
|
||||
{
|
||||
c00 = addr00.gather32_32((const uint32*)m_global.tex[0]);
|
||||
c00 = addr00.gather32_32((const u32*)m_global.tex[0]);
|
||||
}
|
||||
|
||||
rb = c00.sll16(8).srl16(8);
|
||||
|
@ -1149,8 +1149,8 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
if (sel.rfb)
|
||||
{
|
||||
fd = GSVector8i::load(
|
||||
(uint8*)m_global.vm + fa * 2, (uint8*)m_global.vm + fa * 2 + 16,
|
||||
(uint8*)m_global.vm + fa * 2 + 32, (uint8*)m_global.vm + fa * 2 + 48);
|
||||
(u8*)m_global.vm + fa * 2, (u8*)m_global.vm + fa * 2 + 16,
|
||||
(u8*)m_global.vm + fa * 2 + 32, (u8*)m_global.vm + fa * 2 + 48);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1234,10 +1234,10 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
if (fast)
|
||||
{
|
||||
GSVector4i::storel((uint8*)m_global.vm + za * 2, zs.extract<0>());
|
||||
GSVector4i::storeh((uint8*)m_global.vm + za * 2 + 16, zs.extract<0>());
|
||||
GSVector4i::storel((uint8*)m_global.vm + za * 2 + 32, zs.extract<1>());
|
||||
GSVector4i::storeh((uint8*)m_global.vm + za * 2 + 48, zs.extract<1>());
|
||||
GSVector4i::storel((u8*)m_global.vm + za * 2, zs.extract<0>());
|
||||
GSVector4i::storeh((u8*)m_global.vm + za * 2 + 16, zs.extract<0>());
|
||||
GSVector4i::storel((u8*)m_global.vm + za * 2 + 32, zs.extract<1>());
|
||||
GSVector4i::storeh((u8*)m_global.vm + za * 2 + 48, zs.extract<1>());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1255,10 +1255,10 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
if (fast)
|
||||
{
|
||||
if (fzm & 0x00000f00) GSVector4i::storel((uint8*)m_global.vm + za * 2, zs.extract<0>());
|
||||
if (fzm & 0x0000f000) GSVector4i::storeh((uint8*)m_global.vm + za * 2 + 16, zs.extract<0>());
|
||||
if (fzm & 0x0f000000) GSVector4i::storel((uint8*)m_global.vm + za * 2 + 32, zs.extract<1>());
|
||||
if (fzm & 0xf0000000) GSVector4i::storeh((uint8*)m_global.vm + za * 2 + 48, zs.extract<1>());
|
||||
if (fzm & 0x00000f00) GSVector4i::storel((u8*)m_global.vm + za * 2, zs.extract<0>());
|
||||
if (fzm & 0x0000f000) GSVector4i::storeh((u8*)m_global.vm + za * 2 + 16, zs.extract<0>());
|
||||
if (fzm & 0x0f000000) GSVector4i::storel((u8*)m_global.vm + za * 2 + 32, zs.extract<1>());
|
||||
if (fzm & 0xf0000000) GSVector4i::storeh((u8*)m_global.vm + za * 2 + 48, zs.extract<1>());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1443,10 +1443,10 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
if (fast)
|
||||
{
|
||||
GSVector4i::storel((uint8*)m_global.vm + fa * 2, fs.extract<0>());
|
||||
GSVector4i::storeh((uint8*)m_global.vm + fa * 2 + 16, fs.extract<0>());
|
||||
GSVector4i::storel((uint8*)m_global.vm + fa * 2 + 32, fs.extract<1>());
|
||||
GSVector4i::storeh((uint8*)m_global.vm + fa * 2 + 48, fs.extract<1>());
|
||||
GSVector4i::storel((u8*)m_global.vm + fa * 2, fs.extract<0>());
|
||||
GSVector4i::storeh((u8*)m_global.vm + fa * 2 + 16, fs.extract<0>());
|
||||
GSVector4i::storel((u8*)m_global.vm + fa * 2 + 32, fs.extract<1>());
|
||||
GSVector4i::storeh((u8*)m_global.vm + fa * 2 + 48, fs.extract<1>());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1464,10 +1464,10 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
if (fast)
|
||||
{
|
||||
if (fzm & 0x0000000f) GSVector4i::storel((uint8*)m_global.vm + fa * 2, fs.extract<0>());
|
||||
if (fzm & 0x000000f0) GSVector4i::storeh((uint8*)m_global.vm + fa * 2 + 16, fs.extract<0>());
|
||||
if (fzm & 0x000f0000) GSVector4i::storel((uint8*)m_global.vm + fa * 2 + 32, fs.extract<1>());
|
||||
if (fzm & 0x00f00000) GSVector4i::storeh((uint8*)m_global.vm + fa * 2 + 48, fs.extract<1>());
|
||||
if (fzm & 0x0000000f) GSVector4i::storel((u8*)m_global.vm + fa * 2, fs.extract<0>());
|
||||
if (fzm & 0x000000f0) GSVector4i::storeh((u8*)m_global.vm + fa * 2 + 16, fs.extract<0>());
|
||||
if (fzm & 0x000f0000) GSVector4i::storel((u8*)m_global.vm + fa * 2 + 32, fs.extract<1>());
|
||||
if (fzm & 0x00f00000) GSVector4i::storeh((u8*)m_global.vm + fa * 2 + 48, fs.extract<1>());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1688,7 +1688,7 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
|
||||
if (sel.ztest)
|
||||
{
|
||||
zd = GSVector4i::load((uint8*)m_global.vm + za * 2, (uint8*)m_global.vm + za * 2 + 16);
|
||||
zd = GSVector4i::load((u8*)m_global.vm + za * 2, (u8*)m_global.vm + za * 2 + 16);
|
||||
|
||||
switch (sel.zpsm)
|
||||
{
|
||||
|
@ -1710,10 +1710,10 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
const unsigned int z_max = 0xffffffff >> (sel.zpsm * 8);
|
||||
|
||||
zso.u32[0] = std::min(z_max, zso.u32[0]);
|
||||
zso.u32[1] = std::min(z_max, zso.u32[1]);
|
||||
zso.u32[2] = std::min(z_max, zso.u32[2]);
|
||||
zso.u32[3] = std::min(z_max, zso.u32[3]);
|
||||
zso.U32[0] = std::min(z_max, zso.U32[0]);
|
||||
zso.U32[1] = std::min(z_max, zso.U32[1]);
|
||||
zso.U32[2] = std::min(z_max, zso.U32[2]);
|
||||
zso.U32[3] = std::min(z_max, zso.U32[3]);
|
||||
}
|
||||
|
||||
switch (sel.ztst)
|
||||
|
@ -1860,24 +1860,24 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
const uint8* tex = (const uint8*)m_global.tex[lodi.u32[i]];
|
||||
const u8* tex = (const u8*)m_global.tex[lodi.U32[i]];
|
||||
|
||||
c00.u32[i] = m_global.clut[tex[addr00.u32[i]]];
|
||||
c01.u32[i] = m_global.clut[tex[addr01.u32[i]]];
|
||||
c10.u32[i] = m_global.clut[tex[addr10.u32[i]]];
|
||||
c11.u32[i] = m_global.clut[tex[addr11.u32[i]]];
|
||||
c00.U32[i] = m_global.clut[tex[addr00.U32[i]]];
|
||||
c01.U32[i] = m_global.clut[tex[addr01.U32[i]]];
|
||||
c10.U32[i] = m_global.clut[tex[addr10.U32[i]]];
|
||||
c11.U32[i] = m_global.clut[tex[addr11.U32[i]]];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
const uint32* tex = (const uint32*)m_global.tex[lodi.u32[i]];
|
||||
const u32* tex = (const u32*)m_global.tex[lodi.U32[i]];
|
||||
|
||||
c00.u32[i] = tex[addr00.u32[i]];
|
||||
c01.u32[i] = tex[addr01.u32[i]];
|
||||
c10.u32[i] = tex[addr10.u32[i]];
|
||||
c11.u32[i] = tex[addr11.u32[i]];
|
||||
c00.U32[i] = tex[addr00.U32[i]];
|
||||
c01.U32[i] = tex[addr01.U32[i]];
|
||||
c10.U32[i] = tex[addr10.U32[i]];
|
||||
c11.U32[i] = tex[addr11.U32[i]];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1908,14 +1908,14 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
c00.u32[i] = m_global.clut[((const uint8*)m_global.tex[lodi.u32[i]])[addr00.u32[i]]];
|
||||
c00.U32[i] = m_global.clut[((const u8*)m_global.tex[lodi.U32[i]])[addr00.U32[i]]];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
c00.u32[i] = ((const uint32*)m_global.tex[lodi.u32[i]])[addr00.u32[i]];
|
||||
c00.U32[i] = ((const u32*)m_global.tex[lodi.U32[i]])[addr00.U32[i]];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1981,24 +1981,24 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
const uint8* tex = (const uint8*)m_global.tex[lodi.u32[i]];
|
||||
const u8* tex = (const u8*)m_global.tex[lodi.U32[i]];
|
||||
|
||||
c00.u32[i] = m_global.clut[tex[addr00.u32[i]]];
|
||||
c01.u32[i] = m_global.clut[tex[addr01.u32[i]]];
|
||||
c10.u32[i] = m_global.clut[tex[addr10.u32[i]]];
|
||||
c11.u32[i] = m_global.clut[tex[addr11.u32[i]]];
|
||||
c00.U32[i] = m_global.clut[tex[addr00.U32[i]]];
|
||||
c01.U32[i] = m_global.clut[tex[addr01.U32[i]]];
|
||||
c10.U32[i] = m_global.clut[tex[addr10.U32[i]]];
|
||||
c11.U32[i] = m_global.clut[tex[addr11.U32[i]]];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
const uint32* tex = (const uint32*)m_global.tex[lodi.u32[i]];
|
||||
const u32* tex = (const u32*)m_global.tex[lodi.U32[i]];
|
||||
|
||||
c00.u32[i] = tex[addr00.u32[i]];
|
||||
c01.u32[i] = tex[addr01.u32[i]];
|
||||
c10.u32[i] = tex[addr10.u32[i]];
|
||||
c11.u32[i] = tex[addr11.u32[i]];
|
||||
c00.U32[i] = tex[addr00.U32[i]];
|
||||
c01.U32[i] = tex[addr01.U32[i]];
|
||||
c10.U32[i] = tex[addr10.U32[i]];
|
||||
c11.U32[i] = tex[addr11.U32[i]];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2029,14 +2029,14 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
c00.u32[i] = m_global.clut[((const uint8*)m_global.tex[lodi.u32[i]])[addr00.u32[i]]];
|
||||
c00.U32[i] = m_global.clut[((const u8*)m_global.tex[lodi.U32[i]])[addr00.U32[i]]];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
c00.u32[i] = ((const uint32*)m_global.tex[lodi.u32[i]])[addr00.u32[i]];
|
||||
c00.U32[i] = ((const u32*)m_global.tex[lodi.U32[i]])[addr00.U32[i]];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2117,7 +2117,7 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
|
||||
if (sel.tlu)
|
||||
{
|
||||
const uint8* tex = (const uint8*)m_global.tex[0];
|
||||
const u8* tex = (const u8*)m_global.tex[0];
|
||||
|
||||
c00 = addr00.gather32_32(tex, m_global.clut);
|
||||
c01 = addr01.gather32_32(tex, m_global.clut);
|
||||
|
@ -2126,7 +2126,7 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
}
|
||||
else
|
||||
{
|
||||
const uint32* tex = (const uint32*)m_global.tex[0];
|
||||
const u32* tex = (const u32*)m_global.tex[0];
|
||||
|
||||
c00 = addr00.gather32_32(tex);
|
||||
c01 = addr01.gather32_32(tex);
|
||||
|
@ -2159,11 +2159,11 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
|
||||
if (sel.tlu)
|
||||
{
|
||||
c00 = addr00.gather32_32((const uint8*)m_global.tex[0], m_global.clut);
|
||||
c00 = addr00.gather32_32((const u8*)m_global.tex[0], m_global.clut);
|
||||
}
|
||||
else
|
||||
{
|
||||
c00 = addr00.gather32_32((const uint32*)m_global.tex[0]);
|
||||
c00 = addr00.gather32_32((const u32*)m_global.tex[0]);
|
||||
}
|
||||
|
||||
rb = c00.sll16(8).srl16(8);
|
||||
|
@ -2285,7 +2285,7 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
|
||||
if (sel.rfb)
|
||||
{
|
||||
fd = GSVector4i::load((uint8*)m_global.vm + fa * 2, (uint8*)m_global.vm + fa * 2 + 16);
|
||||
fd = GSVector4i::load((u8*)m_global.vm + fa * 2, (u8*)m_global.vm + fa * 2 + 16);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2364,10 +2364,10 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
const unsigned int z_max = 0xffffffff >> (sel.zpsm * 8);
|
||||
|
||||
zs.u32[0] = std::min(z_max, zs.u32[0]);
|
||||
zs.u32[1] = std::min(z_max, zs.u32[1]);
|
||||
zs.u32[2] = std::min(z_max, zs.u32[2]);
|
||||
zs.u32[3] = std::min(z_max, zs.u32[3]);
|
||||
zs.U32[0] = std::min(z_max, zs.U32[0]);
|
||||
zs.U32[1] = std::min(z_max, zs.U32[1]);
|
||||
zs.U32[2] = std::min(z_max, zs.U32[2]);
|
||||
zs.U32[3] = std::min(z_max, zs.U32[3]);
|
||||
}
|
||||
|
||||
bool fast = sel.ztest ? sel.zpsm < 2 : sel.zpsm == 0 && sel.notest;
|
||||
|
@ -2376,8 +2376,8 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
if (fast)
|
||||
{
|
||||
GSVector4i::storel((uint8*)m_global.vm + za * 2, zs);
|
||||
GSVector4i::storeh((uint8*)m_global.vm + za * 2 + 16, zs);
|
||||
GSVector4i::storel((u8*)m_global.vm + za * 2, zs);
|
||||
GSVector4i::storeh((u8*)m_global.vm + za * 2 + 16, zs);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2391,8 +2391,8 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
if (fast)
|
||||
{
|
||||
if (fzm & 0x0f00) GSVector4i::storel((uint8*)m_global.vm + za * 2, zs);
|
||||
if (fzm & 0xf000) GSVector4i::storeh((uint8*)m_global.vm + za * 2 + 16, zs);
|
||||
if (fzm & 0x0f00) GSVector4i::storel((u8*)m_global.vm + za * 2, zs);
|
||||
if (fzm & 0xf000) GSVector4i::storeh((u8*)m_global.vm + za * 2 + 16, zs);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2573,8 +2573,8 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
if (fast)
|
||||
{
|
||||
GSVector4i::storel((uint8*)m_global.vm + fa * 2, fs);
|
||||
GSVector4i::storeh((uint8*)m_global.vm + fa * 2 + 16, fs);
|
||||
GSVector4i::storel((u8*)m_global.vm + fa * 2, fs);
|
||||
GSVector4i::storeh((u8*)m_global.vm + fa * 2 + 16, fs);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2588,8 +2588,8 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
{
|
||||
if (fast)
|
||||
{
|
||||
if (fzm & 0x000f) GSVector4i::storel((uint8*)m_global.vm + fa * 2, fs);
|
||||
if (fzm & 0x00f0) GSVector4i::storeh((uint8*)m_global.vm + fa * 2 + 16, fs);
|
||||
if (fzm & 0x000f) GSVector4i::storel((u8*)m_global.vm + fa * 2, fs);
|
||||
if (fzm & 0x00f0) GSVector4i::storeh((u8*)m_global.vm + fa * 2 + 16, fs);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2675,8 +2675,8 @@ void GSDrawScanline::DrawScanline(int pixels, int left, int top, const GSVertexS
|
|||
|
||||
void GSDrawScanline::DrawEdge(int pixels, int left, int top, const GSVertexSW& scan)
|
||||
{
|
||||
uint32 zwrite = m_global.sel.zwrite;
|
||||
uint32 edge = m_global.sel.edge;
|
||||
u32 zwrite = m_global.sel.zwrite;
|
||||
u32 edge = m_global.sel.edge;
|
||||
|
||||
m_global.sel.zwrite = 0;
|
||||
m_global.sel.edge = 1;
|
||||
|
@ -2774,20 +2774,20 @@ bool GSDrawScanline::TestAlpha(T& test, T& fm, T& zm, const T& ga)
|
|||
static const int s_offsets[] = {0, 2, 8, 10, 16, 18, 24, 26}; // columnTable16[0]
|
||||
|
||||
template <class T>
|
||||
void GSDrawScanline::WritePixel(const T& src, int addr, int i, uint32 psm)
|
||||
void GSDrawScanline::WritePixel(const T& src, int addr, int i, u32 psm)
|
||||
{
|
||||
uint8* dst = (uint8*)m_global.vm + addr * 2 + s_offsets[i] * 2;
|
||||
u8* dst = (u8*)m_global.vm + addr * 2 + s_offsets[i] * 2;
|
||||
|
||||
switch (psm)
|
||||
{
|
||||
case 0:
|
||||
*(uint32*)dst = src.u32[i];
|
||||
*(u32*)dst = src.U32[i];
|
||||
break;
|
||||
case 1:
|
||||
*(uint32*)dst = (src.u32[i] & 0xffffff) | (*(uint32*)dst & 0xff000000);
|
||||
*(u32*)dst = (src.U32[i] & 0xffffff) | (*(u32*)dst & 0xff000000);
|
||||
break;
|
||||
case 2:
|
||||
*(uint16*)dst = src.u16[i * 2];
|
||||
*(u16*)dst = src.u16[i * 2];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2801,38 +2801,38 @@ void GSDrawScanline::DrawRect(const GSVector4i& r, const GSVertexSW& v)
|
|||
|
||||
// FIXME: sometimes the frame and z buffer may overlap, the outcome is undefined
|
||||
|
||||
uint32 m;
|
||||
u32 m;
|
||||
|
||||
#if _M_SSE >= 0x501
|
||||
m = m_global.zm;
|
||||
#else
|
||||
m = m_global.zm.u32[0];
|
||||
m = m_global.zm.U32[0];
|
||||
#endif
|
||||
|
||||
if (m != 0xffffffff)
|
||||
{
|
||||
uint32 z = v.t.u32[3]; // (uint32)v.p.z;
|
||||
u32 z = v.t.U32[3]; // (u32)v.p.z;
|
||||
|
||||
if (m_global.sel.zpsm != 2)
|
||||
{
|
||||
if (m == 0)
|
||||
{
|
||||
DrawRectT<uint32, false>(m_global.zbo, r, z, m);
|
||||
DrawRectT<u32, false>(m_global.zbo, r, z, m);
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawRectT<uint32, true>(m_global.zbo, r, z, m);
|
||||
DrawRectT<u32, true>(m_global.zbo, r, z, m);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((m & 0xffff) == 0)
|
||||
{
|
||||
DrawRectT<uint16, false>(m_global.zbo, r, z, m);
|
||||
DrawRectT<u16, false>(m_global.zbo, r, z, m);
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawRectT<uint16, true>(m_global.zbo, r, z, m);
|
||||
DrawRectT<u16, true>(m_global.zbo, r, z, m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2840,12 +2840,12 @@ void GSDrawScanline::DrawRect(const GSVector4i& r, const GSVertexSW& v)
|
|||
#if _M_SSE >= 0x501
|
||||
m = m_global.fm;
|
||||
#else
|
||||
m = m_global.fm.u32[0];
|
||||
m = m_global.fm.U32[0];
|
||||
#endif
|
||||
|
||||
if (m != 0xffffffff)
|
||||
{
|
||||
uint32 c = (GSVector4i(v.c) >> 7).rgba32();
|
||||
u32 c = (GSVector4i(v.c) >> 7).rgba32();
|
||||
|
||||
if (m_global.sel.fba)
|
||||
{
|
||||
|
@ -2856,11 +2856,11 @@ void GSDrawScanline::DrawRect(const GSVector4i& r, const GSVertexSW& v)
|
|||
{
|
||||
if (m == 0)
|
||||
{
|
||||
DrawRectT<uint32, false>(m_global.fbo, r, c, m);
|
||||
DrawRectT<u32, false>(m_global.fbo, r, c, m);
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawRectT<uint32, true>(m_global.fbo, r, c, m);
|
||||
DrawRectT<u32, true>(m_global.fbo, r, c, m);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -2869,18 +2869,18 @@ void GSDrawScanline::DrawRect(const GSVector4i& r, const GSVertexSW& v)
|
|||
|
||||
if ((m & 0xffff) == 0)
|
||||
{
|
||||
DrawRectT<uint16, false>(m_global.fbo, r, c, m);
|
||||
DrawRectT<u16, false>(m_global.fbo, r, c, m);
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawRectT<uint16, true>(m_global.fbo, r, c, m);
|
||||
DrawRectT<u16, true>(m_global.fbo, r, c, m);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <class T, bool masked>
|
||||
void GSDrawScanline::DrawRectT(const GSOffset& off, const GSVector4i& r, uint32 c, uint32 m)
|
||||
void GSDrawScanline::DrawRectT(const GSOffset& off, const GSVector4i& r, u32 c, u32 m)
|
||||
{
|
||||
if (m == 0xffffffff)
|
||||
return;
|
||||
|
@ -2897,7 +2897,7 @@ void GSDrawScanline::DrawRectT(const GSOffset& off, const GSVector4i& r, uint32
|
|||
|
||||
#endif
|
||||
|
||||
if (sizeof(T) == sizeof(uint16))
|
||||
if (sizeof(T) == sizeof(u16))
|
||||
{
|
||||
color = color.xxzzlh();
|
||||
mask = mask.xxzzlh();
|
||||
|
@ -2909,7 +2909,7 @@ void GSDrawScanline::DrawRectT(const GSOffset& off, const GSVector4i& r, uint32
|
|||
c = c & (~m);
|
||||
|
||||
if (masked)
|
||||
ASSERT(mask.u32[0] != 0);
|
||||
ASSERT(mask.U32[0] != 0);
|
||||
|
||||
GSVector4i br = r.ralign<Align_Inside>(GSVector2i(8 * 4 / sizeof(T), 8));
|
||||
|
||||
|
@ -2933,7 +2933,7 @@ void GSDrawScanline::DrawRectT(const GSOffset& off, const GSVector4i& r, uint32
|
|||
}
|
||||
|
||||
template <class T, bool masked>
|
||||
void GSDrawScanline::FillRect(const GSOffset& off, const GSVector4i& r, uint32 c, uint32 m)
|
||||
void GSDrawScanline::FillRect(const GSOffset& off, const GSVector4i& r, u32 c, u32 m)
|
||||
{
|
||||
if (r.x >= r.z)
|
||||
return;
|
||||
|
|
|
@ -34,14 +34,14 @@ protected:
|
|||
GSScanlineGlobalData m_global;
|
||||
GSScanlineLocalData m_local;
|
||||
|
||||
GSCodeGeneratorFunctionMap<GSSetupPrimCodeGenerator, uint64, SetupPrimPtr> m_sp_map;
|
||||
GSCodeGeneratorFunctionMap<GSDrawScanlineCodeGenerator, uint64, DrawScanlinePtr> m_ds_map;
|
||||
GSCodeGeneratorFunctionMap<GSSetupPrimCodeGenerator, u64, SetupPrimPtr> m_sp_map;
|
||||
GSCodeGeneratorFunctionMap<GSDrawScanlineCodeGenerator, u64, DrawScanlinePtr> m_ds_map;
|
||||
|
||||
template <class T, bool masked>
|
||||
void DrawRectT(const GSOffset& off, const GSVector4i& r, uint32 c, uint32 m);
|
||||
void DrawRectT(const GSOffset& off, const GSVector4i& r, u32 c, u32 m);
|
||||
|
||||
template <class T, bool masked>
|
||||
__forceinline void FillRect(const GSOffset& off, const GSVector4i& r, uint32 c, uint32 m);
|
||||
__forceinline void FillRect(const GSOffset& off, const GSVector4i& r, u32 c, u32 m);
|
||||
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
|
@ -62,13 +62,13 @@ public:
|
|||
// IDrawScanline
|
||||
|
||||
void BeginDraw(const GSRasterizerData* data);
|
||||
void EndDraw(uint64 frame, uint64 ticks, int actual, int total, int prims);
|
||||
void EndDraw(u64 frame, u64 ticks, int actual, int total, int prims);
|
||||
|
||||
void DrawRect(const GSVector4i& r, const GSVertexSW& v);
|
||||
|
||||
#ifndef ENABLE_JIT_RASTERIZER
|
||||
|
||||
void SetupPrim(const GSVertexSW* vertex, const uint32* index, const GSVertexSW& dscan);
|
||||
void SetupPrim(const GSVertexSW* vertex, const u32* index, const GSVertexSW& dscan);
|
||||
void DrawScanline(int pixels, int left, int top, const GSVertexSW& scan);
|
||||
void DrawEdge(int pixels, int left, int top, const GSVertexSW& scan);
|
||||
|
||||
|
@ -76,7 +76,7 @@ public:
|
|||
bool IsRect() const { return m_global.sel.IsSolidRect(); }
|
||||
|
||||
template<class T> bool TestAlpha(T& test, T& fm, T& zm, const T& ga);
|
||||
template<class T> void WritePixel(const T& src, int addr, int i, uint32 psm);
|
||||
template<class T> void WritePixel(const T& src, int addr, int i, u32 psm);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ using namespace Xbyak;
|
|||
#define _rip_local_d_p(x) _rip_local_d(x)
|
||||
#endif
|
||||
|
||||
GSDrawScanlineCodeGenerator2::GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, uint64 key)
|
||||
GSDrawScanlineCodeGenerator2::GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, u64 key)
|
||||
: _parent(base, cpu)
|
||||
, m_local(*(GSScanlineLocalData*)param)
|
||||
, m_rip(false)
|
||||
|
@ -201,7 +201,7 @@ void GSDrawScanlineCodeGenerator2::broadcastGPRToVec(const XYm& vec, const Xbyak
|
|||
#endif
|
||||
}
|
||||
|
||||
void GSDrawScanlineCodeGenerator2::modulate16(const XYm& a, const Operand& f, uint8 shift)
|
||||
void GSDrawScanlineCodeGenerator2::modulate16(const XYm& a, const Operand& f, u8 shift)
|
||||
{
|
||||
if (shift == 0)
|
||||
{
|
||||
|
@ -214,7 +214,7 @@ void GSDrawScanlineCodeGenerator2::modulate16(const XYm& a, const Operand& f, ui
|
|||
}
|
||||
}
|
||||
|
||||
void GSDrawScanlineCodeGenerator2::lerp16(const XYm& a, const XYm& b, const XYm& f, uint8 shift)
|
||||
void GSDrawScanlineCodeGenerator2::lerp16(const XYm& a, const XYm& b, const XYm& f, u8 shift)
|
||||
{
|
||||
psubw(a, b);
|
||||
modulate16(a, f, shift);
|
||||
|
@ -251,7 +251,7 @@ void GSDrawScanlineCodeGenerator2::clamp16(const XYm& a, const XYm& temp)
|
|||
|
||||
void GSDrawScanlineCodeGenerator2::alltrue(const XYm& test)
|
||||
{
|
||||
uint32 mask = test.isYMM() ? 0xffffffff : 0xffff;
|
||||
u32 mask = test.isYMM() ? 0xffffffff : 0xffff;
|
||||
pmovmskb(eax, test);
|
||||
cmp(eax, mask);
|
||||
je("step", GSCodeGenerator::T_NEAR);
|
||||
|
@ -1215,7 +1215,7 @@ void GSDrawScanlineCodeGenerator2::TestZ(const XYm& temp1, const XYm& temp2)
|
|||
|
||||
if (m_sel.zclamp)
|
||||
{
|
||||
const uint8 amt = (uint8)((m_sel.zpsm & 0x3) * 8);
|
||||
const u8 amt = (u8)((m_sel.zpsm & 0x3) * 8);
|
||||
pcmpeqd(temp1, temp1);
|
||||
psrld(temp1, amt);
|
||||
pminsd(xym0, temp1);
|
||||
|
@ -1244,8 +1244,8 @@ void GSDrawScanlineCodeGenerator2::TestZ(const XYm& temp1, const XYm& temp2)
|
|||
|
||||
if (m_sel.zpsm)
|
||||
{
|
||||
pslld(temp2, static_cast<uint8>(m_sel.zpsm * 8));
|
||||
psrld(temp2, static_cast<uint8>(m_sel.zpsm * 8));
|
||||
pslld(temp2, static_cast<u8>(m_sel.zpsm * 8));
|
||||
psrld(temp2, static_cast<u8>(m_sel.zpsm * 8));
|
||||
}
|
||||
|
||||
if (m_sel.zoverflow || m_sel.zpsm == 0)
|
||||
|
@ -1415,7 +1415,7 @@ void GSDrawScanlineCodeGenerator2::SampleTexture_TexelReadHelper(int mip_offset)
|
|||
|
||||
THREEARG(punpcklwd, xym5, xym2, xym0);
|
||||
punpckhwd(xym2, xym0);
|
||||
pslld(xym2, static_cast<uint8>(m_sel.tw + 3));
|
||||
pslld(xym2, static_cast<u8>(m_sel.tw + 3));
|
||||
|
||||
// xym0 = 0
|
||||
// xym2 = y0
|
||||
|
@ -1432,7 +1432,7 @@ void GSDrawScanlineCodeGenerator2::SampleTexture_TexelReadHelper(int mip_offset)
|
|||
|
||||
THREEARG(punpcklwd, xym1, xym3, xym0);
|
||||
punpckhwd(xym3, xym0);
|
||||
pslld(xym3, static_cast<uint8>(m_sel.tw + 3));
|
||||
pslld(xym3, static_cast<u8>(m_sel.tw + 3));
|
||||
|
||||
// xym1 = x1
|
||||
// xym2 = y0
|
||||
|
@ -1460,10 +1460,10 @@ void GSDrawScanlineCodeGenerator2::SampleTexture_TexelReadHelper(int mip_offset)
|
|||
// xym7 = used[x86] vf[x64&&!needsMoreRegs]
|
||||
// Free: xym4, xym5
|
||||
|
||||
// c00 = addr00.gather32_32((const uint32/uint8*)tex[, clut]);
|
||||
// c01 = addr01.gather32_32((const uint32/uint8*)tex[, clut]);
|
||||
// c10 = addr10.gather32_32((const uint32/uint8*)tex[, clut]);
|
||||
// c11 = addr11.gather32_32((const uint32/uint8*)tex[, clut]);
|
||||
// c00 = addr00.gather32_32((const u32/u8*)tex[, clut]);
|
||||
// c01 = addr01.gather32_32((const u32/u8*)tex[, clut]);
|
||||
// c10 = addr10.gather32_32((const u32/u8*)tex[, clut]);
|
||||
// c11 = addr11.gather32_32((const u32/u8*)tex[, clut]);
|
||||
|
||||
const XYm& tmp1 = is64 ? xym7 : xym4; // OK to destroy if needsMoreRegs
|
||||
const XYm& tmp2 = is64 ? xym4 : xym7;
|
||||
|
@ -1559,7 +1559,7 @@ void GSDrawScanlineCodeGenerator2::SampleTexture_TexelReadHelper(int mip_offset)
|
|||
|
||||
paddd(xym2, xym5);
|
||||
|
||||
// c00 = addr00.gather32_32((const uint32/uint8*)tex[, clut]);
|
||||
// c00 = addr00.gather32_32((const u32/u8*)tex[, clut]);
|
||||
|
||||
ReadTexel1(xym5, xym2, xym0, xym1, mip_offset);
|
||||
|
||||
|
@ -1875,25 +1875,25 @@ void GSDrawScanlineCodeGenerator2::SampleTextureLOD()
|
|||
movdqa(xym5, xym2);
|
||||
movdqa(xym3, xym6);
|
||||
|
||||
movd(xym0, _rip_local(temp.lod.i.u32[0]));
|
||||
movd(xym0, _rip_local(temp.lod.i.U32[0]));
|
||||
psrad(xym2, xym0);
|
||||
THREEARG(psrlw, xym1, xym4, xym0);
|
||||
movq(_rip_local(temp.uv_minmax[0].u32[0]), xym1);
|
||||
movq(_rip_local(temp.uv_minmax[0].U32[0]), xym1);
|
||||
|
||||
movd(xym0, _rip_local(temp.lod.i.u32[1]));
|
||||
movd(xym0, _rip_local(temp.lod.i.U32[1]));
|
||||
psrad(xym5, xym0);
|
||||
THREEARG(psrlw, xym1, xym4, xym0);
|
||||
movq(_rip_local(temp.uv_minmax[1].u32[0]), xym1);
|
||||
movq(_rip_local(temp.uv_minmax[1].U32[0]), xym1);
|
||||
|
||||
movd(xym0, _rip_local(temp.lod.i.u32[2]));
|
||||
movd(xym0, _rip_local(temp.lod.i.U32[2]));
|
||||
psrad(xym3, xym0);
|
||||
THREEARG(psrlw, xym1, xym4, xym0);
|
||||
movq(_rip_local(temp.uv_minmax[0].u32[2]), xym1);
|
||||
movq(_rip_local(temp.uv_minmax[0].U32[2]), xym1);
|
||||
|
||||
movd(xym0, _rip_local(temp.lod.i.u32[3]));
|
||||
movd(xym0, _rip_local(temp.lod.i.U32[3]));
|
||||
psrad(xym6, xym0);
|
||||
THREEARG(psrlw, xym1, xym4, xym0);
|
||||
movq(_rip_local(temp.uv_minmax[1].u32[2]), xym1);
|
||||
movq(_rip_local(temp.uv_minmax[1].U32[2]), xym1);
|
||||
|
||||
punpckldq(xym2, xym3);
|
||||
punpckhdq(xym5, xym6);
|
||||
|
@ -1931,7 +1931,7 @@ void GSDrawScanlineCodeGenerator2::SampleTextureLOD()
|
|||
{
|
||||
// lod = K
|
||||
|
||||
movd(Xmm(xym0.getIdx()), _rip_global(lod.i.u32[0]));
|
||||
movd(Xmm(xym0.getIdx()), _rip_global(lod.i.U32[0]));
|
||||
|
||||
psrad(xym2, Xmm(xym0.getIdx()));
|
||||
psrad(xym3, Xmm(xym0.getIdx()));
|
||||
|
@ -2743,7 +2743,7 @@ void GSDrawScanlineCodeGenerator2::WriteZBuf()
|
|||
// Clamp Z to ZPSM_FMT_MAX
|
||||
if (m_sel.zclamp)
|
||||
{
|
||||
const uint8 amt = (uint8)((m_sel.zpsm & 0x3) * 8);
|
||||
const u8 amt = (u8)((m_sel.zpsm & 0x3) * 8);
|
||||
pcmpeqd(xym7, xym7);
|
||||
psrld(xym7, amt);
|
||||
pminsd(xym1, xym7);
|
||||
|
@ -3273,7 +3273,7 @@ void GSDrawScanlineCodeGenerator2::WritePixel(const XYm& src_, const AddressReg&
|
|||
}
|
||||
}
|
||||
|
||||
void GSDrawScanlineCodeGenerator2::WritePixel(const Xmm& src, const AddressReg& addr, uint8 i, uint8 j, int psm)
|
||||
void GSDrawScanlineCodeGenerator2::WritePixel(const Xmm& src, const AddressReg& addr, u8 i, u8 j, int psm)
|
||||
{
|
||||
constexpr int s_offsets[8] = {0, 2, 8, 10, 16, 18, 24, 26};
|
||||
|
||||
|
@ -3356,7 +3356,7 @@ void GSDrawScanlineCodeGenerator2::ReadTexelImpl(
|
|||
void GSDrawScanlineCodeGenerator2::ReadTexelImplLoadTexLOD(int lod, int mip_offset)
|
||||
{
|
||||
AddressReg texIn = is64 ? _64_m_local__gd__tex : t2;
|
||||
Address lod_addr = m_sel.lcm ? _rip_global(lod.i.u32[lod]) : _rip_local(temp.lod.i.u32[lod]);
|
||||
Address lod_addr = m_sel.lcm ? _rip_global(lod.i.U32[lod]) : _rip_local(temp.lod.i.U32[lod]);
|
||||
mov(ebx, lod_addr);
|
||||
mov(rbx, ptr[texIn + rbx * wordsize + mip_offset]);
|
||||
}
|
||||
|
@ -3483,7 +3483,7 @@ void GSDrawScanlineCodeGenerator2::ReadTexelImplSSE4(
|
|||
}
|
||||
}
|
||||
|
||||
void GSDrawScanlineCodeGenerator2::ReadTexelImpl(const Xmm& dst, const Xmm& addr, uint8 i, bool texInRBX, bool preserveDst)
|
||||
void GSDrawScanlineCodeGenerator2::ReadTexelImpl(const Xmm& dst, const Xmm& addr, u8 i, bool texInRBX, bool preserveDst)
|
||||
{
|
||||
ASSERT(i < 4);
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ class GSDrawScanlineCodeGenerator2 : public GSNewCodeGenerator
|
|||
}
|
||||
|
||||
public:
|
||||
GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, uint64 key);
|
||||
GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, u64 key);
|
||||
void Generate();
|
||||
|
||||
private:
|
||||
|
@ -120,8 +120,8 @@ private:
|
|||
void pbroadcastwLocal(const XYm& reg, const Xbyak::Address& mem);
|
||||
/// Broadcast a 32-bit GPR to a vector register
|
||||
void broadcastGPRToVec(const XYm& vec, const Xbyak::Reg32& gpr);
|
||||
void modulate16(const XYm& a, const Xbyak::Operand& f, uint8 shift);
|
||||
void lerp16(const XYm& a, const XYm& b, const XYm& f, uint8 shift);
|
||||
void modulate16(const XYm& a, const Xbyak::Operand& f, u8 shift);
|
||||
void lerp16(const XYm& a, const XYm& b, const XYm& f, u8 shift);
|
||||
void lerp16_4(const XYm& a, const XYm& b, const XYm& f);
|
||||
void mix16(const XYm& a, const XYm& b, const XYm& temp);
|
||||
void clamp16(const XYm& a, const XYm& temp);
|
||||
|
@ -159,7 +159,7 @@ private:
|
|||
#else
|
||||
void WritePixel(const XYm& src_, const AddressReg& addr, const Xbyak::Reg32& mask, bool fast, int psm, int fz);
|
||||
#endif
|
||||
void WritePixel(const Xmm& src, const AddressReg& addr, uint8 i, uint8 j, int psm);
|
||||
void WritePixel(const Xmm& src, const AddressReg& addr, u8 i, u8 j, int psm);
|
||||
void ReadTexel1(const XYm& dst, const XYm& src, const XYm& tmp1, const XYm& tmp2, int mip_offset);
|
||||
void ReadTexel4(
|
||||
const XYm& d0, const XYm& d1,
|
||||
|
@ -185,5 +185,5 @@ private:
|
|||
const Xmm& d2s0, const Xmm& d3s1,
|
||||
const Xmm& s2, const Xmm& s3,
|
||||
int pixels, int mip_offset);
|
||||
void ReadTexelImpl(const Xmm& dst, const Xmm& addr, uint8 i, bool texInA3, bool preserveDst);
|
||||
void ReadTexelImpl(const Xmm& dst, const Xmm& addr, u8 i, bool texInA3, bool preserveDst);
|
||||
};
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include "GSDrawScanlineCodeGenerator.all.h"
|
||||
|
||||
|
||||
GSDrawScanlineCodeGenerator::GSDrawScanlineCodeGenerator(void* param, uint64 key, void* code, size_t maxsize)
|
||||
GSDrawScanlineCodeGenerator::GSDrawScanlineCodeGenerator(void* param, u64 key, void* code, size_t maxsize)
|
||||
: GSCodeGenerator(code, maxsize)
|
||||
, m_local(*(GSScanlineLocalData*)param)
|
||||
, m_rip(false)
|
||||
|
|
|
@ -34,5 +34,5 @@ class GSDrawScanlineCodeGenerator : public GSCodeGenerator
|
|||
bool m_rip;
|
||||
|
||||
public:
|
||||
GSDrawScanlineCodeGenerator(void* param, uint64 key, void* code, size_t maxsize);
|
||||
GSDrawScanlineCodeGenerator(void* param, u64 key, void* code, size_t maxsize);
|
||||
};
|
||||
|
|
|
@ -89,7 +89,7 @@ public:
|
|||
"used SSE instruction in AVX code",
|
||||
"used AVX instruction in SSE code",
|
||||
};
|
||||
if (static_cast<uint32>(value) < (sizeof(tbl) / sizeof(*tbl)))
|
||||
if (static_cast<u32>(value) < (sizeof(tbl) / sizeof(*tbl)))
|
||||
{
|
||||
return tbl[value];
|
||||
}
|
||||
|
@ -320,11 +320,11 @@ public:
|
|||
FORWARD(2, BASE, name, ARGS_OO) \
|
||||
FORWARD(2, BASE, name, ARGS_OI)
|
||||
|
||||
#define ARGS_OI const Operand&, uint32
|
||||
#define ARGS_OI const Operand&, u32
|
||||
#define ARGS_OO const Operand&, const Operand&
|
||||
#define ARGS_XI const Xmm&, int
|
||||
#define ARGS_XO const Xmm&, const Operand&
|
||||
#define ARGS_XOI const Xmm&, const Operand&, uint8
|
||||
#define ARGS_XOI const Xmm&, const Operand&, u8
|
||||
#define ARGS_XXO const Xmm&, const Xmm&, const Operand&
|
||||
|
||||
// For instructions that are ifdef'd out without XBYAK64
|
||||
|
@ -334,7 +334,7 @@ public:
|
|||
#define REQUIRE64(action) require64()
|
||||
#endif
|
||||
|
||||
const uint8 *getCurr() { return actual.getCurr(); }
|
||||
const u8 *getCurr() { return actual.getCurr(); }
|
||||
void align(int x = 16) { return actual.align(x); }
|
||||
void db(int code) { actual.db(code); }
|
||||
void L(const std::string& label) { actual.L(label); }
|
||||
|
@ -374,7 +374,7 @@ public:
|
|||
SFORWARD(2, cvtdq2ps, ARGS_XO)
|
||||
SFORWARD(2, cvtps2dq, ARGS_XO)
|
||||
SFORWARD(2, cvttps2dq, ARGS_XO)
|
||||
SFORWARD(3, extractps, const Operand&, const Xmm&, uint8)
|
||||
SFORWARD(3, extractps, const Operand&, const Xmm&, u8)
|
||||
AFORWARD(2, maxps, ARGS_XO)
|
||||
AFORWARD(2, minps, ARGS_XO)
|
||||
SFORWARD(2, movaps, ARGS_XO)
|
||||
|
@ -403,8 +403,8 @@ public:
|
|||
AFORWARD(2, pcmpeqd, ARGS_XO)
|
||||
AFORWARD(2, pcmpeqw, ARGS_XO)
|
||||
AFORWARD(2, pcmpgtd, ARGS_XO)
|
||||
SFORWARD(3, pextrd, const Operand&, const Xmm&, uint8)
|
||||
SFORWARD(3, pextrw, const Operand&, const Xmm&, uint8)
|
||||
SFORWARD(3, pextrd, const Operand&, const Xmm&, u8)
|
||||
SFORWARD(3, pextrw, const Operand&, const Xmm&, u8)
|
||||
AFORWARD(3, pinsrd, ARGS_XOI)
|
||||
AFORWARD(2, pmaxsw, ARGS_XO)
|
||||
AFORWARD(2, pminsd, ARGS_XO)
|
||||
|
@ -448,12 +448,12 @@ public:
|
|||
FORWARD(2, AVX2, vbroadcasti128, const Ymm&, const Address&)
|
||||
FORWARD(2, AVX, vbroadcastf128, const Ymm&, const Address&)
|
||||
FORWARD(3, FMA, vfmadd213ps, ARGS_XXO)
|
||||
FORWARD(3, AVX2, vextracti128, const Operand&, const Ymm&, uint8)
|
||||
FORWARD(4, AVX2, vinserti128, const Ymm&, const Ymm&, const Operand&, uint8);
|
||||
FORWARD(3, AVX2, vextracti128, const Operand&, const Ymm&, u8)
|
||||
FORWARD(4, AVX2, vinserti128, const Ymm&, const Ymm&, const Operand&, u8);
|
||||
FORWARD(2, AVX2, vpbroadcastd, ARGS_XO)
|
||||
FORWARD(2, AVX2, vpbroadcastq, ARGS_XO)
|
||||
FORWARD(2, AVX2, vpbroadcastw, ARGS_XO)
|
||||
FORWARD(3, AVX2, vpermq, const Ymm&, const Operand&, uint8)
|
||||
FORWARD(3, AVX2, vpermq, const Ymm&, const Operand&, u8)
|
||||
FORWARD(3, AVX2, vpgatherdd, const Xmm&, const Address&, const Xmm&);
|
||||
FORWARD(3, AVX2, vpsravd, ARGS_XXO)
|
||||
FORWARD(3, AVX2, vpsrlvd, ARGS_XXO)
|
||||
|
|
|
@ -50,7 +50,7 @@ GSRasterizer::GSRasterizer(IDrawScanline* ds, int id, int threads, GSPerfMon* pe
|
|||
m_edge.count = 0;
|
||||
|
||||
int rows = (2048 >> m_thread_height) + 16;
|
||||
m_scanline = (uint8*)_aligned_malloc(rows, 64);
|
||||
m_scanline = (u8*)_aligned_malloc(rows, 64);
|
||||
|
||||
int row = 0;
|
||||
|
||||
|
@ -148,10 +148,10 @@ void GSRasterizer::Draw(GSRasterizerData* data)
|
|||
const GSVertexSW* vertex = data->vertex;
|
||||
const GSVertexSW* vertex_end = data->vertex + data->vertex_count;
|
||||
|
||||
const uint32* index = data->index;
|
||||
const uint32* index_end = data->index + data->index_count;
|
||||
const u32* index = data->index;
|
||||
const u32* index_end = data->index + data->index_count;
|
||||
|
||||
uint32 tmp_index[] = {0, 1, 2};
|
||||
u32 tmp_index[] = {0, 1, 2};
|
||||
|
||||
bool scissor_test = !data->bbox.eq(data->bbox.rintersect(data->scissor));
|
||||
|
||||
|
@ -247,7 +247,7 @@ void GSRasterizer::Draw(GSRasterizerData* data)
|
|||
|
||||
data->pixels = m_pixels.actual;
|
||||
|
||||
uint64 ticks = __rdtsc() - data->start;
|
||||
u64 ticks = __rdtsc() - data->start;
|
||||
|
||||
m_pixels.sum += m_pixels.actual;
|
||||
|
||||
|
@ -255,7 +255,7 @@ void GSRasterizer::Draw(GSRasterizerData* data)
|
|||
}
|
||||
|
||||
template <bool scissor_test>
|
||||
void GSRasterizer::DrawPoint(const GSVertexSW* vertex, int vertex_count, const uint32* index, int index_count)
|
||||
void GSRasterizer::DrawPoint(const GSVertexSW* vertex, int vertex_count, const u32* index, int index_count)
|
||||
{
|
||||
m_primcount++;
|
||||
|
||||
|
@ -280,7 +280,7 @@ void GSRasterizer::DrawPoint(const GSVertexSW* vertex, int vertex_count, const u
|
|||
}
|
||||
else
|
||||
{
|
||||
uint32 tmp_index[1] = {0};
|
||||
u32 tmp_index[1] = {0};
|
||||
|
||||
for (int i = 0; i < vertex_count; i++, vertex++)
|
||||
{
|
||||
|
@ -301,7 +301,7 @@ void GSRasterizer::DrawPoint(const GSVertexSW* vertex, int vertex_count, const u
|
|||
}
|
||||
}
|
||||
|
||||
void GSRasterizer::DrawLine(const GSVertexSW* vertex, const uint32* index)
|
||||
void GSRasterizer::DrawLine(const GSVertexSW* vertex, const u32* index)
|
||||
{
|
||||
m_primcount++;
|
||||
|
||||
|
@ -405,7 +405,7 @@ void GSRasterizer::DrawLine(const GSVertexSW* vertex, const uint32* index)
|
|||
}
|
||||
}
|
||||
|
||||
static const uint8 s_ysort[8][4] =
|
||||
static const u8 s_ysort[8][4] =
|
||||
{
|
||||
{0, 1, 2, 0}, // y0 <= y1 <= y2
|
||||
{1, 0, 2, 0}, // y1 < y0 <= y2
|
||||
|
@ -419,7 +419,7 @@ static const uint8 s_ysort[8][4] =
|
|||
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
void GSRasterizer::DrawTriangle(const GSVertexSW* vertex, const uint32* index)
|
||||
void GSRasterizer::DrawTriangle(const GSVertexSW* vertex, const u32* index)
|
||||
{
|
||||
m_primcount++;
|
||||
|
||||
|
@ -612,7 +612,7 @@ void GSRasterizer::DrawTriangleSection(int top, int bottom, GSVertexSW2& edge, c
|
|||
|
||||
#else
|
||||
|
||||
void GSRasterizer::DrawTriangle(const GSVertexSW* vertex, const uint32* index)
|
||||
void GSRasterizer::DrawTriangle(const GSVertexSW* vertex, const u32* index)
|
||||
{
|
||||
m_primcount++;
|
||||
|
||||
|
@ -807,7 +807,7 @@ void GSRasterizer::DrawTriangleSection(int top, int bottom, GSVertexSW& edge, co
|
|||
|
||||
#endif
|
||||
|
||||
void GSRasterizer::DrawSprite(const GSVertexSW* vertex, const uint32* index)
|
||||
void GSRasterizer::DrawSprite(const GSVertexSW* vertex, const u32* index)
|
||||
{
|
||||
m_primcount++;
|
||||
|
||||
|
@ -971,7 +971,7 @@ void GSRasterizer::DrawEdge(const GSVertexSW& v0, const GSVertexSW& v1, const GS
|
|||
{
|
||||
AddScanline(e, 1, xi, top, edge);
|
||||
|
||||
e->t.u32[3] = (0x10000 - xf) & 0xffff;
|
||||
e->t.U32[3] = (0x10000 - xf) & 0xffff;
|
||||
|
||||
e++;
|
||||
}
|
||||
|
@ -994,7 +994,7 @@ void GSRasterizer::DrawEdge(const GSVertexSW& v0, const GSVertexSW& v1, const GS
|
|||
{
|
||||
AddScanline(e, 1, xi, top, edge);
|
||||
|
||||
e->t.u32[3] = xf;
|
||||
e->t.U32[3] = xf;
|
||||
|
||||
e++;
|
||||
}
|
||||
|
@ -1061,7 +1061,7 @@ void GSRasterizer::DrawEdge(const GSVertexSW& v0, const GSVertexSW& v1, const GS
|
|||
{
|
||||
AddScanline(e, 1, left, yi, edge);
|
||||
|
||||
e->t.u32[3] = (0x10000 - yf) & 0xffff;
|
||||
e->t.U32[3] = (0x10000 - yf) & 0xffff;
|
||||
|
||||
e++;
|
||||
}
|
||||
|
@ -1084,7 +1084,7 @@ void GSRasterizer::DrawEdge(const GSVertexSW& v0, const GSVertexSW& v1, const GS
|
|||
{
|
||||
AddScanline(e, 1, left, yi, edge);
|
||||
|
||||
e->t.u32[3] = yf;
|
||||
e->t.U32[3] = yf;
|
||||
|
||||
e++;
|
||||
}
|
||||
|
@ -1105,12 +1105,12 @@ void GSRasterizer::AddScanline(GSVertexSW* e, int pixels, int left, int top, con
|
|||
{
|
||||
*e = scan;
|
||||
|
||||
e->_pad.i32[0] = pixels;
|
||||
e->_pad.i32[1] = left;
|
||||
e->_pad.i32[2] = top;
|
||||
e->_pad.I32[0] = pixels;
|
||||
e->_pad.I32[1] = left;
|
||||
e->_pad.I32[2] = top;
|
||||
}
|
||||
|
||||
void GSRasterizer::Flush(const GSVertexSW* vertex, const uint32* index, const GSVertexSW& dscan, bool edge)
|
||||
void GSRasterizer::Flush(const GSVertexSW* vertex, const u32* index, const GSVertexSW& dscan, bool edge)
|
||||
{
|
||||
// TODO: on win64 this could be the place where xmm6-15 are preserved (not by each DrawScanline)
|
||||
|
||||
|
@ -1127,9 +1127,9 @@ void GSRasterizer::Flush(const GSVertexSW* vertex, const uint32* index, const GS
|
|||
{
|
||||
do
|
||||
{
|
||||
int pixels = e->_pad.i32[0];
|
||||
int left = e->_pad.i32[1];
|
||||
int top = e->_pad.i32[2];
|
||||
int pixels = e->_pad.I32[0];
|
||||
int left = e->_pad.I32[1];
|
||||
int top = e->_pad.I32[2];
|
||||
|
||||
DrawScanline(pixels, left, top, *e++);
|
||||
} while (e < ee);
|
||||
|
@ -1138,9 +1138,9 @@ void GSRasterizer::Flush(const GSVertexSW* vertex, const uint32* index, const GS
|
|||
{
|
||||
do
|
||||
{
|
||||
int pixels = e->_pad.i32[0];
|
||||
int left = e->_pad.i32[1];
|
||||
int top = e->_pad.i32[2];
|
||||
int pixels = e->_pad.I32[0];
|
||||
int left = e->_pad.I32[1];
|
||||
int top = e->_pad.I32[2];
|
||||
|
||||
DrawEdge(pixels, left, top, *e++);
|
||||
} while (e < ee);
|
||||
|
@ -1185,7 +1185,7 @@ GSRasterizerList::GSRasterizerList(int threads, GSPerfMon* perfmon)
|
|||
m_thread_height = compute_best_thread_height(threads);
|
||||
|
||||
int rows = (2048 >> m_thread_height) + 16;
|
||||
m_scanline = (uint8*)_aligned_malloc(rows, 64);
|
||||
m_scanline = (u8*)_aligned_malloc(rows, 64);
|
||||
|
||||
int row = 0;
|
||||
|
||||
|
@ -1193,7 +1193,7 @@ GSRasterizerList::GSRasterizerList(int threads, GSPerfMon* perfmon)
|
|||
{
|
||||
for (int i = 0; i < threads; i++, row++)
|
||||
{
|
||||
m_scanline[row] = (uint8)i;
|
||||
m_scanline[row] = (u8)i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,13 +30,13 @@ public:
|
|||
GSVector4i scissor;
|
||||
GSVector4i bbox;
|
||||
GS_PRIM_CLASS primclass;
|
||||
uint8* buff;
|
||||
u8* buff;
|
||||
GSVertexSW* vertex;
|
||||
int vertex_count;
|
||||
uint32* index;
|
||||
u32* index;
|
||||
int index_count;
|
||||
uint64 frame;
|
||||
uint64 start;
|
||||
u64 frame;
|
||||
u64 start;
|
||||
int pixels;
|
||||
int counter;
|
||||
|
||||
|
@ -66,7 +66,7 @@ public:
|
|||
class IDrawScanline : public GSAlignedClass<32>
|
||||
{
|
||||
public:
|
||||
typedef void (*SetupPrimPtr)(const GSVertexSW* vertex, const uint32* index, const GSVertexSW& dscan);
|
||||
typedef void (*SetupPrimPtr)(const GSVertexSW* vertex, const u32* index, const GSVertexSW& dscan);
|
||||
typedef void(__fastcall* DrawScanlinePtr)(int pixels, int left, int top, const GSVertexSW& scan);
|
||||
typedef void (IDrawScanline::*DrawRectPtr)(const GSVector4i& r, const GSVertexSW& v); // TODO: jit
|
||||
|
||||
|
@ -87,18 +87,18 @@ public:
|
|||
virtual ~IDrawScanline() {}
|
||||
|
||||
virtual void BeginDraw(const GSRasterizerData* data) = 0;
|
||||
virtual void EndDraw(uint64 frame, uint64 ticks, int actual, int total, int prims) = 0;
|
||||
virtual void EndDraw(u64 frame, u64 ticks, int actual, int total, int prims) = 0;
|
||||
|
||||
#ifdef ENABLE_JIT_RASTERIZER
|
||||
|
||||
__forceinline void SetupPrim(const GSVertexSW* vertex, const uint32* index, const GSVertexSW& dscan) { m_sp(vertex, index, dscan); }
|
||||
__forceinline void SetupPrim(const GSVertexSW* vertex, const u32* index, const GSVertexSW& dscan) { m_sp(vertex, index, dscan); }
|
||||
__forceinline void DrawScanline(int pixels, int left, int top, const GSVertexSW& scan) { m_ds(pixels, left, top, scan); }
|
||||
__forceinline void DrawEdge(int pixels, int left, int top, const GSVertexSW& scan) { m_de(pixels, left, top, scan); }
|
||||
__forceinline void DrawRect(const GSVector4i& r, const GSVertexSW& v) { (this->*m_dr)(r, v); }
|
||||
|
||||
#else
|
||||
|
||||
virtual void SetupPrim(const GSVertexSW* vertex, const uint32* index, const GSVertexSW& dscan) = 0;
|
||||
virtual void SetupPrim(const GSVertexSW* vertex, const u32* index, const GSVertexSW& dscan) = 0;
|
||||
virtual void DrawScanline(int pixels, int left, int top, const GSVertexSW& scan) = 0;
|
||||
virtual void DrawEdge(int pixels, int left, int top, const GSVertexSW& scan) = 0;
|
||||
virtual void DrawRect(const GSVector4i& r, const GSVertexSW& v) = 0;
|
||||
|
@ -131,7 +131,7 @@ protected:
|
|||
int m_id;
|
||||
int m_threads;
|
||||
int m_thread_height;
|
||||
uint8* m_scanline;
|
||||
u8* m_scanline;
|
||||
GSVector4i m_scissor;
|
||||
GSVector4 m_fscissor_x;
|
||||
GSVector4 m_fscissor_y;
|
||||
|
@ -142,10 +142,10 @@ protected:
|
|||
typedef void (GSRasterizer::*DrawPrimPtr)(const GSVertexSW* v, int count);
|
||||
|
||||
template <bool scissor_test>
|
||||
void DrawPoint(const GSVertexSW* vertex, int vertex_count, const uint32* index, int index_count);
|
||||
void DrawLine(const GSVertexSW* vertex, const uint32* index);
|
||||
void DrawTriangle(const GSVertexSW* vertex, const uint32* index);
|
||||
void DrawSprite(const GSVertexSW* vertex, const uint32* index);
|
||||
void DrawPoint(const GSVertexSW* vertex, int vertex_count, const u32* index, int index_count);
|
||||
void DrawLine(const GSVertexSW* vertex, const u32* index);
|
||||
void DrawTriangle(const GSVertexSW* vertex, const u32* index);
|
||||
void DrawSprite(const GSVertexSW* vertex, const u32* index);
|
||||
|
||||
#if _M_SSE >= 0x501
|
||||
__forceinline void DrawTriangleSection(int top, int bottom, GSVertexSW2& edge, const GSVertexSW2& dedge, const GSVertexSW2& dscan, const GSVector4& p0);
|
||||
|
@ -156,7 +156,7 @@ protected:
|
|||
void DrawEdge(const GSVertexSW& v0, const GSVertexSW& v1, const GSVertexSW& dv, int orientation, int side);
|
||||
|
||||
__forceinline void AddScanline(GSVertexSW* e, int pixels, int left, int top, const GSVertexSW& scan);
|
||||
__forceinline void Flush(const GSVertexSW* vertex, const uint32* index, const GSVertexSW& dscan, bool edge = false);
|
||||
__forceinline void Flush(const GSVertexSW* vertex, const u32* index, const GSVertexSW& dscan, bool edge = false);
|
||||
|
||||
__forceinline void DrawScanline(int pixels, int left, int top, const GSVertexSW& scan);
|
||||
__forceinline void DrawEdge(int pixels, int left, int top, const GSVertexSW& scan);
|
||||
|
@ -189,7 +189,7 @@ protected:
|
|||
// Worker threads depend on the rasterizers, so don't change the order.
|
||||
std::vector<std::unique_ptr<GSRasterizer>> m_r;
|
||||
std::vector<std::unique_ptr<GSWorker>> m_workers;
|
||||
uint8* m_scanline;
|
||||
u8* m_scanline;
|
||||
int m_thread_height;
|
||||
|
||||
GSRasterizerList(int threads, GSPerfMon* perfmon);
|
||||
|
|
|
@ -36,7 +36,7 @@ GSRendererSW::GSRendererSW(int threads)
|
|||
|
||||
m_rl = GSRasterizerList::Create<GSDrawScanline>(threads, &m_perfmon);
|
||||
|
||||
m_output = (uint8*)_aligned_malloc(1024 * 1024 * sizeof(uint32), 32);
|
||||
m_output = (u8*)_aligned_malloc(1024 * 1024 * sizeof(u32), 32);
|
||||
|
||||
std::fill(std::begin(m_fzb_pages), std::end(m_fzb_pages), 0);
|
||||
std::fill(std::begin(m_tex_pages), std::end(m_tex_pages), 0);
|
||||
|
@ -194,7 +194,7 @@ GSTexture* GSRendererSW::GetFeedbackOutput()
|
|||
}
|
||||
|
||||
|
||||
template <uint32 primclass, uint32 tme, uint32 fst, uint32 q_div>
|
||||
template <u32 primclass, u32 tme, u32 fst, u32 q_div>
|
||||
void GSRendererSW::ConvertVertexBuffer(GSVertexSW* RESTRICT dst, const GSVertex* RESTRICT src, size_t count)
|
||||
{
|
||||
// FIXME q_div wasn't added to AVX2 code path.
|
||||
|
@ -339,20 +339,20 @@ void GSRendererSW::Draw()
|
|||
std::shared_ptr<GSRasterizerData> data(sd);
|
||||
|
||||
sd->primclass = m_vt.m_primclass;
|
||||
sd->buff = (uint8*)_aligned_malloc(sizeof(GSVertexSW) * ((m_vertex.next + 1) & ~1) + sizeof(uint32) * m_index.tail, 64);
|
||||
sd->buff = (u8*)_aligned_malloc(sizeof(GSVertexSW) * ((m_vertex.next + 1) & ~1) + sizeof(u32) * m_index.tail, 64);
|
||||
sd->vertex = (GSVertexSW*)sd->buff;
|
||||
sd->vertex_count = m_vertex.next;
|
||||
sd->index = (uint32*)(sd->buff + sizeof(GSVertexSW) * ((m_vertex.next + 1) & ~1));
|
||||
sd->index = (u32*)(sd->buff + sizeof(GSVertexSW) * ((m_vertex.next + 1) & ~1));
|
||||
sd->index_count = m_index.tail;
|
||||
|
||||
// skip per pixel division if q is constant.
|
||||
// Optimize the division by 1 with a nop. It also means that GS_SPRITE_CLASS must be processed when !m_vt.m_eq.q.
|
||||
// If you have both GS_SPRITE_CLASS && m_vt.m_eq.q, it will depends on the first part of the 'OR'
|
||||
uint32 q_div = !IsMipMapActive() && ((m_vt.m_eq.q && m_vt.m_min.t.z != 1.0f) || (!m_vt.m_eq.q && m_vt.m_primclass == GS_SPRITE_CLASS));
|
||||
u32 q_div = !IsMipMapActive() && ((m_vt.m_eq.q && m_vt.m_min.t.z != 1.0f) || (!m_vt.m_eq.q && m_vt.m_primclass == GS_SPRITE_CLASS));
|
||||
|
||||
(this->*m_cvb[m_vt.m_primclass][PRIM->TME][PRIM->FST][q_div])(sd->vertex, m_vertex.buff, m_vertex.next);
|
||||
|
||||
memcpy(sd->index, m_index.buff, sizeof(uint32) * m_index.tail);
|
||||
memcpy(sd->index, m_index.buff, sizeof(u32) * m_index.tail);
|
||||
|
||||
GSVector4i scissor = GSVector4i(context->scissor.in);
|
||||
GSVector4i bbox = GSVector4i(m_vt.m_min.p.floor().xyxy(m_vt.m_max.p.ceil()));
|
||||
|
@ -382,7 +382,7 @@ void GSRendererSW::Draw()
|
|||
{
|
||||
int n = GSUtil::GetVertexCount(PRIM->PRIM);
|
||||
|
||||
for (uint32 i = 0, j = 0; i < m_index.tail; i += n, j++)
|
||||
for (u32 i = 0, j = 0; i < m_index.tail; i += n, j++)
|
||||
{
|
||||
for (int k = 0; k < n; k++)
|
||||
{
|
||||
|
@ -443,7 +443,7 @@ void GSRendererSW::Draw()
|
|||
{
|
||||
Sync(2);
|
||||
|
||||
uint64 frame = m_perfmon.GetFrame();
|
||||
u64 frame = m_perfmon.GetFrame();
|
||||
// Dump the texture in 32 bits format. It helps to debug texture shuffle effect
|
||||
// It will breaks the few games that really uses 16 bits RT
|
||||
bool texture_shuffle = ((context->FRAME.PSM & 0x2) && ((context->TEX0.PSM & 3) == 2) && (m_vt.m_primclass == GS_SPRITE_CLASS));
|
||||
|
@ -594,7 +594,7 @@ void GSRendererSW::Sync(int reason)
|
|||
|
||||
GSPerfMonAutoTimer pmat(&m_perfmon, GSPerfMon::Sync);
|
||||
|
||||
uint64 t = __rdtsc();
|
||||
u64 t = __rdtsc();
|
||||
|
||||
m_rl->Sync();
|
||||
|
||||
|
@ -645,7 +645,7 @@ void GSRendererSW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GS
|
|||
|
||||
if (!m_rl->IsSynced())
|
||||
{
|
||||
pages.loopPagesWithBreak([&](uint32 page)
|
||||
pages.loopPagesWithBreak([&](u32 page)
|
||||
{
|
||||
if (m_fzb_pages[page] | m_tex_pages[page])
|
||||
{
|
||||
|
@ -673,7 +673,7 @@ void GSRendererSW::InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GS
|
|||
GSOffset off = m_mem.GetOffset(BITBLTBUF.SBP, BITBLTBUF.SBW, BITBLTBUF.SPSM);
|
||||
GSOffset::PageLooper pages = off.pageLooperForRect(r);
|
||||
|
||||
pages.loopPagesWithBreak([&](uint32 page)
|
||||
pages.loopPagesWithBreak([&](u32 page)
|
||||
{
|
||||
if (m_fzb_pages[page])
|
||||
{
|
||||
|
@ -688,7 +688,7 @@ void GSRendererSW::InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GS
|
|||
|
||||
void GSRendererSW::UsePages(const GSOffset::PageLooper& pages, const int type)
|
||||
{
|
||||
pages.loopPages([=](uint32 page)
|
||||
pages.loopPages([=](u32 page)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
|
@ -712,7 +712,7 @@ void GSRendererSW::UsePages(const GSOffset::PageLooper& pages, const int type)
|
|||
|
||||
void GSRendererSW::ReleasePages(const GSOffset::PageLooper& pages, const int type)
|
||||
{
|
||||
pages.loopPages([=](uint32 page)
|
||||
pages.loopPages([=](u32 page)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
|
@ -767,14 +767,14 @@ bool GSRendererSW::CheckTargetPages(const GSOffset::PageLooper* fb_pages, const
|
|||
|
||||
memset(m_fzb_cur_pages, 0, sizeof(m_fzb_cur_pages));
|
||||
|
||||
uint32 used = 0;
|
||||
u32 used = 0;
|
||||
|
||||
requirePages();
|
||||
|
||||
fb_pages->loopPages([&](uint32 i)
|
||||
fb_pages->loopPages([&](u32 i)
|
||||
{
|
||||
uint32 row = i >> 5;
|
||||
uint32 col = 1 << (i & 31);
|
||||
u32 row = i >> 5;
|
||||
u32 col = 1 << (i & 31);
|
||||
|
||||
m_fzb_cur_pages[row] |= col;
|
||||
|
||||
|
@ -782,10 +782,10 @@ bool GSRendererSW::CheckTargetPages(const GSOffset::PageLooper* fb_pages, const
|
|||
used |= m_tex_pages[i];
|
||||
});
|
||||
|
||||
zb_pages->loopPages([&](uint32 i)
|
||||
zb_pages->loopPages([&](u32 i)
|
||||
{
|
||||
uint32 row = i >> 5;
|
||||
uint32 col = 1 << (i & 31);
|
||||
u32 row = i >> 5;
|
||||
u32 col = 1 << (i & 31);
|
||||
|
||||
m_fzb_cur_pages[row] |= col;
|
||||
|
||||
|
@ -825,12 +825,12 @@ bool GSRendererSW::CheckTargetPages(const GSOffset::PageLooper* fb_pages, const
|
|||
|
||||
requirePages();
|
||||
|
||||
uint32 used = 0;
|
||||
u32 used = 0;
|
||||
|
||||
fb_pages->loopPages([&](uint32 i)
|
||||
fb_pages->loopPages([&](u32 i)
|
||||
{
|
||||
uint32 row = i >> 5;
|
||||
uint32 col = 1 << (i & 31);
|
||||
u32 row = i >> 5;
|
||||
u32 col = 1 << (i & 31);
|
||||
|
||||
if ((m_fzb_cur_pages[row] & col) == 0)
|
||||
{
|
||||
|
@ -840,10 +840,10 @@ bool GSRendererSW::CheckTargetPages(const GSOffset::PageLooper* fb_pages, const
|
|||
}
|
||||
});
|
||||
|
||||
zb_pages->loopPages([&](uint32 i)
|
||||
zb_pages->loopPages([&](u32 i)
|
||||
{
|
||||
uint32 row = i >> 5;
|
||||
uint32 col = 1 << (i & 31);
|
||||
u32 row = i >> 5;
|
||||
u32 col = 1 << (i & 31);
|
||||
|
||||
if ((m_fzb_cur_pages[row] & col) == 0)
|
||||
{
|
||||
|
@ -875,7 +875,7 @@ bool GSRendererSW::CheckTargetPages(const GSOffset::PageLooper* fb_pages, const
|
|||
|
||||
if (fb && !res)
|
||||
{
|
||||
fb_pages->loopPagesWithBreak([&](uint32 page)
|
||||
fb_pages->loopPagesWithBreak([&](u32 page)
|
||||
{
|
||||
if (m_fzb_pages[page] & 0xffff0000)
|
||||
{
|
||||
|
@ -895,7 +895,7 @@ bool GSRendererSW::CheckTargetPages(const GSOffset::PageLooper* fb_pages, const
|
|||
|
||||
if (zb && !res)
|
||||
{
|
||||
zb_pages->loopPagesWithBreak([&](uint32 page)
|
||||
zb_pages->loopPagesWithBreak([&](u32 page)
|
||||
{
|
||||
if (m_fzb_pages[page] & 0x0000ffff)
|
||||
{
|
||||
|
@ -927,7 +927,7 @@ bool GSRendererSW::CheckSourcePages(SharedData* sd)
|
|||
GSOffset::PageLooper pages = sd->m_tex[i].t->m_offset.pageLooperForRect(sd->m_tex[i].r);
|
||||
|
||||
bool ret = false;
|
||||
pages.loopPagesWithBreak([&](uint32 pages)
|
||||
pages.loopPagesWithBreak([&](u32 pages)
|
||||
{
|
||||
// TODO: 8H 4HL 4HH texture at the same place as the render target (24 bit, or 32-bit where the alpha channel is masked, Valkyrie Profile 2)
|
||||
|
||||
|
@ -972,8 +972,8 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
|
|||
gd.sel.ababcd = 0xff;
|
||||
gd.sel.prim = primclass;
|
||||
|
||||
uint32 fm = context->FRAME.FBMSK;
|
||||
uint32 zm = context->ZBUF.ZMSK || context->TEST.ZTE == 0 ? 0xffffffff : 0;
|
||||
u32 fm = context->FRAME.FBMSK;
|
||||
u32 zm = context->ZBUF.ZMSK || context->TEST.ZTE == 0 ? 0xffffffff : 0;
|
||||
|
||||
if (context->TEST.ZTE && context->TEST.ZTST == ZTST_NEVER)
|
||||
{
|
||||
|
@ -1049,9 +1049,9 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
|
|||
{
|
||||
gd.sel.tlu = 1;
|
||||
|
||||
gd.clut = (uint32*)_aligned_malloc(sizeof(uint32) * 256, 32); // FIXME: might address uninitialized data of the texture (0xCD) that is not in 0-15 range for 4-bpp formats
|
||||
gd.clut = (u32*)_aligned_malloc(sizeof(u32) * 256, 32); // FIXME: might address uninitialized data of the texture (0xCD) that is not in 0-15 range for 4-bpp formats
|
||||
|
||||
memcpy(gd.clut, (const uint32*)m_mem.m_clut, sizeof(uint32) * GSLocalMemory::m_psm[context->TEX0.PSM].pal);
|
||||
memcpy(gd.clut, (const u32*)m_mem.m_clut, sizeof(u32) * GSLocalMemory::m_psm[context->TEX0.PSM].pal);
|
||||
}
|
||||
|
||||
gd.sel.wms = context->CLAMP.WMS;
|
||||
|
@ -1216,30 +1216,30 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
|
|||
}
|
||||
}
|
||||
|
||||
uint16 tw = 1u << TEX0.TW;
|
||||
uint16 th = 1u << TEX0.TH;
|
||||
u16 tw = 1u << TEX0.TW;
|
||||
u16 th = 1u << TEX0.TH;
|
||||
|
||||
switch (context->CLAMP.WMS)
|
||||
{
|
||||
case CLAMP_REPEAT:
|
||||
gd.t.min.u16[0] = gd.t.minmax.u16[0] = tw - 1;
|
||||
gd.t.max.u16[0] = gd.t.minmax.u16[2] = 0;
|
||||
gd.t.mask.u32[0] = 0xffffffff;
|
||||
gd.t.min.U16[0] = gd.t.minmax.U16[0] = tw - 1;
|
||||
gd.t.max.U16[0] = gd.t.minmax.U16[2] = 0;
|
||||
gd.t.mask.U32[0] = 0xffffffff;
|
||||
break;
|
||||
case CLAMP_CLAMP:
|
||||
gd.t.min.u16[0] = gd.t.minmax.u16[0] = 0;
|
||||
gd.t.max.u16[0] = gd.t.minmax.u16[2] = tw - 1;
|
||||
gd.t.mask.u32[0] = 0;
|
||||
gd.t.min.U16[0] = gd.t.minmax.U16[0] = 0;
|
||||
gd.t.max.U16[0] = gd.t.minmax.U16[2] = tw - 1;
|
||||
gd.t.mask.U32[0] = 0;
|
||||
break;
|
||||
case CLAMP_REGION_CLAMP:
|
||||
gd.t.min.u16[0] = gd.t.minmax.u16[0] = std::min<uint16>(context->CLAMP.MINU, tw - 1);
|
||||
gd.t.max.u16[0] = gd.t.minmax.u16[2] = std::min<uint16>(context->CLAMP.MAXU, tw - 1);
|
||||
gd.t.mask.u32[0] = 0;
|
||||
gd.t.min.U16[0] = gd.t.minmax.U16[0] = std::min<u16>(context->CLAMP.MINU, tw - 1);
|
||||
gd.t.max.U16[0] = gd.t.minmax.U16[2] = std::min<u16>(context->CLAMP.MAXU, tw - 1);
|
||||
gd.t.mask.U32[0] = 0;
|
||||
break;
|
||||
case CLAMP_REGION_REPEAT:
|
||||
gd.t.min.u16[0] = gd.t.minmax.u16[0] = context->CLAMP.MINU & (tw - 1);
|
||||
gd.t.max.u16[0] = gd.t.minmax.u16[2] = context->CLAMP.MAXU & (tw - 1);
|
||||
gd.t.mask.u32[0] = 0xffffffff;
|
||||
gd.t.min.U16[0] = gd.t.minmax.U16[0] = context->CLAMP.MINU & (tw - 1);
|
||||
gd.t.max.U16[0] = gd.t.minmax.U16[2] = context->CLAMP.MAXU & (tw - 1);
|
||||
gd.t.mask.U32[0] = 0xffffffff;
|
||||
break;
|
||||
default:
|
||||
__assume(0);
|
||||
|
@ -1248,24 +1248,24 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
|
|||
switch (context->CLAMP.WMT)
|
||||
{
|
||||
case CLAMP_REPEAT:
|
||||
gd.t.min.u16[4] = gd.t.minmax.u16[1] = th - 1;
|
||||
gd.t.max.u16[4] = gd.t.minmax.u16[3] = 0;
|
||||
gd.t.mask.u32[2] = 0xffffffff;
|
||||
gd.t.min.U16[4] = gd.t.minmax.U16[1] = th - 1;
|
||||
gd.t.max.U16[4] = gd.t.minmax.U16[3] = 0;
|
||||
gd.t.mask.U32[2] = 0xffffffff;
|
||||
break;
|
||||
case CLAMP_CLAMP:
|
||||
gd.t.min.u16[4] = gd.t.minmax.u16[1] = 0;
|
||||
gd.t.max.u16[4] = gd.t.minmax.u16[3] = th - 1;
|
||||
gd.t.mask.u32[2] = 0;
|
||||
gd.t.min.U16[4] = gd.t.minmax.U16[1] = 0;
|
||||
gd.t.max.U16[4] = gd.t.minmax.U16[3] = th - 1;
|
||||
gd.t.mask.U32[2] = 0;
|
||||
break;
|
||||
case CLAMP_REGION_CLAMP:
|
||||
gd.t.min.u16[4] = gd.t.minmax.u16[1] = std::min<uint16>(context->CLAMP.MINV, th - 1);
|
||||
gd.t.max.u16[4] = gd.t.minmax.u16[3] = std::min<uint16>(context->CLAMP.MAXV, th - 1); // ffx anima summon scene, when the anchor appears (th = 256, maxv > 256)
|
||||
gd.t.mask.u32[2] = 0;
|
||||
gd.t.min.U16[4] = gd.t.minmax.U16[1] = std::min<u16>(context->CLAMP.MINV, th - 1);
|
||||
gd.t.max.U16[4] = gd.t.minmax.U16[3] = std::min<u16>(context->CLAMP.MAXV, th - 1); // ffx anima summon scene, when the anchor appears (th = 256, maxv > 256)
|
||||
gd.t.mask.U32[2] = 0;
|
||||
break;
|
||||
case CLAMP_REGION_REPEAT:
|
||||
gd.t.min.u16[4] = gd.t.minmax.u16[1] = context->CLAMP.MINV & (th - 1); // skygunner main menu water texture 64x64, MINV = 127
|
||||
gd.t.max.u16[4] = gd.t.minmax.u16[3] = context->CLAMP.MAXV & (th - 1);
|
||||
gd.t.mask.u32[2] = 0xffffffff;
|
||||
gd.t.min.U16[4] = gd.t.minmax.U16[1] = context->CLAMP.MINV & (th - 1); // skygunner main menu water texture 64x64, MINV = 127
|
||||
gd.t.max.U16[4] = gd.t.minmax.U16[3] = context->CLAMP.MAXV & (th - 1);
|
||||
gd.t.mask.U32[2] = 0xffffffff;
|
||||
break;
|
||||
default:
|
||||
__assume(0);
|
||||
|
@ -1281,8 +1281,8 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
|
|||
{
|
||||
gd.sel.fge = 1;
|
||||
|
||||
gd.frb = env.FOGCOL.u32[0] & 0x00ff00ff;
|
||||
gd.fga = (env.FOGCOL.u32[0] >> 8) & 0x00ff00ff;
|
||||
gd.frb = env.FOGCOL.U32[0] & 0x00ff00ff;
|
||||
gd.fga = (env.FOGCOL.U32[0] >> 8) & 0x00ff00ff;
|
||||
}
|
||||
|
||||
if (context->FRAME.PSM != PSM_PSMCT24)
|
||||
|
@ -1294,7 +1294,7 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
|
|||
if (!IsOpaque())
|
||||
{
|
||||
gd.sel.abe = PRIM->ABE;
|
||||
gd.sel.ababcd = context->ALPHA.u32[0];
|
||||
gd.sel.ababcd = context->ALPHA.U32[0];
|
||||
|
||||
if (env.PABE.PABE)
|
||||
{
|
||||
|
@ -1337,12 +1337,12 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
|
|||
|
||||
if (zwrite || ztest)
|
||||
{
|
||||
uint32_t z_max = 0xffffffff >> (GSLocalMemory::m_psm[context->ZBUF.PSM].fmt * 8);
|
||||
u32 z_max = 0xffffffff >> (GSLocalMemory::m_psm[context->ZBUF.PSM].fmt * 8);
|
||||
|
||||
gd.sel.zpsm = GSLocalMemory::m_psm[context->ZBUF.PSM].fmt;
|
||||
gd.sel.ztst = ztest ? context->TEST.ZTST : (int)ZTST_ALWAYS;
|
||||
gd.sel.zoverflow = (uint32)GSVector4i(m_vt.m_max.p).z == 0x80000000U;
|
||||
gd.sel.zclamp = (uint32)GSVector4i(m_vt.m_max.p).z > z_max;
|
||||
gd.sel.zoverflow = (u32)GSVector4i(m_vt.m_max.p).z == 0x80000000U;
|
||||
gd.sel.zclamp = (u32)GSVector4i(m_vt.m_max.p).z > z_max;
|
||||
}
|
||||
|
||||
#if _M_SSE >= 0x501
|
||||
|
@ -1356,8 +1356,8 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
|
|||
}
|
||||
else if (gd.sel.fpsm == 2)
|
||||
{
|
||||
uint32 rb = gd.fm & 0x00f800f8;
|
||||
uint32 ga = gd.fm & 0x8000f800;
|
||||
u32 rb = gd.fm & 0x00f800f8;
|
||||
u32 ga = gd.fm & 0x8000f800;
|
||||
|
||||
gd.fm = (ga >> 16) | (rb >> 9) | (ga >> 6) | (rb >> 3) | 0xffff0000;
|
||||
}
|
||||
|
@ -1403,7 +1403,7 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
|
|||
{
|
||||
gd.sel.notest = 1;
|
||||
|
||||
uint32 ofx = context->XYOFFSET.OFX;
|
||||
u32 ofx = context->XYOFFSET.OFX;
|
||||
|
||||
for (int i = 0, j = m_vertex.tail; i < j; i++)
|
||||
{
|
||||
|
@ -1551,7 +1551,7 @@ void GSRendererSW::SharedData::UpdateSource()
|
|||
|
||||
if (m_parent->s_dump)
|
||||
{
|
||||
uint64 frame = m_parent->m_perfmon.GetFrame();
|
||||
u64 frame = m_parent->m_perfmon.GetFrame();
|
||||
|
||||
std::string s;
|
||||
|
||||
|
@ -1570,7 +1570,7 @@ void GSRendererSW::SharedData::UpdateSource()
|
|||
{
|
||||
GSTextureSW* t = new GSTextureSW(0, 256, 1);
|
||||
|
||||
t->Update(GSVector4i(0, 0, 256, 1), global.clut, sizeof(uint32) * 256);
|
||||
t->Update(GSVector4i(0, 0, 256, 1), global.clut, sizeof(u32) * 256);
|
||||
|
||||
s = format("%05d_f%lld_itexp_%05x_%s.bmp", m_parent->s_n, frame, (int)m_parent->m_context->TEX0.CBP, psm_str(m_parent->m_context->TEX0.CPSM));
|
||||
|
||||
|
|
|
@ -63,19 +63,19 @@ class GSRendererSW : public GSRenderer
|
|||
|
||||
ConvertVertexBufferPtr m_cvb[4][2][2][2];
|
||||
|
||||
template <uint32 primclass, uint32 tme, uint32 fst, uint32 q_div>
|
||||
template <u32 primclass, u32 tme, u32 fst, u32 q_div>
|
||||
void ConvertVertexBuffer(GSVertexSW* RESTRICT dst, const GSVertex* RESTRICT src, size_t count);
|
||||
|
||||
protected:
|
||||
IRasterizer* m_rl;
|
||||
GSTextureCacheSW* m_tc;
|
||||
GSTexture* m_texture[2];
|
||||
uint8* m_output;
|
||||
u8* m_output;
|
||||
GSPixelOffset4* m_fzb;
|
||||
GSVector4i m_fzb_bbox;
|
||||
uint32 m_fzb_cur_pages[16];
|
||||
std::atomic<uint32> m_fzb_pages[512]; // uint16 frame/zbuf pages interleaved
|
||||
std::atomic<uint16> m_tex_pages[512];
|
||||
u32 m_fzb_cur_pages[16];
|
||||
std::atomic<u32> m_fzb_pages[512]; // u16 frame/zbuf pages interleaved
|
||||
std::atomic<u16> m_tex_pages[512];
|
||||
|
||||
void Reset();
|
||||
void VSync(int field);
|
||||
|
|
|
@ -22,79 +22,79 @@ union GSScanlineSelector
|
|||
{
|
||||
struct
|
||||
{
|
||||
uint32 fpsm : 2; // 0
|
||||
uint32 zpsm : 2; // 2
|
||||
uint32 ztst : 2; // 4 (0: off, 1: write, 2: test (ge), 3: test (g))
|
||||
uint32 atst : 3; // 6
|
||||
uint32 afail : 2; // 9
|
||||
uint32 iip : 1; // 11
|
||||
uint32 tfx : 3; // 12
|
||||
uint32 tcc : 1; // 15
|
||||
uint32 fst : 1; // 16
|
||||
uint32 ltf : 1; // 17
|
||||
uint32 tlu : 1; // 18
|
||||
uint32 fge : 1; // 19
|
||||
uint32 date : 1; // 20
|
||||
uint32 abe : 1; // 21
|
||||
uint32 aba : 2; // 22
|
||||
uint32 abb : 2; // 24
|
||||
uint32 abc : 2; // 26
|
||||
uint32 abd : 2; // 28
|
||||
uint32 pabe : 1; // 30
|
||||
uint32 aa1 : 1; // 31
|
||||
u32 fpsm : 2; // 0
|
||||
u32 zpsm : 2; // 2
|
||||
u32 ztst : 2; // 4 (0: off, 1: write, 2: test (ge), 3: test (g))
|
||||
u32 atst : 3; // 6
|
||||
u32 afail : 2; // 9
|
||||
u32 iip : 1; // 11
|
||||
u32 tfx : 3; // 12
|
||||
u32 tcc : 1; // 15
|
||||
u32 fst : 1; // 16
|
||||
u32 ltf : 1; // 17
|
||||
u32 tlu : 1; // 18
|
||||
u32 fge : 1; // 19
|
||||
u32 date : 1; // 20
|
||||
u32 abe : 1; // 21
|
||||
u32 aba : 2; // 22
|
||||
u32 abb : 2; // 24
|
||||
u32 abc : 2; // 26
|
||||
u32 abd : 2; // 28
|
||||
u32 pabe : 1; // 30
|
||||
u32 aa1 : 1; // 31
|
||||
|
||||
uint32 fwrite : 1; // 32
|
||||
uint32 ftest : 1; // 33
|
||||
uint32 rfb : 1; // 34
|
||||
uint32 zwrite : 1; // 35
|
||||
uint32 ztest : 1; // 36
|
||||
uint32 zoverflow : 1; // 37 (z max >= 0x80000000)
|
||||
uint32 zclamp : 1; // 38
|
||||
uint32 wms : 2; // 39
|
||||
uint32 wmt : 2; // 41
|
||||
uint32 datm : 1; // 43
|
||||
uint32 colclamp : 1; // 44
|
||||
uint32 fba : 1; // 45
|
||||
uint32 dthe : 1; // 46
|
||||
uint32 prim : 2; // 47
|
||||
u32 fwrite : 1; // 32
|
||||
u32 ftest : 1; // 33
|
||||
u32 rfb : 1; // 34
|
||||
u32 zwrite : 1; // 35
|
||||
u32 ztest : 1; // 36
|
||||
u32 zoverflow : 1; // 37 (z max >= 0x80000000)
|
||||
u32 zclamp : 1; // 38
|
||||
u32 wms : 2; // 39
|
||||
u32 wmt : 2; // 41
|
||||
u32 datm : 1; // 43
|
||||
u32 colclamp : 1; // 44
|
||||
u32 fba : 1; // 45
|
||||
u32 dthe : 1; // 46
|
||||
u32 prim : 2; // 47
|
||||
|
||||
uint32 edge : 1; // 49
|
||||
uint32 tw : 3; // 50 (encodes values between 3 -> 10, texture cache makes sure it is at least 3)
|
||||
uint32 lcm : 1; // 53
|
||||
uint32 mmin : 2; // 54
|
||||
uint32 notest : 1; // 55 (no ztest, no atest, no date, no scissor test, and horizontally aligned to 4 pixels)
|
||||
u32 edge : 1; // 49
|
||||
u32 tw : 3; // 50 (encodes values between 3 -> 10, texture cache makes sure it is at least 3)
|
||||
u32 lcm : 1; // 53
|
||||
u32 mmin : 2; // 54
|
||||
u32 notest : 1; // 55 (no ztest, no atest, no date, no scissor test, and horizontally aligned to 4 pixels)
|
||||
// TODO: 1D texture flag? could save 2 texture reads and 4 lerps with bilinear, and also the texture coordinate clamp/wrap code in one direction
|
||||
|
||||
uint32 breakpoint : 1; // Insert a trap to stop the program, helpful to stop debugger on a program
|
||||
u32 breakpoint : 1; // Insert a trap to stop the program, helpful to stop debugger on a program
|
||||
};
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 _pad1 : 22;
|
||||
uint32 ababcd : 8;
|
||||
uint32 _pad2 : 2;
|
||||
u32 _pad1 : 22;
|
||||
u32 ababcd : 8;
|
||||
u32 _pad2 : 2;
|
||||
|
||||
uint32 fb : 2;
|
||||
uint32 _pad3 : 1;
|
||||
uint32 zb : 2;
|
||||
u32 fb : 2;
|
||||
u32 _pad3 : 1;
|
||||
u32 zb : 2;
|
||||
};
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 lo;
|
||||
uint32 hi;
|
||||
u32 lo;
|
||||
u32 hi;
|
||||
};
|
||||
|
||||
uint64 key;
|
||||
u64 key;
|
||||
|
||||
GSScanlineSelector() = default;
|
||||
GSScanlineSelector(uint64 k)
|
||||
GSScanlineSelector(u64 k)
|
||||
: key(k)
|
||||
{
|
||||
}
|
||||
|
||||
operator uint32() const { return lo; }
|
||||
operator uint64() const { return key; }
|
||||
operator u32() const { return lo; }
|
||||
operator u64() const { return key; }
|
||||
|
||||
bool IsSolidRect() const
|
||||
{
|
||||
|
@ -124,7 +124,7 @@ struct alignas(32) GSScanlineGlobalData // per batch variables, this is like a p
|
|||
|
||||
void* vm;
|
||||
const void* tex[7];
|
||||
uint32* clut;
|
||||
u32* clut;
|
||||
GSVector4i* dimx;
|
||||
|
||||
GSOffset fbo;
|
||||
|
@ -138,8 +138,8 @@ struct alignas(32) GSScanlineGlobalData // per batch variables, this is like a p
|
|||
|
||||
#if _M_SSE >= 0x501
|
||||
|
||||
uint32 fm, zm;
|
||||
uint32 frb, fga;
|
||||
u32 fm, zm;
|
||||
u32 frb, fga;
|
||||
GSVector8 mxl;
|
||||
GSVector8 k; // TEX1.K * 0x10000
|
||||
GSVector8 l; // TEX1.L * -0x10000
|
||||
|
@ -162,9 +162,9 @@ struct alignas(32) GSScanlineLocalData // per prim variables, each thread has it
|
|||
#if _M_SSE >= 0x501
|
||||
|
||||
struct skip { GSVector8 z, s, t, q; GSVector8i rb, ga, f, _pad; } d[8];
|
||||
struct step { GSVector4 stq; struct { uint32 rb, ga; } c; struct { uint32 z, f; } p; } d8;
|
||||
struct step { GSVector4 stq; struct { u32 rb, ga; } c; struct { u32 z, f; } p; } d8;
|
||||
struct { GSVector8i rb, ga; } c;
|
||||
struct { uint32 z, f; } p;
|
||||
struct { u32 z, f; } p;
|
||||
|
||||
// these should be stored on stack as normal local variables (no free regs to use, esp cannot be saved to anywhere, and we need an aligned stack)
|
||||
|
||||
|
@ -231,11 +231,11 @@ struct alignas(32) GSScanlineLocalData // per prim variables, each thread has it
|
|||
// absolute addressing. Otherwise we need to store a base address in a register.
|
||||
struct GSScanlineConstantData : public GSAlignedClass<32>
|
||||
{
|
||||
alignas(32) uint8 m_test_256b[16][8];
|
||||
alignas(32) u8 m_test_256b[16][8];
|
||||
alignas(32) float m_shift_256b[9][8];
|
||||
alignas(32) float m_log2_coef_256b[4][8];
|
||||
|
||||
alignas(16) uint32 m_test_128b[8][4];
|
||||
alignas(16) u32 m_test_128b[8][4];
|
||||
alignas(16) float m_shift_128b[5][4];
|
||||
alignas(16) float m_log2_coef_128b[4][4];
|
||||
|
||||
|
@ -245,7 +245,7 @@ struct GSScanlineConstantData : public GSAlignedClass<32>
|
|||
// So it must be defered to post global constructor
|
||||
void Init()
|
||||
{
|
||||
uint8 I_hate_vs2013_m_test_256b[16][8] = {
|
||||
u8 I_hate_vs2013_m_test_256b[16][8] = {
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
{0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
|
@ -264,7 +264,7 @@ struct GSScanlineConstantData : public GSAlignedClass<32>
|
|||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
|
||||
};
|
||||
|
||||
uint32 I_hate_vs2013_m_test_128b[8][4] = {
|
||||
u32 I_hate_vs2013_m_test_128b[8][4] = {
|
||||
{0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0xffffffff, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0xffffffff, 0xffffffff, 0x00000000, 0x00000000},
|
||||
|
|
|
@ -48,7 +48,7 @@ using namespace Xbyak;
|
|||
#define _rip_local_d_p(x) _rip_local_d(x)
|
||||
#endif
|
||||
|
||||
GSSetupPrimCodeGenerator2::GSSetupPrimCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, uint64 key)
|
||||
GSSetupPrimCodeGenerator2::GSSetupPrimCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, u64 key)
|
||||
: _parent(base, cpu)
|
||||
, m_local(*(GSScanlineLocalData*)param)
|
||||
, m_rip(false), many_regs(false)
|
||||
|
@ -212,7 +212,7 @@ void GSSetupPrimCodeGenerator2::Depth_XMM()
|
|||
|
||||
if (is32)
|
||||
mov(_index, ptr[rsp + _32_index]);
|
||||
mov(eax, ptr[_index + sizeof(uint32) * 1]);
|
||||
mov(eax, ptr[_index + sizeof(u32) * 1]);
|
||||
shl(eax, 6); // * sizeof(GSVertexSW)
|
||||
if (is64)
|
||||
add(rax, _64_vertex);
|
||||
|
@ -232,7 +232,7 @@ void GSSetupPrimCodeGenerator2::Depth_XMM()
|
|||
|
||||
if (m_en.z)
|
||||
{
|
||||
// uint32 z is bypassed in t.w
|
||||
// u32 z is bypassed in t.w
|
||||
|
||||
movdqa(xmm0, ptr[rax + offsetof(GSVertexSW, t)]);
|
||||
pshufd(xmm0, xmm0, _MM_SHUFFLE(3, 3, 3, 3));
|
||||
|
@ -314,7 +314,7 @@ void GSSetupPrimCodeGenerator2::Depth_YMM()
|
|||
|
||||
if (is32)
|
||||
mov(_index, ptr[rsp + _32_index]);
|
||||
mov(eax, ptr[_index + sizeof(uint32) * 1]);
|
||||
mov(eax, ptr[_index + sizeof(u32) * 1]);
|
||||
shl(eax, 6); // * sizeof(GSVertexSW)
|
||||
if (is64)
|
||||
add(rax, _64_vertex);
|
||||
|
@ -332,7 +332,7 @@ void GSSetupPrimCodeGenerator2::Depth_YMM()
|
|||
|
||||
if (m_en.z)
|
||||
{
|
||||
// m_local.p.z = vertex[index[1]].t.u32[3]; // uint32 z is bypassed in t.w
|
||||
// m_local.p.z = vertex[index[1]].t.u32[3]; // u32 z is bypassed in t.w
|
||||
|
||||
mov(t1.cvt32(), ptr[rax + offsetof(GSVertexSW, t.w)]);
|
||||
mov(_rip_local(p.z), t1.cvt32());
|
||||
|
@ -524,7 +524,7 @@ void GSSetupPrimCodeGenerator2::Color()
|
|||
{
|
||||
if (is32)
|
||||
mov(_index, ptr[rsp + _32_index]);
|
||||
mov(eax, ptr[_index + sizeof(uint32) * last]);
|
||||
mov(eax, ptr[_index + sizeof(u32) * last]);
|
||||
shl(eax, 6); // * sizeof(GSVertexSW)
|
||||
if (is64)
|
||||
add(rax, _64_vertex);
|
||||
|
|
|
@ -57,7 +57,7 @@ class GSSetupPrimCodeGenerator2 : public GSNewCodeGenerator
|
|||
bool m_rip;
|
||||
bool many_regs;
|
||||
|
||||
struct {uint32 z:1, f:1, t:1, c:1;} m_en;
|
||||
struct {u32 z:1, f:1, t:1, c:1;} m_en;
|
||||
|
||||
const XYm xym0{0}, xym1{1}, xym2{2}, xym3{3}, xym4{4}, xym5{5}, xym6{6}, xym7{7}, xym8{8}, xym9{9}, xym10{10}, xym11{11}, xym12{12}, xym13{13}, xym14{14}, xym15{15};
|
||||
const AddressReg _64_vertex, _index, _dscan, _64_t0, t1;
|
||||
|
@ -69,7 +69,7 @@ class GSSetupPrimCodeGenerator2 : public GSNewCodeGenerator
|
|||
}
|
||||
|
||||
public:
|
||||
GSSetupPrimCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, uint64 key);
|
||||
GSSetupPrimCodeGenerator2(Xbyak::CodeGenerator* base, CPUInfo cpu, void* param, u64 key);
|
||||
void Generate();
|
||||
|
||||
private:
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
using namespace Xbyak;
|
||||
|
||||
GSSetupPrimCodeGenerator::GSSetupPrimCodeGenerator(void* param, uint64 key, void* code, size_t maxsize)
|
||||
GSSetupPrimCodeGenerator::GSSetupPrimCodeGenerator(void* param, u64 key, void* code, size_t maxsize)
|
||||
: GSCodeGenerator(code, maxsize)
|
||||
, m_local(*(GSScanlineLocalData*)param)
|
||||
, m_rip(false)
|
||||
|
|
|
@ -29,9 +29,9 @@ class GSSetupPrimCodeGenerator : public GSCodeGenerator
|
|||
|
||||
struct
|
||||
{
|
||||
uint32 z : 1, f : 1, t : 1, c : 1;
|
||||
u32 z : 1, f : 1, t : 1, c : 1;
|
||||
} m_en;
|
||||
|
||||
public:
|
||||
GSSetupPrimCodeGenerator(void* param, uint64 key, void* code, size_t maxsize);
|
||||
GSSetupPrimCodeGenerator(void* param, u64 key, void* code, size_t maxsize);
|
||||
};
|
||||
|
|
|
@ -26,7 +26,7 @@ GSTextureCacheSW::~GSTextureCacheSW()
|
|||
RemoveAll();
|
||||
}
|
||||
|
||||
GSTextureCacheSW::Texture* GSTextureCacheSW::Lookup(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, uint32 tw0)
|
||||
GSTextureCacheSW::Texture* GSTextureCacheSW::Lookup(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, u32 tw0)
|
||||
{
|
||||
const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[TEX0.PSM];
|
||||
|
||||
|
@ -36,7 +36,7 @@ GSTextureCacheSW::Texture* GSTextureCacheSW::Lookup(const GIFRegTEX0& TEX0, cons
|
|||
{
|
||||
Texture* t = *i;
|
||||
|
||||
if (((TEX0.u32[0] ^ t->m_TEX0.u32[0]) | ((TEX0.u32[1] ^ t->m_TEX0.u32[1]) & 3)) != 0) // TBP0 TBW PSM TW TH
|
||||
if (((TEX0.U32[0] ^ t->m_TEX0.U32[0]) | ((TEX0.U32[1] ^ t->m_TEX0.U32[1]) & 3)) != 0) // TBP0 TBW PSM TW TH
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ GSTextureCacheSW::Texture* GSTextureCacheSW::Lookup(const GIFRegTEX0& TEX0, cons
|
|||
|
||||
m_textures.insert(t);
|
||||
|
||||
t->m_pages.loopPages([&](uint32 page)
|
||||
t->m_pages.loopPages([&](u32 page)
|
||||
{
|
||||
t->m_erase_it[page] = m_map[page].InsertFront(t);
|
||||
});
|
||||
|
@ -70,15 +70,15 @@ GSTextureCacheSW::Texture* GSTextureCacheSW::Lookup(const GIFRegTEX0& TEX0, cons
|
|||
return t;
|
||||
}
|
||||
|
||||
void GSTextureCacheSW::InvalidatePages(const GSOffset::PageLooper& pages, uint32 psm)
|
||||
void GSTextureCacheSW::InvalidatePages(const GSOffset::PageLooper& pages, u32 psm)
|
||||
{
|
||||
pages.loopPages([&](uint32 page)
|
||||
pages.loopPages([&](u32 page)
|
||||
{
|
||||
for (Texture* t : m_map[page])
|
||||
{
|
||||
if (GSUtil::HasSharedBits(psm, t->m_sharedbits))
|
||||
{
|
||||
uint32* RESTRICT valid = t->m_valid;
|
||||
u32* RESTRICT valid = t->m_valid;
|
||||
|
||||
if (t->m_repeating)
|
||||
{
|
||||
|
@ -121,7 +121,7 @@ void GSTextureCacheSW::IncAge()
|
|||
{
|
||||
i = m_textures.erase(i);
|
||||
|
||||
t->m_pages.loopPages([&](uint32 page)
|
||||
t->m_pages.loopPages([&](u32 page)
|
||||
{
|
||||
m_map[page].EraseIndex(t->m_erase_it[page]);
|
||||
});
|
||||
|
@ -137,7 +137,7 @@ void GSTextureCacheSW::IncAge()
|
|||
|
||||
//
|
||||
|
||||
GSTextureCacheSW::Texture::Texture(GSState* state, uint32 tw0, const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA)
|
||||
GSTextureCacheSW::Texture::Texture(GSState* state, u32 tw0, const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA)
|
||||
: m_state(state)
|
||||
, m_buff(NULL)
|
||||
, m_tw(tw0)
|
||||
|
@ -203,7 +203,7 @@ bool GSTextureCacheSW::Texture::Update(const GSVector4i& rect)
|
|||
|
||||
if (m_buff == NULL)
|
||||
{
|
||||
uint32 pitch = (1 << m_tw) << shift;
|
||||
u32 pitch = (1 << m_tw) << shift;
|
||||
|
||||
m_buff = _aligned_malloc(pitch * th * 4, 32);
|
||||
|
||||
|
@ -217,13 +217,13 @@ bool GSTextureCacheSW::Texture::Update(const GSVector4i& rect)
|
|||
|
||||
GSOffset off = m_offset;
|
||||
|
||||
uint32 blocks = 0;
|
||||
u32 blocks = 0;
|
||||
|
||||
GSLocalMemory::readTextureBlock rtxbP = psm.rtxbP;
|
||||
|
||||
uint32 pitch = (1 << m_tw) << shift;
|
||||
u32 pitch = (1 << m_tw) << shift;
|
||||
|
||||
uint8* dst = (uint8*)m_buff + pitch * r.top;
|
||||
u8* dst = (u8*)m_buff + pitch * r.top;
|
||||
|
||||
int block_pitch = pitch * bs.y;
|
||||
|
||||
|
@ -240,10 +240,10 @@ bool GSTextureCacheSW::Texture::Update(const GSVector4i& rect)
|
|||
for (; bn.blkX() < right; bn.nextBlockX())
|
||||
{
|
||||
int i = (bn.blkY() << 7) + bn.blkX();
|
||||
uint32 block = bn.value();
|
||||
u32 block = bn.value();
|
||||
|
||||
uint32 row = i >> 5;
|
||||
uint32 col = 1 << (i & 31);
|
||||
u32 row = i >> 5;
|
||||
u32 col = 1 << (i & 31);
|
||||
|
||||
if ((m_valid[row] & col) == 0)
|
||||
{
|
||||
|
@ -262,10 +262,10 @@ bool GSTextureCacheSW::Texture::Update(const GSVector4i& rect)
|
|||
{
|
||||
for (; bn.blkX() < right; bn.nextBlockX())
|
||||
{
|
||||
uint32 block = bn.value();
|
||||
u32 block = bn.value();
|
||||
|
||||
uint32 row = block >> 5;
|
||||
uint32 col = 1 << (block & 31);
|
||||
u32 row = block >> 5;
|
||||
u32 col = 1 << (block & 31);
|
||||
|
||||
if ((m_valid[row] & col) == 0)
|
||||
{
|
||||
|
@ -291,7 +291,7 @@ bool GSTextureCacheSW::Texture::Update(const GSVector4i& rect)
|
|||
|
||||
bool GSTextureCacheSW::Texture::Save(const std::string& fn, bool dds) const
|
||||
{
|
||||
const uint32* RESTRICT clut = m_state->m_mem.m_clut;
|
||||
const u32* RESTRICT clut = m_state->m_mem.m_clut;
|
||||
|
||||
int w = 1 << m_TEX0.TW;
|
||||
int h = 1 << m_TEX0.TH;
|
||||
|
@ -304,20 +304,20 @@ bool GSTextureCacheSW::Texture::Save(const std::string& fn, bool dds) const
|
|||
{
|
||||
const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[m_TEX0.PSM];
|
||||
|
||||
const uint8* RESTRICT src = (uint8*)m_buff;
|
||||
const u8* RESTRICT src = (u8*)m_buff;
|
||||
int pitch = 1 << (m_tw + (psm.pal == 0 ? 2 : 0));
|
||||
|
||||
for (int j = 0; j < h; j++, src += pitch, m.bits += m.pitch)
|
||||
{
|
||||
if (psm.pal == 0)
|
||||
{
|
||||
memcpy(m.bits, src, sizeof(uint32) * w);
|
||||
memcpy(m.bits, src, sizeof(u32) * w);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < w; i++)
|
||||
{
|
||||
((uint32*)m.bits)[i] = clut[src[i]];
|
||||
((u32*)m.bits)[i] = clut[src[i]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,20 +30,20 @@ public:
|
|||
GIFRegTEX0 m_TEX0;
|
||||
GIFRegTEXA m_TEXA;
|
||||
void* m_buff;
|
||||
uint32 m_tw;
|
||||
uint32 m_age;
|
||||
u32 m_tw;
|
||||
u32 m_age;
|
||||
bool m_complete;
|
||||
bool m_repeating;
|
||||
std::vector<GSVector2i>* m_p2t;
|
||||
uint32 m_valid[MAX_PAGES];
|
||||
std::array<uint16, MAX_PAGES> m_erase_it;
|
||||
const uint32* RESTRICT m_sharedbits;
|
||||
u32 m_valid[MAX_PAGES];
|
||||
std::array<u16, MAX_PAGES> m_erase_it;
|
||||
const u32* RESTRICT m_sharedbits;
|
||||
|
||||
// m_valid
|
||||
// fast mode: each uint32 bits map to the 32 blocks of that page
|
||||
// repeating mode: 1 bpp image of the texture tiles (8x8), also having 512 elements is just a coincidence (worst case: (1024*1024)/(8*8)/(sizeof(uint32)*8))
|
||||
// fast mode: each u32 bits map to the 32 blocks of that page
|
||||
// repeating mode: 1 bpp image of the texture tiles (8x8), also having 512 elements is just a coincidence (worst case: (1024*1024)/(8*8)/(sizeof(u32)*8))
|
||||
|
||||
Texture(GSState* state, uint32 tw0, const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA);
|
||||
Texture(GSState* state, u32 tw0, const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA);
|
||||
virtual ~Texture();
|
||||
|
||||
bool Update(const GSVector4i& r);
|
||||
|
@ -59,9 +59,9 @@ public:
|
|||
GSTextureCacheSW(GSState* state);
|
||||
virtual ~GSTextureCacheSW();
|
||||
|
||||
Texture* Lookup(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, uint32 tw0 = 0);
|
||||
Texture* Lookup(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA, u32 tw0 = 0);
|
||||
|
||||
void InvalidatePages(const GSOffset::PageLooper& pages, uint32 psm);
|
||||
void InvalidatePages(const GSOffset::PageLooper& pages, u32 psm);
|
||||
|
||||
void RemoveAll();
|
||||
void IncAge();
|
||||
|
|
|
@ -38,8 +38,8 @@ bool GSTextureSW::Update(const GSVector4i& r, const void* data, int pitch, int l
|
|||
|
||||
if (m_data != NULL && Map(m, &r))
|
||||
{
|
||||
uint8* RESTRICT src = (uint8*)data;
|
||||
uint8* RESTRICT dst = m.bits;
|
||||
u8* RESTRICT src = (u8*)data;
|
||||
u8* RESTRICT dst = m.bits;
|
||||
|
||||
int rowbytes = r.width() << 2;
|
||||
|
||||
|
@ -64,7 +64,7 @@ bool GSTextureSW::Map(GSMap& m, const GSVector4i* r, int layer)
|
|||
{
|
||||
if (!m_mapped.test_and_set(std::memory_order_acquire))
|
||||
{
|
||||
m.bits = (uint8*)m_data + m_pitch * r2.top + (r2.left << 2);
|
||||
m.bits = (u8*)m_data + m_pitch * r2.top + (r2.left << 2);
|
||||
m.pitch = m_pitch;
|
||||
|
||||
return true;
|
||||
|
@ -87,5 +87,5 @@ bool GSTextureSW::Save(const std::string& fn)
|
|||
GSPng::Format fmt = GSPng::RGB_PNG;
|
||||
#endif
|
||||
int compression = theApp.GetConfigI("png_compression_level");
|
||||
return GSPng::Save(fmt, fn, static_cast<uint8*>(m_data), m_size.x, m_size.y, m_pitch, compression);
|
||||
return GSPng::Save(fmt, fn, static_cast<u8*>(m_data), m_size.x, m_size.y, m_pitch, compression);
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
#include <gtest/gtest.h>
|
||||
#include <string.h>
|
||||
|
||||
static void swizzle(const uint8* table, uint8* dst, const uint8* src, int bpp, bool deswizzle)
|
||||
static void swizzle(const u8* table, u8* dst, const u8* src, int bpp, bool deswizzle)
|
||||
{
|
||||
int pxbytes = bpp / 8;
|
||||
for (int i = 0; i < (256 / pxbytes); i++)
|
||||
|
@ -30,21 +30,21 @@ static void swizzle(const uint8* table, uint8* dst, const uint8* src, int bpp, b
|
|||
}
|
||||
}
|
||||
|
||||
static void swizzle4(const uint16* table, uint8* dst, const uint8* src, bool deswizzle)
|
||||
static void swizzle4(const u16* table, u8* dst, const u8* src, bool deswizzle)
|
||||
{
|
||||
for (int i = 0; i < 512; i++)
|
||||
{
|
||||
int soff = (deswizzle ? table[i] : i);
|
||||
int doff = (deswizzle ? i : table[i]);
|
||||
int spx = src[soff >> 1] >> ((soff & 1) * 4) & 0xF;
|
||||
uint8* dpx = &dst[doff >> 1];
|
||||
u8* dpx = &dst[doff >> 1];
|
||||
int dshift = (doff & 1) * 4;
|
||||
*dpx &= (0xF0 >> dshift);
|
||||
*dpx |= (spx << dshift);
|
||||
}
|
||||
}
|
||||
|
||||
static void swizzleH(const uint8* table, uint32* dst, const uint8* src, int bpp, int shift)
|
||||
static void swizzleH(const u8* table, u32* dst, const u8* src, int bpp, int shift)
|
||||
{
|
||||
for (int i = 0; i < 64; i++)
|
||||
{
|
||||
|
@ -58,7 +58,7 @@ static void swizzleH(const uint8* table, uint32* dst, const uint8* src, int bpp,
|
|||
}
|
||||
}
|
||||
|
||||
static void expand16(uint32* dst, const uint16* src, const GIFRegTEXA& texa)
|
||||
static void expand16(u32* dst, const u16* src, const GIFRegTEXA& texa)
|
||||
{
|
||||
for (int i = 0; i < 128; i++)
|
||||
{
|
||||
|
@ -77,7 +77,7 @@ static void expand16(uint32* dst, const uint16* src, const GIFRegTEXA& texa)
|
|||
}
|
||||
}
|
||||
|
||||
static void expand8(uint32* dst, const uint8* src, const uint32* palette)
|
||||
static void expand8(u32* dst, const u8* src, const u32* palette)
|
||||
{
|
||||
for (int i = 0; i < 256; i++)
|
||||
{
|
||||
|
@ -85,7 +85,7 @@ static void expand8(uint32* dst, const uint8* src, const uint32* palette)
|
|||
}
|
||||
}
|
||||
|
||||
static void expand4(uint32* dst, const uint8* src, const uint32* palette)
|
||||
static void expand4(u32* dst, const u8* src, const u32* palette)
|
||||
{
|
||||
for (int i = 0; i < 512; i++)
|
||||
{
|
||||
|
@ -93,7 +93,7 @@ static void expand4(uint32* dst, const uint8* src, const uint32* palette)
|
|||
}
|
||||
}
|
||||
|
||||
static void expand4P(uint8* dst, const uint8* src)
|
||||
static void expand4P(u8* dst, const u8* src)
|
||||
{
|
||||
for (int i = 0; i < 512; i++)
|
||||
{
|
||||
|
@ -101,7 +101,7 @@ static void expand4P(uint8* dst, const uint8* src)
|
|||
}
|
||||
}
|
||||
|
||||
static void expandH(uint32* dst, const uint32* src, const uint32* palette, int shift, int mask)
|
||||
static void expandH(u32* dst, const u32* src, const u32* palette, int shift, int mask)
|
||||
{
|
||||
for (int i = 0; i < 64; i++)
|
||||
{
|
||||
|
@ -109,7 +109,7 @@ static void expandH(uint32* dst, const uint32* src, const uint32* palette, int s
|
|||
}
|
||||
}
|
||||
|
||||
static void expandHP(uint8* dst, const uint32* src, int shift, int mask)
|
||||
static void expandHP(u8* dst, const u32* src, int shift, int mask)
|
||||
{
|
||||
for (int i = 0; i < 64; i++)
|
||||
{
|
||||
|
@ -117,7 +117,7 @@ static void expandHP(uint8* dst, const uint32* src, int shift, int mask)
|
|||
}
|
||||
}
|
||||
|
||||
static std::string image2hex(const uint8* bin, int rows, int columns, int bpp)
|
||||
static std::string image2hex(const u8* bin, int rows, int columns, int bpp)
|
||||
{
|
||||
std::string out;
|
||||
const char* hex = "0123456789ABCDEF";
|
||||
|
@ -159,10 +159,10 @@ static std::string image2hex(const uint8* bin, int rows, int columns, int bpp)
|
|||
|
||||
struct TestData
|
||||
{
|
||||
alignas(64) uint8 block[256];
|
||||
alignas(64) uint8 output[256 * (32 / 4)];
|
||||
alignas(64) uint32 clut32[256];
|
||||
alignas(64) uint64 clut64[256];
|
||||
alignas(64) u8 block[256];
|
||||
alignas(64) u8 output[256 * (32 / 4)];
|
||||
alignas(64) u32 clut32[256];
|
||||
alignas(64) u64 clut64[256];
|
||||
|
||||
/// Get some input data with pixel values counting up from 0
|
||||
static TestData Linear()
|
||||
|
@ -202,39 +202,39 @@ struct TestData
|
|||
}
|
||||
};
|
||||
|
||||
static TestData swizzle(const uint8* table, TestData data, int bpp, bool deswizzle)
|
||||
static TestData swizzle(const u8* table, TestData data, int bpp, bool deswizzle)
|
||||
{
|
||||
swizzle(table, data.output, data.block, bpp, deswizzle);
|
||||
return data;
|
||||
}
|
||||
|
||||
static TestData swizzle4(const uint16* table, TestData data, bool deswizzle)
|
||||
static TestData swizzle4(const u16* table, TestData data, bool deswizzle)
|
||||
{
|
||||
swizzle4(table, data.output, data.block, deswizzle);
|
||||
return data;
|
||||
}
|
||||
|
||||
static TestData swizzleH(const uint8* table, TestData data, int bpp, int shift)
|
||||
static TestData swizzleH(const u8* table, TestData data, int bpp, int shift)
|
||||
{
|
||||
swizzleH(table, reinterpret_cast<uint32*>(data.output), data.block, bpp, shift);
|
||||
swizzleH(table, reinterpret_cast<u32*>(data.output), data.block, bpp, shift);
|
||||
return data;
|
||||
}
|
||||
|
||||
static TestData expand16(TestData data, const GIFRegTEXA& texa)
|
||||
{
|
||||
expand16(reinterpret_cast<uint32*>(data.output), reinterpret_cast<const uint16*>(data.block), texa);
|
||||
expand16(reinterpret_cast<u32*>(data.output), reinterpret_cast<const u16*>(data.block), texa);
|
||||
return data;
|
||||
}
|
||||
|
||||
static TestData expand8(TestData data)
|
||||
{
|
||||
expand8(reinterpret_cast<uint32*>(data.output), data.block, data.clut32);
|
||||
expand8(reinterpret_cast<u32*>(data.output), data.block, data.clut32);
|
||||
return data;
|
||||
}
|
||||
|
||||
static TestData expand4(TestData data)
|
||||
{
|
||||
expand4(reinterpret_cast<uint32*>(data.output), data.block, data.clut32);
|
||||
expand4(reinterpret_cast<u32*>(data.output), data.block, data.clut32);
|
||||
return data;
|
||||
}
|
||||
|
||||
|
@ -246,13 +246,13 @@ static TestData expand4P(TestData data)
|
|||
|
||||
static TestData expandH(TestData data, int shift, int mask)
|
||||
{
|
||||
expandH(reinterpret_cast<uint32*>(data.output), reinterpret_cast<const uint32*>(data.block), data.clut32, shift, mask);
|
||||
expandH(reinterpret_cast<u32*>(data.output), reinterpret_cast<const u32*>(data.block), data.clut32, shift, mask);
|
||||
return data;
|
||||
}
|
||||
|
||||
static TestData expandHP(TestData data, int shift, int mask)
|
||||
{
|
||||
expandHP(data.output, reinterpret_cast<uint32*>(data.block), shift, mask);
|
||||
expandHP(data.output, reinterpret_cast<u32*>(data.block), shift, mask);
|
||||
return data;
|
||||
}
|
||||
|
||||
|
@ -318,7 +318,7 @@ TEST(ReadAndExpandTest, Read16AEM)
|
|||
runTest([](TestData data)
|
||||
{
|
||||
// Actually test AEM
|
||||
uint8 idx = data.block[0] >> 1;
|
||||
u8 idx = data.block[0] >> 1;
|
||||
data.block[idx * 2 + 0] = 0;
|
||||
data.block[idx * 2 + 1] = 0;
|
||||
GIFRegTEXA texa = {0};
|
||||
|
|
Loading…
Reference in New Issue