Prepare texture preloading support

This commit is contained in:
NeoBrainX 2012-01-29 21:17:22 +01:00
parent 20a4735b4d
commit dabb35afce
5 changed files with 56 additions and 30 deletions

View File

@ -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)

View File

@ -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

View File

@ -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;
// ------------------------------------------------ // ------------------------------------------------

View File

@ -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]);

View File

@ -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;
} }