Aaryaman Vasishta : d3drm: Implement IDirect3DRM*::CreateObject.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Apr 21 09:47:18 CDT 2016
Module: wine
Branch: master
Commit: c44d9dad3f76a62f7a85d8036c14989929639f5c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c44d9dad3f76a62f7a85d8036c14989929639f5c
Author: Aaryaman Vasishta <jem456.vasishta at gmail.com>
Date: Wed Apr 20 20:40:09 2016 +0530
d3drm: Implement IDirect3DRM*::CreateObject.
Signed-off-by: Aaryaman Vasishta <jem456.vasishta at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/d3drm/d3drm.c | 56 ++++++++++++++++++++++++++++++++++++++++++------
dlls/d3drm/tests/d3drm.c | 38 ++++++++++++++++++++------------
2 files changed, 74 insertions(+), 20 deletions(-)
diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c
index fe33315..edb46df 100644
--- a/dlls/d3drm/d3drm.c
+++ b/dlls/d3drm/d3drm.c
@@ -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,
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index a8f9c40..9f6eaab 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -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);
More information about the wine-cvs
mailing list