d3drm: Implement IDirect3DRM*::CreateObject.

Signed-off-by: Aaryaman Vasishta <jem456.vasishta@gmail.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Aaryaman Vasishta 2016-04-20 20:22:09 +05:30 committed by Alexandre Julliard
parent 816df88a77
commit c44d9dad3f
2 changed files with 74 additions and 20 deletions

View File

@ -139,10 +139,12 @@ static ULONG WINAPI d3drm1_Release(IDirect3DRM *iface)
static HRESULT WINAPI d3drm1_CreateObject(IDirect3DRM *iface,
REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
{
FIXME("iface %p, clsid %s, outer %p, iid %s, out %p stub!\n",
struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
return E_NOTIMPL;
return IDirect3DRM3_CreateObject(&d3drm->IDirect3DRM3_iface, clsid, outer, iid, out);
}
static HRESULT WINAPI d3drm1_CreateFrame(IDirect3DRM *iface,
@ -603,10 +605,12 @@ static ULONG WINAPI d3drm2_Release(IDirect3DRM2 *iface)
static HRESULT WINAPI d3drm2_CreateObject(IDirect3DRM2 *iface,
REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
{
FIXME("iface %p, clsid %s, outer %p, iid %s, out %p stub!\n",
struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
return E_NOTIMPL;
return IDirect3DRM3_CreateObject(&d3drm->IDirect3DRM3_iface, clsid, outer, iid, out);
}
static HRESULT WINAPI d3drm2_CreateFrame(IDirect3DRM2 *iface,
@ -1054,10 +1058,50 @@ static ULONG WINAPI d3drm3_Release(IDirect3DRM3 *iface)
static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
{
FIXME("iface %p, clsid %s, outer %p, iid %s, out %p stub!\n",
IUnknown *object;
HRESULT hr;
TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
return E_NOTIMPL;
if (!out)
return D3DRMERR_BADVALUE;
if (!clsid || !iid)
{
*out = NULL;
return D3DRMERR_BADVALUE;
}
if (outer)
{
FIXME("COM aggregation for outer IUnknown (%p) not implemented. Returning E_NOTIMPL.\n", outer);
*out = NULL;
return E_NOTIMPL;
}
if (IsEqualGUID(clsid, &CLSID_CDirect3DRMTexture))
{
struct d3drm_texture *texture;
if (FAILED(hr = d3drm_texture_create(&texture)))
{
*out = NULL;
return hr;
}
object = (IUnknown *)&texture->IDirect3DRMTexture3_iface;
}
else
{
FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid));
*out = NULL;
return CLASSFACTORY_E_FIRST;
}
if (FAILED(hr = IUnknown_QueryInterface(object, iid, out)))
*out = NULL;
IUnknown_Release(object);
return hr;
}
static HRESULT WINAPI d3drm3_CreateFrame(IDirect3DRM3 *iface,

View File

@ -1353,23 +1353,24 @@ static void test_object(void)
{
REFCLSID clsid;
REFIID iid;
BOOL todo;
}
tests[] =
{
{ &CLSID_CDirect3DRMDevice, &IID_IDirect3DRMDevice },
{ &CLSID_CDirect3DRMDevice, &IID_IDirect3DRMDevice2 },
{ &CLSID_CDirect3DRMDevice, &IID_IDirect3DRMDevice3 },
{ &CLSID_CDirect3DRMDevice, &IID_IDirect3DRMWinDevice },
{ &CLSID_CDirect3DRMTexture, &IID_IDirect3DRMTexture },
{ &CLSID_CDirect3DRMTexture, &IID_IDirect3DRMTexture2 },
{ &CLSID_CDirect3DRMTexture, &IID_IDirect3DRMTexture3 },
{ &CLSID_CDirect3DRMViewport, &IID_IDirect3DRMViewport },
{ &CLSID_CDirect3DRMViewport, &IID_IDirect3DRMViewport2 },
{ &CLSID_CDirect3DRMDevice, &IID_IDirect3DRMDevice, TRUE },
{ &CLSID_CDirect3DRMDevice, &IID_IDirect3DRMDevice2, TRUE },
{ &CLSID_CDirect3DRMDevice, &IID_IDirect3DRMDevice3, TRUE },
{ &CLSID_CDirect3DRMDevice, &IID_IDirect3DRMWinDevice, TRUE },
{ &CLSID_CDirect3DRMTexture, &IID_IDirect3DRMTexture, FALSE },
{ &CLSID_CDirect3DRMTexture, &IID_IDirect3DRMTexture2, FALSE },
{ &CLSID_CDirect3DRMTexture, &IID_IDirect3DRMTexture3, FALSE },
{ &CLSID_CDirect3DRMViewport, &IID_IDirect3DRMViewport, TRUE },
{ &CLSID_CDirect3DRMViewport, &IID_IDirect3DRMViewport2, TRUE },
};
IDirect3DRM *d3drm1;
IDirect3DRM2 *d3drm2;
IDirect3DRM3 *d3drm3;
IUnknown *unknown;
IUnknown *unknown = (IUnknown *)0xdeadbeef;
HRESULT hr;
ULONG ref1, ref2, ref3, ref4;
int i;
@ -1382,17 +1383,26 @@ static void test_object(void)
hr = IDirect3DRM_QueryInterface(d3drm1, &IID_IDirect3DRM3, (void **)&d3drm3);
ok(SUCCEEDED(hr), "Cannot get IDirect3DRM3 interface (hr = %#x).\n", hr);
hr = IDirect3DRM_CreateObject(d3drm1, &CLSID_DirectDraw, NULL, &IID_IDirectDraw, (void **)&unknown);
ok(hr == CLASSFACTORY_E_FIRST, "Expected hr == CLASSFACTORY_E_FIRST, got %#x.\n", hr);
ok(!unknown, "Expected object returned == NULL, got %p.\n", unknown);
for (i = 0; i < sizeof(tests) / sizeof(*tests); ++i)
{
unknown = (IUnknown *)0xdeadbeef;
hr = IDirect3DRM_CreateObject(d3drm1, NULL, NULL, tests[i].iid, (void **)&unknown);
todo_wine ok(hr == D3DRMERR_BADVALUE, "Test %u: expected hr == D3DRMERR_BADVALUE, got %#x.\n", i, hr);
ok(hr == D3DRMERR_BADVALUE, "Test %u: expected hr == D3DRMERR_BADVALUE, got %#x.\n", i, hr);
ok(!unknown, "Expected object returned == NULL, got %p.\n", unknown);
unknown = (IUnknown *)0xdeadbeef;
hr = IDirect3DRM_CreateObject(d3drm1, tests[i].clsid, NULL, NULL, (void **)&unknown);
todo_wine ok(hr == D3DRMERR_BADVALUE, "Test %u: expected hr == D3DRMERR_BADVALUE, got %#x.\n", i, hr);
ok(hr == D3DRMERR_BADVALUE, "Test %u: expected hr == D3DRMERR_BADVALUE, got %#x.\n", i, hr);
ok(!unknown, "Expected object returned == NULL, got %p.\n", unknown);
hr = IDirect3DRM_CreateObject(d3drm1, tests[i].clsid, NULL, NULL, NULL);
todo_wine ok(hr == D3DRMERR_BADVALUE, "Test %u: expected hr == D3DRMERR_BADVALUE, got %#x.\n", i, hr);
ok(hr == D3DRMERR_BADVALUE, "Test %u: expected hr == D3DRMERR_BADVALUE, got %#x.\n", i, hr);
hr = IDirect3DRM_CreateObject(d3drm1, tests[i].clsid, NULL, tests[i].iid, (void **)&unknown);
todo_wine ok(SUCCEEDED(hr), "Test %u: expected hr == D3DRM_OK, got %#x.\n", i, hr);
todo_wine_if(tests[i].todo)
ok(SUCCEEDED(hr), "Test %u: expected hr == D3DRM_OK, got %#x.\n", i, hr);
if (SUCCEEDED(hr))
{
ref2 = get_refcount((IUnknown *)d3drm1);