From: Aaryaman Vasishta Subject: [PATCH 2/6] d3drm: Implement IDirect3DRM*::CreateViewport. (v2 resend) Message-Id: <1468951723-71957-2-git-send-email-jem456.vasishta@gmail.com> Date: Tue, 19 Jul 2016 23:38:39 +0530 In-Reply-To: <1468951723-71957-1-git-send-email-jem456.vasishta@gmail.com> References: <1468951723-71957-1-git-send-email-jem456.vasishta@gmail.com> v2: Remove unnecessary checks in some tests now that CreateViewport is implemented. Signed-off-by: Aaryaman Vasishta --- dlls/d3drm/d3drm.c | 81 ++++++++++++++++++++++++---- dlls/d3drm/tests/d3drm.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 206 insertions(+), 9 deletions(-) diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c index 18ce95e..15d49dd 100644 --- a/dlls/d3drm/d3drm.c +++ b/dlls/d3drm/d3drm.c @@ -432,11 +432,40 @@ static HRESULT WINAPI d3drm1_CreateViewport(IDirect3DRM *iface, IDirect3DRMDevic IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport) { struct d3drm *d3drm = impl_from_IDirect3DRM(iface); + IDirect3DRMDevice3 *device3; + IDirect3DRMFrame3 *camera3; + IDirect3DRMViewport2 *viewport2; + HRESULT hr; - FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n", + TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n", iface, device, camera, x, y, width, height, viewport); - return IDirect3DRM2_CreateViewport(&d3drm->IDirect3DRM2_iface, device, camera, x, y, width, height, viewport); + if (!device || !camera) + return D3DRMERR_BADOBJECT; + if (!viewport) + return D3DRMERR_BADVALUE; + + if (FAILED(hr = IDirect3DRMDevice_QueryInterface(device, &IID_IDirect3DRMDevice3, (void **)&device3))) + return hr; + + if (FAILED(hr = IDirect3DRMFrame_QueryInterface(camera, &IID_IDirect3DRMFrame3, (void **)&camera3))) + { + IDirect3DRMDevice3_Release(device3); + return hr; + } + IDirect3DRMDevice_Release(device); + IDirect3DRMFrame_Release(camera); + + if(FAILED(hr = IDirect3DRM3_CreateViewport(&d3drm->IDirect3DRM3_iface, device3, camera3, x, y, + width, height, &viewport2))) + { + return hr; + } + + hr = IDirect3DRMViewport2_QueryInterface(viewport2, &IID_IDirect3DRMViewport, (void **)viewport); + IDirect3DRMViewport2_Release(viewport2); + + return hr; } static HRESULT WINAPI d3drm1_CreateWrap(IDirect3DRM *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame, @@ -880,18 +909,40 @@ static HRESULT WINAPI d3drm2_CreateViewport(IDirect3DRM2 *iface, IDirect3DRMDevi IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport) { struct d3drm *d3drm = impl_from_IDirect3DRM2(iface); - struct d3drm_viewport *object; + IDirect3DRMDevice3 *device3; + IDirect3DRMFrame3 *camera3; + IDirect3DRMViewport2 *viewport2; HRESULT hr; - FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n", - iface, device, camera, x, y, width, height, viewport); + TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n", + iface, device, camera, x, y, width, height, viewport); - if (FAILED(hr = d3drm_viewport_create(&object, &d3drm->IDirect3DRM_iface))) + if (!device || !camera) + return D3DRMERR_BADOBJECT; + if (!viewport) + return D3DRMERR_BADVALUE; + + if (FAILED(hr = IDirect3DRMDevice_QueryInterface(device, &IID_IDirect3DRMDevice3, (void **)&device3))) return hr; - *viewport = &object->IDirect3DRMViewport_iface; + if (FAILED(hr = IDirect3DRMFrame_QueryInterface(camera, &IID_IDirect3DRMFrame3, (void **)&camera3))) + { + IDirect3DRMDevice3_Release(device3); + return hr; + } + IDirect3DRMDevice_Release(device); + IDirect3DRMFrame_Release(camera); - return D3DRM_OK; + if(FAILED(hr = IDirect3DRM3_CreateViewport(&d3drm->IDirect3DRM3_iface, device3, camera3, x, y, + width, height, &viewport2))) + { + return hr; + } + + hr = IDirect3DRMViewport2_QueryInterface(viewport2, &IID_IDirect3DRMViewport, (void **)viewport); + IDirect3DRMViewport2_Release(viewport2); + + return hr; } static HRESULT WINAPI d3drm2_CreateWrap(IDirect3DRM2 *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame, @@ -1455,14 +1506,26 @@ static HRESULT WINAPI d3drm3_CreateViewport(IDirect3DRM3 *iface, IDirect3DRMDevi struct d3drm_viewport *object; HRESULT hr; - FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n", + TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n", iface, device, camera, x, y, width, height, viewport); + if (!device || !camera) + return D3DRMERR_BADOBJECT; + if (!viewport) + return D3DRMERR_BADVALUE; + if (FAILED(hr = d3drm_viewport_create(&object, &d3drm->IDirect3DRM_iface))) return hr; *viewport = &object->IDirect3DRMViewport2_iface; + if (FAILED(hr = IDirect3DRMViewport2_Init(*viewport, device, camera, x, y, width, height))) + { + IDirect3DRMViewport2_Release(*viewport); + *viewport = NULL; + return D3DRMERR_BADVALUE; + } + return D3DRM_OK; } diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index ee41187..17cf2dd 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -1512,6 +1512,140 @@ static void test_Viewport(void) hr = IDirect3DRM3_CreateFrame(d3drm3, NULL, &frame3); ok(SUCCEEDED(hr), "Cannot get IDirect3DRMFrame3 interface (hr = %x).\n", hr); + ref1 = get_refcount((IUnknown *)d3drm1); + ref2 = get_refcount((IUnknown *)d3drm2); + ref3 = get_refcount((IUnknown *)d3drm3); + device_ref = get_refcount((IUnknown *)device1); + frame_ref = get_refcount((IUnknown *)frame); + + hr = IDirect3DRM_CreateViewport(d3drm1, device1, frame, 0, 0, 0, 0, &viewport); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMViewport interface (hr = %x)\n", hr); + ref4 = get_refcount((IUnknown *)d3drm1); + ok(ref4 > ref1, "Expected ref4 > ref1, got ref1 = %u, ref4 = %u.\n", ref1, ref4); + ref4 = get_refcount((IUnknown *)d3drm2); + ok(ref4 == ref2, "Expected ref4 == ref2, got ref2 = %u, ref4 = %u.\n", ref2, ref4); + ref4 = get_refcount((IUnknown *)d3drm3); + ok(ref4 == ref3, "Expected ref4 == ref3, got ref3 = %u, ref4 = %u.\n", ref3, ref4); + ref4 = get_refcount((IUnknown *)device1); + ok(ref4 == device_ref, "Expected ref4 == device_ref, got device_ref = %u, ref4 = %u.\n", device_ref, ref4); + ref4 = get_refcount((IUnknown *)frame); + ok(ref4 > frame_ref, "Expected ref4 > frame_ref, got frame_ref = %u, ref4 = %u.\n", frame_ref, ref4); + + IDirect3DRMViewport_Release(viewport); + ref4 = get_refcount((IUnknown *)d3drm1); + ok(ref4 == ref1, "Expected ref4 == ref1, got ref1 = %u, ref4 = %u.\n", ref1, ref4); + ref4 = get_refcount((IUnknown *)d3drm2); + ok(ref4 == ref2, "Expected ref4 == ref2, got ref2 = %u, ref4 = %u.\n", ref2, ref4); + ref4 = get_refcount((IUnknown *)d3drm3); + ok(ref4 == ref3, "Expected ref4 == ref3, got ref3 = %u, ref4 = %u.\n", ref3, ref4); + ref4 = get_refcount((IUnknown *)device1); + ok(ref4 == device_ref, "Expected ref4 == device_ref, got device_ref = %u, ref4 = %u.\n", device_ref, ref4); + ref4 = get_refcount((IUnknown *)frame); + ok(ref4 == frame_ref, "Expected ref4 == frame_ref, got frame_ref = %u, ref4 = %u.\n", frame_ref, ref4); + + device_ref = get_refcount((IUnknown *)device1); + frame_ref = get_refcount((IUnknown *)frame); + + hr = IDirect3DRM2_CreateViewport(d3drm2, device1, frame, 0, 0, 0, 0, &viewport); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMViewport interface (hr = %x)\n", hr); + ref4 = get_refcount((IUnknown *)d3drm1); + ok(ref4 > ref1, "Expected ref4 > ref1, got ref1 = %u, ref4 = %u.\n", ref1, ref4); + ref4 = get_refcount((IUnknown *)d3drm2); + ok(ref4 == ref2, "Expected ref4 == ref2, got ref2 = %u, ref4 = %u.\n", ref2, ref4); + ref4 = get_refcount((IUnknown *)d3drm3); + ok(ref4 == ref3, "Expected ref4 == ref3, got ref3 = %u, ref4 = %u.\n", ref3, ref4); + ref4 = get_refcount((IUnknown *)device1); + ok(ref4 == device_ref, "Expected ref4 == device_ref, got device_ref = %u, ref4 = %u.\n", device_ref, ref4); + ref4 = get_refcount((IUnknown *)frame); + ok(ref4 > frame_ref, "Expected ref4 > frame_ref, got frame_ref = %u, ref4 = %u.\n", frame_ref, ref4); + + IDirect3DRMViewport_Release(viewport); + ref4 = get_refcount((IUnknown *)d3drm1); + ok(ref4 == ref1, "Expected ref4 == ref1, got ref1 = %u, ref4 = %u.\n", ref1, ref4); + ref4 = get_refcount((IUnknown *)d3drm2); + ok(ref4 == ref2, "Expected ref4 == ref2, got ref2 = %u, ref4 = %u.\n", ref2, ref4); + ref4 = get_refcount((IUnknown *)d3drm3); + ok(ref4 == ref3, "Expected ref4 == ref3, got ref3 = %u, ref4 = %u.\n", ref3, ref4); + ref4 = get_refcount((IUnknown *)device1); + ok(ref4 == device_ref, "Expected ref4 == device_ref, got device_ref = %u, ref4 = %u.\n", device_ref, ref4); + ref4 = get_refcount((IUnknown *)frame); + ok(ref4 == frame_ref, "Expected ref4 == frame_ref, got frame_ref = %u, ref4 = %u.\n", frame_ref, ref4); + + device_ref = get_refcount((IUnknown *)device3); + frame_ref2 = get_refcount((IUnknown *)frame3); + + hr = IDirect3DRM3_CreateViewport(d3drm3, device3, frame3, 0, 0, 0, 0, &viewport2); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMViewport2 interface (hr = %x)\n", hr); + ref4 = get_refcount((IUnknown *)d3drm1); + ok(ref4 > ref1, "Expected ref4 > ref1, got ref1 = %u, ref4 = %u.\n", ref1, ref4); + ref4 = get_refcount((IUnknown *)d3drm2); + ok(ref4 == ref2, "Expected ref4 == ref2, got ref2 = %u, ref4 = %u.\n", ref2, ref4); + ref4 = get_refcount((IUnknown *)d3drm3); + ok(ref4 == ref3, "Expected ref4 == ref3, got ref3 = %u, ref4 = %u.\n", ref3, ref4); + ref4 = get_refcount((IUnknown *)device3); + ok(ref4 == device_ref, "Expected ref4 == device_ref, got device_ref = %u, ref4 = %u.\n", device_ref, ref4); + ref4 = get_refcount((IUnknown *)frame3); + ok(ref4 > frame_ref2, "Expected ref4 > frame_ref2, got frame_ref2 = %u, ref4 = %u.\n", frame_ref2, ref4); + + IDirect3DRMViewport2_Release(viewport2); + ref4 = get_refcount((IUnknown *)d3drm1); + ok(ref4 == ref1, "Expected ref4 == ref1, got ref1 = %u, ref4 = %u.\n", ref1, ref4); + ref4 = get_refcount((IUnknown *)d3drm2); + ok(ref4 == ref2, "Expected ref4 == ref2, got ref2 = %u, ref4 = %u.\n", ref2, ref4); + ref4 = get_refcount((IUnknown *)d3drm3); + ok(ref4 == ref3, "Expected ref4 == ref3, got ref3 = %u, ref4 = %u.\n", ref3, ref4); + ref4 = get_refcount((IUnknown *)device3); + ok(ref4 == device_ref, "Expected ref4 == device_ref, got device_ref = %u, ref4 = %u.\n", device_ref, ref4); + ref4 = get_refcount((IUnknown *)frame3); + ok(ref4 == frame_ref2, "Expected ref4 == frame_ref2, got frame_ref2 = %u, ref4 = %u.\n", frame_ref2, ref4); + + /* Test all failures together */ + hr = IDirect3DRM_CreateViewport(d3drm1, NULL, frame, rc.left, rc.top, rc.right, rc.bottom, &viewport); + ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr); + hr = IDirect3DRM_CreateViewport(d3drm1, device1, NULL, rc.left, rc.top, rc.right, rc.bottom, &viewport); + ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr); + hr = IDirect3DRM_CreateViewport(d3drm1, device1, frame, rc.left, rc.top, rc.right + 1, rc.bottom + 1, &viewport); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM_CreateViewport(d3drm1, device1, frame, rc.left, rc.top, rc.right + 1, rc.bottom, &viewport); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM_CreateViewport(d3drm1, device1, frame, rc.left, rc.top, rc.right, rc.bottom + 1, &viewport); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM_CreateViewport(d3drm1, device1, frame, rc.left, rc.top, rc.right, rc.bottom, NULL); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + + hr = IDirect3DRM2_CreateViewport(d3drm2, NULL, frame, rc.left, rc.top, rc.right, rc.bottom, &viewport); + ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr); + hr = IDirect3DRM2_CreateViewport(d3drm2, device1, NULL, rc.left, rc.top, rc.right, rc.bottom, &viewport); + ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr); + hr = IDirect3DRM2_CreateViewport(d3drm2, device1, frame, rc.left, rc.top, rc.right + 1, rc.bottom + 1, &viewport); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM2_CreateViewport(d3drm2, device1, frame, rc.left, rc.top, rc.right + 1, rc.bottom, &viewport); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM2_CreateViewport(d3drm2, device1, frame, rc.left, rc.top, rc.right, rc.bottom + 1, &viewport); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM2_CreateViewport(d3drm2, device1, frame, rc.left, rc.top, rc.right, rc.bottom, NULL); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + + hr = IDirect3DRM3_CreateViewport(d3drm3, NULL, frame3, rc.left, rc.top, rc.right, rc.bottom, &viewport2); + ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr); + hr = IDirect3DRM3_CreateViewport(d3drm3, device3, NULL, rc.left, rc.top, rc.right, rc.bottom, &viewport2); + ok(hr == D3DRMERR_BADOBJECT, "Expected hr == D3DRMERR_BADOBJECT, got %#x.\n", hr); + hr = IDirect3DRM3_CreateViewport(d3drm3, device3, frame3, rc.left, rc.top, rc.right + 1, rc.bottom + 1, &viewport2); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM3_CreateViewport(d3drm3, device3, frame3, rc.left, rc.top, rc.right + 1, rc.bottom, &viewport2); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM3_CreateViewport(d3drm3, device3, frame3, rc.left, rc.top, rc.right, rc.bottom + 1, &viewport2); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM3_CreateViewport(d3drm3, device3, frame3, rc.left, rc.top, rc.right, rc.bottom, NULL); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + + hr = IDirect3DRM2_CreateViewport(d3drm2, device1, frame, rc.left, rc.top, rc.right, rc.bottom, &viewport); + ok(hr == D3DRM_OK, "Cannot get IDirect3DRMViewport interface (hr = %x)\n", hr); + IDirect3DRMViewport_Release(viewport); + hr = IDirect3DRM3_CreateViewport(d3drm3, device3, frame3, rc.left, rc.top, rc.right, rc.bottom, &viewport2); + ok(hr == D3DRM_OK, "Cannot get IDirect3DRMViewport2 interface (hr = %x)\n", hr); + IDirect3DRMViewport2_Release(viewport2); + hr = IDirect3DRM_CreateViewport(d3drm1, device1, frame, rc.left, rc.top, rc.right, rc.bottom, &viewport); ok(hr == D3DRM_OK, "Cannot get IDirect3DRMViewport interface (hr = %x)\n", hr); -- 2.3.2 (Apple Git-55)