[ros-diffs] [khornicek] 37660: - use dynamic linking for wined3d, fixes boot

khornicek at svn.reactos.org khornicek at svn.reactos.org
Wed Nov 26 15:59:30 CET 2008


Author: khornicek
Date: Wed Nov 26 08:59:30 2008
New Revision: 37660

URL: http://svn.reactos.org/svn/reactos?rev=37660&view=rev
Log:
- use dynamic linking for wined3d, fixes boot

Modified:
    branches/reactx/reactos/dll/win32/gdi32/gdi32.rbuild
    branches/reactx/reactos/dll/win32/gdi32/misc/gdientryhelgl.c

Modified: branches/reactx/reactos/dll/win32/gdi32/gdi32.rbuild
URL: http://svn.reactos.org/svn/reactos/branches/reactx/reactos/dll/win32/gdi32/gdi32.rbuild?rev=37660&r1=37659&r2=37660&view=diff
==============================================================================
--- branches/reactx/reactos/dll/win32/gdi32/gdi32.rbuild [iso-8859-1] (original)
+++ branches/reactx/reactos/dll/win32/gdi32/gdi32.rbuild [iso-8859-1] Wed Nov 26 08:59:30 2008
@@ -18,7 +18,6 @@
 		<library>uuid</library>
 		<library>wine</library>		
 		<library>opengl32</library>
-		<library>wined3d</library>
 	</if>
 	
 	<directory name="include">

Modified: branches/reactx/reactos/dll/win32/gdi32/misc/gdientryhelgl.c
URL: http://svn.reactos.org/svn/reactos/branches/reactx/reactos/dll/win32/gdi32/misc/gdientryhelgl.c?rev=37660&r1=37659&r2=37660&view=diff
==============================================================================
--- branches/reactx/reactos/dll/win32/gdi32/misc/gdientryhelgl.c [iso-8859-1] (original)
+++ branches/reactx/reactos/dll/win32/gdi32/misc/gdientryhelgl.c [iso-8859-1] Wed Nov 26 08:59:30 2008
@@ -28,8 +28,50 @@
 #include "wine/config.h"
 #include "wine/wined3d_interface.h"
 
-
-
+typedef IWineD3D* WINAPI (*WINED3DCREATE) (UINT, UINT, PVOID);
+
+static WINED3DCREATE     pWineDirect3DCreate   = NULL;
+
+HINSTANCE                hWineD3D              = NULL;
+
+static BOOL InitWineD3DFunction(PCSTR name,
+                                FARPROC *funcptr)
+{
+    PVOID func;
+
+    func = (PVOID)GetProcAddress(hWineD3D, name);
+    if (func != NULL)
+    {
+        (void)InterlockedCompareExchangePointer((PVOID*)funcptr,
+                                                func,
+                                                NULL);
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+static BOOL InitWineD3D(void)
+{
+    HMODULE hModWineD3D;
+    BOOL Ret = TRUE;
+
+    hModWineD3D = LoadLibraryW(L"WINED3D.DLL");
+    if (hModWineD3D == NULL)
+        return FALSE;
+
+    if (InterlockedCompareExchangePointer((PVOID*)&hWineD3D,
+                                          (PVOID)hModWineD3D,
+                                          NULL) != NULL)
+    {
+        FreeLibrary(hModWineD3D);
+    }
+
+    if (!InitWineD3DFunction("WineDirect3DCreate", (FARPROC*)pWineDirect3DCreate))
+        Ret = FALSE;
+
+    return Ret;
+}
 
 /* DATA **********************************************************************/
 
@@ -1636,6 +1678,7 @@
 #endif
 }
 
+
 /* PUBLIC FUNCTIONS **********************************************************/
 
 /*
@@ -1651,6 +1694,10 @@
 
     BOOL Return = FALSE;
 
+    if(pWineDirect3DCreate == NULL)
+        if(InitWineD3D() == FALSE)
+            return Return;
+
     /* Check if the global hDC (hdc == 0) is being used */
     if (!hdc)
     {
@@ -1662,7 +1709,7 @@
             {
                 /* Create the DDraw Object */
                 //ghDirectDraw = NtGdiDdCreateDirectDrawObject(hdc);
-                ghDirectDraw = (HANDLE) WineDirect3DCreate(D3D_SDK_VERSION, 9, NULL);
+                ghDirectDraw = (HANDLE) pWineDirect3DCreate(D3D_SDK_VERSION, 9, NULL);
 
                 /* Delete our DC */
                 DeleteDC(hdc);
@@ -1684,7 +1731,7 @@
     {
         /* Using the per-process object, so create it */
          //pDirectDrawGlobal->hDD = (ULONG_PTR)NtGdiDdCreateDirectDrawObject(hdc);
-        pDirectDrawGlobal->hDD = (ULONG_PTR) WineDirect3DCreate(D3D_SDK_VERSION, 9, NULL);
+        pDirectDrawGlobal->hDD = (ULONG_PTR) pWineDirect3DCreate(D3D_SDK_VERSION, 9, NULL);
 
         /* Set the return value */
         Return = pDirectDrawGlobal->hDD ? TRUE : FALSE;
@@ -1720,7 +1767,7 @@
     D3DNTHAL_GLOBALDRIVERDATA D3dDriverData;
     DD_D3DBUFCALLBACKS D3dBufferCallbacks;
     DWORD CallbackFlags[3];
-    DWORD dwNumHeaps=0, FourCCs=0;
+    //DWORD dwNumHeaps=0, FourCCs=0;
     DWORD Flags;
     BOOL retVal = TRUE;
 



More information about the Ros-diffs mailing list