forked from enlightenment/efl
evas/gl_x11 : Move engine data to native.
Summary: If 2 evases refer to same pixmap, use same EvasGL_Image. But EvasGL_Image can have only one engine data. When evas related to native is destroyed and another evas use that native, crash occur. So native callbacks need to be independent to engine data. Test Plan: mobile, local test Reviewers: cedric, spacegrapher, wonsik, jpeg Reviewed By: jpeg Differential Revision: https://phab.enlightenment.org/D3800
This commit is contained in:
parent
4e0cff107e
commit
bc2b32cba7
|
@ -440,6 +440,8 @@ struct _Evas_GL_Image
|
||||||
int target;
|
int target;
|
||||||
int mipmap;
|
int mipmap;
|
||||||
unsigned char loose : 1;
|
unsigned char loose : 1;
|
||||||
|
void *disp;
|
||||||
|
Evas_GL_Shared *shared;
|
||||||
} native;
|
} native;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
|
|
@ -2031,11 +2031,10 @@ _native_bind_cb(void *data EINA_UNUSED, void *image)
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
# ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
|
# ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
|
||||||
Render_Engine *re = data;
|
|
||||||
|
|
||||||
if (glsym_glXBindTexImage)
|
if (glsym_glXBindTexImage)
|
||||||
{
|
{
|
||||||
glsym_glXBindTexImage(eng_get_ob(re)->disp, (XID)n->ns_data.x11.surface,
|
glsym_glXBindTexImage(im->native.disp, (XID)n->ns_data.x11.surface,
|
||||||
GLX_FRONT_LEFT_EXT, NULL);
|
GLX_FRONT_LEFT_EXT, NULL);
|
||||||
GLERRV("glsym_glXBindTexImage");
|
GLERRV("glsym_glXBindTexImage");
|
||||||
}
|
}
|
||||||
|
@ -2121,11 +2120,10 @@ _native_unbind_cb(void *data EINA_UNUSED, void *image)
|
||||||
// nothing
|
// nothing
|
||||||
#else
|
#else
|
||||||
# ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
|
# ifdef GLX_BIND_TO_TEXTURE_TARGETS_EXT
|
||||||
Render_Engine *re = data;
|
|
||||||
|
|
||||||
if (glsym_glXReleaseTexImage)
|
if (glsym_glXReleaseTexImage)
|
||||||
{
|
{
|
||||||
glsym_glXReleaseTexImage(eng_get_ob(re)->disp, (XID)(n->ns_data.x11.surface),
|
glsym_glXReleaseTexImage(im->native.disp, (XID)(n->ns_data.x11.surface),
|
||||||
GLX_FRONT_LEFT_EXT);
|
GLX_FRONT_LEFT_EXT);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2152,9 +2150,8 @@ _native_unbind_cb(void *data EINA_UNUSED, void *image)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_native_free_cb(void *data, void *image)
|
_native_free_cb(void *data EINA_UNUSED, void *image)
|
||||||
{
|
{
|
||||||
Render_Engine *re = data;
|
|
||||||
Evas_GL_Image *im = image;
|
Evas_GL_Image *im = image;
|
||||||
Native *n = im->native.data;
|
Native *n = im->native.data;
|
||||||
uint32_t pmid, texid;
|
uint32_t pmid, texid;
|
||||||
|
@ -2167,14 +2164,14 @@ _native_free_cb(void *data, void *image)
|
||||||
if (n->ns.type == EVAS_NATIVE_SURFACE_X11)
|
if (n->ns.type == EVAS_NATIVE_SURFACE_X11)
|
||||||
{
|
{
|
||||||
pmid = n->ns_data.x11.pixmap;
|
pmid = n->ns_data.x11.pixmap;
|
||||||
eina_hash_del(eng_get_ob(re)->gl_context->shared->native_pm_hash, &pmid, im);
|
eina_hash_del(im->native.shared->native_pm_hash, &pmid, im);
|
||||||
#ifdef GL_GLES
|
#ifdef GL_GLES
|
||||||
if (n->ns_data.x11.surface)
|
if (n->ns_data.x11.surface)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
if (glsym_eglDestroyImage)
|
if (glsym_eglDestroyImage)
|
||||||
{
|
{
|
||||||
glsym_eglDestroyImage(eng_get_ob(re)->egl_disp,
|
glsym_eglDestroyImage(im->native.disp,
|
||||||
n->ns_data.x11.surface);
|
n->ns_data.x11.surface);
|
||||||
if ((err = eglGetError()) != EGL_SUCCESS)
|
if ((err = eglGetError()) != EGL_SUCCESS)
|
||||||
{
|
{
|
||||||
|
@ -2193,7 +2190,7 @@ _native_free_cb(void *data, void *image)
|
||||||
{
|
{
|
||||||
if (glsym_glXReleaseTexImage)
|
if (glsym_glXReleaseTexImage)
|
||||||
{
|
{
|
||||||
glsym_glXReleaseTexImage(eng_get_ob(re)->disp, (XID)n->ns_data.x11.surface,
|
glsym_glXReleaseTexImage(im->native.disp, (XID)n->ns_data.x11.surface,
|
||||||
GLX_FRONT_LEFT_EXT);
|
GLX_FRONT_LEFT_EXT);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2201,7 +2198,7 @@ _native_free_cb(void *data, void *image)
|
||||||
}
|
}
|
||||||
if (glsym_glXDestroyPixmap)
|
if (glsym_glXDestroyPixmap)
|
||||||
{
|
{
|
||||||
glsym_glXDestroyPixmap(eng_get_ob(re)->disp, (XID)n->ns_data.x11.surface);
|
glsym_glXDestroyPixmap(im->native.disp, (XID)n->ns_data.x11.surface);
|
||||||
GLERRV("glsym_glXDestroyPixmap");
|
GLERRV("glsym_glXDestroyPixmap");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2214,18 +2211,18 @@ _native_free_cb(void *data, void *image)
|
||||||
else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
|
else if (n->ns.type == EVAS_NATIVE_SURFACE_OPENGL)
|
||||||
{
|
{
|
||||||
texid = n->ns.data.opengl.texture_id;
|
texid = n->ns.data.opengl.texture_id;
|
||||||
eina_hash_del(eng_get_ob(re)->gl_context->shared->native_tex_hash, &texid, im);
|
eina_hash_del(im->native.shared->native_tex_hash, &texid, im);
|
||||||
}
|
}
|
||||||
else if (n->ns.type == EVAS_NATIVE_SURFACE_TBM)
|
else if (n->ns.type == EVAS_NATIVE_SURFACE_TBM)
|
||||||
{
|
{
|
||||||
eina_hash_del(eng_get_ob(re)->gl_context->shared->native_tbm_hash, &n->ns_data.tbm.buffer, im);
|
eina_hash_del(im->native.shared->native_tbm_hash, &n->ns_data.tbm.buffer, im);
|
||||||
#ifdef GL_GLES
|
#ifdef GL_GLES
|
||||||
if (n->ns_data.tbm.surface)
|
if (n->ns_data.tbm.surface)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
if (glsym_eglDestroyImage)
|
if (glsym_eglDestroyImage)
|
||||||
{
|
{
|
||||||
glsym_eglDestroyImage(eng_get_ob(re)->egl_disp,
|
glsym_eglDestroyImage(im->native.disp,
|
||||||
n->ns_data.tbm.surface);
|
n->ns_data.tbm.surface);
|
||||||
if ((err = eglGetError()) != EGL_SUCCESS)
|
if ((err = eglGetError()) != EGL_SUCCESS)
|
||||||
{
|
{
|
||||||
|
@ -2240,19 +2237,19 @@ _native_free_cb(void *data, void *image)
|
||||||
}
|
}
|
||||||
else if (n->ns.type == EVAS_NATIVE_SURFACE_EVASGL)
|
else if (n->ns.type == EVAS_NATIVE_SURFACE_EVASGL)
|
||||||
{
|
{
|
||||||
eina_hash_del(eng_get_ob(re)->gl_context->shared->native_evasgl_hash, &n->ns.data.evasgl.surface, im);
|
eina_hash_del(im->native.shared->native_evasgl_hash, &n->ns.data.evasgl.surface, im);
|
||||||
}
|
}
|
||||||
else if (n->ns.type == EVAS_NATIVE_SURFACE_WL)
|
else if (n->ns.type == EVAS_NATIVE_SURFACE_WL)
|
||||||
{
|
{
|
||||||
#ifdef GL_GLES
|
#ifdef GL_GLES
|
||||||
# ifdef HAVE_WAYLAND
|
# ifdef HAVE_WAYLAND
|
||||||
wlid = (void*)n->ns_data.wl_surface.wl_buf;
|
wlid = (void*)n->ns_data.wl_surface.wl_buf;
|
||||||
eina_hash_del(eng_get_ob(re)->gl_context->shared->native_wl_hash, &wlid, image);
|
eina_hash_del(im->native.shared->native_wl_hash, &wlid, image);
|
||||||
if (n->ns_data.wl_surface.surface)
|
if (n->ns_data.wl_surface.surface)
|
||||||
{
|
{
|
||||||
if (glsym_eglDestroyImage)
|
if (glsym_eglDestroyImage)
|
||||||
{
|
{
|
||||||
glsym_eglDestroyImage(eng_get_ob(re)->egl_disp, n->ns_data.wl_surface.surface);
|
glsym_eglDestroyImage(im->native.disp, n->ns_data.wl_surface.surface);
|
||||||
if (eglGetError() != EGL_SUCCESS)
|
if (eglGetError() != EGL_SUCCESS)
|
||||||
ERR("eglDestroyImage() failed.");
|
ERR("eglDestroyImage() failed.");
|
||||||
}
|
}
|
||||||
|
@ -2271,9 +2268,8 @@ _native_free_cb(void *data, void *image)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_native_yinvert_cb(void *data, void *image)
|
_native_yinvert_cb(void *data EINA_UNUSED, void *image)
|
||||||
{
|
{
|
||||||
Render_Engine *re = data;
|
|
||||||
Evas_GL_Image *im = image;
|
Evas_GL_Image *im = image;
|
||||||
Native *n = im->native.data;
|
Native *n = im->native.data;
|
||||||
int yinvert = 0, val;
|
int yinvert = 0, val;
|
||||||
|
@ -2284,11 +2280,11 @@ _native_yinvert_cb(void *data, void *image)
|
||||||
{
|
{
|
||||||
#if GL_GLES
|
#if GL_GLES
|
||||||
if (extn_have_y_inverted &&
|
if (extn_have_y_inverted &&
|
||||||
eglGetConfigAttrib(eng_get_ob(re)->egl_disp, n->ns_data.x11.config,
|
eglGetConfigAttrib(im->native.disp, n->ns_data.x11.config,
|
||||||
EGL_Y_INVERTED_NOK, &val))
|
EGL_Y_INVERTED_NOK, &val))
|
||||||
yinvert = val;
|
yinvert = val;
|
||||||
#else
|
#else
|
||||||
glXGetFBConfigAttrib(eng_get_ob(re)->disp, n->ns_data.x11.config,
|
glXGetFBConfigAttrib(im->native.disp, n->ns_data.x11.config,
|
||||||
GLX_Y_INVERTED_EXT, &val);
|
GLX_Y_INVERTED_EXT, &val);
|
||||||
if (val) yinvert = 1;
|
if (val) yinvert = 1;
|
||||||
#endif
|
#endif
|
||||||
|
@ -2622,6 +2618,8 @@ eng_image_native_set(void *data, void *image, void *native)
|
||||||
|
|
||||||
im->native.yinvert = yinvert;
|
im->native.yinvert = yinvert;
|
||||||
im->native.loose = 0;
|
im->native.loose = 0;
|
||||||
|
im->native.disp = eng_get_ob(re)->egl_disp;
|
||||||
|
im->native.shared = eng_get_ob(re)->gl_context->shared;
|
||||||
im->native.data = n;
|
im->native.data = n;
|
||||||
im->native.func.data = re;
|
im->native.func.data = re;
|
||||||
im->native.func.bind = _native_bind_cb;
|
im->native.func.bind = _native_bind_cb;
|
||||||
|
@ -2829,6 +2827,8 @@ eng_image_native_set(void *data, void *image, void *native)
|
||||||
ERR("GLX Pixmap create fail");
|
ERR("GLX Pixmap create fail");
|
||||||
im->native.yinvert = yinvert;
|
im->native.yinvert = yinvert;
|
||||||
im->native.loose = eng_get_ob(re)->detected.loose_binding;
|
im->native.loose = eng_get_ob(re)->detected.loose_binding;
|
||||||
|
im->native.disp = eng_get_ob(re)->disp;
|
||||||
|
im->native.shared = eng_get_ob(re)->gl_context->shared;
|
||||||
im->native.data = n;
|
im->native.data = n;
|
||||||
im->native.func.data = re;
|
im->native.func.data = re;
|
||||||
im->native.func.bind = _native_bind_cb;
|
im->native.func.bind = _native_bind_cb;
|
||||||
|
@ -2857,6 +2857,12 @@ eng_image_native_set(void *data, void *image, void *native)
|
||||||
|
|
||||||
im->native.yinvert = 0;
|
im->native.yinvert = 0;
|
||||||
im->native.loose = 0;
|
im->native.loose = 0;
|
||||||
|
#ifdef GL_GLES
|
||||||
|
im->native.disp = eng_get_ob(re)->egl_disp;
|
||||||
|
#else
|
||||||
|
im->native.disp = eng_get_ob(re)->disp;
|
||||||
|
#endif
|
||||||
|
im->native.shared = eng_get_ob(re)->gl_context->shared;
|
||||||
im->native.data = n;
|
im->native.data = n;
|
||||||
im->native.func.data = re;
|
im->native.func.data = re;
|
||||||
im->native.func.bind = _native_bind_cb;
|
im->native.func.bind = _native_bind_cb;
|
||||||
|
@ -2896,6 +2902,8 @@ eng_image_native_set(void *data, void *image, void *native)
|
||||||
ERR("eglCreateImage() for %p failed", buffer);
|
ERR("eglCreateImage() for %p failed", buffer);
|
||||||
im->native.yinvert = 1;
|
im->native.yinvert = 1;
|
||||||
im->native.loose = 0;
|
im->native.loose = 0;
|
||||||
|
im->native.disp = eng_get_ob(re)->egl_disp;
|
||||||
|
im->native.shared = eng_get_ob(re)->gl_context->shared;
|
||||||
im->native.data = n;
|
im->native.data = n;
|
||||||
im->native.func.data = re;
|
im->native.func.data = re;
|
||||||
im->native.func.bind = _native_bind_cb;
|
im->native.func.bind = _native_bind_cb;
|
||||||
|
@ -2923,6 +2931,12 @@ eng_image_native_set(void *data, void *image, void *native)
|
||||||
|
|
||||||
im->native.yinvert = 0;
|
im->native.yinvert = 0;
|
||||||
im->native.loose = 0;
|
im->native.loose = 0;
|
||||||
|
#ifdef GL_GLES
|
||||||
|
im->native.disp = eng_get_ob(re)->egl_disp;
|
||||||
|
#else
|
||||||
|
im->native.disp = eng_get_ob(re)->disp;
|
||||||
|
#endif
|
||||||
|
im->native.shared = eng_get_ob(re)->gl_context->shared;
|
||||||
im->native.data = n;
|
im->native.data = n;
|
||||||
im->native.func.data = re;
|
im->native.func.data = re;
|
||||||
im->native.func.bind = _native_bind_cb;
|
im->native.func.bind = _native_bind_cb;
|
||||||
|
@ -3004,6 +3018,8 @@ eng_image_native_set(void *data, void *image, void *native)
|
||||||
//im->native.yinvert = yinvert;
|
//im->native.yinvert = yinvert;
|
||||||
im->native.yinvert = 1;
|
im->native.yinvert = 1;
|
||||||
im->native.loose = 0;
|
im->native.loose = 0;
|
||||||
|
im->native.disp = eng_get_ob(re)->egl_disp;
|
||||||
|
im->native.shared = eng_get_ob(re)->gl_context->shared;
|
||||||
im->native.data = n;
|
im->native.data = n;
|
||||||
im->native.func.data = re;
|
im->native.func.data = re;
|
||||||
im->native.func.bind = _native_bind_cb;
|
im->native.func.bind = _native_bind_cb;
|
||||||
|
|
Loading…
Reference in New Issue