[surface sharing] first draft for win32 using window reparenting
This commit is contained in:
		
							parent
							
								
									2560ddd5b4
								
							
						
					
					
						commit
						e58ae3ef52
					
				| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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__
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
*
 | 
			
		||||
*	@file: osx_surface_sharing.m
 | 
			
		||||
*	@author: Martin Fouilleul
 | 
			
		||||
*	@date: 19/08/2022
 | 
			
		||||
*	@date: 01/03/2023
 | 
			
		||||
*	@revision:
 | 
			
		||||
*
 | 
			
		||||
*****************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue