static bool gfx_ctx_vivante_init(void *data) { EGLint num_config; EGLint egl_version_major, egl_version_minor; EGLint format; struct sigaction sa = {{0}}; static const EGLint attribs[] = { #if 0 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, #endif EGL_BLUE_SIZE, 5, EGL_GREEN_SIZE, 6, EGL_RED_SIZE, 5, EGL_ALPHA_SIZE, 0, EGL_SAMPLES, 0, EGL_NONE }; (void)data; sa.sa_handler = sighandler; sa.sa_flags = SA_RESTART; sigemptyset(&sa.sa_mask); sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); RARCH_LOG("[Vivante fbdev]: Initializing context\n"); if ((g_egl_dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY) { RARCH_ERR("[Vivante fbdev]: eglGetDisplay failed.\n"); goto error; } if (!eglInitialize(g_egl_dpy, &egl_version_major, &egl_version_minor)) { RARCH_ERR("[Vivante fbdev]: eglInitialize failed.\n"); goto error; } RARCH_LOG("[Vivante fbdev]: EGL version: %d.%d\n", egl_version_major, egl_version_minor); if (!eglChooseConfig(g_egl_dpy, attribs, &g_egl_config, 1, &num_config)) { RARCH_ERR("[Vivante fbdev]: eglChooseConfig failed.\n"); goto error; } return true; error: RARCH_ERR("[Vivante fbdev]: EGL error: %d.\n", eglGetError()); gfx_ctx_vivante_destroy(data); return false; }
static bool gfx_ctx_vivante_set_video_mode(void *data, unsigned width, unsigned height, bool fullscreen) { EGLNativeWindowType window; static const EGLint attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, /* Use version 2, even for GLES3. */ EGL_NONE }; /* Pick some arbitrary default. */ if (!width || !fullscreen) width = 1280; if (!height || !fullscreen) height = 1024; g_width = width; g_height = height; window = fbCreateWindow(fbGetDisplayByIndex(0), 0, 0, 0, 0); g_egl_surf = eglCreateWindowSurface(g_egl_dpy, g_egl_config, window, 0); if (g_egl_surf == EGL_NO_SURFACE) { RARCH_ERR("eglCreateWindowSurface failed.\n"); goto error; } g_egl_ctx = eglCreateContext(g_egl_dpy, g_egl_config, 0, attribs); if (g_egl_ctx == EGL_NO_CONTEXT) { RARCH_ERR("eglCreateContext failed.\n"); goto error; } if (!eglMakeCurrent(g_egl_dpy, g_egl_surf, g_egl_surf, g_egl_ctx)) { RARCH_ERR("eglMakeCurrent failed.\n"); goto error; } return true; error: RARCH_ERR("[Vivante fbdev]: EGL error: %d.\n", eglGetError()); gfx_ctx_vivante_destroy(data); return false; }
static void *gfx_ctx_vivante_init(void *video_driver) { #ifdef HAVE_EGL EGLint n; EGLint major, minor; EGLint format; static const EGLint attribs[] = { #if 0 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, #endif EGL_BLUE_SIZE, 5, EGL_GREEN_SIZE, 6, EGL_RED_SIZE, 5, EGL_ALPHA_SIZE, 0, EGL_SAMPLES, 0, EGL_NONE }; #endif vivante_ctx_data_t *viv = (vivante_ctx_data_t*)calloc(1, sizeof(*viv)); if (!viv) return NULL; #ifdef HAVE_EGL frontend_driver_install_signal_handler(); #endif /* Disable cursor blinking so it's not visible in RetroArch. */ system("setterm -cursor off"); #ifdef HAVE_EGL if (!egl_init_context(&viv->egl, EGL_DEFAULT_DISPLAY, &major, &minor, &n, attribs)) { egl_report_error(); goto error; } #endif return viv; error: RARCH_ERR("[Vivante fbdev]: EGL error: %d.\n", eglGetError()); gfx_ctx_vivante_destroy(viv); return NULL; }
static bool gfx_ctx_vivante_set_video_mode(void *data, video_frame_info_t *video_info, unsigned width, unsigned height, bool fullscreen) { #ifdef HAVE_EGL static const EGLint attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, /* Use version 2, even for GLES3. */ EGL_NONE }; #endif vivante_ctx_data_t *viv = (vivante_ctx_data_t*)data; /* Pick some arbitrary default. */ if (!width || !fullscreen) width = 1280; if (!height || !fullscreen) height = 1024; viv->width = width; viv->height = height; #ifdef HAVE_EGL if (!egl_create_context(&viv->egl, attribs)) { egl_report_error(); goto error; } #endif viv->native_window = fbCreateWindow(fbGetDisplayByIndex(0), 0, 0, 0, 0); #ifdef HAVE_EGL if (!egl_create_surface(&viv->egl, viv->native_window)) goto error; #endif return true; error: RARCH_ERR("[Vivante fbdev]: EGL error: %d.\n", eglGetError()); gfx_ctx_vivante_destroy(data); return false; }