X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=vid_glx.c;h=9e33fdc91f7fe5c631f1ef9a6ac284dca719abd2;hb=2715d30ced479f847c695ed2a5c069caf73a118c;hp=4456287800f887889d3860e47d750be2245dbcad;hpb=1e932ed80f680e1e66911aceabc697e2566f5813;p=xonotic%2Fdarkplaces.git diff --git a/vid_glx.c b/vid_glx.c index 44562878..9e33fdc9 100644 --- a/vid_glx.c +++ b/vid_glx.c @@ -17,6 +17,10 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#if !defined(__APPLE__) && !defined(__MACH__) && !defined(SUNOS) +//#define USEDGA +#endif + #include #include @@ -35,7 +39,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include -#if !defined(__APPLE__) && !defined(__MACH__) && !defined(SUNOS) +#ifdef USEDGA #include #endif #include @@ -116,14 +120,15 @@ static qboolean vid_usinghidecursor = false; static qboolean vid_usingvsync = false; static qboolean vid_usevsync = false; static qboolean vid_x11_hardwaregammasupported = false; +#ifdef USEDGA static qboolean vid_x11_dgasupported = false; +#endif static int vid_x11_gammarampsize = 0; -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA cvar_t vid_dgamouse = {CVAR_SAVE, "vid_dgamouse", "0", "make use of DGA mouse input"}; static qboolean vid_usingdgamouse = false; #endif -cvar_t vid_netwmfullscreen = {CVAR_SAVE, "vid_netwmfullscreen", "0", "make use _NET_WM_STATE_FULLSCREEN; turn this off if fullscreen does not work for you"}; qboolean vidmode_ext = false; @@ -132,16 +137,17 @@ static int win_x, win_y; static XF86VidModeModeInfo init_vidmode, game_vidmode; static qboolean vid_isfullscreen = false; static qboolean vid_isvidmodefullscreen = false; -static qboolean vid_isnetwmfullscreen = false; +static qboolean vid_isdesktopfullscreen = false; static qboolean vid_isoverrideredirect = false; +static vid_mode_t desktop_mode; static Visual *vidx11_visual; static Colormap vidx11_colormap; /*-----------------------------------------------------------------------*/ // -long keysym2ucs(KeySym keysym); +extern long keysym2ucs(KeySym keysym); // LordHavoc: suppress warning just in this case, it's not worth having a header file for this... static void DP_Xutf8LookupString(XKeyEvent * ev, Uchar *uch, KeySym * keysym_return, @@ -325,7 +331,7 @@ void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecurso static int originalmouseparms_threshold; static qboolean restore_spi; -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA qboolean usedgamouse; #endif @@ -338,7 +344,7 @@ void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecurso if (!mouse_avail) fullscreengrab = relative = hidecursor = false; -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA usedgamouse = relative && vid_dgamouse.integer; if (!vid_x11_dgasupported) usedgamouse = false; @@ -374,7 +380,7 @@ void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecurso attribs_2.event_mask = attribs_1.your_event_mask | KEY_MASK | MOUSE_MASK; XChangeWindowAttributes(vidx11_display, win, CWEventMask, &attribs_2); -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA vid_usingdgamouse = usedgamouse; if (usedgamouse) { @@ -386,7 +392,7 @@ void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecurso XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, vid.width / 2, vid.height / 2); // COMMANDLINEOPTION: X11 Input: -noforcemparms disables setting of mouse parameters (not used with DGA, windows only) -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA if (!COM_CheckParm ("-noforcemparms") && !usedgamouse) #else if (!COM_CheckParm ("-noforcemparms")) @@ -407,7 +413,7 @@ void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecurso { if (vid_usingmouse) { -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA if (vid_usingdgamouse) XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), 0); vid_usingdgamouse = false; @@ -599,7 +605,7 @@ static void HandleEvents(void) // mouse moved if (vid_usingmouse) { -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA if (vid_usingdgamouse) { in_mouse_x += event.xmotion.x_root; @@ -648,28 +654,37 @@ static void HandleEvents(void) // window changed size/location win_x = event.xconfigure.x; win_y = event.xconfigure.y; - if((vid_resizable.integer < 2 || vid_isnetwmfullscreen) && (vid.width != event.xconfigure.width || vid.height != event.xconfigure.height)) + // HACK on X11, we just request fullscreen mode, but + // cannot guess what the window manager will do for us + // exactly. That is why we read back the resolution we + // actually got here. + if(vid_isdesktopfullscreen) + { + desktop_mode.width = event.xconfigure.width; + desktop_mode.height = event.xconfigure.height; + } + if((vid_resizable.integer < 2 || vid_isdesktopfullscreen) && (vid.width != event.xconfigure.width || vid.height != event.xconfigure.height)) { vid.width = event.xconfigure.width; vid.height = event.xconfigure.height; - if(vid_isnetwmfullscreen) + if(vid_isdesktopfullscreen) Con_Printf("NetWM fullscreen: actually using resolution %dx%d\n", vid.width, vid.height); else Con_DPrintf("Updating to ConfigureNotify resolution %dx%d\n", vid.width, vid.height); - DPSOFTRAST_Flush(); - - if(vid.softdepthpixels) - free(vid.softdepthpixels); - - DestroyXImages(); - XSync(vidx11_display, False); - if(!BuildXImages(vid.width, vid.height)) - return; - XSync(vidx11_display, False); - - vid.softpixels = (unsigned int *) vidx11_ximage[vidx11_ximage_pos]->data; - vid.softdepthpixels = (unsigned int *)calloc(4, vid.width * vid.height); + if(vid.renderpath == RENDERPATH_SOFT) + { + DPSOFTRAST_Flush(); + if(vid.softdepthpixels) + free(vid.softdepthpixels); + DestroyXImages(); + XSync(vidx11_display, False); + if(!BuildXImages(vid.width, vid.height)) + return; + XSync(vidx11_display, False); + vid.softpixels = (unsigned int *) vidx11_ximage[vidx11_ximage_pos]->data; + vid.softdepthpixels = (unsigned int *)calloc(4, vid.width * vid.height); + } } break; case DestroyNotify: @@ -697,7 +712,7 @@ static void HandleEvents(void) XF86VidModeSetViewPort(vidx11_display, vidx11_screen, 0, 0); } - if(vid_isnetwmfullscreen) + if(vid_isdesktopfullscreen) { // make sure it's fullscreen XEvent event; @@ -739,7 +754,7 @@ static void HandleEvents(void) if (vid_isoverrideredirect) break; - if(vid_isnetwmfullscreen && event.xfocus.mode == NotifyNormal) + if(vid_isdesktopfullscreen && event.xfocus.mode == NotifyNormal) { // iconify netwm fullscreen window when it loses focus // when the user selects it in the taskbar, the window manager will map it again and send MapNotify @@ -860,7 +875,7 @@ void VID_Shutdown(void) vid_hidden = true; vid_isfullscreen = false; - vid_isnetwmfullscreen = false; + vid_isdesktopfullscreen = false; vid_isvidmodefullscreen = false; vid_isoverrideredirect = false; vidx11_display = NULL; @@ -903,18 +918,18 @@ void VID_Finish (void) vid.softpixels = (unsigned int *) vidx11_ximage[vidx11_ximage_pos]->data; DPSOFTRAST_SetRenderTargets(vid.width, vid.height, vid.softdepthpixels, vid.softpixels, NULL, NULL, NULL); + ++vidx11_shmwait; + XShmPutImage(vidx11_display, win, vidx11_gc, vidx11_ximage[!vidx11_ximage_pos], 0, 0, 0, 0, vid.width, vid.height, True); + // save mouse motion so we can deal with it later in_mouse_x = 0; in_mouse_y = 0; - while(vidx11_shmwait) + while(vidx11_shmwait > 1) HandleEvents(); in_mouse_x_save += in_mouse_x; in_mouse_y_save += in_mouse_y; in_mouse_x = 0; in_mouse_y = 0; - - ++vidx11_shmwait; - XShmPutImage(vidx11_display, win, vidx11_gc, vidx11_ximage[!vidx11_ximage_pos], 0, 0, 0, 0, vid.width, vid.height, True); } else { // no buffer switching here, we just flush the renderer DPSOFTRAST_Finish(); @@ -930,7 +945,7 @@ void VID_Finish (void) if (vid_usingvsync != vid_usevsync) { vid_usingvsync = vid_usevsync; - if (qglXSwapIntervalSGI (vid_usevsync)) + if (qglXSwapIntervalSGI && qglXSwapIntervalSGI (vid_usevsync)) Con_Print("glXSwapIntervalSGI didn't accept the vid_vsync change, it will take effect on next vid_restart (GLX_SGI_swap_control does not allow turning off vsync)\n"); } @@ -965,10 +980,10 @@ int VID_GetGamma(unsigned short *ramps, int rampsize) void VID_Init(void) { -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA Cvar_RegisterVariable (&vid_dgamouse); #endif - Cvar_RegisterVariable (&vid_netwmfullscreen); + Cvar_RegisterVariable (&vid_desktopfullscreen); InitSig(); // trap evil signals // COMMANDLINEOPTION: Input: -nomouse disables mouse support (see also vid_mouse cvar) if (COM_CheckParm ("-nomouse")) @@ -1020,7 +1035,7 @@ static qboolean VID_InitModeSoft(viddef_mode_t *mode) char vabuf[1024]; vid_isfullscreen = false; - vid_isnetwmfullscreen = false; + vid_isdesktopfullscreen = false; vid_isvidmodefullscreen = false; vid_isoverrideredirect = false; @@ -1046,6 +1061,13 @@ static qboolean VID_InitModeSoft(viddef_mode_t *mode) vidx11_screen = DefaultScreen(vidx11_display); root = RootWindow(vidx11_display, vidx11_screen); + desktop_mode.width = DisplayWidth(vidx11_display, vidx11_screen); + desktop_mode.height = DisplayHeight(vidx11_display, vidx11_screen); + desktop_mode.bpp = DefaultDepth(vidx11_display, vidx11_screen); + desktop_mode.refreshrate = 60; // FIXME + desktop_mode.pixelheight_num = 1; // FIXME + desktop_mode.pixelheight_denom = 1; // FIXME + // Get video mode list MajorVersion = MinorVersion = 0; if (!XF86VidModeQueryVersion(vidx11_display, &MajorVersion, &MinorVersion)) @@ -1058,10 +1080,10 @@ static qboolean VID_InitModeSoft(viddef_mode_t *mode) if (mode->fullscreen) { - if(vid_netwmfullscreen.integer) + if(vid_desktopfullscreen.integer) { // TODO detect WM support - vid_isnetwmfullscreen = true; + vid_isdesktopfullscreen = true; vid_isfullscreen = true; // width and height will be filled in later Con_DPrintf("Using NetWM fullscreen mode\n"); @@ -1145,7 +1167,7 @@ static qboolean VID_InitModeSoft(viddef_mode_t *mode) if (mode->fullscreen) { - if(vid_isnetwmfullscreen) + if(vid_isdesktopfullscreen) { mask = CWBackPixel | CWColormap | CWSaveUnder | CWBackingStore | CWEventMask; attr.backing_store = NotUseful; @@ -1218,7 +1240,7 @@ static qboolean VID_InitModeSoft(viddef_mode_t *mode) clshints->res_class = strdup("DarkPlaces"); szhints = XAllocSizeHints(); - if(vid_resizable.integer == 0 && !vid_isnetwmfullscreen) + if(vid_resizable.integer == 0 && !vid_isdesktopfullscreen) { szhints->min_width = szhints->max_width = mode->width; szhints->min_height = szhints->max_height = mode->height; @@ -1291,7 +1313,7 @@ static qboolean VID_InitModeSoft(viddef_mode_t *mode) vid_hidden = false; vid_activewindow = true; vid_x11_hardwaregammasupported = XF86VidModeGetGammaRampSize(vidx11_display, vidx11_screen, &vid_x11_gammarampsize) != 0; -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA vid_x11_dgasupported = XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion); if (!vid_x11_dgasupported) Con_Print( "Failed to detect XF86DGA Mouse extension\n" ); @@ -1301,7 +1323,8 @@ static qboolean VID_InitModeSoft(viddef_mode_t *mode) return true; } -qboolean VID_InitModeGL(viddef_mode_t *mode) + +static qboolean VID_InitModeGL(viddef_mode_t *mode) { int i, j; int attrib[32]; @@ -1319,7 +1342,7 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) char vabuf[1024]; vid_isfullscreen = false; - vid_isnetwmfullscreen = false; + vid_isdesktopfullscreen = false; vid_isvidmodefullscreen = false; vid_isoverrideredirect = false; @@ -1361,6 +1384,13 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) vidx11_screen = DefaultScreen(vidx11_display); root = RootWindow(vidx11_display, vidx11_screen); + desktop_mode.width = DisplayWidth(vidx11_display, vidx11_screen); + desktop_mode.height = DisplayHeight(vidx11_display, vidx11_screen); + desktop_mode.bpp = DefaultDepth(vidx11_display, vidx11_screen); + desktop_mode.refreshrate = 60; // FIXME + desktop_mode.pixelheight_num = 1; // FIXME + desktop_mode.pixelheight_denom = 1; // FIXME + // Get video mode list MajorVersion = MinorVersion = 0; if (!XF86VidModeQueryVersion(vidx11_display, &MajorVersion, &MinorVersion)) @@ -1392,10 +1422,10 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) if (mode->fullscreen) { - if(vid_netwmfullscreen.integer) + if(vid_desktopfullscreen.integer) { // TODO detect WM support - vid_isnetwmfullscreen = true; + vid_isdesktopfullscreen = true; vid_isfullscreen = true; // width and height will be filled in later Con_DPrintf("Using NetWM fullscreen mode\n"); @@ -1479,7 +1509,7 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) if (mode->fullscreen) { - if(vid_isnetwmfullscreen) + if(vid_isdesktopfullscreen) { mask = CWBackPixel | CWColormap | CWSaveUnder | CWBackingStore | CWEventMask; attr.backing_store = NotUseful; @@ -1552,7 +1582,7 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) clshints->res_class = strdup("DarkPlaces"); szhints = XAllocSizeHints(); - if(vid_resizable.integer == 0 && !vid_isnetwmfullscreen) + if(vid_resizable.integer == 0 && !vid_isdesktopfullscreen) { szhints->min_width = szhints->max_width = mode->width; szhints->min_height = szhints->max_height = mode->height; @@ -1630,7 +1660,7 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) vid_hidden = false; vid_activewindow = true; vid_x11_hardwaregammasupported = XF86VidModeGetGammaRampSize(vidx11_display, vidx11_screen, &vid_x11_gammarampsize) != 0; -#if !defined(__APPLE__) && !defined(SUNOS) +#ifdef USEDGA vid_x11_dgasupported = XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion); if (!vid_x11_dgasupported) Con_Print( "Failed to detect XF86DGA Mouse extension\n" ); @@ -1705,6 +1735,11 @@ void IN_Move (void) VID_ApplyJoyState(&joystate); } +vid_mode_t *VID_GetDesktopMode(void) +{ + return &desktop_mode; +} + size_t VID_ListModes(vid_mode_t *modes, size_t maxcount) { if(vidmode_ext)