]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - vid_wgl.c
changed behavior of gl_workaround_mac_texmatrix, reverting to previous
[xonotic/darkplaces.git] / vid_wgl.c
index 88cc6814fa86a398ffc597527827e271902c17f1..3884cb07a21359c02ef556cc8ba3e679b4d4aa7c 100644 (file)
--- a/vid_wgl.c
+++ b/vid_wgl.c
@@ -25,10 +25,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "quakedef.h"
 #include <windows.h>
 #include <mmsystem.h>
+#ifdef SUPPORTDIRECTX
 #include <dsound.h>
+#endif
 #include "resource.h"
 #include <commctrl.h>
+#ifdef SUPPORTDIRECTX
 #include <dinput.h>
+#endif
 
 extern HINSTANCE global_hInstance;
 
@@ -120,14 +124,14 @@ static int window_x, window_y;
 static void IN_Activate (qboolean grab);
 
 static qboolean mouseinitialized;
-static qboolean dinput;
-
-// input code
 
+#ifdef SUPPORTDIRECTX
+static qboolean dinput;
 #define DINPUT_BUFFERSIZE           16
 #define iDirectInputCreate(a,b,c,d)    pDirectInputCreate(a,b,c,d)
 
 static HRESULT (WINAPI *pDirectInputCreate)(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUT * lplpDirectInput, LPUNKNOWN punkOuter);
+#endif
 
 // LordHavoc: thanks to backslash for this support for mouse buttons 4 and 5
 /* backslash :: imouse explorer buttons */
@@ -156,9 +160,11 @@ static int                 mouse_buttons;
 static int                     mouse_oldbuttonstate;
 
 static unsigned int uiWheelMessage;
+#ifdef SUPPORTDIRECTX
 static qboolean        dinput_acquired;
 
 static unsigned int            mstate_di;
+#endif
 
 // joystick defines and variables
 // where should defines be moved?
@@ -220,13 +226,14 @@ static int                        joy_id;
 static DWORD           joy_flags;
 static DWORD           joy_numbuttons;
 
+#ifdef SUPPORTDIRECTX
 static LPDIRECTINPUT           g_pdi;
 static LPDIRECTINPUTDEVICE     g_pMouse;
+static HINSTANCE hInstDI;
+#endif
 
 static JOYINFOEX       ji;
 
-static HINSTANCE hInstDI;
-
 // forward-referenced functions
 static void IN_StartupJoystick (void);
 static void Joy_AdvancedUpdate_f (void);
@@ -267,6 +274,11 @@ void VID_Finish (qboolean allowmousegrab)
                SwapBuffers(baseDC);
        }
 
+       // make sure a context switch can happen every frame - Logitech drivers
+       // input drivers sometimes eat cpu time every 3 seconds or lag badly
+       // without this help
+       Sleep(0);
+
        VID_UpdateGamma(false, 256);
 }
 
@@ -515,7 +527,7 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM  wParam, LPARAM lParam)
                        GetKeyboardState (state);
                        // alt/ctrl/shift tend to produce funky ToAscii values,
                        // and if it's not a single character we don't know care about it
-                       charlength = ToAscii (wParam, lParam >> 16, state, (unsigned short *)asciichar, 0);
+                       charlength = ToAscii (wParam, lParam >> 16, state, (LPWORD)asciichar, 0);
                        if (vkey == K_ALT || vkey == K_CTRL || vkey == K_SHIFT || charlength == 0)
                                asciichar[0] = 0;
                        else if( charlength == 2 ) {
@@ -530,8 +542,11 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM  wParam, LPARAM lParam)
 
                case WM_SYSCOMMAND:
                        // prevent screensaver from occuring while the active window
+                       // note: password-locked screensavers on Vista still work
                        if (vid_activewindow && ((wParam & 0xFFF0) == SC_SCREENSAVE || (wParam & 0xFFF0) == SC_MONITORPOWER))
-                               lRet = 0;; // note: password-locked screensavers on Vista still work
+                               lRet = 0;
+                       else
+                               lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
                        break;
 
        // this is complicated because Win32 seems to pack multiple mouse events into
@@ -576,7 +591,11 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM  wParam, LPARAM lParam)
                        if (wParam & MK_XBUTTON7)
                                temp |= 512;
 
+#ifdef SUPPORTDIRECTX
                        if (vid_usingmouse && !dinput_acquired)
+#else
+                       if (vid_usingmouse)
+#endif
                        {
                                // perform button actions
                                int i;
@@ -824,13 +843,21 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int refreshrat
        // if stencil is enabled, ask for alpha too
        if (bpp >= 32)
        {
-               pfd.cStencilBits = 8;
+               pfd.cRedBits = 8;
+               pfd.cGreenBits = 8;
+               pfd.cBlueBits = 8;
                pfd.cAlphaBits = 8;
+               pfd.cDepthBits = 24;
+               pfd.cStencilBits = 8;
        }
        else
        {
-               pfd.cStencilBits = 0;
+               pfd.cRedBits = 5;
+               pfd.cGreenBits = 5;
+               pfd.cBlueBits = 5;
                pfd.cAlphaBits = 0;
+               pfd.cDepthBits = 16;
+               pfd.cStencilBits = 0;
        }
 
        if (stereobuffer)
@@ -854,7 +881,7 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int refreshrat
                *a++ = WGL_BLUE_BITS_ARB;
                *a++ = 8;
                *a++ = WGL_ALPHA_BITS_ARB;
-               *a++ = 1;
+               *a++ = 8;
                *a++ = WGL_DEPTH_BITS_ARB;
                *a++ = 24;
                *a++ = WGL_STENCIL_BITS_ARB;
@@ -1068,8 +1095,12 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int refreshrat
 
        pixelformat = 0;
        newpixelformat = 0;
-       for (windowpass = 0;windowpass < 2;windowpass++)
+       // start out at the final windowpass if samples is 1 as it's the only feature we need extended pixel formats for
+       for (windowpass = samples == 1;windowpass < 2;windowpass++)
        {
+               gl_extensions = "";
+               gl_platformextensions = "";
+
                mainwindow = CreateWindowEx (ExWindowStyle, "DarkPlacesWindowClass", gamename, WindowStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, global_hInstance, NULL);
                if (!mainwindow)
                {
@@ -1127,15 +1158,20 @@ int VID_InitMode (int fullscreen, int width, int height, int bpp, int refreshrat
                if ((qwglGetExtensionsStringARB = (const char *(WINAPI *)(HDC hdc))GL_GetProcAddress("wglGetExtensionsStringARB")) == NULL)
                        Con_Print("wglGetExtensionsStringARB not found\n");
 
-               gl_renderer = qglGetString(GL_RENDERER);
-               gl_vendor = qglGetString(GL_VENDOR);
-               gl_version = qglGetString(GL_VERSION);
-               gl_extensions = qglGetString(GL_EXTENSIONS);
+               gl_renderer = (const char *)qglGetString(GL_RENDERER);
+               gl_vendor = (const char *)qglGetString(GL_VENDOR);
+               gl_version = (const char *)qglGetString(GL_VERSION);
+               gl_extensions = (const char *)qglGetString(GL_EXTENSIONS);
                gl_platform = "WGL";
                gl_platformextensions = "";
 
                if (qwglGetExtensionsStringARB)
-                       gl_platformextensions = qwglGetExtensionsStringARB(baseDC);
+                       gl_platformextensions = (const char *)qwglGetExtensionsStringARB(baseDC);
+
+               if (!gl_extensions)
+                       gl_extensions = "";
+               if (!gl_platformextensions)
+                       gl_platformextensions = "";
 
                // now some nice Windows pain:
                // we have created a window, we needed one to find out if there are
@@ -1265,12 +1301,14 @@ static void IN_Activate (qboolean grab)
                {
                        vid_usingmouse = true;
                        cl_ignoremousemoves = 2;
+#ifdef SUPPORTDIRECTX
                        if (dinput && g_pMouse)
                        {
                                IDirectInputDevice_Acquire(g_pMouse);
                                dinput_acquired = true;
                        }
                        else
+#endif
                        {
                                RECT window_rect;
                                window_rect.left = window_x;
@@ -1304,12 +1342,14 @@ static void IN_Activate (qboolean grab)
                {
                        vid_usingmouse = false;
                        cl_ignoremousemoves = 2;
+#ifdef SUPPORTDIRECTX
                        if (dinput_acquired)
                        {
                                IDirectInputDevice_Unacquire(g_pMouse);
                                dinput_acquired = false;
                        }
                        else
+#endif
                        {
                                // restore system mouseparms if we changed them
                                if (restore_spi)
@@ -1324,6 +1364,7 @@ static void IN_Activate (qboolean grab)
 }
 
 
+#ifdef SUPPORTDIRECTX
 /*
 ===========
 IN_InitDInput
@@ -1413,6 +1454,7 @@ static qboolean IN_InitDInput (void)
 
        return true;
 }
+#endif
 
 
 /*
@@ -1427,6 +1469,7 @@ static void IN_StartupMouse (void)
 
        mouseinitialized = true;
 
+#ifdef SUPPORTDIRECTX
 // COMMANDLINEOPTION: Windows Input: -dinput enables DirectInput for mouse/joystick input
        if (COM_CheckParm ("-dinput"))
                dinput = IN_InitDInput ();
@@ -1435,6 +1478,7 @@ static void IN_StartupMouse (void)
                Con_Print("DirectInput initialized\n");
        else
                Con_Print("DirectInput not initialized\n");
+#endif
 
        mouse_buttons = 10;
 }
@@ -1447,7 +1491,7 @@ IN_MouseMove
 */
 static void IN_MouseMove (void)
 {
-       int i, mx, my;
+       int mx, my;
        POINT current_pos;
 
        if (!vid_usingmouse)
@@ -1457,8 +1501,10 @@ static void IN_MouseMove (void)
                return;
        }
 
+#ifdef SUPPORTDIRECTX
        if (dinput_acquired)
        {
+               int i;
                DIDEVICEOBJECTDATA      od;
                DWORD                           dwElements;
                HRESULT                         hr;
@@ -1547,6 +1593,7 @@ static void IN_MouseMove (void)
                in_mouse_y = my;
        }
        else
+#endif
        {
                GetCursorPos (&current_pos);
                mx = current_pos.x - (window_x + vid.width / 2);
@@ -2042,6 +2089,7 @@ static void IN_Shutdown(void)
 {
        IN_Activate (false);
 
+#ifdef SUPPORTDIRECTX
        if (g_pMouse)
                IDirectInputDevice_Release(g_pMouse);
        g_pMouse = NULL;
@@ -2049,4 +2097,5 @@ static void IN_Shutdown(void)
        if (g_pdi)
                IDirectInput_Release(g_pdi);
        g_pdi = NULL;
+#endif
 }