From e0850d5cfc4105abed3dff404a5c744c756bb049 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Fri, 13 Feb 2026 17:59:23 -0600 Subject: [PATCH 1/6] Kernel.Equeue: Only reset trigger state on events that clear. (#4032) * Don't clear events that don't need clearing Unless the event has the clear flag, it will be returned multiple times after triggering. * Fix event flags As older code suggests, the PS4 kernel does append the clear flag to various event types internally. This is visible when observing the returned event data from sceKernelWaitEqueue (or kevent, if you're feeling ambitious) Add flag is also removed from events internally. --- src/core/libraries/kernel/equeue.cpp | 12 ++++++++---- src/core/libraries/kernel/equeue.h | 5 +---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/core/libraries/kernel/equeue.cpp b/src/core/libraries/kernel/equeue.cpp index 2190f2533..72e38b265 100644 --- a/src/core/libraries/kernel/equeue.cpp +++ b/src/core/libraries/kernel/equeue.cpp @@ -32,6 +32,14 @@ bool EqueueInternal::AddEvent(EqueueEvent& event) { event.timer_interval = std::chrono::microseconds(event.event.data - offset); } + // Remove add flag from event + event.event.flags &= ~SceKernelEvent::Flags::Add; + + // Clear flag is appended to most event types internally. + if (event.event.filter != SceKernelEvent::Filter::User) { + event.event.flags |= SceKernelEvent::Flags::Clear; + } + const auto& it = std::ranges::find(m_events, event); if (it != m_events.cend()) { *it = std::move(event); @@ -165,10 +173,6 @@ int EqueueInternal::GetTriggeredEvents(SceKernelEvent* ev, int num) { for (auto it = m_events.begin(); it != m_events.end();) { if (it->IsTriggered()) { ev[count++] = it->event; - - // Event should not trigger again - it->ResetTriggerState(); - if (it->event.flags & SceKernelEvent::Flags::Clear) { it->Clear(); } diff --git a/src/core/libraries/kernel/equeue.h b/src/core/libraries/kernel/equeue.h index e933f80d1..332aa15c2 100644 --- a/src/core/libraries/kernel/equeue.h +++ b/src/core/libraries/kernel/equeue.h @@ -84,11 +84,8 @@ struct EqueueEvent { std::chrono::microseconds timer_interval; std::unique_ptr timer; - void ResetTriggerState() { - is_triggered = false; - } - void Clear() { + is_triggered = false; event.fflags = 0; event.data = 0; } From 8d4cbdbca990d704c33cdeef1c9aa804ef23cfa5 Mon Sep 17 00:00:00 2001 From: Niram7777 Date: Sat, 14 Feb 2026 20:31:19 +0000 Subject: [PATCH 2/6] Log actually not always compact (#4035) --- documents/Debugging/Debugging.md | 2 + src/common/config.cpp | 12 ++++ src/common/config.h | 2 + src/common/logging/backend.cpp | 111 +++++++++++++++++++------------ src/emulator.cpp | 1 + 5 files changed, 84 insertions(+), 44 deletions(-) diff --git a/documents/Debugging/Debugging.md b/documents/Debugging/Debugging.md index 8bb4b8fbd..013ca15fb 100644 --- a/documents/Debugging/Debugging.md +++ b/documents/Debugging/Debugging.md @@ -73,6 +73,8 @@ You can configure the emulator by editing the `config.toml` file found in the `u - Examples: - If the log is being spammed with messages coming from Lib.Pad, you can use `Lib.Pad:Critical` to only log critical-level messages. - If you'd like to mute everything, but still want to receive messages from Vulkan rendering: `*:Critical Render.Vulkan:Info` + - `isIdenticalLogGrouped`: Group same logs in one line with a counter (`true`/`false`) + - By default, the emulator will not rewrite the same line, and instead add a counter. - `Fullscreen`: Display the game in a full screen borderless window. diff --git a/src/common/config.cpp b/src/common/config.cpp index a5eea0a64..fb1181d62 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -141,6 +141,7 @@ static ConfigEntry isTrophyPopupDisabled(false); static ConfigEntry trophyNotificationDuration(6.0); static ConfigEntry logFilter(""); static ConfigEntry logType("sync"); +static ConfigEntry isIdenticalLogGrouped(true); static ConfigEntry userName("shadPS4"); static ConfigEntry isShowSplash(false); static ConfigEntry isSideTrophy("right"); @@ -395,6 +396,10 @@ string getLogType() { return logType.get(); } +bool groupIdenticalLogs() { + return isIdenticalLogGrouped.get(); +} + string getUserName() { return userName.get(); } @@ -694,6 +699,10 @@ void setLogType(const string& type, bool is_game_specific) { logType.set(type, is_game_specific); } +void setIdenticalLogGrouped(bool enable, bool is_game_specific) { + isIdenticalLogGrouped.set(enable, is_game_specific); +} + void setLogFilter(const string& type, bool is_game_specific) { logFilter.set(type, is_game_specific); } @@ -893,6 +902,7 @@ void load(const std::filesystem::path& path, bool is_game_specific) { enableDiscordRPC = toml::find_or(general, "enableDiscordRPC", enableDiscordRPC); logFilter.setFromToml(general, "logFilter", is_game_specific); logType.setFromToml(general, "logType", is_game_specific); + isIdenticalLogGrouped.setFromToml(general, "isIdenticalLogGrouped", is_game_specific); userName.setFromToml(general, "userName", is_game_specific); isShowSplash.setFromToml(general, "showSplash", is_game_specific); isSideTrophy.setFromToml(general, "sideTrophy", is_game_specific); @@ -1081,6 +1091,7 @@ void save(const std::filesystem::path& path, bool is_game_specific) { is_game_specific); logFilter.setTomlValue(data, "General", "logFilter", is_game_specific); logType.setTomlValue(data, "General", "logType", is_game_specific); + isIdenticalLogGrouped.setTomlValue(data, "General", "isIdenticalLogGrouped", is_game_specific); userName.setTomlValue(data, "General", "userName", is_game_specific); isShowSplash.setTomlValue(data, "General", "showSplash", is_game_specific); isSideTrophy.setTomlValue(data, "General", "sideTrophy", is_game_specific); @@ -1224,6 +1235,7 @@ void setDefaultValues(bool is_game_specific) { trophyNotificationDuration.set(6.0, is_game_specific); logFilter.set("", is_game_specific); logType.set("sync", is_game_specific); + isIdenticalLogGrouped.set("isIdenticalLogGrouped", is_game_specific); userName.set("shadPS4", is_game_specific); isShowSplash.set(false, is_game_specific); isSideTrophy.set("right", is_game_specific); diff --git a/src/common/config.h b/src/common/config.h index a9e0f7010..eb2b91f52 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -101,6 +101,8 @@ void setPipelineCacheEnabled(bool enable, bool is_game_specific = false); void setPipelineCacheArchived(bool enable, bool is_game_specific = false); std::string getLogType(); void setLogType(const std::string& type, bool is_game_specific = false); +bool groupIdenticalLogs(); +void setGroupIdenticalLogs(bool enable, bool is_game_specific = false); std::string getLogFilter(); void setLogFilter(const std::string& type, bool is_game_specific = false); double getTrophyNotificationDuration(); diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index 168350b96..9b7ea9cd1 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -209,41 +209,62 @@ public: } } - std::unique_lock entry_loc(_mutex); - - if (_last_entry.message == message) { - ++_last_entry.counter; - return; - } - - if (_last_entry.counter >= 2) { - _last_entry.message += " x" + std::to_string(_last_entry.counter); - } - - if (_last_entry.counter >= 1) { - if (Config::getLogType() == "async") { - message_queue.EmplaceWait(_last_entry); - } else { - ForEachBackend([this](auto& backend) { backend.Write(this->_last_entry); }); - std::fflush(stdout); - } - } - using std::chrono::duration_cast; using std::chrono::microseconds; using std::chrono::steady_clock; - this->_last_entry = { - .timestamp = duration_cast(steady_clock::now() - time_origin), - .log_class = log_class, - .log_level = log_level, - .filename = filename, - .line_num = line_num, - .function = function, - .message = message, - .thread = Common::GetCurrentThreadName(), - .counter = 1, - }; + if (Config::groupIdenticalLogs()) { + std::unique_lock entry_loc(_mutex); + + if (_last_entry.message == message) { + ++_last_entry.counter; + return; + } + + if (_last_entry.counter >= 2) { + _last_entry.message += " x" + std::to_string(_last_entry.counter); + } + + if (_last_entry.counter >= 1) { + if (Config::getLogType() == "async") { + message_queue.EmplaceWait(_last_entry); + } else { + ForEachBackend([this](auto& backend) { backend.Write(this->_last_entry); }); + std::fflush(stdout); + } + } + + this->_last_entry = { + .timestamp = duration_cast(steady_clock::now() - time_origin), + .log_class = log_class, + .log_level = log_level, + .filename = filename, + .line_num = line_num, + .function = function, + .message = message, + .thread = Common::GetCurrentThreadName(), + .counter = 1, + }; + } else { + const Entry entry = { + .timestamp = duration_cast(steady_clock::now() - time_origin), + .log_class = log_class, + .log_level = log_level, + .filename = filename, + .line_num = line_num, + .function = function, + .message = message, + .thread = Common::GetCurrentThreadName(), + .counter = 1, + }; + + if (Config::getLogType() == "async") { + message_queue.EmplaceWait(entry); + } else { + ForEachBackend([&entry](auto& backend) { backend.Write(entry); }); + std::fflush(stdout); + } + } } private: @@ -275,21 +296,23 @@ private: } void StopBackendThread() { - // log last message - if (_last_entry.counter >= 2) { - _last_entry.message += " x" + std::to_string(_last_entry.counter); - } - - if (_last_entry.counter >= 1) { - if (Config::getLogType() == "async") { - message_queue.EmplaceWait(_last_entry); - } else { - ForEachBackend([this](auto& backend) { backend.Write(this->_last_entry); }); - std::fflush(stdout); + if (Config::groupIdenticalLogs()) { + // log last message + if (_last_entry.counter >= 2) { + _last_entry.message += " x" + std::to_string(_last_entry.counter); } - } - this->_last_entry = {}; + if (_last_entry.counter >= 1) { + if (Config::getLogType() == "async") { + message_queue.EmplaceWait(_last_entry); + } else { + ForEachBackend([this](auto& backend) { backend.Write(this->_last_entry); }); + std::fflush(stdout); + } + } + + this->_last_entry = {}; + } backend_thread.request_stop(); if (backend_thread.joinable()) { diff --git a/src/emulator.cpp b/src/emulator.cpp index 87ce82326..5d3a652b8 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -239,6 +239,7 @@ void Emulator::Run(std::filesystem::path file, std::vector args, LOG_INFO(Config, "Game-specific config exists: {}", has_game_config); LOG_INFO(Config, "General LogType: {}", Config::getLogType()); + LOG_INFO(Config, "General isIdenticalLogGrouped: {}", Config::groupIdenticalLogs()); LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole()); LOG_INFO(Config, "General isDevKit: {}", Config::isDevKitConsole()); LOG_INFO(Config, "General isConnectedToNetwork: {}", Config::getIsConnectedToNetwork()); From 98af227a8d98b81cd4f74bf6a038cd851888a498 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sat, 14 Feb 2026 14:47:28 -0600 Subject: [PATCH 3/6] More hotfixes (#4036) User events don't increment fflags, so don't increment it. Also added a bugfix for dce events, as static_cast wasn't properly unpacking event.data. --- src/core/libraries/kernel/equeue.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/libraries/kernel/equeue.h b/src/core/libraries/kernel/equeue.h index 332aa15c2..06b667008 100644 --- a/src/core/libraries/kernel/equeue.h +++ b/src/core/libraries/kernel/equeue.h @@ -98,14 +98,13 @@ struct EqueueEvent { void TriggerUser(void* data) { is_triggered = true; - event.fflags++; event.udata = data; } void TriggerDisplay(void* data) { is_triggered = true; if (data != nullptr) { - auto event_data = static_cast(event.data); + auto event_data = std::bit_cast(event.data); auto event_hint_raw = reinterpret_cast(data); auto event_hint = static_cast(event_hint_raw); if (event_hint.event_id == event.ident && event.ident != 0xfe) { From 0f92285e5071a788bd078f1c1c7210f2506fdd91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valdis=20Bogd=C4=81ns?= Date: Sat, 14 Feb 2026 23:30:09 +0200 Subject: [PATCH 4/6] GR2-win-crash-fix (#4033) * Improve stack clearing logic in ExecuteGuest Added a check for fiber stacks before clearing the stack in ExecuteGuest. That fixes Gravity Rush 2 crash on Windows. * Refactor ExecuteGuest to simplify stack clearing logic This enough for GR2 * Recover thread initialization in ExecuteGuest function * Enhance null check for thread control block * Fix condition to check tcb before clearing stack --- src/core/tls.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/tls.h b/src/core/tls.h index 83940be7a..27de518ea 100644 --- a/src/core/tls.h +++ b/src/core/tls.h @@ -61,7 +61,10 @@ template ReturnType ExecuteGuest(PS4_SYSV_ABI ReturnType (*func)(FuncArgs...), CallArgs&&... args) { EnsureThreadInitialized(); // clear stack to avoid trash from EnsureThreadInitialized - ClearStack<12_KB>(); + auto* tcb = GetTcbBase(); + if (tcb != nullptr && tcb->tcb_fiber == nullptr) { + ClearStack<12_KB>(); + } return func(std::forward(args)...); } From fba7304d628eb0858778024336f36ebd0ef5e3d8 Mon Sep 17 00:00:00 2001 From: Alexandre Bouvier Date: Sun, 15 Feb 2026 07:12:52 +0000 Subject: [PATCH 5/6] cmake: prefer more system libs (#4037) --- CMakeLists.txt | 4 +++- externals/CMakeLists.txt | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a1d7d9530..b07dcea87 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -227,6 +227,8 @@ find_package(fmt 10.2.0 CONFIG) find_package(glslang 15 CONFIG) find_package(half 1.12.0 MODULE) find_package(magic_enum 0.9.7 CONFIG) +find_package(miniz 3.1 CONFIG) +find_package(nlohmann_json 3.12 CONFIG) find_package(PNG 1.6 MODULE) find_package(OpenAL CONFIG) find_package(RenderDoc 1.6.0 MODULE) @@ -1116,7 +1118,7 @@ create_target_directory_groups(shadps4) target_link_libraries(shadps4 PRIVATE magic_enum::magic_enum fmt::fmt toml11::toml11 tsl::robin_map xbyak::xbyak Tracy::TracyClient RenderDoc::API FFmpeg::ffmpeg Dear_ImGui gcn half::half ZLIB::ZLIB PNG::PNG) target_link_libraries(shadps4 PRIVATE Boost::headers GPUOpen::VulkanMemoryAllocator LibAtrac9 sirit Vulkan::Headers xxHash::xxhash Zydis::Zydis glslang::glslang SDL3::SDL3 SDL3_mixer::SDL3_mixer pugixml::pugixml) -target_link_libraries(shadps4 PRIVATE stb::headers libusb::usb lfreist-hwinfo::hwinfo nlohmann_json::nlohmann_json miniz fdk-aac CLI11::CLI11 OpenAL::OpenAL Cpp_Httplib) +target_link_libraries(shadps4 PRIVATE stb::headers libusb::usb lfreist-hwinfo::hwinfo nlohmann_json::nlohmann_json miniz::miniz fdk-aac CLI11::CLI11 OpenAL::OpenAL Cpp_Httplib) target_compile_definitions(shadps4 PRIVATE IMGUI_USER_CONFIG="imgui/imgui_config.h") target_compile_definitions(Dear_ImGui PRIVATE IMGUI_USER_CONFIG="${PROJECT_SOURCE_DIR}/src/imgui/imgui_config.h") diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 7f6e6ec4e..41a0f71c7 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -259,16 +259,19 @@ if (WIN32) add_subdirectory(ext-wepoll) endif() -if (NOT TARGET fdk-aac) add_subdirectory(aacdec) -endif() #nlohmann json +if (NOT TARGET nlohmann_json::nlohmann_json) set(JSON_BuildTests OFF CACHE INTERNAL "") add_subdirectory(json) +endif() # miniz +if (NOT TARGET miniz::miniz) add_subdirectory(miniz) +add_library(miniz::miniz ALIAS miniz) +endif() # cli11 if (NOT TARGET CLI11::CLI11) From 4a370519a53e579e849e734ef8a71105cd4d16fd Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Sun, 15 Feb 2026 01:29:33 -0600 Subject: [PATCH 6/6] Lib.GnmDriver: Fix flip arg for sceGnmSubmitAndFlipCommandBuffers (#4038) * There is a mountain of evidence suggesting that flip_arg for these functions should be a 64-bit integer. This fixes "memory" errors in some Unity titles. * oops * Fix sceVideoOutGetEventData This bug went unnoticed for a while because the selection of Unity games I had at the time didn't actually care. This + the prior fix is needed for Unity titles. --- src/core/libraries/gnmdriver/gnmdriver.cpp | 6 +++--- src/core/libraries/gnmdriver/gnmdriver.h | 4 ++-- src/core/libraries/videoout/video_out.cpp | 6 +++--- src/core/libraries/videoout/video_out.h | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/core/libraries/gnmdriver/gnmdriver.cpp b/src/core/libraries/gnmdriver/gnmdriver.cpp index 1181f6299..25682ada0 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.cpp +++ b/src/core/libraries/gnmdriver/gnmdriver.cpp @@ -2052,7 +2052,7 @@ int PS4_SYSV_ABI sceGnmSqttWaitForEvent() { } static inline s32 PatchFlipRequest(u32* cmdbuf, u32 size, u32 vo_handle, u32 buf_idx, u32 flip_mode, - u32 flip_arg, void* unk) { + s64 flip_arg, void* unk) { // check for `prepareFlip` packet cmdbuf += size - 64; ASSERT_MSG(cmdbuf[0] == 0xc03e1000, "Can't find `prepareFlip` packet"); @@ -2138,7 +2138,7 @@ static inline s32 PatchFlipRequest(u32* cmdbuf, u32 size, u32 vo_handle, u32 buf s32 PS4_SYSV_ABI sceGnmSubmitAndFlipCommandBuffers(u32 count, u32* dcb_gpu_addrs[], u32* dcb_sizes_in_bytes, u32* ccb_gpu_addrs[], u32* ccb_sizes_in_bytes, u32 vo_handle, - u32 buf_idx, u32 flip_mode, u32 flip_arg) { + u32 buf_idx, u32 flip_mode, s64 flip_arg) { return sceGnmSubmitAndFlipCommandBuffersForWorkload( count, count, dcb_gpu_addrs, dcb_sizes_in_bytes, ccb_gpu_addrs, ccb_sizes_in_bytes, vo_handle, buf_idx, flip_mode, flip_arg); @@ -2146,7 +2146,7 @@ s32 PS4_SYSV_ABI sceGnmSubmitAndFlipCommandBuffers(u32 count, u32* dcb_gpu_addrs s32 PS4_SYSV_ABI sceGnmSubmitAndFlipCommandBuffersForWorkload( u32 workload, u32 count, u32* dcb_gpu_addrs[], u32* dcb_sizes_in_bytes, u32* ccb_gpu_addrs[], - u32* ccb_sizes_in_bytes, u32 vo_handle, u32 buf_idx, u32 flip_mode, u32 flip_arg) { + u32* ccb_sizes_in_bytes, u32 vo_handle, u32 buf_idx, u32 flip_mode, s64 flip_arg) { LOG_DEBUG(Lib_GnmDriver, "called [buf = {}]", buf_idx); auto* cmdbuf = dcb_gpu_addrs[count - 1]; diff --git a/src/core/libraries/gnmdriver/gnmdriver.h b/src/core/libraries/gnmdriver/gnmdriver.h index 4001f4661..5f3462dd9 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.h +++ b/src/core/libraries/gnmdriver/gnmdriver.h @@ -211,10 +211,10 @@ int PS4_SYSV_ABI sceGnmSqttWaitForEvent(); s32 PS4_SYSV_ABI sceGnmSubmitAndFlipCommandBuffers(u32 count, u32* dcb_gpu_addrs[], u32* dcb_sizes_in_bytes, u32* ccb_gpu_addrs[], u32* ccb_sizes_in_bytes, u32 vo_handle, - u32 buf_idx, u32 flip_mode, u32 flip_arg); + u32 buf_idx, u32 flip_mode, s64 flip_arg); int PS4_SYSV_ABI sceGnmSubmitAndFlipCommandBuffersForWorkload( u32 workload, u32 count, u32* dcb_gpu_addrs[], u32* dcb_sizes_in_bytes, u32* ccb_gpu_addrs[], - u32* ccb_sizes_in_bytes, u32 vo_handle, u32 buf_idx, u32 flip_mode, u32 flip_arg); + u32* ccb_sizes_in_bytes, u32 vo_handle, u32 buf_idx, u32 flip_mode, s64 flip_arg); s32 PS4_SYSV_ABI sceGnmSubmitCommandBuffers(u32 count, const u32* dcb_gpu_addrs[], u32* dcb_sizes_in_bytes, const u32* ccb_gpu_addrs[], u32* ccb_sizes_in_bytes); diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp index e9176afdc..da58772a0 100644 --- a/src/core/libraries/videoout/video_out.cpp +++ b/src/core/libraries/videoout/video_out.cpp @@ -217,7 +217,7 @@ s32 PS4_SYSV_ABI sceVideoOutGetEventData(const Kernel::SceKernelEvent* ev, s64* } auto event_data = ev->data >> 0x10; - if (ev->ident != static_cast(OrbisVideoOutInternalEventId::Flip) || ev->data == 0) { + if (ev->ident != static_cast(OrbisVideoOutInternalEventId::Flip) || ev->data >= 0) { *data = event_data; } else { *data = event_data | 0xffff000000000000; @@ -338,7 +338,7 @@ s32 PS4_SYSV_ABI sceVideoOutGetBufferLabelAddress(s32 handle, uintptr_t* label_a return 16; } -s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, u32 arg, void** unk) { +s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, s64 flip_arg, void** unk) { auto* port = driver->GetPort(handle); if (!port) { return ORBIS_VIDEO_OUT_ERROR_INVALID_HANDLE; @@ -348,7 +348,7 @@ s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, u32 arg, void** u Platform::InterruptId::GfxFlip, [=](Platform::InterruptId irq) { ASSERT_MSG(irq == Platform::InterruptId::GfxFlip, "An unexpected IRQ occured"); ASSERT_MSG(port->buffer_labels[buf_id] == 1, "Out of order flip IRQ"); - const auto result = driver->SubmitFlip(port, buf_id, arg, true); + const auto result = driver->SubmitFlip(port, buf_id, flip_arg, true); ASSERT_MSG(result, "EOP flip submission failed"); }); diff --git a/src/core/libraries/videoout/video_out.h b/src/core/libraries/videoout/video_out.h index ba2732ff7..2c99a4d1c 100644 --- a/src/core/libraries/videoout/video_out.h +++ b/src/core/libraries/videoout/video_out.h @@ -139,7 +139,7 @@ s32 PS4_SYSV_ABI sceVideoOutColorSettingsSetGamma(SceVideoOutColorSettings* sett s32 PS4_SYSV_ABI sceVideoOutAdjustColor(s32 handle, const SceVideoOutColorSettings* settings); // Internal system functions -s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, u32 arg, void** unk); +s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, s64 flip_arg, void** unk); void RegisterLib(Core::Loader::SymbolsResolver* sym);