mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	gles2: change context when it is not current
Texture functions, that create and manipulate textures should switch the current context if necessary. thanks to: @emersion Fixes #934
This commit is contained in:
		
							parent
							
								
									15dacebc36
								
							
						
					
					
						commit
						ad406db21c
					
				
					 3 changed files with 18 additions and 10 deletions
				
			
		| 
						 | 
					@ -88,7 +88,7 @@ const struct wlr_gles2_pixel_format *get_gles2_format_from_wl(
 | 
				
			||||||
	enum wl_shm_format fmt);
 | 
						enum wl_shm_format fmt);
 | 
				
			||||||
const enum wl_shm_format *get_gles2_formats(size_t *len);
 | 
					const enum wl_shm_format *get_gles2_formats(size_t *len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_gles2_texture *get_gles2_texture_in_context(
 | 
					struct wlr_gles2_texture *gles2_get_texture(
 | 
				
			||||||
	struct wlr_texture *wlr_texture);
 | 
						struct wlr_texture *wlr_texture);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void push_gles2_marker(const char *file, const char *func);
 | 
					void push_gles2_marker(const char *file, const char *func);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -116,7 +116,7 @@ static bool gles2_render_texture_with_matrix(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
	struct wlr_gles2_renderer *renderer =
 | 
						struct wlr_gles2_renderer *renderer =
 | 
				
			||||||
		gles2_get_renderer_in_context(wlr_renderer);
 | 
							gles2_get_renderer_in_context(wlr_renderer);
 | 
				
			||||||
	struct wlr_gles2_texture *texture =
 | 
						struct wlr_gles2_texture *texture =
 | 
				
			||||||
		get_gles2_texture_in_context(wlr_texture);
 | 
							gles2_get_texture(wlr_texture);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct wlr_gles2_tex_shader *shader = NULL;
 | 
						struct wlr_gles2_tex_shader *shader = NULL;
 | 
				
			||||||
	GLenum target = 0;
 | 
						GLenum target = 0;
 | 
				
			||||||
| 
						 | 
					@ -213,7 +213,7 @@ static const enum wl_shm_format *gles2_renderer_formats(
 | 
				
			||||||
static bool gles2_resource_is_wl_drm_buffer(struct wlr_renderer *wlr_renderer,
 | 
					static bool gles2_resource_is_wl_drm_buffer(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
		struct wl_resource *resource) {
 | 
							struct wl_resource *resource) {
 | 
				
			||||||
	struct wlr_gles2_renderer *renderer =
 | 
						struct wlr_gles2_renderer *renderer =
 | 
				
			||||||
		gles2_get_renderer_in_context(wlr_renderer);
 | 
							gles2_get_renderer(wlr_renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!eglQueryWaylandBufferWL) {
 | 
						if (!eglQueryWaylandBufferWL) {
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
| 
						 | 
					@ -227,7 +227,7 @@ static bool gles2_resource_is_wl_drm_buffer(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
static void gles2_wl_drm_buffer_get_size(struct wlr_renderer *wlr_renderer,
 | 
					static void gles2_wl_drm_buffer_get_size(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
		struct wl_resource *buffer, int *width, int *height) {
 | 
							struct wl_resource *buffer, int *width, int *height) {
 | 
				
			||||||
	struct wlr_gles2_renderer *renderer =
 | 
						struct wlr_gles2_renderer *renderer =
 | 
				
			||||||
		gles2_get_renderer_in_context(wlr_renderer);
 | 
							gles2_get_renderer(wlr_renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!eglQueryWaylandBufferWL) {
 | 
						if (!eglQueryWaylandBufferWL) {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					@ -323,7 +323,7 @@ static struct wlr_texture *gles2_texture_from_dmabuf(
 | 
				
			||||||
static void gles2_init_wl_display(struct wlr_renderer *wlr_renderer,
 | 
					static void gles2_init_wl_display(struct wlr_renderer *wlr_renderer,
 | 
				
			||||||
		struct wl_display *wl_display) {
 | 
							struct wl_display *wl_display) {
 | 
				
			||||||
	struct wlr_gles2_renderer *renderer =
 | 
						struct wlr_gles2_renderer *renderer =
 | 
				
			||||||
		gles2_get_renderer_in_context(wlr_renderer);
 | 
							gles2_get_renderer(wlr_renderer);
 | 
				
			||||||
	if (!wlr_egl_bind_display(renderer->egl, wl_display)) {
 | 
						if (!wlr_egl_bind_display(renderer->egl, wl_display)) {
 | 
				
			||||||
		wlr_log(WLR_INFO, "failed to bind wl_display to EGL");
 | 
							wlr_log(WLR_INFO, "failed to bind wl_display to EGL");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct wlr_texture_impl texture_impl;
 | 
					static const struct wlr_texture_impl texture_impl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct wlr_gles2_texture *gles2_get_texture(
 | 
					struct wlr_gles2_texture *gles2_get_texture(
 | 
				
			||||||
		struct wlr_texture *wlr_texture) {
 | 
							struct wlr_texture *wlr_texture) {
 | 
				
			||||||
	assert(wlr_texture->impl == &texture_impl);
 | 
						assert(wlr_texture->impl == &texture_impl);
 | 
				
			||||||
	return (struct wlr_gles2_texture *)wlr_texture;
 | 
						return (struct wlr_gles2_texture *)wlr_texture;
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,9 @@ static struct wlr_gles2_texture *gles2_get_texture(
 | 
				
			||||||
struct wlr_gles2_texture *get_gles2_texture_in_context(
 | 
					struct wlr_gles2_texture *get_gles2_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(wlr_egl_is_current(texture->egl));
 | 
						if (!wlr_egl_is_current(texture->egl)) {
 | 
				
			||||||
 | 
							wlr_egl_make_current(texture->egl, EGL_NO_SURFACE, NULL);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return texture;
 | 
						return texture;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -143,7 +145,9 @@ static const struct wlr_texture_impl texture_impl = {
 | 
				
			||||||
struct wlr_texture *wlr_gles2_texture_from_pixels(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,
 | 
							enum wl_shm_format wl_fmt, uint32_t stride, uint32_t width,
 | 
				
			||||||
		uint32_t height, const void *data) {
 | 
							uint32_t height, const void *data) {
 | 
				
			||||||
	assert(wlr_egl_is_current(egl));
 | 
						if (!wlr_egl_is_current(egl)) {
 | 
				
			||||||
 | 
							wlr_egl_make_current(egl, EGL_NO_SURFACE, NULL);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const struct wlr_gles2_pixel_format *fmt = get_gles2_format_from_wl(wl_fmt);
 | 
						const struct wlr_gles2_pixel_format *fmt = get_gles2_format_from_wl(wl_fmt);
 | 
				
			||||||
	if (fmt == NULL) {
 | 
						if (fmt == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -180,7 +184,9 @@ struct wlr_texture *wlr_gles2_texture_from_pixels(struct wlr_egl *egl,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_texture *wlr_gles2_texture_from_wl_drm(struct wlr_egl *egl,
 | 
					struct wlr_texture *wlr_gles2_texture_from_wl_drm(struct wlr_egl *egl,
 | 
				
			||||||
		struct wl_resource *data) {
 | 
							struct wl_resource *data) {
 | 
				
			||||||
	assert(wlr_egl_is_current(egl));
 | 
						if (!wlr_egl_is_current(egl)) {
 | 
				
			||||||
 | 
							wlr_egl_make_current(egl, EGL_NO_SURFACE, NULL);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!glEGLImageTargetTexture2DOES) {
 | 
						if (!glEGLImageTargetTexture2DOES) {
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
| 
						 | 
					@ -239,7 +245,9 @@ struct wlr_texture *wlr_gles2_texture_from_wl_drm(struct wlr_egl *egl,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl,
 | 
					struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl,
 | 
				
			||||||
		struct wlr_dmabuf_attributes *attribs) {
 | 
							struct wlr_dmabuf_attributes *attribs) {
 | 
				
			||||||
	assert(wlr_egl_is_current(egl));
 | 
						if (!wlr_egl_is_current(egl)) {
 | 
				
			||||||
 | 
							wlr_egl_make_current(egl, EGL_NO_SURFACE, NULL);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!glEGLImageTargetTexture2DOES) {
 | 
						if (!glEGLImageTargetTexture2DOES) {
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue