summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorNeoBrainX <NeoBrainX@googlemail.com>2012-01-29 21:17:22 +0100
committerNeoBrainX <NeoBrainX@googlemail.com>2012-02-03 21:20:34 +0100
commitdabb35afce2539b312935d2fcfe264018d24dbec (patch)
treed0584b7c4dd7937b22a39c12aa14fbf8f5cf81fe /Source/Core
parent20a4735b4da47b13ee56954bb09ae5b02f944165 (diff)
Prepare texture preloading support
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/FifoPlayer/FifoAnalyzer.cpp8
-rw-r--r--Source/Core/VideoCommon/Src/BPMemory.h41
-rw-r--r--Source/Core/VideoCommon/Src/BPStructs.cpp27
-rw-r--r--Source/Core/VideoCommon/Src/TextureDecoder.h4
4 files changed, 53 insertions, 27 deletions
diff --git a/Source/Core/Core/Src/FifoPlayer/FifoAnalyzer.cpp b/Source/Core/Core/Src/FifoPlayer/FifoAnalyzer.cpp
index 4b22e8f851..58ad9eded3 100644
--- a/Source/Core/Core/Src/FifoPlayer/FifoAnalyzer.cpp
+++ b/Source/Core/Core/Src/FifoPlayer/FifoAnalyzer.cpp
@@ -85,14 +85,14 @@ void LoadBPReg(const BPCmd &bp, BPMemory &bpMem)
void GetTlutLoadData(u32 &tlutAddr, u32 &memAddr, u32 &tlutXferCount, BPMemory &bpMem)
{
- tlutAddr = (bpMem.tlutXferDest & 0x3FF) << 9;
- tlutXferCount = (bpMem.tlutXferDest & 0x1FFC00) >> 5;
+ tlutAddr = (bpMem.tmem_config.tlut_dest & 0x3FF) << 9;
+ tlutXferCount = (bpMem.tmem_config.tlut_dest & 0x1FFC00) >> 5;
// TODO - figure out a cleaner way.
if (Core::g_CoreStartupParameter.bWii)
- memAddr = bpmem.tlutXferSrc << 5;
+ memAddr = bpmem.tmem_config.tlut_src << 5;
else
- memAddr = (bpmem.tlutXferSrc & 0xFFFFF) << 5;
+ memAddr = (bpmem.tmem_config.tlut_src & 0xFFFFF) << 5;
}
void LoadCPReg(u32 subCmd, u32 value, CPMemory &cpMem)
diff --git a/Source/Core/VideoCommon/Src/BPMemory.h b/Source/Core/VideoCommon/Src/BPMemory.h
index 1f6f453a77..0bb2bf9013 100644
--- a/Source/Core/VideoCommon/Src/BPMemory.h
+++ b/Source/Core/VideoCommon/Src/BPMemory.h
@@ -65,10 +65,10 @@
#define BPMEM_UNKOWN_57 0x57
#define BPMEM_REVBITS 0x58
#define BPMEM_SCISSOROFFSET 0x59
-#define BPMEM_UNKNOWN_60 0x60
-#define BPMEM_UNKNOWN_61 0x61
-#define BPMEM_UNKNOWN_62 0x62
-#define BPMEM_TEXMODESYNC 0x63
+#define BPMEM_PRELOAD_ADDR 0x60
+#define BPMEM_PRELOAD_TMEMEVEN 0x61
+#define BPMEM_PRELOAD_TMEMODD 0x62
+#define BPMEM_PRELOAD_MODE 0x63
#define BPMEM_LOADTLUT0 0x64
#define BPMEM_LOADTLUT1 0x65
#define BPMEM_TEXINVALIDATE 0x66
@@ -487,10 +487,10 @@ union TexImage1
{
struct
{
- u32 tmem_offset : 15; // we ignore texture caching for now, we do it ourselves
- u32 cache_width : 3;
+ u32 tmem_even : 15; // tmem line index for even LODs
+ u32 cache_width : 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;
};
@@ -499,7 +499,7 @@ union TexImage2
{
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_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
@@ -951,10 +970,8 @@ struct BPMemory
u32 boundbox1;//56
u32 unknown7[2];//57,58
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 tlutXferSrc; //64
- u32 tlutXferDest; //65
- u32 texinvalidate;//66
+ u32 unknown8[6]; //5a,5b,5c,5d, 5e,5f
+ BPS_TmemConfig tmem_config; // 60-66
u32 metric; //67
FieldMode fieldmode;//68
u32 unknown10[7];//69-6F
diff --git a/Source/Core/VideoCommon/Src/BPStructs.cpp b/Source/Core/VideoCommon/Src/BPStructs.cpp
index d06f1de8b9..6cb102555b 100644
--- a/Source/Core/VideoCommon/Src/BPStructs.cpp
+++ b/Source/Core/VideoCommon/Src/BPStructs.cpp
@@ -30,6 +30,7 @@
#include "VertexLoader.h"
#include "VertexShaderManager.h"
#include "Thread.h"
+#include "HW/Memmap.h"
using namespace BPFunctions;
@@ -301,14 +302,14 @@ void BPWritten(const BPCmd& bp)
// TODO - figure out a cleaner way.
if (GetConfig(CONFIG_ISWII))
- ptr = GetPointer(bpmem.tlutXferSrc << 5);
+ ptr = GetPointer(bpmem.tmem_config.tlut_src << 5);
else
- ptr = GetPointer((bpmem.tlutXferSrc & 0xFFFFF) << 5);
+ ptr = GetPointer((bpmem.tmem_config.tlut_src & 0xFFFFF) << 5);
if (ptr)
memcpy_gc(texMem + tlutTMemAddr, ptr, tlutXferCount);
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
// 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);
break;
- case BPMEM_UNKNOWN_60:
- case BPMEM_UNKNOWN_61:
- case BPMEM_UNKNOWN_62:
- // Cases added due to: http://code.google.com/p/dolphin-emu/issues/detail?id=360#c90
- // Are these related to BBox?
+ case BPMEM_PRELOAD_ADDR:
+ case BPMEM_PRELOAD_TMEMEVEN:
+ case BPMEM_PRELOAD_TMEMODD: // Used when PRELOAD_MODE is set
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;
// ------------------------------------------------
diff --git a/Source/Core/VideoCommon/Src/TextureDecoder.h b/Source/Core/VideoCommon/Src/TextureDecoder.h
index d990d21545..1901c86d27 100644
--- a/Source/Core/VideoCommon/Src/TextureDecoder.h
+++ b/Source/Core/VideoCommon/Src/TextureDecoder.h
@@ -20,8 +20,8 @@
#include "Hash.h"
enum
{
- TMEM_SIZE = 1024*1024,
- HALFTMEM_SIZE = 512*1024
+ TMEM_SIZE = 1024*1024,
+ TMEM_LINE_SIZE = 32,
};
extern GC_ALIGNED16(u8 texMem[TMEM_SIZE]);