mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	render/egl: add support for EGL_KHR_display_reference
See the spec at [1]. tl;dr EGL has terrible defaults: eglTerminate() may have side-effects on completely unrelated EGLDisplay objects. This extension allows us to opt-in to get the sane behavior: eglTerminate() only free's our own EGLDisplay without affecting others. [1]: https://registry.khronos.org/EGL/extensions/KHR/EGL_KHR_display_reference.txt
This commit is contained in:
		
							parent
							
								
									2ad25b1460
								
							
						
					
					
						commit
						5206cea566
					
				
					 2 changed files with 15 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -24,6 +24,7 @@ struct wlr_egl {
 | 
			
		|||
		bool EXT_device_query;
 | 
			
		||||
		bool KHR_platform_gbm;
 | 
			
		||||
		bool EXT_platform_device;
 | 
			
		||||
		bool KHR_display_reference;
 | 
			
		||||
	} exts;
 | 
			
		||||
 | 
			
		||||
	struct {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								render/egl.c
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								render/egl.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -207,9 +207,10 @@ static struct wlr_egl *egl_create(void) {
 | 
			
		|||
 | 
			
		||||
	egl->exts.KHR_platform_gbm = check_egl_ext(client_exts_str,
 | 
			
		||||
			"EGL_KHR_platform_gbm");
 | 
			
		||||
 | 
			
		||||
	egl->exts.EXT_platform_device = check_egl_ext(client_exts_str,
 | 
			
		||||
			"EGL_EXT_platform_device");
 | 
			
		||||
	egl->exts.KHR_display_reference = check_egl_ext(client_exts_str,
 | 
			
		||||
			"EGL_KHR_display_reference");
 | 
			
		||||
 | 
			
		||||
	if (check_egl_ext(client_exts_str, "EGL_EXT_device_base") || check_egl_ext(client_exts_str, "EGL_EXT_device_enumeration")) {
 | 
			
		||||
		load_egl_proc(&egl->procs.eglQueryDevicesEXT, "eglQueryDevicesEXT");
 | 
			
		||||
| 
						 | 
				
			
			@ -351,8 +352,19 @@ static bool egl_init_display(struct wlr_egl *egl, EGLDisplay display) {
 | 
			
		|||
 | 
			
		||||
static bool egl_init(struct wlr_egl *egl, EGLenum platform,
 | 
			
		||||
		void *remote_display) {
 | 
			
		||||
	EGLint display_attribs[3] = {0};
 | 
			
		||||
	size_t display_attribs_len = 0;
 | 
			
		||||
 | 
			
		||||
	if (egl->exts.KHR_display_reference) {
 | 
			
		||||
		display_attribs[display_attribs_len++] = EGL_TRACK_REFERENCES_KHR;
 | 
			
		||||
		display_attribs[display_attribs_len++] = EGL_TRUE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	display_attribs[display_attribs_len++] = EGL_NONE;
 | 
			
		||||
	assert(display_attribs_len < sizeof(display_attribs) / sizeof(display_attribs[0]));
 | 
			
		||||
 | 
			
		||||
	EGLDisplay display = egl->procs.eglGetPlatformDisplayEXT(platform,
 | 
			
		||||
		remote_display, NULL);
 | 
			
		||||
		remote_display, display_attribs);
 | 
			
		||||
	if (display == EGL_NO_DISPLAY) {
 | 
			
		||||
		wlr_log(WLR_ERROR, "Failed to create EGL display");
 | 
			
		||||
		return false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue