d3drm: Implement IDirect3DRM*::CreateViewport.
Signed-off-by: Aaryaman Vasishta <jem456.vasishta@gmail.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
74b27abb63
commit
202df3e1ec
|
@ -432,11 +432,38 @@ 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;
|
||||
}
|
||||
|
||||
hr = IDirect3DRM3_CreateViewport(&d3drm->IDirect3DRM3_iface, device3, camera3, x, y, width, height, &viewport2);
|
||||
IDirect3DRMDevice3_Release(device3);
|
||||
IDirect3DRMFrame3_Release(camera3);
|
||||
if (FAILED(hr))
|
||||
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 +907,38 @@ 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;
|
||||
}
|
||||
|
||||
return D3DRM_OK;
|
||||
hr = IDirect3DRM3_CreateViewport(&d3drm->IDirect3DRM3_iface, device3, camera3, x, y, width, height, &viewport2);
|
||||
IDirect3DRMDevice3_Release(device3);
|
||||
IDirect3DRMFrame3_Release(camera3);
|
||||
if (FAILED(hr))
|
||||
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 +1502,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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1512,6 +1512,137 @@ 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);
|
||||
|
||||
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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue