static bool gfx_ctx_emscripten_init(void *data) { (void)data; EGLint width; EGLint height; RARCH_LOG("[EMSCRIPTEN/EGL]: Initializing...\n"); if (g_inited) { RARCH_LOG("[EMSCRIPTEN/EGL]: Attempted to re-initialize driver.\n"); return true; } EGLint num_config; static const EGLint attribute_list[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE }; static const EGLint context_attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; // get an EGL display connection g_egl_dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); if (!g_egl_dpy) goto error; // initialize the EGL display connection if (!eglInitialize(g_egl_dpy, NULL, NULL)) goto error; // get an appropriate EGL frame buffer configuration if (!eglChooseConfig(g_egl_dpy, attribute_list, &g_config, 1, &num_config)) goto error; // create an EGL rendering context g_egl_ctx = eglCreateContext(g_egl_dpy, g_config, EGL_NO_CONTEXT, context_attributes); if (!g_egl_ctx) goto error; // create an EGL window surface g_egl_surf = eglCreateWindowSurface(g_egl_dpy, g_config, 0, NULL); if (!g_egl_surf) goto error; // connect the context to the surface if (!eglMakeCurrent(g_egl_dpy, g_egl_surf, g_egl_surf, g_egl_ctx)) goto error; eglQuerySurface(g_egl_dpy, g_egl_surf, EGL_WIDTH, &width); eglQuerySurface(g_egl_dpy, g_egl_surf, EGL_HEIGHT, &height); g_fb_width = width; g_fb_height = height; RARCH_LOG("[EMSCRIPTEN/EGL]: Dimensions: %ux%u\n", width, height); return true; error: gfx_ctx_emscripten_destroy(data); return false; }
static void *gfx_ctx_emscripten_init(void *video_driver) { #ifdef HAVE_EGL unsigned width, height; EGLint major, minor; EGLint n; static const EGLint attribute_list[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE }; static const EGLint context_attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; #endif emscripten_ctx_data_t *emscripten = (emscripten_ctx_data_t*) calloc(1, sizeof(*emscripten)); if (!emscripten) return NULL; (void)video_driver; #ifdef HAVE_EGL if (g_egl_inited) { RARCH_LOG("[EMSCRIPTEN/EGL]: Attempted to re-initialize driver.\n"); return (void*)"emscripten"; } if (!egl_init_context(&emscripten->egl, EGL_DEFAULT_DISPLAY, &major, &minor, &n, attribute_list)) { egl_report_error(); goto error; } if (!egl_create_context(&emscripten->egl, context_attributes)) { egl_report_error(); goto error; } if (!egl_create_surface(&emscripten->egl, 0)) goto error; egl_get_video_size(&emscripten->egl, &width, &height); emscripten->fb_width = width; emscripten->fb_height = height; RARCH_LOG("[EMSCRIPTEN/EGL]: Dimensions: %ux%u\n", width, height); #endif return emscripten; error: gfx_ctx_emscripten_destroy(video_driver); return NULL; }