[v2 PATCH 1/2] d3drm: Added IDirect3DRMWrap stub
Nikolay Sivov
nsivov at codeweavers.com
Sun Jun 25 18:16:12 CDT 2017
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/d3drm/d3drm.c | 54 +++++++++++--
dlls/d3drm/d3drm_private.h | 7 ++
dlls/d3drm/meshbuilder.c | 189 +++++++++++++++++++++++++++++++++++++++++++++
dlls/d3drm/tests/d3drm.c | 115 ++++++++++++++++++++++++++-
4 files changed, 355 insertions(+), 10 deletions(-)
diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c
index 487a044896..3bc2f6993d 100644
--- a/dlls/d3drm/d3drm.c
+++ b/dlls/d3drm/d3drm.c
@@ -175,6 +175,19 @@ static HRESULT d3drm_create_animation_object(void **object, IDirect3DRM *d3drm)
return hr;
}
+static HRESULT d3drm_create_wrap_object(void **object, IDirect3DRM *d3drm)
+{
+ struct d3drm_wrap *wrap;
+ HRESULT hr;
+
+ if (FAILED(hr = d3drm_wrap_create(&wrap, d3drm)))
+ return hr;
+
+ *object = &wrap->IDirect3DRMWrap_iface;
+
+ return hr;
+}
+
struct d3drm
{
IDirect3DRM IDirect3DRM_iface;
@@ -593,11 +606,22 @@ static HRESULT WINAPI d3drm1_CreateWrap(IDirect3DRM *iface, D3DRMWRAPTYPE type,
D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
IDirect3DRMWrap **wrap)
{
+ struct d3drm_wrap *object;
+ HRESULT hr;
+
FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
- "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
+ "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p, semi-stub.\n",
iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
- return E_NOTIMPL;
+ if (!wrap)
+ return D3DRMERR_BADVALUE;
+
+ if (FAILED(hr = d3drm_wrap_create(&object, iface)))
+ return hr;
+
+ *wrap = &object->IDirect3DRMWrap_iface;
+
+ return S_OK;
}
static HRESULT WINAPI d3drm1_CreateUserVisual(IDirect3DRM *iface,
@@ -1097,11 +1121,14 @@ static HRESULT WINAPI d3drm2_CreateWrap(IDirect3DRM2 *iface, D3DRMWRAPTYPE type,
D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
IDirect3DRMWrap **wrap)
{
- FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
- "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
+ struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
+
+ TRACE("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
+ "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p.\n",
iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
- return E_NOTIMPL;
+ return IDirect3DRM_CreateWrap(&d3drm->IDirect3DRM_iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz,
+ ou, ov, su, sv, wrap);
}
static HRESULT WINAPI d3drm2_CreateUserVisual(IDirect3DRM2 *iface,
@@ -1340,6 +1367,7 @@ static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
{&CLSID_CDirect3DRMMaterial, d3drm_create_material_object},
{&CLSID_CDirect3DRMMesh, d3drm_create_mesh_object},
{&CLSID_CDirect3DRMAnimation, d3drm_create_animation_object},
+ {&CLSID_CDirect3DRMWrap, d3drm_create_wrap_object},
};
TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
@@ -1756,11 +1784,23 @@ static HRESULT WINAPI d3drm3_CreateWrap(IDirect3DRM3 *iface, D3DRMWRAPTYPE type,
D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
IDirect3DRMWrap **wrap)
{
+ struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
+ struct d3drm_wrap *object;
+ HRESULT hr;
+
FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
- "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
+ "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p, semi-stub.\n",
iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
- return E_NOTIMPL;
+ if (!wrap)
+ return D3DRMERR_BADVALUE;
+
+ if (FAILED(hr = d3drm_wrap_create(&object, &d3drm->IDirect3DRM_iface)))
+ return hr;
+
+ *wrap = &object->IDirect3DRMWrap_iface;
+
+ return S_OK;
}
static HRESULT WINAPI d3drm3_CreateUserVisual(IDirect3DRM3 *iface,
diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h
index 3dad93bc4c..f2a613167e 100644
--- a/dlls/d3drm/d3drm_private.h
+++ b/dlls/d3drm/d3drm_private.h
@@ -215,6 +215,12 @@ struct d3drm_animation
IDirect3DRM *d3drm;
};
+struct d3drm_wrap
+{
+ struct d3drm_object obj;
+ IDirect3DRMWrap IDirect3DRMWrap_iface;
+ LONG ref;
+};
HRESULT d3drm_device_create(struct d3drm_device **device, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
HRESULT d3drm_device_create_surfaces_from_clipper(struct d3drm_device *object, IDirectDraw *ddraw,
@@ -243,6 +249,7 @@ HRESULT d3drm_light_create(struct d3drm_light **light, IDirect3DRM *d3drm) DECLS
HRESULT d3drm_material_create(struct d3drm_material **material, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
HRESULT d3drm_mesh_create(struct d3drm_mesh **mesh, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
HRESULT d3drm_animation_create(struct d3drm_animation **animation, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
+HRESULT d3drm_wrap_create(struct d3drm_wrap **wrap, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *data,
D3DRMLOADTEXTURECALLBACK load_texture_proc, void *arg) DECLSPEC_HIDDEN;
diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c
index 4f6c7602c8..0dd1ddf05f 100644
--- a/dlls/d3drm/meshbuilder.c
+++ b/dlls/d3drm/meshbuilder.c
@@ -307,6 +307,11 @@ static inline struct d3drm_mesh_builder *impl_from_IDirect3DRMMeshBuilder3(IDire
return CONTAINING_RECORD(iface, struct d3drm_mesh_builder, IDirect3DRMMeshBuilder3_iface);
}
+static inline struct d3drm_wrap *impl_from_IDirect3DRMWrap(IDirect3DRMWrap *iface)
+{
+ return CONTAINING_RECORD(iface, struct d3drm_wrap, IDirect3DRMWrap_iface);
+}
+
static void clean_mesh_builder_data(struct d3drm_mesh_builder *mesh_builder)
{
DWORD i;
@@ -2878,3 +2883,187 @@ HRESULT d3drm_mesh_create(struct d3drm_mesh **mesh, IDirect3DRM *d3drm)
return S_OK;
}
+
+static HRESULT WINAPI d3drm_wrap_QueryInterface(IDirect3DRMWrap *iface, REFIID riid, void **out)
+{
+ TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
+
+ if (IsEqualGUID(riid, &IID_IDirect3DRMWrap)
+ || IsEqualGUID(riid, &IID_IDirect3DRMObject)
+ || IsEqualGUID(riid, &IID_IUnknown))
+ {
+ IDirect3DRMWrap_AddRef(iface);
+ *out = iface;
+ return S_OK;
+ }
+
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
+
+ *out = NULL;
+ return CLASS_E_CLASSNOTAVAILABLE;
+}
+
+static ULONG WINAPI d3drm_wrap_AddRef(IDirect3DRMWrap *iface)
+{
+ struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
+ ULONG refcount = InterlockedIncrement(&wrap->ref);
+
+ TRACE("%p increasing refcount to %u.\n", iface, refcount);
+
+ return refcount;
+}
+
+static ULONG WINAPI d3drm_wrap_Release(IDirect3DRMWrap *iface)
+{
+ struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
+ ULONG refcount = InterlockedDecrement(&wrap->ref);
+
+ TRACE("%p decreasing refcount to %u.\n", iface, refcount);
+
+ if (!refcount)
+ {
+ d3drm_object_cleanup((IDirect3DRMObject *)iface, &wrap->obj);
+ HeapFree(GetProcessHeap(), 0, wrap);
+ }
+
+ return refcount;
+}
+
+static HRESULT WINAPI d3drm_wrap_Clone(IDirect3DRMWrap *iface,
+ IUnknown *outer, REFIID iid, void **out)
+{
+ FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI d3drm_wrap_AddDestroyCallback(IDirect3DRMWrap *iface,
+ D3DRMOBJECTCALLBACK cb, void *ctx)
+{
+ struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
+
+ TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
+
+ return d3drm_object_add_destroy_callback(&wrap->obj, cb, ctx);
+}
+
+static HRESULT WINAPI d3drm_wrap_DeleteDestroyCallback(IDirect3DRMWrap *iface,
+ D3DRMOBJECTCALLBACK cb, void *ctx)
+{
+ struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
+
+ TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
+
+ return d3drm_object_delete_destroy_callback(&wrap->obj, cb, ctx);
+}
+
+static HRESULT WINAPI d3drm_wrap_SetAppData(IDirect3DRMWrap *iface, DWORD data)
+{
+ struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
+
+ TRACE("iface %p, data %#x.\n", iface, data);
+
+ wrap->obj.appdata = data;
+
+ return D3DRM_OK;
+}
+
+static DWORD WINAPI d3drm_wrap_GetAppData(IDirect3DRMWrap *iface)
+{
+ struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
+
+ TRACE("iface %p.\n", iface);
+
+ return wrap->obj.appdata;
+}
+
+static HRESULT WINAPI d3drm_wrap_SetName(IDirect3DRMWrap *iface, const char *name)
+{
+ struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
+
+ TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
+
+ return d3drm_object_set_name(&wrap->obj, name);
+}
+
+static HRESULT WINAPI d3drm_wrap_GetName(IDirect3DRMWrap *iface, DWORD *size, char *name)
+{
+ struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
+
+ TRACE("iface %p, size %p, name %p.\n", iface, size, name);
+
+ return d3drm_object_get_name(&wrap->obj, size, name);
+}
+
+static HRESULT WINAPI d3drm_wrap_GetClassName(IDirect3DRMWrap *iface, DWORD *size, char *name)
+{
+ struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
+
+ TRACE("iface %p, size %p, name %p.\n", iface, size, name);
+
+ return d3drm_object_get_class_name(&wrap->obj, size, name);
+}
+
+static HRESULT WINAPI d3drm_wrap_Init(IDirect3DRMWrap *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *reference,
+ D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, D3DVALUE ux,
+ D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv)
+{
+ FIXME("iface %p, type %d, reference frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, ux %.8e, "
+ "uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e.\n", iface, type, reference, ox, oy, oz, dx, dy, dz,
+ ux, uy, uz, ou, ov, su, sv);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI d3drm_wrap_Apply(IDirect3DRMWrap *iface, IDirect3DRMObject *object)
+{
+ FIXME("iface %p, object %p.\n", iface, object);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI d3drm_wrap_ApplyRelative(IDirect3DRMWrap *iface, IDirect3DRMFrame *frame,
+ IDirect3DRMObject *object)
+{
+ FIXME("iface %p, frame %p, object %p.\n", iface, frame, object);
+
+ return E_NOTIMPL;
+}
+
+static const struct IDirect3DRMWrapVtbl d3drm_wrap_vtbl =
+{
+ d3drm_wrap_QueryInterface,
+ d3drm_wrap_AddRef,
+ d3drm_wrap_Release,
+ d3drm_wrap_Clone,
+ d3drm_wrap_AddDestroyCallback,
+ d3drm_wrap_DeleteDestroyCallback,
+ d3drm_wrap_SetAppData,
+ d3drm_wrap_GetAppData,
+ d3drm_wrap_SetName,
+ d3drm_wrap_GetName,
+ d3drm_wrap_GetClassName,
+ d3drm_wrap_Init,
+ d3drm_wrap_Apply,
+ d3drm_wrap_ApplyRelative,
+};
+
+HRESULT d3drm_wrap_create(struct d3drm_wrap **wrap, IDirect3DRM *d3drm)
+{
+ static const char classname[] = "";
+ struct d3drm_wrap *object;
+
+ TRACE("wrap %p, d3drm %p.\n", wrap, d3drm);
+
+ if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
+ return E_OUTOFMEMORY;
+
+ object->IDirect3DRMWrap_iface.lpVtbl = &d3drm_wrap_vtbl;
+ object->ref = 1;
+
+ d3drm_object_init(&object->obj, classname);
+
+ *wrap = object;
+
+ return S_OK;
+}
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index ae88d9ee1d..7020b5e869 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -96,8 +96,8 @@ static HWND create_window(void)
static void test_class_name_(unsigned int line, IDirect3DRMObject *object, const char *name)
{
char cname[64] = {0};
+ DWORD size, size2;
HRESULT hr;
- DWORD size;
hr = IDirect3DRMObject_GetClassName(object, NULL, cname);
ok_(__FILE__, line)(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
@@ -109,10 +109,10 @@ static void test_class_name_(unsigned int line, IDirect3DRMObject *object, const
ok_(__FILE__, line)(hr == D3DRM_OK, "Failed to get classname size, hr %#x.\n", hr);
ok_(__FILE__, line)(size == strlen(name) + 1, "wrong size: %u\n", size);
- size = 1;
+ size = size2 = !!*name ? 1 : 0;
hr = IDirect3DRMObject_GetClassName(object, &size, cname);
ok_(__FILE__, line)(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
- ok_(__FILE__, line)(size == 1, "Got size %u.\n", size);
+ ok_(__FILE__, line)(size == size2, "Got size %u.\n", size);
size = sizeof(cname);
hr = IDirect3DRMObject_GetClassName(object, &size, cname);
@@ -1490,6 +1490,7 @@ static void test_object(void)
{ &CLSID_CDirect3DRMMesh, &IID_IDirect3DRMMesh, TRUE },
{ &CLSID_CDirect3DRMAnimation, &IID_IDirect3DRMAnimation, TRUE },
{ &CLSID_CDirect3DRMAnimation, &IID_IDirect3DRMAnimation2, TRUE },
+ { &CLSID_CDirect3DRMWrap, &IID_IDirect3DRMWrap },
};
IDirect3DRM *d3drm1;
IDirect3DRM2 *d3drm2;
@@ -6743,6 +6744,112 @@ static void test_animation(void)
IDirect3DRM_Release(d3drm1);
}
+static void test_wrap(void)
+{
+ IDirect3DRMWrap *wrap;
+ IDirect3DRM *d3drm1;
+ HRESULT hr;
+
+ hr = Direct3DRMCreate(&d3drm1);
+ ok(SUCCEEDED(hr), "Failed to create IDirect3DRM instance, hr %#x.\n", hr);
+
+ hr = IDirect3DRM_CreateObject(d3drm1, &CLSID_CDirect3DRMWrap, NULL, &IID_IDirect3DRMWrap, (void **)&wrap);
+ ok(SUCCEEDED(hr), "Failed to create wrap instance, hr %#x.\n", hr);
+
+ test_class_name((IDirect3DRMObject *)wrap, "");
+
+ IDirect3DRMWrap_Release(wrap);
+ IDirect3DRM_Release(d3drm1);
+}
+
+static void test_wrap_qi(void)
+{
+ static const struct qi_test tests[] =
+ {
+ { &IID_IDirect3DRMWrap, &IID_IUnknown, &IID_IDirect3DRMWrap, S_OK },
+ { &IID_IDirect3DRM, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMDevice, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMObject, &IID_IUnknown, &IID_IDirect3DRMWrap, S_OK },
+ { &IID_IDirect3DRMDevice2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMDevice3, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMViewport, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMViewport2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRM3, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRM2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMVisual, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMMesh, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMMeshBuilder, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMMeshBuilder2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMMeshBuilder3, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMFace, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMFace2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMLight, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMTexture, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMTexture2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMTexture3, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMMaterial, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMMaterial2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMAnimation, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMAnimation2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMAnimationSet, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMAnimationSet2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMObjectArray, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMDeviceArray, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMViewportArray, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMFrameArray, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMVisualArray, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMLightArray, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMPickedArray, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMFaceArray, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMAnimationArray, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMUserVisual, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMShadow, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMShadow2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMInterpolator, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMProgressiveMesh, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMPicked2Array, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DRMClippedVisual, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirectDrawClipper, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirectDrawSurface7, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirectDrawSurface4, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirectDrawSurface3, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirectDrawSurface2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirectDrawSurface, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DDevice7, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DDevice3, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DDevice2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DDevice, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3D7, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3D3, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3D2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3D, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirectDraw7, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirectDraw4, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirectDraw3, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirectDraw2, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirectDraw, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IDirect3DLight, NULL, NULL, CLASS_E_CLASSNOTAVAILABLE },
+ { &IID_IUnknown, &IID_IUnknown, NULL, S_OK },
+ };
+ IDirect3DRMWrap *wrap;
+ IDirect3DRM *d3drm1;
+ IUnknown *unknown;
+ HRESULT hr;
+
+ hr = Direct3DRMCreate(&d3drm1);
+ ok(SUCCEEDED(hr), "Failed to create d3drm instance, hr %#x.\n", hr);
+
+ hr = IDirect3DRM_CreateObject(d3drm1, &CLSID_CDirect3DRMWrap, NULL, &IID_IDirect3DRMWrap, (void **)&wrap);
+ ok(SUCCEEDED(hr), "Failed to create wrap instance, hr %#x.\n", hr);
+
+ hr = IDirect3DRMWrap_QueryInterface(wrap, &IID_IUnknown, (void **)&unknown);
+ ok(SUCCEEDED(hr), "Failed to get IUnknown from wrap (hr = %#x)\n", hr);
+ IDirect3DRMWrap_Release(wrap);
+ test_qi("wrap_qi", unknown, &IID_IUnknown, tests, sizeof(tests) / sizeof(*tests));
+ IUnknown_Release(unknown);
+
+ IDirect3DRM_Release(d3drm1);
+}
START_TEST(d3drm)
{
test_MeshBuilder();
@@ -6778,4 +6885,6 @@ START_TEST(d3drm)
test_viewport_clear2();
test_create_texture_from_surface();
test_animation();
+ test_wrap();
+ test_wrap_qi();
}
--
2.11.0
More information about the wine-patches
mailing list