[PATCH 1/4] d3drm: Store reference to IDirect3DRM in d3drm_device_create().

Henri Verbeet hverbeet at codeweavers.com
Tue Jul 12 12:07:24 CDT 2016


From: Aaryaman Vasishta <jem456.vasishta at gmail.com>

Signed-off-by: Aaryaman Vasishta <jem456.vasishta at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/d3drm/d3drm.c         | 43 ++++++++++++++++++-------------------------
 dlls/d3drm/d3drm_private.h | 20 +++++++++-----------
 dlls/d3drm/device.c        | 17 ++++++++---------
 3 files changed, 35 insertions(+), 45 deletions(-)

diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c
index 7fcb0ba..d0145d9 100644
--- a/dlls/d3drm/d3drm.c
+++ b/dlls/d3drm/d3drm.c
@@ -273,10 +273,10 @@ static HRESULT WINAPI d3drm1_CreateDevice(IDirect3DRM *iface,
 {
     struct d3drm_device *object;
     HRESULT hr;
+
     FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
 
-    hr = d3drm_device_create(&object);
-    if (FAILED(hr))
+    if (FAILED(hr = d3drm_device_create(&object, iface)))
         return hr;
 
     *device = IDirect3DRMDevice_from_impl(object);
@@ -287,7 +287,6 @@ static HRESULT WINAPI d3drm1_CreateDevice(IDirect3DRM *iface,
 static HRESULT WINAPI d3drm1_CreateDeviceFromSurface(IDirect3DRM *iface, GUID *guid,
         IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice **device)
 {
-    struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
     struct d3drm_device *object;
     HRESULT hr;
 
@@ -301,12 +300,10 @@ static HRESULT WINAPI d3drm1_CreateDeviceFromSurface(IDirect3DRM *iface, GUID *g
     if (!backbuffer || !ddraw)
         return D3DRMERR_BADDEVICE;
 
-    hr = d3drm_device_create(&object);
-    if (FAILED(hr))
+    if (FAILED(hr = d3drm_device_create(&object, iface)))
         return hr;
 
-    hr = d3drm_device_init(object, 1, &d3drm->IDirect3DRM_iface, ddraw, backbuffer, TRUE);
-    if (SUCCEEDED(hr))
+    if (SUCCEEDED(hr = d3drm_device_init(object, 1, ddraw, backbuffer, TRUE)))
         *device = IDirect3DRMDevice_from_impl(object);
     else
         d3drm_device_destroy(object);
@@ -328,12 +325,10 @@ static HRESULT WINAPI d3drm1_CreateDeviceFromD3D(IDirect3DRM *iface,
     if (!d3d || !d3d_device)
         return D3DRMERR_BADVALUE;
 
-    hr = d3drm_device_create(&object);
-    if (FAILED(hr))
+    if (FAILED(hr = d3drm_device_create(&object, iface)))
         return hr;
 
-    hr = d3drm_device_set_ddraw_device_d3d(object, iface, d3d, d3d_device);
-    if (FAILED(hr))
+    if (FAILED(hr = d3drm_device_set_ddraw_device_d3d(object, d3d, d3d_device)))
     {
         d3drm_device_destroy(object);
         return hr;
@@ -366,8 +361,7 @@ static HRESULT WINAPI d3drm1_CreateDeviceFromClipper(IDirect3DRM *iface,
     if (FAILED(hr))
         return hr;
 
-    hr = d3drm_device_create(&object);
-    if (FAILED(hr))
+    if (FAILED(hr = d3drm_device_create(&object, iface)))
     {
         IDirectDraw_Release(ddraw);
         return hr;
@@ -381,7 +375,7 @@ static HRESULT WINAPI d3drm1_CreateDeviceFromClipper(IDirect3DRM *iface,
         return hr;
     }
 
-    hr = d3drm_device_init(object, 1, iface, ddraw, render_target, TRUE);
+    hr = d3drm_device_init(object, 1, ddraw, render_target, TRUE);
     IDirectDraw_Release(ddraw);
     IDirectDrawSurface_Release(render_target);
     if (FAILED(hr))
@@ -756,12 +750,13 @@ static HRESULT WINAPI d3drm2_CreateMaterial(IDirect3DRM2 *iface,
 static HRESULT WINAPI d3drm2_CreateDevice(IDirect3DRM2 *iface,
         DWORD width, DWORD height, IDirect3DRMDevice2 **device)
 {
+    struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
     struct d3drm_device *object;
     HRESULT hr;
+
     FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
 
-    hr = d3drm_device_create(&object);
-    if (FAILED(hr))
+    if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
         return hr;
 
     *device = IDirect3DRMDevice2_from_impl(object);
@@ -1305,12 +1300,13 @@ static HRESULT WINAPI d3drm3_CreateMaterial(IDirect3DRM3 *iface,
 static HRESULT WINAPI d3drm3_CreateDevice(IDirect3DRM3 *iface,
         DWORD width, DWORD height, IDirect3DRMDevice3 **device)
 {
+    struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
     struct d3drm_device *object;
     HRESULT hr;
+
     FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
 
-    hr = d3drm_device_create(&object);
-    if (FAILED(hr))
+    if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
         return hr;
 
     *device = IDirect3DRMDevice3_from_impl(object);
@@ -1336,14 +1332,12 @@ static HRESULT WINAPI d3drm3_CreateDeviceFromSurface(IDirect3DRM3 *iface, GUID *
     if (!backbuffer || !ddraw)
         return D3DRMERR_BADDEVICE;
 
-    hr = d3drm_device_create(&object);
-    if (FAILED(hr))
+    if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
         return hr;
 
     use_z_surface = !(flags & D3DRMDEVICE_NOZBUFFER);
 
-    hr = d3drm_device_init(object, 3, &d3drm->IDirect3DRM_iface, ddraw, backbuffer, use_z_surface);
-    if (SUCCEEDED(hr))
+    if (SUCCEEDED(hr = d3drm_device_init(object, 3, ddraw, backbuffer, use_z_surface)))
         *device = IDirect3DRMDevice3_from_impl(object);
     else
         d3drm_device_destroy(object);
@@ -1414,8 +1408,7 @@ static HRESULT WINAPI d3drm3_CreateDeviceFromClipper(IDirect3DRM3 *iface,
     if (FAILED(hr))
         return hr;
 
-    hr = d3drm_device_create(&object);
-    if (FAILED(hr))
+    if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
     {
         IDirectDraw_Release(ddraw);
         return hr;
@@ -1429,7 +1422,7 @@ static HRESULT WINAPI d3drm3_CreateDeviceFromClipper(IDirect3DRM3 *iface,
         return hr;
     }
 
-    hr = d3drm_device_init(object, 3, &d3drm->IDirect3DRM_iface, ddraw, render_target, TRUE);
+    hr = d3drm_device_init(object, 3, ddraw, render_target, TRUE);
     IDirectDraw_Release(ddraw);
     IDirectDrawSurface_Release(render_target);
     if (FAILED(hr))
diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h
index 651eaec..1a2aff1 100644
--- a/dlls/d3drm/d3drm_private.h
+++ b/dlls/d3drm/d3drm_private.h
@@ -81,12 +81,20 @@ struct d3drm_viewport
     D3DRMPROJECTIONTYPE projection;
 };
 
+HRESULT d3drm_device_create(struct d3drm_device **device, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
+HRESULT d3drm_device_create_surfaces_from_clipper(struct d3drm_device *object, IDirectDraw *ddraw,
+        IDirectDrawClipper *clipper, int width, int height, IDirectDrawSurface **surface) DECLSPEC_HIDDEN;
+void d3drm_device_destroy(struct d3drm_device *device) DECLSPEC_HIDDEN;
+HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirectDraw *ddraw,
+        IDirectDrawSurface *surface, BOOL create_z_surface) DECLSPEC_HIDDEN;
+HRESULT d3drm_device_set_ddraw_device_d3d(struct d3drm_device *device,
+        IDirect3D *d3d, IDirect3DDevice *d3d_device) DECLSPEC_HIDDEN;
+
 void d3drm_object_init(struct d3drm_object *object) DECLSPEC_HIDDEN;
 HRESULT d3drm_object_add_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx) DECLSPEC_HIDDEN;
 HRESULT d3drm_object_delete_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx) DECLSPEC_HIDDEN;
 void d3drm_object_cleanup(IDirect3DRMObject *iface, struct d3drm_object *object) DECLSPEC_HIDDEN;
 
-HRESULT d3drm_device_create(struct d3drm_device **out) DECLSPEC_HIDDEN;
 HRESULT d3drm_texture_create(struct d3drm_texture **texture, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
 HRESULT d3drm_frame_create(struct d3drm_frame **frame, IUnknown *parent_frame, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
 HRESULT d3drm_viewport_create(struct d3drm_viewport **viewport, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
@@ -102,16 +110,6 @@ HRESULT Direct3DRMMaterial_create(IDirect3DRMMaterial2** ret_iface) DECLSPEC_HID
 HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *data,
                        D3DRMLOADTEXTURECALLBACK load_texture_proc, void *arg) DECLSPEC_HIDDEN;
 
-void d3drm_device_destroy(struct d3drm_device *device) DECLSPEC_HIDDEN;
-
-HRESULT d3drm_device_create_surfaces_from_clipper(struct d3drm_device *object, IDirectDraw *ddraw, IDirectDrawClipper *clipper, int width, int height,
-            IDirectDrawSurface **surface) DECLSPEC_HIDDEN;
-
-HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirect3DRM *d3drm, IDirectDraw *ddraw, IDirectDrawSurface *surface,
-            BOOL create_z_surface) DECLSPEC_HIDDEN;
-
-HRESULT d3drm_device_set_ddraw_device_d3d(struct d3drm_device *device, IDirect3DRM *d3drm, IDirect3D *d3d, IDirect3DDevice *d3d_device) DECLSPEC_HIDDEN;
-
 struct d3drm_file_header
 {
     WORD major;
diff --git a/dlls/d3drm/device.c b/dlls/d3drm/device.c
index 2efd6af..ba61c29 100644
--- a/dlls/d3drm/device.c
+++ b/dlls/d3drm/device.c
@@ -159,7 +159,7 @@ HRESULT d3drm_device_create_surfaces_from_clipper(struct d3drm_device *object, I
     return D3DRM_OK;
 }
 
-HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirect3DRM *d3drm, IDirectDraw *ddraw, IDirectDrawSurface *surface,
+HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirectDraw *ddraw, IDirectDrawSurface *surface,
             BOOL create_z_surface)
 {
     DDSCAPS caps = { DDSCAPS_ZBUFFER };
@@ -172,8 +172,7 @@ HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirect3DRM
 
     device->ddraw = ddraw;
     IDirectDraw_AddRef(ddraw);
-    device->d3drm = d3drm;
-    IDirect3DRM_AddRef(d3drm);
+    IDirect3DRM_AddRef(device->d3drm);
     device->render_target = surface;
     IDirectDrawSurface_AddRef(surface);
 
@@ -243,7 +242,7 @@ HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirect3DRM
     return hr;
 }
 
-HRESULT d3drm_device_set_ddraw_device_d3d(struct d3drm_device *device, IDirect3DRM *d3drm, IDirect3D *d3d, IDirect3DDevice *d3d_device)
+HRESULT d3drm_device_set_ddraw_device_d3d(struct d3drm_device *device, IDirect3D *d3d, IDirect3DDevice *d3d_device)
 {
     IDirectDrawSurface *surface;
     IDirect3DDevice2 *d3d_device2;
@@ -272,8 +271,7 @@ HRESULT d3drm_device_set_ddraw_device_d3d(struct d3drm_device *device, IDirect3D
 
     device->width = desc.dwWidth;
     device->height = desc.dwHeight;
-    device->d3drm = d3drm;
-    IDirect3DRM_AddRef(d3drm);
+    IDirect3DRM_AddRef(device->d3drm);
     device->device = d3d_device;
     IDirect3DDevice_AddRef(d3d_device);
 
@@ -1605,11 +1603,11 @@ static const struct IDirect3DRMWinDeviceVtbl d3drm_device_win_vtbl =
     d3drm_device_win_HandleActivate,
 };
 
-HRESULT d3drm_device_create(struct d3drm_device **out)
+HRESULT d3drm_device_create(struct d3drm_device **device, IDirect3DRM *d3drm)
 {
     struct d3drm_device *object;
 
-    TRACE("out %p.\n", out);
+    TRACE("device %p, d3drm %p.\n", device, d3drm);
 
     if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
         return E_OUTOFMEMORY;
@@ -1618,9 +1616,10 @@ HRESULT d3drm_device_create(struct d3drm_device **out)
     object->IDirect3DRMDevice2_iface.lpVtbl = &d3drm_device2_vtbl;
     object->IDirect3DRMDevice3_iface.lpVtbl = &d3drm_device3_vtbl;
     object->IDirect3DRMWinDevice_iface.lpVtbl = &d3drm_device_win_vtbl;
+    object->d3drm = d3drm;
     object->ref = 1;
 
-    *out = object;
+    *device = object;
 
     return D3DRM_OK;
 }
-- 
2.1.4




More information about the wine-patches mailing list