[WIN32SS] Introduce the NATIVE_REACTX define and disable some Dx calls (#6025)
authorJustin Miller <justin.miller@reactos.org>
Thu, 18 Apr 2024 04:47:49 +0000 (21:47 -0700)
committerGitHub <noreply@github.com>
Thu, 18 Apr 2024 04:47:49 +0000 (21:47 -0700)
The code itself isn't wrong but we're entirely missing the logic needed
to make it work. This leads to spontaneous crashes with video drivers and
various unity games.

win32ss/CMakeLists.txt
win32ss/gdi/eng/pdevobj.c

index 1d1adde..4f6f7ce 100644 (file)
@@ -4,6 +4,10 @@ set(USE_DIBLIB FALSE)
 # Give WIN32 subsystem its own project.
 PROJECT(WIN32SS)
 
+if (NATIVE_REACTX)
+    add_definitions(-DNATIVE_REACTX)
+endif()
+
 add_subdirectory(drivers)
 
 if(USE_DIBLIB)
index ed6fc63..66d81ea 100644 (file)
@@ -337,6 +337,7 @@ PDEVOBJ_pSurface(
     return ppdev->pSurface;
 }
 
+#ifdef NATIVE_REACTX
 BOOL
 PDEVOBJ_bEnableDirectDraw(
     _Inout_ PPDEVOBJ ppdev)
@@ -385,6 +386,7 @@ PDEVOBJ_vSwitchDirectDraw(
     TRACE("DxDdDynamicModeChange(ppdev %p, ppdev2 %p)\n", ppdev, ppdev2);
     pfnDdDynamicModeChange((HDEV)ppdev, (HDEV)ppdev2, 0);
 }
+#endif
 
 VOID
 PDEVOBJ_vEnableDisplay(
@@ -415,7 +417,9 @@ PDEVOBJ_bDisableDisplay(
     if (ppdev->flFlags & PDEV_DISABLED)
         return TRUE;
 
+#ifdef NATIVE_REACTX
     PDEVOBJ_vSuspendDirectDraw(ppdev);
+#endif
 
     TRACE("DrvAssertMode(dhpdev %p, FALSE)\n", ppdev->dhpdev);
     assertVal = ppdev->pfn.AssertMode(ppdev->dhpdev, FALSE);
@@ -600,6 +604,7 @@ PDEVOBJ_Create(
         return NULL;
     }
 
+#ifdef NATIVE_REACTX
     /* Enable DirectDraw */
     if (!PDEVOBJ_bEnableDirectDraw(ppdev))
     {
@@ -608,6 +613,7 @@ PDEVOBJ_Create(
         EngUnloadImage(pldev);
         return NULL;
     }
+#endif
 
     /* Remove some acceleration capabilities from driver */
     PDEVOBJ_vFilterDriverHooks(ppdev);
@@ -692,8 +698,10 @@ PDEVOBJ_bDynamicModeChange(
     ppdev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev);
     ppdev2->pfn.CompletePDEV(ppdev2->dhpdev, (HDEV)ppdev2);
 
+#ifdef NATIVE_REACTX
     /* Switch DirectDraw mode */
     PDEVOBJ_vSwitchDirectDraw(ppdev, ppdev2);
+#endif
 
     return TRUE;
 }
@@ -724,8 +732,10 @@ PDEVOBJ_bSwitchMode(
     if (!PDEVOBJ_bDisableDisplay(ppdev))
     {
         DPRINT1("PDEVOBJ_bDisableDisplay() failed\n");
+#ifdef NATIVE_REACTX
         /* Resume DirectDraw in case of failure */
         PDEVOBJ_vResumeDirectDraw(ppdev);
+#endif
         goto leave;
     }
 
@@ -746,9 +756,11 @@ PDEVOBJ_bSwitchMode(
         goto leave2;
     }
 
+#ifdef NATIVE_REACTX
     /* 4. Temporarily suspend DirectDraw for mode change */
     PDEVOBJ_vSuspendDirectDraw(ppdev);
     PDEVOBJ_vSuspendDirectDraw(ppdevTmp);
+#endif
 
     /* 5. Switch the PDEVs */
     if (!PDEVOBJ_bDynamicModeChange(ppdev, ppdevTmp))
@@ -758,16 +770,20 @@ PDEVOBJ_bSwitchMode(
         goto leave2;
     }
 
+#ifdef NATIVE_REACTX
     /* 6. Resume DirectDraw */
     PDEVOBJ_vResumeDirectDraw(ppdev);
     PDEVOBJ_vResumeDirectDraw(ppdevTmp);
+#endif
 
     /* Release temp PDEV */
     PDEVOBJ_vRelease(ppdevTmp);
 
+#ifdef NATIVE_REACTX
     /* Re-initialize DirectDraw data */
     ppdev->pEDDgpl->hDev = (HDEV)ppdev;
     ppdev->pEDDgpl->dhpdev = ppdev->dhpdev;
+#endif
 
     /* Update primary display capabilities */
     if (ppdev == gpmdev->ppdevGlobal)