From 758ef332f265b3159915d6bc0cd536f5a8e68a2f Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Mon, 30 Oct 2023 08:48:52 +0200 Subject: [PATCH] implemented sceKernelGetProcessTime --- CMakeLists.txt | 2 +- .../PS4/HLE/Graphics/Objects/video_out_ctx.cpp | 3 ++- .../hle/libraries/libkernel/time_management.cpp | 14 ++++++++++++++ src/Core/hle/libraries/libkernel/time_management.h | 10 ++++++++++ src/emuTimer.cpp | 10 ++++++++++ src/emuTimer.h | 7 +++++++ src/main.cpp | 2 ++ 7 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/Core/hle/libraries/libkernel/time_management.cpp create mode 100644 src/Core/hle/libraries/libkernel/time_management.h create mode 100644 src/emuTimer.cpp create mode 100644 src/emuTimer.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b7465f5..f84b6c84 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,7 +98,7 @@ add_executable(shadps4 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/Emulator/HLE/Libraries/LibSystemService/system_service.cpp" "src/Emulator/HLE/Libraries/LibSystemService/system_service.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/HLE/Graphics/Objects/video_out_ctx.cpp b/src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.cpp index 4ebd7e6d..4df60c7e 100644 --- a/src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.cpp +++ b/src/Core/PS4/HLE/Graphics/Objects/video_out_ctx.cpp @@ -2,6 +2,7 @@ #include #include +#include namespace HLE::Graphics::Objects { @@ -120,7 +121,7 @@ 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.processTime = Core::Libraries::sceKernelGetProcessTime(); request->cfg->m_flip_status.tsc = HLE::Libs::LibKernel::sceKernelReadTsc(); request->cfg->m_flip_status.submitTsc = request->submit_tsc; request->cfg->m_flip_status.flipArg = request->flip_arg; 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..a49b2a24 --- /dev/null +++ b/src/Core/hle/libraries/libkernel/time_management.cpp @@ -0,0 +1,14 @@ +#include "time_management.h" + +#include + +#include "emuTimer.h" + +namespace Core::Libraries { +u64 sceKernelGetProcessTime() { + return static_cast(Emulator::emuTimer::getTimeMsec() * 1000.0); // return time in microseconds +} + +void timeSymbolsRegister(SymbolsResolver* sym) { LIB_FUNCTION("4J2sUJmuHZQ", "libkernel", 1, "libkernel", 1, 1, sceKernelGetProcessTime); } + +} // namespace Core::Libraries 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..12d87ca8 --- /dev/null +++ b/src/Core/hle/libraries/libkernel/time_management.h @@ -0,0 +1,10 @@ +#pragma once + +#include "types.h" +#include "Core/PS4/Loader/SymbolsResolver.h" + +namespace Core::Libraries { +u64 sceKernelGetProcessTime(); + +void timeSymbolsRegister(SymbolsResolver* sym); +} \ No newline at end of file diff --git a/src/emuTimer.cpp b/src/emuTimer.cpp new file mode 100644 index 00000000..c4fecfa8 --- /dev/null +++ b/src/emuTimer.cpp @@ -0,0 +1,10 @@ +#include "Lib/Timer.h" + +namespace Emulator::emuTimer { +static Lib::Timer timer; + +void start() { timer.Start(); } + +double getTimeMsec() { return timer.GetTimeMsec(); } + +} \ No newline at end of file diff --git a/src/emuTimer.h b/src/emuTimer.h new file mode 100644 index 00000000..2fdef406 --- /dev/null +++ b/src/emuTimer.h @@ -0,0 +1,7 @@ +#pragma once + +namespace Emulator::emuTimer { +void start(); +double getTimeMsec(); + +} // namespace Emulator::emuTimer \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 97cfc909..0c10cbd1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,7 @@ #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