mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-04 16:32:39 +00:00
Fix libSceVideoOut event idents
Based on some decompilation work, events coming from libSceVideoOut use a separate set of values for identifiers. These values are only converted to OrbisVideoOutEventId values during calls to sceVideoOutGetEventId. For convenience, I've placed all relevant identifiers into a enum called OrbisVideoOutInternalEventId. Thanks to @red_prig for the tips.
This commit is contained in:
parent
a01f20966a
commit
3db766fb12
@ -185,9 +185,9 @@ void VideoOutDriver::Flip(const Request& req) {
|
||||
// Trigger flip events for the port.
|
||||
for (auto& event : port->flip_events) {
|
||||
if (event != nullptr) {
|
||||
event->TriggerEvent(u64(OrbisVideoOutEventId::Flip),
|
||||
event->TriggerEvent(static_cast<u64>(OrbisVideoOutInternalEventId::Flip),
|
||||
Kernel::SceKernelEvent::Filter::VideoOut,
|
||||
(void*)(u64(OrbisVideoOutEventId::Flip) | (req.flip_arg << 16)));
|
||||
reinterpret_cast<void*>(static_cast<u64>(OrbisVideoOutInternalEventId::Flip) | (req.flip_arg << 16)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -323,7 +323,7 @@ void VideoOutDriver::PresentThread(std::stop_token token) {
|
||||
// Trigger flip events for the port.
|
||||
for (auto& event : main_port.vblank_events) {
|
||||
if (event != nullptr) {
|
||||
event->TriggerEvent(u64(OrbisVideoOutEventId::Vblank),
|
||||
event->TriggerEvent(static_cast<u64>(OrbisVideoOutInternalEventId::Vblank),
|
||||
Kernel::SceKernelEvent::Filter::VideoOut, nullptr);
|
||||
}
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ s32 PS4_SYSV_ABI sceVideoOutAddFlipEvent(Kernel::SceKernelEqueue eq, s32 handle,
|
||||
}
|
||||
|
||||
Kernel::EqueueEvent event{};
|
||||
event.event.ident = u64(OrbisVideoOutEventId::Flip);
|
||||
event.event.ident = static_cast<u64>(OrbisVideoOutInternalEventId::Flip);
|
||||
event.event.filter = Kernel::SceKernelEvent::Filter::VideoOut;
|
||||
event.event.flags = Kernel::SceKernelEvent::Flags::Add;
|
||||
event.event.udata = udata;
|
||||
@ -76,7 +76,7 @@ s32 PS4_SYSV_ABI sceVideoOutAddVblankEvent(Kernel::SceKernelEqueue eq, s32 handl
|
||||
}
|
||||
|
||||
Kernel::EqueueEvent event{};
|
||||
event.event.ident = u64(OrbisVideoOutEventId::Vblank);
|
||||
event.event.ident = static_cast<u64>(OrbisVideoOutInternalEventId::Vblank);
|
||||
event.event.filter = Kernel::SceKernelEvent::Filter::VideoOut;
|
||||
event.event.flags = Kernel::SceKernelEvent::Flags::Add;
|
||||
event.event.udata = udata;
|
||||
@ -156,9 +156,26 @@ int PS4_SYSV_ABI sceVideoOutGetEventId(const Kernel::SceKernelEvent* ev) {
|
||||
return ORBIS_VIDEO_OUT_ERROR_INVALID_ADDRESS;
|
||||
}
|
||||
if (ev->filter != Kernel::SceKernelEvent::Filter::VideoOut) {
|
||||
return ORBIS_VIDEO_OUT_ERROR_INVALID_EVENT_QUEUE;
|
||||
return ORBIS_VIDEO_OUT_ERROR_INVALID_EVENT;
|
||||
}
|
||||
|
||||
OrbisVideoOutInternalEventId internal_event_id = static_cast<OrbisVideoOutInternalEventId>(ev->ident);
|
||||
switch (internal_event_id) {
|
||||
case OrbisVideoOutInternalEventId::Flip:
|
||||
return static_cast<s32>(OrbisVideoOutEventId::Flip);
|
||||
case OrbisVideoOutInternalEventId::Vblank:
|
||||
case OrbisVideoOutInternalEventId::SysVblank:
|
||||
return static_cast<s32>(OrbisVideoOutEventId::Vblank);
|
||||
case OrbisVideoOutInternalEventId::PreVblankStart:
|
||||
return static_cast<s32>(OrbisVideoOutEventId::PreVblankStart);
|
||||
case OrbisVideoOutInternalEventId::SetMode:
|
||||
return static_cast<s32>(OrbisVideoOutEventId::SetMode);
|
||||
case OrbisVideoOutInternalEventId::Position:
|
||||
return static_cast<s32>(OrbisVideoOutEventId::Position);
|
||||
default: {
|
||||
return ORBIS_VIDEO_OUT_ERROR_INVALID_EVENT;
|
||||
}
|
||||
}
|
||||
return ev->ident;
|
||||
}
|
||||
|
||||
int PS4_SYSV_ABI sceVideoOutGetEventData(const Kernel::SceKernelEvent* ev, int64_t* data) {
|
||||
|
@ -40,7 +40,22 @@ constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_NONE = 0;
|
||||
constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_VR = 7;
|
||||
constexpr int SCE_VIDEO_OUT_BUFFER_ATTRIBUTE_OPTION_STRICT_COLORIMETRY = 8;
|
||||
|
||||
enum class OrbisVideoOutEventId : s16 { Flip = 0, Vblank = 1, PreVblankStart = 2 };
|
||||
enum class OrbisVideoOutEventId : s16 {
|
||||
Flip = 0,
|
||||
Vblank = 1,
|
||||
PreVblankStart = 2,
|
||||
SetMode = 8,
|
||||
Position = 12,
|
||||
};
|
||||
|
||||
enum class OrbisVideoOutInternalEventId : s16 {
|
||||
Flip = 0x6,
|
||||
Vblank = 0x7,
|
||||
SetMode = 0x51,
|
||||
Position = 0x58,
|
||||
PreVblankStart = 0x59,
|
||||
SysVblank = 0x63,
|
||||
};
|
||||
|
||||
enum class AspectRatioMode : s32 {
|
||||
Ratio16_9 = 0,
|
||||
|
Loading…
Reference in New Issue
Block a user