aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Bialonczyk <manio@skyboo.net>2018-08-02 13:38:00 +0200
committerMariusz Bialonczyk <manio@skyboo.net>2018-08-03 07:43:22 +0200
commitad406db21c7cebf21bf73ae6ceb88fdf1849395e (patch)
tree3adc0925ea6e47ba926de55651ff4b14edc58dd9
parent15dacebc36ffa137aefafcfbe723c7b35af5cc2b (diff)
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
-rw-r--r--include/render/gles2.h2
-rw-r--r--render/gles2/renderer.c8
-rw-r--r--render/gles2/texture.c18
3 files changed, 18 insertions, 10 deletions
diff --git a/include/render/gles2.h b/include/render/gles2.h
index 8b036f80..f649f3e2 100644
--- a/include/render/gles2.h
+++ b/include/render/gles2.h
@@ -88,7 +88,7 @@ const struct wlr_gles2_pixel_format *get_gles2_format_from_wl(
enum wl_shm_format fmt);
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);
void push_gles2_marker(const char *file, const char *func);
diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c
index 27c16e52..b6e97041 100644
--- a/render/gles2/renderer.c
+++ b/render/gles2/renderer.c
@@ -116,7 +116,7 @@ static bool gles2_render_texture_with_matrix(struct wlr_renderer *wlr_renderer,
struct wlr_gles2_renderer *renderer =
gles2_get_renderer_in_context(wlr_renderer);
struct wlr_gles2_texture *texture =
- get_gles2_texture_in_context(wlr_texture);
+ gles2_get_texture(wlr_texture);
struct wlr_gles2_tex_shader *shader = NULL;
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,
struct wl_resource *resource) {
struct wlr_gles2_renderer *renderer =
- gles2_get_renderer_in_context(wlr_renderer);
+ gles2_get_renderer(wlr_renderer);
if (!eglQueryWaylandBufferWL) {
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,
struct wl_resource *buffer, int *width, int *height) {
struct wlr_gles2_renderer *renderer =
- gles2_get_renderer_in_context(wlr_renderer);
+ gles2_get_renderer(wlr_renderer);
if (!eglQueryWaylandBufferWL) {
return;
@@ -323,7 +323,7 @@ static struct wlr_texture *gles2_texture_from_dmabuf(
static void gles2_init_wl_display(struct wlr_renderer *wlr_renderer,
struct wl_display *wl_display) {
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)) {
wlr_log(WLR_INFO, "failed to bind wl_display to EGL");
}
diff --git a/render/gles2/texture.c b/render/gles2/texture.c
index 1e55f4c4..22d02cde 100644
--- a/render/gles2/texture.c
+++ b/render/gles2/texture.c
@@ -16,7 +16,7 @@
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) {
assert(wlr_texture->impl == &texture_impl);
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_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;
}
@@ -143,7 +145,9 @@ static const struct wlr_texture_impl texture_impl = {
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) {
- 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);
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 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) {
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_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) {
return NULL;