mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	Merge pull request #740 from emersion/egl-debug
render/egl: use EGL_KHR_debug
This commit is contained in:
		
						commit
						ef3769851f
					
				
					 8 changed files with 49 additions and 58 deletions
				
			
		| 
						 | 
					@ -173,7 +173,7 @@ struct wlr_backend *wlr_drm_backend_create(struct wl_display *display,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!wlr_egl_bind_display(&drm->renderer.egl, display)) {
 | 
						if (!wlr_egl_bind_display(&drm->renderer.egl, display)) {
 | 
				
			||||||
		wlr_log(L_INFO, "Failed to bind egl/wl display: %s", egl_error());
 | 
							wlr_log(L_INFO, "Failed to bind egl/wl display");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	drm->display_destroy.notify = handle_display_destroy;
 | 
						drm->display_destroy.notify = handle_display_destroy;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,7 +211,7 @@ static struct wlr_texture *get_tex_for_bo(struct wlr_drm_renderer *renderer,
 | 
				
			||||||
	tex->img = eglCreateImageKHR(renderer->egl.display, EGL_NO_CONTEXT,
 | 
						tex->img = eglCreateImageKHR(renderer->egl.display, EGL_NO_CONTEXT,
 | 
				
			||||||
		EGL_LINUX_DMA_BUF_EXT, NULL, attribs);
 | 
							EGL_LINUX_DMA_BUF_EXT, NULL, attribs);
 | 
				
			||||||
	if (!tex->img) {
 | 
						if (!tex->img) {
 | 
				
			||||||
		wlr_log(L_ERROR, "Failed to create EGL image: %s", egl_error());
 | 
							wlr_log(L_ERROR, "Failed to create EGL image");
 | 
				
			||||||
		abort();
 | 
							abort();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,7 @@ static EGLSurface egl_create_surface(struct wlr_egl *egl, unsigned int width,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	EGLSurface surf = eglCreatePbufferSurface(egl->display, egl->config, attribs);
 | 
						EGLSurface surf = eglCreatePbufferSurface(egl->display, egl->config, attribs);
 | 
				
			||||||
	if (surf == EGL_NO_SURFACE) {
 | 
						if (surf == EGL_NO_SURFACE) {
 | 
				
			||||||
		wlr_log(L_ERROR, "Failed to create EGL surface: %s", egl_error());
 | 
							wlr_log(L_ERROR, "Failed to create EGL surface");
 | 
				
			||||||
		return EGL_NO_SURFACE;
 | 
							return EGL_NO_SURFACE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return surf;
 | 
						return surf;
 | 
				
			||||||
| 
						 | 
					@ -123,7 +123,7 @@ struct wlr_output *wlr_headless_add_output(struct wlr_backend *wlr_backend,
 | 
				
			||||||
	if (!eglMakeCurrent(output->backend->egl.display,
 | 
						if (!eglMakeCurrent(output->backend->egl.display,
 | 
				
			||||||
			output->egl_surface, output->egl_surface,
 | 
								output->egl_surface, output->egl_surface,
 | 
				
			||||||
			output->backend->egl.context)) {
 | 
								output->backend->egl.context)) {
 | 
				
			||||||
		wlr_log(L_ERROR, "eglMakeCurrent failed: %s", egl_error());
 | 
							wlr_log(L_ERROR, "eglMakeCurrent failed");
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -321,7 +321,7 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *_backend) {
 | 
				
			||||||
	if (!eglMakeCurrent(output->backend->egl.display,
 | 
						if (!eglMakeCurrent(output->backend->egl.display,
 | 
				
			||||||
		output->egl_surface, output->egl_surface,
 | 
							output->egl_surface, output->egl_surface,
 | 
				
			||||||
		output->backend->egl.context)) {
 | 
							output->backend->egl.context)) {
 | 
				
			||||||
		wlr_log(L_ERROR, "eglMakeCurrent failed: %s", egl_error());
 | 
							wlr_log(L_ERROR, "eglMakeCurrent failed");
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -333,7 +333,7 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *_backend) {
 | 
				
			||||||
	wl_callback_add_listener(output->frame_callback, &frame_listener, output);
 | 
						wl_callback_add_listener(output->frame_callback, &frame_listener, output);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!eglSwapBuffers(output->backend->egl.display, output->egl_surface)) {
 | 
						if (!eglSwapBuffers(output->backend->egl.display, output->egl_surface)) {
 | 
				
			||||||
		wlr_log(L_ERROR, "eglSwapBuffers failed: %s", egl_error());
 | 
							wlr_log(L_ERROR, "eglSwapBuffers failed");
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,11 +94,6 @@ int wlr_egl_get_dmabuf_modifiers(struct wlr_egl *egl, int format,
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
bool wlr_egl_destroy_image(struct wlr_egl *egl, EGLImageKHR image);
 | 
					bool wlr_egl_destroy_image(struct wlr_egl *egl, EGLImageKHR image);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Returns a string for the last error ocurred with egl.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
const char *egl_error(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool wlr_egl_make_current(struct wlr_egl *egl, EGLSurface surface,
 | 
					bool wlr_egl_make_current(struct wlr_egl *egl, EGLSurface surface,
 | 
				
			||||||
	int *buffer_age);
 | 
						int *buffer_age);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										85
									
								
								render/egl.c
									
										
									
									
									
								
							
							
						
						
									
										85
									
								
								render/egl.c
									
										
									
									
									
								
							| 
						 | 
					@ -12,43 +12,6 @@
 | 
				
			||||||
// https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_image_base.txt.
 | 
					// https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_image_base.txt.
 | 
				
			||||||
// https://cgit.freedesktop.org/mesa/mesa/tree/docs/specs/WL_bind_wayland_display.spec
 | 
					// https://cgit.freedesktop.org/mesa/mesa/tree/docs/specs/WL_bind_wayland_display.spec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char *egl_error(void) {
 | 
					 | 
				
			||||||
	switch (eglGetError()) {
 | 
					 | 
				
			||||||
	case EGL_SUCCESS:
 | 
					 | 
				
			||||||
		return "Success";
 | 
					 | 
				
			||||||
	case EGL_NOT_INITIALIZED:
 | 
					 | 
				
			||||||
		return "Not initialized";
 | 
					 | 
				
			||||||
	case EGL_BAD_ACCESS:
 | 
					 | 
				
			||||||
		return "Bad access";
 | 
					 | 
				
			||||||
	case EGL_BAD_ALLOC:
 | 
					 | 
				
			||||||
		return "Bad alloc";
 | 
					 | 
				
			||||||
	case EGL_BAD_ATTRIBUTE:
 | 
					 | 
				
			||||||
		return "Bad attribute";
 | 
					 | 
				
			||||||
	case EGL_BAD_CONTEXT:
 | 
					 | 
				
			||||||
		return "Bad Context";
 | 
					 | 
				
			||||||
	case EGL_BAD_CONFIG:
 | 
					 | 
				
			||||||
		return "Bad Config";
 | 
					 | 
				
			||||||
	case EGL_BAD_CURRENT_SURFACE:
 | 
					 | 
				
			||||||
		return "Bad current surface";
 | 
					 | 
				
			||||||
	case EGL_BAD_DISPLAY:
 | 
					 | 
				
			||||||
		return "Bad display";
 | 
					 | 
				
			||||||
	case EGL_BAD_SURFACE:
 | 
					 | 
				
			||||||
		return "Bad surface";
 | 
					 | 
				
			||||||
	case EGL_BAD_MATCH:
 | 
					 | 
				
			||||||
		return "Bad match";
 | 
					 | 
				
			||||||
	case EGL_BAD_PARAMETER:
 | 
					 | 
				
			||||||
		return "Bad parameter";
 | 
					 | 
				
			||||||
	case EGL_BAD_NATIVE_PIXMAP:
 | 
					 | 
				
			||||||
		return "Bad native pixmap";
 | 
					 | 
				
			||||||
	case EGL_BAD_NATIVE_WINDOW:
 | 
					 | 
				
			||||||
		return "Bad native window";
 | 
					 | 
				
			||||||
	case EGL_CONTEXT_LOST:
 | 
					 | 
				
			||||||
		return "Context lost";
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return "Unknown";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static bool egl_get_config(EGLDisplay disp, EGLint *attribs, EGLConfig *out,
 | 
					static bool egl_get_config(EGLDisplay disp, EGLint *attribs, EGLConfig *out,
 | 
				
			||||||
		EGLint visual_id) {
 | 
							EGLint visual_id) {
 | 
				
			||||||
	EGLint count = 0, matched = 0, ret;
 | 
						EGLint count = 0, matched = 0, ret;
 | 
				
			||||||
| 
						 | 
					@ -84,6 +47,21 @@ static bool egl_get_config(EGLDisplay disp, EGLint *attribs, EGLConfig *out,
 | 
				
			||||||
	return false;
 | 
						return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static log_importance_t egl_log_importance_to_wlr(EGLint type) {
 | 
				
			||||||
 | 
						switch (type) {
 | 
				
			||||||
 | 
						case EGL_DEBUG_MSG_CRITICAL_KHR: return L_ERROR;
 | 
				
			||||||
 | 
						case EGL_DEBUG_MSG_ERROR_KHR:    return L_ERROR;
 | 
				
			||||||
 | 
						case EGL_DEBUG_MSG_WARN_KHR:     return L_ERROR;
 | 
				
			||||||
 | 
						case EGL_DEBUG_MSG_INFO_KHR:     return L_INFO;
 | 
				
			||||||
 | 
						default:                         return L_INFO;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void egl_log(EGLenum error, const char *command, EGLint msg_type,
 | 
				
			||||||
 | 
							EGLLabelKHR thread, EGLLabelKHR obj, const char *msg) {
 | 
				
			||||||
 | 
						_wlr_log(egl_log_importance_to_wlr(msg_type), "[EGL] %s: %s", command, msg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool check_egl_ext(const char *egl_exts, const char *ext) {
 | 
					static bool check_egl_ext(const char *egl_exts, const char *ext) {
 | 
				
			||||||
	size_t extlen = strlen(ext);
 | 
						size_t extlen = strlen(ext);
 | 
				
			||||||
	const char *end = egl_exts + strlen(egl_exts);
 | 
						const char *end = egl_exts + strlen(egl_exts);
 | 
				
			||||||
| 
						 | 
					@ -128,8 +106,19 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, void *remote_display,
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (eglDebugMessageControlKHR) {
 | 
				
			||||||
 | 
							static const EGLAttrib debug_attribs[] = {
 | 
				
			||||||
 | 
								EGL_DEBUG_MSG_CRITICAL_KHR, EGL_TRUE,
 | 
				
			||||||
 | 
								EGL_DEBUG_MSG_ERROR_KHR, EGL_TRUE,
 | 
				
			||||||
 | 
								EGL_DEBUG_MSG_WARN_KHR, EGL_TRUE,
 | 
				
			||||||
 | 
								EGL_DEBUG_MSG_INFO_KHR, EGL_TRUE,
 | 
				
			||||||
 | 
								EGL_NONE,
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							eglDebugMessageControlKHR(egl_log, debug_attribs);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE) {
 | 
						if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE) {
 | 
				
			||||||
		wlr_log(L_ERROR, "Failed to bind to the OpenGL ES API: %s", egl_error());
 | 
							wlr_log(L_ERROR, "Failed to bind to the OpenGL ES API");
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -140,13 +129,13 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, void *remote_display,
 | 
				
			||||||
		egl->display = eglGetPlatformDisplayEXT(platform, remote_display, NULL);
 | 
							egl->display = eglGetPlatformDisplayEXT(platform, remote_display, NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (egl->display == EGL_NO_DISPLAY) {
 | 
						if (egl->display == EGL_NO_DISPLAY) {
 | 
				
			||||||
		wlr_log(L_ERROR, "Failed to create EGL display: %s", egl_error());
 | 
							wlr_log(L_ERROR, "Failed to create EGL display");
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	EGLint major, minor;
 | 
						EGLint major, minor;
 | 
				
			||||||
	if (eglInitialize(egl->display, &major, &minor) == EGL_FALSE) {
 | 
						if (eglInitialize(egl->display, &major, &minor) == EGL_FALSE) {
 | 
				
			||||||
		wlr_log(L_ERROR, "Failed to initialize EGL: %s", egl_error());
 | 
							wlr_log(L_ERROR, "Failed to initialize EGL");
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -161,7 +150,7 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, void *remote_display,
 | 
				
			||||||
		EGL_NO_CONTEXT, attribs);
 | 
							EGL_NO_CONTEXT, attribs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (egl->context == EGL_NO_CONTEXT) {
 | 
						if (egl->context == EGL_NO_CONTEXT) {
 | 
				
			||||||
		wlr_log(L_ERROR, "Failed to create EGL context: %s", egl_error());
 | 
							wlr_log(L_ERROR, "Failed to create EGL context");
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -199,12 +188,18 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, void *remote_display,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
error:
 | 
					error:
 | 
				
			||||||
	eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
 | 
						eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
 | 
				
			||||||
 | 
						if (egl->display) {
 | 
				
			||||||
		eglTerminate(egl->display);
 | 
							eglTerminate(egl->display);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	eglReleaseThread();
 | 
						eglReleaseThread();
 | 
				
			||||||
	return false;
 | 
						return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wlr_egl_finish(struct wlr_egl *egl) {
 | 
					void wlr_egl_finish(struct wlr_egl *egl) {
 | 
				
			||||||
 | 
						if (egl == NULL) {
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
 | 
						eglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
 | 
				
			||||||
	if (egl->wl_display && eglUnbindWaylandDisplayWL) {
 | 
						if (egl->wl_display && eglUnbindWaylandDisplayWL) {
 | 
				
			||||||
		eglUnbindWaylandDisplayWL(egl->display, egl->wl_display);
 | 
							eglUnbindWaylandDisplayWL(egl->display, egl->wl_display);
 | 
				
			||||||
| 
						 | 
					@ -259,7 +254,7 @@ EGLSurface wlr_egl_create_surface(struct wlr_egl *egl, void *window) {
 | 
				
			||||||
	EGLSurface surf = eglCreatePlatformWindowSurfaceEXT(egl->display, egl->config,
 | 
						EGLSurface surf = eglCreatePlatformWindowSurfaceEXT(egl->display, egl->config,
 | 
				
			||||||
		window, NULL);
 | 
							window, NULL);
 | 
				
			||||||
	if (surf == EGL_NO_SURFACE) {
 | 
						if (surf == EGL_NO_SURFACE) {
 | 
				
			||||||
		wlr_log(L_ERROR, "Failed to create EGL surface: %s", egl_error());
 | 
							wlr_log(L_ERROR, "Failed to create EGL surface");
 | 
				
			||||||
		return EGL_NO_SURFACE;
 | 
							return EGL_NO_SURFACE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return surf;
 | 
						return surf;
 | 
				
			||||||
| 
						 | 
					@ -274,7 +269,7 @@ int wlr_egl_get_buffer_age(struct wlr_egl *egl, EGLSurface surface) {
 | 
				
			||||||
	EGLBoolean ok = eglQuerySurface(egl->display, surface,
 | 
						EGLBoolean ok = eglQuerySurface(egl->display, surface,
 | 
				
			||||||
		EGL_BUFFER_AGE_EXT, &buffer_age);
 | 
							EGL_BUFFER_AGE_EXT, &buffer_age);
 | 
				
			||||||
	if (!ok) {
 | 
						if (!ok) {
 | 
				
			||||||
		wlr_log(L_ERROR, "Failed to get EGL surface buffer age: %s", egl_error());
 | 
							wlr_log(L_ERROR, "Failed to get EGL surface buffer age");
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -284,7 +279,7 @@ int wlr_egl_get_buffer_age(struct wlr_egl *egl, EGLSurface surface) {
 | 
				
			||||||
bool wlr_egl_make_current(struct wlr_egl *egl, EGLSurface surface,
 | 
					bool wlr_egl_make_current(struct wlr_egl *egl, EGLSurface surface,
 | 
				
			||||||
		int *buffer_age) {
 | 
							int *buffer_age) {
 | 
				
			||||||
	if (!eglMakeCurrent(egl->display, surface, surface, egl->context)) {
 | 
						if (!eglMakeCurrent(egl->display, surface, surface, egl->context)) {
 | 
				
			||||||
		wlr_log(L_ERROR, "eglMakeCurrent failed: %s", egl_error());
 | 
							wlr_log(L_ERROR, "eglMakeCurrent failed");
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -322,7 +317,7 @@ bool wlr_egl_swap_buffers(struct wlr_egl *egl, EGLSurface surface,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!ret) {
 | 
						if (!ret) {
 | 
				
			||||||
		wlr_log(L_ERROR, "eglSwapBuffers failed: %s", egl_error());
 | 
							wlr_log(L_ERROR, "eglSwapBuffers failed");
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,3 +10,4 @@ eglCreatePlatformWindowSurfaceEXT
 | 
				
			||||||
-eglSwapBuffersWithDamageKHR
 | 
					-eglSwapBuffersWithDamageKHR
 | 
				
			||||||
-eglQueryDmaBufFormatsEXT
 | 
					-eglQueryDmaBufFormatsEXT
 | 
				
			||||||
-eglQueryDmaBufModifiersEXT
 | 
					-eglQueryDmaBufModifiersEXT
 | 
				
			||||||
 | 
					-eglDebugMessageControlKHR
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -198,7 +198,7 @@ static bool gles2_texture_upload_drm(struct wlr_texture *_tex,
 | 
				
			||||||
	tex->image = wlr_egl_create_image(tex->egl, EGL_WAYLAND_BUFFER_WL,
 | 
						tex->image = wlr_egl_create_image(tex->egl, EGL_WAYLAND_BUFFER_WL,
 | 
				
			||||||
		(EGLClientBuffer*) buf, attribs);
 | 
							(EGLClientBuffer*) buf, attribs);
 | 
				
			||||||
	if (!tex->image) {
 | 
						if (!tex->image) {
 | 
				
			||||||
		wlr_log(L_ERROR, "failed to create egl image: %s", egl_error());
 | 
							wlr_log(L_ERROR, "failed to create EGL image");
 | 
				
			||||||
 		return false;
 | 
					 		return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue