diff --git a/orbis-kernel/include/orbis/note.hpp b/orbis-kernel/include/orbis/note.hpp index db11c9b2c..ce96e5c14 100644 --- a/orbis-kernel/include/orbis/note.hpp +++ b/orbis-kernel/include/orbis/note.hpp @@ -4,6 +4,7 @@ #include "orbis-config.hpp" #include "orbis/utils/Rc.hpp" #include "utils/SharedMutex.hpp" +#include #include namespace orbis { @@ -90,7 +91,8 @@ struct EventEmitter : orbis::RcBase { shared_mutex mutex; std::set, kallocator> notes; - void emit(sshort filter, uint fflags = 0, intptr_t data = 0); + void emit(sshort filter, uint fflags = 0, intptr_t data = 0, + uintptr_t ident = std::numeric_limits::max()); void subscribe(KNote *note); void unsubscribe(KNote *note); }; diff --git a/orbis-kernel/src/event.cpp b/orbis-kernel/src/event.cpp index 689a5b6d0..82f275760 100644 --- a/orbis-kernel/src/event.cpp +++ b/orbis-kernel/src/event.cpp @@ -20,7 +20,8 @@ orbis::KNote::~KNote() { } } -void orbis::EventEmitter::emit(sshort filter, uint fflags, intptr_t data) { +void orbis::EventEmitter::emit(sshort filter, uint fflags, intptr_t data, + uintptr_t ident) { std::lock_guard lock(mutex); for (auto note : notes) { @@ -35,6 +36,11 @@ void orbis::EventEmitter::emit(sshort filter, uint fflags, intptr_t data) { note->event.fflags = fflags; } + if (ident != std::numeric_limits::max() && + note->event.ident != ident) { + continue; + } + std::lock_guard lock(note->mutex); if (note->triggered) { diff --git a/rpcsx/gpu/Device.cpp b/rpcsx/gpu/Device.cpp index f3b944b17..8997c3859 100644 --- a/rpcsx/gpu/Device.cpp +++ b/rpcsx/gpu/Device.cpp @@ -44,9 +44,9 @@ static VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessageCallback( } enum class DisplayEvent : std::uint16_t { - Flip, - VBlank, - PreVBlankStart, + Flip = 6, + VBlank = 7, + PreVBlankStart = 0x59, }; static constexpr std::uint64_t @@ -345,7 +345,7 @@ void Device::start() { std::chrono::duration_cast(period); std::this_thread::sleep_until(prevVBlank); orbis::g_context.deviceEventEmitter->emit( - orbis::kEvFiltDisplay, 0, makeDisplayEvent(DisplayEvent::VBlank)); + orbis::kEvFiltDisplay, 0, 0, makeDisplayEvent(DisplayEvent::VBlank)); } }); @@ -812,7 +812,7 @@ bool Device::flip(std::uint32_t pid, int bufferIndex, std::uint64_t arg, amdgpu::flip( cacheTag, vk::context->swapchainExtent, buffer.address, swapchainImageView, {bufferAttr.width, bufferAttr.height}, flipType, - getDefaultTileModes()[bufferAttr.tilingMode == 1 ? 10 : 8], dfmt, nfmt); + getDefaultTileModes()[bufferAttr.tilingMode != 0 ? 10 : 8], dfmt, nfmt); transitionImageLayout(sched.getCommandBuffer(), swapchainImage, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, @@ -908,7 +908,8 @@ void Device::flip(std::uint32_t pid, int bufferIndex, std::uint64_t arg) { vk::context->swapchainImageViews[imageIndex]); orbis::g_context.deviceEventEmitter->emit( - orbis::kEvFiltDisplay, 0, makeDisplayEvent(DisplayEvent::Flip)); + orbis::kEvFiltDisplay, 0, arg, + makeDisplayEvent(DisplayEvent::Flip, 1 << 8, 0)); if (!flipComplete) { isImageAcquired = true; return;