[PATCH 3/4] d3drm/tests: Split tests seperately for IDirect3DRM{1-3} interfaces

Aaryaman Vasishta jem456.vasishta at gmail.com
Wed Apr 1 11:15:20 CDT 2015


---
 dlls/d3drm/tests/Makefile.in |   3 +
 dlls/d3drm/tests/d3drm.c     |  99 +++++++++++++++
 dlls/d3drm/tests/d3drm1.c    | 275 ++++++++++++++++++++++++++++++++++++++++
 dlls/d3drm/tests/d3drm2.c    | 293 +++++++++++++++++++++++++++++++++++++++++++
 dlls/d3drm/tests/d3drm3.c    | 293 +++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 963 insertions(+)
 create mode 100644 dlls/d3drm/tests/d3drm1.c
 create mode 100644 dlls/d3drm/tests/d3drm2.c
 create mode 100644 dlls/d3drm/tests/d3drm3.c

diff --git a/dlls/d3drm/tests/Makefile.in b/dlls/d3drm/tests/Makefile.in
index 591f9e0..0e0c4bb 100644
--- a/dlls/d3drm/tests/Makefile.in
+++ b/dlls/d3drm/tests/Makefile.in
@@ -2,4 +2,7 @@ TESTDLL   = d3drm.dll
 IMPORTS   = d3drm dxguid ddraw user32 uuid
 C_SRCS = \
 	d3drm.c \
+	d3drm1.c \
+	d3drm2.c \
+	d3drm3.c \
 	vector.c
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 515aace..6029b1a 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -1841,6 +1841,104 @@ static void test_d3drm_qi(void)
     IDirect3DRM_Release(d3drm);
 }
 
+static void test_frame_qi(void)
+{
+    static const struct qi_test tests[] =
+    {
+        { &IID_IDirect3DRMFrame3,          &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },
+        { &IID_IDirect3DRMFrame2,          &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },
+        { &IID_IDirect3DRMFrame,           &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },
+        { &IID_IDirect3DRM,                NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDevice,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMObject,          &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },   
+        { &IID_IDirect3DRMDevice2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDevice3,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewport,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewport2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRM3,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRM2,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMVisual,          &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },
+        { &IID_IDirect3DRMMesh,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder2,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder3,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFace,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFace2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMLight,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMWrap,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMaterial,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMaterial2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimation,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimation2,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationSet,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationSet2,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMObjectArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDeviceArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewportArray,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFrameArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMVisualArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMLightArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMPickedArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFaceArray,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationArray,  NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMUserVisual,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMShadow,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMShadow2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMInterpolator,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMProgressiveMesh, NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMPicked2Array,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMClippedVisual,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawClipper,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface7,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface4,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice7,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice3,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D7,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D3,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D2,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D,                  NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw7,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw4,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw3,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw2,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw,                NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DLight,             NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IUnknown,                   &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },
+    };
+    HRESULT hr;
+    IDirect3DRM *d3drm;
+    IDirect3DRM3 *d3drm3;
+    IDirect3DRMFrame3 *frame3;
+
+    hr = Direct3DRMCreate(&d3drm);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
+
+    if (FAILED(hr = IDirect3DRM_QueryInterface(d3drm, &IID_IDirect3DRM3, (void **)&d3drm3)))
+    {
+        win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr);
+        IDirect3DRM_Release(d3drm);
+        return;
+    }
+
+    hr = IDirect3DRM3_CreateFrame(d3drm3, NULL, &frame3);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame3 interface (hr = %x)\n", hr);
+    CHECK_REFCOUNT(frame3, 1);
+
+    test_qi("frame_qi", (IUnknown *)frame3, &IID_IDirect3DRMFrame3, tests, sizeof(tests) / sizeof(*tests));
+
+    IDirect3DRMFrame3_Release(frame3);
+    IDirect3DRM3_Release(d3drm3);
+    IDirect3DRM_Release(d3drm);
+}
+
 START_TEST(d3drm)
 {
     test_MeshBuilder();
@@ -1857,4 +1955,5 @@ START_TEST(d3drm)
     test_d3drm_load();
     test_frame_mesh_materials();
     test_d3drm_qi();
+    test_frame_qi();
 }
