mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	render/egl: add support for EGL_EXT_device_drm_render_node
This EGL extension has been added in [1]. The upsides are: - We directly get a render node, instead of having to convert the primary node name to a render node name. - If EGL_DRM_RENDER_NODE_FILE_EXT returns NULL, that means there is no render node being used by the driver. [1]: https://github.com/KhronosGroup/EGL-Registry/pull/127
This commit is contained in:
		
							parent
							
								
									ace2eda073
								
							
						
					
					
						commit
						3cf2535c23
					
				
					 2 changed files with 30 additions and 11 deletions
				
			
		| 
						 | 
					@ -43,6 +43,7 @@ struct wlr_egl {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Device extensions
 | 
							// Device extensions
 | 
				
			||||||
		bool EXT_device_drm;
 | 
							bool EXT_device_drm;
 | 
				
			||||||
 | 
							bool EXT_device_drm_render_node;
 | 
				
			||||||
	} exts;
 | 
						} exts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										40
									
								
								render/egl.c
									
										
									
									
									
								
							
							
						
						
									
										40
									
								
								render/egl.c
									
										
									
									
									
								
							| 
						 | 
					@ -289,6 +289,8 @@ struct wlr_egl *wlr_egl_create_with_drm_fd(int drm_fd) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		egl->exts.EXT_device_drm =
 | 
							egl->exts.EXT_device_drm =
 | 
				
			||||||
			check_egl_ext(device_exts_str, "EGL_EXT_device_drm");
 | 
								check_egl_ext(device_exts_str, "EGL_EXT_device_drm");
 | 
				
			||||||
 | 
							egl->exts.EXT_device_drm_render_node =
 | 
				
			||||||
 | 
								check_egl_ext(device_exts_str, "EGL_EXT_device_drm_render_node");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!check_egl_ext(display_exts_str, "EGL_KHR_no_config_context") &&
 | 
						if (!check_egl_ext(display_exts_str, "EGL_KHR_no_config_context") &&
 | 
				
			||||||
| 
						 | 
					@ -712,23 +714,39 @@ static char *get_render_name(const char *name) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int wlr_egl_dup_drm_fd(struct wlr_egl *egl) {
 | 
					int wlr_egl_dup_drm_fd(struct wlr_egl *egl) {
 | 
				
			||||||
	if (egl->device == EGL_NO_DEVICE_EXT || !egl->exts.EXT_device_drm) {
 | 
						if (egl->device == EGL_NO_DEVICE_EXT || (!egl->exts.EXT_device_drm &&
 | 
				
			||||||
 | 
								!egl->exts.EXT_device_drm_render_node)) {
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const char *primary_name = egl->procs.eglQueryDeviceStringEXT(egl->device,
 | 
						char *render_name = NULL;
 | 
				
			||||||
		EGL_DRM_DEVICE_FILE_EXT);
 | 
					#ifdef EGL_EXT_device_drm_render_node
 | 
				
			||||||
	if (primary_name == NULL) {
 | 
						if (egl->exts.device_drm_render_node_ext) {
 | 
				
			||||||
		wlr_log(WLR_ERROR,
 | 
							const char *name = egl->procs.eglQueryDeviceStringEXT(egl->device,
 | 
				
			||||||
			"eglQueryDeviceStringEXT(EGL_DRM_DEVICE_FILE_EXT) failed");
 | 
								EGL_DRM_RENDER_NODE_FILE_EXT);
 | 
				
			||||||
		return -1;
 | 
							if (name == NULL) {
 | 
				
			||||||
 | 
								wlr_log(WLR_DEBUG, "EGL device has no render node");
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							render_name = strdup(name);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	char *render_name = get_render_name(primary_name);
 | 
					 | 
				
			||||||
	if (render_name == NULL) {
 | 
						if (render_name == NULL) {
 | 
				
			||||||
		wlr_log(WLR_ERROR, "Can't find render node name for device %s",
 | 
							const char *primary_name = egl->procs.eglQueryDeviceStringEXT(egl->device,
 | 
				
			||||||
			primary_name);
 | 
								EGL_DRM_DEVICE_FILE_EXT);
 | 
				
			||||||
		return -1;
 | 
							if (primary_name == NULL) {
 | 
				
			||||||
 | 
								wlr_log(WLR_ERROR,
 | 
				
			||||||
 | 
									"eglQueryDeviceStringEXT(EGL_DRM_DEVICE_FILE_EXT) failed");
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							render_name = get_render_name(primary_name);
 | 
				
			||||||
 | 
							if (render_name == NULL) {
 | 
				
			||||||
 | 
								wlr_log(WLR_ERROR, "Can't find render node name for device %s",
 | 
				
			||||||
 | 
									primary_name);
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int render_fd = open(render_name, O_RDWR | O_NONBLOCK | O_CLOEXEC);
 | 
						int render_fd = open(render_name, O_RDWR | O_NONBLOCK | O_CLOEXEC);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue