From a5d09b6bd79f7e11c1c1772b3e3ad330338293c1 Mon Sep 17 00:00:00 2001 From: Aaryaman Vasishta Date: Fri, 7 Aug 2015 03:50:37 +0530 Subject: [PATCH] d3drm: Implement IDirect3DRMDevice{2-3}::GetDirect3DDevice2. --- dlls/d3drm/device.c | 7 ++++- dlls/d3drm/tests/d3drm.c | 68 ++++++++++++---------------------------- 2 files changed, 26 insertions(+), 49 deletions(-) diff --git a/dlls/d3drm/device.c b/dlls/d3drm/device.c index 4d08e6e9f13..4024ead565a 100644 --- a/dlls/d3drm/device.c +++ b/dlls/d3drm/device.c @@ -1325,7 +1325,12 @@ static DWORD WINAPI d3drm_device3_GetRenderMode(IDirect3DRMDevice3 *iface) static HRESULT WINAPI d3drm_device3_GetDirect3DDevice2(IDirect3DRMDevice3 *iface, IDirect3DDevice2 **d3d_device) { - FIXME("iface %p, d3d_device %p stub!\n", iface, d3d_device); + struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface); + + TRACE("iface %p, d3d_device %p.\n", iface, d3d_device); + + if (device->device) + return IDirect3DDevice_QueryInterface(device->device, &IID_IDirect3DDevice2, (void**)d3d_device); return E_NOTIMPL; } diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index 7790f02a586..981590d06f5 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -2185,9 +2185,7 @@ static void test_create_device_from_clipper2(void) /* Fetch immediate mode device in order to access render target */ hr = IDirect3DRMDevice2_GetDirect3DDevice2(device2, &d3ddevice2); - todo_wine ok(hr == D3DRM_OK, "Cannot get IDirect3DDevice2 interface (hr = %x).\n", hr); - if (FAILED(hr)) - goto cleanup; + ok(hr == D3DRM_OK, "Cannot get IDirect3DDevice2 interface (hr = %x).\n", hr); hr = IDirect3DDevice2_GetRenderTarget(d3ddevice2, &surface); ok(hr == DD_OK, "Cannot get surface to the render target (hr = %x).\n", hr); @@ -2263,7 +2261,7 @@ static void test_create_device_from_clipper2(void) ref3 = get_refcount((IUnknown *)d3drm2); ok(ref3 == ref2, "expected ref3 == ref2, got ref2 = %u , ref3 = %u.\n", ref2, ref3); cref2 = get_refcount((IUnknown *)clipper); - todo_wine ok(cref1 == cref2, "expected cref1 == cref2, got cref1 = %u, cref2 = %u.\n", cref1, cref2); + ok(cref1 == cref2, "expected cref1 == cref2, got cref1 = %u, cref2 = %u.\n", cref1, cref2); /* Test if render target format follows the screen format */ hr = IDirectDraw_GetDisplayMode(ddraw, &desc); @@ -2279,9 +2277,7 @@ static void test_create_device_from_clipper2(void) ok(hr == D3DRM_OK, "Cannot create IDirect3DRMDevice2 interface (hr = %x).\n", hr); hr = IDirect3DRMDevice2_GetDirect3DDevice2(device2, &d3ddevice2); - todo_wine ok(hr == D3DRM_OK, "Cannot get IDirect3DDevice2 interface (hr = %x).\n", hr); - if (FAILED(hr)) - goto cleanup; + ok(hr == D3DRM_OK, "Cannot get IDirect3DDevice2 interface (hr = %x).\n", hr); hr = IDirect3DDevice2_GetRenderTarget(d3ddevice2, &surface); ok(hr == DD_OK, "Cannot get surface to the render target (hr = %x).\n", hr); @@ -2295,23 +2291,13 @@ static void test_create_device_from_clipper2(void) hr = IDirectDraw2_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); -cleanup: - if (ds) - IDirectDrawSurface_Release(ds); - if (surface) - IDirectDrawSurface_Release(surface); - if (d3ddevice2) - IDirect3DDevice2_Release(d3ddevice2); - if (device2) - IDirect3DRMDevice2_Release(device2); - if (d3drm2) - IDirect3DRM2_Release(d3drm2); - if (d3drm1) - IDirect3DRM_Release(d3drm1); - if (clipper) - IDirectDrawClipper_Release(clipper); - if (ddraw) - IDirectDraw_Release(ddraw); + IDirectDrawSurface_Release(surface); + IDirect3DDevice2_Release(d3ddevice2); + IDirect3DRMDevice2_Release(device2); + IDirect3DRM2_Release(d3drm2); + IDirect3DRM_Release(d3drm1); + IDirectDrawClipper_Release(clipper); + IDirectDraw_Release(ddraw); DestroyWindow(window); } @@ -2373,9 +2359,7 @@ static void test_create_device_from_clipper3(void) /* Fetch immediate mode device in order to access render target */ hr = IDirect3DRMDevice3_GetDirect3DDevice2(device3, &d3ddevice2); - todo_wine ok(hr == D3DRM_OK, "Cannot get IDirect3DDevice2 interface (hr = %x).\n", hr); - if (FAILED(hr)) - goto cleanup; + ok(hr == D3DRM_OK, "Cannot get IDirect3DDevice2 interface (hr = %x).\n", hr); hr = IDirect3DDevice2_GetRenderTarget(d3ddevice2, &surface); ok(hr == DD_OK, "Cannot get surface to the render target (hr = %x).\n", hr); @@ -2451,7 +2435,7 @@ static void test_create_device_from_clipper3(void) ref3 = get_refcount((IUnknown *)d3drm3); ok(ref3 == ref2, "expected ref3 == ref2, got ref2 = %u , ref3 = %u.\n", ref2, ref3); cref2 = get_refcount((IUnknown *)clipper); - todo_wine ok(cref1 == cref2, "expected cref1 == cref2, got cref1 = %u, cref2 = %u.\n", cref1, cref2); + ok(cref1 == cref2, "expected cref1 == cref2, got cref1 = %u, cref2 = %u.\n", cref1, cref2); /* Test if render target format follows the screen format */ hr = IDirectDraw_GetDisplayMode(ddraw, &desc); @@ -2467,9 +2451,7 @@ static void test_create_device_from_clipper3(void) ok(hr == D3DRM_OK, "Cannot create IDirect3DRMDevice3 interface (hr = %x).\n", hr); hr = IDirect3DRMDevice3_GetDirect3DDevice2(device3, &d3ddevice2); - todo_wine ok(hr == D3DRM_OK, "Cannot get IDirect3DDevice2 interface (hr = %x).\n", hr); - if (FAILED(hr)) - goto cleanup; + ok(hr == D3DRM_OK, "Cannot get IDirect3DDevice2 interface (hr = %x).\n", hr); hr = IDirect3DDevice2_GetRenderTarget(d3ddevice2, &surface); ok(hr == DD_OK, "Cannot get surface to the render target (hr = %x).\n", hr); @@ -2483,23 +2465,13 @@ static void test_create_device_from_clipper3(void) hr = IDirectDraw2_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); -cleanup: - if (ds) - IDirectDrawSurface_Release(ds); - if (surface) - IDirectDrawSurface_Release(surface); - if (d3ddevice2) - IDirect3DDevice2_Release(d3ddevice2); - if (device3) - IDirect3DRMDevice3_Release(device3); - if (d3drm3) - IDirect3DRM3_Release(d3drm3); - if (d3drm1) - IDirect3DRM_Release(d3drm1); - if (clipper) - IDirectDrawClipper_Release(clipper); - if (ddraw) - IDirectDraw_Release(ddraw); + IDirectDrawSurface_Release(surface); + IDirect3DDevice2_Release(d3ddevice2); + IDirect3DRMDevice3_Release(device3); + IDirect3DRM3_Release(d3drm3); + IDirect3DRM_Release(d3drm1); + IDirectDrawClipper_Release(clipper); + IDirectDraw_Release(ddraw); DestroyWindow(window); }