// Evas extensions from EGL extensions
#ifdef GL_GLES
-#define EGLDISPLAY_GET() _evgl_egl_display_get(__FUNCTION__)
+#define EGLDISPLAY_GET(a) _evgl_egl_display_get(__FUNCTION__, a)
// this struct defines an EvasGLImage when using EGL
typedef struct _EvasGLImage {
} EvasGLImage_EGL;
static EGLDisplay
-_evgl_egl_display_get(const char *function)
+_evgl_egl_display_get(const char *function, Evas_GL *evgl)
{
EGLDisplay dpy = EGL_NO_DISPLAY;
EVGL_Resource *rsc;
+ if (!evgl_engine || !evgl_engine->funcs || !evgl_engine->funcs->display_get)
+ {
+ ERR("%s: Invalid Engine... (Can't acccess EGL Display)\n", function);
+ evas_gl_common_error_set(NULL, EVAS_GL_BAD_DISPLAY);
+ return EGL_NO_DISPLAY;
+ }
+
if (!(rsc=_evgl_tls_resource_get()))
{
+ if (evgl) goto fallback;
ERR("%s: Unable to execute GL command. Error retrieving tls", function);
evas_gl_common_error_set(NULL, EVAS_GL_NOT_INITIALIZED);
return EGL_NO_DISPLAY;
if (!rsc->current_eng)
{
+ if (evgl) goto fallback;
ERR("%s: no current engine set; ensure you've called evas_gl_make_current()", function);
evas_gl_common_error_set(NULL, EVAS_GL_NOT_INITIALIZED);
return EGL_NO_DISPLAY;
}
- if ((evgl_engine) && (evgl_engine->funcs->display_get))
- {
- dpy = (EGLDisplay)evgl_engine->funcs->display_get(rsc->current_eng);
- return dpy;
- }
- else
- {
- ERR("%s: Invalid Engine... (Can't acccess EGL Display)\n", function);
- evas_gl_common_error_set(NULL, EVAS_GL_BAD_DISPLAY);
- return EGL_NO_DISPLAY;
- }
+ dpy = (EGLDisplay) evgl_engine->funcs->display_get(rsc->current_eng);
+ return dpy;
+
+fallback:
+ dpy = (EGLDisplay) evgl_engine->funcs->display_get(_evgl_engine_data_get(evgl));
+ return dpy;
}
static void *
static void *
evgl_evasglCreateImage(int target, void* buffer, const int *attrib_list)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(NULL);
EGLContext ctx = EGL_NO_CONTEXT;
- if (!dpy) return NULL;
+ if (!dpy)
+ {
+ WRN("No display found, use evasglCreateImageForContext instead.");
+ return NULL;
+ }
/* EGL_NO_CONTEXT will always fail for TEXTURE_2D */
if (target == EVAS_GL_TEXTURE_2D)
{
ctx = eglGetCurrentContext();
- INF("Creating EGL image based on the current context: %p", ctx);
+ DBG("Creating EGL image based on the current context: %p", ctx);
}
return _evgl_eglCreateImageKHR(dpy, ctx, target, buffer, attrib_list);
}
static void *
-evgl_evasglCreateImageForContext(Evas_GL *evasgl EINA_UNUSED, Evas_GL_Context *evasctx,
+evgl_evasglCreateImageForContext(Evas_GL *evasgl, Evas_GL_Context *evasctx,
int target, void* buffer, const int *attrib_list)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(evasgl);
EGLContext ctx = EGL_NO_CONTEXT;
- if (!evasgl || !dpy) return NULL;
+ if (!dpy || !evasgl)
+ {
+ ERR("Evas_GL can not be NULL here.");
+ evas_gl_common_error_set(NULL, EVAS_GL_BAD_DISPLAY);
+ return NULL;
+ }
ctx = _evgl_native_context_get(evasctx);
return _evgl_eglCreateImageKHR(dpy, ctx, target, buffer, attrib_list);
static void
evgl_evasglDestroyImage(EvasGLImage image)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
EvasGLImage_EGL *img = image;
- if (dpy)
- EXT_FUNC_EGL(eglDestroyImage)(dpy, img->img);
- else
- EXT_FUNC_EGL(eglDestroyImage)(img->dpy, img->img);
+ EXT_FUNC_EGL(eglDestroyImage)(img->dpy, img->img);
free(img);
}
}
static EvasGLSync
-evgl_evasglCreateSync(Evas_GL *evas_gl EINA_UNUSED,
+evgl_evasglCreateSync(Evas_GL *evas_gl,
unsigned int type, const int *attrib_list)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
if (!dpy) return NULL;
return EXT_FUNC_EGL(eglCreateSyncKHR)(dpy, type, attrib_list);
}
static Eina_Bool
-evgl_evasglDestroySync(Evas_GL *evas_gl EINA_UNUSED, EvasGLSync sync)
+evgl_evasglDestroySync(Evas_GL *evas_gl, EvasGLSync sync)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
if (!dpy) return EINA_FALSE;
return EXT_FUNC_EGL(eglDestroySyncKHR)(dpy, sync);
}
static int
-evgl_evasglClientWaitSync(Evas_GL *evas_gl EINA_UNUSED,
+evgl_evasglClientWaitSync(Evas_GL *evas_gl,
EvasGLSync sync, int flags, EvasGLTime timeout)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
if (!dpy) return EINA_FALSE;
return EXT_FUNC_EGL(eglClientWaitSyncKHR)(dpy, sync, flags, timeout);
}
static Eina_Bool
-evgl_evasglSignalSync(Evas_GL *evas_gl EINA_UNUSED,
+evgl_evasglSignalSync(Evas_GL *evas_gl,
EvasGLSync sync, unsigned mode)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
if (!dpy) return EINA_FALSE;
return EXT_FUNC_EGL(eglSignalSyncKHR)(dpy, sync, mode);
}
static Eina_Bool
-evgl_evasglGetSyncAttrib(Evas_GL *evas_gl EINA_UNUSED,
+evgl_evasglGetSyncAttrib(Evas_GL *evas_gl,
EvasGLSync sync, int attribute, int *value)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
if (!dpy) return EINA_FALSE;
return EXT_FUNC_EGL(eglGetSyncAttribKHR)(dpy, sync, attribute, value);
}
static int
-evgl_evasglWaitSync(Evas_GL *evas_gl EINA_UNUSED,
+evgl_evasglWaitSync(Evas_GL *evas_gl,
EvasGLSync sync, int flags)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
if (!dpy) return EINA_FALSE;
return EXT_FUNC_EGL(eglWaitSyncKHR)(dpy, sync, flags);
}
static Eina_Bool
-evgl_evasglBindWaylandDisplay(Evas_GL *evas_gl EINA_UNUSED,
+evgl_evasglBindWaylandDisplay(Evas_GL *evas_gl,
void *wl_display)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
if (!dpy) return EINA_FALSE;
return EXT_FUNC_EGL(eglBindWaylandDisplayWL)(dpy, wl_display);
}
static Eina_Bool
-evgl_evasglUnbindWaylandDisplay(Evas_GL *evas_gl EINA_UNUSED,
+evgl_evasglUnbindWaylandDisplay(Evas_GL *evas_gl,
void *wl_display)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
if (!dpy) return EINA_FALSE;
return EXT_FUNC_EGL(eglUnbindWaylandDisplayWL)(dpy, wl_display);
}
static Eina_Bool
-evgl_evasglQueryWaylandBuffer(Evas_GL *evas_gl EINA_UNUSED,
+evgl_evasglQueryWaylandBuffer(Evas_GL *evas_gl,
void *buffer, int attribute, int *value)
{
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(evas_gl);
if (!dpy) return EINA_FALSE;
return EXT_FUNC_EGL(eglQueryWaylandBufferWL)(dpy, buffer, attribute, value);
}
#ifdef GL_GLES
EVGL_Resource *rsc;
EGLint context_version;
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(NULL);
/* glGetString returns the information for the currently bound context
* So, update glexts only if GLES1 context is currently bound.
#ifdef GL_GLES
EVGL_Resource *rsc;
EGLint context_version;
- EGLDisplay dpy = EGLDISPLAY_GET();
+ EGLDisplay dpy = EGLDISPLAY_GET(NULL);
/* glGetString returns the information for the currently bound context
* So, update gles3_exts only if GLES3 context is currently bound.