int N3DS_VideoInit(_THIS) { SDL_VideoDisplay display; SDL_DisplayMode current_mode; SDL_zero(current_mode); current_mode.w = 400; current_mode.h = 240; 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; display.driverdata = NULL; SDL_AddVideoDisplay(&display); return 1; }
static SDL_bool WIN_AddDisplay(LPTSTR DeviceName) { SDL_VideoDisplay display; SDL_DisplayData *displaydata; SDL_DisplayMode mode; #ifdef DEBUG_MODES printf("Display: %s\n", WIN_StringToUTF8(DeviceName)); #endif if (!WIN_GetDisplayMode(DeviceName, ENUM_CURRENT_SETTINGS, &mode)) { return SDL_FALSE; } displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata)); if (!displaydata) { return SDL_FALSE; } SDL_memcpy(displaydata->DeviceName, DeviceName, sizeof(displaydata->DeviceName)); SDL_zero(display); display.desktop_mode = mode; display.current_mode = mode; display.driverdata = displaydata; SDL_AddVideoDisplay(&display); return SDL_TRUE; }
static SDL_bool WIN_AddDisplay(_THIS, LPTSTR DeviceName) { SDL_VideoDisplay display; SDL_DisplayData *displaydata; SDL_DisplayMode mode; DISPLAY_DEVICE device; #ifdef DEBUG_MODES printf("Display: %s\n", WIN_StringToUTF8(DeviceName)); #endif if (!WIN_GetDisplayMode(_this, DeviceName, ENUM_CURRENT_SETTINGS, &mode)) { return SDL_FALSE; } displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata)); if (!displaydata) { return SDL_FALSE; } SDL_memcpy(displaydata->DeviceName, DeviceName, sizeof(displaydata->DeviceName)); SDL_zero(display); device.cb = sizeof(device); if (EnumDisplayDevices(DeviceName, 0, &device, 0)) { display.name = WIN_StringToUTF8(device.DeviceString); } display.desktop_mode = mode; display.current_mode = mode; display.driverdata = displaydata; SDL_AddVideoDisplay(&display); SDL_free(display.name); return SDL_TRUE; }
int PND_videoinit(_THIS) { SDL_VideoDisplay display; SDL_DisplayMode current_mode; SDL_zero(current_mode); #ifdef WIZ_GLES_LITE current_mode.w = 320; current_mode.h = 240; #else current_mode.w = 800; current_mode.h = 480; #endif current_mode.refresh_rate = 60; current_mode.format = SDL_PIXELFORMAT_RGB565; current_mode.driverdata = NULL; SDL_zero(display); display.desktop_mode = current_mode; display.current_mode = current_mode; display.driverdata = NULL; SDL_AddVideoDisplay(&display); return 1; }
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; }
static void display_handle_done(void *data, struct wl_output *output) { SDL_VideoDisplay *display = data; SDL_AddVideoDisplay(display); SDL_free(display->name); SDL_free(display); }
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; }
static int VIVANTE_AddVideoDisplays(_THIS) { SDL_VideoData *videodata = _this->driverdata; SDL_VideoDisplay display; SDL_DisplayMode current_mode; SDL_DisplayData *data; int pitch = 0, bpp = 0; unsigned long pixels = 0; data = (SDL_DisplayData *) SDL_calloc(1, sizeof(SDL_DisplayData)); if (data == NULL) { return SDL_OutOfMemory(); } SDL_zero(current_mode); #if SDL_VIDEO_DRIVER_VIVANTE_VDK data->native_display = vdkGetDisplay(videodata->vdk_private); vdkGetDisplayInfo(data->native_display, ¤t_mode.w, ¤t_mode.h, &pixels, &pitch, &bpp); #else data->native_display = videodata->fbGetDisplayByIndex(0); videodata->fbGetDisplayInfo(data->native_display, ¤t_mode.w, ¤t_mode.h, &pixels, &pitch, &bpp); #endif /* SDL_VIDEO_DRIVER_VIVANTE_VDK */ switch (bpp) { default: /* Is another format used? */ case 32: current_mode.format = SDL_PIXELFORMAT_ARGB8888; break; case 16: current_mode.format = SDL_PIXELFORMAT_RGB565; break; } /* FIXME: How do we query refresh rate? */ current_mode.refresh_rate = 60; SDL_zero(display); display.name = VIVANTE_GetDisplayName(_this); display.desktop_mode = current_mode; display.current_mode = current_mode; display.driverdata = data; SDL_AddVideoDisplay(&display); return 0; }
int ANDROID_VideoInit(_THIS) { SDL_VideoDisplay display; SDL_DisplayMode mode; mode.w = SDL_ANDROID_sWindowWidth; mode.h = SDL_ANDROID_sWindowHeight; mode.refresh_rate = 0; mode.format = SDL_PIXELFORMAT_RGB565; mode.driverdata = NULL; SDL_zero(display); display.desktop_mode = mode; display.current_mode = mode; display.driverdata = NULL; SDL_AddVideoDisplay(&display); return 0; }
static int NDS_VideoInit(_THIS) { SDL_VideoDisplay display; SDL_DisplayMode mode; SDL_zero(mode); mode.format = SDL_PIXELFORMAT_UNKNOWN; // should be SDL_PIXELFORMAT_ABGR1555; mode.w = SCREEN_WIDTH; mode.h = 2*SCREEN_HEIGHT+SCREEN_GAP; mode.refresh_rate = 60; SDL_zero(display); display.desktop_mode = mode; SDL_AddVideoDisplay(&display); return 0; }
static SDL_bool WIN_AddDisplay(LPTSTR DeviceName) { SDL_VideoDisplay display; SDL_DisplayData *displaydata; SDL_DisplayMode mode; #ifdef DEBUG_MODES printf("Display: %s\n", WIN_StringToUTF8(DeviceName)); #endif #if _MSC_VER == 1200 if (!WIN_GetDisplayMode(NULL, ENUM_CURRENT_SETTINGS, &mode)) { #else if (!WIN_GetDisplayMode(DeviceName, ENUM_CURRENT_SETTINGS, &mode)) { #endif return SDL_FALSE; } displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata)); if (!displaydata) { return SDL_FALSE; } SDL_memcpy(displaydata->DeviceName, DeviceName, sizeof(displaydata->DeviceName)); SDL_zero(display); display.desktop_mode = mode; display.current_mode = mode; display.driverdata = displaydata; SDL_AddVideoDisplay(&display); return SDL_TRUE; } int WIN_InitModes(_THIS) { DWORD i, j, count; DISPLAY_DEVICE device; #if _MSC_VER == 1200 WIN_AddDisplay("\\\\.\\DISPLAY1"); #else device.cb = sizeof(device); for (i = 0;; ++i) { TCHAR DeviceName[32] = {0}; if (!EnumDisplayDevices(NULL, i, &device, 0)) { break; } if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) { continue; } SDL_memcpy(DeviceName, device.DeviceName, sizeof(DeviceName)); #ifdef DEBUG_MODES printf("Device: %s\n", WIN_StringToUTF8(DeviceName)); #endif count = 0; for (j = 0;; ++j) { if (!EnumDisplayDevices(DeviceName, j, &device, 0)) { break; } if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) { continue; } count += WIN_AddDisplay(device.DeviceName); } if (count == 0) { WIN_AddDisplay(DeviceName); } } #endif if (_this->num_displays == 0) { SDL_SetError("No displays available"); return -1; } return 0; }
void DirectFB_InitModes(_THIS) { SDL_DFB_DEVICEDATA(_this); IDirectFBDisplayLayer *layer = NULL; SDL_VideoDisplay display; DFB_DisplayData *dispdata = NULL; SDL_DisplayMode mode; DFBGraphicsDeviceDescription caps; DFBDisplayLayerConfig dlc; struct screen_callback_t *screencbdata; int tcw[DFB_MAX_SCREENS]; int tch[DFB_MAX_SCREENS]; int i; DFBResult ret; SDL_DFB_ALLOC_CLEAR(screencbdata, sizeof(*screencbdata)); screencbdata->numscreens = 0; for (i = 0; i < DFB_MAX_SCREENS; i++) { screencbdata->gralayer[i] = -1; screencbdata->vidlayer[i] = -1; } SDL_DFB_CHECKERR(devdata->dfb->EnumScreens(devdata->dfb, &EnumScreensCallback, screencbdata)); for (i = 0; i < screencbdata->numscreens; i++) { IDirectFBScreen *screen; SDL_DFB_CHECKERR(devdata->dfb->GetScreen(devdata->dfb, screencbdata->screenid [i], &screen)); screencbdata->aux = i; SDL_DFB_CHECKERR(screen->EnumDisplayLayers(screen, &EnumLayersCallback, screencbdata)); screen->GetSize(screen, &tcw[i], &tch[i]); screen->Release(screen); } /* Query card capabilities */ devdata->dfb->GetDeviceDescription(devdata->dfb, &caps); for (i = 0; i < screencbdata->numscreens; i++) { SDL_DFB_CHECKERR(devdata->dfb->GetDisplayLayer(devdata->dfb, screencbdata->gralayer [i], &layer)); SDL_DFB_CHECKERR(layer->SetCooperativeLevel(layer, DLSCL_ADMINISTRATIVE)); layer->EnableCursor(layer, 1); SDL_DFB_CHECKERR(layer->SetCursorOpacity(layer, 0xC0)); if (devdata->use_yuv_underlays) { dlc.flags = DLCONF_PIXELFORMAT | DLCONF_OPTIONS; dlc.pixelformat = DSPF_ARGB; dlc.options = DLOP_ALPHACHANNEL; ret = layer->SetConfiguration(layer, &dlc); if (ret != DFB_OK) { /* try AiRGB if the previous failed */ dlc.pixelformat = DSPF_AiRGB; SDL_DFB_CHECKERR(layer->SetConfiguration(layer, &dlc)); } } /* Query layer configuration to determine the current mode and pixelformat */ dlc.flags = DLCONF_ALL; SDL_DFB_CHECKERR(layer->GetConfiguration(layer, &dlc)); mode.format = DirectFB_DFBToSDLPixelFormat(dlc.pixelformat); if (mode.format == SDL_PIXELFORMAT_UNKNOWN) { SDL_DFB_ERR("Unknown dfb pixelformat %x !\n", dlc.pixelformat); goto error; } mode.w = dlc.width; mode.h = dlc.height; mode.refresh_rate = 0; mode.driverdata = NULL; SDL_DFB_ALLOC_CLEAR(dispdata, sizeof(*dispdata)); dispdata->layer = layer; dispdata->pixelformat = dlc.pixelformat; dispdata->cw = tcw[i]; dispdata->ch = tch[i]; /* YUV - Video layer */ dispdata->vidID = screencbdata->vidlayer[i]; dispdata->vidIDinuse = 0; SDL_zero(display); display.desktop_mode = mode; display.current_mode = mode; display.driverdata = dispdata; #if (DFB_VERSION_ATLEAST(1,2,0)) dlc.flags = DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT | DLCONF_OPTIONS; ret = layer->SetConfiguration(layer, &dlc); #endif SDL_DFB_CHECKERR(layer->SetCooperativeLevel(layer, DLSCL_SHARED)); SDL_AddVideoDisplay(&display); } SDL_DFB_FREE(screencbdata); return; error: /* FIXME: Cleanup not complete, Free existing displays */ SDL_DFB_FREE(dispdata); SDL_DFB_RELEASE(layer); return; }
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; }