mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	Untie wlr_gles2_renderer and wlr_gles2_texture
This commit is contained in:
		
							parent
							
								
									0c7968d093
								
							
						
					
					
						commit
						f3f61bed3e
					
				
					 6 changed files with 60 additions and 33 deletions
				
			
		| 
						 | 
					@ -10,6 +10,7 @@
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <wlr/backend.h>
 | 
					#include <wlr/backend.h>
 | 
				
			||||||
#include <wlr/render/egl.h>
 | 
					#include <wlr/render/egl.h>
 | 
				
			||||||
 | 
					#include <wlr/render/gles2.h>
 | 
				
			||||||
#include <wlr/render/interface.h>
 | 
					#include <wlr/render/interface.h>
 | 
				
			||||||
#include <wlr/render/wlr_renderer.h>
 | 
					#include <wlr/render/wlr_renderer.h>
 | 
				
			||||||
#include <wlr/render/wlr_texture.h>
 | 
					#include <wlr/render/wlr_texture.h>
 | 
				
			||||||
| 
						 | 
					@ -49,7 +50,7 @@ enum wlr_gles2_texture_type {
 | 
				
			||||||
struct wlr_gles2_texture {
 | 
					struct wlr_gles2_texture {
 | 
				
			||||||
	struct wlr_texture wlr_texture;
 | 
						struct wlr_texture wlr_texture;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct wlr_gles2_renderer *renderer;
 | 
						struct wlr_egl *egl;
 | 
				
			||||||
	enum wlr_gles2_texture_type type;
 | 
						enum wlr_gles2_texture_type type;
 | 
				
			||||||
	int width, height;
 | 
						int width, height;
 | 
				
			||||||
	bool has_alpha;
 | 
						bool has_alpha;
 | 
				
			||||||
| 
						 | 
					@ -68,20 +69,8 @@ struct wlr_gles2_texture {
 | 
				
			||||||
const struct gles2_pixel_format *gles2_format_from_wl(enum wl_shm_format fmt);
 | 
					const struct gles2_pixel_format *gles2_format_from_wl(enum wl_shm_format fmt);
 | 
				
			||||||
const enum wl_shm_format *gles2_formats(size_t *len);
 | 
					const enum wl_shm_format *gles2_formats(size_t *len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_gles2_renderer *gles2_get_renderer(
 | 
					 | 
				
			||||||
	struct wlr_renderer *wlr_renderer);
 | 
					 | 
				
			||||||
struct wlr_gles2_renderer *gles2_get_renderer_in_context(
 | 
					 | 
				
			||||||
	struct wlr_renderer *wlr_renderer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct wlr_gles2_texture *gles2_get_texture_in_context(
 | 
					struct wlr_gles2_texture *gles2_get_texture_in_context(
 | 
				
			||||||
	struct wlr_texture *wlr_texture);
 | 
						struct wlr_texture *wlr_texture);
 | 
				
			||||||
struct wlr_texture *gles2_texture_from_pixels(struct wlr_renderer *wlr_renderer,
 | 
					 | 
				
			||||||
	enum wl_shm_format wl_fmt, uint32_t stride, uint32_t width, uint32_t height,
 | 
					 | 
				
			||||||
	const void *data);
 | 
					 | 
				
			||||||
struct wlr_texture *gles2_texture_from_wl_drm(struct wlr_renderer *wlr_renderer,
 | 
					 | 
				
			||||||
	struct wl_resource *data);
 | 
					 | 
				
			||||||
struct wlr_texture *gles2_texture_from_dmabuf(struct wlr_renderer *wlr_renderer,
 | 
					 | 
				
			||||||
	struct wlr_dmabuf_buffer_attribs *attribs);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void gles2_push_marker(const char *file, const char *func);
 | 
					void gles2_push_marker(const char *file, const char *func);
 | 
				
			||||||
void gles2_pop_marker(void);
 | 
					void gles2_pop_marker(void);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -93,6 +93,8 @@ bool wlr_egl_destroy_image(struct wlr_egl *egl, EGLImageKHR image);
 | 
				
			||||||
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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wlr_egl_is_current(struct wlr_egl *egl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool wlr_egl_swap_buffers(struct wlr_egl *egl, EGLSurface surface,
 | 
					bool wlr_egl_swap_buffers(struct wlr_egl *egl, EGLSurface surface,
 | 
				
			||||||
	pixman_region32_t *damage);
 | 
						pixman_region32_t *damage);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,4 +8,12 @@ struct wlr_egl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl);
 | 
					struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct wlr_texture *wlr_gles2_texture_from_pixels(struct wlr_egl *egl,
 | 
				
			||||||
 | 
						enum wl_shm_format wl_fmt, uint32_t stride, uint32_t width, uint32_t height,
 | 
				
			||||||
 | 
						const void *data);
 | 
				
			||||||
 | 
					struct wlr_texture *wlr_gles2_texture_from_wl_drm(struct wlr_egl *egl,
 | 
				
			||||||
 | 
						struct wl_resource *data);
 | 
				
			||||||
 | 
					struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl,
 | 
				
			||||||
 | 
						struct wlr_dmabuf_buffer_attribs *attribs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -270,6 +270,10 @@ bool wlr_egl_make_current(struct wlr_egl *egl, EGLSurface surface,
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wlr_egl_is_current(struct wlr_egl *egl) {
 | 
				
			||||||
 | 
						return eglGetCurrentContext() == egl->context;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool wlr_egl_swap_buffers(struct wlr_egl *egl, EGLSurface surface,
 | 
					bool wlr_egl_swap_buffers(struct wlr_egl *egl, EGLSurface surface,
 | 
				
			||||||
		pixman_region32_t *damage) {
 | 
							pixman_region32_t *damage) {
 | 
				
			||||||
	EGLBoolean ret;
 | 
						EGLBoolean ret;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,16 +16,16 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct wlr_renderer_impl renderer_impl;
 | 
					static const struct wlr_renderer_impl renderer_impl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_gles2_renderer *gles2_get_renderer(
 | 
					static struct wlr_gles2_renderer *gles2_get_renderer(
 | 
				
			||||||
		struct wlr_renderer *wlr_renderer) {
 | 
							struct wlr_renderer *wlr_renderer) {
 | 
				
			||||||
	assert(wlr_renderer->impl == &renderer_impl);
 | 
						assert(wlr_renderer->impl == &renderer_impl);
 | 
				
			||||||
	return (struct wlr_gles2_renderer *)wlr_renderer;
 | 
						return (struct wlr_gles2_renderer *)wlr_renderer;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_gles2_renderer *gles2_get_renderer_in_context(
 | 
					static struct wlr_gles2_renderer *gles2_get_renderer_in_context(
 | 
				
			||||||
		struct wlr_renderer *wlr_renderer) {
 | 
							struct wlr_renderer *wlr_renderer) {
 | 
				
			||||||
	struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
 | 
						struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
 | 
				
			||||||
	assert(eglGetCurrentContext() == renderer->egl->context);
 | 
						assert(wlr_egl_is_current(renderer->egl));
 | 
				
			||||||
	return renderer;
 | 
						return renderer;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -252,11 +252,32 @@ static bool gles2_read_pixels(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool gles2_format_supported(struct wlr_renderer *r,
 | 
					static bool gles2_format_supported(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
		enum wl_shm_format wl_fmt) {
 | 
							enum wl_shm_format wl_fmt) {
 | 
				
			||||||
	return gles2_format_from_wl(wl_fmt) != NULL;
 | 
						return gles2_format_from_wl(wl_fmt) != NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct wlr_texture *gles2_texture_from_pixels(
 | 
				
			||||||
 | 
							struct wlr_renderer *wlr_renderer, enum wl_shm_format wl_fmt,
 | 
				
			||||||
 | 
							uint32_t stride, uint32_t width, uint32_t height, const void *data) {
 | 
				
			||||||
 | 
						struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
 | 
				
			||||||
 | 
						return wlr_gles2_texture_from_pixels(renderer->egl, wl_fmt, stride, width,
 | 
				
			||||||
 | 
							height, data);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static 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);
 | 
				
			||||||
 | 
						return wlr_gles2_texture_from_wl_drm(renderer->egl, data);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct wlr_texture *gles2_texture_from_dmabuf(
 | 
				
			||||||
 | 
							struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
 | 
							struct wlr_dmabuf_buffer_attribs *attribs) {
 | 
				
			||||||
 | 
						struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
 | 
				
			||||||
 | 
						return wlr_gles2_texture_from_dmabuf(renderer->egl, attribs);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void gles2_destroy(struct wlr_renderer *wlr_renderer) {
 | 
					static void gles2_destroy(struct wlr_renderer *wlr_renderer) {
 | 
				
			||||||
	struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
 | 
						struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -400,6 +421,10 @@ extern const GLchar tex_fragment_src_rgbx[];
 | 
				
			||||||
extern const GLchar tex_fragment_src_external[];
 | 
					extern const GLchar tex_fragment_src_external[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl) {
 | 
					struct wlr_renderer *wlr_gles2_renderer_create(struct wlr_egl *egl) {
 | 
				
			||||||
 | 
						if (!load_glapi()) {
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct wlr_gles2_renderer *renderer =
 | 
						struct wlr_gles2_renderer *renderer =
 | 
				
			||||||
		calloc(1, sizeof(struct wlr_gles2_renderer));
 | 
							calloc(1, sizeof(struct wlr_gles2_renderer));
 | 
				
			||||||
	if (renderer == NULL) {
 | 
						if (renderer == NULL) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@ static struct wlr_gles2_texture *gles2_get_texture(
 | 
				
			||||||
struct wlr_gles2_texture *gles2_get_texture_in_context(
 | 
					struct wlr_gles2_texture *gles2_get_texture_in_context(
 | 
				
			||||||
		struct wlr_texture *wlr_texture) {
 | 
							struct wlr_texture *wlr_texture) {
 | 
				
			||||||
	struct wlr_gles2_texture *texture = gles2_get_texture(wlr_texture);
 | 
						struct wlr_gles2_texture *texture = gles2_get_texture(wlr_texture);
 | 
				
			||||||
	assert(eglGetCurrentContext() == texture->renderer->egl->context);
 | 
						assert(wlr_egl_is_current(texture->egl));
 | 
				
			||||||
	return texture;
 | 
						return texture;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,7 +81,7 @@ static void gles2_texture_destroy(struct wlr_texture *wlr_texture) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct wlr_gles2_texture *texture = gles2_get_texture(wlr_texture);
 | 
						struct wlr_gles2_texture *texture = gles2_get_texture(wlr_texture);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wlr_egl_make_current(texture->renderer->egl, EGL_NO_SURFACE, NULL);
 | 
						wlr_egl_make_current(texture->egl, EGL_NO_SURFACE, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GLES2_DEBUG_PUSH;
 | 
						GLES2_DEBUG_PUSH;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,7 +90,7 @@ static void gles2_texture_destroy(struct wlr_texture *wlr_texture) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (texture->image) {
 | 
						if (texture->image) {
 | 
				
			||||||
		assert(eglDestroyImageKHR);
 | 
							assert(eglDestroyImageKHR);
 | 
				
			||||||
		wlr_egl_destroy_image(texture->renderer->egl, texture->image);
 | 
							wlr_egl_destroy_image(texture->egl, texture->image);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (texture->type == WLR_GLES2_TEXTURE_GLTEX) {
 | 
						if (texture->type == WLR_GLES2_TEXTURE_GLTEX) {
 | 
				
			||||||
| 
						 | 
					@ -108,11 +108,10 @@ static const struct wlr_texture_impl texture_impl = {
 | 
				
			||||||
	.destroy = gles2_texture_destroy,
 | 
						.destroy = gles2_texture_destroy,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_texture *gles2_texture_from_pixels(struct wlr_renderer *wlr_renderer,
 | 
					struct wlr_texture *wlr_gles2_texture_from_pixels(struct wlr_egl *egl,
 | 
				
			||||||
		enum wl_shm_format wl_fmt, uint32_t stride, uint32_t width,
 | 
							enum wl_shm_format wl_fmt, uint32_t stride, uint32_t width,
 | 
				
			||||||
		uint32_t height, const void *data) {
 | 
							uint32_t height, const void *data) {
 | 
				
			||||||
	struct wlr_gles2_renderer *renderer =
 | 
						assert(wlr_egl_is_current(egl));
 | 
				
			||||||
		gles2_get_renderer_in_context(wlr_renderer);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const struct gles2_pixel_format *fmt = gles2_format_from_wl(wl_fmt);
 | 
						const struct gles2_pixel_format *fmt = gles2_format_from_wl(wl_fmt);
 | 
				
			||||||
	if (fmt == NULL) {
 | 
						if (fmt == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -127,7 +126,7 @@ struct wlr_texture *gles2_texture_from_pixels(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	wlr_texture_init(&texture->wlr_texture, &texture_impl);
 | 
						wlr_texture_init(&texture->wlr_texture, &texture_impl);
 | 
				
			||||||
	texture->renderer = renderer;
 | 
						texture->egl = egl;
 | 
				
			||||||
	texture->width = width;
 | 
						texture->width = width;
 | 
				
			||||||
	texture->height = height;
 | 
						texture->height = height;
 | 
				
			||||||
	texture->type = WLR_GLES2_TEXTURE_GLTEX;
 | 
						texture->type = WLR_GLES2_TEXTURE_GLTEX;
 | 
				
			||||||
| 
						 | 
					@ -147,9 +146,9 @@ struct wlr_texture *gles2_texture_from_pixels(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
	return &texture->wlr_texture;
 | 
						return &texture->wlr_texture;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_texture *gles2_texture_from_wl_drm(struct wlr_renderer *wlr_renderer,
 | 
					struct wlr_texture *wlr_gles2_texture_from_wl_drm(struct wlr_egl *egl,
 | 
				
			||||||
		struct wl_resource *data) {
 | 
							struct wl_resource *data) {
 | 
				
			||||||
	struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
 | 
						assert(wlr_egl_is_current(egl));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!glEGLImageTargetTexture2DOES) {
 | 
						if (!glEGLImageTargetTexture2DOES) {
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
| 
						 | 
					@ -162,11 +161,11 @@ struct wlr_texture *gles2_texture_from_wl_drm(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	wlr_texture_init(&texture->wlr_texture, &texture_impl);
 | 
						wlr_texture_init(&texture->wlr_texture, &texture_impl);
 | 
				
			||||||
	texture->renderer = renderer;
 | 
						texture->egl = egl;
 | 
				
			||||||
	texture->wl_drm = data;
 | 
						texture->wl_drm = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	EGLint fmt;
 | 
						EGLint fmt;
 | 
				
			||||||
	texture->image = wlr_egl_create_image_from_wl_drm(renderer->egl, data, &fmt,
 | 
						texture->image = wlr_egl_create_image_from_wl_drm(egl, data, &fmt,
 | 
				
			||||||
		&texture->width, &texture->height, &texture->inverted_y);
 | 
							&texture->width, &texture->height, &texture->inverted_y);
 | 
				
			||||||
	if (texture->image == NULL) {
 | 
						if (texture->image == NULL) {
 | 
				
			||||||
		free(texture);
 | 
							free(texture);
 | 
				
			||||||
| 
						 | 
					@ -202,15 +201,15 @@ struct wlr_texture *gles2_texture_from_wl_drm(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
	return &texture->wlr_texture;
 | 
						return &texture->wlr_texture;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_texture *gles2_texture_from_dmabuf(struct wlr_renderer *wlr_renderer,
 | 
					struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl,
 | 
				
			||||||
		struct wlr_dmabuf_buffer_attribs *attribs) {
 | 
							struct wlr_dmabuf_buffer_attribs *attribs) {
 | 
				
			||||||
	struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
 | 
						assert(wlr_egl_is_current(egl));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!glEGLImageTargetTexture2DOES) {
 | 
						if (!glEGLImageTargetTexture2DOES) {
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!renderer->egl->egl_exts.dmabuf_import) {
 | 
						if (!egl->egl_exts.dmabuf_import) {
 | 
				
			||||||
		wlr_log(L_ERROR, "Cannot create DMA-BUF texture: EGL extension "
 | 
							wlr_log(L_ERROR, "Cannot create DMA-BUF texture: EGL extension "
 | 
				
			||||||
			"unavailable");
 | 
								"unavailable");
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
| 
						 | 
					@ -223,7 +222,7 @@ struct wlr_texture *gles2_texture_from_dmabuf(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	wlr_texture_init(&texture->wlr_texture, &texture_impl);
 | 
						wlr_texture_init(&texture->wlr_texture, &texture_impl);
 | 
				
			||||||
	texture->renderer = renderer;
 | 
						texture->egl = egl;
 | 
				
			||||||
	texture->width = attribs->width;
 | 
						texture->width = attribs->width;
 | 
				
			||||||
	texture->height = attribs->height;
 | 
						texture->height = attribs->height;
 | 
				
			||||||
	texture->type = WLR_GLES2_TEXTURE_DMABUF;
 | 
						texture->type = WLR_GLES2_TEXTURE_DMABUF;
 | 
				
			||||||
| 
						 | 
					@ -231,7 +230,7 @@ struct wlr_texture *gles2_texture_from_dmabuf(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
	texture->inverted_y =
 | 
						texture->inverted_y =
 | 
				
			||||||
		(attribs->flags & WLR_DMABUF_BUFFER_ATTRIBS_FLAGS_Y_INVERT) != 0;
 | 
							(attribs->flags & WLR_DMABUF_BUFFER_ATTRIBS_FLAGS_Y_INVERT) != 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	texture->image = wlr_egl_create_image_from_dmabuf(renderer->egl, attribs);
 | 
						texture->image = wlr_egl_create_image_from_dmabuf(egl, attribs);
 | 
				
			||||||
	if (texture->image == NULL) {
 | 
						if (texture->image == NULL) {
 | 
				
			||||||
		free(texture);
 | 
							free(texture);
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue