[PATCH 1/2] d3drm: Implement IDirect3DRM*::CreateObject (v2).

Aaryaman Vasishta jem456.vasishta at gmail.com
Mon Apr 18 12:00:59 CDT 2016


Currently only works for IDirect3DRMTexture objects, but it can be easily extended for other objects as they're implemented.

Also modified tests to use todo's for unimplemented objects.

Signed-off-by: Aaryaman Vasishta <jem456.vasishta at gmail.com>
---
 dlls/d3drm/d3drm.c       | 56 ++++++++++++++++++++++++++++++++++++++++++------
 dlls/d3drm/tests/d3drm.c | 35 ++++++++++++++++++------------
 2 files changed, 71 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..2b0174d 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -1269,7 +1269,8 @@ static void test_destroy_callback(unsigned int test_idx, REFCLSID clsid, REFIID
     context.test_idx = test_idx;
     context.obj = obj;
 
-    hr = IDirect3DRMObject_AddDestroyCallback(obj, NULL, &context);
+    if ((hr = IDirect3DRMObject_AddDestroyCallback(obj, NULL, &context)) != D3DRMERR_BADVALUE)
+        return;
     ok(hr == D3DRMERR_BADVALUE, "Test %u: expected D3DRMERR_BADVALUE (hr = %x).\n", test_idx, hr);
 
     hr = IDirect3DRMObject_AddDestroyCallback(obj, destroy_callback, &context);
@@ -1353,18 +1354,19 @@ 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;
@@ -1382,17 +1384,22 @@ 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)
     {
         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);
         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);
         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);
-- 
2.3.2 (Apple Git-55)




More information about the wine-patches mailing list