static qboolean SWimp_InitGraphics( qboolean fullscreen ) { const SDL_VideoInfo *vinfo; int flags; /* Just toggle fullscreen if that's all that has been changed */ if (surface && (surface->w == vid.width) && (surface->h == vid.height)) { int isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0; if (fullscreen != isfullscreen) SDL_WM_ToggleFullScreen(surface); isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0; if (fullscreen == isfullscreen) return true; } srandom(getpid()); // free resources in use if (surface) SDL_FreeSurface(surface); // let the sound and input subsystems know about the new window ri.Vid_NewWindow (vid.width, vid.height); /* Okay, I am going to query SDL for the "best" pixel format. If the depth is not 8, use SetPalette with logical pal, else use SetColors. Hopefully this works all the time. */ vinfo = SDL_GetVideoInfo(); sdl_palettemode = (vinfo->vfmt->BitsPerPixel == 8) ? (SDL_PHYSPAL|SDL_LOGPAL) : SDL_LOGPAL; flags = /*SDL_DOUBLEBUF|*/SDL_SWSURFACE|SDL_HWPALETTE; if (fullscreen) flags |= SDL_FULLSCREEN; SetSDLIcon(); /* currently uses q2icon.xbm data */ if ((surface = SDL_SetVideoMode(vid.width, vid.height, 8, flags)) == NULL) { Sys_Error("(SOFTSDL) SDL SetVideoMode failed: %s\n", SDL_GetError()); return false; } SDL_WM_SetCaption("Quake II", "Quake II"); SDL_ShowCursor(0); vid.rowbytes = surface->pitch; vid.buffer = surface->pixels; X11_active = true; return true; }
static qboolean GLimp_InitGraphics(qboolean fullscreen) { int flags; /* Just toggle fullscreen if that's all that has been changed */ if (surface && (surface->w == vid.width) && (surface->h == vid.height)) { int isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0; if (fullscreen != isfullscreen) SDL_WM_ToggleFullScreen(surface); isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0; if (fullscreen == isfullscreen) return true; } srandom(getpid()); /* free resources in use */ if (surface) SDL_FreeSurface(surface); /* let the sound and input subsystems know about the new window */ ri.Vid_NewWindow(vid.width, vid.height); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (use_stencil) SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); flags = SDL_OPENGL; if (fullscreen) flags |= SDL_FULLSCREEN; SetSDLIcon(); /* currently uses q2icon.xbm data */ if ((surface = SDL_SetVideoMode(vid.width, vid.height, 0, flags)) == NULL) { Sys_Error("(SDLGL) SDL SetVideoMode failed: %s\n", SDL_GetError()); return false; } /* stencilbuffer shadows */ if (use_stencil) { int stencil_bits; have_stencil = false; if (!SDL_GL_GetAttribute(SDL_GL_STENCIL_SIZE, &stencil_bits)) { ri.Con_Printf(PRINT_ALL, "I: got %d bits of stencil\n", stencil_bits); if (stencil_bits >= 1) { have_stencil = true; } } } SDL_WM_SetCaption(QUDOS_VERSION, QUDOS_VERSION); SDL_ShowCursor(0); X11_active = true; SetSDLGamma(); return true; }
/* * Initializes the OpenGL window */ static qboolean GLimp_InitGraphics(qboolean fullscreen) { int flags; int msaa_samples; int stencil_bits; int width, height; char title[24]; if (GetWindowSize(&width, &height) && (width == vid.width) && (height == vid.height)) { /* If we want fullscreen, but aren't */ if (fullscreen != IsFullscreen()) { GLimp_ToggleFullscreen(); } /* Are we now? */ if (fullscreen == IsFullscreen()) { return true; } } /* Is the surface used? */ if (window) { #if SDL_VERSION_ATLEAST(2, 0, 0) SDL_GL_DeleteContext(context); SDL_DestroyWindow(window); #else SDL_FreeSurface(window); #endif } /* Create the window */ VID_NewWindow(vid.width, vid.height); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); if (gl_msaa_samples->value) { msaa_samples = gl_msaa_samples->value; if (SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1) == -1) { Com_Printf("MSAA is unsupported: %s\n", SDL_GetError()); Cvar_SetValue ("gl_msaa_samples", 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); } else if (SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, msaa_samples) == -1) { Com_Printf("MSAA %ix is unsupported: %s\n", msaa_samples, SDL_GetError()); Cvar_SetValue("gl_msaa_samples", 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); } } /* Initiate the flags */ flags = SDL_OPENGL; if (fullscreen) { flags |= SDL_FULLSCREEN; } #if !SDL_VERSION_ATLEAST(2, 0, 0) /* For SDL1.2, these things must be done before creating the window */ /* Set the icon */ SetSDLIcon(); /* Set vsync */ SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, gl_swapinterval->value ? 1 : 0); #endif while (1) { if (!CreateSDLWindow(flags)) { if (gl_msaa_samples->value) { VID_Printf(PRINT_ALL, "SDL SetVideoMode failed: %s\n", SDL_GetError()); VID_Printf(PRINT_ALL, "Reverting to %s gl_mode %i (%ix%i) without MSAA.\n", (flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed", (int)Cvar_VariableValue("gl_mode"), vid.width, vid.height); /* Try to recover */ Cvar_SetValue("gl_msaa_samples", 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); } else if (vid.width != 640 || vid.height != 480 || (flags & SDL_FULLSCREEN)) { VID_Printf(PRINT_ALL, "SDL SetVideoMode failed: %s\n", SDL_GetError()); VID_Printf(PRINT_ALL, "Reverting to windowed gl_mode 4 (640x480).\n"); /* Try to recover */ Cvar_SetValue("gl_mode", 4); Cvar_SetValue("vid_fullscreen", 0); vid.width = 640; vid.height = 480; flags &= ~SDL_FULLSCREEN; } else { VID_Error(ERR_FATAL, "Failed to revert to gl_mode 4. Exiting...\n"); return false; } } else { break; } } #if SDL_VERSION_ATLEAST(2, 0, 0) /* For SDL2, these things must be done after creating the window */ /* Set the icon */ SetSDLIcon(); /* Set vsync - TODO: -1 could be set for "late swap tearing" */ SDL_GL_SetSwapInterval(gl_swapinterval->value ? 1 : 0); #endif /* Initialize the stencil buffer */ if (!SDL_GL_GetAttribute(SDL_GL_STENCIL_SIZE, &stencil_bits)) { VID_Printf(PRINT_ALL, "Got %d bits of stencil.\n", stencil_bits); if (stencil_bits >= 1) { have_stencil = true; } } /* Initialize hardware gamma */ InitGamma(); /* Window title */ snprintf(title, sizeof(title), "Yamagi Quake II %s", YQ2VERSION); #if SDL_VERSION_ATLEAST(2, 0, 0) SDL_SetWindowTitle(window, title); #else SDL_WM_SetCaption(title, title); #endif /* No cursor */ SDL_ShowCursor(0); return true; }
/* * Initializes the OpenGL window */ static qboolean GLimp_InitGraphics(qboolean fullscreen) { int counter = 0; int flags; int stencil_bits; char title[24]; //QUAKETOON: forcing window fullscreen = false; if (surface && (surface->w == vid.width) && (surface->h == vid.height)) { /* Are we running fullscreen? */ int isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0; /* We should, but we don't */ if (fullscreen != isfullscreen) { SDL_WM_ToggleFullScreen(surface); } /* Do we now? */ isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0; if (fullscreen == isfullscreen) { return true; } } /* Is the surface used? */ if (surface) { SDL_FreeSurface(surface); } /* Create the window */ VID_NewWindow(vid.width, vid.height); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); /* Initiate the flags */ flags = SDL_OPENGL; if (fullscreen) { flags |= SDL_FULLSCREEN; } /* Set the icon */ SetSDLIcon(); /* Enable vsync */ /* if (gl_swapinterval->value) { SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); } */ while (1) { if ((surface = SDL_SetVideoMode(vid.width, vid.height, 0, flags)) == NULL) { if (counter == 1) { VID_Error(ERR_FATAL, "Failed to revert to gl_mode 4. Exiting...\n"); return false; } VID_Printf(PRINT_ALL, "SDL SetVideoMode failed: %s\n", SDL_GetError()); VID_Printf(PRINT_ALL, "Reverting to gl_mode 4 (640x480) and windowed mode.\n"); /* Try to recover */ Cvar_SetValue("gl_mode", 4); Cvar_SetValue("vid_fullscreen", 0); vid.width = 640; vid.height = 480; counter++; continue; } else { break; } } /* Initialize the stencil buffer */ if (!SDL_GL_GetAttribute(SDL_GL_STENCIL_SIZE, &stencil_bits)) { VID_Printf(PRINT_ALL, "Got %d bits of stencil.\n", stencil_bits); if (stencil_bits >= 1) { have_stencil = true; } } /* Initialize hardware gamma */ #ifdef X11GAMMA if ((dpy = XOpenDisplay(displayname)) == NULL) { VID_Printf(PRINT_ALL, "Unable to open display.\n"); } else { if (screen == -1) { screen = DefaultScreen(dpy); } gl_state.hwgamma = true; vid_gamma->modified = true; XF86VidModeGetGamma(dpy, screen, &x11_oldgamma); VID_Printf(PRINT_ALL, "Using hardware gamma via X11.\n"); } #else //gl_state.hwgamma = true; vid_gamma->modified = true; VID_Printf(PRINT_ALL, "Using hardware gamma via SDL.\n"); #endif /* Window title */ snprintf(title, sizeof(title), "QuakeToon %f", (float) VERSION); SDL_WM_SetCaption(title, title); /* No cursor */ SDL_ShowCursor(0); return true; }
static qboolean SWimp_InitGraphics( qboolean fullscreen ) { const SDL_VideoInfo *vinfo; int flags; /* Just toggle fullscreen if that's all that has been changed */ if (surface && (surface->w == vid.width) && (surface->h == vid.height)) { int isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0; if (fullscreen != isfullscreen) SDL_WM_ToggleFullScreen(surface); isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0; if (fullscreen == isfullscreen) return true; } srandom(getpid()); // free resources in use if (surface) SDL_FreeSurface(surface); // let the sound and input subsystems know about the new window ri.Vid_NewWindow (vid.width, vid.height); /* Okay, I am going to query SDL for the "best" pixel format. If the depth is not 8, use SetPalette with logical pal, else use SetColors. Hopefully this works all the time. */ vinfo = SDL_GetVideoInfo(); sdl_palettemode = (vinfo->vfmt->BitsPerPixel == 8) ? (SDL_PHYSPAL|SDL_LOGPAL) : SDL_LOGPAL; flags = /*SDL_DOUBLEBUF|*/SDL_SWSURFACE|SDL_HWPALETTE; if (fullscreen) flags |= SDL_FULLSCREEN; SetSDLIcon(); /* currently uses q2icon.xbm data */ #ifdef RAPTOR_RAYTRACE if ((surface = SDL_SetVideoMode(vid.width, vid.height, 32, flags)) == NULL) { #else if ((surface = SDL_SetVideoMode(vid.width, vid.height, 8, flags)) == NULL) { #endif Sys_Error("(SOFTSDL) SDL SetVideoMode failed: %s\n", SDL_GetError()); return false; } SDL_WM_SetCaption("Quake II", "Quake II"); SDL_ShowCursor(0); vid.rowbytes = surface->pitch; vid.buffer = surface->pixels; #ifdef RAPTOR_RAYTRACE vid.pixelformat = surface->format; #endif X11_active = true; return true; } #else static qboolean GLimp_InitGraphics( qboolean fullscreen ) { int flags; /* Just toggle fullscreen if that's all that has been changed */ if (surface && (surface->w == vid.width) && (surface->h == vid.height)) { int isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0; if (fullscreen != isfullscreen) SDL_WM_ToggleFullScreen(surface); isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0; if (fullscreen == isfullscreen) return true; } srandom(getpid()); // free resources in use if (surface) SDL_FreeSurface(surface); // let the sound and input subsystems know about the new window ri.Vid_NewWindow (vid.width, vid.height); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); if (use_stencil) SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); flags = SDL_OPENGL; if (fullscreen) flags |= SDL_FULLSCREEN; SetSDLIcon(); /* currently uses q2icon.xbm data */ if ((surface = SDL_SetVideoMode(vid.width, vid.height, 0, flags)) == NULL) { Sys_Error("(SDLGL) SDL SetVideoMode failed: %s\n", SDL_GetError()); return false; } // stencilbuffer shadows if (use_stencil) { int stencil_bits; have_stencil = false; if (!SDL_GL_GetAttribute(SDL_GL_STENCIL_SIZE, &stencil_bits)) { ri.Con_Printf(PRINT_ALL, "I: got %d bits of stencil\n", stencil_bits); if (stencil_bits >= 1) { have_stencil = true; } } } SDL_WM_SetCaption("Quake II", "Quake II"); SDL_ShowCursor(0); X11_active = true; return true; }
/* =================== GLimp_Init =================== */ bool GLimp_Init(glimpParms_t parms) { common->Printf("Initializing OpenGL subsystem\n"); assert(SDL_WasInit(SDL_INIT_VIDEO)); Uint32 flags = SDL_WINDOW_OPENGL; if (parms.fullScreen) flags |= SDL_WINDOW_FULLSCREEN; int colorbits = 24; int depthbits = 24; int stencilbits = 8; for (int i = 0; i < 16; i++) { // 0 - default // 1 - minus colorbits // 2 - minus depthbits // 3 - minus stencil if ((i % 4) == 0 && i) { // one pass, reduce switch (i / 4) { case 2 : if (colorbits == 24) colorbits = 16; break; case 1 : if (depthbits == 24) depthbits = 16; else if (depthbits == 16) depthbits = 8; case 3 : if (stencilbits == 24) stencilbits = 16; else if (stencilbits == 16) stencilbits = 8; } } int tcolorbits = colorbits; int tdepthbits = depthbits; int tstencilbits = stencilbits; if ((i % 4) == 3) { // reduce colorbits if (tcolorbits == 24) tcolorbits = 16; } if ((i % 4) == 2) { // reduce depthbits if (tdepthbits == 24) tdepthbits = 16; else if (tdepthbits == 16) tdepthbits = 8; } if ((i % 4) == 1) { // reduce stencilbits if (tstencilbits == 24) tstencilbits = 16; else if (tstencilbits == 16) tstencilbits = 8; else tstencilbits = 0; } int channelcolorbits = 4; if (tcolorbits == 24) channelcolorbits = 8; SDL_GL_SetAttribute(SDL_GL_RED_SIZE, channelcolorbits); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, channelcolorbits); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, channelcolorbits); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, tdepthbits); SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, tstencilbits); if (r_waylandcompat.GetBool()) SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0); else SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, channelcolorbits); SDL_GL_SetAttribute(SDL_GL_STEREO, parms.stereo ? 1 : 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, parms.multiSamples ? 1 : 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, parms.multiSamples); #if SDL_VERSION_ATLEAST(2, 0, 0) window = SDL_CreateWindow(GAME_NAME, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, parms.width, parms.height, flags); if (!window) { common->DPrintf("Couldn't set GL mode %d/%d/%d: %s", channelcolorbits, tdepthbits, tstencilbits, SDL_GetError()); continue; } context = SDL_GL_CreateContext(window); if (SDL_GL_SetSwapInterval(r_swapInterval.GetInteger()) < 0) common->Warning("SDL_GL_SWAP_CONTROL not supported"); SDL_GetWindowSize(window, &glConfig.vidWidth, &glConfig.vidHeight); SetSDLIcon(); // for SDL2 this must be done after creating the window glConfig.isFullscreen = (SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN) == SDL_WINDOW_FULLSCREEN; #else SDL_WM_SetCaption(GAME_NAME, GAME_NAME); SetSDLIcon(); // for SDL1.2 this must be done before creating the window if (SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, r_swapInterval.GetInteger()) < 0) common->Warning("SDL_GL_SWAP_CONTROL not supported"); window = SDL_SetVideoMode(parms.width, parms.height, colorbits, flags); if (!window) { common->DPrintf("Couldn't set GL mode %d/%d/%d: %s", channelcolorbits, tdepthbits, tstencilbits, SDL_GetError()); continue; } glConfig.vidWidth = window->w; glConfig.vidHeight = window->h; glConfig.isFullscreen = (window->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN; #endif common->Printf("Using %d color bits, %d depth, %d stencil display\n", channelcolorbits, tdepthbits, tstencilbits); glConfig.colorBits = tcolorbits; glConfig.depthBits = tdepthbits; glConfig.stencilBits = tstencilbits; glConfig.displayFrequency = 0; break; } if (!window) { common->Warning("No usable GL mode found: %s", SDL_GetError()); return false; } return true; }