From 467a0ba49d803518dd4d440c1a9f504a46eaa305 Mon Sep 17 00:00:00 2001 From: VReaperV Date: Tue, 17 Mar 2026 16:13:36 +0300 Subject: [PATCH 1/2] Add cgame IPC to sync data to Daemon-vulkan --- src/engine/client/cg_msgdef.h | 7 ++++ src/engine/client/cl_cgame.cpp | 41 +++++++++++++++++++ src/engine/renderer-vulkan/DispatchRawData.h | 42 ++++++++++++++++++++ src/engine/renderer-vulkan/src.cmake | 1 + src/shared/client/cg_api.cpp | 12 ++++++ src/shared/client/cg_api.h | 2 + 6 files changed, 105 insertions(+) create mode 100644 src/engine/renderer-vulkan/DispatchRawData.h diff --git a/src/engine/client/cg_msgdef.h b/src/engine/client/cg_msgdef.h index 6821a9595b..9e32cd0cff 100644 --- a/src/engine/client/cg_msgdef.h +++ b/src/engine/client/cg_msgdef.h @@ -136,6 +136,8 @@ enum cgameImport_t CG_REGISTER_BUTTON_COMMANDS, CG_NOTIFY_TEAMCHANGE, CG_PREPAREKEYUP, + CG_DISPATCHRAWDATA, + CG_DISPATCHRAWDATASYNC, // Sound CG_S_STARTSOUND, @@ -267,6 +269,11 @@ using NotifyTeamChangeMsg = IPC::SyncMessage< using PrepareKeyUpMsg = IPC::SyncMessage< IPC::Message> >; +using DispatchRawDataMsg = IPC::Message, std::string>; +using DispatchRawDataSyncMsg = IPC::SyncMessage< + IPC::Message, std::string>, + IPC::Reply +>; // All Sounds diff --git a/src/engine/client/cl_cgame.cpp b/src/engine/client/cl_cgame.cpp index abb50789aa..71504477c5 100644 --- a/src/engine/client/cl_cgame.cpp +++ b/src/engine/client/cl_cgame.cpp @@ -46,6 +46,10 @@ Maryland 20850 USA. #include "qcommon/crypto.h" #include "qcommon/sys.h" +#if USE_VULKAN +#include "../renderer-vulkan/DispatchRawData.h" +#endif + #include "framework/CommonVMServices.h" #include "framework/CommandSystem.h" #include "framework/CvarSystem.h" @@ -938,6 +942,31 @@ void CL_OnTeamChanged( int newTeam ) Cmd::BufferCommandText( "exec -f " TEAMCONFIG_NAME ); } +static void DispatchRawData( const std::string& data ) { +#if USE_VULKAN + DispatchRawData( data.data() ); +#else + Q_UNUSED( data ); +#endif +} + +static std::string DispatchRawDataSync( const std::string& data ) { +#if USE_VULKAN + void* outMem; + int size; + + DispatchRawDataSync( data.data(), &outMem, &size ); + + out.resize( size ); + std::string out { ( const char* ) outMem, size }; + + return out; +#else + Q_UNUSED( data ); + return ""; +#endif +} + CGameVM::CGameVM(): VM::VMBase("cgame", Cvar::CHEAT), services(nullptr), cmdBuffer("client") { } @@ -1163,6 +1192,18 @@ void CGameVM::QVMSyscall(int syscallNum, Util::Reader& reader, IPC::Channel& cha }); break; + case CG_DISPATCHRAWDATA: + IPC::HandleMsg( channel, std::move( reader ), [this] ( const std::string& data ) { + DispatchRawData( data ); + } ); + break; + + case CG_DISPATCHRAWDATASYNC: + IPC::HandleMsg( channel, std::move( reader ), [this]( const std::string& data, std::string& out ) { + out = DispatchRawDataSync( data ); + } ); + break; + // All sounds case CG_S_REGISTERSOUND: diff --git a/src/engine/renderer-vulkan/DispatchRawData.h b/src/engine/renderer-vulkan/DispatchRawData.h new file mode 100644 index 0000000000..c1cc145fd3 --- /dev/null +++ b/src/engine/renderer-vulkan/DispatchRawData.h @@ -0,0 +1,42 @@ +/* +=========================================================================== + +Daemon BSD Source Code +Copyright (c) 2026 Daemon Developers +All rights reserved. + +This file is part of the Daemon BSD Source Code (Daemon Source Code). + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Daemon developers nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL DAEMON DEVELOPERS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=========================================================================== +*/ +// DispatchRawData.h + +#ifndef DISPATCH_RAW_DATA_H +#define DISPATCH_RAW_DATA_H + +void DispatchRawData( void* memory ); +void DispatchRawDataSync( void* memory, void** out, int& outSize ); + +#endif // DISPATCH_RAW_DATA_H \ No newline at end of file diff --git a/src/engine/renderer-vulkan/src.cmake b/src/engine/renderer-vulkan/src.cmake index 6be13e0858..97441ca653 100644 --- a/src/engine/renderer-vulkan/src.cmake +++ b/src/engine/renderer-vulkan/src.cmake @@ -1,2 +1,3 @@ set(RENDERERLIST + DispatchRawData.h ) \ No newline at end of file diff --git a/src/shared/client/cg_api.cpp b/src/shared/client/cg_api.cpp index 961583ab6a..a489ebafac 100644 --- a/src/shared/client/cg_api.cpp +++ b/src/shared/client/cg_api.cpp @@ -132,6 +132,18 @@ void trap_PrepareKeyUp() VM::SendMsg(); } +void trap_DispatchRawData( const std::string& data ) { + VM::SendMsg( data ); +} + +std::string trap_DispatchRawDataSync( const std::string& data ) { + std::string out; + + VM::SendMsg( data, out ); + + return out; +} + // All Sounds void trap_S_StartSound( vec3_t origin, int entityNum, soundChannel_t, sfxHandle_t sfx ) diff --git a/src/shared/client/cg_api.h b/src/shared/client/cg_api.h index 518a76d3ea..e78b4ae2d7 100644 --- a/src/shared/client/cg_api.h +++ b/src/shared/client/cg_api.h @@ -133,6 +133,8 @@ int trap_LAN_ServerStatus( const char *serverAddress, char *serverSt void trap_LAN_ResetServerStatus(); void trap_R_GetShaderNameFromHandle( const qhandle_t shader, char *out, int len ); void trap_PrepareKeyUp(); +void trap_DispatchRawData( const std::string& data ); +std::string trap_DispatchRawDataSync( const std::string& data ); void trap_R_SetAltShaderTokens( const char * ); void trap_S_UpdateEntityVelocity( int entityNum, const vec3_t velocity ); void trap_S_UpdateEntityPositionVelocity( int entityNum, const vec3_t position, const vec3_t velocity ); From ed714b01e3a971d31a166ac83ed8555bad0e1bd7 Mon Sep 17 00:00:00 2001 From: VReaperV Date: Tue, 17 Mar 2026 16:26:56 +0300 Subject: [PATCH 2/2] Add sgame IPC to sync data to Daemon-vulkan --- src/engine/server/sg_msgdef.h | 8 +++++++ src/engine/server/sv_sgame.cpp | 41 ++++++++++++++++++++++++++++++++++ src/shared/server/sg_api.cpp | 12 ++++++++++ src/shared/server/sg_api.h | 2 ++ 4 files changed, 63 insertions(+) diff --git a/src/engine/server/sg_msgdef.h b/src/engine/server/sg_msgdef.h index 6b3faa8624..5ace84f369 100644 --- a/src/engine/server/sg_msgdef.h +++ b/src/engine/server/sg_msgdef.h @@ -50,6 +50,9 @@ enum gameImport_t BOT_FREE_CLIENT, BOT_GET_CONSOLE_MESSAGE, BOT_DEBUG_DRAW, + + DISPATCH_RAWDATA, + DISPATCH_RAWDATASYNC }; using LocateGameDataMsg1 = IPC::Message, IPC::SharedMemory, int, int, int>; @@ -114,6 +117,11 @@ using BotGetConsoleMessageMsg = IPC::SyncMessage< >; // HACK: sgame message that only works when running in a client using BotDebugDrawMsg = IPC::Message, std::vector>; +using DispatchRawDataMsg = IPC::Message, std::string>; +using DispatchRawDataSyncMsg = IPC::SyncMessage< + IPC::Message, std::string>, + IPC::Reply +>; diff --git a/src/engine/server/sv_sgame.cpp b/src/engine/server/sv_sgame.cpp index be4eebf2be..ff90dfd571 100644 --- a/src/engine/server/sv_sgame.cpp +++ b/src/engine/server/sv_sgame.cpp @@ -45,6 +45,10 @@ Maryland 20850 USA. #include "client/client.h" // For bot debug draw #endif +#if USE_VULKAN +#include "../renderer-vulkan/DispatchRawData.h" +#endif + // Suppress warnings for unused [this] lambda captures. #ifdef __clang__ #pragma clang diagnostic ignored "-Wunused-lambda-capture" @@ -323,6 +327,31 @@ void SV_InitGameProgs() SV_InitGameVM(); } +static void DispatchRawData( const std::string& data ) { +#if USE_VULKAN + DispatchRawData( data.data() ); +#else + Q_UNUSED( data ); +#endif +} + +static std::string DispatchRawDataSync( const std::string& data ) { +#if USE_VULKAN + void* outMem; + int size; + + DispatchRawDataSync( data.data(), &outMem, &size ); + + out.resize( size ); + std::string out { ( const char* ) outMem, size }; + + return out; +#else + Q_UNUSED( data ); + return ""; +#endif +} + GameVM::GameVM(): VM::VMBase("sgame", Cvar::NONE), services(nullptr) { } @@ -594,6 +623,18 @@ void GameVM::QVMSyscall(int syscallNum, Util::Reader& reader, IPC::Channel& chan }); break; + case DISPATCH_RAWDATA: + IPC::HandleMsg( channel, std::move( reader ), [this] ( const std::string& data ) { + DispatchRawData( data ); + } ); + break; + + case DISPATCH_RAWDATASYNC: + IPC::HandleMsg( channel, std::move( reader ), [this]( const std::string& data, std::string& out ) { + out = DispatchRawDataSync( data ); + } ); + break; + default: Sys::Drop("Bad game system trap: %d", syscallNum); } diff --git a/src/shared/server/sg_api.cpp b/src/shared/server/sg_api.cpp index 550b40ba80..6f85224db8 100644 --- a/src/shared/server/sg_api.cpp +++ b/src/shared/server/sg_api.cpp @@ -164,3 +164,15 @@ int trap_BotGetServerCommand(int clientNum, char *message, int size) Q_strncpyz(message, message2.c_str(), size); return res; } + +void trap_DispatchRawData( const std::string& data ) { + VM::SendMsg( data ); +} + +std::string trap_DispatchRawDataSync( const std::string& data ) { + std::string out; + + VM::SendMsg( data, out ); + + return out; +} \ No newline at end of file diff --git a/src/shared/server/sg_api.h b/src/shared/server/sg_api.h index 80ef7cc46e..20fd92b7af 100644 --- a/src/shared/server/sg_api.h +++ b/src/shared/server/sg_api.h @@ -48,6 +48,8 @@ int trap_BotAllocateClient(); void trap_BotFreeClient( int clientNum ); void trap_GetUsercmd( int clientNum, usercmd_t *cmd ); int trap_BotGetServerCommand( int clientNum, char *message, int size ); +void trap_DispatchRawData( const std::string& data ); +std::string trap_DispatchRawDataSync( const std::string& data ); int trap_RSA_GenerateMessage( const char *public_key, char *cleartext, char *encrypted ); void trap_GenFingerprint( const char *pubkey, int size, char *buffer, int bufsize ); void trap_GetPlayerPubkey( int clientNum, char *pubkey, int size );