diff --git a/panda/src/wdxdisplay/wdxGraphicsWindow.cxx b/panda/src/wdxdisplay/wdxGraphicsWindow.cxx index 89b0a1253c..c7ea9cfdb3 100644 --- a/panda/src/wdxdisplay/wdxGraphicsWindow.cxx +++ b/panda/src/wdxdisplay/wdxGraphicsWindow.cxx @@ -435,18 +435,29 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { return DefWindowProc(hwnd, msg, wparam, lparam); case WM_DISPLAYCHANGE: + + #ifdef _DEBUG + width = LOWORD(lparam); height = HIWORD(lparam); + wdxdisplay_cat.spam() <<"WM_DISPLAYCHANGE received with width:" << width << " height: " << height << " bpp: " << wparam<< endl; + #endif + if(!dx_full_screen) { wdxdisplay_cat.fatal() << "WM_DISPLAYCHANGE received: fatal error, desktop bitdepth change not handled\n"; exit(1); } case WM_SIZE: { - if(_mwindow==NULL) + if((_mwindow==NULL) || (wparam == SIZE_RESTORED)) // added SIZE_RESTORED to handle 3dfx case return DefWindowProc(hwnd, msg, wparam, lparam); width = LOWORD(lparam); height = HIWORD(lparam); #ifdef _DEBUG - wdxdisplay_cat.spam() << "WM_SIZE received with width:" << width << " height: " << height << endl; + if(msg==WM_SIZE) { + wdxdisplay_cat.spam() << "WM_SIZE received with width:" << width << " height: " << height << " flags: " << + ((wparam == SIZE_MAXHIDE)? "SIZE_MAXHIDE " : "") << ((wparam == SIZE_MAXSHOW)? "SIZE_MAXSHOW " : "") << + ((wparam == SIZE_MINIMIZED)? "SIZE_MINIMIZED " : "") << ((wparam == SIZE_RESTORED)? "SIZE_RESTORED " : "") << + ((wparam == SIZE_MAXIMIZED)? "SIZE_MAXIMIZED " : "") << endl; + } #endif if (_props._xsize != width || _props._ysize != height) { DXGraphicsStateGuardian* dxgsg = DCAST(DXGraphicsStateGuardian, _gsg); @@ -495,6 +506,7 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { handle_mouse_entry(MOUSE_EXITED,hMouseCrossIcon); return 0; + default: return DefWindowProc(hwnd, msg, wparam, lparam); } @@ -1190,6 +1202,22 @@ HRESULT WINAPI EnumDisplayModesCallBack(LPDDSURFACEDESC2 lpDDSurfaceDesc,LPVOID return DDENUMRET_OK; } +BOOL WINAPI DriverEnumCallback( GUID* pGUID, TCHAR* strDesc,TCHAR* strName, + VOID *argptr, HMONITOR hm) { + if(hm!=NULL) // skip over non-primary display devices + return DDENUMRET_OK; + + // primary display driver will have NULL guid + // ignore that and save any non-null value, whic + // indicates a secondary driver, which is usually voodoo1/2 + if(pGUID!=NULL) { + memcpy(argptr,pGUID,sizeof(GUID)); + } + + return DDENUMRET_OK; +} + + //////////////////////////////////////////////////////////////////// // Function: dx_setup // Description: Set up the DirectX environment. The size of the @@ -1208,6 +1236,7 @@ dx_setup() LPDIRECTDRAW7 pDD; RECT view_rect; int i; + HRESULT hr; DX_DECLARE_CLEAN( DDSURFACEDESC2, SurfaceDesc ); // Check for DirectX 7 by looking for DirectDrawCreateEx @@ -1222,9 +1251,25 @@ dx_setup() wdxdisplay_cat.fatal() << "wdxGraphicsWindow::config() - Panda currently requires DirectX 7.0!" << endl; exit(1); } - + + GUID DriverGUID; + ZeroMemory(&DriverGUID,sizeof(GUID)); + + // search for early voodoo-type non-primary display drivers + // if they exist, use them for 3D (could examine 3D devices on all + // drivers and pick the best one, but I'll assume the computer setuper knows what he's doing) + if( hr = DirectDrawEnumerateEx( DriverEnumCallback, &DriverGUID, DDENUM_NONDISPLAYDEVICES )) { + wdxdisplay_cat.fatal() << "wdxGraphicsWindow::config() - DirectDrawEnumerateEx failed : result = " << ConvD3DErrorToString(hr) << endl; + exit(1); + } + + GUID *pOurDriverGUID=NULL; + if(DriverGUID.Data1 != 0x0) { // assumes no driver guid ever starts with 0, so 0 means Enum found no voodoo-type device + pOurDriverGUID=&DriverGUID; + } + // Create the Direct Draw Object - HRESULT hr = DirectDrawCreateEx(NULL, (void **)&pDD, IID_IDirectDraw7, NULL); + hr = DirectDrawCreateEx(pOurDriverGUID, (void **)&pDD, IID_IDirectDraw7, NULL); if (hr != DD_OK) { wdxdisplay_cat.fatal() << "wdxGraphicsWindow::config() - DirectDrawCreateEx failed : result = " << ConvD3DErrorToString(hr) << endl; @@ -1365,17 +1410,19 @@ dx_setup() } #endif + if( FAILED( hr = pDD->SetDisplayMode( dwRenderWidth, dwRenderHeight, + dwFullScreenBitDepth, 0L, 0L ))) { + wdxdisplay_cat.fatal() << "wdxGraphicsWindow::CreateFullscreenBuffers() - Can't set display mode : result = " << ConvD3DErrorToString(hr) << endl; + exit(1); + } + + if(FAILED(hr = pDD->SetCooperativeLevel(_mwindow, DDSCL_FPUSETUP | DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT ))) { wdxdisplay_cat.fatal() << "wdxGraphicsWindow::config() - SetCooperativeLevel failed : result = " << ConvD3DErrorToString(hr) << endl; exit(1); } - if( FAILED( hr = pDD->SetDisplayMode( dwRenderWidth, dwRenderHeight, - dwFullScreenBitDepth, 0L, 0L ))) { - wdxdisplay_cat.fatal() << "wdxGraphicsWindow::CreateFullscreenBuffers() - Can't set display mode : result = " << ConvD3DErrorToString(hr) << endl; - exit(1); - } #ifdef _DEBUG wdxdisplay_cat.debug() << "wdxGraphicsWindow::setting displaymode to " << dwRenderWidth << "x" << dwRenderHeight << " at "<< dwFullScreenBitDepth << "bpp" <