From e58ae3ef524a885d44216a30aa8d49ff7d9e5950 Mon Sep 17 00:00:00 2001 From: martinfouilleul Date: Thu, 2 Mar 2023 09:54:12 +0100 Subject: [PATCH] [surface sharing] first draft for win32 using window reparenting --- examples/surface_sharing/main.c | 10 +- src/glsl_shaders.h | 2 +- src/milepost.c | 2 + src/osx_surface_sharing.m | 2 +- src/win32_surface_sharing.c | 207 ++++++++++++++++++++++++++++++++ 5 files changed, 215 insertions(+), 8 deletions(-) create mode 100644 src/win32_surface_sharing.c diff --git a/examples/surface_sharing/main.c b/examples/surface_sharing/main.c index e6b8b9c..81ba300 100644 --- a/examples/surface_sharing/main.c +++ b/examples/surface_sharing/main.c @@ -138,10 +138,8 @@ int child_main(int writeFd) glUseProgram(program); //NOTE: create surface server and start sharing surface -// mg_surface_server server = mg_surface_server_create(); -// mg_surface_connection_id connectionID = mg_surface_server_start(server, surface); - - mg_surface_connection_id connectionID = 123456789; + mg_surface_server server = mg_surface_server_create(); + mg_surface_connection_id connectionID = mg_surface_server_start(server, surface); //NOTE: send context id to parent write(writeFd, &connectionID, sizeof(connectionID)); @@ -223,7 +221,7 @@ int main(int argc, char** argv) mp_window window = mp_window_create(rect, "test", 0); //NOTE: create surface client -// mg_surface surface = mg_surface_client_create_for_window(window); + mg_surface surface = mg_surface_client_create_for_window(window); //NOTE setup descriptors @@ -244,7 +242,7 @@ int main(int argc, char** argv) printf("received child connection id %llu\n", connectionID); //NOTE: connect the client -// mg_surface_client_connect(surface, connectionID); + mg_surface_client_connect(surface, connectionID); //NOTE: show the window mp_window_bring_to_front(window); diff --git a/src/glsl_shaders.h b/src/glsl_shaders.h index 242a448..7dfa82d 100644 --- a/src/glsl_shaders.h +++ b/src/glsl_shaders.h @@ -2,7 +2,7 @@ * * file: glsl_shaders.h * note: string literals auto-generated by embed_text.py -* date: 01/032023 +* date: 02/032023 * **********************************************************************/ #ifndef __GLSL_SHADERS_H__ diff --git a/src/milepost.c b/src/milepost.c index b1e7562..c222fd1 100644 --- a/src/milepost.c +++ b/src/milepost.c @@ -68,6 +68,8 @@ #include"egl_surface.c" #endif + #include"win32_surface_sharing.c" + #elif defined(OS_MACOS) //NOTE: macos application layer and graphics backends are defined in milepost.m #else diff --git a/src/osx_surface_sharing.m b/src/osx_surface_sharing.m index 719af80..063fd50 100644 --- a/src/osx_surface_sharing.m +++ b/src/osx_surface_sharing.m @@ -2,7 +2,7 @@ * * @file: osx_surface_sharing.m * @author: Martin Fouilleul -* @date: 19/08/2022 +* @date: 01/03/2023 * @revision: * *****************************************************************/ diff --git a/src/win32_surface_sharing.c b/src/win32_surface_sharing.c new file mode 100644 index 0000000..e5d3a27 --- /dev/null +++ b/src/win32_surface_sharing.c @@ -0,0 +1,207 @@ +/************************************************************//** +* +* @file: win32_surface_sharing.c +* @author: Martin Fouilleul +* @date: 02/03/2023 +* @revision: +* +*****************************************************************/ + +#include"graphics_internal.h" + +//------------------------------------------------------------------------------------------------ +// Surface server +//------------------------------------------------------------------------------------------------ + +typedef struct mg_surface_server_data +{ + int dummy; +} mg_surface_server_data; + +mg_surface_server_data* mg_surface_server_data_from_handle(mg_surface_server handle) +{ + mg_surface_server_data* server = (mg_surface_server_data*)mg_data_from_handle(MG_HANDLE_SURFACE_SERVER, handle.h); + return(server); +} + +MP_API mg_surface_server mg_surface_server_create(void) +{ + mg_surface_server_data* server = malloc_type(mg_surface_server_data); + + //TODO + + mg_surface_server handle = (mg_surface_server){mg_handle_alloc(MG_HANDLE_SURFACE_SERVER, (void*)server)}; + return(handle); +} + +MP_API void mg_surface_server_destroy(mg_surface_server handle) +{ + mg_surface_server_data* server = mg_surface_server_data_from_handle(handle); + if(server) + { + //TODO + + free(server); + mg_handle_recycle(handle.h); + } +} + +MP_API mg_surface_connection_id mg_surface_server_start(mg_surface_server handle, mg_surface surface) +{ + mg_surface_connection_id res = 0; + + mg_surface_server_data* server = mg_surface_server_data_from_handle(handle); + if(server) + { + //NOTE: just a quick test + res = (u64)mg_surface_native_layer(surface); + } + return(res); +} + +MP_API void mg_surface_server_stop(mg_surface_server handle) +{ + mg_surface_server_data* server = mg_surface_server_data_from_handle(handle); + if(server) + { + //TODO + } +} + +//------------------------------------------------------------------------------------------------ +// Surface client +//------------------------------------------------------------------------------------------------ + +typedef struct mg_win32_surface_client +{ + mg_surface_data interface; + mp_layer layer; + +} mg_win32_surface_client; + +void mg_win32_surface_client_prepare(mg_surface_data* interface) +{} + +void mg_win32_surface_client_present(mg_surface_data* interface) +{} + +void mg_win32_surface_client_swap_interval(mg_surface_data* interface, int swap) +{ + //TODO +} + +vec2 mg_win32_surface_client_contents_scaling(mg_surface_data* interface) +{ + mg_win32_surface_client* surface = (mg_win32_surface_client*)interface; + return(mp_layer_contents_scaling(&surface->layer)); +} + +mp_rect mg_win32_surface_client_get_frame(mg_surface_data* interface) +{ + mg_win32_surface_client* surface = (mg_win32_surface_client*)interface; + return(mp_layer_get_frame(&surface->layer)); +} + +void mg_win32_surface_client_set_frame(mg_surface_data* interface, mp_rect frame) +{ + mg_win32_surface_client* surface = (mg_win32_surface_client*)interface; + mp_layer_set_frame(&surface->layer, frame); +} + +void mg_win32_surface_client_set_hidden(mg_surface_data* interface, bool hidden) +{ + mg_win32_surface_client* surface = (mg_win32_surface_client*)interface; + mp_layer_set_hidden(&surface->layer, hidden); +} + +bool mg_win32_surface_client_get_hidden(mg_surface_data* interface) +{ + mg_win32_surface_client* surface = (mg_win32_surface_client*)interface; + return(mp_layer_get_hidden(&surface->layer)); +} + +void* mg_win32_surface_client_native_layer(mg_surface_data* interface) +{ + mg_win32_surface_client* surface = (mg_win32_surface_client*)interface; + return(mp_layer_native_surface(&surface->layer)); +} + +void mg_win32_surface_client_destroy(mg_surface_data* interface) +{ + mg_win32_surface_client* surface = (mg_win32_surface_client*)interface; + + mp_layer_cleanup(&surface->layer); + //TODO... + + free(surface); +} + +mg_surface_data* mg_win32_surface_client_create_for_window(mp_window window) +{ + mg_win32_surface_client* surface = 0; + + mp_window_data* windowData = mp_window_ptr_from_handle(window); + if(windowData) + { + surface = malloc_type(mg_win32_surface_client); + if(surface) + { + mp_layer_init_for_window(&surface->layer, windowData); + + surface->interface.backend = MG_BACKEND_REMOTE; + surface->interface.destroy = mg_win32_surface_client_destroy; + surface->interface.prepare = mg_win32_surface_client_prepare; + surface->interface.present = mg_win32_surface_client_present; + surface->interface.swapInterval = mg_win32_surface_client_swap_interval; + surface->interface.contentsScaling = mg_win32_surface_client_contents_scaling; + surface->interface.getFrame = mg_win32_surface_client_get_frame; + surface->interface.setFrame = mg_win32_surface_client_set_frame; + surface->interface.getHidden = mg_win32_surface_client_get_hidden; + surface->interface.setHidden = mg_win32_surface_client_set_hidden; + surface->interface.nativeLayer = mg_win32_surface_client_native_layer; + + //TODO + } + } + return((mg_surface_data*)surface); +} + +mg_surface mg_surface_client_create_for_window(mp_window window) +{ + if(!__mgData.init) + { + mg_init(); + } + mg_surface surfaceHandle = {0}; + mg_surface_data* surface = mg_win32_surface_client_create_for_window(window); + if(surface) + { + surfaceHandle = mg_surface_handle_alloc(surface); + } + return(surfaceHandle); +} + +MP_API void mg_surface_client_connect(mg_surface handle, mg_surface_connection_id ID) +{ + mg_surface_data* interface = mg_surface_data_from_handle(handle); + if(interface && interface->backend == MG_BACKEND_REMOTE) + { + mg_win32_surface_client* surface = (mg_win32_surface_client*)interface; + + //NOTE:Quick test + + HWND parent = mp_layer_native_surface(&surface->layer); + HWND child = (HWND)ID; + + SetParent(child, parent); + } +} + +MP_API void mg_surface_client_disconnect(mg_surface handle) +{ + mg_surface_data* interface = mg_surface_data_from_handle(handle); + if(interface && interface->backend == MG_BACKEND_REMOTE) + { + //TODO + } +}