diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h index 5df83a75fea..5703560200b 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 4a1c18097df..16f0913963d 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 58de085f468..34c6fb4a6e1 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); - return 0; + TRACE("iface %p.\n", iface); + + 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); - return 0; + TRACE("iface %p\n", iface); + + 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;