Alistair Leslie-Hughes : d3drm: Support IDirect3D3 when creating device.

Alexandre Julliard julliard at winehq.org
Thu May 12 15:55:50 CDT 2022


Module: wine
Branch: master
Commit: 5582c4d6fb95771368ae2ccc44704179bcb2ff9d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5582c4d6fb95771368ae2ccc44704179bcb2ff9d

Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date:   Wed Dec 16 11:07:05 2020 +1100

d3drm: Support IDirect3D3 when creating device.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=39346
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3drm/device.c      | 26 ++++++++++++++++++++++++--
 dlls/d3drm/tests/d3drm.c |  5 +++++
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/dlls/d3drm/device.c b/dlls/d3drm/device.c
index 50be26536d8..970b171c656 100644
--- a/dlls/d3drm/device.c
+++ b/dlls/d3drm/device.c
@@ -124,7 +124,9 @@ HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirectDraw
     IDirectDrawSurface *ds = NULL;
     IDirect3DDevice *device1 = NULL;
     IDirect3DDevice2 *device2 = NULL;
+    IDirect3DDevice3 *device3 = NULL;
     IDirect3D2 *d3d2 = NULL;
+    IDirect3D3 *d3d3 = NULL;
     DDSURFACEDESC desc, surface_desc;
     HRESULT hr;
 
@@ -171,19 +173,29 @@ HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirectDraw
 
     if (version == 1)
         hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirect3DRGBDevice, (void **)&device1);
-    else
+    else if (version == 2)
     {
         IDirectDraw_QueryInterface(ddraw, &IID_IDirect3D2, (void**)&d3d2);
         hr = IDirect3D2_CreateDevice(d3d2, &IID_IDirect3DRGBDevice, surface, &device2);
         IDirect3D2_Release(d3d2);
     }
+    else
+    {
+        IDirectDrawSurface4 *surface4 = NULL;
+
+        IDirectDrawSurface_QueryInterface(surface, &IID_IDirectDrawSurface4, (void**)&surface4);
+        IDirectDraw_QueryInterface(ddraw, &IID_IDirect3D3, (void**)&d3d3);
+        hr = IDirect3D3_CreateDevice(d3d3, &IID_IDirect3DRGBDevice, surface4, &device3, NULL);
+        IDirectDrawSurface4_Release(surface4);
+        IDirect3D3_Release(d3d3);
+    }
     if (FAILED(hr))
     {
         IDirectDrawSurface_DeleteAttachedSurface(surface, 0, ds);
         return hr;
     }
 
-    if (version != 1)
+    if (version == 2)
     {
         hr = IDirect3DDevice2_QueryInterface(device2, &IID_IDirect3DDevice, (void**)&device1);
         IDirect3DDevice2_Release(device2);
@@ -193,6 +205,16 @@ HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirectDraw
             return hr;
         }
     }
+    else if (version == 3)
+    {
+        hr = IDirect3DDevice3_QueryInterface(device3, &IID_IDirect3DDevice, (void**)&device1);
+        IDirect3DDevice3_Release(device3);
+        if (FAILED(hr))
+        {
+            IDirectDrawSurface_DeleteAttachedSurface(surface, 0, ds);
+            return hr;
+        }
+    }
     device->device = device1;
     device->width = desc.dwWidth;
     device->height = desc.dwHeight;
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 51d10d797bc..5e0acc14fcb 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -4265,6 +4265,7 @@ static void test_create_device_from_clipper3(void)
     IUnknown *unknown = NULL;
     IDirect3DRMDevice3 *device3 = (IDirect3DRMDevice3 *)0xdeadbeef;
     IDirect3DDevice2 *d3ddevice2 = NULL;
+    IDirect3DDevice3 *d3ddevice3 = NULL;
     IDirectDrawClipper *clipper = NULL, *d3drm_clipper = NULL;
     IDirectDrawSurface *surface = NULL, *ds = NULL, *d3drm_primary = NULL;
     IDirectDrawSurface7 *surface7 = NULL;
@@ -4320,6 +4321,10 @@ static void test_create_device_from_clipper3(void)
     hr = IDirect3DRMDevice3_GetDirect3DDevice2(device3, &d3ddevice2);
     ok(hr == D3DRM_OK, "Cannot get IDirect3DDevice2 interface (hr = %x).\n", hr);
 
+    hr = IDirect3DDevice2_QueryInterface(d3ddevice2, &IID_IDirect3DDevice3, (void**)&d3ddevice3);
+    ok(hr == S_OK, "got %x.\n", hr);
+    IDirect3DDevice3_Release(d3ddevice3);
+
     hr = IDirect3DDevice2_GetRenderTarget(d3ddevice2, &surface);
     ok(hr == DD_OK, "Cannot get surface to the render target (hr = %x).\n", hr);
 




More information about the wine-cvs mailing list