forked from enlightenment/efl
Evas GL: Fix compilation for EGL/GLES
Configure with --with-opengl=es --enable-egl Fixes runtime link dependencies
This commit is contained in:
parent
a0712e25e1
commit
f30f55f9f4
|
@ -613,3 +613,11 @@ evas_gl_surface_query(Evas_GL *evas_gl, Evas_GL_Surface *surface, int attribute,
|
|||
return evas_gl->evas->engine.func->gl_surface_query
|
||||
(evas_gl->evas->engine.data.output, surface->data, attribute, value);
|
||||
}
|
||||
|
||||
// Internal function - called from evas_gl_core.c
|
||||
EAPI void *
|
||||
_evas_gl_native_context_get(Evas_GL_Context *ctx)
|
||||
{
|
||||
if (!ctx) return NULL;
|
||||
return ctx->data;
|
||||
}
|
||||
|
|
|
@ -73,14 +73,14 @@ _evgl_egl_display_get(const char *function)
|
|||
if (!(rsc=_evgl_tls_resource_get()))
|
||||
{
|
||||
ERR("%s: Unable to execute GL command. Error retrieving tls", function);
|
||||
_evgl_error_set(EVAS_GL_NOT_INITIALIZED);
|
||||
evas_gl_common_error_set(NULL, EVAS_GL_NOT_INITIALIZED);
|
||||
return EGL_NO_DISPLAY;
|
||||
}
|
||||
|
||||
if (!rsc->current_eng)
|
||||
{
|
||||
ERR("%s: Unable to retrive Current Engine", function);
|
||||
_evgl_error_set(EVAS_GL_NOT_INITIALIZED);
|
||||
evas_gl_common_error_set(NULL, EVAS_GL_NOT_INITIALIZED);
|
||||
return EGL_NO_DISPLAY;
|
||||
}
|
||||
|
||||
|
@ -92,7 +92,7 @@ _evgl_egl_display_get(const char *function)
|
|||
else
|
||||
{
|
||||
ERR("%s: Invalid Engine... (Can't acccess EGL Display)\n", function);
|
||||
_evgl_error_set(EVAS_GL_BAD_DISPLAY);
|
||||
evas_gl_common_error_set(NULL, EVAS_GL_BAD_DISPLAY);
|
||||
return EGL_NO_DISPLAY;
|
||||
}
|
||||
}
|
||||
|
@ -155,7 +155,7 @@ evgl_evasglCreateImageForContext(Evas_GL *evasgl EINA_UNUSED, Evas_GL_Context *e
|
|||
|
||||
if (!evasgl || !dpy) return NULL;
|
||||
|
||||
ctx = evgl_context_native_get(evasctx);
|
||||
ctx = _evgl_native_context_get(evasctx);
|
||||
return _evgl_eglCreateImageKHR(dpy, ctx, target, buffer, attrib_list);
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,9 @@ EVGL_Engine *evgl_engine = NULL;
|
|||
int _evas_gl_log_dom = -1;
|
||||
int _evas_gl_log_level = -1;
|
||||
|
||||
typedef void *(*glsym_func_void_ptr) ();
|
||||
glsym_func_void_ptr glsym_evas_gl_native_context_get = NULL;
|
||||
|
||||
static void _surface_cap_print(int error);
|
||||
static void _surface_context_list_print();
|
||||
static void _internal_resources_destroy(void *eng_data, EVGL_Resource *rsc);
|
||||
|
@ -1305,6 +1308,22 @@ evas_gl_common_error_get(void *data EINA_UNUSED)
|
|||
return rsc->error_state;
|
||||
}
|
||||
|
||||
EVGLNative_Context
|
||||
_evgl_native_context_get(Evas_GL_Context *ctx)
|
||||
{
|
||||
EVGL_Context *evglctx;
|
||||
|
||||
if (!glsym_evas_gl_native_context_get)
|
||||
{
|
||||
ERR("Engine can't get a pointer to the native context");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
evglctx = glsym_evas_gl_native_context_get(ctx);
|
||||
if (!evglctx) return NULL;
|
||||
return evglctx->context;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------//
|
||||
// Exported functions for evas_engine to use
|
||||
|
||||
|
@ -1367,6 +1386,9 @@ evgl_engine_init(void *eng_data, const EVGL_Interface *efunc)
|
|||
}
|
||||
DBG("TLS KEY created: %d", evgl_engine->resource_key);
|
||||
|
||||
// Link to evas_gl.c (this doesn't look great)
|
||||
glsym_evas_gl_native_context_get = dlsym(RTLD_DEFAULT, "_evas_gl_native_context_get");
|
||||
|
||||
// Initialize Extensions
|
||||
if (efunc->proc_address_get && efunc->ext_string_get)
|
||||
evgl_api_ext_init(efunc->proc_address_get, efunc->ext_string_get(eng_data));
|
||||
|
|
|
@ -306,5 +306,6 @@ extern EVGL_Resource *_evgl_tls_resource_create(void *data);
|
|||
extern void _evgl_tls_resource_destroy(void *data);
|
||||
extern int _evgl_not_in_pixel_get(void);
|
||||
extern int _evgl_direct_enabled(void);
|
||||
extern EVGLNative_Context _evgl_native_context_get(Evas_GL_Context *ctx);
|
||||
|
||||
#endif //_EVAS_GL_CORE_PRIVATE_H
|
||||
|
|
|
@ -1349,8 +1349,10 @@ eng_gl_surface_query(void *data, void *surface, int attr, void *value)
|
|||
// This is a real EGL surface, let's just call EGL directly
|
||||
int val;
|
||||
Eina_Bool ok;
|
||||
void *disp;
|
||||
|
||||
ok = eglQuerySurface(re->win->egl_disp, sfc->pbuffer.native_surface, attr, &val);
|
||||
disp = re->window_egl_display_get(re->software.ob);
|
||||
ok = eglQuerySurface(disp, sfc->pbuffer.native_surface, attr, &val);
|
||||
if (!ok) return EINA_FALSE;
|
||||
switch (attr)
|
||||
{
|
||||
|
@ -1430,7 +1432,7 @@ eng_gl_surface_query(void *data, void *surface, int attr, void *value)
|
|||
*/
|
||||
default: break;
|
||||
}
|
||||
_evgl_error_set(EVAS_GL_BAD_ATTRIBUTE);
|
||||
evas_gl_common_error_set(data, EVAS_GL_BAD_ATTRIBUTE);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -611,7 +611,7 @@ static void *
|
|||
evgl_eng_pbuffer_surface_create(void *data, EVGL_Surface *sfc,
|
||||
const int *attrib_list)
|
||||
{
|
||||
Render_Engine *re = (Render_Engine *)data;
|
||||
Render_Engine_GL_Generic *re = data;
|
||||
|
||||
// TODO: Add support for surfaceless pbuffers (EGL_NO_TEXTURE)
|
||||
// TODO: Add support for EGL_MIPMAP_TEXTURE??? (GLX doesn't support them)
|
||||
|
@ -622,10 +622,15 @@ evgl_eng_pbuffer_surface_create(void *data, EVGL_Surface *sfc,
|
|||
EGLSurface egl_sfc;
|
||||
EGLConfig egl_cfg;
|
||||
int num_config, i = 0;
|
||||
EGLDisplay disp;
|
||||
EGLContext ctx;
|
||||
|
||||
if (attrib_list)
|
||||
WRN("This PBuffer implementation does not support extra attributes yet");
|
||||
|
||||
disp = re->window_egl_display_get(re->software.ob);
|
||||
ctx = re->window_gl_context_get(re->software.ob);
|
||||
|
||||
#if 0
|
||||
// Choose framebuffer configuration
|
||||
// DISABLED FOR NOW
|
||||
|
@ -676,14 +681,14 @@ evgl_eng_pbuffer_surface_create(void *data, EVGL_Surface *sfc,
|
|||
config_attrs[i++] = EGL_CONFIG_ID;
|
||||
config_attrs[i++] = 0;
|
||||
config_attrs[i++] = EGL_NONE;
|
||||
eglQueryContext(re->win->egl_disp, re->win->egl_context[0], EGL_CONFIG_ID, &config_attrs[1]);
|
||||
eglQueryContext(disp, ctx, EGL_CONFIG_ID, &config_attrs[1]);
|
||||
#endif
|
||||
|
||||
if (!eglChooseConfig(re->win->egl_disp, config_attrs, &egl_cfg, 1, &num_config)
|
||||
if (!eglChooseConfig(disp, config_attrs, &egl_cfg, 1, &num_config)
|
||||
|| (num_config < 1))
|
||||
{
|
||||
int err = eglGetError();
|
||||
_evgl_error_set(err - EGL_SUCCESS);
|
||||
glsym_evas_gl_common_error_set(data, err - EGL_SUCCESS);
|
||||
ERR("eglChooseConfig failed with error %x", err);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -710,11 +715,11 @@ evgl_eng_pbuffer_surface_create(void *data, EVGL_Surface *sfc,
|
|||
#endif
|
||||
surface_attrs[i++] = EGL_NONE;
|
||||
|
||||
egl_sfc = eglCreatePbufferSurface(re->win->egl_disp, egl_cfg, surface_attrs);
|
||||
egl_sfc = eglCreatePbufferSurface(disp, egl_cfg, surface_attrs);
|
||||
if (!egl_sfc)
|
||||
{
|
||||
int err = eglGetError();
|
||||
_evgl_error_set(err - EGL_SUCCESS);
|
||||
glsym_evas_gl_common_error_set(data, err - EGL_SUCCESS);
|
||||
ERR("eglCreatePbufferSurface failed with error %x", err);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -54,14 +54,14 @@ error:
|
|||
}
|
||||
|
||||
static inline Outbuf *
|
||||
tls_outbuf_get(void)
|
||||
_tls_outbuf_get(void)
|
||||
{
|
||||
if (!initted) eng_init();
|
||||
return eina_tls_get(_outbuf_key);
|
||||
}
|
||||
|
||||
static inline Eina_Bool
|
||||
_tls_Outbuf_set(Outbuf *xwin)
|
||||
_tls_outbuf_set(Outbuf *xwin)
|
||||
{
|
||||
if (!initted) eng_init();
|
||||
return eina_tls_set(_outbuf_key, xwin);
|
||||
|
@ -496,9 +496,9 @@ eng_window_free(Outbuf *gw)
|
|||
eng_window_use(gw);
|
||||
|
||||
context = _tls_context_get();
|
||||
xwin = tls_outbuf_get();
|
||||
xwin = _tls_outbuf_get();
|
||||
|
||||
if (gw == xwin) _tls_Outbuf_set(NULL);
|
||||
if (gw == xwin) _tls_outbuf_set(NULL);
|
||||
if (gw->gl_context)
|
||||
{
|
||||
ref = gw->gl_context->references - 1;
|
||||
|
@ -600,7 +600,7 @@ eng_window_use(Outbuf *gw)
|
|||
Eina_Bool force_use = EINA_FALSE;
|
||||
Outbuf *xwin;
|
||||
|
||||
xwin = tls_outbuf_get();
|
||||
xwin = _tls_outbuf_get();
|
||||
|
||||
glsym_evas_gl_preload_render_lock(eng_window_make_current, gw);
|
||||
#ifdef GL_GLES
|
||||
|
@ -609,11 +609,15 @@ eng_window_use(Outbuf *gw)
|
|||
if ((eglGetCurrentDisplay() !=
|
||||
xwin->egl_disp) ||
|
||||
(eglGetCurrentContext() !=
|
||||
xwin->egl_context[0]) ||
|
||||
(eglGetCurrentSurface(EGL_READ) !=
|
||||
xwin->egl_surface[xwin->offscreen]) ||
|
||||
(eglGetCurrentSurface(EGL_DRAW) !=
|
||||
xwin->egl_surface[xwin->offscreen]))
|
||||
xwin->egl_context[0])
|
||||
#if 0
|
||||
// FIXME: Figure out what that offscreen thing was about...
|
||||
|| (eglGetCurrentSurface(EGL_READ) !=
|
||||
xwin->egl_surface[xwin->offscreen])
|
||||
|| (eglGetCurrentSurface(EGL_DRAW) !=
|
||||
xwin->egl_surface[xwin->offscreen])
|
||||
#endif
|
||||
)
|
||||
force_use = EINA_TRUE;
|
||||
}
|
||||
#else
|
||||
|
@ -630,7 +634,7 @@ eng_window_use(Outbuf *gw)
|
|||
glsym_evas_gl_common_context_use(xwin->gl_context);
|
||||
glsym_evas_gl_common_context_flush(xwin->gl_context);
|
||||
}
|
||||
_tls_Outbuf_set(gw);
|
||||
_tls_outbuf_set(gw);
|
||||
if (gw)
|
||||
{
|
||||
// EGL / GLES
|
||||
|
@ -679,9 +683,9 @@ eng_window_unsurf(Outbuf *gw)
|
|||
#ifdef GL_GLES
|
||||
Outbuf *xwin;
|
||||
|
||||
xwin = _tls_Outbuf_get();
|
||||
xwin = _tls_outbuf_get();
|
||||
if (xwin)
|
||||
evas_gl_common_context_flush(xwin->gl_context);
|
||||
glsym_evas_gl_common_context_flush(xwin->gl_context);
|
||||
if (xwin == gw)
|
||||
{
|
||||
eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||
|
@ -691,7 +695,7 @@ eng_window_unsurf(Outbuf *gw)
|
|||
if (gw->egl_surface[1] != EGL_NO_SURFACE)
|
||||
eglDestroySurface(gw->egl_disp, gw->egl_surface[1]);
|
||||
gw->egl_surface[1] = EGL_NO_SURFACE;
|
||||
_tls_Outbuf_set(NULL);
|
||||
_tls_outbuf_set(NULL);
|
||||
}
|
||||
#else
|
||||
if (gw->glxwin)
|
||||
|
|
Loading…
Reference in New Issue