diff --git a/CMakeLists.txt b/CMakeLists.txt index a81530a3..31cbdc72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,22 +31,22 @@ set(LIBC_SOURCES src/Emulator/HLE/Libraries/LibC/Libc.cpp src/Emulator/HLE/Libraries/LibC/libc_cxa.cpp src/Emulator/HLE/Libraries/LibC/libc_cxa.h ) -set(USERSERVICE_SOURCES src/Emulator/HLE/Libraries/LibUserService/user_service.cpp - src/Emulator/HLE/Libraries/LibUserService/user_service.h +set(USERSERVICE_SOURCES src/core/hle/libraries/libuserservice/user_service.cpp + src/core/hle/libraries/libuserservice/user_service.h ) -set(PAD_SOURCES src/Emulator/HLE/Libraries/LibPad/pad.cpp - src/Emulator/HLE/Libraries/LibPad/pad.h +set(PAD_SOURCES src/core/hle/libraries/libpad/pad.cpp + src/core/hle/libraries/libpad/pad.h ) -set(SYSTEMSERVICE_SOURCES src/Emulator/HLE/Libraries/LibSystemService/system_service.cpp - src/Emulator/HLE/Libraries/LibSystemService/system_service.h +set(SYSTEMSERVICE_SOURCES src/core/hle/libraries/libsystemservice/system_service.cpp + src/core/hle/libraries/libsystemservice/system_service.h ) -set(FILESYSTEM_SOURCES src/Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.cpp - src/Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.h - src/Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.cpp - src/Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.h +set(FILESYSTEM_SOURCES src/core/hle/libraries/libkernel/file_system.cpp + src/core/hle/libraries/libkernel/file_system.h + + ) set(HOST_SOURCES src/Emulator/Host/controller.cpp @@ -64,39 +64,41 @@ add_executable(shadps4 ${FILESYSTEM_SOURCES} ${HOST_SOURCES} ${UTIL_SOURCES} + src/Lib/Timer.cpp + src/Lib/Timer.h src/main.cpp src/types.h - src/Core/FsFile.cpp - src/Core/FsFile.h - src/Core/PS4/Loader/Elf.cpp - src/Core/PS4/Loader/Elf.h + src/core/FsFile.cpp + src/core/FsFile.h + src/core/PS4/Loader/Elf.cpp + src/core/PS4/Loader/Elf.h src/GUI/ElfViewer.cpp src/GUI/ElfViewer.h src/Util/log.h src/Util/log.cpp src/Util/config.cpp src/Util/config.h - src/Core/virtual_memory.cpp - src/Core/virtual_memory.h - src/Core/PS4/Linker.cpp - src/Core/PS4/Linker.h - src/Core/PS4/Stubs.cpp - src/Core/PS4/Stubs.h - src/Core/PS4/Util/aerolib.cpp - src/Core/PS4/HLE/Kernel/Objects/physical_memory.h - src/Core/PS4/HLE/Kernel/Objects/physical_memory.cpp + src/core/virtual_memory.cpp + src/core/virtual_memory.h + src/core/PS4/Linker.cpp + src/core/PS4/Linker.h + src/core/PS4/Stubs.cpp + src/core/PS4/Stubs.h + src/core/PS4/Util/aerolib.cpp + src/core/PS4/HLE/Kernel/Objects/physical_memory.h + src/core/PS4/HLE/Kernel/Objects/physical_memory.cpp src/Util/string_util.cpp src/Util/string_util.cpp - src/Core/PS4/HLE/Graphics/video_out.cpp - src/Core/PS4/HLE/Graphics/video_out.h + src/core/PS4/HLE/Graphics/video_out.cpp + src/core/PS4/HLE/Graphics/video_out.h src/discord.h src/discord.cpp - src/Core/PS4/HLE/Kernel/event_queues.cpp - src/Core/PS4/HLE/Kernel/event_queues.h - src/Core/PS4/HLE/Kernel/cpu_management.cpp - src/Core/PS4/HLE/Kernel/cpu_management.h + src/core/PS4/HLE/Kernel/event_queues.cpp + src/core/PS4/HLE/Kernel/event_queues.h + src/core/PS4/HLE/Kernel/cpu_management.cpp + src/core/PS4/HLE/Kernel/cpu_management.h - "src/Util/Disassembler.cpp" "src/Util/Disassembler.h" "src/Core/PS4/Util/aerolib.h" "src/Core/PS4/Loader/SymbolsResolver.h" "src/Core/PS4/Loader/SymbolsResolver.cpp" "src/Core/PS4/HLE/Libs.cpp" "src/Core/PS4/HLE/Libs.h" "src/Core/PS4/HLE/LibC.cpp" "src/Core/PS4/HLE/LibC.h" "src/Core/PS4/HLE/LibKernel.cpp" "src/Core/PS4/HLE/LibKernel.h" "src/Core/PS4/HLE/LibSceGnmDriver.cpp" "src/Core/PS4/HLE/LibSceGnmDriver.h" "src/Core/PS4/HLE/Kernel/ThreadManagement.cpp" "src/Core/PS4/HLE/Kernel/ThreadManagement.h" "src/Core/PS4/HLE/ErrorCodes.h" "src/debug.h" "src/Core/PS4/HLE/Kernel/memory_management.cpp" "src/Core/PS4/HLE/Kernel/memory_management.h" "src/Core/PS4/GPU/gpu_memory.cpp" "src/Core/PS4/GPU/gpu_memory.h" "src/emulator.cpp" "src/emulator.h" "src/Core/PS4/HLE/Kernel/Objects/event_queue.h" "src/Core/PS4/HLE/Kernel/Objects/event_queue.cpp" "src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.cpp" "src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.h" "src/Core/PS4/HLE/Graphics/graphics_ctx.h" "src/vulkan_util.cpp" "src/vulkan_util.h" "src/Core/PS4/GPU/video_out_buffer.cpp" "src/Core/PS4/GPU/video_out_buffer.h" "src/Core/PS4/HLE/Graphics/graphics_render.cpp" "src/Core/PS4/HLE/Graphics/graphics_render.h" "src/Core/PS4/GPU/tile_manager.cpp" "src/Core/PS4/GPU/tile_manager.h" "src/version.h" "src/Emulator/HLE/Libraries/LibSystemService/system_service.cpp" "src/Emulator/HLE/Libraries/LibSystemService/system_service.h" ) + "src/Util/Disassembler.cpp" "src/Util/Disassembler.h" "src/core/PS4/Util/aerolib.h" "src/core/PS4/Loader/SymbolsResolver.h" "src/core/PS4/Loader/SymbolsResolver.cpp" "src/core/PS4/HLE/Libs.cpp" "src/core/PS4/HLE/Libs.h" "src/core/PS4/HLE/LibC.cpp" "src/core/PS4/HLE/LibC.h" "src/core/PS4/HLE/LibKernel.cpp" "src/core/PS4/HLE/LibKernel.h" "src/core/PS4/HLE/LibSceGnmDriver.cpp" "src/core/PS4/HLE/LibSceGnmDriver.h" "src/core/PS4/HLE/Kernel/ThreadManagement.cpp" "src/core/PS4/HLE/Kernel/ThreadManagement.h" "src/core/PS4/HLE/ErrorCodes.h" "src/debug.h" "src/core/PS4/HLE/Kernel/memory_management.cpp" "src/core/PS4/HLE/Kernel/memory_management.h" "src/core/PS4/GPU/gpu_memory.cpp" "src/core/PS4/GPU/gpu_memory.h" "src/emulator.cpp" "src/emulator.h" "src/core/PS4/HLE/Kernel/Objects/event_queue.h" "src/core/PS4/HLE/Kernel/Objects/event_queue.cpp" "src/core/PS4/HLE/Graphics/Objects/video_out_ctx.cpp" "src/core/PS4/HLE/Graphics/Objects/video_out_ctx.h" "src/core/PS4/HLE/Graphics/graphics_ctx.h" "src/vulkan_util.cpp" "src/vulkan_util.h" "src/core/PS4/GPU/video_out_buffer.cpp" "src/core/PS4/GPU/video_out_buffer.h" "src/core/PS4/HLE/Graphics/graphics_render.cpp" "src/core/PS4/HLE/Graphics/graphics_render.h" "src/core/PS4/GPU/tile_manager.cpp" "src/core/PS4/GPU/tile_manager.h" "src/version.h" "src/emuTimer.cpp" "src/emuTimer.h" "src/core/hle/libraries/libkernel/time_management.cpp" "src/core/hle/libraries/libkernel/time_management.h") find_package(OpenGL REQUIRED) target_link_libraries(shadps4 PUBLIC fmt mincore spdlog IMGUI SDL3-shared ${OPENGL_LIBRARY} vulkan-1 spirv-tools-opt spirv-tools) diff --git a/src/Core/PS4/GPU/gpu_memory.h b/src/Core/PS4/GPU/gpu_memory.h index 90151259..f4398085 100644 --- a/src/Core/PS4/GPU/gpu_memory.h +++ b/src/Core/PS4/GPU/gpu_memory.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include #include diff --git a/src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.cpp b/src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.cpp index 4ebd7e6d..c7586151 100644 --- a/src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.cpp +++ b/src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.cpp @@ -1,7 +1,8 @@ #include "video_out_ctx.h" -#include +#include #include +#include namespace HLE::Graphics::Objects { @@ -76,7 +77,7 @@ bool FlipQueue::submitFlip(VideoConfigInternal* cfg, s32 index, s64 flip_arg) { r.cfg = cfg; r.index = index; r.flip_arg = flip_arg; - r.submit_tsc = HLE::Libs::LibKernel::sceKernelReadTsc(); + r.submit_tsc = Core::Libraries::LibKernel::sceKernelReadTsc(); m_requests.push_back(r); @@ -120,8 +121,8 @@ bool FlipQueue::flip(u32 micros) { m_done_cond.notify_one(); request->cfg->m_flip_status.count++; - // TODO request.cfg->m_flip_status.processTime = LibKernel::KernelGetProcessTime(); - request->cfg->m_flip_status.tsc = HLE::Libs::LibKernel::sceKernelReadTsc(); + request->cfg->m_flip_status.processTime = Core::Libraries::LibKernel::sceKernelGetProcessTime(); + request->cfg->m_flip_status.tsc = Core::Libraries::LibKernel::sceKernelReadTsc(); request->cfg->m_flip_status.submitTsc = request->submit_tsc; request->cfg->m_flip_status.flipArg = request->flip_arg; request->cfg->m_flip_status.currentBuffer = request->index; diff --git a/src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.h b/src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.h index 07f301ac..0a60c1cf 100644 --- a/src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.h +++ b/src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.h @@ -2,8 +2,8 @@ #include #include -#include -#include +#include +#include #include using namespace HLE::Libs::Graphics::VideoOut; diff --git a/src/Core/PS4/HLE/Graphics/video_out.cpp b/src/Core/PS4/HLE/Graphics/video_out.cpp index f8503edd..ac0c67d3 100644 --- a/src/Core/PS4/HLE/Graphics/video_out.cpp +++ b/src/Core/PS4/HLE/Graphics/video_out.cpp @@ -1,11 +1,11 @@ #include "video_out.h" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #include #include diff --git a/src/Core/PS4/HLE/Graphics/video_out.h b/src/Core/PS4/HLE/Graphics/video_out.h index 9db9299d..be1fd514 100644 --- a/src/Core/PS4/HLE/Graphics/video_out.h +++ b/src/Core/PS4/HLE/Graphics/video_out.h @@ -1,6 +1,6 @@ #pragma once -#include -#include +#include +#include #include #include diff --git a/src/Core/PS4/HLE/Kernel/Objects/event_queue.cpp b/src/Core/PS4/HLE/Kernel/Objects/event_queue.cpp index d1a68cc1..521cd432 100644 --- a/src/Core/PS4/HLE/Kernel/Objects/event_queue.cpp +++ b/src/Core/PS4/HLE/Kernel/Objects/event_queue.cpp @@ -1,7 +1,8 @@ #include "event_queue.h" -#include "debug.h" -#include +#include + +#include "debug.h" namespace HLE::Kernel::Objects { EqueueInternal::~EqueueInternal() {} @@ -25,8 +26,9 @@ int EqueueInternal::addEvent(const EqueueEvent& event) { int EqueueInternal::waitForEvents(SceKernelEvent* ev, int num, u32 micros) { std::unique_lock lock{m_mutex}; - u64 timeElapsed = 0; - const auto start = std::chrono::high_resolution_clock::now(); + u32 timeElapsed = 0; + Lib::Timer t; + t.Start(); for (;;) { int ret = getTriggeredEvents(ev, num); @@ -41,8 +43,7 @@ int EqueueInternal::waitForEvents(SceKernelEvent* ev, int num, u32 micros) { m_cond.wait_for(lock, std::chrono::microseconds(micros - timeElapsed)); } - const auto end = std::chrono::high_resolution_clock::now(); - timeElapsed = std::chrono::duration_cast(end - start).count(); + timeElapsed = static_cast(t.GetTimeSec() * 1000000.0); } return 0; diff --git a/src/Core/PS4/HLE/Kernel/Objects/physical_memory.h b/src/Core/PS4/HLE/Kernel/Objects/physical_memory.h index 7e509bf3..e5ea7e5e 100644 --- a/src/Core/PS4/HLE/Kernel/Objects/physical_memory.h +++ b/src/Core/PS4/HLE/Kernel/Objects/physical_memory.h @@ -1,7 +1,7 @@ #pragma once #include -#include -#include +#include +#include #include #include diff --git a/src/Core/PS4/HLE/Kernel/cpu_management.cpp b/src/Core/PS4/HLE/Kernel/cpu_management.cpp index 210d4caa..2a605452 100644 --- a/src/Core/PS4/HLE/Kernel/cpu_management.cpp +++ b/src/Core/PS4/HLE/Kernel/cpu_management.cpp @@ -1,7 +1,7 @@ #include "cpu_management.h" #include "Util/config.h" #include -#include +#include namespace HLE::Libs::LibKernel::CPUManagement { int PS4_SYSV_ABI sceKernelIsNeoMode() { diff --git a/src/Core/PS4/HLE/Kernel/event_queues.cpp b/src/Core/PS4/HLE/Kernel/event_queues.cpp index dc26f820..c7ea7adc 100644 --- a/src/Core/PS4/HLE/Kernel/event_queues.cpp +++ b/src/Core/PS4/HLE/Kernel/event_queues.cpp @@ -1,7 +1,7 @@ #include "event_queues.h" -#include -#include +#include +#include #include #include diff --git a/src/Core/PS4/HLE/Kernel/memory_management.cpp b/src/Core/PS4/HLE/Kernel/memory_management.cpp index bea58c25..d891f6b9 100644 --- a/src/Core/PS4/HLE/Kernel/memory_management.cpp +++ b/src/Core/PS4/HLE/Kernel/memory_management.cpp @@ -1,7 +1,7 @@ #include "memory_management.h" -#include -#include +#include +#include #include #include diff --git a/src/Core/PS4/HLE/LibKernel.cpp b/src/Core/PS4/HLE/LibKernel.cpp index a9646091..a7599afa 100644 --- a/src/Core/PS4/HLE/LibKernel.cpp +++ b/src/Core/PS4/HLE/LibKernel.cpp @@ -11,8 +11,8 @@ #include "Kernel/event_queues.h" #include "Kernel/memory_management.h" #include "Libs.h" -#include "Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.h" -#include "Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.h" +#include "core/hle/libraries/libkernel/file_system.h" +#include "core/hle/libraries/libkernel/time_management.h" namespace HLE::Libs::LibKernel { @@ -24,11 +24,7 @@ int32_t PS4_SYSV_ABI sceKernelReleaseDirectMemory(off_t start, size_t len) { } static PS4_SYSV_ABI void stack_chk_fail() { BREAKPOINT(); } -u64 PS4_SYSV_ABI sceKernelReadTsc() { - LARGE_INTEGER c; - QueryPerformanceCounter(&c); - return c.QuadPart; -} + int PS4_SYSV_ABI sceKernelMunmap(void* addr, size_t len) { BREAKPOINT(); } void LibKernel_Register(SymbolsResolver* sym) { // obj @@ -45,11 +41,9 @@ void LibKernel_Register(SymbolsResolver* sym) { // misc LIB_FUNCTION("WslcK1FQcGI", "libkernel", 1, "libkernel", 1, 1, CPUManagement::sceKernelIsNeoMode); LIB_FUNCTION("Ou3iL1abvng", "libkernel", 1, "libkernel", 1, 1, stack_chk_fail); - // time - LIB_FUNCTION("-2IRUCO--PM", "libkernel", 1, "libkernel", 1, 1, sceKernelReadTsc); - // fs - LIB_FUNCTION("1G3lF1Gg1k8", "libkernel", 1, "libkernel", 1, 1, Emulator::HLE::Libraries::LibKernel::FileSystem::sceKernelOpen); - LIB_FUNCTION("wuCroIGjt2g", "libScePosix", 1, "libkernel", 1, 1, Emulator::HLE::Libraries::LibKernel::FileSystem::POSIX::open); + + Core::Libraries::LibKernel::fileSystemSymbolsRegister(sym); + Core::Libraries::LibKernel::timeSymbolsRegister(sym); } }; // namespace HLE::Libs::LibKernel \ No newline at end of file diff --git a/src/Core/PS4/HLE/LibKernel.h b/src/Core/PS4/HLE/LibKernel.h index 903aef84..ee5fc613 100644 --- a/src/Core/PS4/HLE/LibKernel.h +++ b/src/Core/PS4/HLE/LibKernel.h @@ -6,6 +6,5 @@ void LibKernel_Register(SymbolsResolver* sym); // functions -u64 PS4_SYSV_ABI sceKernelReadTsc(); int32_t PS4_SYSV_ABI sceKernelReleaseDirectMemory(off_t start, size_t len); }; // namespace HLE::Libs::LibKernel \ No newline at end of file diff --git a/src/Core/PS4/HLE/LibSceGnmDriver.cpp b/src/Core/PS4/HLE/LibSceGnmDriver.cpp index 8b6a07af..14d1f43e 100644 --- a/src/Core/PS4/HLE/LibSceGnmDriver.cpp +++ b/src/Core/PS4/HLE/LibSceGnmDriver.cpp @@ -3,7 +3,7 @@ #include "../Loader/Elf.h" #include #include -#include +#include #include namespace HLE::Libs::LibSceGnmDriver { diff --git a/src/Core/PS4/HLE/Libs.cpp b/src/Core/PS4/HLE/Libs.cpp index f4230db2..18bc52ec 100644 --- a/src/Core/PS4/HLE/Libs.cpp +++ b/src/Core/PS4/HLE/Libs.cpp @@ -3,10 +3,10 @@ #include "LibC.h" #include "LibKernel.h" #include "LibSceGnmDriver.h" -#include -#include "Emulator/HLE/Libraries/LibUserService/user_service.h" -#include "Emulator/HLE/Libraries/LibPad/pad.h" -#include +#include +#include "core/hle/libraries/libuserservice/user_service.h" +#include "core/hle/libraries/libpad/pad.h" +#include namespace HLE::Libs { @@ -15,8 +15,8 @@ void Init_HLE_Libs(SymbolsResolver *sym) { LibKernel::LibKernel_Register(sym); Graphics::VideoOut::videoOutRegisterLib(sym); LibSceGnmDriver::LibSceGnmDriver_Register(sym); - Emulator::HLE::Libraries::LibUserService::libUserService_Register(sym); - Emulator::HLE::Libraries::LibPad::libPad_Register(sym); - Emulator::HLE::Libraries::LibSystemService::libSystemService_Register(sym); + Core::Libraries::LibUserService::userServiceSymbolsRegister(sym); + Core::Libraries::LibPad::padSymbolsRegister(sym); + Core::Libraries::LibSystemService::systemServiceSymbolsRegister(sym); } } // namespace HLE::Libs \ No newline at end of file diff --git a/src/Core/PS4/HLE/Libs.h b/src/Core/PS4/HLE/Libs.h index 39c15d47..be663939 100644 --- a/src/Core/PS4/HLE/Libs.h +++ b/src/Core/PS4/HLE/Libs.h @@ -1,6 +1,6 @@ #pragma once #include "../Loader/SymbolsResolver.h" -#include +#include #define LIB_FUNCTION(nid, lib, libversion, mod, moduleVersionMajor, moduleVersionMinor, function) \ {\ diff --git a/src/Core/hle/libraries/libkernel/file_system.cpp b/src/Core/hle/libraries/libkernel/file_system.cpp new file mode 100644 index 00000000..bc3ba4d7 --- /dev/null +++ b/src/Core/hle/libraries/libkernel/file_system.cpp @@ -0,0 +1,29 @@ +#include "file_system.h" + +#include +#include +#include + +namespace Core::Libraries::LibKernel { +constexpr bool log_file_fs = true; // disable it to disable logging + +int PS4_SYSV_ABI sceKernelOpen(const char* path, int flags, u16 mode) { + LOG_INFO_IF(log_file_fs, "sceKernelOpen path = {} flags = {:#x} mode = {:#x}\n", path, flags, mode); + return 0; +} + +int PS4_SYSV_ABI open(const char* path, int flags, /* SceKernelMode*/ u16 mode) { + LOG_INFO_IF(log_file_fs, "posix open redirect to sceKernelOpen\n"); + int result = sceKernelOpen(path, flags, mode); + if (result < 0) { + BREAKPOINT(); // posix calls different only for their return values + } + return result; +} + +void fileSystemSymbolsRegister(SymbolsResolver* sym) { + LIB_FUNCTION("1G3lF1Gg1k8", "libkernel", 1, "libkernel", 1, 1, sceKernelOpen); + LIB_FUNCTION("wuCroIGjt2g", "libScePosix", 1, "libkernel", 1, 1, open); +} + +} // namespace Core::Libraries::LibKernel \ No newline at end of file diff --git a/src/Core/hle/libraries/libkernel/file_system.h b/src/Core/hle/libraries/libkernel/file_system.h new file mode 100644 index 00000000..36c973aa --- /dev/null +++ b/src/Core/hle/libraries/libkernel/file_system.h @@ -0,0 +1,13 @@ +#pragma once +#include +#include "core/PS4/Loader/SymbolsResolver.h" + +namespace Core::Libraries::LibKernel { +int PS4_SYSV_ABI sceKernelOpen(const char *path, int flags, /* SceKernelMode*/ u16 mode); + +// posix file system +int PS4_SYSV_ABI open(const char *path, int flags, /* SceKernelMode*/ u16 mode); + + +void fileSystemSymbolsRegister(SymbolsResolver *sym); +} // namespace Core::Libraries::LibKernel \ No newline at end of file diff --git a/src/Core/hle/libraries/libkernel/time_management.cpp b/src/Core/hle/libraries/libkernel/time_management.cpp new file mode 100644 index 00000000..77665812 --- /dev/null +++ b/src/Core/hle/libraries/libkernel/time_management.cpp @@ -0,0 +1,24 @@ +#include "time_management.h" + +#include +#include "Lib/Timer.h" +#include "emuTimer.h" + +namespace Core::Libraries::LibKernel { +u64 PS4_SYSV_ABI sceKernelGetProcessTime() { + return static_cast(Emulator::emuTimer::getTimeMsec() * 1000.0); // return time in microseconds +} +u64 PS4_SYSV_ABI sceKernelGetProcessTimeCounter() { return Emulator::emuTimer::getTimeCounter(); } + +u64 PS4_SYSV_ABI sceKernelGetProcessTimeCounterFrequency() { return Emulator::emuTimer::getTimeFrequency(); } + +u64 PS4_SYSV_ABI sceKernelReadTsc() { return Lib::Timer::getQueryPerformanceCounter(); } + +void timeSymbolsRegister(SymbolsResolver* sym) { + LIB_FUNCTION("4J2sUJmuHZQ", "libkernel", 1, "libkernel", 1, 1, sceKernelGetProcessTime); + LIB_FUNCTION("fgxnMeTNUtY", "libkernel", 1, "libkernel", 1, 1, sceKernelGetProcessTimeCounter); + LIB_FUNCTION("BNowx2l588E", "libkernel", 1, "libkernel", 1, 1, sceKernelGetProcessTimeCounterFrequency); + LIB_FUNCTION("-2IRUCO--PM", "libkernel", 1, "libkernel", 1, 1, sceKernelReadTsc); +} + +} // namespace Core::Libraries::LibKernel diff --git a/src/Core/hle/libraries/libkernel/time_management.h b/src/Core/hle/libraries/libkernel/time_management.h new file mode 100644 index 00000000..7ea068a9 --- /dev/null +++ b/src/Core/hle/libraries/libkernel/time_management.h @@ -0,0 +1,13 @@ +#pragma once + +#include "types.h" +#include "core/PS4/Loader/SymbolsResolver.h" + +namespace Core::Libraries::LibKernel { +u64 PS4_SYSV_ABI sceKernelGetProcessTime(); +u64 PS4_SYSV_ABI sceKernelGetProcessTimeCounter(); +u64 PS4_SYSV_ABI sceKernelGetProcessTimeCounterFrequency(); +u64 PS4_SYSV_ABI sceKernelReadTsc(); + +void timeSymbolsRegister(SymbolsResolver* sym); +} \ No newline at end of file diff --git a/src/Core/virtual_memory.cpp b/src/Core/virtual_memory.cpp index d96f7c75..4f0c3c39 100644 --- a/src/Core/virtual_memory.cpp +++ b/src/Core/virtual_memory.cpp @@ -1,6 +1,6 @@ #include "virtual_memory.h" -#include "Core/PS4/Loader/Elf.h" +#include "core/PS4/Loader/Elf.h" #ifdef _WIN64 #include diff --git a/src/Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.cpp b/src/Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.cpp deleted file mode 100644 index cdf35595..00000000 --- a/src/Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "file_system.h" -#include -#include - -namespace Emulator::HLE::Libraries::LibKernel::FileSystem { -constexpr bool log_file_fs = true; // disable it to disable logging - -int PS4_SYSV_ABI sceKernelOpen(const char* path, int flags, u16 mode) { - LOG_INFO_IF(log_file_fs, "sceKernelOpen path = {} flags = {} mode = {}\n", path, log_hex_full(flags), log_hex_full(mode)); - return 0; -} - -} // namespace Emulator::HLE::Libraries::LibKernel::FileSystem \ No newline at end of file diff --git a/src/Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.h b/src/Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.h deleted file mode 100644 index 98f090f0..00000000 --- a/src/Emulator/HLE/Libraries/LibKernel/FileSystem/file_system.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once -#include - -namespace Emulator::HLE::Libraries::LibKernel::FileSystem { -int PS4_SYSV_ABI sceKernelOpen(const char *path, int flags, /* SceKernelMode*/ u16 mode); - -} \ No newline at end of file diff --git a/src/Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.cpp b/src/Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.cpp deleted file mode 100644 index caa6fb43..00000000 --- a/src/Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "posix_file_system.h" - -#include - -#include "file_system.h" - -namespace Emulator::HLE::Libraries::LibKernel::FileSystem::POSIX { -int PS4_SYSV_ABI open(const char* path, int flags, /* SceKernelMode*/ u16 mode) { - int result = sceKernelOpen(path, flags, mode); - if (result < 0) { - BREAKPOINT(); // posix calls different only for their return values - } - return result; -} -} // namespace Emulator::HLE::Libraries::LibKernel::FileSystem::POSIX diff --git a/src/Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.h b/src/Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.h deleted file mode 100644 index cce1c6c0..00000000 --- a/src/Emulator/HLE/Libraries/LibKernel/FileSystem/posix_file_system.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once -#include "types.h" - -namespace Emulator::HLE::Libraries::LibKernel::FileSystem::POSIX { -int PS4_SYSV_ABI open(const char *path, int flags, /* SceKernelMode*/ u16 mode); -} \ No newline at end of file diff --git a/src/Emulator/HLE/Libraries/LibSystemService/system_service.cpp b/src/Emulator/HLE/Libraries/LibSystemService/system_service.cpp deleted file mode 100644 index 4786b5fd..00000000 --- a/src/Emulator/HLE/Libraries/LibSystemService/system_service.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include - -#include "system_service.h" - -namespace Emulator::HLE::Libraries::LibSystemService { - -s32 PS4_SYSV_ABI sceSystemServiceHideSplashScreen() { - // dummy - return SCE_OK; -} - -void libSystemService_Register(SymbolsResolver* sym) { - LIB_FUNCTION("Vo5V8KAwCmk", "libSceSystemService", 1, "libSceSystemService", 1, 1, sceSystemServiceHideSplashScreen); -} -}; // namespace Emulator::HLE::Libraries::LibUserService \ No newline at end of file diff --git a/src/Emulator/HLE/Libraries/LibSystemService/system_service.h b/src/Emulator/HLE/Libraries/LibSystemService/system_service.h deleted file mode 100644 index 4c098606..00000000 --- a/src/Emulator/HLE/Libraries/LibSystemService/system_service.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once -#include "Core/PS4/Loader/SymbolsResolver.h" - -namespace Emulator::HLE::Libraries::LibSystemService { - -//HLE functions -s32 PS4_SYSV_ABI sceSystemServiceHideSplashScreen(); - -void libSystemService_Register(SymbolsResolver* sym); - -}; // namespace Emulator::HLE::Libraries::LibUserService \ No newline at end of file diff --git a/src/Emulator/Host/controller.cpp b/src/Emulator/Host/controller.cpp index 6930c969..599fb46f 100644 --- a/src/Emulator/Host/controller.cpp +++ b/src/Emulator/Host/controller.cpp @@ -1,4 +1,5 @@ #include "controller.h" +#include namespace Emulator::Host::Controller { GameController::GameController() { m_states_num = 0; @@ -39,6 +40,7 @@ void GameController::addState(const State& state) { void GameController::checKButton(int id, u32 button, bool isPressed) { std::scoped_lock lock{m_mutex}; auto state = getLastState(); + state.time = Core::Libraries::LibKernel::sceKernelGetProcessTime(); if (isPressed) { state.buttonsState |= button; } else { diff --git a/src/Emulator/Host/controller.h b/src/Emulator/Host/controller.h index f2c1db8f..f534ed7a 100644 --- a/src/Emulator/Host/controller.h +++ b/src/Emulator/Host/controller.h @@ -5,6 +5,7 @@ namespace Emulator::Host::Controller { struct State { u32 buttonsState =0; + u64 time = 0; }; constexpr u32 MAX_STATES = 64; diff --git a/src/GUI/ElfViewer.h b/src/GUI/ElfViewer.h index ee5cea92..13a24d8c 100644 --- a/src/GUI/ElfViewer.h +++ b/src/GUI/ElfViewer.h @@ -1,5 +1,5 @@ #pragma once -#include "../Core/PS4/Loader/Elf.h" +#include "../core/PS4/Loader/Elf.h" class ElfViewer { private: diff --git a/src/Lib/Timer.cpp b/src/Lib/Timer.cpp new file mode 100644 index 00000000..74392fb5 --- /dev/null +++ b/src/Lib/Timer.cpp @@ -0,0 +1,109 @@ +#include "Timer.h" + +#ifdef _WIN64 +#include +#endif + +Lib::Timer::Timer() { +#ifdef _WIN64 + LARGE_INTEGER f; + QueryPerformanceFrequency(&f); + m_Frequency = f.QuadPart; +#else +#error Unimplemented Timer constructor +#endif +} + +void Lib::Timer::Start() { +#ifdef _WIN64 + LARGE_INTEGER c; + QueryPerformanceCounter(&c); + m_StartTime = c.QuadPart; +#else +#error Unimplemented Timer::Start() +#endif + m_is_timer_paused = false; +} + +void Lib::Timer::Pause() { +#ifdef _WIN64 + LARGE_INTEGER c; + QueryPerformanceCounter(&c); + m_PauseTime = c.QuadPart; +#else +#error Unimplemented Timer::Pause() +#endif + m_is_timer_paused = true; +} + +void Lib::Timer::Resume() { + u64 current_time = 0; +#ifdef _WIN64 + LARGE_INTEGER c; + QueryPerformanceCounter(&c); + current_time = c.QuadPart; +#else +#error Unimplemented Timer::Resume() +#endif + m_StartTime += current_time - m_PauseTime; + m_is_timer_paused = false; +} + +bool Lib::Timer::IsPaused() const { return m_is_timer_paused; } + +double Lib::Timer::GetTimeMsec() const { + if (m_is_timer_paused) { + return 1000.0 * (static_cast(m_PauseTime - m_StartTime)) / static_cast(m_Frequency); + } + + u64 current_time = 0; +#ifdef _WIN64 + LARGE_INTEGER c; + QueryPerformanceCounter(&c); + current_time = c.QuadPart; +#else +#error Unimplemented Timer::GetTimeMsec() +#endif + return 1000.0 * (static_cast(current_time - m_StartTime)) / static_cast(m_Frequency); +} + +double Lib::Timer::GetTimeSec() const { + if (m_is_timer_paused) { + return (static_cast(m_PauseTime - m_StartTime)) / static_cast(m_Frequency); + } + + u64 current_time = 0; +#ifdef _WIN64 + LARGE_INTEGER c; + QueryPerformanceCounter(&c); + current_time = c.QuadPart; +#else +#error Unimplemented Timer::GetTimeSec() +#endif + return (static_cast(current_time - m_StartTime)) / static_cast(m_Frequency); +} + +u64 Lib::Timer::GetTicks() const { + if (m_is_timer_paused) { + return (m_PauseTime - m_StartTime); + } + + u64 current_time = 0; +#ifdef _WIN64 + LARGE_INTEGER c; + QueryPerformanceCounter(&c); + current_time = c.QuadPart; +#else +#error Unimplemented Timer::GetTicks() +#endif + return (current_time - m_StartTime); +} + +u64 Lib::Timer::GetFrequency() const { return m_Frequency; } + +u64 Lib::Timer::getQueryPerformanceCounter() { + LARGE_INTEGER c; + QueryPerformanceCounter(&c); + return c.QuadPart; +} + diff --git a/src/Lib/Timer.h b/src/Lib/Timer.h new file mode 100644 index 00000000..8dcc8593 --- /dev/null +++ b/src/Lib/Timer.h @@ -0,0 +1,34 @@ +#pragma once + +#include "../types.h" + +namespace Lib { + class Timer final + { + public: + Timer(); + ~Timer() = default; + + void Start(); + void Pause(); + void Resume(); + bool IsPaused() const; + + double GetTimeMsec() const;// return time in milliseconds + double GetTimeSec() const;// return time in seconds + u64 GetTicks() const;// return time in ticks + u64 GetFrequency() const;// return ticks frequency + [[nodiscard]] static u64 getQueryPerformanceCounter(); + public: + Timer(const Timer&) = delete; + Timer& operator=(const Timer&) = delete; + Timer(Timer&&) = delete; + Timer& operator=(Timer&&) = delete; + + private: + bool m_is_timer_paused = true; + u64 m_Frequency = 0; + u64 m_StartTime = 0; + u64 m_PauseTime = 0; + }; +} \ No newline at end of file diff --git a/src/Emulator/HLE/Libraries/LibPad/pad.cpp b/src/core/hle/libraries/libpad/pad.cpp similarity index 79% rename from src/Emulator/HLE/Libraries/LibPad/pad.cpp rename to src/core/hle/libraries/libpad/pad.cpp index d09944c4..fea4992c 100644 --- a/src/Emulator/HLE/Libraries/LibPad/pad.cpp +++ b/src/core/hle/libraries/libpad/pad.cpp @@ -1,21 +1,22 @@ #include "pad.h" -#include -#include +#include +#include #include "Emulator/Util/singleton.h" #include "Emulator/Host/controller.h" #include #include -namespace Emulator::HLE::Libraries::LibPad { +namespace Core::Libraries::LibPad { constexpr bool log_file_pad = true; // disable it to disable logging int PS4_SYSV_ABI scePadInit() { return SCE_OK; } -int PS4_SYSV_ABI scePadOpen(Emulator::HLE::Libraries::LibUserService::SceUserServiceUserId userId, s32 type, s32 index, +int PS4_SYSV_ABI scePadOpen(Core::Libraries::LibUserService::SceUserServiceUserId userId, s32 type, s32 index, const ScePadOpenParam* pParam) { + LOG_INFO_IF(log_file_pad, "scePadOpen userid = {} type = {} index = {}\n", userId, type, index); return 1; // dummy } @@ -38,7 +39,7 @@ int PS4_SYSV_ABI scePadReadState(int32_t handle, ScePadData* pData) { pData->orientation.y = 0; pData->orientation.z = 0; pData->orientation.w = 0; - + pData->timestamp = state.time; pData->connected = true; // isConnected; //TODO fix me proper pData->connectedCount = 1;//connectedCount; pData->deviceUniqueDataLen = 0; @@ -46,7 +47,7 @@ int PS4_SYSV_ABI scePadReadState(int32_t handle, ScePadData* pData) { return SCE_OK; } -void libPad_Register(SymbolsResolver* sym) { +void padSymbolsRegister(SymbolsResolver* sym) { LIB_FUNCTION("hv1luiJrqQM", "libScePad", 1, "libScePad", 1, 1, scePadInit); LIB_FUNCTION("xk0AcarP3V4", "libScePad", 1, "libScePad", 1, 1, scePadOpen); LIB_FUNCTION("YndgXqQVV7c", "libScePad", 1, "libScePad", 1, 1, scePadReadState); diff --git a/src/Emulator/HLE/Libraries/LibPad/pad.h b/src/core/hle/libraries/libpad/pad.h similarity index 84% rename from src/Emulator/HLE/Libraries/LibPad/pad.h rename to src/core/hle/libraries/libpad/pad.h index 72d09726..af925bdd 100644 --- a/src/Emulator/HLE/Libraries/LibPad/pad.h +++ b/src/core/hle/libraries/libpad/pad.h @@ -1,10 +1,10 @@ #pragma once -#include #include -#include "Core/PS4/Loader/SymbolsResolver.h" +#include "core/PS4/Loader/SymbolsResolver.h" +#include "core/hle/libraries/libuserservice/user_service.h" -namespace Emulator::HLE::Libraries::LibPad { +namespace Core::Libraries::LibPad { typedef enum : u32 { SCE_PAD_BUTTON_L3 = 0x00000002, @@ -90,9 +90,9 @@ struct ScePadData { }; // hle functions int PS4_SYSV_ABI scePadInit(); -int PS4_SYSV_ABI scePadOpen(Emulator::HLE::Libraries::LibUserService::SceUserServiceUserId userId, s32 type, s32 index, +int PS4_SYSV_ABI scePadOpen(Core::Libraries::LibUserService::SceUserServiceUserId userId, s32 type, s32 index, const ScePadOpenParam* pParam); int PS4_SYSV_ABI scePadReadState(int32_t handle, ScePadData* pData); -void libPad_Register(SymbolsResolver* sym); -}; // namespace Emulator::HLE::Libraries::LibPad \ No newline at end of file +void padSymbolsRegister(SymbolsResolver* sym); +}; // namespace Core::Libraries::LibPad \ No newline at end of file diff --git a/src/core/hle/libraries/libsystemservice/system_service.cpp b/src/core/hle/libraries/libsystemservice/system_service.cpp new file mode 100644 index 00000000..42b2b5e2 --- /dev/null +++ b/src/core/hle/libraries/libsystemservice/system_service.cpp @@ -0,0 +1,16 @@ +#include +#include +#include +#include "system_service.h" + +namespace Core::Libraries::LibSystemService { + +s32 PS4_SYSV_ABI sceSystemServiceHideSplashScreen() { + PRINT_DUMMY_FUNCTION_NAME(); + return SCE_OK; +} + +void systemServiceSymbolsRegister(SymbolsResolver* sym) { + LIB_FUNCTION("Vo5V8KAwCmk", "libSceSystemService", 1, "libSceSystemService", 1, 1, sceSystemServiceHideSplashScreen); +} +}; // namespace Emulator::HLE::Libraries::LibUserService \ No newline at end of file diff --git a/src/core/hle/libraries/libsystemservice/system_service.h b/src/core/hle/libraries/libsystemservice/system_service.h new file mode 100644 index 00000000..c786a848 --- /dev/null +++ b/src/core/hle/libraries/libsystemservice/system_service.h @@ -0,0 +1,11 @@ +#pragma once +#include "core/PS4/Loader/SymbolsResolver.h" + +namespace Core::Libraries::LibSystemService { + +//HLE functions +s32 PS4_SYSV_ABI sceSystemServiceHideSplashScreen(); + +void systemServiceSymbolsRegister(SymbolsResolver* sym); + +}; // namespace Emulator::HLE::Libraries::LibUserService \ No newline at end of file diff --git a/src/Emulator/HLE/Libraries/LibUserService/user_service.cpp b/src/core/hle/libraries/libuserservice/user_service.cpp similarity index 67% rename from src/Emulator/HLE/Libraries/LibUserService/user_service.cpp rename to src/core/hle/libraries/libuserservice/user_service.cpp index 2f58b956..a887f506 100644 --- a/src/Emulator/HLE/Libraries/LibUserService/user_service.cpp +++ b/src/core/hle/libraries/libuserservice/user_service.cpp @@ -1,17 +1,19 @@ #include "user_service.h" -#include -#include +#include +#include -namespace Emulator::HLE::Libraries::LibUserService { +#include "Util/log.h" + +namespace Core::Libraries::LibUserService { s32 PS4_SYSV_ABI sceUserServiceInitialize(const SceUserServiceInitializeParams* initParams) { - // dummy + PRINT_DUMMY_FUNCTION_NAME(); return SCE_OK; } s32 PS4_SYSV_ABI sceUserServiceGetLoginUserIdList(SceUserServiceLoginUserIdList* userIdList) { - // dummy + PRINT_DUMMY_FUNCTION_NAME(); userIdList->user_id[0] = 1; userIdList->user_id[1] = -1; userIdList->user_id[2] = -1; @@ -19,8 +21,9 @@ s32 PS4_SYSV_ABI sceUserServiceGetLoginUserIdList(SceUserServiceLoginUserIdList* return SCE_OK; } -void libUserService_Register(SymbolsResolver* sym) { +void userServiceSymbolsRegister(SymbolsResolver* sym) { LIB_FUNCTION("j3YMu1MVNNo", "libSceUserService", 1, "libSceUserService", 1, 1, sceUserServiceInitialize); LIB_FUNCTION("fPhymKNvK-A", "libSceUserService", 1, "libSceUserService", 1, 1, sceUserServiceGetLoginUserIdList); } -}; // namespace Emulator::HLE::Libraries::LibUserService + +} // namespace Core::Libraries::LibUserService diff --git a/src/Emulator/HLE/Libraries/LibUserService/user_service.h b/src/core/hle/libraries/libuserservice/user_service.h similarity index 63% rename from src/Emulator/HLE/Libraries/LibUserService/user_service.h rename to src/core/hle/libraries/libuserservice/user_service.h index 6c22c217..4a386946 100644 --- a/src/Emulator/HLE/Libraries/LibUserService/user_service.h +++ b/src/core/hle/libraries/libuserservice/user_service.h @@ -1,7 +1,7 @@ #pragma once -#include "Core/PS4/Loader/SymbolsResolver.h" +#include "core/PS4/Loader/SymbolsResolver.h" -namespace Emulator::HLE::Libraries::LibUserService { +namespace Core::Libraries::LibUserService { using SceUserServiceUserId = s32; @@ -16,5 +16,5 @@ struct SceUserServiceLoginUserIdList { s32 PS4_SYSV_ABI sceUserServiceInitialize(const SceUserServiceInitializeParams* initParams); s32 PS4_SYSV_ABI sceUserServiceGetLoginUserIdList(SceUserServiceLoginUserIdList* userIdList); -void libUserService_Register(SymbolsResolver* sym); +void userServiceSymbolsRegister(SymbolsResolver* sym); }; // namespace Emulator::HLE::Libraries::LibUserService \ No newline at end of file diff --git a/src/emuTimer.cpp b/src/emuTimer.cpp new file mode 100644 index 00000000..c5d2700c --- /dev/null +++ b/src/emuTimer.cpp @@ -0,0 +1,14 @@ +#include "Lib/Timer.h" + +namespace Emulator::emuTimer { +static Lib::Timer timer; + +void start() { timer.Start(); } + +double getTimeMsec() { return timer.GetTimeMsec(); } + +u64 getTimeCounter() { return timer.GetTicks(); } + +u64 getTimeFrequency() { return timer.GetFrequency(); } + +} // namespace Emulator::emuTimer \ No newline at end of file diff --git a/src/emuTimer.h b/src/emuTimer.h new file mode 100644 index 00000000..bb53f71b --- /dev/null +++ b/src/emuTimer.h @@ -0,0 +1,9 @@ +#pragma once +#include "types.h" + +namespace Emulator::emuTimer { +void start(); +double getTimeMsec(); +u64 getTimeCounter(); +u64 getTimeFrequency(); +} // namespace Emulator::emuTimer \ No newline at end of file diff --git a/src/emulator.cpp b/src/emulator.cpp index 44e69683..94c6f67f 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -1,17 +1,30 @@ #include "emulator.h" -#include -#include + +#include #include -#include "Emulator/Util/singleton.h" +#include +#include #include -#include "Core/PS4/HLE/Graphics/video_out.h" -#include "Emulator/HLE/Libraries/LibPad/pad.h" +#include "core/PS4/HLE/Graphics/video_out.h" +#include "core/hle/libraries/libpad/pad.h" +#include "Emulator/Util/singleton.h" #include "version.h" namespace Emu { bool m_emu_needs_exit = false; +bool m_game_is_paused = {false}; +double m_current_time_seconds = {0.0}; +double m_previous_time_seconds = {0.0}; +int m_update_num = {0}; +int m_frame_num = {0}; +double m_update_time_seconds = {0.0}; +double m_current_fps = {0.0}; +int m_max_updates_per_frame = {4}; +double m_update_fixed_time = 1.0 / 60.0; +int m_fps_frames_num = {0}; +double m_fps_start_time = {0}; void emuInit(u32 width, u32 height) { auto* window_ctx = singleton::instance(); @@ -49,7 +62,39 @@ static void CreateSdlWindow(WindowCtx* ctx) { SDL_SetWindowResizable(ctx->m_window, SDL_FALSE); // we don't support resizable atm } +static void update() { + static double lag = 0.0; + + lag += m_current_time_seconds - m_previous_time_seconds; + + int num = 0; + + while (lag >= m_update_fixed_time) { + if (num < m_max_updates_per_frame) { + m_update_num++; + num++; + m_update_time_seconds = m_update_num * m_update_fixed_time; + } + + lag -= m_update_fixed_time; + } +} +static void calculateFps(double game_time_s) { + m_previous_time_seconds = m_current_time_seconds; + m_current_time_seconds = game_time_s; + + m_frame_num++; + + m_fps_frames_num++; + if (m_current_time_seconds - m_fps_start_time > 0.25f) { + m_current_fps = static_cast(m_fps_frames_num) / (m_current_time_seconds - m_fps_start_time); + m_fps_frames_num = 0; + m_fps_start_time = m_current_time_seconds; + } +} void emuRun() { + Lib::Timer timer; + timer.Start(); auto* window_ctx = singleton::instance(); { // init window and wait until init finishes @@ -58,6 +103,7 @@ void emuRun() { Graphics::Vulkan::vulkanCreate(window_ctx); window_ctx->m_is_graphic_initialized = true; window_ctx->m_graphic_initialized_cond.notify_one(); + calculateFps(timer.GetTimeSec()); } bool exit_loop = false; @@ -83,14 +129,68 @@ void emuRun() { case SDL_EVENT_DID_ENTER_FOREGROUND: break; case SDL_EVENT_KEY_DOWN: - case SDL_EVENT_KEY_UP: keyboardEvent(&event); break; + case SDL_EVENT_KEY_UP: + if (event.type == SDL_EVENT_KEY_DOWN){ + if (event.key.keysym.sym == SDLK_p) { + m_game_is_paused = !m_game_is_paused; + } + } + keyboardEvent(&event); + break; } continue; } - exit_loop = m_emu_needs_exit; + if (m_game_is_paused) { + if (!timer.IsPaused()) { + timer.Pause(); + } - if (!exit_loop) { - HLE::Libs::Graphics::VideoOut::videoOutFlip(100000); // flip every 0.1 sec + SDL_WaitEvent(&event); + + switch (event.type) { + case SDL_EVENT_QUIT: m_emu_needs_exit = true; break; + + case SDL_EVENT_TERMINATING: m_emu_needs_exit = true; break; + + case SDL_EVENT_WILL_ENTER_BACKGROUND: break; + + case SDL_EVENT_DID_ENTER_BACKGROUND: break; + + case SDL_EVENT_WILL_ENTER_FOREGROUND: break; + + case SDL_EVENT_DID_ENTER_FOREGROUND: break; + + case SDL_EVENT_KEY_DOWN: + case SDL_EVENT_KEY_UP: + if (event.type == SDL_EVENT_KEY_DOWN) { + if (event.key.keysym.sym == SDLK_p) { + m_game_is_paused = !m_game_is_paused; + } + } + keyboardEvent(&event); + break; + } + exit_loop = m_emu_needs_exit; + continue; + } + exit_loop = m_emu_needs_exit; + if (m_game_is_paused) { + if (!timer.IsPaused()) { + timer.Pause(); + } + } else { + if (timer.IsPaused()) { + timer.Resume(); + } + + if (!exit_loop) { + update(); + } + if (!exit_loop) { + if (HLE::Libs::Graphics::VideoOut::videoOutFlip(100000)) { // flip every 0.1 sec + calculateFps(timer.GetTimeSec()); + } + } } } std::exit(0); @@ -102,6 +202,12 @@ HLE::Libs::Graphics::GraphicCtx* getGraphicCtx() { return &window_ctx->m_graphic_ctx; } +void updateSDLTitle() { + char title[256]; + sprintf(title, "shadps4 v %s FPS: %f", Emulator::VERSION, m_current_fps); + auto* window_ctx = singleton::instance(); + SDL_SetWindowTitle(window_ctx->m_window, title); +} void DrawBuffer(HLE::Libs::Graphics::VideoOutVulkanImage* image) { auto* window_ctx = singleton::instance(); if (window_ctx->is_window_hidden) { @@ -192,10 +298,11 @@ void DrawBuffer(HLE::Libs::Graphics::VideoOutVulkanImage* image) { fmt::print("vkQueuePresentKHR failed\n"); std::exit(0); } + updateSDLTitle(); } void keyboardEvent(SDL_Event* event) { - using Emulator::HLE::Libraries::LibPad::ScePadButton; + using Core::Libraries::LibPad::ScePadButton; if (event->type == SDL_EVENT_KEY_DOWN || event->type == SDL_EVENT_KEY_UP) { u32 button = 0; diff --git a/src/emulator.h b/src/emulator.h index 0e9f938d..6f0fe528 100644 --- a/src/emulator.h +++ b/src/emulator.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include diff --git a/src/main.cpp b/src/main.cpp index 97cfc909..b3fa7dcc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,16 +3,17 @@ #include #include "types.h" #include "Util/log.h" -#include +#include #include #include #include #include #include -#include "Core/PS4/HLE/Libs.h" -#include "Core/PS4/Linker.h" +#include "core/PS4/HLE/Libs.h" +#include "core/PS4/Linker.h" #include "Emulator/Util\singleton.h" #include "discord.h" +#include "emuTimer.h" // Main code int main(int argc, char* argv[]) { @@ -26,6 +27,7 @@ int main(int argc, char* argv[]) { auto height = Config::getScreenHeight(); Emu::emuInit(width, height); HLE::Libs::Graphics::VideoOut::videoOutInit(width, height); + Emulator::emuTimer::start(); const char* const path = argv[1]; // argument 1 is the path of self file to boot diff --git a/src/vulkan_util.cpp b/src/vulkan_util.cpp index 5821944d..2dedcd83 100644 --- a/src/vulkan_util.cpp +++ b/src/vulkan_util.cpp @@ -1,6 +1,6 @@ #include "vulkan_util.h" #include -#include +#include #include #include #include diff --git a/src/vulkan_util.h b/src/vulkan_util.h index bd1fdda8..e4eda911 100644 --- a/src/vulkan_util.h +++ b/src/vulkan_util.h @@ -1,5 +1,5 @@ #pragma once -#include +#include #include #include