From 61ce2c4294d63f917095eb8643b07f9bb6c1ab14 Mon Sep 17 00:00:00 2001 From: Dmugetsu Date: Mon, 26 May 2025 07:26:53 -0600 Subject: [PATCH] video_out: using mutex and lockguard to prevent race conditions, updating buffer labels and adding buffer id for flip sumission error. --- src/core/libraries/videoout/driver.cpp | 2 +- src/core/libraries/videoout/video_out.cpp | 26 +++++++++++++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/core/libraries/videoout/driver.cpp b/src/core/libraries/videoout/driver.cpp index 8f725e549..fd57fde2d 100644 --- a/src/core/libraries/videoout/driver.cpp +++ b/src/core/libraries/videoout/driver.cpp @@ -67,7 +67,7 @@ void VideoOutDriver::Close(s32 handle) { ASSERT(main_port.flip_events.empty()); } -VideoOutPort* VideoOutDriver::GetPort(int handle) { +VideoOutPort* VideoOutDriver::GetPort(s32 handle) { if (handle != 1) [[unlikely]] { return nullptr; } diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp index c5208b6dd..83a8cf97a 100644 --- a/src/core/libraries/videoout/video_out.cpp +++ b/src/core/libraries/videoout/video_out.cpp @@ -339,13 +339,25 @@ s32 sceVideoOutSubmitEopFlip(s32 handle, u32 buf_id, u32 mode, u32 arg, void** u return ORBIS_VIDEO_OUT_ERROR_INVALID_HANDLE; } - Platform::IrqC::Instance()->RegisterOnce( - 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); - ASSERT_MSG(result, "EOP flip submission failed"); - }); + static std::mutex irq_mutex; + + { + std::lock_guard lock(irq_mutex); + + Platform::IrqC::Instance()->RegisterOnce( + Platform::InterruptId::GfxFlip, [=](Platform::InterruptId irq) { + ASSERT_MSG(irq == Platform::InterruptId::GfxFlip, "Unexpected IRQ occurred"); + ASSERT_MSG(port->buffer_labels[buf_id] == 1, "Out-of-order flip IRQ"); + + const auto result = driver->SubmitFlip(port, buf_id, arg, true); + if (!result) { + LOG_ERROR(Lib_VideoOut, "EOP flip submission failed for buffer {}", buf_id); + return; + } + + port->buffer_labels[buf_id] = 0; + }); + } return ORBIS_OK; }