mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	When no DRM present, clients (window.c actually) now either exit orderly,
or if that check is removed - crash (unsurprisingly). This patch relieves this assumption, and allow some clients (terminal, image, flower) to run in a non-DRM environment
This commit is contained in:
		
							parent
							
								
									f8fc08f771
								
							
						
					
					
						commit
						45568f6e33
					
				
					 1 changed files with 71 additions and 61 deletions
				
			
		
							
								
								
									
										132
									
								
								clients/window.c
									
										
									
									
									
								
							
							
						
						
									
										132
									
								
								clients/window.c
									
										
									
									
									
								
							| 
						 | 
					@ -453,10 +453,11 @@ display_create_surface(struct display *display,
 | 
				
			||||||
		       struct rectangle *rectangle)
 | 
							       struct rectangle *rectangle)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef HAVE_CAIRO_GL
 | 
					#ifdef HAVE_CAIRO_GL
 | 
				
			||||||
	return display_create_drm_surface(display, rectangle);
 | 
						if (display->drm) {
 | 
				
			||||||
#else
 | 
							return display_create_drm_surface(display, rectangle);
 | 
				
			||||||
	return display_create_shm_surface(display, rectangle);
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
						return display_create_shm_surface(display, rectangle);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static cairo_surface_t *
 | 
					static cairo_surface_t *
 | 
				
			||||||
| 
						 | 
					@ -465,13 +466,13 @@ display_create_surface_from_file(struct display *display,
 | 
				
			||||||
				 struct rectangle *rectangle)
 | 
									 struct rectangle *rectangle)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef HAVE_CAIRO_GL
 | 
					#ifdef HAVE_CAIRO_GL
 | 
				
			||||||
	return display_create_drm_surface_from_file(display, filename, rectangle);
 | 
						if (display->drm) {
 | 
				
			||||||
#else
 | 
							return display_create_drm_surface_from_file(display, filename, rectangle);
 | 
				
			||||||
	return display_create_shm_surface_from_file(display, filename, rectangle);
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
						return display_create_shm_surface_from_file(display, filename, rectangle);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 static const struct {
 | 
				
			||||||
static const struct {
 | 
					 | 
				
			||||||
	const char *filename;
 | 
						const char *filename;
 | 
				
			||||||
	int hotspot_x, hotspot_y;
 | 
						int hotspot_x, hotspot_y;
 | 
				
			||||||
} pointer_images[] = {
 | 
					} pointer_images[] = {
 | 
				
			||||||
| 
						 | 
					@ -1231,11 +1232,10 @@ window_create(struct display *display, const char *title,
 | 
				
			||||||
	window->margin = 16;
 | 
						window->margin = 16;
 | 
				
			||||||
	window->decoration = 1;
 | 
						window->decoration = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_CAIRO_GL
 | 
						if (display->drm)
 | 
				
			||||||
	window->buffer_type = WINDOW_BUFFER_TYPE_DRM;
 | 
							window->buffer_type = WINDOW_BUFFER_TYPE_DRM;
 | 
				
			||||||
#else
 | 
						else
 | 
				
			||||||
	window->buffer_type = WINDOW_BUFFER_TYPE_SHM;
 | 
							window->buffer_type = WINDOW_BUFFER_TYPE_SHM;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wl_surface_set_user_data(window->surface, window);
 | 
						wl_surface_set_user_data(window->surface, window);
 | 
				
			||||||
	wl_list_insert(display->window_list.prev, &window->link);
 | 
						wl_list_insert(display->window_list.prev, &window->link);
 | 
				
			||||||
| 
						 | 
					@ -1389,16 +1389,70 @@ init_xkb(struct display *d)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					init_drm(struct display *d)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						EGLint major, minor;
 | 
				
			||||||
 | 
						int fd;
 | 
				
			||||||
 | 
						drm_magic_t magic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fd = open(d->device_name, O_RDWR);
 | 
				
			||||||
 | 
						if (fd < 0) {
 | 
				
			||||||
 | 
							fprintf(stderr, "drm open failed: %m\n");
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (drmGetMagic(fd, &magic)) {
 | 
				
			||||||
 | 
							fprintf(stderr, "DRI2: failed to get drm magic");
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Wait for authenticated event */
 | 
				
			||||||
 | 
						wl_drm_authenticate(d->drm, magic);
 | 
				
			||||||
 | 
						wl_display_iterate(d->display, WL_DISPLAY_WRITABLE);
 | 
				
			||||||
 | 
						while (!d->authenticated)
 | 
				
			||||||
 | 
							wl_display_iterate(d->display, WL_DISPLAY_READABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						d->dpy = eglGetDRMDisplayMESA(fd);
 | 
				
			||||||
 | 
						if (!eglInitialize(d->dpy, &major, &minor)) {
 | 
				
			||||||
 | 
							fprintf(stderr, "failed to initialize display\n");
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!eglBindAPI(EGL_OPENGL_API)) {
 | 
				
			||||||
 | 
							fprintf(stderr, "failed to bind api EGL_OPENGL_API\n");
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						d->ctx = eglCreateContext(d->dpy, NULL, EGL_NO_CONTEXT, NULL);
 | 
				
			||||||
 | 
						if (d->ctx == NULL) {
 | 
				
			||||||
 | 
							fprintf(stderr, "failed to create context\n");
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!eglMakeCurrent(d->dpy, NULL, NULL, d->ctx)) {
 | 
				
			||||||
 | 
							fprintf(stderr, "faile to make context current\n");
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HAVE_CAIRO_GL
 | 
				
			||||||
 | 
						d->device = cairo_egl_device_create(d->dpy, d->ctx);
 | 
				
			||||||
 | 
						if (d->device == NULL) {
 | 
				
			||||||
 | 
							fprintf(stderr, "failed to get cairo drm device\n");
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct display *
 | 
					struct display *
 | 
				
			||||||
display_create(int *argc, char **argv[], const GOptionEntry *option_entries)
 | 
					display_create(int *argc, char **argv[], const GOptionEntry *option_entries)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct display *d;
 | 
						struct display *d;
 | 
				
			||||||
	EGLint major, minor;
 | 
					 | 
				
			||||||
	int fd;
 | 
					 | 
				
			||||||
	GOptionContext *context;
 | 
						GOptionContext *context;
 | 
				
			||||||
	GOptionGroup *xkb_option_group;
 | 
						GOptionGroup *xkb_option_group;
 | 
				
			||||||
	GError *error;
 | 
						GError *error;
 | 
				
			||||||
	drm_magic_t magic;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	g_type_init();
 | 
						g_type_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1438,52 +1492,8 @@ display_create(int *argc, char **argv[], const GOptionEntry *option_entries)
 | 
				
			||||||
	/* Process connection events. */
 | 
						/* Process connection events. */
 | 
				
			||||||
	wl_display_iterate(d->display, WL_DISPLAY_READABLE);
 | 
						wl_display_iterate(d->display, WL_DISPLAY_READABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fd = open(d->device_name, O_RDWR);
 | 
						if (d->device_name && init_drm(d) < 0)
 | 
				
			||||||
	if (fd < 0) {
 | 
					 | 
				
			||||||
		fprintf(stderr, "drm open failed: %m\n");
 | 
					 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (drmGetMagic(fd, &magic)) {
 | 
					 | 
				
			||||||
		fprintf(stderr, "DRI2: failed to get drm magic");
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Wait for authenticated event */
 | 
					 | 
				
			||||||
	wl_drm_authenticate(d->drm, magic);
 | 
					 | 
				
			||||||
	wl_display_iterate(d->display, WL_DISPLAY_WRITABLE);
 | 
					 | 
				
			||||||
	while (!d->authenticated)
 | 
					 | 
				
			||||||
		wl_display_iterate(d->display, WL_DISPLAY_READABLE);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	d->dpy = eglGetDRMDisplayMESA(fd);
 | 
					 | 
				
			||||||
	if (!eglInitialize(d->dpy, &major, &minor)) {
 | 
					 | 
				
			||||||
		fprintf(stderr, "failed to initialize display\n");
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!eglBindAPI(EGL_OPENGL_API)) {
 | 
					 | 
				
			||||||
		fprintf(stderr, "failed to bind api EGL_OPENGL_API\n");
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	d->ctx = eglCreateContext(d->dpy, NULL, EGL_NO_CONTEXT, NULL);
 | 
					 | 
				
			||||||
	if (d->ctx == NULL) {
 | 
					 | 
				
			||||||
		fprintf(stderr, "failed to create context\n");
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!eglMakeCurrent(d->dpy, NULL, NULL, d->ctx)) {
 | 
					 | 
				
			||||||
		fprintf(stderr, "faile to make context current\n");
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef HAVE_CAIRO_GL
 | 
					 | 
				
			||||||
	d->device = cairo_egl_device_create(d->dpy, d->ctx);
 | 
					 | 
				
			||||||
	if (d->device == NULL) {
 | 
					 | 
				
			||||||
		fprintf(stderr, "failed to get cairo drm device\n");
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	create_pointer_surfaces(d);
 | 
						create_pointer_surfaces(d);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue