X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=vid_wgl.c;h=fa0091dcb4ed10b5d2cde13c9908dcf04236e8a7;hb=ff2b13639f3e5b83386155944f4d1efee3582ed2;hp=7989055390be5cb11f175519dbf85ed800e30487;hpb=382a7a71d5ec964221778bfc1fb5bb31a635ba10;p=xonotic%2Fdarkplaces.git diff --git a/vid_wgl.c b/vid_wgl.c index 79890553..fa0091dc 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -45,27 +45,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifdef SUPPORTDIRECTX #include #endif -#include "dpsoftrast.h" - -#ifdef SUPPORTD3D -#include - -cvar_t vid_dx9 = {CVAR_SAVE, "vid_dx9", "0", "use Microsoft Direct3D9(r) for rendering"}; -cvar_t vid_dx9_hal = {CVAR_SAVE, "vid_dx9_hal", "1", "enables hardware rendering (1), otherwise software reference rasterizer (0 - very slow), note that 0 is necessary when using NVPerfHUD (which renders in hardware but requires this option to enable it)"}; -cvar_t vid_dx9_softvertex = {CVAR_SAVE, "vid_dx9_softvertex", "0", "enables software vertex processing (for compatibility testing? or if you have a very fast CPU), usually you want this off"}; -cvar_t vid_dx9_triplebuffer = {CVAR_SAVE, "vid_dx9_triplebuffer", "0", "enables triple buffering when using vid_vsync in fullscreen, this options adds some latency and only helps when framerate is below 60 so you usually don't want it"}; -//cvar_t vid_dx10 = {CVAR_SAVE, "vid_dx10", "1", "use Microsoft Direct3D10(r) for rendering"}; -//cvar_t vid_dx11 = {CVAR_SAVE, "vid_dx11", "1", "use Microsoft Direct3D11(r) for rendering"}; - -D3DPRESENT_PARAMETERS vid_d3dpresentparameters; - -// we declare this in vid_shared.c because it is required by dedicated server and all clients when SUPPORTD3D is defined -extern LPDIRECT3DDEVICE9 vid_d3d9dev; - -LPDIRECT3D9 vid_d3d9; -D3DCAPS9 vid_d3d9caps; -qboolean vid_d3ddevicelost; -#endif extern HINSTANCE global_hInstance; @@ -141,11 +120,6 @@ HWND mainwindow; static HDC baseDC; static HGLRC baseRC; -static HDC vid_softhdc; -static HGDIOBJ vid_softhdc_backup; -static BITMAPINFO vid_softbmi; -static HBITMAP vid_softdibhandle; - //HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow); static qboolean vid_isfullscreen; @@ -216,19 +190,13 @@ static HINSTANCE hInstDI; // forward-referenced functions static void IN_StartupMouse (void); -static void AdjustWindowBounds(int fullscreen, int &width, int &height, viddef_mode_t *mode, DWORD WindowStyle, RECT &rect); +static void AdjustWindowBounds(int fullscreen, int *width, int *height, viddef_mode_t *mode, DWORD WindowStyle, RECT *rect); //==================================== qboolean vid_reallyhidden = true; -#ifdef SUPPORTD3D -qboolean vid_begunscene = false; -#endif void VID_Finish (void) { -#ifdef SUPPORTD3D - HRESULT hr; -#endif vid_hidden = vid_reallyhidden; vid_usevsync = vid_vsync.integer && !cls.timedemo && qwglSwapIntervalEXT; @@ -237,10 +205,7 @@ void VID_Finish (void) { switch(vid.renderpath) { - case RENDERPATH_GL11: - case RENDERPATH_GL13: case RENDERPATH_GL20: - case RENDERPATH_GLES1: case RENDERPATH_GLES2: if (vid_usingvsync != vid_usevsync) { @@ -251,68 +216,6 @@ void VID_Finish (void) GL_Finish(); SwapBuffers(baseDC); break; - case RENDERPATH_D3D9: -#ifdef SUPPORTD3D - if (vid_begunscene) - { - IDirect3DDevice9_EndScene(vid_d3d9dev); - vid_begunscene = false; - } - if (!vid_reallyhidden) - { - if (!vid_d3ddevicelost) - { - vid_hidden = vid_reallyhidden; - hr = IDirect3DDevice9_Present(vid_d3d9dev, NULL, NULL, NULL, NULL); - if (hr == D3DERR_DEVICELOST) - { - vid_d3ddevicelost = true; - vid_hidden = true; - Sleep(100); - } - } - else - { - hr = IDirect3DDevice9_TestCooperativeLevel(vid_d3d9dev); - switch(hr) - { - case D3DERR_DEVICELOST: - vid_d3ddevicelost = true; - vid_hidden = true; - Sleep(100); - break; - case D3DERR_DEVICENOTRESET: - vid_d3ddevicelost = false; - vid_hidden = vid_reallyhidden; - R_Modules_DeviceLost(); - IDirect3DDevice9_Reset(vid_d3d9dev, &vid_d3dpresentparameters); - R_Modules_DeviceRestored(); - break; - case D3D_OK: - vid_hidden = vid_reallyhidden; - IDirect3DDevice9_Present(vid_d3d9dev, NULL, NULL, NULL, NULL); - break; - } - } - if (!vid_begunscene && !vid_hidden) - { - IDirect3DDevice9_BeginScene(vid_d3d9dev); - vid_begunscene = true; - } - } -#endif - break; - case RENDERPATH_D3D10: - break; - case RENDERPATH_D3D11: - break; - case RENDERPATH_SOFT: - DPSOFTRAST_Finish(); -// baseDC = GetDC(mainwindow); - BitBlt(baseDC, 0, 0, vid.width, vid.height, vid_softhdc, 0, 0, SRCCOPY); -// ReleaseDC(mainwindow, baseDC); -// baseDC = NULL; - break; } } @@ -321,7 +224,7 @@ void VID_Finish (void) // without this help Sleep(0); - VID_UpdateGamma(false, 256); + VID_UpdateGamma(); } //========================================================================== @@ -429,7 +332,7 @@ ClearAllStates */ static void ClearAllStates (void) { - Key_ClearStates (); + Key_ReleaseAll(); if (vid_usingmouse) mouse_oldbuttonstate = 0; } @@ -498,7 +401,6 @@ void AppActivate(BOOL fActive, BOOL minimize) ChangeDisplaySettings (NULL, CDS_FULLSCREEN); vid_wassuspended = true; } - VID_RestoreSystemGamma(); } } @@ -567,8 +469,8 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) break; case WM_MOVE: - window_x = (int) LOWORD(lParam); - window_y = (int) HIWORD(lParam); + window_x = (short) LOWORD(lParam); + window_y = (short) HIWORD(lParam); VID_SetMouse(false, false, false); break; @@ -711,32 +613,6 @@ LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return lRet; } -int VID_SetGamma(unsigned short *ramps, int rampsize) -{ - if (qwglMakeCurrent) - { - HDC hdc = GetDC (NULL); - int i = SetDeviceGammaRamp(hdc, ramps); - ReleaseDC (NULL, hdc); - return i; // return success or failure - } - else - return 0; -} - -int VID_GetGamma(unsigned short *ramps, int rampsize) -{ - if (qwglMakeCurrent) - { - HDC hdc = GetDC (NULL); - int i = GetDeviceGammaRamp(hdc, ramps); - ReleaseDC (NULL, hdc); - return i; // return success or failure - } - else - return 0; -} - static void GL_CloseLibrary(void) { if (gldll) @@ -842,15 +718,6 @@ void VID_Init(void) { WNDCLASS wc; -#ifdef SUPPORTD3D - Cvar_RegisterVariable(&vid_dx9); - Cvar_RegisterVariable(&vid_dx9_hal); - Cvar_RegisterVariable(&vid_dx9_softvertex); - Cvar_RegisterVariable(&vid_dx9_triplebuffer); -// Cvar_RegisterVariable(&vid_dx10); -// Cvar_RegisterVariable(&vid_dx11); -#endif - InitCommonControls(); hIcon = LoadIcon (global_hInstance, MAKEINTRESOURCE (IDI_ICON1)); @@ -1166,7 +1033,7 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) ExWindowStyle = 0; } - AdjustWindowBounds(fullscreen, width, height, mode, WindowStyle, rect); + AdjustWindowBounds(fullscreen, &width, &height, mode, WindowStyle, &rect); pixelformat = 0; newpixelformat = 0; @@ -1324,15 +1191,15 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) return true; } -static void AdjustWindowBounds(int fullscreen, int &width, int &height, viddef_mode_t *mode, DWORD WindowStyle, RECT &rect) +static void AdjustWindowBounds(int fullscreen, int *width, int *height, viddef_mode_t *mode, DWORD WindowStyle, RECT *rect) { int CenterX, CenterY; - rect.top = 0; - rect.left = 0; - rect.right = width; - rect.bottom = height; - AdjustWindowRectEx(&rect, WindowStyle, false, 0); + rect->top = 0; + rect->left = 0; + rect->right = *width; + rect->bottom = *height; + AdjustWindowRectEx(rect, WindowStyle, false, 0); if (fullscreen) { @@ -1349,514 +1216,33 @@ static void AdjustWindowBounds(int fullscreen, int &width, int &height, viddef_m // if height/width matches physical screen height/width, adjust it to available desktop size // and allow 2 pixels on top for the title bar so the window can be moved const int titleBarPixels = 2; - if (width == GetSystemMetrics(SM_CXSCREEN) && (height == GetSystemMetrics(SM_CYSCREEN) || height == workHeight - titleBarPixels)) + if (*width == GetSystemMetrics(SM_CXSCREEN) && (*height == GetSystemMetrics(SM_CYSCREEN) || *height == workHeight - titleBarPixels)) { - rect.right -= width - workWidth; - width = mode->width = workWidth; - rect.bottom -= height - (workHeight - titleBarPixels); - height = mode->height = workHeight - titleBarPixels; + rect->right -= *width - workWidth; + *width = mode->width = workWidth; + rect->bottom -= *height - (workHeight - titleBarPixels); + *height = mode->height = workHeight - titleBarPixels; CenterX = 0; CenterY = titleBarPixels; } else { - CenterX = max(0, (workWidth - width) / 2); - CenterY = max(0, (workHeight - height) / 2); + CenterX = max(0, (workWidth - *width) / 2); + CenterY = max(0, (workHeight - *height) / 2); } } // x and y may be changed by WM_MOVE messages window_x = CenterX; window_y = CenterY; - rect.left += CenterX; - rect.right += CenterX; - rect.top += CenterY; - rect.bottom += CenterY; -} - -#ifdef SUPPORTD3D -static D3DADAPTER_IDENTIFIER9 d3d9adapteridentifier; - -extern cvar_t gl_info_extensions; -extern cvar_t gl_info_vendor; -extern cvar_t gl_info_renderer; -extern cvar_t gl_info_version; -extern cvar_t gl_info_platform; -extern cvar_t gl_info_driver; -qboolean VID_InitModeDX(viddef_mode_t *mode, int version) -{ - int deviceindex; - RECT rect; - MSG msg; - DWORD WindowStyle, ExWindowStyle; - int bpp = mode->bitsperpixel; - int width = mode->width; - int height = mode->height; - int refreshrate = (int)floor(mode->refreshrate+0.5); -// int stereobuffer = mode->stereobuffer; - int samples = mode->samples; - int fullscreen = mode->fullscreen; - int numdevices; - - if (vid_initialized) - Sys_Error("VID_InitMode called when video is already initialised"); - - vid_isfullscreen = fullscreen != 0; - if (fullscreen) - { - WindowStyle = WS_POPUP; - ExWindowStyle = WS_EX_TOPMOST; - } - else - { - WindowStyle = WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; - ExWindowStyle = 0; - } - - AdjustWindowBounds(fullscreen, width, height, mode, WindowStyle, rect); - - 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) - { - Con_Printf("CreateWindowEx(%d, %s, %s, %d, %d, %d, %d, %d, %p, %p, %p, %p) failed\n", (int)ExWindowStyle, "DarkPlacesWindowClass", gamename, (int)WindowStyle, (int)(rect.left), (int)(rect.top), (int)(rect.right - rect.left), (int)(rect.bottom - rect.top), (void *)NULL, (void *)NULL, global_hInstance, (void *)NULL); - VID_Shutdown(); - return false; - } - - baseDC = GetDC(mainwindow); - - vid_d3d9 = Direct3DCreate9(D3D_SDK_VERSION); - if (!vid_d3d9) - Sys_Error("VID_InitMode: Direct3DCreate9 failed"); - - numdevices = IDirect3D9_GetAdapterCount(vid_d3d9); - vid_d3d9dev = NULL; - memset(&d3d9adapteridentifier, 0, sizeof(d3d9adapteridentifier)); - for (deviceindex = 0;deviceindex < numdevices && !vid_d3d9dev;deviceindex++) - { - memset(&vid_d3dpresentparameters, 0, sizeof(vid_d3dpresentparameters)); -// vid_d3dpresentparameters.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL; - vid_d3dpresentparameters.Flags = 0; - vid_d3dpresentparameters.SwapEffect = D3DSWAPEFFECT_DISCARD; - vid_d3dpresentparameters.hDeviceWindow = mainwindow; - vid_d3dpresentparameters.BackBufferWidth = width; - vid_d3dpresentparameters.BackBufferHeight = height; - vid_d3dpresentparameters.MultiSampleType = samples > 1 ? (D3DMULTISAMPLE_TYPE)samples : D3DMULTISAMPLE_NONE; - vid_d3dpresentparameters.BackBufferCount = fullscreen ? (vid_dx9_triplebuffer.integer ? 3 : 2) : 1; - vid_d3dpresentparameters.FullScreen_RefreshRateInHz = fullscreen ? refreshrate : 0; - vid_d3dpresentparameters.Windowed = !fullscreen; - vid_d3dpresentparameters.EnableAutoDepthStencil = true; - vid_d3dpresentparameters.AutoDepthStencilFormat = bpp > 16 ? D3DFMT_D24S8 : D3DFMT_D16; - vid_d3dpresentparameters.BackBufferFormat = fullscreen?D3DFMT_X8R8G8B8:D3DFMT_UNKNOWN; - vid_d3dpresentparameters.PresentationInterval = vid_vsync.integer ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; - - memset(&d3d9adapteridentifier, 0, sizeof(d3d9adapteridentifier)); - IDirect3D9_GetAdapterIdentifier(vid_d3d9, deviceindex, 0, &d3d9adapteridentifier); - - IDirect3D9_CreateDevice(vid_d3d9, deviceindex, vid_dx9_hal.integer ? D3DDEVTYPE_HAL : D3DDEVTYPE_REF, mainwindow, vid_dx9_softvertex.integer ? D3DCREATE_SOFTWARE_VERTEXPROCESSING : D3DCREATE_HARDWARE_VERTEXPROCESSING, &vid_d3dpresentparameters, &vid_d3d9dev); - } - - if (!vid_d3d9dev) - { - VID_Shutdown(); - return false; - } - - IDirect3DDevice9_GetDeviceCaps(vid_d3d9dev, &vid_d3d9caps); - - Con_Printf("Using D3D9 device: %s\n", d3d9adapteridentifier.Description); - gl_extensions = ""; - gl_platform = "D3D9"; - gl_platformextensions = ""; - - ShowWindow (mainwindow, SW_SHOWDEFAULT); - UpdateWindow (mainwindow); - - // now we try to make sure we get the focus on the mode switch, because - // sometimes in some systems we don't. We grab the foreground, then - // finish setting up, pump all our messages, and sleep for a little while - // to let messages finish bouncing around the system, then we put - // ourselves at the top of the z order, then grab the foreground again, - // Who knows if it helps, but it probably doesn't hurt - SetForegroundWindow (mainwindow); - - while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) - { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - Sleep (100); - - SetWindowPos (mainwindow, HWND_TOP, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOCOPYBITS); - - SetForegroundWindow (mainwindow); - - // fix the leftover Alt from any Alt-Tab or the like that switched us away - ClearAllStates (); - - gl_renderer = d3d9adapteridentifier.Description; - gl_vendor = d3d9adapteridentifier.Driver; - gl_version = ""; - gl_extensions = ""; - - Con_Printf("D3D9 adapter info:\n"); - Con_Printf("Description: %s\n", d3d9adapteridentifier.Description); - Con_Printf("DeviceId: %x\n", (unsigned int)d3d9adapteridentifier.DeviceId); - Con_Printf("DeviceName: %p\n", d3d9adapteridentifier.DeviceName); - Con_Printf("Driver: %s\n", d3d9adapteridentifier.Driver); - Con_Printf("DriverVersion: %08x%08x\n", (unsigned int)d3d9adapteridentifier.DriverVersion.u.HighPart, (unsigned int)d3d9adapteridentifier.DriverVersion.u.LowPart); - Con_DPrintf("GL_EXTENSIONS: %s\n", gl_extensions); - Con_DPrintf("%s_EXTENSIONS: %s\n", gl_platform, gl_platformextensions); - - // clear the extension flags - memset(&vid.support, 0, sizeof(vid.support)); - Cvar_SetQuick(&gl_info_extensions, ""); - - // D3D9 requires BGRA - vid.forcetextype = TEXTYPE_BGRA; - - vid.forcevbo = false; - vid.support.arb_depth_texture = true; - vid.support.arb_draw_buffers = vid_d3d9caps.NumSimultaneousRTs > 1; - vid.support.arb_occlusion_query = true; // can't find a cap for this - vid.support.arb_query_buffer_object = true; - vid.support.arb_shadow = true; - vid.support.arb_texture_compression = true; - vid.support.arb_texture_cube_map = true; - vid.support.arb_texture_non_power_of_two = (vid_d3d9caps.TextureCaps & D3DPTEXTURECAPS_POW2) == 0; - vid.support.arb_vertex_buffer_object = true; - vid.support.ext_blend_subtract = true; - vid.support.ext_draw_range_elements = true; - vid.support.ext_framebuffer_object = true; - - vid.support.ext_texture_3d = true; - vid.support.ext_texture_compression_s3tc = true; - vid.support.ext_texture_filter_anisotropic = true; - vid.support.ati_separate_stencil = (vid_d3d9caps.StencilCaps & D3DSTENCILCAPS_TWOSIDED) != 0; - vid.support.ext_texture_srgb = false; // FIXME use D3DSAMP_SRGBTEXTURE if CheckDeviceFormat agrees - - vid.maxtexturesize_2d = min(vid_d3d9caps.MaxTextureWidth, vid_d3d9caps.MaxTextureHeight); - vid.maxtexturesize_3d = vid_d3d9caps.MaxVolumeExtent; - vid.maxtexturesize_cubemap = vid.maxtexturesize_2d; - vid.texunits = 4; - vid.teximageunits = vid_d3d9caps.MaxSimultaneousTextures; - vid.texarrayunits = 8; // can't find a caps field for this? - vid.max_anisotropy = vid_d3d9caps.MaxAnisotropy; - vid.maxdrawbuffers = vid_d3d9caps.NumSimultaneousRTs; - - vid.texunits = bound(4, vid.texunits, MAX_TEXTUREUNITS); - vid.teximageunits = bound(16, vid.teximageunits, MAX_TEXTUREUNITS); - vid.texarrayunits = bound(8, vid.texarrayunits, MAX_TEXTUREUNITS); - Con_DPrintf("Using D3D9.0 rendering path - %i texture matrix, %i texture images, %i texcoords, shadowmapping supported%s\n", vid.texunits, vid.teximageunits, vid.texarrayunits, vid.maxdrawbuffers > 1 ? ", MRT detected (allows prepass deferred lighting)" : ""); - vid.renderpath = RENDERPATH_D3D9; - vid.sRGBcapable2D = false; - vid.sRGBcapable3D = true; - vid.useinterleavedarrays = true; - - Cvar_SetQuick(&gl_info_vendor, gl_vendor); - Cvar_SetQuick(&gl_info_renderer, gl_renderer); - Cvar_SetQuick(&gl_info_version, gl_version); - Cvar_SetQuick(&gl_info_platform, gl_platform ? gl_platform : ""); - Cvar_SetQuick(&gl_info_driver, gl_driver); - - // LordHavoc: report supported extensions - Con_DPrintf("\nQuakeC extensions for server and client: %s\nQuakeC extensions for menu: %s\n", vm_sv_extensions, vm_m_extensions ); - - // clear to black (loading plaque will be seen over this) - IDirect3DDevice9_Clear(vid_d3d9dev, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); - IDirect3DDevice9_BeginScene(vid_d3d9dev); - IDirect3DDevice9_EndScene(vid_d3d9dev); - IDirect3DDevice9_Present(vid_d3d9dev, NULL, NULL, NULL, NULL); - // because the only time we end/begin scene is in VID_Finish, we'd better start a scene now... - IDirect3DDevice9_BeginScene(vid_d3d9dev); - vid_begunscene = true; - - //vid_menudrawfn = VID_MenuDraw; - //vid_menukeyfn = VID_MenuKey; - vid_usingmouse = false; - vid_usinghidecursor = false; - vid_usingvsync = false; - vid_hidden = vid_reallyhidden = false; - vid_initialized = true; - - IN_StartupMouse (); - - return true; -} -#endif - -qboolean VID_InitModeSOFT(viddef_mode_t *mode) -{ - int i; - HDC hdc; - RECT rect; - MSG msg; - int pixelformat, newpixelformat; - DWORD WindowStyle, ExWindowStyle; - int depth; - DEVMODE thismode; - qboolean foundmode, foundgoodmode; - int bpp = mode->bitsperpixel; - int width = mode->width; - int height = mode->height; - int refreshrate = (int)floor(mode->refreshrate+0.5); - int fullscreen = mode->fullscreen; - - if (vid_initialized) - Sys_Error("VID_InitMode called when video is already initialised"); - - memset(&gdevmode, 0, sizeof(gdevmode)); - - vid_isfullscreen = false; - if (fullscreen) - { - if(vid_forcerefreshrate.integer) - { - foundmode = true; - gdevmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; - gdevmode.dmBitsPerPel = bpp; - gdevmode.dmPelsWidth = width; - gdevmode.dmPelsHeight = height; - gdevmode.dmSize = sizeof (gdevmode); - if(refreshrate) - { - gdevmode.dmFields |= DM_DISPLAYFREQUENCY; - gdevmode.dmDisplayFrequency = refreshrate; - } - } - else - { - if(refreshrate == 0) - refreshrate = initialdevmode.dmDisplayFrequency; // default vid_refreshrate to the rate of the desktop - - foundmode = false; - foundgoodmode = false; - - thismode.dmSize = sizeof(thismode); - thismode.dmDriverExtra = 0; - for(i = 0; EnumDisplaySettings(NULL, i, &thismode); ++i) - { - if(~thismode.dmFields & (DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY)) - { - Con_DPrintf("enumerating modes yielded a bogus item... please debug this\n"); - continue; - } - if(developer_extra.integer) - Con_DPrintf("Found mode %dx%dx%dbpp %dHz... ", (int)thismode.dmPelsWidth, (int)thismode.dmPelsHeight, (int)thismode.dmBitsPerPel, (int)thismode.dmDisplayFrequency); - if(thismode.dmBitsPerPel != (DWORD)bpp) - { - if(developer_extra.integer) - Con_DPrintf("wrong bpp\n"); - continue; - } - if(thismode.dmPelsWidth != (DWORD)width) - { - if(developer_extra.integer) - Con_DPrintf("wrong width\n"); - continue; - } - if(thismode.dmPelsHeight != (DWORD)height) - { - if(developer_extra.integer) - Con_DPrintf("wrong height\n"); - continue; - } - - if(foundgoodmode) - { - // if we have a good mode, make sure this mode is better than the previous one, and allowed by the refreshrate - if(thismode.dmDisplayFrequency > (DWORD)refreshrate) - { - if(developer_extra.integer) - Con_DPrintf("too high refresh rate\n"); - continue; - } - else if(thismode.dmDisplayFrequency <= gdevmode.dmDisplayFrequency) - { - if(developer_extra.integer) - Con_DPrintf("doesn't beat previous best match (too low)\n"); - continue; - } - } - else if(foundmode) - { - // we do have one, but it isn't good... make sure it has a lower frequency than the previous one - if(thismode.dmDisplayFrequency >= gdevmode.dmDisplayFrequency) - { - if(developer_extra.integer) - Con_DPrintf("doesn't beat previous best match (too high)\n"); - continue; - } - } - // otherwise, take anything - - memcpy(&gdevmode, &thismode, sizeof(gdevmode)); - if(thismode.dmDisplayFrequency <= (DWORD)refreshrate) - foundgoodmode = true; - else - { - if(developer_extra.integer) - Con_DPrintf("(out of range)\n"); - } - foundmode = true; - if(developer_extra.integer) - Con_DPrintf("accepted\n"); - } - } - - if (!foundmode) - { - VID_Shutdown(); - Con_Printf("Unable to find the requested mode %dx%dx%dbpp\n", width, height, bpp); - return false; - } - else if(ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) - { - VID_Shutdown(); - Con_Printf("Unable to change to requested mode %dx%dx%dbpp\n", width, height, bpp); - return false; - } - - vid_isfullscreen = true; - WindowStyle = WS_POPUP; - ExWindowStyle = WS_EX_TOPMOST; - } - else - { - hdc = GetDC (NULL); - i = GetDeviceCaps(hdc, RASTERCAPS); - depth = GetDeviceCaps(hdc, PLANES) * GetDeviceCaps(hdc, BITSPIXEL); - ReleaseDC (NULL, hdc); - if (i & RC_PALETTE) - { - VID_Shutdown(); - Con_Print("Can't run in non-RGB mode\n"); - return false; - } - if (bpp > depth) - { - VID_Shutdown(); - Con_Print("A higher desktop depth is required to run this video mode\n"); - return false; - } - - WindowStyle = WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; - ExWindowStyle = 0; - } - - AdjustWindowBounds(fullscreen, width, height, mode, WindowStyle, rect); - - pixelformat = 0; - newpixelformat = 0; - 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) - { - Con_Printf("CreateWindowEx(%d, %s, %s, %d, %d, %d, %d, %d, %p, %p, %p, %p) failed\n", (int)ExWindowStyle, "DarkPlacesWindowClass", gamename, (int)WindowStyle, (int)(rect.left), (int)(rect.top), (int)(rect.right - rect.left), (int)(rect.bottom - rect.top), (void *)NULL, (void *)NULL, (void *)global_hInstance, (void *)NULL); - VID_Shutdown(); - return false; - } - - baseDC = GetDC(mainwindow); - vid.softpixels = NULL; - memset(&vid_softbmi, 0, sizeof(vid_softbmi)); - vid_softbmi.bmiHeader.biSize = sizeof(vid_softbmi.bmiHeader); - vid_softbmi.bmiHeader.biWidth = width; - vid_softbmi.bmiHeader.biHeight = -height; // negative to make a top-down bitmap - vid_softbmi.bmiHeader.biPlanes = 1; - vid_softbmi.bmiHeader.biBitCount = 32; - vid_softbmi.bmiHeader.biCompression = BI_RGB; - vid_softbmi.bmiHeader.biSizeImage = width*height*4; - vid_softbmi.bmiHeader.biClrUsed = 256; - vid_softbmi.bmiHeader.biClrImportant = 256; - vid_softdibhandle = CreateDIBSection(baseDC, &vid_softbmi, DIB_RGB_COLORS, (void **)&vid.softpixels, NULL, 0); - if (!vid_softdibhandle) - { - Con_Printf("CreateDIBSection failed\n"); - VID_Shutdown(); - return false; - } - - vid_softhdc = CreateCompatibleDC(baseDC); - vid_softhdc_backup = SelectObject(vid_softhdc, vid_softdibhandle); - if (!vid_softhdc_backup) - { - Con_Printf("SelectObject failed\n"); - VID_Shutdown(); - return false; - } -// ReleaseDC(mainwindow, baseDC); -// baseDC = NULL; - - vid.softdepthpixels = (unsigned int *)calloc(1, mode->width * mode->height * 4); - if (DPSOFTRAST_Init(mode->width, mode->height, vid_soft_threads.integer, vid_soft_interlace.integer, (unsigned int *)vid.softpixels, (unsigned int *)vid.softdepthpixels) < 0) - { - Con_Printf("Failed to initialize software rasterizer\n"); - VID_Shutdown(); - return false; - } - - VID_Soft_SharedSetup(); - - ShowWindow (mainwindow, SW_SHOWDEFAULT); - UpdateWindow (mainwindow); - - // now we try to make sure we get the focus on the mode switch, because - // sometimes in some systems we don't. We grab the foreground, then - // finish setting up, pump all our messages, and sleep for a little while - // to let messages finish bouncing around the system, then we put - // ourselves at the top of the z order, then grab the foreground again, - // Who knows if it helps, but it probably doesn't hurt - SetForegroundWindow (mainwindow); - - while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) - { - TranslateMessage (&msg); - DispatchMessage (&msg); - } - - Sleep (100); - - SetWindowPos (mainwindow, HWND_TOP, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOCOPYBITS); - - SetForegroundWindow (mainwindow); - - // fix the leftover Alt from any Alt-Tab or the like that switched us away - ClearAllStates (); - - //vid_menudrawfn = VID_MenuDraw; - //vid_menukeyfn = VID_MenuKey; - vid_usingmouse = false; - vid_usinghidecursor = false; - vid_usingvsync = false; - vid_reallyhidden = vid_hidden = false; - vid_initialized = true; - - IN_StartupMouse (); - - return true; + rect->left += CenterX; + rect->right += CenterX; + rect->top += CenterY; + rect->bottom += CenterY; } qboolean VID_InitMode(viddef_mode_t *mode) { -#ifdef SSE_POSSIBLE - if (vid_soft.integer) - return VID_InitModeSOFT(mode); -#endif -#ifdef SUPPORTD3D -// if (vid_dx11.integer) -// return VID_InitModeDX(mode, 11); -// if (vid_dx10.integer) -// return VID_InitModeDX(mode, 10); - if (vid_dx9.integer) - return VID_InitModeDX(mode, 9); -#endif return VID_InitModeGL(mode); } @@ -1870,7 +1256,6 @@ void VID_Shutdown (void) VID_EnableJoystick(false); VID_SetMouse(false, false, false); - VID_RestoreSystemGamma(); vid_initialized = false; isgl = gldll != NULL; @@ -1879,35 +1264,6 @@ void VID_Shutdown (void) gl_extensions = ""; gl_platform = ""; gl_platformextensions = ""; - if (vid_softhdc) - { - SelectObject(vid_softhdc, vid_softhdc_backup); - ReleaseDC(mainwindow, vid_softhdc); - } - vid_softhdc = NULL; - vid_softhdc_backup = NULL; - if (vid_softdibhandle) - DeleteObject(vid_softdibhandle); - vid_softdibhandle = NULL; - vid.softpixels = NULL; - if (vid.softdepthpixels) - free(vid.softdepthpixels); - vid.softdepthpixels = NULL; -#ifdef SUPPORTD3D - if (vid_d3d9dev) - { - if (vid_begunscene) - IDirect3DDevice9_EndScene(vid_d3d9dev); - vid_begunscene = false; -// Cmd_ExecuteString("r_texturestats", src_command, true); -// Cmd_ExecuteString("memlist", src_command, true); - IDirect3DDevice9_Release(vid_d3d9dev); - } - vid_d3d9dev = NULL; - if (vid_d3d9) - IDirect3D9_Release(vid_d3d9); - vid_d3d9 = NULL; -#endif if (qwglMakeCurrent) qwglMakeCurrent(NULL, NULL); qwglMakeCurrent = NULL;