diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index b1feaf3..c243695 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -1679,7 +1679,8 @@ static uint32_t CreateDevice(uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, auto device = g_userHeap.AllocPhysical(); memset(device, 0, sizeof(*device)); - uint32_t functionOffset = 0x443344; // D3D + // Append render state functions to the end of guest function table. + uint32_t functionOffset = PPC_CODE_BASE + PPC_CODE_SIZE; g_memory.InsertFunction(functionOffset, HostToGuestFunction); for (size_t i = 0; i < std::size(device->setRenderStateFunctions); i++) diff --git a/UnleashedRecomp/kernel/memory.cpp b/UnleashedRecomp/kernel/memory.cpp index 3e7468f..c2aa18a 100644 --- a/UnleashedRecomp/kernel/memory.cpp +++ b/UnleashedRecomp/kernel/memory.cpp @@ -4,18 +4,18 @@ Memory::Memory() { #ifdef _WIN32 - base = (uint8_t*)VirtualAlloc((void*)0x100000000ull, PPC_MEMORY_SIZE + PPC_FUNC_TABLE_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + base = (uint8_t*)VirtualAlloc((void*)0x100000000ull, PPC_MEMORY_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); if (base == nullptr) - base = (uint8_t*)VirtualAlloc(nullptr, PPC_MEMORY_SIZE + PPC_FUNC_TABLE_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + base = (uint8_t*)VirtualAlloc(nullptr, PPC_MEMORY_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); DWORD oldProtect; VirtualProtect(base, 4096, PAGE_NOACCESS, &oldProtect); #else - base = (uint8_t*)mmap((void*)0x100000000ull, PPC_MEMORY_SIZE + PPC_FUNC_TABLE_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + base = (uint8_t*)mmap((void*)0x100000000ull, PPC_MEMORY_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); if (base == (uint8_t*)MAP_FAILED) - base = (uint8_t*)mmap(NULL, PPC_MEMORY_SIZE + PPC_FUNC_TABLE_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + base = (uint8_t*)mmap(NULL, PPC_MEMORY_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); mprotect(base, 4096, PROT_NONE); #endif diff --git a/UnleashedRecomp/kernel/memory.h b/UnleashedRecomp/kernel/memory.h index 3f693fc..0ff43d1 100644 --- a/UnleashedRecomp/kernel/memory.h +++ b/UnleashedRecomp/kernel/memory.h @@ -34,12 +34,12 @@ struct Memory PPCFunc* FindFunction(uint32_t guest) const noexcept { - return *reinterpret_cast(base + PPC_FUNC_TABLE_OFFSET + (uint64_t(guest) * 2)); + return PPC_LOOKUP_FUNC(base, guest); } void InsertFunction(uint32_t guest, PPCFunc* host) { - *reinterpret_cast(base + PPC_FUNC_TABLE_OFFSET + (uint64_t(guest) * 2)) = host; + PPC_LOOKUP_FUNC(base, guest) = host; } }; diff --git a/UnleashedRecompLib/CMakeLists.txt b/UnleashedRecompLib/CMakeLists.txt index 98d41dd..6d8134e 100644 --- a/UnleashedRecompLib/CMakeLists.txt +++ b/UnleashedRecompLib/CMakeLists.txt @@ -12,7 +12,9 @@ else() add_compile_options(-ffp-model=strict) endif() -target_compile_definitions(PowerRecomp PRIVATE CONFIG_FILE_PATH=\"${CMAKE_CURRENT_SOURCE_DIR}/config/SWA.toml\") +target_compile_definitions(PowerRecomp PRIVATE + CONFIG_FILE_PATH=\"${CMAKE_CURRENT_SOURCE_DIR}/config/SWA.toml\" + HEADER_FILE_PATH=\"${SWA_TOOLS_ROOT}/PowerRecomp/PowerUtils/ppc_context.h\") set(SWA_PPC_RECOMPILED_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/ppc/ppc_config.h" diff --git a/tools/PowerRecomp b/tools/PowerRecomp index de28409..7fb8af1 160000 --- a/tools/PowerRecomp +++ b/tools/PowerRecomp @@ -1 +1 @@ -Subproject commit de2840970ffc3161a4cb8743b10ddd4da93bdc9f +Subproject commit 7fb8af1bad9ecb22d5fa9c1b72555cdf7c22db02