From bc8a4f99c754c13b8e40d88ef012e93934f98125 Mon Sep 17 00:00:00 2001 From: booto Date: Fri, 31 May 2019 02:46:17 -0400 Subject: [PATCH] VideoCommon: Constrain the array_base registers The array_base registers as part of CP state do not seem to incorporate the upper bits in the physical address they try to access. --- Source/Core/VideoCommon/CommandProcessor.cpp | 9 ++++++++- Source/Core/VideoCommon/CommandProcessor.h | 2 ++ Source/Core/VideoCommon/VertexLoaderManager.cpp | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Source/Core/VideoCommon/CommandProcessor.cpp b/Source/Core/VideoCommon/CommandProcessor.cpp index 897675f4e0..eb571a4672 100644 --- a/Source/Core/VideoCommon/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/CommandProcessor.cpp @@ -138,12 +138,19 @@ void Init() et_UpdateInterrupts = CoreTiming::RegisterEvent("CPInterrupt", UpdateInterrupts_Wrapper); } +u32 GetPhysicalAddressMask() +{ + // Physical addresses in CP seem to ignore some of the upper bits (depending on platform) + // This can be observed in CP MMIO registers by setting to 0xffffffff and then reading back. + return SConfig::GetInstance().bWii ? 0x1fffffff : 0x03ffffff; +} + void RegisterMMIO(MMIO::Mapping* mmio, u32 base) { constexpr u16 WMASK_NONE = 0x0000; constexpr u16 WMASK_ALL = 0xffff; constexpr u16 WMASK_LO_ALIGN_32BIT = 0xffe0; - const u16 WMASK_HI_RESTRICT = SConfig::GetInstance().bWii ? 0x1fff : 0x03ff; + const u16 WMASK_HI_RESTRICT = GetPhysicalAddressMask() >> 16; struct { diff --git a/Source/Core/VideoCommon/CommandProcessor.h b/Source/Core/VideoCommon/CommandProcessor.h index 77623357d9..c246d5651d 100644 --- a/Source/Core/VideoCommon/CommandProcessor.h +++ b/Source/Core/VideoCommon/CommandProcessor.h @@ -169,4 +169,6 @@ void SetCpStatusRegister(); void HandleUnknownOpcode(u8 cmd_byte, void* buffer, bool preprocess); +u32 GetPhysicalAddressMask(); + } // namespace CommandProcessor diff --git a/Source/Core/VideoCommon/VertexLoaderManager.cpp b/Source/Core/VideoCommon/VertexLoaderManager.cpp index 4fd7e164d7..a57cb71929 100644 --- a/Source/Core/VideoCommon/VertexLoaderManager.cpp +++ b/Source/Core/VideoCommon/VertexLoaderManager.cpp @@ -16,6 +16,7 @@ #include "Core/HW/Memmap.h" #include "VideoCommon/BPMemory.h" +#include "VideoCommon/CommandProcessor.h" #include "VideoCommon/DataReader.h" #include "VideoCommon/IndexGenerator.h" #include "VideoCommon/NativeVertexFormat.h" @@ -347,7 +348,7 @@ void LoadCPReg(u32 sub_cmd, u32 value, bool is_preprocess) // Pointers to vertex arrays in GC RAM case 0xA0: - state->array_bases[sub_cmd & 0xF] = value; + state->array_bases[sub_cmd & 0xF] = value & CommandProcessor::GetPhysicalAddressMask(); state->bases_dirty = true; break;