d3drm: Make d3drm_device_set_ddraw_device_d3d() static.
[wine.git] / dlls / d3drm / device.c
blobfb83342ba2fb904fbedbac0f2a49eae31c68fe2f
1 /*
2 * Implementation of IDirect3DRMDevice Interface
4 * Copyright 2011, 2012 André Hentschel
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "wine/debug.h"
23 #define COBJMACROS
25 #include "winbase.h"
26 #include "wingdi.h"
28 #include "d3drm_private.h"
29 #include "initguid.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
33 static inline struct d3drm_device *impl_from_IDirect3DRMDevice(IDirect3DRMDevice *iface)
35 return CONTAINING_RECORD(iface, struct d3drm_device, IDirect3DRMDevice_iface);
38 static inline struct d3drm_device *impl_from_IDirect3DRMDevice2(IDirect3DRMDevice2 *iface)
40 return CONTAINING_RECORD(iface, struct d3drm_device, IDirect3DRMDevice2_iface);
43 static inline struct d3drm_device *impl_from_IDirect3DRMDevice3(IDirect3DRMDevice3 *iface)
45 return CONTAINING_RECORD(iface, struct d3drm_device, IDirect3DRMDevice3_iface);
48 void d3drm_device_destroy(struct d3drm_device *device)
50 d3drm_object_cleanup((IDirect3DRMObject *)&device->IDirect3DRMDevice_iface, &device->obj);
51 if (device->device)
53 TRACE("Releasing attached ddraw interfaces.\n");
54 IDirect3DDevice_Release(device->device);
56 if (device->render_target)
57 IDirectDrawSurface_Release(device->render_target);
58 if (device->primary_surface)
60 TRACE("Releasing primary surface and attached clipper.\n");
61 IDirectDrawSurface_Release(device->primary_surface);
62 IDirectDrawClipper_Release(device->clipper);
64 if (device->ddraw)
66 IDirectDraw_Release(device->ddraw);
67 IDirect3DRM_Release(device->d3drm);
69 HeapFree(GetProcessHeap(), 0, device);
72 static inline struct d3drm_device *impl_from_IDirect3DRMWinDevice(IDirect3DRMWinDevice *iface)
74 return CONTAINING_RECORD(iface, struct d3drm_device, IDirect3DRMWinDevice_iface);
77 HRESULT d3drm_device_create_surfaces_from_clipper(struct d3drm_device *object, IDirectDraw *ddraw, IDirectDrawClipper *clipper, int width, int height, IDirectDrawSurface **surface)
79 DDSURFACEDESC surface_desc;
80 IDirectDrawSurface *primary_surface, *render_target;
81 HWND window;
82 HRESULT hr;
84 hr = IDirectDrawClipper_GetHWnd(clipper, &window);
85 if (FAILED(hr))
86 return hr;
88 hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
89 if (FAILED(hr))
90 return hr;
92 memset(&surface_desc, 0, sizeof(surface_desc));
93 surface_desc.dwSize = sizeof(surface_desc);
94 surface_desc.dwFlags = DDSD_CAPS;
95 surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
96 hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &primary_surface, NULL);
97 if (FAILED(hr))
98 return hr;
99 hr = IDirectDrawSurface_SetClipper(primary_surface, clipper);
100 if (FAILED(hr))
102 IDirectDrawSurface_Release(primary_surface);
103 return hr;
106 memset(&surface_desc, 0, sizeof(surface_desc));
107 surface_desc.dwSize = sizeof(surface_desc);
108 surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
109 surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;
110 surface_desc.dwWidth = width;
111 surface_desc.dwHeight = height;
113 hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &render_target, NULL);
114 if (FAILED(hr))
116 IDirectDrawSurface_Release(primary_surface);
117 return hr;
120 object->primary_surface = primary_surface;
121 object->clipper = clipper;
122 IDirectDrawClipper_AddRef(clipper);
123 *surface = render_target;
125 return D3DRM_OK;
128 HRESULT d3drm_device_init(struct d3drm_device *device, UINT version, IDirectDraw *ddraw, IDirectDrawSurface *surface,
129 BOOL create_z_surface)
131 DDSCAPS caps = { DDSCAPS_ZBUFFER };
132 IDirectDrawSurface *ds = NULL;
133 IDirect3DDevice *device1 = NULL;
134 IDirect3DDevice2 *device2 = NULL;
135 IDirect3D2 *d3d2 = NULL;
136 DDSURFACEDESC desc, surface_desc;
137 HRESULT hr;
139 device->ddraw = ddraw;
140 IDirectDraw_AddRef(ddraw);
141 IDirect3DRM_AddRef(device->d3drm);
142 device->render_target = surface;
143 IDirectDrawSurface_AddRef(surface);
145 desc.dwSize = sizeof(desc);
146 hr = IDirectDrawSurface_GetSurfaceDesc(surface, &desc);
147 if (FAILED(hr))
148 return hr;
150 if (!(desc.ddsCaps.dwCaps & DDSCAPS_3DDEVICE))
151 return DDERR_INVALIDCAPS;
153 hr = IDirectDrawSurface_GetAttachedSurface(surface, &caps, &ds);
154 if (SUCCEEDED(hr))
156 create_z_surface = FALSE;
157 IDirectDrawSurface_Release(ds);
158 ds = NULL;
161 if (create_z_surface)
163 memset(&surface_desc, 0, sizeof(surface_desc));
164 surface_desc.dwSize = sizeof(surface_desc);
165 surface_desc.dwFlags = DDSD_CAPS | DDSD_ZBUFFERBITDEPTH | DDSD_WIDTH | DDSD_HEIGHT;
166 surface_desc.ddsCaps.dwCaps = DDSCAPS_ZBUFFER;
167 surface_desc.dwZBufferBitDepth = 16;
168 surface_desc.dwWidth = desc.dwWidth;
169 surface_desc.dwHeight = desc.dwHeight;
170 hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &ds, NULL);
171 if (FAILED(hr))
172 return hr;
174 hr = IDirectDrawSurface_AddAttachedSurface(surface, ds);
175 IDirectDrawSurface_Release(ds);
176 if (FAILED(hr))
177 return hr;
180 if (version == 1)
181 hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirect3DRGBDevice, (void **)&device1);
182 else
184 IDirectDraw_QueryInterface(ddraw, &IID_IDirect3D2, (void**)&d3d2);
185 hr = IDirect3D2_CreateDevice(d3d2, &IID_IDirect3DRGBDevice, surface, &device2);
186 IDirect3D2_Release(d3d2);
188 if (FAILED(hr))
190 IDirectDrawSurface_DeleteAttachedSurface(surface, 0, ds);
191 return hr;
194 if (version != 1)
196 hr = IDirect3DDevice2_QueryInterface(device2, &IID_IDirect3DDevice, (void**)&device1);
197 IDirect3DDevice2_Release(device2);
198 if (FAILED(hr))
200 IDirectDrawSurface_DeleteAttachedSurface(surface, 0, ds);
201 return hr;
204 device->device = device1;
205 device->width = desc.dwWidth;
206 device->height = desc.dwHeight;
208 return hr;
211 static HRESULT d3drm_device_set_ddraw_device_d3d(struct d3drm_device *device, IDirect3D *d3d, IDirect3DDevice *d3d_device)
213 IDirectDraw *ddraw;
214 IDirectDrawSurface *surface;
215 IDirect3DDevice2 *d3d_device2;
216 DDSURFACEDESC desc;
217 HRESULT hr;
219 /* AddRef these interfaces beforehand for the intentional leak on reinitialization. */
220 if (FAILED(hr = IDirect3D_QueryInterface(d3d, &IID_IDirectDraw, (void **)&ddraw)))
221 return hr;
222 IDirect3DRM_AddRef(device->d3drm);
223 IDirect3DDevice_AddRef(d3d_device);
225 if (device->ddraw)
226 return D3DRMERR_BADOBJECT;
228 /* Fetch render target and get width/height from there */
229 if (FAILED(hr = IDirect3DDevice_QueryInterface(d3d_device, &IID_IDirectDrawSurface, (void **)&surface)))
231 if (FAILED(hr = IDirect3DDevice_QueryInterface(d3d_device, &IID_IDirect3DDevice2, (void **)&d3d_device2)))
232 return hr;
233 hr = IDirect3DDevice2_GetRenderTarget(d3d_device2, &surface);
234 IDirect3DDevice2_Release(d3d_device2);
235 if (FAILED(hr))
236 return hr;
239 desc.dwSize = sizeof(desc);
240 hr = IDirectDrawSurface_GetSurfaceDesc(surface, &desc);
241 IDirectDrawSurface_Release(surface);
242 if (FAILED(hr))
243 return hr;
245 device->ddraw = ddraw;
246 device->width = desc.dwWidth;
247 device->height = desc.dwHeight;
248 device->device = d3d_device;
250 return hr;
253 static HRESULT WINAPI d3drm_device3_QueryInterface(IDirect3DRMDevice3 *iface, REFIID riid, void **out)
255 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
257 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
259 if (IsEqualGUID(riid, &IID_IDirect3DRMDevice)
260 || IsEqualGUID(riid, &IID_IDirect3DRMObject)
261 || IsEqualGUID(riid, &IID_IUnknown))
263 *out = &device->IDirect3DRMDevice_iface;
265 else if (IsEqualGUID(riid, &IID_IDirect3DRMDevice2))
267 *out = &device->IDirect3DRMDevice2_iface;
269 else if (IsEqualGUID(riid, &IID_IDirect3DRMDevice3))
271 *out = &device->IDirect3DRMDevice3_iface;
273 else if (IsEqualGUID(riid, &IID_IDirect3DRMWinDevice))
275 *out = &device->IDirect3DRMWinDevice_iface;
277 else
279 *out = NULL;
280 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid));
281 return CLASS_E_CLASSNOTAVAILABLE;
284 IUnknown_AddRef((IUnknown *)*out);
285 return S_OK;
288 static HRESULT WINAPI d3drm_device2_QueryInterface(IDirect3DRMDevice2 *iface, REFIID riid, void **out)
290 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
292 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
294 return d3drm_device3_QueryInterface(&device->IDirect3DRMDevice3_iface, riid, out);
297 static HRESULT WINAPI d3drm_device1_QueryInterface(IDirect3DRMDevice *iface, REFIID riid, void **out)
299 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
301 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
303 return d3drm_device3_QueryInterface(&device->IDirect3DRMDevice3_iface, riid, out);
306 static ULONG WINAPI d3drm_device3_AddRef(IDirect3DRMDevice3 *iface)
308 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
309 ULONG refcount = InterlockedIncrement(&device->obj.ref);
311 TRACE("%p increasing refcount to %u.\n", iface, refcount);
313 return refcount;
316 static ULONG WINAPI d3drm_device2_AddRef(IDirect3DRMDevice2 *iface)
318 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
320 TRACE("iface %p.\n", iface);
322 return d3drm_device3_AddRef(&device->IDirect3DRMDevice3_iface);
325 static ULONG WINAPI d3drm_device1_AddRef(IDirect3DRMDevice *iface)
327 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
329 TRACE("iface %p.\n", iface);
331 return d3drm_device3_AddRef(&device->IDirect3DRMDevice3_iface);
334 static ULONG WINAPI d3drm_device3_Release(IDirect3DRMDevice3 *iface)
336 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
337 ULONG refcount = InterlockedDecrement(&device->obj.ref);
339 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
341 if (!refcount)
342 d3drm_device_destroy(device);
344 return refcount;
347 static ULONG WINAPI d3drm_device2_Release(IDirect3DRMDevice2 *iface)
349 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
351 TRACE("iface %p.\n", iface);
353 return d3drm_device3_Release(&device->IDirect3DRMDevice3_iface);
356 static ULONG WINAPI d3drm_device1_Release(IDirect3DRMDevice *iface)
358 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
360 TRACE("iface %p.\n", iface);
362 return d3drm_device3_Release(&device->IDirect3DRMDevice3_iface);
365 static HRESULT WINAPI d3drm_device3_Clone(IDirect3DRMDevice3 *iface,
366 IUnknown *outer, REFIID iid, void **out)
368 FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out);
370 return E_NOTIMPL;
373 static HRESULT WINAPI d3drm_device2_Clone(IDirect3DRMDevice2 *iface,
374 IUnknown *outer, REFIID iid, void **out)
376 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
378 TRACE("iface %p, outer %p, iid %s, out %p\n", iface, outer, debugstr_guid(iid), out);
380 return d3drm_device3_Clone(&device->IDirect3DRMDevice3_iface, outer, iid, out);
383 static HRESULT WINAPI d3drm_device1_Clone(IDirect3DRMDevice *iface,
384 IUnknown *outer, REFIID iid, void **out)
386 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
388 TRACE("iface %p, outer %p, iid %s, out %p.\n", iface, outer, debugstr_guid(iid), out);
390 return d3drm_device3_Clone(&device->IDirect3DRMDevice3_iface, outer, iid, out);
393 static HRESULT WINAPI d3drm_device3_AddDestroyCallback(IDirect3DRMDevice3 *iface,
394 D3DRMOBJECTCALLBACK cb, void *ctx)
396 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
398 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
400 return d3drm_object_add_destroy_callback(&device->obj, cb, ctx);
403 static HRESULT WINAPI d3drm_device2_AddDestroyCallback(IDirect3DRMDevice2 *iface,
404 D3DRMOBJECTCALLBACK cb, void *ctx)
406 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
408 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
410 return d3drm_device3_AddDestroyCallback(&device->IDirect3DRMDevice3_iface, cb, ctx);
413 static HRESULT WINAPI d3drm_device1_AddDestroyCallback(IDirect3DRMDevice *iface,
414 D3DRMOBJECTCALLBACK cb, void *ctx)
416 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
418 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
420 return d3drm_device3_AddDestroyCallback(&device->IDirect3DRMDevice3_iface, cb, ctx);
423 static HRESULT WINAPI d3drm_device3_DeleteDestroyCallback(IDirect3DRMDevice3 *iface,
424 D3DRMOBJECTCALLBACK cb, void *ctx)
426 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
428 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
430 return d3drm_object_delete_destroy_callback(&device->obj, cb, ctx);
433 static HRESULT WINAPI d3drm_device2_DeleteDestroyCallback(IDirect3DRMDevice2 *iface,
434 D3DRMOBJECTCALLBACK cb, void *ctx)
436 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
438 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
440 return d3drm_device3_DeleteDestroyCallback(&device->IDirect3DRMDevice3_iface, cb, ctx);
443 static HRESULT WINAPI d3drm_device1_DeleteDestroyCallback(IDirect3DRMDevice *iface,
444 D3DRMOBJECTCALLBACK cb, void *ctx)
446 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
448 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
450 return d3drm_device3_DeleteDestroyCallback(&device->IDirect3DRMDevice3_iface, cb, ctx);
453 static HRESULT WINAPI d3drm_device3_SetAppData(IDirect3DRMDevice3 *iface, DWORD data)
455 FIXME("iface %p, data %#x stub!\n", iface, data);
457 return E_NOTIMPL;
460 static HRESULT WINAPI d3drm_device2_SetAppData(IDirect3DRMDevice2 *iface, DWORD data)
462 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
464 TRACE("iface %p, data %#x.\n", iface, data);
466 return d3drm_device3_SetAppData(&device->IDirect3DRMDevice3_iface, data);
469 static HRESULT WINAPI d3drm_device1_SetAppData(IDirect3DRMDevice *iface, DWORD data)
471 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
473 TRACE("iface %p, data %#x.\n", iface, data);
475 return d3drm_device3_SetAppData(&device->IDirect3DRMDevice3_iface, data);
478 static DWORD WINAPI d3drm_device3_GetAppData(IDirect3DRMDevice3 *iface)
480 FIXME("iface %p stub!\n", iface);
482 return 0;
485 static DWORD WINAPI d3drm_device2_GetAppData(IDirect3DRMDevice2 *iface)
487 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
489 TRACE("iface %p.\n", iface);
491 return d3drm_device3_GetAppData(&device->IDirect3DRMDevice3_iface);
494 static DWORD WINAPI d3drm_device1_GetAppData(IDirect3DRMDevice *iface)
496 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
498 TRACE("iface %p.\n", iface);
500 return d3drm_device3_GetAppData(&device->IDirect3DRMDevice3_iface);
503 static HRESULT WINAPI d3drm_device3_SetName(IDirect3DRMDevice3 *iface, const char *name)
505 FIXME("iface %p, name %s stub!\n", iface, debugstr_a(name));
507 return E_NOTIMPL;
510 static HRESULT WINAPI d3drm_device2_SetName(IDirect3DRMDevice2 *iface, const char *name)
512 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
514 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
516 return d3drm_device3_SetName(&device->IDirect3DRMDevice3_iface, name);
519 static HRESULT WINAPI d3drm_device1_SetName(IDirect3DRMDevice *iface, const char *name)
521 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
523 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
525 return d3drm_device3_SetName(&device->IDirect3DRMDevice3_iface, name);
528 static HRESULT WINAPI d3drm_device3_GetName(IDirect3DRMDevice3 *iface, DWORD *size, char *name)
530 FIXME("iface %p, size %p, name %p stub!\n", iface, size, name);
532 return E_NOTIMPL;
535 static HRESULT WINAPI d3drm_device2_GetName(IDirect3DRMDevice2 *iface, DWORD *size, char *name)
537 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
539 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
541 return d3drm_device3_GetName(&device->IDirect3DRMDevice3_iface, size, name);
544 static HRESULT WINAPI d3drm_device1_GetName(IDirect3DRMDevice *iface, DWORD *size, char *name)
546 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
548 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
550 return d3drm_device3_GetName(&device->IDirect3DRMDevice3_iface, size, name);
553 static HRESULT WINAPI d3drm_device3_GetClassName(IDirect3DRMDevice3 *iface, DWORD *size, char *name)
555 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
557 if (!size || *size < strlen("Device") || !name)
558 return E_INVALIDARG;
560 strcpy(name, "Device");
561 *size = sizeof("Device");
563 return D3DRM_OK;
566 static HRESULT WINAPI d3drm_device2_GetClassName(IDirect3DRMDevice2 *iface, DWORD *size, char *name)
568 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
570 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
572 return d3drm_device3_GetClassName(&device->IDirect3DRMDevice3_iface, size, name);
575 static HRESULT WINAPI d3drm_device1_GetClassName(IDirect3DRMDevice *iface, DWORD *size, char *name)
577 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
579 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
581 return d3drm_device3_GetClassName(&device->IDirect3DRMDevice3_iface, size, name);
584 static HRESULT WINAPI d3drm_device3_Init(IDirect3DRMDevice3 *iface, ULONG width, ULONG height)
586 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
588 FIXME("iface %p, width %u, height %u stub!\n", iface, width, height);
590 device->height = height;
591 device->width = width;
593 return D3DRM_OK;
596 static HRESULT WINAPI d3drm_device2_Init(IDirect3DRMDevice2 *iface, ULONG width, ULONG height)
598 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
600 TRACE("iface %p, width %u, height %u.\n", iface, width, height);
602 return d3drm_device3_Init(&device->IDirect3DRMDevice3_iface, width, height);
605 static HRESULT WINAPI d3drm_device1_Init(IDirect3DRMDevice *iface, ULONG width, ULONG height)
607 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
609 TRACE("iface %p, width %u, height %u.\n", iface, width, height);
611 return d3drm_device3_Init(&device->IDirect3DRMDevice3_iface, width, height);
614 static HRESULT WINAPI d3drm_device3_InitFromD3D(IDirect3DRMDevice3 *iface,
615 IDirect3D *d3d, IDirect3DDevice *d3d_device)
617 FIXME("iface %p, d3d %p, d3d_device %p stub!\n", iface, d3d, d3d_device);
619 if (!d3d || !d3d_device)
620 return D3DRMERR_BADVALUE;
622 return E_NOINTERFACE;
625 static HRESULT WINAPI d3drm_device2_InitFromD3D(IDirect3DRMDevice2 *iface,
626 IDirect3D *d3d, IDirect3DDevice *d3d_device)
628 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
630 TRACE("iface %p, d3d %p, d3d_device %p.\n", iface, d3d, d3d_device);
632 return d3drm_device3_InitFromD3D(&device->IDirect3DRMDevice3_iface, d3d, d3d_device);
635 static HRESULT WINAPI d3drm_device1_InitFromD3D(IDirect3DRMDevice *iface,
636 IDirect3D *d3d, IDirect3DDevice *d3d_device)
638 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
640 TRACE("iface %p, d3d %p, d3d_device %p.\n", iface, d3d, d3d_device);
642 if (!d3d || !d3d_device)
643 return D3DRMERR_BADVALUE;
645 return d3drm_device_set_ddraw_device_d3d(device, d3d, d3d_device);
648 static HRESULT WINAPI d3drm_device3_InitFromClipper(IDirect3DRMDevice3 *iface,
649 IDirectDrawClipper *clipper, GUID *guid, int width, int height)
651 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
653 FIXME("iface %p, clipper %p, guid %s, width %d, height %d stub!\n",
654 iface, clipper, debugstr_guid(guid), width, height);
656 device->height = height;
657 device->width = width;
659 return D3DRM_OK;
662 static HRESULT WINAPI d3drm_device2_InitFromClipper(IDirect3DRMDevice2 *iface,
663 IDirectDrawClipper *clipper, GUID *guid, int width, int height)
665 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
667 TRACE("iface %p, clipper %p, guid %s, width %d, height %d.\n",
668 iface, clipper, debugstr_guid(guid), width, height);
670 return d3drm_device3_InitFromClipper(&device->IDirect3DRMDevice3_iface,
671 clipper, guid, width, height);
674 static HRESULT WINAPI d3drm_device1_InitFromClipper(IDirect3DRMDevice *iface,
675 IDirectDrawClipper *clipper, GUID *guid, int width, int height)
677 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
679 TRACE("iface %p, clipper %p, guid %s, width %d, height %d.\n",
680 iface, clipper, debugstr_guid(guid), width, height);
682 return d3drm_device3_InitFromClipper(&device->IDirect3DRMDevice3_iface,
683 clipper, guid, width, height);
686 static HRESULT WINAPI d3drm_device3_Update(IDirect3DRMDevice3 *iface)
688 FIXME("iface %p stub!\n", iface);
690 return D3DRM_OK;
693 static HRESULT WINAPI d3drm_device2_Update(IDirect3DRMDevice2 *iface)
695 FIXME("iface %p stub!\n", iface);
697 return D3DRM_OK;
700 static HRESULT WINAPI d3drm_device1_Update(IDirect3DRMDevice *iface)
702 FIXME("iface %p stub!\n", iface);
704 return D3DRM_OK;
707 static HRESULT WINAPI d3drm_device3_AddUpdateCallback(IDirect3DRMDevice3 *iface,
708 D3DRMUPDATECALLBACK cb, void *ctx)
710 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
712 return E_NOTIMPL;
715 static HRESULT WINAPI d3drm_device2_AddUpdateCallback(IDirect3DRMDevice2 *iface,
716 D3DRMUPDATECALLBACK cb, void *ctx)
718 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
720 return E_NOTIMPL;
723 static HRESULT WINAPI d3drm_device1_AddUpdateCallback(IDirect3DRMDevice *iface,
724 D3DRMUPDATECALLBACK cb, void *ctx)
726 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
728 return E_NOTIMPL;
731 static HRESULT WINAPI d3drm_device3_DeleteUpdateCallback(IDirect3DRMDevice3 *iface,
732 D3DRMUPDATECALLBACK cb, void *ctx)
734 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
736 return E_NOTIMPL;
739 static HRESULT WINAPI d3drm_device2_DeleteUpdateCallback(IDirect3DRMDevice2 *iface,
740 D3DRMUPDATECALLBACK cb, void *ctx)
742 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
744 return E_NOTIMPL;
747 static HRESULT WINAPI d3drm_device1_DeleteUpdateCallback(IDirect3DRMDevice *iface,
748 D3DRMUPDATECALLBACK cb, void *ctx)
750 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
752 return E_NOTIMPL;
755 static HRESULT WINAPI d3drm_device3_SetBufferCount(IDirect3DRMDevice3 *iface, DWORD count)
757 FIXME("iface %p, count %u stub!\n", iface, count);
759 return E_NOTIMPL;
762 static HRESULT WINAPI d3drm_device2_SetBufferCount(IDirect3DRMDevice2 *iface, DWORD count)
764 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
766 TRACE("iface %p, count %u.\n", iface, count);
768 return d3drm_device3_SetBufferCount(&device->IDirect3DRMDevice3_iface, count);
771 static HRESULT WINAPI d3drm_device1_SetBufferCount(IDirect3DRMDevice *iface, DWORD count)
773 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
775 TRACE("iface %p, count %u.\n", iface, count);
777 return d3drm_device3_SetBufferCount(&device->IDirect3DRMDevice3_iface, count);
780 static DWORD WINAPI d3drm_device3_GetBufferCount(IDirect3DRMDevice3 *iface)
782 FIXME("iface %p stub!\n", iface);
784 return E_NOTIMPL;
787 static DWORD WINAPI d3drm_device2_GetBufferCount(IDirect3DRMDevice2 *iface)
789 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
791 TRACE("iface %p.\n", iface);
793 return d3drm_device3_GetBufferCount(&device->IDirect3DRMDevice3_iface);
796 static DWORD WINAPI d3drm_device1_GetBufferCount(IDirect3DRMDevice *iface)
798 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
800 TRACE("iface %p.\n", iface);
802 return d3drm_device3_GetBufferCount(&device->IDirect3DRMDevice3_iface);
805 static HRESULT WINAPI d3drm_device3_SetDither(IDirect3DRMDevice3 *iface, BOOL enable)
807 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
809 TRACE("iface %p, enable %#x.\n", iface, enable);
811 device->dither = enable;
813 return D3DRM_OK;
816 static HRESULT WINAPI d3drm_device2_SetDither(IDirect3DRMDevice2 *iface, BOOL enable)
818 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
820 TRACE("iface %p, enabled %#x.\n", iface, enable);
822 return d3drm_device3_SetDither(&device->IDirect3DRMDevice3_iface, enable);
825 static HRESULT WINAPI d3drm_device1_SetDither(IDirect3DRMDevice *iface, BOOL enable)
827 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
829 TRACE("iface %p, enabled %#x.\n", iface, enable);
831 return d3drm_device3_SetDither(&device->IDirect3DRMDevice3_iface, enable);
834 static HRESULT WINAPI d3drm_device3_SetShades(IDirect3DRMDevice3 *iface, DWORD count)
836 FIXME("iface %p, count %u stub!\n", iface, count);
838 return E_NOTIMPL;
841 static HRESULT WINAPI d3drm_device2_SetShades(IDirect3DRMDevice2 *iface, DWORD count)
843 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
845 TRACE("iface %p, count %u.\n", iface, count);
847 return d3drm_device3_SetShades(&device->IDirect3DRMDevice3_iface, count);
850 static HRESULT WINAPI d3drm_device1_SetShades(IDirect3DRMDevice *iface, DWORD count)
852 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
854 TRACE("iface %p, count %u.\n", iface, count);
856 return d3drm_device3_SetShades(&device->IDirect3DRMDevice3_iface, count);
859 static HRESULT WINAPI d3drm_device3_SetQuality(IDirect3DRMDevice3 *iface, D3DRMRENDERQUALITY quality)
861 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
863 TRACE("iface %p, quality %u.\n", iface, quality);
865 device->quality = quality;
867 return D3DRM_OK;
870 static HRESULT WINAPI d3drm_device2_SetQuality(IDirect3DRMDevice2 *iface, D3DRMRENDERQUALITY quality)
872 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
874 TRACE("iface %p, quality %u.\n", iface, quality);
876 return d3drm_device3_SetQuality(&device->IDirect3DRMDevice3_iface, quality);
879 static HRESULT WINAPI d3drm_device1_SetQuality(IDirect3DRMDevice *iface, D3DRMRENDERQUALITY quality)
881 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
883 TRACE("iface %p, quality %u.\n", iface, quality);
885 return d3drm_device3_SetQuality(&device->IDirect3DRMDevice3_iface, quality);
888 static HRESULT WINAPI d3drm_device3_SetTextureQuality(IDirect3DRMDevice3 *iface, D3DRMTEXTUREQUALITY quality)
890 FIXME("iface %p, quality %u stub!\n", iface, quality);
892 return E_NOTIMPL;
895 static HRESULT WINAPI d3drm_device2_SetTextureQuality(IDirect3DRMDevice2 *iface, D3DRMTEXTUREQUALITY quality)
897 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
899 TRACE("iface %p, quality %u.\n", iface, quality);
901 return d3drm_device3_SetTextureQuality(&device->IDirect3DRMDevice3_iface, quality);
904 static HRESULT WINAPI d3drm_device1_SetTextureQuality(IDirect3DRMDevice *iface, D3DRMTEXTUREQUALITY quality)
906 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
908 TRACE("iface %p, quality %u.\n", iface, quality);
910 return d3drm_device3_SetTextureQuality(&device->IDirect3DRMDevice3_iface, quality);
913 static HRESULT WINAPI d3drm_device3_GetViewports(IDirect3DRMDevice3 *iface, IDirect3DRMViewportArray **array)
915 FIXME("iface %p, array %p stub!\n", iface, array);
917 return E_NOTIMPL;
920 static HRESULT WINAPI d3drm_device2_GetViewports(IDirect3DRMDevice2 *iface, IDirect3DRMViewportArray **array)
922 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
924 TRACE("iface %p, array %p.\n", iface, array);
926 return d3drm_device3_GetViewports(&device->IDirect3DRMDevice3_iface, array);
929 static HRESULT WINAPI d3drm_device1_GetViewports(IDirect3DRMDevice *iface, IDirect3DRMViewportArray **array)
931 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
933 TRACE("iface %p, array %p.\n", iface, array);
935 return d3drm_device3_GetViewports(&device->IDirect3DRMDevice3_iface, array);
938 static BOOL WINAPI d3drm_device3_GetDither(IDirect3DRMDevice3 *iface)
940 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
942 TRACE("iface %p.\n", iface);
944 return device->dither;
947 static BOOL WINAPI d3drm_device2_GetDither(IDirect3DRMDevice2 *iface)
949 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
951 TRACE("iface %p.\n", iface);
953 return d3drm_device3_GetDither(&device->IDirect3DRMDevice3_iface);
956 static BOOL WINAPI d3drm_device1_GetDither(IDirect3DRMDevice *iface)
958 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
960 TRACE("iface %p.\n", iface);
962 return d3drm_device3_GetDither(&device->IDirect3DRMDevice3_iface);
965 static DWORD WINAPI d3drm_device3_GetShades(IDirect3DRMDevice3 *iface)
967 FIXME("iface %p stub!\n", iface);
969 return E_NOTIMPL;
972 static DWORD WINAPI d3drm_device2_GetShades(IDirect3DRMDevice2 *iface)
974 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
976 TRACE("iface %p.\n", iface);
978 return d3drm_device3_GetShades(&device->IDirect3DRMDevice3_iface);
981 static DWORD WINAPI d3drm_device1_GetShades(IDirect3DRMDevice *iface)
983 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
985 TRACE("iface %p.\n", iface);
987 return d3drm_device3_GetShades(&device->IDirect3DRMDevice3_iface);
990 static DWORD WINAPI d3drm_device3_GetHeight(IDirect3DRMDevice3 *iface)
992 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
994 TRACE("iface %p.\n", iface);
996 return device->height;
999 static DWORD WINAPI d3drm_device2_GetHeight(IDirect3DRMDevice2 *iface)
1001 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1003 TRACE("iface %p.\n", iface);
1005 return d3drm_device3_GetHeight(&device->IDirect3DRMDevice3_iface);
1008 static DWORD WINAPI d3drm_device1_GetHeight(IDirect3DRMDevice *iface)
1010 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
1012 TRACE("iface %p.\n", iface);
1014 return d3drm_device3_GetHeight(&device->IDirect3DRMDevice3_iface);
1017 static DWORD WINAPI d3drm_device3_GetWidth(IDirect3DRMDevice3 *iface)
1019 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
1021 TRACE("iface %p.\n", iface);
1023 return device->width;
1026 static DWORD WINAPI d3drm_device2_GetWidth(IDirect3DRMDevice2 *iface)
1028 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1030 TRACE("iface %p.\n", iface);
1032 return d3drm_device3_GetWidth(&device->IDirect3DRMDevice3_iface);
1035 static DWORD WINAPI d3drm_device1_GetWidth(IDirect3DRMDevice *iface)
1037 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
1039 TRACE("iface %p.\n", iface);
1041 return d3drm_device3_GetWidth(&device->IDirect3DRMDevice3_iface);
1044 static DWORD WINAPI d3drm_device3_GetTrianglesDrawn(IDirect3DRMDevice3 *iface)
1046 FIXME("iface %p stub!\n", iface);
1048 return E_NOTIMPL;
1051 static DWORD WINAPI d3drm_device2_GetTrianglesDrawn(IDirect3DRMDevice2 *iface)
1053 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1055 TRACE("iface %p.\n", iface);
1057 return d3drm_device3_GetTrianglesDrawn(&device->IDirect3DRMDevice3_iface);
1060 static DWORD WINAPI d3drm_device1_GetTrianglesDrawn(IDirect3DRMDevice *iface)
1062 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
1064 TRACE("iface %p.\n", iface);
1066 return d3drm_device3_GetTrianglesDrawn(&device->IDirect3DRMDevice3_iface);
1069 static DWORD WINAPI d3drm_device3_GetWireframeOptions(IDirect3DRMDevice3 *iface)
1071 FIXME("iface %p stub!\n", iface);
1073 return E_NOTIMPL;
1076 static DWORD WINAPI d3drm_device2_GetWireframeOptions(IDirect3DRMDevice2 *iface)
1078 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1080 TRACE("iface %p.\n", iface);
1082 return d3drm_device3_GetWireframeOptions(&device->IDirect3DRMDevice3_iface);
1085 static DWORD WINAPI d3drm_device1_GetWireframeOptions(IDirect3DRMDevice *iface)
1087 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
1089 TRACE("iface %p.\n", iface);
1091 return d3drm_device3_GetWireframeOptions(&device->IDirect3DRMDevice3_iface);
1094 static D3DRMRENDERQUALITY WINAPI d3drm_device3_GetQuality(IDirect3DRMDevice3 *iface)
1096 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
1098 TRACE("iface %p.\n", iface);
1100 return device->quality;
1103 static D3DRMRENDERQUALITY WINAPI d3drm_device2_GetQuality(IDirect3DRMDevice2 *iface)
1105 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1107 TRACE("iface %p.\n", iface);
1109 return d3drm_device3_GetQuality(&device->IDirect3DRMDevice3_iface);
1112 static D3DRMRENDERQUALITY WINAPI d3drm_device1_GetQuality(IDirect3DRMDevice *iface)
1114 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
1116 TRACE("iface %p.\n", iface);
1118 return d3drm_device3_GetQuality(&device->IDirect3DRMDevice3_iface);
1121 static D3DCOLORMODEL WINAPI d3drm_device3_GetColorModel(IDirect3DRMDevice3 *iface)
1123 FIXME("iface %p stub!\n", iface);
1125 return E_NOTIMPL;
1128 static D3DCOLORMODEL WINAPI d3drm_device2_GetColorModel(IDirect3DRMDevice2 *iface)
1130 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1132 TRACE("iface %p.\n", iface);
1134 return d3drm_device3_GetColorModel(&device->IDirect3DRMDevice3_iface);
1137 static D3DCOLORMODEL WINAPI d3drm_device1_GetColorModel(IDirect3DRMDevice *iface)
1139 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
1141 TRACE("iface %p stub!\n", iface);
1143 return d3drm_device3_GetColorModel(&device->IDirect3DRMDevice3_iface);
1146 static D3DRMTEXTUREQUALITY WINAPI d3drm_device3_GetTextureQuality(IDirect3DRMDevice3 *iface)
1148 FIXME("iface %p stub!\n", iface);
1150 return E_NOTIMPL;
1153 static D3DRMTEXTUREQUALITY WINAPI d3drm_device2_GetTextureQuality(IDirect3DRMDevice2 *iface)
1155 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1157 TRACE("iface %p.\n", iface);
1159 return d3drm_device3_GetTextureQuality(&device->IDirect3DRMDevice3_iface);
1162 static D3DRMTEXTUREQUALITY WINAPI d3drm_device1_GetTextureQuality(IDirect3DRMDevice *iface)
1164 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
1166 TRACE("iface %p.\n", iface);
1168 return d3drm_device3_GetTextureQuality(&device->IDirect3DRMDevice3_iface);
1171 static HRESULT WINAPI d3drm_device3_GetDirect3DDevice(IDirect3DRMDevice3 *iface, IDirect3DDevice **d3d_device)
1173 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
1174 TRACE("iface %p, d3d_device %p!\n", iface, d3d_device);
1176 *d3d_device = device->device;
1177 IDirect3DDevice_AddRef(*d3d_device);
1179 return D3DRM_OK;
1182 static HRESULT WINAPI d3drm_device2_GetDirect3DDevice(IDirect3DRMDevice2 *iface, IDirect3DDevice **d3d_device)
1184 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1186 TRACE("iface %p, d3d_device %p.\n", iface, d3d_device);
1188 return d3drm_device3_GetDirect3DDevice(&device->IDirect3DRMDevice3_iface, d3d_device);
1191 static HRESULT WINAPI d3drm_device1_GetDirect3DDevice(IDirect3DRMDevice *iface, IDirect3DDevice **d3d_device)
1193 struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
1195 TRACE("iface %p, d3d_device %p.\n", iface, d3d_device);
1197 return d3drm_device3_GetDirect3DDevice(&device->IDirect3DRMDevice3_iface, d3d_device);
1200 static HRESULT WINAPI d3drm_device3_InitFromD3D2(IDirect3DRMDevice3 *iface,
1201 IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device)
1203 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
1204 IDirect3D *d3d1;
1205 IDirect3DDevice *d3d_device1;
1206 HRESULT hr;
1208 TRACE("iface %p, d3d %p, d3d_device %p.\n", iface, d3d, d3d_device);
1210 if (!d3d || !d3d_device)
1211 return D3DRMERR_BADVALUE;
1213 if (FAILED(hr = IDirect3D2_QueryInterface(d3d, &IID_IDirect3D, (void **)&d3d1)))
1214 return hr;
1215 if (FAILED(hr = IDirect3DDevice2_QueryInterface(d3d_device, &IID_IDirect3DDevice, (void **)&d3d_device1)))
1217 IDirect3D_Release(d3d1);
1218 return hr;
1221 hr = d3drm_device_set_ddraw_device_d3d(device, d3d1, d3d_device1);
1222 IDirect3D_Release(d3d1);
1223 IDirect3DDevice_Release(d3d_device1);
1225 return hr;
1228 static HRESULT WINAPI d3drm_device2_InitFromD3D2(IDirect3DRMDevice2 *iface,
1229 IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device)
1231 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1233 TRACE("iface %p, d3d %p, d3d_device %p.\n", iface, d3d, d3d_device);
1235 return d3drm_device3_InitFromD3D2(&device->IDirect3DRMDevice3_iface, d3d, d3d_device);
1238 static HRESULT WINAPI d3drm_device3_InitFromSurface(IDirect3DRMDevice3 *iface,
1239 GUID *guid, IDirectDraw *ddraw, IDirectDrawSurface *backbuffer)
1241 FIXME("iface %p, guid %s, ddraw %p, backbuffer %p stub!\n",
1242 iface, debugstr_guid(guid), ddraw, backbuffer);
1244 return E_NOTIMPL;
1247 static HRESULT WINAPI d3drm_device2_InitFromSurface(IDirect3DRMDevice2 *iface,
1248 GUID *guid, IDirectDraw *ddraw, IDirectDrawSurface *backbuffer)
1250 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1252 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p.\n",
1253 iface, debugstr_guid(guid), ddraw, backbuffer);
1255 return d3drm_device3_InitFromSurface(&device->IDirect3DRMDevice3_iface, guid, ddraw, backbuffer);
1258 static HRESULT WINAPI d3drm_device3_SetRenderMode(IDirect3DRMDevice3 *iface, DWORD flags)
1260 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
1262 TRACE("iface %p, flags %#x.\n", iface, flags);
1264 device->rendermode = flags;
1266 return D3DRM_OK;
1269 static HRESULT WINAPI d3drm_device2_SetRenderMode(IDirect3DRMDevice2 *iface, DWORD flags)
1271 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1273 TRACE("iface %p, flags %#x.\n", iface, flags);
1275 return d3drm_device3_SetRenderMode(&device->IDirect3DRMDevice3_iface, flags);
1278 static DWORD WINAPI d3drm_device3_GetRenderMode(IDirect3DRMDevice3 *iface)
1280 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
1282 TRACE("iface %p.\n", iface);
1284 return device->rendermode;
1287 static DWORD WINAPI d3drm_device2_GetRenderMode(IDirect3DRMDevice2 *iface)
1289 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1291 TRACE("iface %p.\n", iface);
1293 return d3drm_device3_GetRenderMode(&device->IDirect3DRMDevice3_iface);
1296 static HRESULT WINAPI d3drm_device3_GetDirect3DDevice2(IDirect3DRMDevice3 *iface, IDirect3DDevice2 **d3d_device)
1298 struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
1300 TRACE("iface %p, d3d_device %p.\n", iface, d3d_device);
1302 if (FAILED(IDirect3DDevice_QueryInterface(device->device, &IID_IDirect3DDevice2, (void**)d3d_device)))
1303 return D3DRMERR_BADOBJECT;
1305 return D3DRM_OK;
1308 static HRESULT WINAPI d3drm_device2_GetDirect3DDevice2(IDirect3DRMDevice2 *iface, IDirect3DDevice2 **d3d_device)
1310 struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
1312 TRACE("iface %p, d3d_device %p.\n", iface, d3d_device);
1314 IDirect3DDevice_QueryInterface(device->device, &IID_IDirect3DDevice2, (void**)d3d_device);
1316 /* d3drm returns D3DRM_OK even if the call fails. */
1317 return D3DRM_OK;
1320 static HRESULT WINAPI d3drm_device3_FindPreferredTextureFormat(IDirect3DRMDevice3 *iface,
1321 DWORD bitdepths, DWORD flags, DDPIXELFORMAT *pf)
1323 FIXME("iface %p, bitdepths %u, flags %#x, pf %p stub!\n", iface, bitdepths, flags, pf);
1325 return E_NOTIMPL;
1328 static HRESULT WINAPI d3drm_device3_RenderStateChange(IDirect3DRMDevice3 *iface,
1329 D3DRENDERSTATETYPE state, DWORD value, DWORD flags)
1331 FIXME("iface %p, state %#x, value %#x, flags %#x stub!\n", iface, state, value, flags);
1333 return E_NOTIMPL;
1336 static HRESULT WINAPI d3drm_device3_LightStateChange(IDirect3DRMDevice3 *iface,
1337 D3DLIGHTSTATETYPE state, DWORD value, DWORD flags)
1339 FIXME("iface %p, state %#x, value %#x, flags %#x stub!\n", iface, state, value, flags);
1341 return E_NOTIMPL;
1344 static HRESULT WINAPI d3drm_device3_GetStateChangeOptions(IDirect3DRMDevice3 *iface,
1345 DWORD state_class, DWORD state_idx, DWORD *flags)
1347 FIXME("iface %p, state_class %#x, state_idx %#x, flags %p stub!\n",
1348 iface, state_class, state_idx, flags);
1350 return E_NOTIMPL;
1353 static HRESULT WINAPI d3drm_device3_SetStateChangeOptions(IDirect3DRMDevice3 *iface,
1354 DWORD state_class, DWORD state_idx, DWORD flags)
1356 FIXME("iface %p, state_class %#x, state_idx %#x, flags %#x stub!\n",
1357 iface, state_class, state_idx, flags);
1359 return E_NOTIMPL;
1362 static const struct IDirect3DRMDevice3Vtbl d3drm_device3_vtbl =
1364 d3drm_device3_QueryInterface,
1365 d3drm_device3_AddRef,
1366 d3drm_device3_Release,
1367 d3drm_device3_Clone,
1368 d3drm_device3_AddDestroyCallback,
1369 d3drm_device3_DeleteDestroyCallback,
1370 d3drm_device3_SetAppData,
1371 d3drm_device3_GetAppData,
1372 d3drm_device3_SetName,
1373 d3drm_device3_GetName,
1374 d3drm_device3_GetClassName,
1375 d3drm_device3_Init,
1376 d3drm_device3_InitFromD3D,
1377 d3drm_device3_InitFromClipper,
1378 d3drm_device3_Update,
1379 d3drm_device3_AddUpdateCallback,
1380 d3drm_device3_DeleteUpdateCallback,
1381 d3drm_device3_SetBufferCount,
1382 d3drm_device3_GetBufferCount,
1383 d3drm_device3_SetDither,
1384 d3drm_device3_SetShades,
1385 d3drm_device3_SetQuality,
1386 d3drm_device3_SetTextureQuality,
1387 d3drm_device3_GetViewports,
1388 d3drm_device3_GetDither,
1389 d3drm_device3_GetShades,
1390 d3drm_device3_GetHeight,
1391 d3drm_device3_GetWidth,
1392 d3drm_device3_GetTrianglesDrawn,
1393 d3drm_device3_GetWireframeOptions,
1394 d3drm_device3_GetQuality,
1395 d3drm_device3_GetColorModel,
1396 d3drm_device3_GetTextureQuality,
1397 d3drm_device3_GetDirect3DDevice,
1398 d3drm_device3_InitFromD3D2,
1399 d3drm_device3_InitFromSurface,
1400 d3drm_device3_SetRenderMode,
1401 d3drm_device3_GetRenderMode,
1402 d3drm_device3_GetDirect3DDevice2,
1403 d3drm_device3_FindPreferredTextureFormat,
1404 d3drm_device3_RenderStateChange,
1405 d3drm_device3_LightStateChange,
1406 d3drm_device3_GetStateChangeOptions,
1407 d3drm_device3_SetStateChangeOptions,
1410 static const struct IDirect3DRMDevice2Vtbl d3drm_device2_vtbl =
1412 d3drm_device2_QueryInterface,
1413 d3drm_device2_AddRef,
1414 d3drm_device2_Release,
1415 d3drm_device2_Clone,
1416 d3drm_device2_AddDestroyCallback,
1417 d3drm_device2_DeleteDestroyCallback,
1418 d3drm_device2_SetAppData,
1419 d3drm_device2_GetAppData,
1420 d3drm_device2_SetName,
1421 d3drm_device2_GetName,
1422 d3drm_device2_GetClassName,
1423 d3drm_device2_Init,
1424 d3drm_device2_InitFromD3D,
1425 d3drm_device2_InitFromClipper,
1426 d3drm_device2_Update,
1427 d3drm_device2_AddUpdateCallback,
1428 d3drm_device2_DeleteUpdateCallback,
1429 d3drm_device2_SetBufferCount,
1430 d3drm_device2_GetBufferCount,
1431 d3drm_device2_SetDither,
1432 d3drm_device2_SetShades,
1433 d3drm_device2_SetQuality,
1434 d3drm_device2_SetTextureQuality,
1435 d3drm_device2_GetViewports,
1436 d3drm_device2_GetDither,
1437 d3drm_device2_GetShades,
1438 d3drm_device2_GetHeight,
1439 d3drm_device2_GetWidth,
1440 d3drm_device2_GetTrianglesDrawn,
1441 d3drm_device2_GetWireframeOptions,
1442 d3drm_device2_GetQuality,
1443 d3drm_device2_GetColorModel,
1444 d3drm_device2_GetTextureQuality,
1445 d3drm_device2_GetDirect3DDevice,
1446 d3drm_device2_InitFromD3D2,
1447 d3drm_device2_InitFromSurface,
1448 d3drm_device2_SetRenderMode,
1449 d3drm_device2_GetRenderMode,
1450 d3drm_device2_GetDirect3DDevice2,
1453 static const struct IDirect3DRMDeviceVtbl d3drm_device1_vtbl =
1455 d3drm_device1_QueryInterface,
1456 d3drm_device1_AddRef,
1457 d3drm_device1_Release,
1458 d3drm_device1_Clone,
1459 d3drm_device1_AddDestroyCallback,
1460 d3drm_device1_DeleteDestroyCallback,
1461 d3drm_device1_SetAppData,
1462 d3drm_device1_GetAppData,
1463 d3drm_device1_SetName,
1464 d3drm_device1_GetName,
1465 d3drm_device1_GetClassName,
1466 d3drm_device1_Init,
1467 d3drm_device1_InitFromD3D,
1468 d3drm_device1_InitFromClipper,
1469 d3drm_device1_Update,
1470 d3drm_device1_AddUpdateCallback,
1471 d3drm_device1_DeleteUpdateCallback,
1472 d3drm_device1_SetBufferCount,
1473 d3drm_device1_GetBufferCount,
1474 d3drm_device1_SetDither,
1475 d3drm_device1_SetShades,
1476 d3drm_device1_SetQuality,
1477 d3drm_device1_SetTextureQuality,
1478 d3drm_device1_GetViewports,
1479 d3drm_device1_GetDither,
1480 d3drm_device1_GetShades,
1481 d3drm_device1_GetHeight,
1482 d3drm_device1_GetWidth,
1483 d3drm_device1_GetTrianglesDrawn,
1484 d3drm_device1_GetWireframeOptions,
1485 d3drm_device1_GetQuality,
1486 d3drm_device1_GetColorModel,
1487 d3drm_device1_GetTextureQuality,
1488 d3drm_device1_GetDirect3DDevice,
1491 static HRESULT WINAPI d3drm_device_win_QueryInterface(IDirect3DRMWinDevice *iface, REFIID riid, void **out)
1493 struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface);
1495 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
1497 return d3drm_device3_QueryInterface(&device->IDirect3DRMDevice3_iface, riid, out);
1500 static ULONG WINAPI d3drm_device_win_AddRef(IDirect3DRMWinDevice *iface)
1502 struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface);
1504 TRACE("iface %p.\n", iface);
1506 return d3drm_device3_AddRef(&device->IDirect3DRMDevice3_iface);
1509 static ULONG WINAPI d3drm_device_win_Release(IDirect3DRMWinDevice *iface)
1511 struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface);
1513 TRACE("iface %p.\n", iface);
1515 return d3drm_device3_Release(&device->IDirect3DRMDevice3_iface);
1518 static HRESULT WINAPI d3drm_device_win_Clone(IDirect3DRMWinDevice *iface,
1519 IUnknown *outer, REFIID iid, void **out)
1521 struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface);
1523 TRACE("iface %p, outer %p, iid %s, out %p\n", iface, outer, debugstr_guid(iid), out);
1525 return d3drm_device3_Clone(&device->IDirect3DRMDevice3_iface, outer, iid, out);
1528 static HRESULT WINAPI d3drm_device_win_AddDestroyCallback(IDirect3DRMWinDevice *iface,
1529 D3DRMOBJECTCALLBACK cb, void *ctx)
1531 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
1533 return E_NOTIMPL;
1536 static HRESULT WINAPI d3drm_device_win_DeleteDestroyCallback(IDirect3DRMWinDevice *iface,
1537 D3DRMOBJECTCALLBACK cb, void *ctx)
1539 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
1541 return E_NOTIMPL;
1544 static HRESULT WINAPI d3drm_device_win_SetAppData(IDirect3DRMWinDevice *iface, DWORD data)
1546 struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface);
1548 TRACE("iface %p, data %#x.\n", iface, data);
1550 return d3drm_device3_SetAppData(&device->IDirect3DRMDevice3_iface, data);
1553 static DWORD WINAPI d3drm_device_win_GetAppData(IDirect3DRMWinDevice *iface)
1555 struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface);
1557 TRACE("iface %p.\n", iface);
1559 return d3drm_device3_GetAppData(&device->IDirect3DRMDevice3_iface);
1562 static HRESULT WINAPI d3drm_device_win_SetName(IDirect3DRMWinDevice *iface, const char *name)
1564 struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface);
1566 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
1568 return d3drm_device3_SetName(&device->IDirect3DRMDevice3_iface, name);
1571 static HRESULT WINAPI d3drm_device_win_GetName(IDirect3DRMWinDevice *iface, DWORD *size, char *name)
1573 struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface);
1575 TRACE("iface %p, size %p, name %p stub!\n", iface, size, name);
1577 return d3drm_device3_GetName(&device->IDirect3DRMDevice3_iface, size, name);
1580 static HRESULT WINAPI d3drm_device_win_GetClassName(IDirect3DRMWinDevice *iface, DWORD *size, char *name)
1582 struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface);
1584 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
1586 return d3drm_device3_GetClassName(&device->IDirect3DRMDevice3_iface, size, name);
1589 static HRESULT WINAPI d3drm_device_win_HandlePaint(IDirect3DRMWinDevice *iface, HDC dc)
1591 FIXME("iface %p, dc %p stub!\n", iface, dc);
1593 return D3DRM_OK;
1596 static HRESULT WINAPI d3drm_device_win_HandleActivate(IDirect3DRMWinDevice *iface, WORD wparam)
1598 FIXME("iface %p, wparam %#x stub!\n", iface, wparam);
1600 return D3DRM_OK;
1603 static const struct IDirect3DRMWinDeviceVtbl d3drm_device_win_vtbl =
1605 d3drm_device_win_QueryInterface,
1606 d3drm_device_win_AddRef,
1607 d3drm_device_win_Release,
1608 d3drm_device_win_Clone,
1609 d3drm_device_win_AddDestroyCallback,
1610 d3drm_device_win_DeleteDestroyCallback,
1611 d3drm_device_win_SetAppData,
1612 d3drm_device_win_GetAppData,
1613 d3drm_device_win_SetName,
1614 d3drm_device_win_GetName,
1615 d3drm_device_win_GetClassName,
1616 d3drm_device_win_HandlePaint,
1617 d3drm_device_win_HandleActivate,
1620 HRESULT d3drm_device_create(struct d3drm_device **device, IDirect3DRM *d3drm)
1622 struct d3drm_device *object;
1624 TRACE("device %p, d3drm %p.\n", device, d3drm);
1626 if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
1627 return E_OUTOFMEMORY;
1629 object->IDirect3DRMDevice_iface.lpVtbl = &d3drm_device1_vtbl;
1630 object->IDirect3DRMDevice2_iface.lpVtbl = &d3drm_device2_vtbl;
1631 object->IDirect3DRMDevice3_iface.lpVtbl = &d3drm_device3_vtbl;
1632 object->IDirect3DRMWinDevice_iface.lpVtbl = &d3drm_device_win_vtbl;
1633 object->d3drm = d3drm;
1634 d3drm_object_init(&object->obj);
1636 *device = object;
1638 return D3DRM_OK;