mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-14 15:00:30 +02:00
Core: Let 16-bit CPU accesses through the depth mirrors see the GE's layout
With the software renderer, which now stores depth as the GE does, a 16-bit read or write at VRAM's 0x04200000 or 0x04600000 mirror goes to where the GE's 16-bit or 32-bit color layout puts that depth pixel (ppsspp-re geprobe exp88: the mirrors are the layout's exact inverse). Games access depth there with nothing else, so other widths stay plain. The accessors check the address, then whether the GPU core is the software renderer (CoreParameter); the hardware renderers keep depth plain and handle the layout their own way. The renderer keeps the layouts up to date with the EDRAM address translation. With it, the JITs send 16-bit loads and stores to the interpreter, and the IR passes don't change a load's width to or from 16 bits. The pspautotests that read depth through the mirrors now do so 16 bits at a time, re-recorded on hardware unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
a11fd22553
commit
ae32477764
12 files changed
+99
-25
No files matched your search
@@ -82,6 +82,18 @@ static u8 *m_pUncachedVRAM[4];
|
||||
// Required for HD Remasters to work properly.
|
||||
// This replaces RAM_NORMAL_SIZE at runtime.
|
||||
u32 g_MemorySize;
|
||||
int g_depthTranslationIndex = DepthTranslationIndex(0x400);
|
||||
|
||||
bool DepthMirrorsActive() {
|
||||
return PSP_CoreParameter().gpuCore == GPUCORE_SOFTWARE;
|
||||
}
|
||||
|
||||
u32 DepthMirroredSlow(u32 address) {
|
||||
if (!DepthMirrorsActive())
|
||||
return address;
|
||||
const DepthLayout &layout = DEPTH_LAYOUTS[(address >> 22) & 1][g_depthTranslationIndex];
|
||||
return (address & 0x40000000) | 0x04000000 | layout.Stored(address & 0x001FFFFF);
|
||||
}
|
||||
// Used to store the PSP model on game startup.
|
||||
u32 g_PSPModel;
|
||||
u32 g_UserPartitionSize;
|
||||
|
||||
Reference in new issue
Block a user