From 71dac4300deea670047c2d5c8702b0521c662de6 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Wed, 15 Feb 2023 16:56:18 +0100 Subject: [PATCH] here have more shitty code --- src/frontend/qt_sdl/IPC.cpp | 89 +++++++++++++++++++++++++++++++-- src/frontend/qt_sdl/LocalMP.cpp | 9 ---- 2 files changed, 85 insertions(+), 13 deletions(-) diff --git a/src/frontend/qt_sdl/IPC.cpp b/src/frontend/qt_sdl/IPC.cpp index c8edf511..02db7194 100644 --- a/src/frontend/qt_sdl/IPC.cpp +++ b/src/frontend/qt_sdl/IPC.cpp @@ -30,6 +30,29 @@ namespace IPC QSharedMemory* Buffer = nullptr; int InstanceID; +struct BufferHeader +{ + u16 NumInstances; + u16 InstanceBitmask; // bitmask of all instances present + u32 CommandWriteOffset; +}; + +struct CommandHeader +{ + u32 Magic; + u16 SenderID; + u16 Recipients; + u16 Command; + u16 Length; +}; + +u32 CommandReadOffset; + +const u32 kBufferSize = 0x4000; +const u32 kMaxCommandSize = 0x800; +const u32 kCommandStart = sizeof(BufferHeader); +const u32 kCommandEnd = kBufferSize; + void Init() { @@ -40,7 +63,7 @@ void Init() if (!Buffer->attach()) { printf("IPC sharedmem doesn't exist. creating\n"); - if (!Buffer->create(1024)) + if (!Buffer->create(kBufferSize)) { printf("IPC sharedmem create failed :(\n"); delete Buffer; @@ -55,13 +78,15 @@ void Init() Buffer->lock(); u8* data = (u8*)Buffer->data(); - u16 mask = *(u16*)&data[0]; + BufferHeader* header = (BufferHeader*)&data[0]; + u16 mask = header->InstanceBitmask; for (int i = 0; i < 16; i++) { if (!(mask & (1<InstanceBitmask |= (1<NumInstances++; break; } } @@ -76,7 +101,9 @@ void DeInit() { Buffer->lock(); u8* data = (u8*)Buffer->data(); - *(u16*)&data[0] &= ~(1<InstanceBitmask &= ~(1<NumInstances--; Buffer->unlock(); Buffer->detach(); @@ -85,4 +112,58 @@ void DeInit() Buffer = nullptr; } + +void FIFORead(void* buf, int len) +{ + u8* data = (u8*)Buffer->data(); + + u32 offset, start, end; + + offset = CommandReadOffset; + start = kCommandStart; + end = kCommandEnd; + + if ((offset + len) >= end) + { + u32 part1 = end - offset; + memcpy(buf, &data[offset], part1); + memcpy(&((u8*)buf)[part1], &data[start], len - part1); + offset = start + len - part1; + } + else + { + memcpy(buf, &data[offset], len); + offset += len; + } + + CommandReadOffset = offset; +} + +void FIFOWrite(void* buf, int len) +{ + u8* data = (u8*)Buffer->data(); + BufferHeader* header = (BufferHeader*)&data[0]; + + u32 offset, start, end; + + offset = header->CommandWriteOffset; + start = kCommandStart; + end = kCommandEnd; + + if ((offset + len) >= end) + { + u32 part1 = end - offset; + memcpy(&data[offset], buf, part1); + memcpy(&data[start], &((u8*)buf)[part1], len - part1); + offset = start + len - part1; + } + else + { + memcpy(&data[offset], buf, len); + offset += len; + } + + header->CommandWriteOffset = offset; +} + } diff --git a/src/frontend/qt_sdl/LocalMP.cpp b/src/frontend/qt_sdl/LocalMP.cpp index 31801b7f..291cb11a 100644 --- a/src/frontend/qt_sdl/LocalMP.cpp +++ b/src/frontend/qt_sdl/LocalMP.cpp @@ -67,15 +67,6 @@ struct MPPacketHeader u64 Timestamp; }; -struct MPSync -{ - u32 Magic; - u32 SenderID; - u16 ClientMask; - u16 Type; - u64 Timestamp; -}; - QSharedMemory* MPQueue; int InstanceID; u32 PacketReadOffset;