void VID_Init(unsigned char *palette) { vid.colormap = host_colormap; Check_Gamma(palette); VID_SetPalette(palette); VID_RegisterLatchCvars(); if (!host_initialized) { VID_RegisterCvars(); VID_RegisterCommands(); VID_ParseCmdLine(); } VID_SDL_Init(); // print info if (!host_initialized || r_verbose.integer) { GfxInfo_f(); } VID_UpdateConRes(); GL_Init(); // Real OpenGL stuff, vid_common_gl.c }
void VID_Init (unsigned char *palette) { vid.colormap = host_colormap; Check_Gamma(palette); VID_SetPalette(palette); RE_Init(); #ifdef GLSL SHD_Init(); #endif VID_zzz(); GL_Init(); }
void VID_Open() { int width, height, fullscreen; fullscreen = vid_fullscreen.value; width = vid_width.value; height = vid_height.value; #warning Fix this. #ifndef GLQUAKE if (width > MAXWIDTH) { Com_Printf("VID: Maximum supported width is %d\n", MAXWIDTH); width = MAXWIDTH; } if (height > MAXHEIGHT) { Com_Printf("VID: Maximum supported height is %d\n", MAXHEIGHT); height = MAXHEIGHT; } #endif vid.colormap = host_colormap; vid.aspect = ((float)height / (float)width) * (320.0 / 240.0); #ifndef GLQUAKE vid.maxwarpwidth = WARP_WIDTH; vid.maxwarpheight = WARP_HEIGHT; #endif Sys_Thread_LockMutex(display_mutex); display = Sys_Video_Open(vid_mode.string, width, height, fullscreen, host_basepal); Sys_Thread_UnlockMutex(display_mutex); if (display) { width = Sys_Video_GetWidth(display); height = Sys_Video_GetHeight(display); #ifndef GLQUAKE if (width > MAXWIDTH || height > MAXHEIGHT) Sys_Error("Fullscreen display size (%dx%d) exceeds the maximum allowed display size (%dx%d)\n", width, height, MAXWIDTH, MAXHEIGHT); #endif #ifndef GLQUAKE if (VID_SW_AllocBuffers(width, height)) #endif { vid.numpages = Sys_Video_GetNumBuffers(display); set_up_conwidth_conheight(); #ifndef GLQUAKE vid.rowbytes = Sys_Video_GetBytesPerRow(display); vid.buffer = Sys_Video_GetBuffer(display); #endif if (windowtitle) Sys_Video_SetWindowTitle(display, windowtitle); mouse_grabbed = 2; refresh_mouse_grab_state(); R_Init(); V_UpdatePalette(true); #ifdef GLQUAKE Check_Gamma(host_basepal); VID_SetPalette(host_basepal); vid.recalc_refdef = 1; // force a surface cache flush R_InitGL(); GL_Particles_TextureInit(); #endif Draw_Init(); M_VidInit(); Sbar_Init(); SCR_Init(); CSTC_PictureInit(); Skin_Init(); return; } Sys_Thread_LockMutex(display_mutex); Sys_Video_Close(display); display = 0; Sys_Thread_UnlockMutex(display_mutex); } Sys_Error("VID: Unable to open a display\n"); }
void VID_Init(unsigned char *palette) { int i; int attrib[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE, 1, None }; int width = 640, height = 480; XSetWindowAttributes attr; unsigned long mask; Window root; XVisualInfo *visinfo; #ifdef USE_VMODE qbool fullscreen = true; int MajorVersion, MinorVersion; int actualWidth, actualHeight; #endif Cvar_Register (&vid_ref); Cvar_Register (&vid_mode); Cvar_Register (&vid_hwgammacontrol); Cvar_Register (&_windowed_mouse); Cvar_Register (&m_filter); vid.colormap = host_colormap; // interpret command-line params // fullscreen cmdline check #ifdef USE_VMODE if (COM_CheckParm("-window")) fullscreen = false; #endif // set vid parameters if ((i = COM_CheckParm("-width")) != 0) width = atoi(com_argv[i+1]); if ((i = COM_CheckParm("-height")) != 0) height = atoi(com_argv[i+1]); if ((i = COM_CheckParm("-conwidth")) != 0) vid.width = Q_atoi(com_argv[i+1]); else vid.width = 640; vid.width &= 0xfff8; // make it a multiple of eight if (vid.width < 320) vid.width = 320; // pick a conheight that matches with correct aspect vid.height = vid.width*3 / 4; if ((i = COM_CheckParm("-conheight")) != 0) vid.height = Q_atoi(com_argv[i+1]); if (vid.height < 200) vid.height = 200; if (!(x_disp = XOpenDisplay(NULL))) { fprintf(stderr, "Error couldn't open the X display\n"); exit(1); } scrnum = DefaultScreen(x_disp); root = RootWindow(x_disp, scrnum); #ifdef USE_VMODE // check vmode extensions supported // Get video mode list MajorVersion = MinorVersion = 0; if (!XF86VidModeQueryVersion(x_disp, &MajorVersion, &MinorVersion)) { vidmode_ext = false; } else { Com_Printf("Using XFree86-VidModeExtension Version %d.%d\n", MajorVersion, MinorVersion); vidmode_ext = true; } #endif visinfo = glXChooseVisual(x_disp, scrnum, attrib); if (!visinfo) { fprintf(stderr, "qkHack: Error couldn't get an RGB, Double-buffered, Depth visual\n"); exit(1); } // setup fullscreen size to fit display --> #ifdef USE_VMODE if (vidmode_ext) { int best_fit, best_dist, dist, x, y; XF86VidModeGetAllModeLines(x_disp, scrnum, &num_vidmodes, &vidmodes); // Are we going fullscreen? If so, let's change video mode if (fullscreen) { best_dist = 9999999; best_fit = -1; for (i = 0; i < num_vidmodes; i++) { if (width > vidmodes[i]->hdisplay || height > vidmodes[i]->vdisplay) continue; x = width - vidmodes[i]->hdisplay; y = height - vidmodes[i]->vdisplay; dist = x * x + y * y; if (dist < best_dist) { best_dist = dist; best_fit = i; } } if (best_fit != -1) { actualWidth = vidmodes[best_fit]->hdisplay; actualHeight = vidmodes[best_fit]->vdisplay; // change to the mode XF86VidModeSwitchToMode(x_disp, scrnum, vidmodes[best_fit]); vidmode_active = true; // Move the viewport to top left XF86VidModeSetViewPort(x_disp, scrnum, 0, 0); } else { fullscreen = 0; } } } #endif /* window attributes */ attr.background_pixel = 0; attr.border_pixel = 0; attr.colormap = XCreateColormap(x_disp, root, visinfo->visual, AllocNone); attr.event_mask = X_MASK; mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; // if fullscreen disable window manager decoration #ifdef USE_VMODE if (vidmode_active) { mask = CWBackPixel | CWColormap | CWSaveUnder | CWBackingStore | CWEventMask | CWOverrideRedirect; attr.override_redirect = True; attr.backing_store = NotUseful; attr.save_under = False; } #endif x_win = XCreateWindow(x_disp, root, 0, 0, width, height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr); XStoreName(x_disp, x_win, PROGRAM); XMapWindow(x_disp, x_win); #ifdef USE_VMODE if (vidmode_active) { XRaiseWindow(x_disp, x_win); XWarpPointer(x_disp, None, x_win, 0, 0, 0, 0, 0, 0); XFlush(x_disp); // Move the viewport to top left XF86VidModeSetViewPort(x_disp, scrnum, 0, 0); } #endif XFlush(x_disp); ctx = glXCreateContext(x_disp, visinfo, NULL, True); glXMakeCurrent(x_disp, x_win, ctx); vid.realwidth = width; vid.realheight = height; if (vid.height > height) vid.height = height; if (vid.width > width) vid.width = width; vid.aspect = ((float)vid.height / (float)vid.width) * (320.0 / 240.0); vid.numpages = 2; InitSig(); // trap evil signals GL_Init(); Check_Gamma(palette); VID_SetPalette(palette); InitHWGamma(); Com_Printf ("Video mode %dx%d initialized.\n", width, height); SCR_InvalidateScreen (); }