d3drm: Added IDirect3DRMWrap stub.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2017-06-26 02:16:12 +03:00 committed by Alexandre Julliard
parent 4ee9bbc889
commit 5697821917
4 changed files with 355 additions and 10 deletions

View File

@ -175,6 +175,19 @@ static HRESULT d3drm_create_animation_object(void **object, IDirect3DRM *d3drm)
return hr; 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 struct d3drm
{ {
IDirect3DRM IDirect3DRM_iface; 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, D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
IDirect3DRMWrap **wrap) 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, " 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); 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, 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, D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
IDirect3DRMWrap **wrap) IDirect3DRMWrap **wrap)
{ {
FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, " struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
"ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
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); 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, 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_CDirect3DRMMaterial, d3drm_create_material_object},
{&CLSID_CDirect3DRMMesh, d3drm_create_mesh_object}, {&CLSID_CDirect3DRMMesh, d3drm_create_mesh_object},
{&CLSID_CDirect3DRMAnimation, d3drm_create_animation_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", 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, D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
IDirect3DRMWrap **wrap) 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, " 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); 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, static HRESULT WINAPI d3drm3_CreateUserVisual(IDirect3DRM3 *iface,

View File

@ -215,6 +215,12 @@ struct d3drm_animation
IDirect3DRM *d3drm; 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(struct d3drm_device **device, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
HRESULT d3drm_device_create_surfaces_from_clipper(struct d3drm_device *object, IDirectDraw *ddraw, 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_material_create(struct d3drm_material **material, IDirect3DRM *d3drm) DECLSPEC_HIDDEN;
HRESULT d3drm_mesh_create(struct d3drm_mesh **mesh, 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_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, HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *data,
D3DRMLOADTEXTURECALLBACK load_texture_proc, void *arg) DECLSPEC_HIDDEN; D3DRMLOADTEXTURECALLBACK load_texture_proc, void *arg) DECLSPEC_HIDDEN;

View File

@ -307,6 +307,11 @@ static inline struct d3drm_mesh_builder *impl_from_IDirect3DRMMeshBuilder3(IDire
return CONTAINING_RECORD(iface, struct d3drm_mesh_builder, IDirect3DRMMeshBuilder3_iface); 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) static void clean_mesh_builder_data(struct d3drm_mesh_builder *mesh_builder)
{ {
DWORD i; DWORD i;
@ -2878,3 +2883,187 @@ HRESULT d3drm_mesh_create(struct d3drm_mesh **mesh, IDirect3DRM *d3drm)
return S_OK; 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.\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;
}

View File

@ -96,8 +96,8 @@ static HWND create_window(void)
static void test_class_name_(unsigned int line, IDirect3DRMObject *object, const char *name) static void test_class_name_(unsigned int line, IDirect3DRMObject *object, const char *name)
{ {
char cname[64] = {0}; char cname[64] = {0};
DWORD size, size2;
HRESULT hr; HRESULT hr;
DWORD size;
hr = IDirect3DRMObject_GetClassName(object, NULL, cname); hr = IDirect3DRMObject_GetClassName(object, NULL, cname);
ok_(__FILE__, line)(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); 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)(hr == D3DRM_OK, "Failed to get classname size, hr %#x.\n", hr);
ok_(__FILE__, line)(size == strlen(name) + 1, "wrong size: %u\n", size); 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); hr = IDirect3DRMObject_GetClassName(object, &size, cname);
ok_(__FILE__, line)(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr); 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); size = sizeof(cname);
hr = IDirect3DRMObject_GetClassName(object, &size, cname); hr = IDirect3DRMObject_GetClassName(object, &size, cname);
@ -1490,6 +1490,7 @@ static void test_object(void)
{ &CLSID_CDirect3DRMMesh, &IID_IDirect3DRMMesh, TRUE }, { &CLSID_CDirect3DRMMesh, &IID_IDirect3DRMMesh, TRUE },
{ &CLSID_CDirect3DRMAnimation, &IID_IDirect3DRMAnimation, TRUE }, { &CLSID_CDirect3DRMAnimation, &IID_IDirect3DRMAnimation, TRUE },
{ &CLSID_CDirect3DRMAnimation, &IID_IDirect3DRMAnimation2, TRUE }, { &CLSID_CDirect3DRMAnimation, &IID_IDirect3DRMAnimation2, TRUE },
{ &CLSID_CDirect3DRMWrap, &IID_IDirect3DRMWrap },
}; };
IDirect3DRM *d3drm1; IDirect3DRM *d3drm1;
IDirect3DRM2 *d3drm2; IDirect3DRM2 *d3drm2;
@ -6743,6 +6744,112 @@ static void test_animation(void)
IDirect3DRM_Release(d3drm1); 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) START_TEST(d3drm)
{ {
test_MeshBuilder(); test_MeshBuilder();
@ -6778,4 +6885,6 @@ START_TEST(d3drm)
test_viewport_clear2(); test_viewport_clear2();
test_create_texture_from_surface(); test_create_texture_from_surface();
test_animation(); test_animation();
test_wrap();
test_wrap_qi();
} }