Prepare texture preloading support
This commit is contained in:
parent
20a4735b4d
commit
dabb35afce
|
@ -85,14 +85,14 @@ void LoadBPReg(const BPCmd &bp, BPMemory &bpMem)
|
||||||
|
|
||||||
void GetTlutLoadData(u32 &tlutAddr, u32 &memAddr, u32 &tlutXferCount, BPMemory &bpMem)
|
void GetTlutLoadData(u32 &tlutAddr, u32 &memAddr, u32 &tlutXferCount, BPMemory &bpMem)
|
||||||
{
|
{
|
||||||
tlutAddr = (bpMem.tlutXferDest & 0x3FF) << 9;
|
tlutAddr = (bpMem.tmem_config.tlut_dest & 0x3FF) << 9;
|
||||||
tlutXferCount = (bpMem.tlutXferDest & 0x1FFC00) >> 5;
|
tlutXferCount = (bpMem.tmem_config.tlut_dest & 0x1FFC00) >> 5;
|
||||||
|
|
||||||
// TODO - figure out a cleaner way.
|
// TODO - figure out a cleaner way.
|
||||||
if (Core::g_CoreStartupParameter.bWii)
|
if (Core::g_CoreStartupParameter.bWii)
|
||||||
memAddr = bpmem.tlutXferSrc << 5;
|
memAddr = bpmem.tmem_config.tlut_src << 5;
|
||||||
else
|
else
|
||||||
memAddr = (bpmem.tlutXferSrc & 0xFFFFF) << 5;
|
memAddr = (bpmem.tmem_config.tlut_src & 0xFFFFF) << 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadCPReg(u32 subCmd, u32 value, CPMemory &cpMem)
|
void LoadCPReg(u32 subCmd, u32 value, CPMemory &cpMem)
|
||||||
|
|
|
@ -65,10 +65,10 @@
|
||||||
#define BPMEM_UNKOWN_57 0x57
|
#define BPMEM_UNKOWN_57 0x57
|
||||||
#define BPMEM_REVBITS 0x58
|
#define BPMEM_REVBITS 0x58
|
||||||
#define BPMEM_SCISSOROFFSET 0x59
|
#define BPMEM_SCISSOROFFSET 0x59
|
||||||
#define BPMEM_UNKNOWN_60 0x60
|
#define BPMEM_PRELOAD_ADDR 0x60
|
||||||
#define BPMEM_UNKNOWN_61 0x61
|
#define BPMEM_PRELOAD_TMEMEVEN 0x61
|
||||||
#define BPMEM_UNKNOWN_62 0x62
|
#define BPMEM_PRELOAD_TMEMODD 0x62
|
||||||
#define BPMEM_TEXMODESYNC 0x63
|
#define BPMEM_PRELOAD_MODE 0x63
|
||||||
#define BPMEM_LOADTLUT0 0x64
|
#define BPMEM_LOADTLUT0 0x64
|
||||||
#define BPMEM_LOADTLUT1 0x65
|
#define BPMEM_LOADTLUT1 0x65
|
||||||
#define BPMEM_TEXINVALIDATE 0x66
|
#define BPMEM_TEXINVALIDATE 0x66
|
||||||
|
@ -487,10 +487,10 @@ union TexImage1
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
u32 tmem_offset : 15; // we ignore texture caching for now, we do it ourselves
|
u32 tmem_even : 15; // tmem line index for even LODs
|
||||||
u32 cache_width : 3;
|
u32 cache_width : 3;
|
||||||
u32 cache_height : 3;
|
u32 cache_height : 3;
|
||||||
u32 image_type : 1;
|
u32 image_type : 1; // 1 if this texture is managed manually (0 means we'll autofetch the texture data whenever it changes)
|
||||||
};
|
};
|
||||||
u32 hex;
|
u32 hex;
|
||||||
};
|
};
|
||||||
|
@ -499,7 +499,7 @@ union TexImage2
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
u32 tmem_offset : 15; // we ignore texture caching for now, we do it ourselves
|
u32 tmem_odd : 15; // tmem line index for odd LODs
|
||||||
u32 cache_width : 3;
|
u32 cache_width : 3;
|
||||||
u32 cache_height : 3;
|
u32 cache_height : 3;
|
||||||
};
|
};
|
||||||
|
@ -893,6 +893,25 @@ union UPE_Copy
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
union BPU_PreloadTileInfo
|
||||||
|
{
|
||||||
|
u32 hex;
|
||||||
|
struct {
|
||||||
|
u32 count : 15;
|
||||||
|
u32 type : 2;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BPS_TmemConfig
|
||||||
|
{
|
||||||
|
u32 preload_addr;
|
||||||
|
u32 preload_tmem_even;
|
||||||
|
u32 preload_tmem_odd;
|
||||||
|
BPU_PreloadTileInfo preload_tile_info;
|
||||||
|
u32 tlut_src;
|
||||||
|
u32 tlut_dest;
|
||||||
|
u32 texinvalidate;
|
||||||
|
};
|
||||||
|
|
||||||
// All of BP memory
|
// All of BP memory
|
||||||
|
|
||||||
|
@ -951,10 +970,8 @@ struct BPMemory
|
||||||
u32 boundbox1;//56
|
u32 boundbox1;//56
|
||||||
u32 unknown7[2];//57,58
|
u32 unknown7[2];//57,58
|
||||||
X10Y10 scissorOffset; //59
|
X10Y10 scissorOffset; //59
|
||||||
u32 unknown8[10]; //5a,5b,5c,5d, 5e,5f,60,61, 62, 63 (GXTexModeSync), 0x60-0x63 have to do with preloaded textures?
|
u32 unknown8[6]; //5a,5b,5c,5d, 5e,5f
|
||||||
u32 tlutXferSrc; //64
|
BPS_TmemConfig tmem_config; // 60-66
|
||||||
u32 tlutXferDest; //65
|
|
||||||
u32 texinvalidate;//66
|
|
||||||
u32 metric; //67
|
u32 metric; //67
|
||||||
FieldMode fieldmode;//68
|
FieldMode fieldmode;//68
|
||||||
u32 unknown10[7];//69-6F
|
u32 unknown10[7];//69-6F
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "VertexLoader.h"
|
#include "VertexLoader.h"
|
||||||
#include "VertexShaderManager.h"
|
#include "VertexShaderManager.h"
|
||||||
#include "Thread.h"
|
#include "Thread.h"
|
||||||
|
#include "HW/Memmap.h"
|
||||||
|
|
||||||
using namespace BPFunctions;
|
using namespace BPFunctions;
|
||||||
|
|
||||||
|
@ -301,14 +302,14 @@ void BPWritten(const BPCmd& bp)
|
||||||
|
|
||||||
// TODO - figure out a cleaner way.
|
// TODO - figure out a cleaner way.
|
||||||
if (GetConfig(CONFIG_ISWII))
|
if (GetConfig(CONFIG_ISWII))
|
||||||
ptr = GetPointer(bpmem.tlutXferSrc << 5);
|
ptr = GetPointer(bpmem.tmem_config.tlut_src << 5);
|
||||||
else
|
else
|
||||||
ptr = GetPointer((bpmem.tlutXferSrc & 0xFFFFF) << 5);
|
ptr = GetPointer((bpmem.tmem_config.tlut_src & 0xFFFFF) << 5);
|
||||||
|
|
||||||
if (ptr)
|
if (ptr)
|
||||||
memcpy_gc(texMem + tlutTMemAddr, ptr, tlutXferCount);
|
memcpy_gc(texMem + tlutTMemAddr, ptr, tlutXferCount);
|
||||||
else
|
else
|
||||||
PanicAlert("Invalid palette pointer %08x %08x %08x", bpmem.tlutXferSrc, bpmem.tlutXferSrc << 5, (bpmem.tlutXferSrc & 0xFFFFF)<< 5);
|
PanicAlert("Invalid palette pointer %08x %08x %08x", bpmem.tmem_config.tlut_src, bpmem.tmem_config.tlut_src << 5, (bpmem.tmem_config.tlut_src & 0xFFFFF)<< 5);
|
||||||
|
|
||||||
// TODO(ector) : kill all textures that use this palette
|
// TODO(ector) : kill all textures that use this palette
|
||||||
// Not sure if it's a good idea, though. For now, we hash texture palettes
|
// Not sure if it's a good idea, though. For now, we hash texture palettes
|
||||||
|
@ -466,14 +467,22 @@ void BPWritten(const BPCmd& bp)
|
||||||
DEBUG_LOG(VIDEO, "Uknown BP Reg 0x57: %08x", bp.newvalue);
|
DEBUG_LOG(VIDEO, "Uknown BP Reg 0x57: %08x", bp.newvalue);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BPMEM_UNKNOWN_60:
|
case BPMEM_PRELOAD_ADDR:
|
||||||
case BPMEM_UNKNOWN_61:
|
case BPMEM_PRELOAD_TMEMEVEN:
|
||||||
case BPMEM_UNKNOWN_62:
|
case BPMEM_PRELOAD_TMEMODD: // Used when PRELOAD_MODE is set
|
||||||
// Cases added due to: http://code.google.com/p/dolphin-emu/issues/detail?id=360#c90
|
|
||||||
// Are these related to BBox?
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BPMEM_TEXMODESYNC: // Always set to 0 when GX_TexModeSync() is called.
|
case BPMEM_PRELOAD_MODE: // Set to 0 when GX_TexModeSync() is called.
|
||||||
|
// if this is different from 0, manual TMEM management is used.
|
||||||
|
if (bp.newvalue != 0)
|
||||||
|
{
|
||||||
|
// NOTE(neobrain): Apparently tmemodd doesn't affect hardware behavior at all (libogc uses it just as a buffer and switches its contents with tmemeven whenever this is called)
|
||||||
|
BPS_TmemConfig& tmem_cfg = bpmem.tmem_config;
|
||||||
|
u8* ram_ptr = Memory::GetPointer(tmem_cfg.preload_addr << 5);
|
||||||
|
u32 tmem_addr = tmem_cfg.preload_tmem_even * TMEM_LINE_SIZE;
|
||||||
|
u32 size = tmem_cfg.preload_tile_info.count * 32;
|
||||||
|
memcpy(texMem + tmem_addr, ram_ptr, size);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// ------------------------------------------------
|
// ------------------------------------------------
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
TMEM_SIZE = 1024*1024,
|
TMEM_SIZE = 1024*1024,
|
||||||
HALFTMEM_SIZE = 512*1024
|
TMEM_LINE_SIZE = 32,
|
||||||
};
|
};
|
||||||
extern GC_ALIGNED16(u8 texMem[TMEM_SIZE]);
|
extern GC_ALIGNED16(u8 texMem[TMEM_SIZE]);
|
||||||
|
|
||||||
|
|
|
@ -101,14 +101,14 @@ void SWBPWritten(int address, int newvalue)
|
||||||
|
|
||||||
// TODO - figure out a cleaner way.
|
// TODO - figure out a cleaner way.
|
||||||
if (Core::g_CoreStartupParameter.bWii)
|
if (Core::g_CoreStartupParameter.bWii)
|
||||||
ptr = Memory::GetPointer(bpmem.tlutXferSrc << 5);
|
ptr = Memory::GetPointer(bpmem.tmem_config.tlut_src << 5);
|
||||||
else
|
else
|
||||||
ptr = Memory::GetPointer((bpmem.tlutXferSrc & 0xFFFFF) << 5);
|
ptr = Memory::GetPointer((bpmem.tmem_config.tlut_src & 0xFFFFF) << 5);
|
||||||
|
|
||||||
if (ptr)
|
if (ptr)
|
||||||
memcpy_gc(texMem + tlutTMemAddr, ptr, tlutXferCount);
|
memcpy_gc(texMem + tlutTMemAddr, ptr, tlutXferCount);
|
||||||
else
|
else
|
||||||
PanicAlert("Invalid palette pointer %08x %08x %08x", bpmem.tlutXferSrc, bpmem.tlutXferSrc << 5, (bpmem.tlutXferSrc & 0xFFFFF)<< 5);
|
PanicAlert("Invalid palette pointer %08x %08x %08x", bpmem.tmem_config.tlut_src, bpmem.tmem_config.tlut_src << 5, (bpmem.tmem_config.tlut_src & 0xFFFFF)<< 5);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue