diff options
Diffstat (limited to 'render')
| -rw-r--r-- | render/egl.c | 40 | ||||
| -rw-r--r-- | render/gles2/texture.c | 49 | 
2 files changed, 49 insertions, 40 deletions
diff --git a/render/egl.c b/render/egl.c index 3c005b24..a424e8e9 100644 --- a/render/egl.c +++ b/render/egl.c @@ -93,7 +93,8 @@ static void print_dmabuf_formats(struct wlr_egl *egl) {  	char str_formats[num * 5 + 1];  	for (int i = 0; i < num; i++) { -		snprintf(&str_formats[i*5], (num - i) * 5 + 1, "%.4s ", (char*)&formats[i]); +		snprintf(&str_formats[i*5], (num - i) * 5 + 1, "%.4s ", +			(char*)&formats[i]);  	}  	wlr_log(L_DEBUG, "Supported dmabuf buffer formats: %s", str_formats);  	free(formats); @@ -230,8 +231,9 @@ bool wlr_egl_destroy_image(struct wlr_egl *egl, EGLImage image) {  }  EGLSurface wlr_egl_create_surface(struct wlr_egl *egl, void *window) { -	EGLSurface surf = eglCreatePlatformWindowSurfaceEXT(egl->display, egl->config, -		window, NULL); +	assert(eglCreatePlatformWindowSurfaceEXT); +	EGLSurface surf = eglCreatePlatformWindowSurfaceEXT(egl->display, +		egl->config, window, NULL);  	if (surf == EGL_NO_SURFACE) {  		wlr_log(L_ERROR, "Failed to create EGL surface");  		return EGL_NO_SURFACE; @@ -302,7 +304,37 @@ bool wlr_egl_swap_buffers(struct wlr_egl *egl, EGLSurface surface,  	return true;  } -EGLImage wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl, +EGLImageKHR wlr_egl_create_image_from_wl_drm(struct wlr_egl *egl, +		struct wl_resource *data, EGLint *fmt, int *width, int *height, +		bool *inverted_y) { +	if (!eglQueryWaylandBufferWL || !eglCreateImageKHR) { +		return NULL; +	} + +	if (!eglQueryWaylandBufferWL(egl->display, data, EGL_TEXTURE_FORMAT, fmt)) { +		return NULL; +	} + +	eglQueryWaylandBufferWL(egl->display, data, EGL_WIDTH, width); +	eglQueryWaylandBufferWL(egl->display, data, EGL_HEIGHT, height); + +	EGLint _inverted_y; +	if (eglQueryWaylandBufferWL(egl->display, data, EGL_WAYLAND_Y_INVERTED_WL, +			&_inverted_y)) { +		*inverted_y = !!_inverted_y; +	} else { +		*inverted_y = false; +	} + +	const EGLint attribs[] = { +		EGL_WAYLAND_PLANE_WL, 0, +		EGL_NONE, +	}; +	return eglCreateImageKHR(egl->display, egl->context, EGL_WAYLAND_BUFFER_WL, +		data, attribs); +} + +EGLImageKHR wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl,  		struct wlr_dmabuf_buffer_attribs *attributes) {  	bool has_modifier = false;  	if (attributes->modifier[0] != DRM_FORMAT_MOD_INVALID) { diff --git a/render/gles2/texture.c b/render/gles2/texture.c index 82effd71..e4936d71 100644 --- a/render/gles2/texture.c +++ b/render/gles2/texture.c @@ -90,7 +90,7 @@ static void gles2_texture_destroy(struct wlr_texture *wlr_texture) {  	}  	if (texture->image) {  		assert(eglDestroyImageKHR); -		eglDestroyImageKHR(texture->renderer->egl->display, texture->image); +		wlr_egl_destroy_image(texture->renderer->egl, texture->image);  	}  	if (texture->type == WLR_GLES2_TEXTURE_GLTEX) { @@ -144,34 +144,17 @@ struct wlr_texture *gles2_texture_from_pixels(struct wlr_renderer *wlr_renderer,  	glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, 0);  	GLES2_DEBUG_POP; -	return (struct wlr_texture *)texture; +	return &texture->wlr_texture;  }  struct wlr_texture *gles2_texture_from_wl_drm(struct wlr_renderer *wlr_renderer,  		struct wl_resource *data) {  	struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer); -	if (!eglQueryWaylandBufferWL || !eglCreateImageKHR || -			!glEGLImageTargetTexture2DOES) { -		return NULL; -	} - -	EGLint fmt; -	if (!eglQueryWaylandBufferWL(renderer->egl->display, data, -			EGL_TEXTURE_FORMAT, &fmt)) { +	if (!glEGLImageTargetTexture2DOES) {  		return NULL;  	} -	EGLint width, height; -	eglQueryWaylandBufferWL(renderer->egl->display, data, EGL_WIDTH, &width); -	eglQueryWaylandBufferWL(renderer->egl->display, data, EGL_HEIGHT, &height); - -	EGLint inverted_y; -	if (!eglQueryWaylandBufferWL(renderer->egl->display, data, -			EGL_WAYLAND_Y_INVERTED_WL, &inverted_y)) { -		inverted_y = 0; -	} -  	struct wlr_gles2_texture *texture =  		calloc(1, sizeof(struct wlr_gles2_texture));  	if (texture == NULL) { @@ -180,10 +163,15 @@ struct wlr_texture *gles2_texture_from_wl_drm(struct wlr_renderer *wlr_renderer,  	}  	wlr_texture_init(&texture->wlr_texture, &texture_impl);  	texture->renderer = renderer; -	texture->width = width; -	texture->height = height;  	texture->wl_drm = data; -	texture->inverted_y = !!inverted_y; + +	EGLint fmt; +	texture->image = wlr_egl_create_image_from_wl_drm(renderer->egl, data, &fmt, +		&texture->width, &texture->height, &texture->inverted_y); +	if (texture->image == NULL) { +		free(texture); +		return NULL; +	}  	GLenum target;  	switch (fmt) { @@ -204,17 +192,6 @@ struct wlr_texture *gles2_texture_from_wl_drm(struct wlr_renderer *wlr_renderer,  		return NULL;  	} -	EGLint attribs[] = { -		EGL_WAYLAND_PLANE_WL, 0, -		EGL_NONE, -	}; -	texture->image = eglCreateImageKHR(renderer->egl->display, -		renderer->egl->context, EGL_WAYLAND_BUFFER_WL, data, attribs); -	if (texture->image == NULL) { -		free(texture); -		return NULL; -	} -  	GLES2_DEBUG_PUSH;  	glGenTextures(1, &texture->image_tex); @@ -222,7 +199,7 @@ struct wlr_texture *gles2_texture_from_wl_drm(struct wlr_renderer *wlr_renderer,  	glEGLImageTargetTexture2DOES(target, texture->image);  	GLES2_DEBUG_POP; -	return (struct wlr_texture *)texture; +	return &texture->wlr_texture;  }  struct wlr_texture *gles2_texture_from_dmabuf(struct wlr_renderer *wlr_renderer, @@ -267,5 +244,5 @@ struct wlr_texture *gles2_texture_from_dmabuf(struct wlr_renderer *wlr_renderer,  	glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, texture->image);  	GLES2_DEBUG_POP; -	return (struct wlr_texture *)texture; +	return &texture->wlr_texture;  }  | 
