[PATCH v2] d3drm: Implement SetAppData/GetAppData for a viewport

Nikolay Sivov nsivov at codeweavers.com
Tue Mar 1 10:45:29 CST 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---

v2: this time it's using shared structure every IDirect3DRMObject decendant can use

 dlls/d3drm/d3drm_private.h |  5 +++++
 dlls/d3drm/tests/d3drm.c   | 23 ++++++++++++++++++++++-
 dlls/d3drm/viewport.c      | 33 +++++++++++++++++++++------------
 3 files changed, 48 insertions(+), 13 deletions(-)

diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h
index 5df83a7..5703560 100644
--- a/dlls/d3drm/d3drm_private.h
+++ b/dlls/d3drm/d3drm_private.h
@@ -25,6 +25,11 @@
 #include "dxfile.h"
 
 struct d3drm_device;
+struct d3drm_object
+{
+    LONG ref;
+    DWORD appdata;
+};
 
 HRESULT d3drm_device_create(struct d3drm_device **out) DECLSPEC_HIDDEN;
 IDirect3DRMDevice *IDirect3DRMDevice_from_impl(struct d3drm_device *device) DECLSPEC_HIDDEN;
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 4a1c180..16f0913 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -1220,10 +1220,11 @@ static void test_Viewport(void)
     IDirect3DRMDevice *device;
     IDirect3DRMFrame *frame;
     IDirect3DRMViewport *viewport;
+    IDirect3DRMViewport2 *viewport2;
     GUID driver;
     HWND window;
     RECT rc;
-    DWORD size;
+    DWORD size, data;
     CHAR cname[64] = {0};
 
     window = CreateWindowA("static", "d3drm_test", WS_OVERLAPPEDWINDOW, 0, 0, 300, 200, 0, 0, 0, 0);
@@ -1261,6 +1262,26 @@ static void test_Viewport(void)
     ok(size == sizeof("Viewport"), "wrong size: %u\n", size);
     ok(!strcmp(cname, "Viewport"), "Expected cname to be \"Viewport\", but got \"%s\"\n", cname);
 
+    /* AppData */
+    hr = IDirect3DRMViewport_SetAppData(viewport, 0);
+    ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr);
+
+    hr = IDirect3DRMViewport_SetAppData(viewport, 0);
+    ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr);
+
+    hr = IDirect3DRMViewport_SetAppData(viewport, 1);
+    ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr);
+
+    hr = IDirect3DRMViewport_SetAppData(viewport, 1);
+    ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr);
+
+    hr = IDirect3DRMViewport_QueryInterface(viewport, &IID_IDirect3DRMViewport2, (void**)&viewport2);
+    ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr);
+
+    data = IDirect3DRMViewport2_GetAppData(viewport2);
+    ok(data == 1, "got %x\n", data);
+    IDirect3DRMViewport2_Release(viewport2);
+
     IDirect3DRMViewport_Release(viewport);
     IDirect3DRMFrame_Release(frame);
     IDirect3DRMDevice_Release(device);
diff --git a/dlls/d3drm/viewport.c b/dlls/d3drm/viewport.c
index 58de085..34c6fb4 100644
--- a/dlls/d3drm/viewport.c
+++ b/dlls/d3drm/viewport.c
@@ -31,9 +31,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
 
 struct d3drm_viewport
 {
+    struct d3drm_object obj;
     IDirect3DRMViewport IDirect3DRMViewport_iface;
     IDirect3DRMViewport2 IDirect3DRMViewport2_iface;
-    LONG ref;
     D3DVALUE back;
     D3DVALUE front;
     D3DVALUE field;
@@ -79,7 +79,7 @@ static HRESULT WINAPI d3drm_viewport1_QueryInterface(IDirect3DRMViewport *iface,
 static ULONG WINAPI d3drm_viewport1_AddRef(IDirect3DRMViewport *iface)
 {
     struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
-    ULONG refcount = InterlockedIncrement(&viewport->ref);
+    ULONG refcount = InterlockedIncrement(&viewport->obj.ref);
 
     TRACE("%p increasing refcount to %u.\n", iface, refcount);
 
@@ -89,7 +89,7 @@ static ULONG WINAPI d3drm_viewport1_AddRef(IDirect3DRMViewport *iface)
 static ULONG WINAPI d3drm_viewport1_Release(IDirect3DRMViewport *iface)
 {
     struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
-    ULONG refcount = InterlockedDecrement(&viewport->ref);
+    ULONG refcount = InterlockedDecrement(&viewport->obj.ref);
 
     TRACE("%p decreasing refcount to %u.\n", iface, refcount);
 
@@ -125,16 +125,20 @@ static HRESULT WINAPI d3drm_viewport1_DeleteDestroyCallback(IDirect3DRMViewport
 
 static HRESULT WINAPI d3drm_viewport1_SetAppData(IDirect3DRMViewport *iface, DWORD data)
 {
-    FIXME("iface %p, data %#x stub!\n", iface, data);
+    struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, data %#x\n", iface, data);
+
+    return IDirect3DRMViewport2_SetAppData(&viewport->IDirect3DRMViewport2_iface, data);
 }
 
 static DWORD WINAPI d3drm_viewport1_GetAppData(IDirect3DRMViewport *iface)
 {
-    FIXME("iface %p.\n", iface);
+    struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
+
+    TRACE("iface %p.\n", iface);
 
-    return 0;
+    return IDirect3DRMViewport2_GetAppData(&viewport->IDirect3DRMViewport2_iface);
 }
 
 static HRESULT WINAPI d3drm_viewport1_SetName(IDirect3DRMViewport *iface, const char *name)
@@ -478,16 +482,21 @@ static HRESULT WINAPI d3drm_viewport2_DeleteDestroyCallback(IDirect3DRMViewport2
 
 static HRESULT WINAPI d3drm_viewport2_SetAppData(IDirect3DRMViewport2 *iface, DWORD data)
 {
-    FIXME("iface %p, data %#x stub!\n", iface, data);
+    struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, data %#x\n", iface, data);
+
+    viewport->obj.appdata = data;
+    return S_OK;
 }
 
 static DWORD WINAPI d3drm_viewport2_GetAppData(IDirect3DRMViewport2 *iface)
 {
-    FIXME("iface %p stub!\n", iface);
+    struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface);
+
+    TRACE("iface %p\n", iface);
 
-    return 0;
+    return viewport->obj.appdata;
 }
 
 static HRESULT WINAPI d3drm_viewport2_SetName(IDirect3DRMViewport2 *iface, const char *name)
@@ -819,7 +828,7 @@ HRESULT Direct3DRMViewport_create(REFIID riid, IUnknown **out)
 
     object->IDirect3DRMViewport_iface.lpVtbl = &d3drm_viewport1_vtbl;
     object->IDirect3DRMViewport2_iface.lpVtbl = &d3drm_viewport2_vtbl;
-    object->ref = 1;
+    object->obj.ref = 1;
 
     if (IsEqualGUID(riid, &IID_IDirect3DRMViewport2))
         *out = (IUnknown *)&object->IDirect3DRMViewport2_iface;
-- 
2.7.0




More information about the wine-patches mailing list