<div dir="ltr">I agree, the refcount tests for surface for CreateDeviceFromSurface and device for CreateDeviceFromD3D will help while implementing them. On running a quick test, it seems to increment surface by 2 in CreateDeviceFromSurface, device by 2, d3d by 4 for CreateDeviceFromD3D.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 11, 2015 at 9:58 PM, Stefan Dösinger <span dir="ltr"><<a href="mailto:stefandoesinger@gmail.com" target="_blank">stefandoesinger@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I think these tests are best integrated into CreateDeviceFromClipper. Similar tests are needed for the other creation methods, with some modifications. Check if the reference count of the surface passed to CreateDeviceFromSurface is incremented, and similarly for the device passed to CreateDeviceFromD3D.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
> Am 11.06.2015 um 13:51 schrieb Aaryaman Vasishta <<a href="mailto:jem456.vasishta@gmail.com">jem456.vasishta@gmail.com</a>>:<br>
><br>
> The refcount tests for d3drm1 are the same for the device created from all three creation methods.<br>
> ---<br>
> dlls/d3drm/tests/d3drm.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++<br>
> 1 file changed, 81 insertions(+)<br>
><br>
> diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c<br>
> index ac4c8fe..ecf1d4d 100644<br>
> --- a/dlls/d3drm/tests/d3drm.c<br>
> +++ b/dlls/d3drm/tests/d3drm.c<br>
> @@ -2367,6 +2367,86 @@ cleanup:<br>
>     IDirectDraw_Release(ddraw1);<br>
> }<br>
><br>
> +static void test_device_refcount(void)<br>
> +{<br>
> +    IDirect3DRM *d3drm1;<br>
> +    IDirect3DRM2 *d3drm2;<br>
> +    IDirect3DRM3 *d3drm3;<br>
> +    IDirect3DRMDevice *device1;<br>
> +    IDirect3DRMDevice2 *device2;<br>
> +    IDirect3DRMDevice3 *device3;<br>
> +    IDirectDrawClipper *clipper;<br>
> +    HWND window;<br>
> +    HRESULT hr;<br>
> +    ULONG ref1, ref2, cref1, cref2;<br>
> +    GUID driver;<br>
> +    RECT rc;<br>
> +<br>
> +<br>
> +    window = CreateWindowA("static", "d3drm_test", WS_OVERLAPPEDWINDOW, 0, 0, 300, 200, 0, 0, 0, 0);<br>
> +    GetClientRect(window, &rc);<br>
> +    hr = DirectDrawCreateClipper(0, &clipper, NULL);<br>
> +    ok(hr == DD_OK, "Cannot get IDirectDrawClipper interface (hr = %x)\n", hr);<br>
> +    hr = IDirectDrawClipper_SetHWnd(clipper, 0, window);<br>
> +    ok(hr == DD_OK, "Cannot set HWnd to Clipper (hr = %x)\n", hr);<br>
> +<br>
> +    hr = Direct3DRMCreate(&d3drm1);<br>
> +    ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);<br>
> +    ref1 = get_refcount((IUnknown *)d3drm1);<br>
> +    cref1 = get_refcount((IUnknown *)clipper);<br>
> +    memcpy(&driver, &IID_IDirect3DRGBDevice, sizeof(GUID));<br>
> +    hr = IDirect3DRM_CreateDeviceFromClipper(d3drm1, clipper, &driver, rc.right, rc.bottom, &device1);<br>
> +    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMDevice interface (hr = %x)\n", hr);<br>
> +    ref2 = get_refcount((IUnknown *)d3drm1);<br>
> +    cref2 = get_refcount((IUnknown *)clipper);<br>
> +    ok(ref2 > ref1, "expected ref2 > ref1, got ref1 = %d , ref2 = %d\n", ref1, ref2);<br>
> +    ok(cref2 > cref1, "expected cref2 > cref1, got cref1 = %d , cref2 = %d\n", cref1, cref2);<br>
> +    if (device1)<br>
> +        IDirect3DRMDevice_Release(device1);<br>
> +    ref2 = get_refcount((IUnknown *)d3drm1);<br>
> +    cref2 = get_refcount((IUnknown *)clipper);<br>
> +    ok(ref1 == ref2, "expected ref1 == ref2, got ref1 = %d, ref2 = %d\n", ref1, ref2);<br>
> +    ok(cref1 == cref2, "expected cref1 == cref2, got cref1 = %d, cref2 = %d\n", cref1, cref2);<br>
> +<br>
> +    hr = IDirect3DRM_QueryInterface(d3drm1, &IID_IDirect3DRM2, (void **)&d3drm2);<br>
> +    ok(hr == D3DRM_OK, "Cannot get IDirect3DRM2 interface (hr = %x).\n", hr);<br>
> +    ref1 = get_refcount((IUnknown *)d3drm1);<br>
> +    cref1 = get_refcount((IUnknown *)clipper);<br>
> +    hr = IDirect3DRM2_CreateDeviceFromClipper(d3drm2, clipper, &driver, rc.right, rc.bottom, &device2);<br>
> +    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMDevice2 interface (hr = %x)\n", hr);<br>
> +    ref2 = get_refcount((IUnknown *)d3drm1);<br>
> +    cref2 = get_refcount((IUnknown *)clipper);<br>
> +    ok(ref2 > ref1, "expected ref2 > ref1, got ref1 = %d , ref2 = %d\n", ref1, ref2);<br>
> +    ok(cref2 > cref1, "expected cref2 > cref1, got cref1 = %d , cref2 = %d\n", cref1, cref2);<br>
> +    if (device2)<br>
> +        IDirect3DRMDevice2_Release(device2);<br>
> +    ref2 = get_refcount((IUnknown *)d3drm1);<br>
> +    cref2 = get_refcount((IUnknown *)clipper);<br>
> +    ok(ref1 == ref2, "expected ref1 == ref2, got ref1 = %d, ref2 = %d\n", ref1, ref2);<br>
> +    ok(cref1 == cref2, "expected cref1 == cref2, got cref1 = %d, cref2 = %d\n", cref1, cref2);<br>
> +<br>
> +    hr = IDirect3DRM_QueryInterface(d3drm1, &IID_IDirect3DRM3, (void **)&d3drm3);<br>
> +    ok(hr == D3DRM_OK, "Cannot get IDirect3DRM3 interface (hr = %x).\n", hr);<br>
> +    ref1 = get_refcount((IUnknown *)d3drm1);<br>
> +    cref1 = get_refcount((IUnknown *)clipper);<br>
> +    hr = IDirect3DRM3_CreateDeviceFromClipper(d3drm3, clipper, &driver, rc.right, rc.bottom, &device3);<br>
> +    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMDevice3 interface (hr = %x)\n", hr);<br>
> +    ref2 = get_refcount((IUnknown *)d3drm1);<br>
> +    cref2 = get_refcount((IUnknown *)clipper);<br>
> +    ok(ref2 > ref1, "expected ref2 > ref1, got ref1 = %d, ref2 = %d\n", ref1, ref2);<br>
> +    ok(cref2 > cref1, "expected cref2 > cref1, got cref1 = %d , cref2 = %d\n", cref1, cref2);<br>
> +    if (device3)<br>
> +        IDirect3DRMDevice3_Release(device3);<br>
> +    ref2 = get_refcount((IUnknown *)d3drm1);<br>
> +    cref2 = get_refcount((IUnknown *)clipper);<br>
> +    ok(ref1 == ref2, "expected ref1 == ref2, got ref1 = %d, ref2 = %d\n", ref1, ref2);<br>
> +    ok(cref1 == cref2, "expected cref1 == cref2, got cref1 = %d, cref2 = %d\n", cref1, cref2);<br>
> +<br>
> +    IDirectDrawClipper_Release(clipper);<br>
> +    IDirect3DRM2_Release(d3drm2);<br>
> +    IDirect3DRM3_Release(d3drm3);<br>
> +}<br>
> +<br>
> START_TEST(d3drm)<br>
> {<br>
>     test_MeshBuilder();<br>
> @@ -2387,4 +2467,5 @@ START_TEST(d3drm)<br>
>     test_create_device_from_clipper();<br>
>     test_create_device_from_surface();<br>
>     test_create_device_from_d3d();<br>
> +    test_device_refcount();<br>
> }<br>
> --<br>
> 1.9.3 (Apple Git-50)<br>
><br>
><br>
><br>
<br>
</div></div></blockquote></div><br></div>