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"
28 #include "d3drm_private.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
);
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
);
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
;
84 hr
= IDirectDrawClipper_GetHWnd(clipper
, &window
);
88 hr
= IDirectDraw_SetCooperativeLevel(ddraw
, window
, DDSCL_NORMAL
);
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
);
99 hr
= IDirectDrawSurface_SetClipper(primary_surface
, clipper
);
102 IDirectDrawSurface_Release(primary_surface
);
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
);
116 IDirectDrawSurface_Release(primary_surface
);
120 object
->primary_surface
= primary_surface
;
121 object
->clipper
= clipper
;
122 IDirectDrawClipper_AddRef(clipper
);
123 *surface
= render_target
;
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
;
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
);
150 if (!(desc
.ddsCaps
.dwCaps
& DDSCAPS_3DDEVICE
))
151 return DDERR_INVALIDCAPS
;
153 hr
= IDirectDrawSurface_GetAttachedSurface(surface
, &caps
, &ds
);
156 create_z_surface
= FALSE
;
157 IDirectDrawSurface_Release(ds
);
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
);
174 hr
= IDirectDrawSurface_AddAttachedSurface(surface
, ds
);
175 IDirectDrawSurface_Release(ds
);
181 hr
= IDirectDrawSurface_QueryInterface(surface
, &IID_IDirect3DRGBDevice
, (void **)&device1
);
184 IDirectDraw_QueryInterface(ddraw
, &IID_IDirect3D2
, (void**)&d3d2
);
185 hr
= IDirect3D2_CreateDevice(d3d2
, &IID_IDirect3DRGBDevice
, surface
, &device2
);
186 IDirect3D2_Release(d3d2
);
190 IDirectDrawSurface_DeleteAttachedSurface(surface
, 0, ds
);
196 hr
= IDirect3DDevice2_QueryInterface(device2
, &IID_IDirect3DDevice
, (void**)&device1
);
197 IDirect3DDevice2_Release(device2
);
200 IDirectDrawSurface_DeleteAttachedSurface(surface
, 0, ds
);
204 device
->device
= device1
;
205 device
->width
= desc
.dwWidth
;
206 device
->height
= desc
.dwHeight
;
211 static HRESULT
d3drm_device_set_ddraw_device_d3d(struct d3drm_device
*device
, IDirect3D
*d3d
, IDirect3DDevice
*d3d_device
)
214 IDirectDrawSurface
*surface
;
215 IDirect3DDevice2
*d3d_device2
;
219 /* AddRef these interfaces beforehand for the intentional leak on reinitialization. */
220 if (FAILED(hr
= IDirect3D_QueryInterface(d3d
, &IID_IDirectDraw
, (void **)&ddraw
)))
222 IDirect3DRM_AddRef(device
->d3drm
);
223 IDirect3DDevice_AddRef(d3d_device
);
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
)))
233 hr
= IDirect3DDevice2_GetRenderTarget(d3d_device2
, &surface
);
234 IDirect3DDevice2_Release(d3d_device2
);
239 desc
.dwSize
= sizeof(desc
);
240 hr
= IDirectDrawSurface_GetSurfaceDesc(surface
, &desc
);
241 IDirectDrawSurface_Release(surface
);
245 device
->ddraw
= ddraw
;
246 device
->width
= desc
.dwWidth
;
247 device
->height
= desc
.dwHeight
;
248 device
->device
= d3d_device
;
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
;
280 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid
));
281 return CLASS_E_CLASSNOTAVAILABLE
;
284 IUnknown_AddRef((IUnknown
*)*out
);
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
);
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
);
342 d3drm_device_destroy(device
);
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
);
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
);
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
);
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
));
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
);
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
)
560 strcpy(name
, "Device");
561 *size
= sizeof("Device");
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
;
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
;
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
);
693 static HRESULT WINAPI
d3drm_device2_Update(IDirect3DRMDevice2
*iface
)
695 FIXME("iface %p stub!\n", iface
);
700 static HRESULT WINAPI
d3drm_device1_Update(IDirect3DRMDevice
*iface
)
702 FIXME("iface %p stub!\n", iface
);
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
);
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
);
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
);
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
);
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
);
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
);
755 static HRESULT WINAPI
d3drm_device3_SetBufferCount(IDirect3DRMDevice3
*iface
, DWORD count
)
757 FIXME("iface %p, count %u stub!\n", iface
, count
);
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
);
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
;
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
);
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
;
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
1205 IDirect3DDevice
*d3d_device1
;
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
)))
1215 if (FAILED(hr
= IDirect3DDevice2_QueryInterface(d3d_device
, &IID_IDirect3DDevice
, (void **)&d3d_device1
)))
1217 IDirect3D_Release(d3d1
);
1221 hr
= d3drm_device_set_ddraw_device_d3d(device
, d3d1
, d3d_device1
);
1222 IDirect3D_Release(d3d1
);
1223 IDirect3DDevice_Release(d3d_device1
);
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
);
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
;
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
;
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. */
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
);
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
);
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
);
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
);
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
);
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
,
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
,
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
,
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
);
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
);
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
);
1596 static HRESULT WINAPI
d3drm_device_win_HandleActivate(IDirect3DRMWinDevice
*iface
, WORD wparam
)
1598 FIXME("iface %p, wparam %#x stub!\n", iface
, wparam
);
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
);