diff --git a/dlls/d3drm/tests/d3drm1.c b/dlls/d3drm/tests/d3drm1.c
new file mode 100644
index 0000000..cea000f
--- /dev/null
+++ b/dlls/d3drm/tests/d3drm1.c
@@ -0,0 +1,275 @@
+/*
+* Copyright 2010, 2012 Christian Costa
+* Copyright 2012 André Hentschel
+* Copyright 2011-2014 Henri Verbeet for CodeWeavers
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation; either
+* version 2.1 of the License, or (at your option) any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#define COBJMACROS
+#include <d3d.h>
+#include <d3drm.h>
+#include <d3drmwin.h>
+
+#include "wine/test.h"
+
+#define CHECK_REFCOUNT(obj,rc) \
+    { \
+    int rc_new = rc; \
+    int count = get_refcount((IUnknown *)obj); \
+    ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
+    }
+
+static int get_refcount(IUnknown *object)
+{
+    IUnknown_AddRef(object);
+    return IUnknown_Release(object);
+}
+
+struct qi_test
+{
+    REFIID iid;
+    REFIID refcount_iid;
+    HRESULT hr;
+    BOOL refcount_todo;
+};
+
+static void test_qi(const char *test_name, IUnknown *base_iface,
+    REFIID refcount_iid, const struct qi_test *tests, UINT entry_count)
+{
+    ULONG refcount, expected_refcount;
+    IUnknown *iface1, *iface2;
+    HRESULT hr;
+    UINT i, j;
+
+    for (i = 0; i < entry_count; ++i)
+    {
+        hr = IUnknown_QueryInterface(base_iface, tests[i].iid, (void **)&iface1);
+        ok(hr == tests[i].hr, "Got hr %#x for test \"%s\" %u.\n", hr, test_name, i);
+        if (SUCCEEDED(hr))
+        {
+            for (j = 0; j < entry_count; ++j)
+            {
+                hr = IUnknown_QueryInterface(iface1, tests[j].iid, (void **)&iface2);
+                ok(hr == tests[j].hr, "Got hr %#x for test \"%s\" %u, %u.\n", hr, test_name, i, j);
+                if (SUCCEEDED(hr))
+                {
+                    expected_refcount = 0;
+                    if (IsEqualGUID(refcount_iid, tests[j].refcount_iid))
+                        ++expected_refcount;
+                    if (IsEqualGUID(tests[i].refcount_iid, tests[j].refcount_iid))
+                        ++expected_refcount;
+                    refcount = IUnknown_Release(iface2);
+                    if (tests[i].refcount_todo || tests[j].refcount_todo)
+                        todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+                        refcount, test_name, i, j, expected_refcount);
+                    else
+                        ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+                        refcount, test_name, i, j, expected_refcount);
+                }
+            }
+
+            expected_refcount = 0;
+            if (IsEqualGUID(refcount_iid, tests[i].refcount_iid))
+                ++expected_refcount;
+            refcount = IUnknown_Release(iface1);
+            if (tests[i].refcount_todo)
+                todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+                refcount, test_name, i, expected_refcount);
+            else
+                ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+                refcount, test_name, i, expected_refcount);
+        }
+    }
+}
+
+static void test_d3drm_qi(void)
+{
+    static const struct qi_test tests[] =
+    {
+        { &IID_IDirect3DRM3,               &IID_IDirect3DRM3,      S_OK,                            TRUE  },
+        { &IID_IDirect3DRM2,               &IID_IDirect3DRM2,      S_OK,                            TRUE  },
+        { &IID_IDirect3DRM,                &IID_IDirect3DRM,       S_OK,                            FALSE },
+        { &IID_IDirect3DRMDevice,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMObject,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMObject2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMDevice2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMDevice3,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMViewport,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMViewport2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrame,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrame2,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrame3,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMVisual,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMesh,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMeshBuilder,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMeshBuilder2,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMeshBuilder3,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFace,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFace2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMLight,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMTexture,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMTexture2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMTexture3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMWrap,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMaterial,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMaterial2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimation,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimation2,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimationSet,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimationSet2,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMObjectArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMDeviceArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMViewportArray,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrameArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMVisualArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMLightArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMPickedArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFaceArray,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimationArray,  NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMUserVisual,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMShadow,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMShadow2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMInterpolator,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMProgressiveMesh, NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMPicked2Array,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMClippedVisual,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawClipper,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface7,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface4,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice7,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice3,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D7,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D3,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D2,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D,                  NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw7,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw4,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw3,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw2,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw,                NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DLight,             NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IUnknown,                   &IID_IDirect3DRM,       S_OK,                            FALSE },
+    };
+    HRESULT hr;
+    IDirect3DRM *d3drm;
+
+    hr = Direct3DRMCreate(&d3drm);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
+
+    test_qi("d3drm_qi", (IUnknown *)d3drm, &IID_IDirect3DRM, tests, sizeof(tests) / sizeof(*tests));
+
+    IDirect3DRM_Release(d3drm);
+}
+
+static void test_frame_qi(void)
+{
+    static const struct qi_test tests[] =
+    {
+        { &IID_IDirect3DRMFrame3,          &IID_IDirect3DRMFrame,  S_OK,                                  FALSE },
+        { &IID_IDirect3DRMFrame2,          &IID_IDirect3DRMFrame,  S_OK,                                  FALSE },
+        { &IID_IDirect3DRMFrame,           &IID_IDirect3DRMFrame,  S_OK,                                  FALSE },
+        { &IID_IDirect3DRM,                NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDevice,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMObject,          &IID_IDirect3DRMFrame,  S_OK,                                  FALSE },   
+        { &IID_IDirect3DRMDevice2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDevice3,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewport,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewport2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRM3,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRM2,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMVisual,          &IID_IDirect3DRMFrame,  S_OK,                                  FALSE },
+        { &IID_IDirect3DRMMesh,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder2,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder3,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFace,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFace2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMLight,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMWrap,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMaterial,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMaterial2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimation,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimation2,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationSet,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationSet2,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMObjectArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDeviceArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewportArray,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFrameArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMVisualArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMLightArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMPickedArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFaceArray,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationArray,  NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMUserVisual,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMShadow,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMShadow2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMInterpolator,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMProgressiveMesh, NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMPicked2Array,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMClippedVisual,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawClipper,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface7,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface4,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice7,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice3,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D7,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D3,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D2,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D,                  NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw7,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw4,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw3,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw2,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw,                NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DLight,             NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IUnknown,                   &IID_IDirect3DRMFrame,  S_OK,                                  FALSE },
+    };
+    HRESULT hr;
+    IDirect3DRM *d3drm;
+    IDirect3DRMFrame *frame;
+
+    hr = Direct3DRMCreate(&d3drm);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
+
+    hr = IDirect3DRM_CreateFrame(d3drm, NULL, &frame);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame3 interface (hr = %x)\n", hr);
+    CHECK_REFCOUNT(frame, 1);
+
+    test_qi("frame_qi", (IUnknown *)frame, &IID_IDirect3DRMFrame, tests, sizeof(tests) / sizeof(*tests));
+
+    IDirect3DRMFrame_Release(frame);
+    IDirect3DRM_Release(d3drm);
+}
+
+START_TEST(d3drm1)
+{
+    test_d3drm_qi();
+    test_frame_qi();
+}
diff --git a/dlls/d3drm/tests/d3drm2.c b/dlls/d3drm/tests/d3drm2.c
new file mode 100644
index 0000000..6b52609
--- /dev/null
+++ b/dlls/d3drm/tests/d3drm2.c
@@ -0,0 +1,293 @@
+/*
+* Copyright 2010, 2012 Christian Costa
+* Copyright 2012 André Hentschel
+* Copyright 2011-2014 Henri Verbeet for CodeWeavers
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation; either
+* version 2.1 of the License, or (at your option) any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#define COBJMACROS
+#include <d3d.h>
+#include <d3drm.h>
+#include <d3drmwin.h>
+
+#include "wine/test.h"
+
+#define CHECK_REFCOUNT(obj,rc) \
+    { \
+    int rc_new = rc; \
+    int count = get_refcount((IUnknown *)obj); \
+    ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
+    }
+
+static int get_refcount(IUnknown *object)
+{
+    IUnknown_AddRef(object);
+    return IUnknown_Release(object);
+}
+
+struct qi_test
+{
+    REFIID iid;
+    REFIID refcount_iid;
+    HRESULT hr;
+    BOOL refcount_todo;
+};
+
+static void test_qi(const char *test_name, IUnknown *base_iface,
+    REFIID refcount_iid, const struct qi_test *tests, UINT entry_count)
+{
+    ULONG refcount, expected_refcount;
+    IUnknown *iface1, *iface2;
+    HRESULT hr;
+    UINT i, j;
+
+    for (i = 0; i < entry_count; ++i)
+    {
+        hr = IUnknown_QueryInterface(base_iface, tests[i].iid, (void **)&iface1);
+        ok(hr == tests[i].hr, "Got hr %#x for test \"%s\" %u.\n", hr, test_name, i);
+        if (SUCCEEDED(hr))
+        {
+            for (j = 0; j < entry_count; ++j)
+            {
+                hr = IUnknown_QueryInterface(iface1, tests[j].iid, (void **)&iface2);
+                ok(hr == tests[j].hr, "Got hr %#x for test \"%s\" %u, %u.\n", hr, test_name, i, j);
+                if (SUCCEEDED(hr))
+                {
+                    expected_refcount = 0;
+                    if (IsEqualGUID(refcount_iid, tests[j].refcount_iid))
+                        ++expected_refcount;
+                    if (IsEqualGUID(tests[i].refcount_iid, tests[j].refcount_iid))
+                        ++expected_refcount;
+                    refcount = IUnknown_Release(iface2);
+                    if (tests[i].refcount_todo || tests[j].refcount_todo)
+                        todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+                        refcount, test_name, i, j, expected_refcount);
+                    else
+                        ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+                        refcount, test_name, i, j, expected_refcount);
+                }
+            }
+
+            expected_refcount = 0;
+            if (IsEqualGUID(refcount_iid, tests[i].refcount_iid))
+                ++expected_refcount;
+            refcount = IUnknown_Release(iface1);
+            if (tests[i].refcount_todo)
+                todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+                refcount, test_name, i, expected_refcount);
+            else
+                ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+                refcount, test_name, i, expected_refcount);
+        }
+    }
+}
+
+static void test_d3drm_qi(void)
+{
+    static const struct qi_test tests[] =
+    {
+        { &IID_IDirect3DRM3,               &IID_IDirect3DRM3,      S_OK,                            TRUE  },
+        { &IID_IDirect3DRM2,               &IID_IDirect3DRM2,      S_OK,                            FALSE },
+        { &IID_IDirect3DRM,                &IID_IDirect3DRM,       S_OK,                            TRUE  },
+        { &IID_IDirect3DRMDevice,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMObject,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMObject2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMDevice2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMDevice3,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMViewport,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMViewport2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrame,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrame2,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrame3,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMVisual,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMesh,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMeshBuilder,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMeshBuilder2,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMeshBuilder3,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFace,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFace2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMLight,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMTexture,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMTexture2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMTexture3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMWrap,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMaterial,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMaterial2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimation,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimation2,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimationSet,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimationSet2,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMObjectArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMDeviceArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMViewportArray,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrameArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMVisualArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMLightArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMPickedArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFaceArray,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimationArray,  NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMUserVisual,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMShadow,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMShadow2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMInterpolator,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMProgressiveMesh, NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMPicked2Array,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMClippedVisual,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawClipper,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface7,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface4,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice7,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice3,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D7,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D3,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D2,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D,                  NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw7,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw4,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw3,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw2,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw,                NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DLight,             NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IUnknown,                   &IID_IDirect3DRM,       S_OK,                            TRUE  },
+    };
+    HRESULT hr;
+    IDirect3DRM *d3drm;
+    IDirect3DRM2 *d3drm2;
+
+    hr = Direct3DRMCreate(&d3drm);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
+
+    if (FAILED(hr = IDirect3DRM_QueryInterface(d3drm, &IID_IDirect3DRM2, (void **)&d3drm2)))
+    {
+        win_skip("Cannot get IDirect3DRM2 interface (hr = %x), skipping tests\n", hr);
+        IDirect3DRM_Release(d3drm);
+        return;
+    }
+    IDirect3DRM_Release(d3drm);
+
+    test_qi("d3drm_qi", (IUnknown *)d3drm2, &IID_IDirect3DRM2, tests, sizeof(tests) / sizeof(*tests));
+
+    IDirect3DRM2_Release(d3drm2);
+}
+
+static void test_frame_qi(void)
+{
+    static const struct qi_test tests[] =
+    {
+        { &IID_IDirect3DRMFrame3,          &IID_IDirect3DRMFrame2, S_OK,                                  FALSE },
+        { &IID_IDirect3DRMFrame2,          &IID_IDirect3DRMFrame2, S_OK,                                  FALSE },
+        { &IID_IDirect3DRMFrame,           &IID_IDirect3DRMFrame2, S_OK,                                  FALSE },
+        { &IID_IDirect3DRM,                NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDevice,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMObject,          &IID_IDirect3DRMFrame2, S_OK,                                  FALSE },   
+        { &IID_IDirect3DRMDevice2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDevice3,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewport,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewport2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRM3,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRM2,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMVisual,          &IID_IDirect3DRMFrame2, S_OK,                                  FALSE },
+        { &IID_IDirect3DRMMesh,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder2,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder3,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFace,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFace2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMLight,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMWrap,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMaterial,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMaterial2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimation,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimation2,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationSet,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationSet2,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMObjectArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDeviceArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewportArray,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFrameArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMVisualArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMLightArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMPickedArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFaceArray,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationArray,  NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMUserVisual,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMShadow,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMShadow2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMInterpolator,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMProgressiveMesh, NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMPicked2Array,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMClippedVisual,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawClipper,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface7,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface4,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice7,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice3,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D7,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D3,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D2,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D,                  NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw7,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw4,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw3,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw2,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw,                NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DLight,             NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IUnknown,                   &IID_IDirect3DRMFrame2, S_OK,                                  FALSE },
+    };
+    HRESULT hr;
+    IDirect3DRM *d3drm;
+    IDirect3DRM2 *d3drm2;
+    IDirect3DRMFrame2 *frame2;
+
+    hr = Direct3DRMCreate(&d3drm);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
+
+    if (FAILED(hr = IDirect3DRM_QueryInterface(d3drm, &IID_IDirect3DRM2, (void **)&d3drm2)))
+    {
+        win_skip("Cannot get IDirect3DRM2 interface (hr = %x), skipping tests\n", hr);
+        IDirect3DRM_Release(d3drm);
+        return;
+    }
+
+    hr = IDirect3DRM2_CreateFrame(d3drm2, NULL, &frame2);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame3 interface (hr = %x)\n", hr);
+    CHECK_REFCOUNT(frame2, 1);
+
+    test_qi("frame_qi", (IUnknown *)frame2, &IID_IDirect3DRMFrame2, tests, sizeof(tests) / sizeof(*tests));
+
+    IDirect3DRMFrame2_Release(frame2);
+    IDirect3DRM2_Release(d3drm2);
+    IDirect3DRM_Release(d3drm);
+}
+
+START_TEST(d3drm2)
+{
+    test_d3drm_qi();
+    test_frame_qi();
+}
diff --git a/dlls/d3drm/tests/d3drm3.c b/dlls/d3drm/tests/d3drm3.c
new file mode 100644
index 0000000..9538fb5
--- /dev/null
+++ b/dlls/d3drm/tests/d3drm3.c
@@ -0,0 +1,293 @@
+/*
+* Copyright 2010, 2012 Christian Costa
+* Copyright 2012 André Hentschel
+* Copyright 2011-2014 Henri Verbeet for CodeWeavers
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation; either
+* version 2.1 of the License, or (at your option) any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#define COBJMACROS
+#include <d3d.h>
+#include <d3drm.h>
+#include <d3drmwin.h>
+
+#include "wine/test.h"
+
+#define CHECK_REFCOUNT(obj,rc) \
+    { \
+    int rc_new = rc; \
+    int count = get_refcount((IUnknown *)obj); \
+    ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
+    }
+
+static int get_refcount(IUnknown *object)
+{
+    IUnknown_AddRef(object);
+    return IUnknown_Release(object);
+}
+
+struct qi_test
+{
+    REFIID iid;
+    REFIID refcount_iid;
+    HRESULT hr;
+    BOOL refcount_todo;
+};
+
+static void test_qi(const char *test_name, IUnknown *base_iface,
+    REFIID refcount_iid, const struct qi_test *tests, UINT entry_count)
+{
+    ULONG refcount, expected_refcount;
+    IUnknown *iface1, *iface2;
+    HRESULT hr;
+    UINT i, j;
+
+    for (i = 0; i < entry_count; ++i)
+    {
+        hr = IUnknown_QueryInterface(base_iface, tests[i].iid, (void **)&iface1);
+        ok(hr == tests[i].hr, "Got hr %#x for test \"%s\" %u.\n", hr, test_name, i);
+        if (SUCCEEDED(hr))
+        {
+            for (j = 0; j < entry_count; ++j)
+            {
+                hr = IUnknown_QueryInterface(iface1, tests[j].iid, (void **)&iface2);
+                ok(hr == tests[j].hr, "Got hr %#x for test \"%s\" %u, %u.\n", hr, test_name, i, j);
+                if (SUCCEEDED(hr))
+                {
+                    expected_refcount = 0;
+                    if (IsEqualGUID(refcount_iid, tests[j].refcount_iid))
+                        ++expected_refcount;
+                    if (IsEqualGUID(tests[i].refcount_iid, tests[j].refcount_iid))
+                        ++expected_refcount;
+                    refcount = IUnknown_Release(iface2);
+                    if (tests[i].refcount_todo || tests[j].refcount_todo)
+                        todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+                        refcount, test_name, i, j, expected_refcount);
+                    else
+                        ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
+                        refcount, test_name, i, j, expected_refcount);
+                }
+            }
+
+            expected_refcount = 0;
+            if (IsEqualGUID(refcount_iid, tests[i].refcount_iid))
+                ++expected_refcount;
+            refcount = IUnknown_Release(iface1);
+            if (tests[i].refcount_todo)
+                todo_wine ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+                refcount, test_name, i, expected_refcount);
+            else
+                ok(refcount == expected_refcount, "Got refcount %u for test \"%s\" %u, expected %u.\n",
+                refcount, test_name, i, expected_refcount);
+        }
+    }
+}
+
+static void test_d3drm_qi(void)
+{
+    static const struct qi_test tests[] =
+    {
+        { &IID_IDirect3DRM3,               &IID_IDirect3DRM3,      S_OK,                            FALSE },
+        { &IID_IDirect3DRM2,               &IID_IDirect3DRM2,      S_OK,                            TRUE  },
+        { &IID_IDirect3DRM,                &IID_IDirect3DRM,       S_OK,                            TRUE  },
+        { &IID_IDirect3DRMDevice,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMObject,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMObject2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMDevice2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMDevice3,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMViewport,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMViewport2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrame,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrame2,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrame3,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMVisual,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMesh,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMeshBuilder,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMeshBuilder2,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMeshBuilder3,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFace,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFace2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMLight,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMTexture,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMTexture2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMTexture3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMWrap,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMaterial,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMMaterial2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimation,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimation2,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimationSet,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimationSet2,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMObjectArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMDeviceArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMViewportArray,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFrameArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMVisualArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMLightArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMPickedArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMFaceArray,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMAnimationArray,  NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMUserVisual,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMShadow,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMShadow2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMInterpolator,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMProgressiveMesh, NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMPicked2Array,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DRMClippedVisual,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawClipper,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface7,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface4,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDrawSurface,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice7,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice3,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DDevice,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D7,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D3,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D2,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3D,                  NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw7,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw4,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw3,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw2,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirectDraw,                NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IDirect3DLight,             NULL,                   CLASS_E_CLASSNOTAVAILABLE,       FALSE },
+        { &IID_IUnknown,                   &IID_IDirect3DRM,       S_OK,                            TRUE  },
+    };
+    HRESULT hr;
+    IDirect3DRM *d3drm;
+    IDirect3DRM3 *d3drm3;
+
+    hr = Direct3DRMCreate(&d3drm);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
+
+    if (FAILED(hr = IDirect3DRM_QueryInterface(d3drm, &IID_IDirect3DRM3, (void **)&d3drm3)))
+    {
+        win_skip("Cannot get IDirect3DRM2 interface (hr = %x), skipping tests\n", hr);
+        IDirect3DRM_Release(d3drm);
+        return;
+    }
+    IDirect3DRM_Release(d3drm);
+
+    test_qi("d3drm_qi", (IUnknown *)d3drm3, &IID_IDirect3DRM3, tests, sizeof(tests) / sizeof(*tests));
+
+    IDirect3DRM3_Release(d3drm3);
+}
+
+static void test_frame_qi(void)
+{
+    static const struct qi_test tests[] =
+    {
+        { &IID_IDirect3DRMFrame3,          &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },
+        { &IID_IDirect3DRMFrame2,          &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },
+        { &IID_IDirect3DRMFrame,           &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },
+        { &IID_IDirect3DRM,                NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDevice,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMObject,          &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },   
+        { &IID_IDirect3DRMDevice2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDevice3,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewport,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewport2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRM3,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRM2,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMVisual,          &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },
+        { &IID_IDirect3DRMMesh,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder2,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMeshBuilder3,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFace,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFace2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMLight,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMTexture3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMWrap,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMaterial,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMMaterial2,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimation,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimation2,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationSet,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationSet2,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMObjectArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMDeviceArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMViewportArray,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFrameArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMVisualArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMLightArray,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMPickedArray,     NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMFaceArray,       NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMAnimationArray,  NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMUserVisual,      NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMShadow,          NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMShadow2,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMInterpolator,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMProgressiveMesh, NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMPicked2Array,    NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DRMClippedVisual,   NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawClipper,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface7,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface4,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface3,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface2,        NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDrawSurface,         NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice7,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice3,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice2,           NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DDevice,            NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D7,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D3,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D2,                 NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3D,                  NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw7,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw4,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw3,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw2,               NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirectDraw,                NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IDirect3DLight,             NULL,                   CLASS_E_CLASSNOTAVAILABLE,             FALSE },
+        { &IID_IUnknown,                   &IID_IDirect3DRMFrame3, S_OK,                                  FALSE },
+    };
+    HRESULT hr;
+    IDirect3DRM *d3drm;
+    IDirect3DRM3 *d3drm3;
+    IDirect3DRMFrame3 *frame3;
+
+    hr = Direct3DRMCreate(&d3drm);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
+
+    if (FAILED(hr = IDirect3DRM_QueryInterface(d3drm, &IID_IDirect3DRM3, (void **)&d3drm3)))
+    {
+        win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr);
+        IDirect3DRM_Release(d3drm);
+        return;
+    }
+
+    hr = IDirect3DRM3_CreateFrame(d3drm3, NULL, &frame3);
+    ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame3 interface (hr = %x)\n", hr);
+    CHECK_REFCOUNT(frame3, 1);
+
+    test_qi("frame_qi", (IUnknown *)frame3, &IID_IDirect3DRMFrame3, tests, sizeof(tests) / sizeof(*tests));
+
+    IDirect3DRMFrame3_Release(frame3);
+    IDirect3DRM3_Release(d3drm3);
+    IDirect3DRM_Release(d3drm);
+}
+
+START_TEST(d3drm3)
+{
+    test_d3drm_qi();
+    test_frame_qi();
+}
-- 
1.9.3 (Apple Git-50)




More information about the wine-patches mailing list