static bool gfx_ctx_mali_fbdev_set_video_mode(void *data, unsigned width, unsigned height, bool fullscreen) { struct fb_var_screeninfo vinfo; static const EGLint attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, /* Use version 2, even for GLES3. */ EGL_NONE }; mali_ctx_data_t *mali = (mali_ctx_data_t*)data; RFILE *fd = retro_fopen("/dev/fb0", RFILE_MODE_READ_WRITE, -1); int fb = retro_get_fd(fd); if (ioctl(fb, FBIOGET_VSCREENINFO, &vinfo) < 0) { RARCH_ERR("Error obtaining framebuffer info.\n"); goto error; } retro_fclose(fd); width = vinfo.xres; height = vinfo.yres; mali->width = width; mali->height = height; mali->native_window.width = vinfo.xres; mali->native_window.height = vinfo.yres; if (!egl_create_context(mali, attribs)) { egl_report_error(); goto error; } if (!egl_create_surface(mali, &mali->native_window)) goto error; return true; error: if (fd) retro_fclose(fd); RARCH_ERR("[Mali fbdev]: EGL error: %d.\n", eglGetError()); gfx_ctx_mali_fbdev_destroy(data); return false; }
static void gfx_ctx_mali_fbdev_destroy(void *data) { int fb; RFILE *fd; mali_ctx_data_t *mali = (mali_ctx_data_t*)data; if (mali) { egl_destroy(data); mali->resize = false; free(mali); } /* Clear framebuffer and set cursor on again */ fd = retro_fopen("/dev/tty", RFILE_MODE_READ_WRITE, -1); fb = retro_get_fd(fd); ioctl(fb, VT_ACTIVATE,5); ioctl(fb, VT_ACTIVATE,1); retro_fclose(fd); system("setterm -cursor on"); }
static void *gfx_ctx_drm_init(void *video_driver) { int fd, i; unsigned monitor_index; unsigned gpu_index = 0; const char *gpu = NULL; struct string_list *gpu_descriptors = NULL; gfx_ctx_drm_data_t *drm = (gfx_ctx_drm_data_t*) calloc(1, sizeof(gfx_ctx_drm_data_t)); if (!drm) return NULL; fd = -1; gpu_descriptors = dir_list_new("/dev/dri", NULL, false, false); nextgpu: drm_restore_crtc(); free_drm_resources(drm); if (!gpu_descriptors || gpu_index == gpu_descriptors->size) { RARCH_ERR("[KMS]: Couldn't find a suitable DRM device.\n"); goto error; } gpu = gpu_descriptors->elems[gpu_index++].data; drm->drm = retro_fopen(gpu, RFILE_MODE_READ_WRITE, -1); if (!drm->drm) { RARCH_WARN("[KMS]: Couldn't open DRM device.\n"); goto nextgpu; } fd = retro_get_fd(drm->drm); if (!drm_get_resources(fd)) goto nextgpu; if (!drm_get_connector(fd)) goto nextgpu; if (!drm_get_encoder(fd)) goto nextgpu; drm_setup(fd); /* First mode is assumed to be the "optimal" * one for get_video_size() purposes. */ drm->fb_width = g_drm_connector->modes[0].hdisplay; drm->fb_height = g_drm_connector->modes[0].vdisplay; g_gbm_dev = gbm_create_device(fd); if (!g_gbm_dev) { RARCH_WARN("[KMS]: Couldn't create GBM device.\n"); goto nextgpu; } dir_list_free(gpu_descriptors); /* Setup the flip handler. */ g_drm_fds.fd = fd; g_drm_fds.events = POLLIN; g_drm_evctx.version = DRM_EVENT_CONTEXT_VERSION; g_drm_evctx.page_flip_handler = drm_flip_handler; g_drm_fd = fd; return drm; error: dir_list_free(gpu_descriptors); gfx_ctx_drm_destroy_resources(drm); if (drm) free(drm); return NULL; }