static bool glwindow(char* title, int width, int height, int bits, bool fsflag,int frequency) { if ((SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1)) { handleerror(NULL,"Could not initialize SDL.","ERROR",MBF_OK|MBF_EXCL); return false; } // Sets window manager properties SDL_WM_SetIcon(SDL_LoadBMP("spring.bmp"),NULL); SDL_WM_SetCaption(title, title); int sdlflags = SDL_OPENGL | SDL_RESIZABLE; conditionally_set_flag(sdlflags, SDL_FULLSCREEN, fsflag); // FIXME: Might want to set color and depth sizes, too -- johannes SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); FSAA = MultisampleTest(); screen = SDL_SetVideoMode(width,height,bits,sdlflags); if (!screen) { handleerror(NULL,"Could not set video mode","ERROR",MBF_OK|MBF_EXCL); return false; } if (FSAA) FSAA = MultisampleVerify(); setupgl(); resizescene(screen->w,screen->h); return true; }
/** * @return whether setting the video mode was successful * * Sets SDL video mode options/settings */ bool SpringApp::SetSDLVideoMode () { int sdlflags = SDL_OPENGL | SDL_RESIZABLE; conditionally_set_flag(sdlflags, SDL_FULLSCREEN, fullscreen); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); #ifdef __APPLE__ const int defaultDepthSize = 32; #else const int defaultDepthSize = 16; #endif SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, configHandler.GetInt("DepthBufferBits", defaultDepthSize)); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); FSAA = MultisampleTest(); SDL_Surface *screen = SDL_SetVideoMode(screenWidth,screenHeight,0,sdlflags); if (!screen) { handleerror(NULL,"Could not set video mode","ERROR",MBF_OK|MBF_EXCL); return false; } if (FSAA) FSAA = MultisampleVerify(); return true; }
/** * @return whether setting the video mode was successful * * Sets SDL video mode options/settings */ bool SpringApp::SetSDLVideoMode () { int sdlflags = SDL_OPENGL | SDL_RESIZABLE; //conditionally_set_flag(sdlflags, SDL_FULLSCREEN, fullscreen); sdlflags |= fullscreen ? SDL_FULLSCREEN : 0; SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); #ifdef __APPLE__ const int defaultDepthSize = 32; #else const int defaultDepthSize = 16; #endif SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, configHandler.GetInt("DepthBufferBits", defaultDepthSize)); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, configHandler.GetInt("StencilBufferBits", 1)); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); FSAA = MultisampleTest(); SDL_Surface *screen = SDL_SetVideoMode(screenWidth, screenHeight, 0, sdlflags); if (!screen) { char buf[1024]; SNPRINTF(buf, sizeof(buf), "Could not set video mode:\n%s", SDL_GetError()); handleerror(NULL, buf, "ERROR", MBF_OK|MBF_EXCL); return false; } // Something in SDL_SetVideoMode (OpenGL drivers?) messes with the FPU control word. // Set single precision floating point math. streflop_init<streflop::Simple>(); if (FSAA) { FSAA = MultisampleVerify(); } // setup GL smoothing const int defaultSmooth = 0; // FSAA ? 0 : 3; // until a few things get fixed const int lineSmoothing = configHandler.GetInt("SmoothLines", defaultSmooth); if (lineSmoothing > 0) { GLenum hint = GL_FASTEST; if (lineSmoothing >= 3) { hint = GL_NICEST; } else if (lineSmoothing >= 2) { hint = GL_DONT_CARE; } glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, hint); } const int pointSmoothing = configHandler.GetInt("SmoothPoints", defaultSmooth); if (pointSmoothing > 0) { GLenum hint = GL_FASTEST; if (pointSmoothing >= 3) { hint = GL_NICEST; } else if (pointSmoothing >= 2) { hint = GL_DONT_CARE; } glEnable(GL_POINT_SMOOTH); glHint(GL_POINT_SMOOTH_HINT, hint); } SetVSync(); // there must be a way to see if this is necessary, compare old/new context pointers? if (!!configHandler.GetInt("FixAltTab", 0)) { // free GL resources GLContext::Free(); // initialize any GL resources that were lost GLContext::Init(); } // initialize the stencil glClearStencil(0); glClear(GL_STENCIL_BUFFER_BIT); SDL_GL_SwapBuffers(); glClear(GL_STENCIL_BUFFER_BIT); SDL_GL_SwapBuffers(); return true; }
/** * @brief Initializes the SpringApp instance * @return whether initialization was successful */ bool SpringApp::Initialize() { #if !(defined(WIN32) || defined(__APPLE__) || defined(HEADLESS)) //! this MUST run before any other X11 call (esp. those by SDL!) //! we need it to make calls to X11 threadsafe if (!XInitThreads()) { LOG_L(L_FATAL, "Xlib is not thread safe"); return false; } #endif #if defined(_WIN32) && defined(__GNUC__) // load QTCreator's gdb helper dll; a variant of this should also work on other OSes { // don't display a dialog box if gdb helpers aren't found UINT olderrors = SetErrorMode(SEM_FAILCRITICALERRORS); if (LoadLibrary("gdbmacros.dll")) { LOG("QT Creator's gdbmacros.dll loaded"); } SetErrorMode(olderrors); } #endif // Initialize class system creg::System::InitializeClasses(); // Initialize crash reporting CrashHandler::Install(); globalRendering = new CGlobalRendering(); ParseCmdLine(); CMyMath::Init(); good_fpu_control_registers("::Run"); Watchdog::Install(); //! register (this) mainthread Watchdog::RegisterThread(WDT_MAIN, true); // log OS version LOG("OS: %s", Platform::GetOS().c_str()); if (Platform::Is64Bit()) LOG("OS: 64bit native mode"); else if (Platform::Is32BitEmulation()) LOG("OS: emulated 32bit mode"); else LOG("OS: 32bit native mode"); FileSystemInitializer::Initialize(); UpdateOldConfigs(); if (!InitWindow(("Spring " + SpringVersion::GetSync()).c_str())) { SDL_Quit(); return false; } mouseInput = IMouseInput::GetInstance(); keyInput = KeyInput::GetInstance(); input.AddHandler(boost::bind(&SpringApp::MainEventHandler, this, _1)); // Global structures gs = new CGlobalSynced(); gu = new CGlobalUnsynced(); // Initialize GLEW LoadExtensions(); //! check if FSAA init worked fine if (globalRendering->FSAA && !MultisampleVerify()) globalRendering->FSAA = 0; InitOpenGL(); agui::InitGui(); LoadFonts(); globalRendering->PostInit(); // Initialize named texture handler CNamedTextures::Init(); // Initialize Lua GL LuaOpenGL::Init(); // Sound ISound::Initialize(); InitJoystick(); SetProcessAffinity(configHandler->GetInt("SetCoreAffinity")); // Create CGameSetup and CPreGame objects Startup(); return true; }
/** * Initializes OpenGL */ void SpringApp::InitOpenGL() { // reinit vsync VSync.Init(); // check if FSAA init worked fine if (globalRendering->FSAA && !MultisampleVerify()) globalRendering->FSAA = 0; // setup GL smoothing const int lineSmoothing = configHandler->GetInt("SmoothLines"); if (lineSmoothing > 0) { GLenum hint = GL_FASTEST; if (lineSmoothing >= 3) { hint = GL_NICEST; } else if (lineSmoothing >= 2) { hint = GL_DONT_CARE; } glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, hint); } const int pointSmoothing = configHandler->GetInt("SmoothPoints"); if (pointSmoothing > 0) { GLenum hint = GL_FASTEST; if (pointSmoothing >= 3) { hint = GL_NICEST; } else if (pointSmoothing >= 2) { hint = GL_DONT_CARE; } glEnable(GL_POINT_SMOOTH); glHint(GL_POINT_SMOOTH_HINT, hint); } // setup LOD bias factor const float lodBias = configHandler->GetFloat("TextureLODBias"); if (math::fabs(lodBias) > 0.01f) { glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, lodBias ); } //FIXME not needed anymore with SDL2? if (configHandler->GetBool("FixAltTab")) { // free GL resources GLContext::Free(); // initialize any GL resources that were lost GLContext::Init(); } // setup viewport SetupViewportGeometry(); glViewport(globalRendering->viewPosX, globalRendering->viewPosY, globalRendering->viewSizeX, globalRendering->viewSizeY); gluPerspective(45.0f, globalRendering->aspectRatio, 2.8f, CGlobalRendering::MAX_VIEW_RANGE); // Initialize some GL states glShadeModel(GL_SMOOTH); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); // Clear Window glClearColor(0.0f,0.0f,0.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); SDL_GL_SwapWindow(window); // Print Final Mode (call after SetupViewportGeometry, which updates viewSizeX/Y) SDL_DisplayMode dmode; SDL_GetWindowDisplayMode(window, &dmode); bool isBorderless = (SDL_GetWindowFlags(window) & SDL_WINDOW_BORDERLESS) != 0; LOG("[%s] video mode set to %ix%i:%ibit @%iHz %s", __FUNCTION__, globalRendering->viewSizeX, globalRendering->viewSizeY, SDL_BITSPERPIXEL(dmode.format), dmode.refresh_rate, globalRendering->fullScreen ? (isBorderless ? "(borderless)" : "") : "(windowed)"); }
/** * @brief Initializes the SpringApp instance * @return whether initialization was successful */ bool SpringApp::Initialize() { #if !(defined(WIN32) || defined(__APPLE__) || defined(HEADLESS)) //! this MUST run before any other X11 call (esp. those by SDL!) //! we need it to make calls to X11 threadsafe if (!XInitThreads()) { LOG_L(L_FATAL, "Xlib is not thread safe"); return false; } #endif #if defined(_WIN32) && defined(__GNUC__) // load QTCreator's gdb helper dll; a variant of this should also work on other OSes { // don't display a dialog box if gdb helpers aren't found UINT olderrors = SetErrorMode(SEM_FAILCRITICALERRORS); if (LoadLibrary("gdbmacros.dll")) { LOG("QT Creator's gdbmacros.dll loaded"); } SetErrorMode(olderrors); } #endif // Initialize class system creg::System::InitializeClasses(); // Initialize crash reporting CrashHandler::Install(); globalRendering = new CGlobalRendering(); ParseCmdLine(); CMyMath::Init(); good_fpu_control_registers("::Run"); // log OS version LOG("OS: %s", Platform::GetOS().c_str()); if (Platform::Is64Bit()) LOG("OS: 64bit native mode"); else if (Platform::Is32BitEmulation()) LOG("OS: emulated 32bit mode"); else LOG("OS: 32bit native mode"); // Rename Threads // We give the process itself the name `unknown`, htop & co. will still show the binary's name. // But all child threads copy by default the name of their parent, so all threads that don't set // their name themselves will show up as 'unknown'. Threading::SetThreadName("unknown"); #ifdef _OPENMP #pragma omp parallel { int i = omp_get_thread_num(); if (i != 0) { // 0 is the source thread std::ostringstream buf; buf << "omp" << i; Threading::SetThreadName(buf.str().c_str()); } } #endif // Install Watchdog Watchdog::Install(); Watchdog::RegisterThread(WDT_MAIN, true); FileSystemInitializer::Initialize(); // Create Window if (!InitWindow(("Spring " + SpringVersion::GetSync()).c_str())) { SDL_Quit(); return false; } mouseInput = IMouseInput::GetInstance(); keyInput = KeyInput::GetInstance(); input.AddHandler(boost::bind(&SpringApp::MainEventHandler, this, _1)); // Global structures gs = new CGlobalSynced(); gu = new CGlobalUnsynced(); // Initialize GLEW LoadExtensions(); //! check if FSAA init worked fine if (globalRendering->FSAA && !MultisampleVerify()) globalRendering->FSAA = 0; InitOpenGL(); agui::InitGui(); LoadFonts(); globalRendering->PostInit(); // Initialize named texture handler CNamedTextures::Init(); // Initialize Lua GL LuaOpenGL::Init(); // Sound & Input ISound::Initialize(); InitJoystick(); // Multithreading & Affinity LOG("CPU Cores: %d", Threading::GetAvailableCores()); const uint32_t affinity = configHandler->GetUnsigned("SetCoreAffinity"); const uint32_t cpuMask = Threading::SetAffinity(affinity); if (cpuMask == 0xFFFFFF) { LOG("CPU affinity not set"); } else if (cpuMask != affinity) { LOG("CPU affinity mask set: %d (config is %d)", cpuMask, affinity); } else if (cpuMask == 0) { LOG_L(L_ERROR, "Failed to CPU affinity mask <%d>", affinity); } else { LOG("CPU affinity mask set: %d", cpuMask); } // Create CGameSetup and CPreGame objects Startup(); return true; }