[PATCH 6/8] ddraw: Add a separate function for ddraw initialization.
Henri Verbeet
hverbeet at codeweavers.com
Thu Aug 19 11:57:48 CDT 2010
---
dlls/ddraw/ddraw.c | 79 +++++++++++++++++++++++++++----
dlls/ddraw/ddraw_private.h | 26 ++--------
dlls/ddraw/main.c | 110 ++++++--------------------------------------
3 files changed, 88 insertions(+), 127 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 13d9366..83d271b 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -5246,7 +5246,7 @@ HRESULT IDirect3DImpl_GetCaps(IWineD3D *wined3d, D3DDEVICEDESC *desc1, D3DDEVICE
/*****************************************************************************
* IDirectDraw7 VTable
*****************************************************************************/
-const IDirectDraw7Vtbl IDirectDraw7_Vtbl =
+static const struct IDirectDraw7Vtbl ddraw7_vtbl =
{
/* IUnknown */
ddraw7_QueryInterface,
@@ -5286,7 +5286,7 @@ const IDirectDraw7Vtbl IDirectDraw7_Vtbl =
ddraw7_EvaluateMode
};
-const struct IDirectDraw4Vtbl IDirectDraw4_Vtbl =
+static const struct IDirectDraw4Vtbl ddraw4_vtbl =
{
/* IUnknown */
ddraw4_QueryInterface,
@@ -5323,7 +5323,7 @@ const struct IDirectDraw4Vtbl IDirectDraw4_Vtbl =
ddraw4_GetDeviceIdentifier,
};
-const struct IDirectDraw3Vtbl IDirectDraw3_Vtbl =
+static const struct IDirectDraw3Vtbl ddraw3_vtbl =
{
/* IUnknown */
ddraw3_QueryInterface,
@@ -5356,7 +5356,7 @@ const struct IDirectDraw3Vtbl IDirectDraw3_Vtbl =
ddraw3_GetSurfaceFromDC,
};
-const struct IDirectDraw2Vtbl IDirectDraw2_Vtbl =
+static const struct IDirectDraw2Vtbl ddraw2_vtbl =
{
/* IUnknown */
ddraw2_QueryInterface,
@@ -5387,7 +5387,7 @@ const struct IDirectDraw2Vtbl IDirectDraw2_Vtbl =
ddraw2_GetAvailableVidMem,
};
-const struct IDirectDrawVtbl IDirectDraw1_Vtbl =
+static const struct IDirectDrawVtbl ddraw1_vtbl =
{
/* IUnknown */
ddraw1_QueryInterface,
@@ -5416,7 +5416,7 @@ const struct IDirectDrawVtbl IDirectDraw1_Vtbl =
ddraw1_WaitForVerticalBlank,
};
-const IDirect3D7Vtbl IDirect3D7_Vtbl =
+static const struct IDirect3D7Vtbl d3d7_vtbl =
{
/* IUnknown methods */
d3d7_QueryInterface,
@@ -5430,7 +5430,7 @@ const IDirect3D7Vtbl IDirect3D7_Vtbl =
d3d7_EvictManagedTextures
};
-const IDirect3D3Vtbl IDirect3D3_Vtbl =
+static const struct IDirect3D3Vtbl d3d3_vtbl =
{
/* IUnknown methods */
d3d3_QueryInterface,
@@ -5448,7 +5448,7 @@ const IDirect3D3Vtbl IDirect3D3_Vtbl =
d3d3_EvictManagedTextures
};
-const IDirect3D2Vtbl IDirect3D2_Vtbl =
+static const struct IDirect3D2Vtbl d3d2_vtbl =
{
/* IUnknown methods */
d3d2_QueryInterface,
@@ -5463,7 +5463,7 @@ const IDirect3D2Vtbl IDirect3D2_Vtbl =
d3d2_CreateDevice
};
-const IDirect3DVtbl IDirect3D1_Vtbl =
+static const struct IDirect3DVtbl d3d1_vtbl =
{
/* IUnknown methods */
d3d1_QueryInterface,
@@ -5812,7 +5812,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSwapChain(IWineD3DDevicePar
return hr;
}
-const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl =
+static const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl =
{
/* IUnknown methods */
device_parent_QueryInterface,
@@ -5826,3 +5826,62 @@ const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl =
device_parent_CreateVolume,
device_parent_CreateSwapChain,
};
+
+HRESULT ddraw_init(IDirectDrawImpl *ddraw, WINED3DDEVTYPE device_type)
+{
+ HRESULT hr;
+ HDC hDC;
+
+ ddraw->lpVtbl = &ddraw7_vtbl;
+ ddraw->IDirectDraw_vtbl = &ddraw1_vtbl;
+ ddraw->IDirectDraw2_vtbl = &ddraw2_vtbl;
+ ddraw->IDirectDraw3_vtbl = &ddraw3_vtbl;
+ ddraw->IDirectDraw4_vtbl = &ddraw4_vtbl;
+ ddraw->IDirect3D_vtbl = &d3d1_vtbl;
+ ddraw->IDirect3D2_vtbl = &d3d2_vtbl;
+ ddraw->IDirect3D3_vtbl = &d3d3_vtbl;
+ ddraw->IDirect3D7_vtbl = &d3d7_vtbl;
+ ddraw->device_parent_vtbl = &ddraw_wined3d_device_parent_vtbl;
+ ddraw->numIfaces = 1;
+ ddraw->ref7 = 1;
+
+ /* See comments in IDirectDrawImpl_CreateNewSurface for a description of
+ * this field. */
+ ddraw->ImplType = DefaultSurfaceType;
+
+ /* Get the current screen settings. */
+ hDC = GetDC(0);
+ ddraw->orig_bpp = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
+ ReleaseDC(0, hDC);
+ ddraw->orig_width = GetSystemMetrics(SM_CXSCREEN);
+ ddraw->orig_height = GetSystemMetrics(SM_CYSCREEN);
+
+ if (!LoadWineD3D())
+ {
+ ERR("Failed to load wined3d - broken OpenGL setup?\n");
+ return DDERR_NODIRECTDRAWSUPPORT;
+ }
+
+ ddraw->wineD3D = pWineDirect3DCreate(7, (IUnknown *)ddraw);
+ if (!ddraw->wineD3D)
+ {
+ WARN("Failed to create a wined3d object.\n");
+ return E_OUTOFMEMORY;
+ }
+
+ hr = IWineD3D_CreateDevice(ddraw->wineD3D, WINED3DADAPTER_DEFAULT, device_type, NULL, 0, (IUnknown *)ddraw,
+ (IWineD3DDeviceParent *)&ddraw->device_parent_vtbl, &ddraw->wineD3DDevice);
+ if (FAILED(hr))
+ {
+ WARN("Failed to create a wined3d device, hr %#x.\n", hr);
+ IWineD3D_Release(ddraw->wineD3D);
+ return hr;
+ }
+
+ /* Get the amount of video memory */
+ ddraw->total_vidmem = IWineD3DDevice_GetAvailableTextureMem(ddraw->wineD3DDevice);
+
+ list_init(&ddraw->surface_list);
+
+ return DD_OK;
+}
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 2b9105b..9c2bb14 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -160,13 +160,7 @@ struct IDirectDrawImpl
#define DDRAW_WINDOW_CLASS_NAME "ddraw_wc"
-/* Declare the VTables. They can be found ddraw.c */
-extern const IDirectDraw7Vtbl IDirectDraw7_Vtbl DECLSPEC_HIDDEN;
-extern const IDirectDraw4Vtbl IDirectDraw4_Vtbl DECLSPEC_HIDDEN;
-extern const IDirectDraw3Vtbl IDirectDraw3_Vtbl DECLSPEC_HIDDEN;
-extern const IDirectDraw2Vtbl IDirectDraw2_Vtbl DECLSPEC_HIDDEN;
-extern const IDirectDrawVtbl IDirectDraw1_Vtbl DECLSPEC_HIDDEN;
-extern const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl DECLSPEC_HIDDEN;
+HRESULT ddraw_init(IDirectDrawImpl *ddraw, WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
/* Helper structures */
typedef struct EnumDisplayModesCBS
@@ -213,6 +207,10 @@ static inline IDirectDrawImpl *ddraw_from_d3d7(IDirect3D7 *iface)
/* The default surface type */
extern WINED3DSURFTYPE DefaultSurfaceType DECLSPEC_HIDDEN;
+extern typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper DECLSPEC_HIDDEN;
+extern typeof(WineDirect3DCreate) *pWineDirect3DCreate DECLSPEC_HIDDEN;
+
+
/*****************************************************************************
* IDirectDrawSurface implementation structure
*****************************************************************************/
@@ -426,18 +424,6 @@ struct EnumTextureFormatsCBS
void *Context;
};
-/*****************************************************************************
- * IDirect3D implementation
- *****************************************************************************/
-
-/* No implementation structure as this is only another interface to DirectDraw */
-
-/* the Vtables */
-extern const IDirect3DVtbl IDirect3D1_Vtbl DECLSPEC_HIDDEN;
-extern const IDirect3D2Vtbl IDirect3D2_Vtbl DECLSPEC_HIDDEN;
-extern const IDirect3D3Vtbl IDirect3D3_Vtbl DECLSPEC_HIDDEN;
-extern const IDirect3D7Vtbl IDirect3D7_Vtbl DECLSPEC_HIDDEN;
-
/* Structure for EnumZBufferFormats */
struct EnumZBufferFormatsData
{
@@ -460,8 +446,6 @@ struct IDirectDrawClipperImpl
HRESULT ddraw_clipper_init(IDirectDrawClipperImpl *clipper) DECLSPEC_HIDDEN;
-typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper DECLSPEC_HIDDEN;
-
/*****************************************************************************
* IDirectDrawPalette implementation structure
*****************************************************************************/
diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c
index 0fccec7..0a33e31 100644
--- a/dlls/ddraw/main.c
+++ b/dlls/ddraw/main.c
@@ -33,13 +33,14 @@
#include "wine/exception.h"
#include "winreg.h"
-static typeof(WineDirect3DCreate) *pWineDirect3DCreate;
-
WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
/* The configured default surface */
WINED3DSURFTYPE DefaultSurfaceType = SURFACE_UNKNOWN;
+typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper DECLSPEC_HIDDEN;
+typeof(WineDirect3DCreate) *pWineDirect3DCreate DECLSPEC_HIDDEN;
+
/* DDraw list and critical section */
static struct list global_ddraw_list = LIST_INIT(global_ddraw_list);
@@ -220,12 +221,9 @@ DDRAW_Create(const GUID *guid,
IUnknown *UnkOuter,
REFIID iid)
{
- IDirectDrawImpl *This = NULL;
- HRESULT hr;
- IWineD3D *wineD3D = NULL;
- IWineD3DDevice *wineD3DDevice = NULL;
- HDC hDC;
WINED3DDEVTYPE devicetype;
+ IDirectDrawImpl *This;
+ HRESULT hr;
TRACE("(%s,%p,%p)\n", debugstr_guid(guid), DD, UnkOuter);
@@ -263,99 +261,19 @@ DDRAW_Create(const GUID *guid,
return E_OUTOFMEMORY;
}
- /* The interfaces:
- * IDirectDraw and IDirect3D are the same object,
- * QueryInterface is used to get other interfaces.
- */
- This->lpVtbl = &IDirectDraw7_Vtbl;
- This->IDirectDraw_vtbl = &IDirectDraw1_Vtbl;
- This->IDirectDraw2_vtbl = &IDirectDraw2_Vtbl;
- This->IDirectDraw3_vtbl = &IDirectDraw3_Vtbl;
- This->IDirectDraw4_vtbl = &IDirectDraw4_Vtbl;
- This->IDirect3D_vtbl = &IDirect3D1_Vtbl;
- This->IDirect3D2_vtbl = &IDirect3D2_Vtbl;
- This->IDirect3D3_vtbl = &IDirect3D3_Vtbl;
- This->IDirect3D7_vtbl = &IDirect3D7_Vtbl;
- This->device_parent_vtbl = &ddraw_wined3d_device_parent_vtbl;
-
- /* See comments in IDirectDrawImpl_CreateNewSurface for a description
- * of this member.
- * Read from a registry key, should add a winecfg option later
- */
- This->ImplType = DefaultSurfaceType;
-
- /* Get the current screen settings */
- hDC = GetDC(0);
- This->orig_bpp = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
- ReleaseDC(0, hDC);
- This->orig_width = GetSystemMetrics(SM_CXSCREEN);
- This->orig_height = GetSystemMetrics(SM_CYSCREEN);
-
- if (!LoadWineD3D())
- {
- ERR("Couldn't load WineD3D - OpenGL libs not present?\n");
- hr = DDERR_NODIRECTDRAWSUPPORT;
- goto err_out;
- }
-
- /* Initialize WineD3D
- *
- * All Rendering (2D and 3D) is relayed to WineD3D,
- * but DirectDraw specific management, like DDSURFACEDESC and DDPIXELFORMAT
- * structure handling is handled in this lib.
- */
- wineD3D = pWineDirect3DCreate(7 /* DXVersion */, (IUnknown *) This /* Parent */);
- if(!wineD3D)
+ hr = ddraw_init(This, devicetype);
+ if (FAILED(hr))
{
- ERR("Failed to initialise WineD3D\n");
- hr = E_OUTOFMEMORY;
- goto err_out;
- }
- This->wineD3D = wineD3D;
- TRACE("WineD3D created at %p\n", wineD3D);
-
- /* Initialized member...
- *
- * It is set to false at creation time, and set to true in
- * IDirectDraw7::Initialize. Its sole purpose is to return DD_OK on
- * initialize only once
- */
- This->initialized = FALSE;
-
- /* Initialize WineD3DDevice
- *
- * It is used for screen setup, surface and palette creation
- * When a Direct3DDevice7 is created, the D3D capabilities of WineD3D are
- * initialized
- */
- hr = IWineD3D_CreateDevice(wineD3D, 0 /* D3D_ADAPTER_DEFAULT */, devicetype, NULL /* FocusWindow, don't know yet */,
- 0 /* BehaviorFlags */, (IUnknown *)This, (IWineD3DDeviceParent *)&This->device_parent_vtbl, &wineD3DDevice);
- if(FAILED(hr))
- {
- ERR("Failed to create a wineD3DDevice, result = %x\n", hr);
- goto err_out;
+ WARN("Failed to initialize ddraw object, hr %#x.\n", hr);
+ HeapFree(GetProcessHeap(), 0, This);
+ return hr;
}
- This->wineD3DDevice = wineD3DDevice;
- TRACE("wineD3DDevice created at %p\n", This->wineD3DDevice);
-
- /* Get the amount of video memory */
- This->total_vidmem = IWineD3DDevice_GetAvailableTextureMem(This->wineD3DDevice);
-
- list_init(&This->surface_list);
- list_add_head(&global_ddraw_list, &This->ddraw_list_entry);
- /* Call QueryInterface to get the pointer to the requested interface. This also initializes
- * The required refcount
- */
hr = IDirectDraw7_QueryInterface((IDirectDraw7 *)This, iid, DD);
- if(SUCCEEDED(hr)) return DD_OK;
-
-err_out:
- /* Let's hope we never need this ;) */
- if(wineD3DDevice) IWineD3DDevice_Release(wineD3DDevice);
- if(wineD3D) IWineD3D_Release(wineD3D);
- HeapFree(GetProcessHeap(), 0, This->decls);
- HeapFree(GetProcessHeap(), 0, This);
+ IDirectDraw7_Release((IDirectDraw7 *)This);
+ if (SUCCEEDED(hr)) list_add_head(&global_ddraw_list, &This->ddraw_list_entry);
+ else WARN("Failed to query interface %s from ddraw object %p.\n", debugstr_guid(iid), This);
+
return hr;
}
--
1.7.1
More information about the wine-patches
mailing list