diff --git a/src/core/hle/service/gsp_gpu.cpp b/src/core/hle/service/gsp_gpu.cpp index c23cfa3c8..7d6ffce6b 100644 --- a/src/core/hle/service/gsp_gpu.cpp +++ b/src/core/hle/service/gsp_gpu.cpp @@ -198,23 +198,18 @@ static void ReadHWRegs(Service::Interface* self) { static void SetBufferSwap(u32 screen_id, const FrameBufferInfo& info) { u32 base_address = 0x400000; + PAddr phys_address_left = Memory::VirtualToPhysicalAddress(info.address_left); + PAddr phys_address_right = Memory::VirtualToPhysicalAddress(info.address_right); if (info.active_fb == 0) { - WriteHWRegs(base_address + 4 * static_cast(GPU_REG_INDEX(framebuffer_config[screen_id].address_left1)), 4, - &info.address_left); - WriteHWRegs(base_address + 4 * static_cast(GPU_REG_INDEX(framebuffer_config[screen_id].address_right1)), 4, - &info.address_right); + WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].address_left1), 4, &phys_address_left); + WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].address_right1), 4, &phys_address_right); } else { - WriteHWRegs(base_address + 4 * static_cast(GPU_REG_INDEX(framebuffer_config[screen_id].address_left2)), 4, - &info.address_left); - WriteHWRegs(base_address + 4 * static_cast(GPU_REG_INDEX(framebuffer_config[screen_id].address_right2)), 4, - &info.address_right); + WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].address_left2), 4, &phys_address_left); + WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].address_right2), 4, &phys_address_right); } - WriteHWRegs(base_address + 4 * static_cast(GPU_REG_INDEX(framebuffer_config[screen_id].stride)), 4, - &info.stride); - WriteHWRegs(base_address + 4 * static_cast(GPU_REG_INDEX(framebuffer_config[screen_id].color_format)), 4, - &info.format); - WriteHWRegs(base_address + 4 * static_cast(GPU_REG_INDEX(framebuffer_config[screen_id].active_fb)), 4, - &info.shown_fb); + WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].stride), 4, &info.stride); + WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].color_format), 4, &info.format); + WriteHWRegs(base_address + 4 * GPU_REG_INDEX(framebuffer_config[screen_id].active_fb), 4, &info.shown_fb); } /** diff --git a/src/core/mem_map.h b/src/core/mem_map.h index 8f4f21fec..6b39b13f8 100644 --- a/src/core/mem_map.h +++ b/src/core/mem_map.h @@ -27,10 +27,16 @@ enum : u32 { MPCORE_PRIV_PADDR_END = (MPCORE_PRIV_PADDR + MPCORE_PRIV_SIZE), FCRAM_SIZE = 0x08000000, ///< FCRAM size - FCRAM_PADDR = 0x20000000, ///< FCRAM physical address - FCRAM_PADDR_END = (FCRAM_PADDR + FCRAM_SIZE), ///< FCRAM end of physical space - FCRAM_VADDR = 0x08000000, ///< FCRAM virtual address - FCRAM_VADDR_END = (FCRAM_VADDR + FCRAM_SIZE), ///< FCRAM end of virtual space + FCRAM_PADDR = 0x20000000, ///< FCRAM physical address + FCRAM_PADDR_END = (FCRAM_PADDR + FCRAM_SIZE), + + HEAP_SIZE = FCRAM_SIZE, ///< Application heap size + HEAP_VADDR = 0x08000000, + HEAP_VADDR_END = (HEAP_VADDR + HEAP_SIZE), + + HEAP_LINEAR_SIZE = FCRAM_SIZE, + HEAP_LINEAR_VADDR = 0x14000000, + HEAP_LINEAR_VADDR_END = (HEAP_LINEAR_VADDR + HEAP_LINEAR_SIZE), AXI_WRAM_SIZE = 0x00080000, ///< AXI WRAM size AXI_WRAM_PADDR = 0x1FF80000, ///< AXI WRAM physical address @@ -65,18 +71,6 @@ enum : u32 { SYSTEM_MEMORY_VADDR = 0x04000000, SYSTEM_MEMORY_VADDR_END = (SYSTEM_MEMORY_VADDR + SYSTEM_MEMORY_SIZE), - HEAP_SIZE = FCRAM_SIZE, ///< Application heap size - //HEAP_PADDR = HEAP_GSP_SIZE, - //HEAP_PADDR_END = (HEAP_PADDR + HEAP_SIZE), - HEAP_VADDR = 0x08000000, - HEAP_VADDR_END = (HEAP_VADDR + HEAP_SIZE), - - HEAP_LINEAR_SIZE = 0x08000000, ///< Linear heap size... TODO: Define correctly? - HEAP_LINEAR_VADDR = 0x14000000, - HEAP_LINEAR_VADDR_END = (HEAP_LINEAR_VADDR + HEAP_LINEAR_SIZE), - HEAP_LINEAR_PADDR = 0x00000000, - HEAP_LINEAR_PADDR_END = (HEAP_LINEAR_PADDR + HEAP_LINEAR_SIZE), - HARDWARE_IO_SIZE = 0x01000000, HARDWARE_IO_PADDR = 0x10000000, ///< IO physical address start HARDWARE_IO_VADDR = 0x1EC00000, ///< IO virtual address start diff --git a/src/core/mem_map_funcs.cpp b/src/core/mem_map_funcs.cpp index 48f61db4e..ba49b909c 100644 --- a/src/core/mem_map_funcs.cpp +++ b/src/core/mem_map_funcs.cpp @@ -23,10 +23,12 @@ VAddr PhysicalToVirtualAddress(const PAddr addr) { // to virtual address translations here. This is quite hacky, but necessary until we implement // proper MMU emulation. // TODO: Screw it, I'll let bunnei figure out how to do this properly. - if ((addr >= VRAM_PADDR) && (addr < VRAM_PADDR_END)) { + if (addr == 0) { + return 0; + } else if ((addr >= VRAM_PADDR) && (addr < VRAM_PADDR_END)) { return addr - VRAM_PADDR + VRAM_VADDR; - }else if ((addr >= FCRAM_PADDR) && (addr < FCRAM_PADDR_END)) { - return addr - FCRAM_PADDR + FCRAM_VADDR; + } else if ((addr >= FCRAM_PADDR) && (addr < FCRAM_PADDR_END)) { + return addr - FCRAM_PADDR + HEAP_LINEAR_VADDR; } LOG_ERROR(HW_Memory, "Unknown physical address @ 0x%08x", addr); @@ -39,10 +41,12 @@ PAddr VirtualToPhysicalAddress(const VAddr addr) { // to virtual address translations here. This is quite hacky, but necessary until we implement // proper MMU emulation. // TODO: Screw it, I'll let bunnei figure out how to do this properly. - if ((addr >= VRAM_VADDR) && (addr < VRAM_VADDR_END)) { - return addr - 0x07000000; - } else if ((addr >= FCRAM_VADDR) && (addr < FCRAM_VADDR_END)) { - return addr - FCRAM_VADDR + FCRAM_PADDR; + if (addr == 0) { + return 0; + } else if ((addr >= VRAM_VADDR) && (addr < VRAM_VADDR_END)) { + return addr - VRAM_VADDR + VRAM_PADDR; + } else if ((addr >= HEAP_LINEAR_VADDR) && (addr < HEAP_LINEAR_VADDR_END)) { + return addr - HEAP_LINEAR_VADDR + FCRAM_PADDR; } LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%08x", addr);