From 17f80954e35a5be3904f129cbcb06fa98c48ee04 Mon Sep 17 00:00:00 2001 From: Aaryaman Vasishta Date: Thu, 28 Jul 2016 22:48:52 +0530 Subject: [PATCH] d3drm: Implement IDirect3DRMViewport*::GetDevice. Signed-off-by: Aaryaman Vasishta Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/d3drm/d3drm_private.h | 2 ++ dlls/d3drm/device.c | 10 ++++++++++ dlls/d3drm/tests/d3drm.c | 33 +++++++++++++++++++++++++++++++-- dlls/d3drm/viewport.c | 32 +++++++++++++++++++++++++------- 4 files changed, 68 insertions(+), 9 deletions(-) diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h index 9fc70002445..e75fe45f06a 100644 --- a/dlls/d3drm/d3drm_private.h +++ b/dlls/d3drm/d3drm_private.h @@ -72,6 +72,7 @@ struct d3drm_frame struct d3drm_viewport { struct d3drm_object obj; + struct d3drm_device *device; IDirect3DRMFrame *camera; IDirect3DRMViewport IDirect3DRMViewport_iface; IDirect3DRMViewport2 IDirect3DRMViewport2_iface; @@ -116,6 +117,7 @@ HRESULT d3drm_object_delete_destroy_callback(struct d3drm_object *object, D3DRMO void d3drm_object_cleanup(IDirect3DRMObject *iface, struct d3drm_object *object) DECLSPEC_HIDDEN; struct d3drm_frame *unsafe_impl_from_IDirect3DRMFrame(IDirect3DRMFrame *iface) DECLSPEC_HIDDEN; +struct d3drm_device *unsafe_impl_from_IDirect3DRMDevice3(IDirect3DRMDevice3 *iface) 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; diff --git a/dlls/d3drm/device.c b/dlls/d3drm/device.c index fb83342ba2f..a8d646b4681 100644 --- a/dlls/d3drm/device.c +++ b/dlls/d3drm/device.c @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include #include "wine/debug.h" #define COBJMACROS @@ -1617,6 +1618,15 @@ static const struct IDirect3DRMWinDeviceVtbl d3drm_device_win_vtbl = d3drm_device_win_HandleActivate, }; +struct d3drm_device *unsafe_impl_from_IDirect3DRMDevice3(IDirect3DRMDevice3 *iface) +{ + if (!iface) + return NULL; + assert(iface->lpVtbl == &d3drm_device3_vtbl); + + return impl_from_IDirect3DRMDevice3(iface); +} + HRESULT d3drm_device_create(struct d3drm_device **device, IDirect3DRM *d3drm) { struct d3drm_device *object; diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index 44f2a13d0b8..1abaed58ee7 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -1468,8 +1468,8 @@ static void test_Viewport(void) IDirect3DRM *d3drm1; IDirect3DRM2 *d3drm2; IDirect3DRM3 *d3drm3; - IDirect3DRMDevice *device1; - IDirect3DRMDevice3 *device3; + IDirect3DRMDevice *device1, *d3drm_device1; + IDirect3DRMDevice3 *device3, *d3drm_device3; IDirect3DRMFrame *frame; IDirect3DRMFrame3 *frame3; IDirect3DRMViewport *viewport; @@ -1534,6 +1534,11 @@ static void test_Viewport(void) ref4 = get_refcount((IUnknown *)frame); ok(ref4 > frame_ref, "Expected ref4 > frame_ref, got frame_ref = %u, ref4 = %u.\n", frame_ref, ref4); + hr = IDirect3DRMViewport_GetDevice(viewport, &d3drm_device1); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMDevice interface (hr = %x)\n", hr); + ok(device1 == d3drm_device1, "Expected device returned = %p, got %p.\n", device1, d3drm_device1); + IDirect3DRMDevice_Release(d3drm_device1); + IDirect3DRMViewport_Release(viewport); ref4 = get_refcount((IUnknown *)d3drm1); ok(ref4 == ref1, "Expected ref4 == ref1, got ref1 = %u, ref4 = %u.\n", ref1, ref4); @@ -1559,6 +1564,11 @@ static void test_Viewport(void) ref4 = get_refcount((IUnknown *)frame); ok(ref4 > frame_ref, "Expected ref4 > frame_ref, got frame_ref = %u, ref4 = %u.\n", frame_ref, ref4); + hr = IDirect3DRMViewport_GetDevice(viewport, &d3drm_device1); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMDevice interface (hr = %x)\n", hr); + ok(device1 == d3drm_device1, "Expected device returned = %p, got %p.\n", device1, d3drm_device1); + IDirect3DRMDevice_Release(d3drm_device1); + IDirect3DRMViewport_Release(viewport); ref4 = get_refcount((IUnknown *)d3drm1); ok(ref4 == ref1, "Expected ref4 == ref1, got ref1 = %u, ref4 = %u.\n", ref1, ref4); @@ -1587,6 +1597,11 @@ static void test_Viewport(void) ref4 = get_refcount((IUnknown *)frame3); ok(ref4 > frame_ref2, "Expected ref4 > frame_ref2, got frame_ref2 = %u, ref4 = %u.\n", frame_ref2, ref4); + hr = IDirect3DRMViewport2_GetDevice(viewport2, &d3drm_device3); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMDevice3 interface (hr = %x)\n", hr); + ok(device3 == d3drm_device3, "Expected device returned = %p, got %p.\n", device3, d3drm_device3); + IDirect3DRMDevice3_Release(d3drm_device3); + IDirect3DRMViewport2_Release(viewport2); ref4 = get_refcount((IUnknown *)d3drm1); ok(ref4 == ref1, "Expected ref4 == ref1, got ref1 = %u, ref4 = %u.\n", ref1, ref4); @@ -1803,6 +1818,8 @@ static void test_Viewport(void) hr = IDirect3DRMViewport_GetDirect3DViewport(viewport, &d3d_viewport); ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr); + hr = IDirect3DRMViewport_GetDevice(viewport, &d3drm_device1); + ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr); /* Test all failures together */ hr = IDirect3DRMViewport_Init(viewport, NULL, frame, rc.left, rc.top, rc.right, rc.bottom); @@ -1831,6 +1848,11 @@ static void test_Viewport(void) ref4 = get_refcount((IUnknown *)frame); ok(ref4 > frame_ref, "Expected ref4 > frame_ref, got frame_ref = %u, ref4 = %u.\n", frame_ref, ref4); + hr = IDirect3DRMViewport_GetDevice(viewport, &d3drm_device1); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMDevice3 interface (hr = %x)\n", hr); + ok(device1 == d3drm_device1, "Expected device returned = %p, got %p.\n", device3, d3drm_device3); + IDirect3DRMDevice_Release(d3drm_device1); + hr = IDirect3DRMViewport_GetDirect3DViewport(viewport, &d3d_viewport); ok(SUCCEEDED(hr), "Cannot get IDirect3DViewport interface (hr = %#x).\n", hr); viewport_ref = get_refcount((IUnknown *)d3d_viewport); @@ -1891,6 +1913,8 @@ static void test_Viewport(void) hr = IDirect3DRMViewport2_GetDirect3DViewport(viewport2, &d3d_viewport); ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr); + hr = IDirect3DRMViewport2_GetDevice(viewport2, &d3drm_device3); + ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr); hr = IDirect3DRMViewport2_Init(viewport2, NULL, frame3, rc.left, rc.top, rc.right, rc.bottom); ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr); @@ -1912,6 +1936,11 @@ static void test_Viewport(void) ref4 = get_refcount((IUnknown *)frame3); ok(ref4 > frame_ref2, "Expected ref4 > frame_ref2, got frame_ref2 = %u, ref4 = %u.\n", frame_ref2, ref4); + hr = IDirect3DRMViewport2_GetDevice(viewport2, &d3drm_device3); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMDevice3 interface (hr = %x)\n", hr); + ok(device3 == d3drm_device3, "Expected device returned = %p, got %p.\n", device3, d3drm_device3); + IDirect3DRMDevice3_Release(d3drm_device3); + hr = IDirect3DRMViewport2_GetDirect3DViewport(viewport2, &d3d_viewport); ok(SUCCEEDED(hr), "Cannot get IDirect3DViewport interface (hr = %#x).\n", hr); viewport_ref = get_refcount((IUnknown *)d3d_viewport); diff --git a/dlls/d3drm/viewport.c b/dlls/d3drm/viewport.c index 46d0f7ca73b..cb57fe041db 100644 --- a/dlls/d3drm/viewport.c +++ b/dlls/d3drm/viewport.c @@ -280,6 +280,7 @@ static HRESULT WINAPI d3drm_viewport2_Init(IDirect3DRMViewport2 *iface, IDirect3 IDirect3DRMFrame3 *camera, DWORD x, DWORD y, DWORD width, DWORD height) { struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); + struct d3drm_device *device_obj = unsafe_impl_from_IDirect3DRMDevice3(device); D3DVIEWPORT vp; D3DVALUE scale; IDirect3D *d3d1 = NULL; @@ -293,9 +294,9 @@ static HRESULT WINAPI d3drm_viewport2_Init(IDirect3DRMViewport2 *iface, IDirect3 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u.\n", iface, device, camera, x, y, width, height); - if (!device || !camera - || width > IDirect3DRMDevice3_GetWidth(device) - || height > IDirect3DRMDevice3_GetHeight(device)) + if (!device_obj || !camera + || width > device_obj->width + || height > device_obj->height) { return D3DRMERR_BADOBJECT; } @@ -356,6 +357,7 @@ static HRESULT WINAPI d3drm_viewport2_Init(IDirect3DRMViewport2 *iface, IDirect3 hr = IDirect3DViewport_SetBackground(viewport->d3d_viewport, hmat); viewport->material = material; + viewport->device = device_obj; cleanup: @@ -634,16 +636,32 @@ static HRESULT WINAPI d3drm_viewport1_GetCamera(IDirect3DRMViewport *iface, IDir static HRESULT WINAPI d3drm_viewport2_GetDevice(IDirect3DRMViewport2 *iface, IDirect3DRMDevice3 **device) { - FIXME("iface %p, device %p stub!\n", iface, device); + struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface); - return E_NOTIMPL; + TRACE("iface %p, device %p.\n", iface, device); + + if (!viewport->device) + return D3DRMERR_BADOBJECT; + + *device = &viewport->device->IDirect3DRMDevice3_iface; + IDirect3DRMDevice3_AddRef(*device); + + return D3DRM_OK; } static HRESULT WINAPI d3drm_viewport1_GetDevice(IDirect3DRMViewport *iface, IDirect3DRMDevice **device) { - FIXME("iface %p, device %p stub!\n", iface, device); + struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface); - return E_NOTIMPL; + TRACE("iface %p, device %p.\n\n", iface, device); + + if (!viewport->device) + return D3DRMERR_BADOBJECT; + + *device = &viewport->device->IDirect3DRMDevice_iface; + IDirect3DRMDevice_AddRef(*device); + + return D3DRM_OK; } static HRESULT WINAPI d3drm_viewport2_GetPlane(IDirect3DRMViewport2 *iface,