Browse Source

fixes to get 3dfx voodoo1/2 working

georges 25 years ago
parent
commit
ee0ccc23e0
1 changed files with 56 additions and 9 deletions
  1. 56 9
      panda/src/wdxdisplay/wdxGraphicsWindow.cxx

+ 56 - 9
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);
       return DefWindowProc(hwnd, msg, wparam, lparam);
 
 
     case WM_DISPLAYCHANGE:
     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) {
         if(!dx_full_screen) {
             wdxdisplay_cat.fatal() << "WM_DISPLAYCHANGE received:  fatal error, desktop bitdepth change not handled\n";
             wdxdisplay_cat.fatal() << "WM_DISPLAYCHANGE received:  fatal error, desktop bitdepth change not handled\n";
             exit(1);
             exit(1);
         }
         }
 
 
     case WM_SIZE: {
     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);
            return DefWindowProc(hwnd, msg, wparam, lparam);
 
 
 		width = LOWORD(lparam);  height = HIWORD(lparam);
 		width = LOWORD(lparam);  height = HIWORD(lparam);
 #ifdef _DEBUG
 #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
 #endif
         if (_props._xsize != width || _props._ysize != height) {
         if (_props._xsize != width || _props._ysize != height) {
         	DXGraphicsStateGuardian* dxgsg = DCAST(DXGraphicsStateGuardian, _gsg);
         	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);
           handle_mouse_entry(MOUSE_EXITED,hMouseCrossIcon);
       return 0;
       return 0;
 
 
+
     default:
     default:
       return DefWindowProc(hwnd, msg, wparam, lparam);
       return DefWindowProc(hwnd, msg, wparam, lparam);
   }
   }
@@ -1190,6 +1202,22 @@ HRESULT WINAPI EnumDisplayModesCallBack(LPDDSURFACEDESC2 lpDDSurfaceDesc,LPVOID
     return DDENUMRET_OK;    
     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
 //     Function: dx_setup
 //  Description: Set up the DirectX environment.  The size of the
 //  Description: Set up the DirectX environment.  The size of the
@@ -1208,6 +1236,7 @@ dx_setup()
       LPDIRECTDRAW7		    pDD;
       LPDIRECTDRAW7		    pDD;
       RECT view_rect;
       RECT view_rect;
       int i;
       int i;
+      HRESULT hr;
       DX_DECLARE_CLEAN( DDSURFACEDESC2, SurfaceDesc );    
       DX_DECLARE_CLEAN( DDSURFACEDESC2, SurfaceDesc );    
 
 
       // Check for DirectX 7 by looking for DirectDrawCreateEx
       // 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;
       	   wdxdisplay_cat.fatal() << "wdxGraphicsWindow::config() - Panda currently requires DirectX 7.0!" << endl;
            exit(1);
            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
       // 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) {
       if (hr != DD_OK) {
     	  wdxdisplay_cat.fatal()
     	  wdxdisplay_cat.fatal()
           << "wdxGraphicsWindow::config() - DirectDrawCreateEx failed : result = " << ConvD3DErrorToString(hr) << endl;
           << "wdxGraphicsWindow::config() - DirectDrawCreateEx failed : result = " << ConvD3DErrorToString(hr) << endl;
@@ -1365,17 +1410,19 @@ dx_setup()
         }
         }
 #endif
 #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 ))) {
         if(FAILED(hr = pDD->SetCooperativeLevel(_mwindow, DDSCL_FPUSETUP | DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT ))) {
              wdxdisplay_cat.fatal()
              wdxdisplay_cat.fatal()
              << "wdxGraphicsWindow::config() - SetCooperativeLevel failed : result = " << ConvD3DErrorToString(hr) << endl;
              << "wdxGraphicsWindow::config() - SetCooperativeLevel failed : result = " << ConvD3DErrorToString(hr) << endl;
              exit(1);
              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
 #ifdef _DEBUG
 		wdxdisplay_cat.debug() << "wdxGraphicsWindow::setting displaymode to " << dwRenderWidth << "x" << dwRenderHeight << " at "<< dwFullScreenBitDepth  << "bpp" <<endl;
 		wdxdisplay_cat.debug() << "wdxGraphicsWindow::setting displaymode to " << dwRenderWidth << "x" << dwRenderHeight << " at "<< dwFullScreenBitDepth  << "bpp" <<endl;