int FB_VideoInit(_THIS) { SDL_VideoDisplay display; SDL_DisplayMode current_mode; SDL_zero(current_mode); /* XXX: Hardcoded for now */ current_mode.w = 320; current_mode.h = 240; current_mode.refresh_rate = 60; current_mode.format = SDL_PIXELFORMAT_RGB565; SDL_zero(display); display.desktop_mode = current_mode; display.current_mode = current_mode; SDL_AddVideoDisplay(&display); #ifdef SDL_INPUT_LINUXEV SDL_EVDEV_Init(); #endif return 1; }
int VIVANTE_VideoInit(_THIS) { SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; #if SDL_VIDEO_DRIVER_VIVANTE_VDK videodata->vdk_private = vdkInitialize(); if (!videodata->vdk_private) { return SDL_SetError("vdkInitialize() failed"); } #else videodata->egl_handle = SDL_LoadObject("libEGL.so.1"); if (!videodata->egl_handle) { videodata->egl_handle = SDL_LoadObject("libEGL.so"); if (!videodata->egl_handle) { return -1; } } #define LOAD_FUNC(NAME) \ videodata->NAME = SDL_LoadFunction(videodata->egl_handle, #NAME); \ if (!videodata->NAME) return -1; LOAD_FUNC(fbGetDisplay); LOAD_FUNC(fbGetDisplayByIndex); LOAD_FUNC(fbGetDisplayGeometry); LOAD_FUNC(fbGetDisplayInfo); LOAD_FUNC(fbDestroyDisplay); LOAD_FUNC(fbCreateWindow); LOAD_FUNC(fbGetWindowGeometry); LOAD_FUNC(fbGetWindowInfo); LOAD_FUNC(fbDestroyWindow); #endif if (VIVANTE_SetupPlatform(_this) < 0) { return -1; } if (VIVANTE_AddVideoDisplays(_this) < 0) { return -1; } VIVANTE_UpdateDisplayScale(_this); #ifdef SDL_INPUT_LINUXEV if (SDL_EVDEV_Init() < 0) { return -1; } #endif return 0; }
int RPI_VideoInit(_THIS) { SDL_VideoDisplay display; SDL_DisplayMode current_mode; SDL_DisplayData *data; uint32_t w,h; /* Initialize BCM Host */ bcm_host_init(); SDL_zero(current_mode); if (graphics_get_display_size( 0, &w, &h) < 0) { return -1; } current_mode.w = w; current_mode.h = h; /* FIXME: Is there a way to tell the actual refresh rate? */ current_mode.refresh_rate = 60; /* 32 bpp for default */ current_mode.format = SDL_PIXELFORMAT_ABGR8888; current_mode.driverdata = NULL; SDL_zero(display); display.desktop_mode = current_mode; display.current_mode = current_mode; /* Allocate display internal data */ data = (SDL_DisplayData *) SDL_calloc(1, sizeof(SDL_DisplayData)); if (data == NULL) { return SDL_OutOfMemory(); } data->dispman_display = vc_dispmanx_display_open( 0 /* LCD */); display.driverdata = data; SDL_AddVideoDisplay(&display); #ifdef SDL_INPUT_LINUXEV SDL_EVDEV_Init(); #endif RPI_InitMouse(_this); return 1; }
int KMSDRM_VideoInit(_THIS) { int i; int ret = 0; char *devname; SDL_VideoData *vdata = ((SDL_VideoData *)_this->driverdata); drmModeRes *resources = NULL; drmModeConnector *connector = NULL; drmModeEncoder *encoder = NULL; SDL_DisplayMode current_mode; SDL_VideoDisplay display; /* Allocate display internal data */ SDL_DisplayData *data = (SDL_DisplayData *) SDL_calloc(1, sizeof(SDL_DisplayData)); if (data == NULL) { return SDL_OutOfMemory(); } SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "KMSDRM_VideoInit()"); /* Open /dev/dri/cardNN */ devname = (char *) SDL_calloc(1, 16); if (devname == NULL) { ret = SDL_OutOfMemory(); goto cleanup; } SDL_snprintf(devname, 16, "/dev/dri/card%d", vdata->devindex); vdata->drm_fd = open(devname, O_RDWR | O_CLOEXEC); SDL_free(devname); if (vdata->drm_fd < 0) { ret = SDL_SetError("Could not open /dev/dri/card%d.", vdata->devindex); goto cleanup; } SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "Opened DRM FD (%d)", vdata->drm_fd); vdata->gbm = KMSDRM_gbm_create_device(vdata->drm_fd); if (vdata->gbm == NULL) { ret = SDL_SetError("Couldn't create gbm device."); goto cleanup; } /* Find the first available connector with modes */ resources = KMSDRM_drmModeGetResources(vdata->drm_fd); if (!resources) { ret = SDL_SetError("drmModeGetResources(%d) failed", vdata->drm_fd); goto cleanup; } for (i = 0; i < resources->count_connectors; i++) { connector = KMSDRM_drmModeGetConnector(vdata->drm_fd, resources->connectors[i]); if (connector == NULL) continue; if (connector->connection == DRM_MODE_CONNECTED && connector->count_modes > 0) { SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "Found connector %d with %d modes.", connector->connector_id, connector->count_modes); vdata->saved_conn_id = connector->connector_id; break; } KMSDRM_drmModeFreeConnector(connector); connector = NULL; } if (i == resources->count_connectors) { ret = SDL_SetError("No currently active connector found."); goto cleanup; } for (i = 0; i < resources->count_encoders; i++) { encoder = KMSDRM_drmModeGetEncoder(vdata->drm_fd, resources->encoders[i]); if (encoder == NULL) continue; if (encoder->encoder_id == connector->encoder_id) { SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "Found encoder %d.", encoder->encoder_id); data->encoder_id = encoder->encoder_id; break; } KMSDRM_drmModeFreeEncoder(encoder); encoder = NULL; } if (i == resources->count_encoders) { ret = SDL_SetError("No connected encoder found."); goto cleanup; } vdata->saved_crtc = KMSDRM_drmModeGetCrtc(vdata->drm_fd, encoder->crtc_id); if (vdata->saved_crtc == NULL) { ret = SDL_SetError("No CRTC found."); goto cleanup; } SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "Saved crtc_id %u, fb_id %u, (%u,%u), %ux%u", vdata->saved_crtc->crtc_id, vdata->saved_crtc->buffer_id, vdata->saved_crtc->x, vdata->saved_crtc->y, vdata->saved_crtc->width, vdata->saved_crtc->height); data->crtc_id = encoder->crtc_id; data->cur_mode = vdata->saved_crtc->mode; vdata->crtc_id = encoder->crtc_id; SDL_zero(current_mode); current_mode.w = vdata->saved_crtc->mode.hdisplay; current_mode.h = vdata->saved_crtc->mode.vdisplay; current_mode.refresh_rate = vdata->saved_crtc->mode.vrefresh; /* FIXME ? drmModeFB *fb = drmModeGetFB(vdata->drm_fd, vdata->saved_crtc->buffer_id); current_mode.format = drmToSDLPixelFormat(fb->bpp, fb->depth); drmModeFreeFB(fb); */ current_mode.format = SDL_PIXELFORMAT_ARGB8888; current_mode.driverdata = NULL; SDL_zero(display); display.desktop_mode = current_mode; display.current_mode = current_mode; display.driverdata = data; /* SDL_VideoQuit will later SDL_free(display.driverdata) */ SDL_AddVideoDisplay(&display); /* Setup page flip handler */ vdata->drm_pollfd.fd = vdata->drm_fd; vdata->drm_pollfd.events = POLLIN; vdata->drm_evctx.version = DRM_EVENT_CONTEXT_VERSION; vdata->drm_evctx.page_flip_handler = KMSDRM_FlipHandler; #ifdef SDL_INPUT_LINUXEV SDL_EVDEV_Init(); #endif KMSDRM_InitMouse(_this); cleanup: if (encoder != NULL) KMSDRM_drmModeFreeEncoder(encoder); if (connector != NULL) KMSDRM_drmModeFreeConnector(connector); if (resources != NULL) KMSDRM_drmModeFreeResources(resources); if (ret != 0) { /* Error (complete) cleanup */ SDL_free(data); if(vdata->saved_crtc != NULL) { KMSDRM_drmModeFreeCrtc(vdata->saved_crtc); vdata->saved_crtc = NULL; } if (vdata->gbm != NULL) { KMSDRM_gbm_device_destroy(vdata->gbm); vdata->gbm = NULL; } if (vdata->drm_fd >= 0) { close(vdata->drm_fd); vdata->drm_fd = -1; } } return ret; }