static int evgl_eng_make_current(void *data, void *surface, void *context, int flush) { Render_Engine *re; EGLContext ctx; EGLSurface sfc; EGLDisplay dpy; int ret = 0; re = (Render_Engine *)data; if (!re) { ERR("Invalid Render Engine Data!"); return 0; } dpy = eng_get_ob(re)->egl.disp; ctx = (EGLContext)context; sfc = (EGLSurface)surface; if ((!context) && (!surface)) { ret = eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (!ret) { ERR("eglMakeCurrent() failed! Error Code=%#x", eglGetError()); return 0; } return 1; } if ((eglGetCurrentContext() != ctx) || (eglGetCurrentSurface(EGL_READ) != sfc) || (eglGetCurrentSurface(EGL_DRAW) != sfc) ) { if (flush) evas_outbuf_use(NULL); ret = eglMakeCurrent(dpy, sfc, sfc, ctx); if (!ret) { ERR("eglMakeCurrent() failed! Error Code=%#x", eglGetError()); return 0; } } return 1; }
static void * eng_output_setup(void *engine, void *in, unsigned int w, unsigned int h) { Evas_Engine_Info_Eglfs *info = in; Render_Engine *re = NULL; Outbuf *ob = NULL; Render_Output_Swap_Mode swap_mode; swap_mode = evas_render_engine_gl_swap_mode_get(info->info.swap_mode); if (!initted) { glsym_evas_gl_preload_init(); } if (!(re = calloc(1, sizeof(Render_Engine)))) return NULL; /* try to create new outbuf */ ob = evas_outbuf_new(info, w, h, swap_mode); if (!ob) goto on_error; ob->evas = evas; if (!evas_render_engine_gl_generic_init(engine, &re->generic, ob, evas_outbuf_buffer_state_get, evas_outbuf_rot_get, evas_outbuf_reconfigure, evas_outbuf_update_region_first_rect, NULL, evas_outbuf_update_region_new, evas_outbuf_update_region_push, NULL, NULL, evas_outbuf_flush, NULL, evas_outbuf_free, evas_outbuf_use, evas_outbuf_gl_context_get, evas_outbuf_egl_display_get, evas_outbuf_gl_context_new, evas_outbuf_gl_context_use, &evgl_funcs, ob->w, ob->h)) goto on_error; gl_wins++; evas_render_engine_software_generic_merge_mode_set(&re->generic.software); evas_outbuf_use(eng_get_ob(re)); if (!initted) { gl_extn_veto(re); initted = EINA_TRUE; } return re; on_error: /* free outbuf */ evas_outbuf_free(ob); free(re); return NULL; }