From e85b72408555ab4760b3b511ddf6699ee1d9d800 Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Sun, 22 Sep 2019 10:29:53 +0200 Subject: [PATCH] vmem: mprotect P2 vram space Used by NHL 2K2 yuv textures Fixes FMV not being updated --- core/hw/mem/_vmem.cpp | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/core/hw/mem/_vmem.cpp b/core/hw/mem/_vmem.cpp index ea0251c0f..5fd5a271f 100644 --- a/core/hw/mem/_vmem.cpp +++ b/core/hw/mem/_vmem.cpp @@ -637,25 +637,27 @@ void _vmem_protect_vram(u32 addr, u32 size) if (VRAM_SIZE == 0x800000) { // wraps when only 8MB VRAM - mem_region_lock(virt_ram_base + 0x04000000 + addr + VRAM_SIZE, size); - //mem_region_lock(virt_ram_base + 0x06000000 + addr + VRAM_SIZE, size); + mem_region_lock(virt_ram_base + 0x04000000 + addr + VRAM_SIZE, size); // P0 wrap + //mem_region_lock(virt_ram_base + 0x06000000 + addr + VRAM_SIZE, size); // P0 mirror wrap } } if (_nvmem_4gb_space()) { mem_region_lock(virt_ram_base + 0x84000000 + addr, size); // P1 //mem_region_lock(virt_ram_base + 0x86000000 + addr, size); // P1 - mirror - // We should also lock P2 and P3, and the mirrors, but they don't seem to be used... - //mem_region_lock(virt_ram_base + 0xA4000000 + addr, size); // P2 + mem_region_lock(virt_ram_base + 0xA4000000 + addr, size); // P2 //mem_region_lock(virt_ram_base + 0xA6000000 + addr, size); // P2 - mirror + // We should also lock P3 and its mirrors, but it doesn't seem to be used... //mem_region_lock(virt_ram_base + 0xC4000000 + addr, size); // P3 //mem_region_lock(virt_ram_base + 0xC6000000 + addr, size); // P3 - mirror if (VRAM_SIZE == 0x800000) { - mem_region_lock(virt_ram_base + 0x84000000 + addr + VRAM_SIZE, size); - //mem_region_lock(virt_ram_base + 0x86000000 + addr + VRAM_SIZE, size); - //mem_region_lock(virt_ram_base + 0xA4000000 + addr + VRAM_SIZE, size); - //mem_region_lock(virt_ram_base + 0xC4000000 + addr + VRAM_SIZE, size); + mem_region_lock(virt_ram_base + 0x84000000 + addr + VRAM_SIZE, size); // P1 wrap + //mem_region_lock(virt_ram_base + 0x86000000 + addr + VRAM_SIZE, size); // P1 - mirror wrap + mem_region_lock(virt_ram_base + 0xA4000000 + addr + VRAM_SIZE, size); // P2 wrap + //mem_region_lock(virt_ram_base + 0xA6000000 + addr + VRAM_SIZE, size); // P2 - mirror wrap + //mem_region_lock(virt_ram_base + 0xC4000000 + addr + VRAM_SIZE, size); // P3 wrap + //mem_region_lock(virt_ram_base + 0xC6000000 + addr + VRAM_SIZE, size); // P3 - mirror wrap } vmem32_protect_vram(addr, size); } @@ -671,25 +673,27 @@ void _vmem_unprotect_vram(u32 addr, u32 size) if (VRAM_SIZE == 0x800000) { // wraps when only 8MB VRAM - mem_region_unlock(virt_ram_base + 0x04000000 + addr + VRAM_SIZE, size); - //mem_region_unlock(virt_ram_base + 0x06000000 + addr + VRAM_SIZE, size); + mem_region_unlock(virt_ram_base + 0x04000000 + addr + VRAM_SIZE, size); // P0 wrap + //mem_region_unlock(virt_ram_base + 0x06000000 + addr + VRAM_SIZE, size); // P0 mirror wrap } } if (_nvmem_4gb_space()) { mem_region_unlock(virt_ram_base + 0x84000000 + addr, size); // P1 - //mem_region_unlock(virt_ram_base + 0x86000000 + addr, size); // P1 - mirror - // We should also lock P2 and P3, and the mirrors, but they don't seem to be used... - //mem_region_unlock(virt_ram_base + 0xA4000000 + addr, size); // P2 - //mem_region_unlock(virt_ram_base + 0xA6000000 + addr, size); // P2 - mirror + //mem_region_unlock(virt_ram_base + 0x86000000 + addr, size); // P1 - mirror + mem_region_unlock(virt_ram_base + 0xA4000000 + addr, size); // P2 + //mem_region_unlock(virt_ram_base + 0xA6000000 + addr, size); // P2 - mirror + // We should also lock P3 and its mirrors, but it doesn't seem to be used... //mem_region_unlock(virt_ram_base + 0xC4000000 + addr, size); // P3 //mem_region_unlock(virt_ram_base + 0xC6000000 + addr, size); // P3 - mirror if (VRAM_SIZE == 0x800000) { - mem_region_unlock(virt_ram_base + 0x84000000 + addr + VRAM_SIZE, size); - //mem_region_unlock(virt_ram_base + 0x86000000 + addr + VRAM_SIZE, size); - //mem_region_unlock(virt_ram_base + 0xA4000000 + addr + VRAM_SIZE, size); - //mem_region_unlock(virt_ram_base + 0xC4000000 + addr + VRAM_SIZE, size); + mem_region_unlock(virt_ram_base + 0x84000000 + addr + VRAM_SIZE, size); // P1 wrap + //mem_region_unlock(virt_ram_base + 0x86000000 + addr + VRAM_SIZE, size); // P1 - mirror wrap + mem_region_unlock(virt_ram_base + 0xA4000000 + addr + VRAM_SIZE, size); // P2 wrap + //mem_region_unlock(virt_ram_base + 0xA6000000 + addr + VRAM_SIZE, size); // P2 - mirror wrap + //mem_region_unlock(virt_ram_base + 0xC4000000 + addr + VRAM_SIZE, size); // P3 wrap + //mem_region_unlock(virt_ram_base + 0xC6000000 + addr + VRAM_SIZE, size); // P3 - mirror wrap } } } @@ -719,7 +723,7 @@ u32 _vmem_get_vram_offset(void *addr) } if ((offset >> 24) != 4) return -1; - verify((((u8*)addr - virt_ram_base) >> 29) == 0 || (((u8*)addr - virt_ram_base) >> 29) == 4); // others areas aren't mapped atm + verify((((u8*)addr - virt_ram_base) >> 29) == 0 || (((u8*)addr - virt_ram_base) >> 29) == 4 || (((u8*)addr - virt_ram_base) >> 29) == 5); // others areas aren't mapped atm return offset & VRAM_MASK; }