rserr_t RF_SetMode( int x, int y, int width, int height, int displayFrequency, bool fullScreen, bool stereo, bool borderless ) { rserr_t err; if( glConfig.width == width && glConfig.height == height && glConfig.fullScreen != fullScreen ) { return GLimp_SetFullscreenMode( displayFrequency, fullScreen ); } RF_AdapterShutdown( &rrf.adapter ); err = R_SetMode( x, y, width, height, displayFrequency, fullScreen, stereo, borderless ); if( err != rserr_ok ) { return err; } rrf.frameId = 0; rrf.frameNum = rrf.lastFrameNum = 0; if( !rrf.frame ) { if( glConfig.multithreading ) { int i; for( i = 0; i < 3; i++ ) rrf.frames[i] = RF_CreateCmdBuf( false ); } else { rrf.frame = RF_CreateCmdBuf( true ); } } if( glConfig.multithreading ) { rrf.frame = rrf.frames[0]; } rrf.frame->Clear( rrf.frame ); memset( rrf.customColors, 255, sizeof( rrf.customColors ) ); rrf.adapter.owner = (void *)&rrf; if( RF_AdapterInit( &rrf.adapter ) != true ) { return rserr_unknown; } return rserr_ok; }
bool Rimp_Init (void) { SDL_version version; int attrValue; Com_Printf("\n------- video initialization -------\n"); OBJZERO(r_sdl_config); if (r_driver->string[0] != '\0') { Com_Printf("using driver: %s\n", r_driver->string); SDL_GL_LoadLibrary(r_driver->string); } Sys_Setenv("SDL_VIDEO_CENTERED", "1"); Sys_Setenv("SDL_VIDEO_ALLOW_SCREENSAVER", "0"); if (SDL_WasInit(SDL_INIT_VIDEO) == 0) { if (SDL_Init(SDL_INIT_VIDEO) < 0) Com_Error(ERR_FATAL, "Video SDL_Init failed: %s", SDL_GetError()); } SDL_VERSION(&version) Com_Printf("SDL version: %i.%i.%i\n", version.major, version.minor, version.patch); #if SDL_VERSION_ATLEAST(2,0,0) int screen = 0; const int modes = SDL_GetNumDisplayModes(screen); if (modes > 0) { r_sdl_config.modes = Mem_AllocTypeN(rect_t, modes); for (int i = 0; i < modes; i++) { SDL_DisplayMode displayMode; SDL_GetDisplayMode(screen, i, &displayMode); r_sdl_config.modes[i][0] = displayMode.w; r_sdl_config.modes[i][1] = displayMode.h; } } #else const SDL_VideoInfo* info = SDL_GetVideoInfo(); if (info != nullptr) { SDL_VideoInfo videoInfo; SDL_PixelFormat pixelFormat; SDL_Rect** modes; Com_Printf("I: desktop depth: %ibpp\n", info->vfmt->BitsPerPixel); r_config.videoMemory = info->video_mem; Com_Printf("I: video memory: %i\n", r_config.videoMemory); memcpy(&pixelFormat, info->vfmt, sizeof(pixelFormat)); memcpy(&videoInfo, info, sizeof(videoInfo)); videoInfo.vfmt = &pixelFormat; modes = SDL_ListModes(videoInfo.vfmt, SDL_OPENGL | SDL_FULLSCREEN); if (modes) { if (modes == (SDL_Rect**)-1) { Com_Printf("I: Available resolutions: any resolution is supported\n"); r_sdl_config.modes = nullptr; } else { for (r_sdl_config.numModes = 0; modes[r_sdl_config.numModes]; r_sdl_config.numModes++) {} r_sdl_config.modes = Mem_AllocTypeN(rect_t, r_sdl_config.numModes); for (int i = 0; i < r_sdl_config.numModes; i++) { r_sdl_config.modes[i][0] = modes[i]->w; r_sdl_config.modes[i][1] = modes[i]->h; } } } else { Com_Printf("I: Could not get list of available resolutions\n"); } } char videoDriverName[MAX_VAR] = ""; SDL_VideoDriverName(videoDriverName, sizeof(videoDriverName)); Com_Printf("I: video driver: %s\n", videoDriverName); #endif if (r_sdl_config.numModes > 0) { char buf[4096] = ""; Q_strcat(buf, sizeof(buf), "I: Available resolutions:"); for (int i = 0; i < r_sdl_config.numModes; i++) { Q_strcat(buf, sizeof(buf), " %ix%i", r_sdl_config.modes[i][0], r_sdl_config.modes[i][1]); } Com_Printf("%s (%i)\n", buf, r_sdl_config.numModes); } if (!R_SetMode()) Com_Error(ERR_FATAL, "Video subsystem failed to initialize"); #if !SDL_VERSION_ATLEAST(2,0,0) SDL_WM_SetCaption(GAME_TITLE, GAME_TITLE_LONG); /* we need this in the renderer because if we issue an vid_restart we have * to set these values again, too */ SDL_EnableUNICODE(SDL_ENABLE); SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); #endif R_SetSDLIcon(); if (!SDL_GL_GetAttribute(SDL_GL_STENCIL_SIZE, &attrValue)) Com_Printf("I: got %d bits of stencil\n", attrValue); if (!SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &attrValue)) Com_Printf("I: got %d bits of depth buffer\n", attrValue); if (!SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &attrValue)) Com_Printf("I: got double buffer\n"); if (!SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &attrValue)) Com_Printf("I: got %d bits for red\n", attrValue); if (!SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &attrValue)) Com_Printf("I: got %d bits for green\n", attrValue); if (!SDL_GL_GetAttribute(SDL_GL_BLUE_SIZE, &attrValue)) Com_Printf("I: got %d bits for blue\n", attrValue); if (!SDL_GL_GetAttribute(SDL_GL_ALPHA_SIZE, &attrValue)) Com_Printf("I: got %d bits for alpha\n", attrValue); if (!SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &attrValue)) Com_Printf("I: got multisample %s\n", attrValue != 0 ? "enabled" : "disabled"); if (!SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &attrValue)) Com_Printf("I: got %d multisample buffers\n", attrValue); return true; }