ReactOS 0.4.17-dev-966-gf06eace
ddraw.c
Go to the documentation of this file.
1/*
2 * Copyright 1997-2000 Marcus Meissner
3 * Copyright 1998-2000 Lionel Ulmer
4 * Copyright 2000-2001 TransGaming Technologies Inc.
5 * Copyright 2006 Stefan Dösinger
6 * Copyright 2008 Denver Gingerich
7 * Copyright 2007-2008, 2011, 2013 Stefan Dösinger for CodeWeavers
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include "ddraw_private.h"
25#include "ddrawi.h"
26#include "d3dhal.h"
27
28#include "wine/exception.h"
29
31
32static const struct ddraw *exclusive_ddraw;
34
35/* Device identifier. Don't relay it to WineD3D */
37{
38 "vga.dll", /* default 2D driver */
39 "DirectDraw HAL",
40 { { 0x00010001, 0x00010001 } },
41 0, 0, 0, 0,
42 /* a8373c10-7ac4-4deb-849a-009844d08b2d */
43 {0xa8373c10,0x7ac4,0x4deb, {0x84,0x9a,0x00,0x98,0x44,0xd0,0x8b,0x2d}},
44 0
45};
46
47static struct enum_device_entry
48{
49 char interface_name[100];
50 char device_name[100];
53} device_list7[] =
54{
55 /* T&L HAL device */
56 {
57 "WINE Direct3D7 Hardware Transform and Lighting acceleration using WineD3D",
58 "Wine D3D7 T&L HAL",
59 &IID_IDirect3DTnLHalDevice,
60 0,
61 },
62
63 /* HAL device */
64 {
65 "WINE Direct3D7 Hardware acceleration using WineD3D",
66 "Direct3D HAL",
67 &IID_IDirect3DHALDevice,
69 },
70
71 /* RGB device */
72 {
73 "WINE Direct3D7 RGB Software Emulation using WineD3D",
74 "Wine D3D7 RGB",
75 &IID_IDirect3DRGBDevice,
77 },
78};
79
81
83{
85};
86
88 BOOL windowed)
89{
90 TRACE("parent %p, windowed %d.\n", parent, windowed);
91}
92
94{
96};
97
98static inline struct ddraw *impl_from_IDirectDraw(IDirectDraw *iface)
99{
100 return CONTAINING_RECORD(iface, struct ddraw, IDirectDraw_iface);
101}
102
103static inline struct ddraw *impl_from_IDirectDraw2(IDirectDraw2 *iface)
104{
105 return CONTAINING_RECORD(iface, struct ddraw, IDirectDraw2_iface);
106}
107
108static inline struct ddraw *impl_from_IDirectDraw4(IDirectDraw4 *iface)
109{
110 return CONTAINING_RECORD(iface, struct ddraw, IDirectDraw4_iface);
111}
112
113static inline struct ddraw *impl_from_IDirectDraw7(IDirectDraw7 *iface)
114{
115 return CONTAINING_RECORD(iface, struct ddraw, IDirectDraw7_iface);
116}
117
118static inline struct ddraw *impl_from_IDirect3D(IDirect3D *iface)
119{
120 return CONTAINING_RECORD(iface, struct ddraw, IDirect3D_iface);
121}
122
123static inline struct ddraw *impl_from_IDirect3D2(IDirect3D2 *iface)
124{
125 return CONTAINING_RECORD(iface, struct ddraw, IDirect3D2_iface);
126}
127
128static inline struct ddraw *impl_from_IDirect3D3(IDirect3D3 *iface)
129{
130 return CONTAINING_RECORD(iface, struct ddraw, IDirect3D3_iface);
131}
132
133static inline struct ddraw *impl_from_IDirect3D7(IDirect3D7 *iface)
134{
135 return CONTAINING_RECORD(iface, struct ddraw, IDirect3D7_iface);
136}
137
139{
140 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
141
142 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
143
144 if (!riid)
145 {
146 *out = NULL;
147 return DDERR_INVALIDPARAMS;
148 }
149
150 /* The refcount unit test revealed that an IDirect3D7 interface can only
151 * be queried from a DirectDraw object that was created as an IDirectDraw7
152 * interface. The older interfaces can query any IDirect3D version except
153 * 7, because they are all initially created as IDirectDraw. This isn't
154 * really crucial behavior, and messy to implement with the common
155 * creation function, so it has been left out here. */
156 if (IsEqualGUID(&IID_IDirectDraw7, riid)
158 {
160 TRACE("Returning IDirectDraw7 interface %p.\n", *out);
161 }
162 else if (IsEqualGUID(&IID_IDirectDraw4, riid))
163 {
165 TRACE("Returning IDirectDraw4 interface %p.\n", *out);
166 }
167 else if (IsEqualGUID(&IID_IDirectDraw2, riid))
168 {
170 TRACE("Returning IDirectDraw2 interface %p.\n", *out);
171 }
172 else if (IsEqualGUID(&IID_IDirectDraw, riid))
173 {
175 TRACE("Returning IDirectDraw interface %p.\n", *out);
176 }
177 else if (IsEqualGUID(&IID_IDirect3D7, riid))
178 {
179 ddraw->d3dversion = 7;
181 TRACE("Returning Direct3D7 interface %p.\n", *out);
182 }
183 else if (IsEqualGUID(&IID_IDirect3D3, riid))
184 {
185 ddraw->d3dversion = 3;
187 TRACE("Returning Direct3D3 interface %p.\n", *out);
188 }
189 else if (IsEqualGUID(&IID_IDirect3D2, riid))
190 {
191 ddraw->d3dversion = 2;
193 TRACE("Returning Direct3D2 interface %p.\n", *out);
194 }
195 else if (IsEqualGUID(&IID_IDirect3D, riid))
196 {
197 ddraw->d3dversion = 1;
199 TRACE("Returning Direct3D interface %p.\n", *out);
200 }
201 /* Unknown interface */
202 else
203 {
204 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
205 *out = NULL;
206 return E_NOINTERFACE;
207 }
208
209 IUnknown_AddRef((IUnknown *)*out);
210 return S_OK;
211}
212
213static HRESULT WINAPI ddraw4_QueryInterface(IDirectDraw4 *iface, REFIID riid, void **object)
214{
215 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
216
217 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
218
220}
221
222static HRESULT WINAPI ddraw2_QueryInterface(IDirectDraw2 *iface, REFIID riid, void **object)
223{
224 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
225
226 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
227
229}
230
231static HRESULT WINAPI ddraw1_QueryInterface(IDirectDraw *iface, REFIID riid, void **object)
232{
233 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
234
235 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
236
238}
239
240static HRESULT WINAPI d3d7_QueryInterface(IDirect3D7 *iface, REFIID riid, void **object)
241{
242 struct ddraw *ddraw = impl_from_IDirect3D7(iface);
243
244 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
245
247}
248
249static HRESULT WINAPI d3d3_QueryInterface(IDirect3D3 *iface, REFIID riid, void **object)
250{
251 struct ddraw *ddraw = impl_from_IDirect3D3(iface);
252
253 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
254
256}
257
258static HRESULT WINAPI d3d2_QueryInterface(IDirect3D2 *iface, REFIID riid, void **object)
259{
260 struct ddraw *ddraw = impl_from_IDirect3D2(iface);
261
262 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
263
265}
266
267static HRESULT WINAPI d3d1_QueryInterface(IDirect3D *iface, REFIID riid, void **object)
268{
269 struct ddraw *ddraw = impl_from_IDirect3D(iface);
270
271 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
272
274}
275
276/*****************************************************************************
277 * IDirectDraw7::AddRef
278 *
279 * Increases the interfaces refcount, basically
280 *
281 * DDraw refcounting is a bit tricky. The different DirectDraw interface
282 * versions have individual refcounts, but the IDirect3D interfaces do not.
283 * All interfaces are from one object, that means calling QueryInterface on an
284 * IDirectDraw7 interface for an IDirectDraw4 interface does not create a new
285 * ddraw object.
286 *
287 * That means all AddRef and Release implementations of IDirectDrawX work
288 * with their own counter, and IDirect3DX::AddRef thunk to IDirectDraw (1),
289 * except of IDirect3D7 which thunks to IDirectDraw7
290 *
291 * Returns: The new refcount
292 *
293 *****************************************************************************/
295{
296 struct ddraw *This = impl_from_IDirectDraw7(iface);
298
299 TRACE("%p increasing refcount to %lu.\n", This, ref);
300
301 if(ref == 1) InterlockedIncrement(&This->numIfaces);
302
303 return ref;
304}
305
306static ULONG WINAPI ddraw4_AddRef(IDirectDraw4 *iface)
307{
308 struct ddraw *This = impl_from_IDirectDraw4(iface);
310
311 TRACE("%p increasing refcount to %lu.\n", This, ref);
312
313 if (ref == 1) InterlockedIncrement(&This->numIfaces);
314
315 return ref;
316}
317
318static ULONG WINAPI ddraw2_AddRef(IDirectDraw2 *iface)
319{
320 struct ddraw *This = impl_from_IDirectDraw2(iface);
322
323 TRACE("%p increasing refcount to %lu.\n", This, ref);
324
325 if (ref == 1) InterlockedIncrement(&This->numIfaces);
326
327 return ref;
328}
329
330static ULONG WINAPI ddraw1_AddRef(IDirectDraw *iface)
331{
332 struct ddraw *This = impl_from_IDirectDraw(iface);
334
335 TRACE("%p increasing refcount to %lu.\n", This, ref);
336
337 if (ref == 1) InterlockedIncrement(&This->numIfaces);
338
339 return ref;
340}
341
342static ULONG WINAPI d3d7_AddRef(IDirect3D7 *iface)
343{
344 struct ddraw *This = impl_from_IDirect3D7(iface);
345
346 TRACE("iface %p.\n", iface);
347
348 return ddraw7_AddRef(&This->IDirectDraw7_iface);
349}
350
351static ULONG WINAPI d3d3_AddRef(IDirect3D3 *iface)
352{
353 struct ddraw *This = impl_from_IDirect3D3(iface);
354
355 TRACE("iface %p.\n", iface);
356
357 return ddraw1_AddRef(&This->IDirectDraw_iface);
358}
359
360static ULONG WINAPI d3d2_AddRef(IDirect3D2 *iface)
361{
362 struct ddraw *This = impl_from_IDirect3D2(iface);
363
364 TRACE("iface %p.\n", iface);
365
366 return ddraw1_AddRef(&This->IDirectDraw_iface);
367}
368
369static ULONG WINAPI d3d1_AddRef(IDirect3D *iface)
370{
371 struct ddraw *This = impl_from_IDirect3D(iface);
372
373 TRACE("iface %p.\n", iface);
374
375 return ddraw1_AddRef(&This->IDirectDraw_iface);
376}
377
379{
380 unsigned int i;
381
382 TRACE("Destroying the swapchain.\n");
383
385
386 for (i = 0; i < ddraw->numConvertedDecls; ++i)
387 {
389 }
390 free(ddraw->decls);
392
395
396 /* Free the d3d window if one was created. */
398 {
399 TRACE("Destroying the hidden render window %p.\n", ddraw->d3d_window);
401 ddraw->d3d_window = 0;
402 }
403
404 ddraw->flags &= ~DDRAW_D3D_INITIALIZED;
405
407
408 TRACE("Swapchain destroyed.\n");
409}
410
411/*****************************************************************************
412 * ddraw_destroy
413 *
414 * Destroys a ddraw object if all refcounts are 0. This is to share code
415 * between the IDirectDrawX::Release functions
416 *
417 * Params:
418 * This: DirectDraw object to destroy
419 *
420 *****************************************************************************/
421static void ddraw_destroy(struct ddraw *This)
422{
423 struct d3d_device *device;
424 IDirectDraw7_SetCooperativeLevel(&This->IDirectDraw7_iface, NULL, DDSCL_NORMAL);
425 IDirectDraw7_RestoreDisplayMode(&This->IDirectDraw7_iface);
426
427 /* Destroy the device window if we created one */
428 if(This->devicewindow != 0)
429 {
430 TRACE(" (%p) Destroying the device window %p\n", This, This->devicewindow);
431 DestroyWindow(This->devicewindow);
432 This->devicewindow = 0;
433 }
434
436 list_remove(&This->ddraw_list_entry);
438
439 if (This->wined3d_swapchain)
441 wined3d_device_decref(This->wined3d_device);
442 wined3d_decref(This->wined3d);
443
444 LIST_FOR_EACH_ENTRY(device, &This->d3ddevice_list, struct d3d_device, ddraw_entry)
445 {
446 device->ddraw = NULL;
447 }
448
449 /* Now free the object */
450 free(This);
451}
452
453/*****************************************************************************
454 * IDirectDraw7::Release
455 *
456 * Decreases the refcount. If the refcount falls to 0, the object is destroyed
457 *
458 * Returns: The new refcount
459 *****************************************************************************/
461{
462 struct ddraw *This = impl_from_IDirectDraw7(iface);
464
465 TRACE("%p decreasing refcount to %lu.\n", This, ref);
466
467 if (!ref && !InterlockedDecrement(&This->numIfaces))
469
470 return ref;
471}
472
473static ULONG WINAPI ddraw4_Release(IDirectDraw4 *iface)
474{
475 struct ddraw *This = impl_from_IDirectDraw4(iface);
477
478 TRACE("%p decreasing refcount to %lu.\n", This, ref);
479
480 if (!ref && !InterlockedDecrement(&This->numIfaces))
482
483 return ref;
484}
485
486static ULONG WINAPI ddraw2_Release(IDirectDraw2 *iface)
487{
488 struct ddraw *This = impl_from_IDirectDraw2(iface);
490
491 TRACE("%p decreasing refcount to %lu.\n", This, ref);
492
493 if (!ref && !InterlockedDecrement(&This->numIfaces))
495
496 return ref;
497}
498
499static ULONG WINAPI ddraw1_Release(IDirectDraw *iface)
500{
501 struct ddraw *This = impl_from_IDirectDraw(iface);
503
504 TRACE("%p decreasing refcount to %lu.\n", This, ref);
505
506 if (!ref && !InterlockedDecrement(&This->numIfaces))
508
509 return ref;
510}
511
512static ULONG WINAPI d3d7_Release(IDirect3D7 *iface)
513{
514 struct ddraw *This = impl_from_IDirect3D7(iface);
515
516 TRACE("iface %p.\n", iface);
517
518 return ddraw7_Release(&This->IDirectDraw7_iface);
519}
520
521static ULONG WINAPI d3d3_Release(IDirect3D3 *iface)
522{
523 struct ddraw *This = impl_from_IDirect3D3(iface);
524
525 TRACE("iface %p.\n", iface);
526
527 return ddraw1_Release(&This->IDirectDraw_iface);
528}
529
530static ULONG WINAPI d3d2_Release(IDirect3D2 *iface)
531{
532 struct ddraw *This = impl_from_IDirect3D2(iface);
533
534 TRACE("iface %p.\n", iface);
535
536 return ddraw1_Release(&This->IDirectDraw_iface);
537}
538
539static ULONG WINAPI d3d1_Release(IDirect3D *iface)
540{
541 struct ddraw *This = impl_from_IDirect3D(iface);
542
543 TRACE("iface %p.\n", iface);
544
545 return ddraw1_Release(&This->IDirectDraw_iface);
546}
547
548/*****************************************************************************
549 * IDirectDraw methods
550 *****************************************************************************/
551
553{
554 /* FIXME: This looks wrong, exclusive mode should imply a destination
555 * window. */
557 {
558 TRACE("Setting DDSCL_SETFOCUSWINDOW with an already set window, returning DDERR_HWNDALREADYSET.\n");
560 }
561
563
564 return DD_OK;
565}
566
568 DWORD cooplevel, struct wined3d_swapchain **wined3d_swapchain)
569{
570 struct wined3d_swapchain_desc swapchain_desc;
572 HRESULT hr;
573
574 TRACE("ddraw %p.\n", ddraw);
575
577 {
578 ERR("Failed to get display mode.\n");
579 return hr;
580 }
581
582 memset(&swapchain_desc, 0, sizeof(swapchain_desc));
583 swapchain_desc.output = ddraw->wined3d_output;
584 swapchain_desc.backbuffer_width = mode.width;
585 swapchain_desc.backbuffer_height = mode.height;
586 swapchain_desc.backbuffer_format = mode.format_id;
587 swapchain_desc.backbuffer_bind_flags = 0;
588 swapchain_desc.backbuffer_count = 1;
590 swapchain_desc.device_window = window;
591 swapchain_desc.windowed = !(cooplevel & DDSCL_FULLSCREEN);
592 swapchain_desc.flags = DDRAW_WINED3D_SWAPCHAIN_FLAGS;
593
594 if ((cooplevel & DDSCL_NOWINDOWCHANGES) || window != GetForegroundWindow())
596
598 return wined3d_swapchain_create(ddraw->wined3d_device, &swapchain_desc,
600
601 if (!window || window == GetDesktopWindow())
602 {
603 window = CreateWindowExA(0, DDRAW_WINDOW_CLASS_NAME, "Hidden D3D Window",
605 NULL, NULL, NULL, NULL);
606 if (!window)
607 {
608 ERR("Failed to create window, last error %#lx.\n", GetLastError());
609 return E_FAIL;
610 }
611
612 ShowWindow(window, SW_HIDE); /* Just to be sure */
613 WARN("No window for the Direct3DDevice, created hidden window %p.\n", window);
614
615 swapchain_desc.device_window = window;
616 }
617 else
618 {
619 TRACE("Using existing window %p for Direct3D rendering.\n", window);
620 }
622
623 /* Set this NOW, otherwise creating the depth stencil surface will cause a
624 * recursive loop until ram or emulated video memory is full. */
626 if (FAILED(hr = wined3d_swapchain_create(ddraw->wined3d_device, &swapchain_desc,
628 {
629 ddraw->flags &= ~DDRAW_D3D_INITIALIZED;
632 return hr;
633 }
634
635 ddraw->declArraySize = 2;
636 if (!(ddraw->decls = calloc(ddraw->declArraySize, sizeof(*ddraw->decls))))
637 {
638 ERR("Error allocating an array for the converted vertex decls.\n");
639 ddraw->declArraySize = 0;
643 return E_OUTOFMEMORY;
644 }
645
646 TRACE("Successfully initialized 3D.\n");
647
648 return DD_OK;
649}
650
652{
653 HRESULT hr;
654
656 {
657 ERR("Swapchain already created.\n");
658 return E_FAIL;
659 }
660
662 {
663 ERR("Failed to create swapchain, hr %#lx.\n", hr);
664 return hr;
665 }
667
669
670 if (ddraw->primary && ddraw->primary->palette)
672
673 return DD_OK;
674}
675
676/*****************************************************************************
677 * IDirectDraw7::RestoreDisplayMode
678 *
679 * Restores the display mode to what it was at creation time. Basically.
680 *
681 * Returns
682 * DD_OK on success
683 * DDERR_NOEXCLUSIVE mode if the device isn't in fullscreen mode
684 *
685 *****************************************************************************/
687{
688 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
690 RECT clip_rect;
691 HRESULT hr;
692
693 TRACE("iface %p.\n", iface);
694
696
698 {
700 return DD_OK;
701 }
702
704 {
707 }
708
710 {
711 ddraw->flags &= ~DDRAW_RESTORE_MODE;
714 {
715 SetRect(&clip_rect, 0, 0, mode.width, mode.height);
716 ClipCursor(&clip_rect);
717 }
718 }
719
721
723
724 return hr;
725}
726
727static HRESULT WINAPI ddraw4_RestoreDisplayMode(IDirectDraw4 *iface)
728{
729 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
730
731 TRACE("iface %p.\n", iface);
732
734}
735
736static HRESULT WINAPI ddraw2_RestoreDisplayMode(IDirectDraw2 *iface)
737{
738 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
739
740 TRACE("iface %p.\n", iface);
741
743}
744
745static HRESULT WINAPI ddraw1_RestoreDisplayMode(IDirectDraw *iface)
746{
747 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
748
749 TRACE("iface %p.\n", iface);
750
752}
753
754/*****************************************************************************
755 * IDirectDraw7::SetCooperativeLevel
756 *
757 * Sets the cooperative level for the DirectDraw object, and the window
758 * assigned to it. The cooperative level determines the general behavior
759 * of the DirectDraw application
760 *
761 * Warning: This is quite tricky, as it's not really documented which
762 * cooperative levels can be combined with each other. If a game fails
763 * after this function, try to check the cooperative levels passed on
764 * Windows, and if it returns something different.
765 *
766 * If you think that this function caused the failure because it writes a
767 * fixme, be sure to run again with a +ddraw trace.
768 *
769 * What is known about cooperative levels (See the ddraw modes test):
770 * DDSCL_EXCLUSIVE requires DDSCL_FULLSCREEN.
771 * DDSCL_NORMAL is not compatible with DDSCL_EXCLUSIVE.
772 * Unlike what msdn claims, DDSCL_NORMAL | DDSCL_FULLSCREEN is allowed.
773 * DDSCL_SETFOCUSWINDOW can be passed only in DDSCL_NORMAL mode, but after that
774 * DDSCL_EXCLUSIVE can be activated.
775 * DDSCL_SETFOCUSWINDOW may only be used with DDSCL_NOWINDOWCHANGES or
776 * DDSCL_CREATEDEVICEWINDOW.
777 *
778 * Handled flags: DDSCL_NORMAL, DDSCL_FULLSCREEN, DDSCL_EXCLUSIVE,
779 * DDSCL_CREATEDEVICEWINDOW, DDSCL_SETDEVICEWINDOW
780 * DDSCL_SETFOCUSWINDOW (partially),
781 * DDSCL_MULTITHREADED (work in progress)
782 * DDSCL_FPUPRESERVE (see device.c)
783 *
784 * Unsure about this: DDSCL_FPUSETUP
785 *
786 * These don't seem very important for wine:
787 * DDSCL_ALLOWREBOOT, DDSCL_ALLOWMODEX
788 *
789 * Returns:
790 * DD_OK if the cooperative level was set successfully
791 * DDERR_INVALIDPARAMS if the passed cooperative level combination is invalid
792 * DDERR_HWNDALREADYSET if DDSCL_SETFOCUSWINDOW is passed in exclusive mode
793 * (Probably others too, have to investigate)
794 *
795 *****************************************************************************/
797 DWORD cooplevel, BOOL restore_mode_on_normal)
798{
799 BOOL restore_state = FALSE;
800 struct d3d_device *device;
801 RECT clip_rect;
802 HRESULT hr;
803
804 TRACE("ddraw %p, window %p, flags %#lx, restore_mode_on_normal %x.\n", ddraw, window, cooplevel,
805 restore_mode_on_normal);
807
809
811 {
812 WARN("Recursive call, returning DD_OK.\n");
813 hr = DD_OK;
814 goto done;
815 }
817
818 /* Tests suggest that we need one of them: */
819 if(!(cooplevel & (DDSCL_SETFOCUSWINDOW |
822 {
823 TRACE("Incorrect cooplevel flags, returning DDERR_INVALIDPARAMS\n");
825 goto done;
826 }
827
828 if ((cooplevel & DDSCL_CREATEDEVICEWINDOW) && !(cooplevel & DDSCL_EXCLUSIVE))
829 {
830 WARN("DDSCL_CREATEDEVICEWINDOW requires DDSCL_EXCLUSIVE.\n");
832 goto done;
833 }
834
835 /* Handle those levels first which set various hwnds */
836 if ((cooplevel & DDSCL_SETFOCUSWINDOW) && !(cooplevel & DDSCL_CREATEDEVICEWINDOW))
837 {
838 /* This isn't compatible with a lot of flags */
839 if (cooplevel & (DDSCL_MULTITHREADED
848 {
849 WARN("Called with incompatible flags, returning DDERR_INVALIDPARAMS.\n");
851 goto done;
852 }
853
855 goto done;
856 }
857
858 if (cooplevel & DDSCL_EXCLUSIVE)
859 {
860 if (!(cooplevel & DDSCL_FULLSCREEN) || !(window || (cooplevel & DDSCL_CREATEDEVICEWINDOW)))
861 {
862 WARN("DDSCL_EXCLUSIVE requires DDSCL_FULLSCREEN and a window.\n");
864 goto done;
865 }
866
867 if (cooplevel & DDSCL_CREATEDEVICEWINDOW)
868 {
869 HWND device_window;
870
871 if (!ddraw->focuswindow && !(cooplevel & DDSCL_SETFOCUSWINDOW))
872 {
873 WARN("No focus window set.\n");
875 goto done;
876 }
877
878 device_window = CreateWindowExA(0, DDRAW_WINDOW_CLASS_NAME, "DirectDrawDeviceWnd",
880 NULL, NULL, NULL, NULL);
881 if (!device_window)
882 {
883 ERR("Failed to create window, last error %#lx.\n", GetLastError());
884 hr = E_FAIL;
885 goto done;
886 }
887
888 ShowWindow(device_window, SW_SHOW);
889 TRACE("Created a device window %p.\n", device_window);
890
891 /* Native apparently leaks the created device window if setting the
892 * focus window below fails. */
894 ddraw->devicewindow = device_window;
895
896 if (cooplevel & DDSCL_SETFOCUSWINDOW)
897 {
898 if (!window)
899 {
901 goto done;
902 }
903
905 goto done;
906 }
907
908 window = device_window;
909 }
910 }
911 else
912 {
917 }
918
919 if ((cooplevel & DDSCL_EXCLUSIVE) && exclusive_window != window)
920 {
923 }
924
927
929 {
930 if (!(ddraw->flags & DDRAW_NO3D))
931 {
932 restore_state = TRUE;
933
935 {
937 device->state, WINED3D_SBT_ALL, &device->saved_state)))
938 {
939 struct list *entry;
940
941 ERR("Failed to create stateblock, hr %#lx.\n", hr);
942 entry = &device->ddraw_entry;
944 {
945 device = LIST_ENTRY(entry, struct d3d_device, ddraw_entry);
946 wined3d_stateblock_decref(device->saved_state);
947 device->saved_state = NULL;
948 }
949 goto done;
950 }
951 }
952 }
953
955 }
956
957 if (FAILED(hr = ddraw_create_swapchain(ddraw, window, cooplevel)))
958 ERR("Failed to create swapchain, hr %#lx.\n", hr);
959
960 if (restore_state)
961 {
963 {
964 wined3d_stateblock_apply(device->saved_state, device->state);
965 wined3d_stateblock_decref(device->saved_state);
966 device->saved_state = NULL;
967 }
968 }
969
970 if (!(cooplevel & DDSCL_EXCLUSIVE) && (ddraw->cooperative_level & DDSCL_EXCLUSIVE))
971 {
972 /* When going from exclusive mode to normal, ddraw removes the
973 topmost bit unless the DDSCL_NOWINDOWCHANGES flag is set in
974 this call that sets it to normal, not in the old coop level. */
975 if (!(cooplevel & DDSCL_NOWINDOWCHANGES))
977
978 if (restore_mode_on_normal && FAILED(ddraw7_RestoreDisplayMode(&ddraw->IDirectDraw7_iface)))
979 ERR("RestoreDisplayMode failed\n");
981 }
982
984 && (window != ddraw->dest_window || !(cooplevel & DDSCL_EXCLUSIVE)))
986
987 if ((cooplevel & DDSCL_EXCLUSIVE)
989 {
991 if (FAILED(hr))
992 {
993 ERR("Failed to acquire focus window, hr %#lx.\n", hr);
994 goto done;
995 }
996 }
997
998 if (cooplevel & DDSCL_EXCLUSIVE)
999 {
1001 ClipCursor(&clip_rect);
1002 }
1003
1004 /* Unhandled flags */
1005 if (cooplevel & DDSCL_ALLOWREBOOT)
1006 WARN("Unhandled flag DDSCL_ALLOWREBOOT, harmless\n");
1007 if (cooplevel & DDSCL_ALLOWMODEX)
1008 WARN("Unhandled flag DDSCL_ALLOWMODEX, harmless\n");
1009 if (cooplevel & DDSCL_FPUSETUP)
1010 WARN("Unhandled flag DDSCL_FPUSETUP, harmless\n");
1011
1012 if (cooplevel & DDSCL_EXCLUSIVE)
1014 else if (exclusive_ddraw == ddraw)
1016
1017 /* Store the cooperative_level */
1018 ddraw->cooperative_level = cooplevel;
1020
1021 TRACE("SetCooperativeLevel returning DD_OK\n");
1022 hr = DD_OK;
1023done:
1024 ddraw->flags &= ~DDRAW_SCL_RECURSIVE;
1026
1027 return hr;
1028}
1029
1031{
1032 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
1033
1034 TRACE("iface %p, window %p, flags %#lx.\n", iface, window, flags);
1035
1037}
1038
1040{
1041 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
1042
1043 TRACE("iface %p, window %p, flags %#lx.\n", iface, window, flags);
1044
1046}
1047
1049{
1050 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
1051
1052 TRACE("iface %p, window %p, flags %#lx.\n", iface, window, flags);
1053
1055}
1056
1058{
1059 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
1060 HRESULT hr;
1061
1062 TRACE("iface %p, window %p, flags %#lx.\n", iface, window, flags);
1063
1065 if (SUCCEEDED(hr))
1067 return hr;
1068}
1069
1070/*****************************************************************************
1071 * IDirectDraw7::SetDisplayMode
1072 *
1073 * Sets the display screen resolution, color depth and refresh frequency
1074 * when in fullscreen mode (in theory).
1075 * Possible return values listed in the SDK suggest that this method fails
1076 * when not in fullscreen mode, but this is wrong. Windows 2000 happily sets
1077 * the display mode in DDSCL_NORMAL mode without an hwnd specified.
1078 * It seems to be valid to pass 0 for With and Height, this has to be tested
1079 * It could mean that the current video mode should be left as-is. (But why
1080 * call it then?)
1081 *
1082 * Params:
1083 * Height, Width: Screen dimension
1084 * BPP: Color depth in Bits per pixel
1085 * Refreshrate: Screen refresh rate
1086 * Flags: Other stuff
1087 *
1088 * Returns
1089 * DD_OK on success
1090 *
1091 *****************************************************************************/
1093 DWORD bpp, DWORD refresh_rate, DWORD flags)
1094{
1095 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
1098 RECT clip_rect;
1099 HRESULT hr;
1100
1101 TRACE("iface %p, width %lu, height %lu, bpp %lu, refresh_rate %lu, flags %#lx.\n",
1102 iface, width, height, bpp, refresh_rate, flags);
1103
1104 if (force_refresh_rate != 0)
1105 {
1106 TRACE("ForceRefreshRate overriding passed-in refresh rate (%lu Hz) to %lu Hz\n",
1109 }
1110
1112
1114 {
1116 return DDERR_NOEXCLUSIVEMODE;
1117 }
1118
1119 if (!width || !height)
1120 {
1121 /* It looks like Need for Speed Porsche Unleashed expects DD_OK here. */
1123 return DD_OK;
1124 }
1125
1126 switch (bpp)
1127 {
1128 case 8: format = WINED3DFMT_P8_UINT; break;
1129 case 15: format = WINED3DFMT_B5G5R5X1_UNORM; break;
1130 case 16: format = WINED3DFMT_B5G6R5_UNORM; break;
1131 case 24: format = WINED3DFMT_B8G8R8_UNORM; break;
1132 case 32: format = WINED3DFMT_B8G8R8X8_UNORM; break;
1133 default: format = WINED3DFMT_UNKNOWN; break;
1134 }
1135
1136 mode.width = width;
1137 mode.height = height;
1138 mode.refresh_rate = refresh_rate;
1139 mode.format_id = format;
1140 mode.scanline_ordering = WINED3D_SCANLINE_ORDERING_UNKNOWN;
1141
1142 /* TODO: The possible return values from msdn suggest that the screen mode
1143 * can't be changed if a surface is locked or some drawing is in progress. */
1145 {
1146 if (ddraw->primary)
1147 {
1148 DDSURFACEDESC2 *surface_desc = &ddraw->primary->surface_desc;
1149
1151 surface_desc->dwWidth, surface_desc->dwHeight, mode.format_id, WINED3D_MULTISAMPLE_NONE, 0)))
1152 ERR("Failed to resize buffers, hr %#lx.\n", hr);
1153 else
1154 ddrawformat_from_wined3dformat(&ddraw->primary->surface_desc.ddpfPixelFormat, mode.format_id);
1155 }
1157
1159 {
1160 SetRect(&clip_rect, 0, 0, width, height);
1161 ClipCursor(&clip_rect);
1162 }
1163 }
1164
1166
1168
1169 return hr_ddraw_from_wined3d(hr);
1170}
1171
1174{
1175 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
1176
1177 TRACE("iface %p, width %lu, height %lu, bpp %lu, refresh_rate %lu, flags %#lx.\n",
1178 iface, width, height, bpp, refresh_rate, flags);
1179
1181}
1182
1183static HRESULT WINAPI ddraw2_SetDisplayMode(IDirectDraw2 *iface,
1184 DWORD width, DWORD height, DWORD bpp, DWORD refresh_rate, DWORD flags)
1185{
1186 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
1187
1188 TRACE("iface %p, width %lu, height %lu, bpp %lu, refresh_rate %lu, flags %#lx.\n",
1189 iface, width, height, bpp, refresh_rate, flags);
1190
1192}
1193
1195{
1196 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
1197
1198 TRACE("iface %p, width %lu, height %lu, bpp %lu.\n", iface, width, height, bpp);
1199
1201}
1202
1204{
1205 memset(caps1, 0, sizeof(*caps1));
1206 caps1->dwSize = sizeof(*caps1);
1207 caps1->dwFlags = D3DDD_COLORMODEL
1218 caps1->dcmColorModel = D3DCOLOR_RGB;
1219 caps1->dwDevCaps = caps7->dwDevCaps;
1220 caps1->dtcTransformCaps.dwSize = sizeof(caps1->dtcTransformCaps);
1222 caps1->bClipping = TRUE;
1223 caps1->dlcLightingCaps.dwSize = sizeof(caps1->dlcLightingCaps);
1230 caps1->dpcLineCaps = caps7->dpcLineCaps;
1231 caps1->dpcTriCaps = caps7->dpcTriCaps;
1234
1235 /* This value is zero on all Windows drivers we have seen so far. */
1236 caps1->dwMaxBufferSize = 0;
1237
1238 /* AMD GPUs on Windows XP and newer report 1024 for HAL devices.
1239 * Nvidia GPUs report 65534. On Windows 9x we have seen 2048 on
1240 * AMD cards and 32768 on Nvidia. The API defined limit is 65536
1241 * because ddraw only supports 16 bit indices.
1242 *
1243 * Some games, for example Prince of Persia 3D (bug 44863), create a
1244 * vertex buffer to hold as many vertices as we report here. The
1245 * game requests a video memory buffer, maps it, writes a handful
1246 * of vertices and draws. Because IDirect3DVertexBuffer::Lock does
1247 * not allow passing a range, and prior to d3d7 doesn't support
1248 * NOOVERWRITE/DISCARD, the upload becomes slow if the buffer is too
1249 * large. So we don't want to report a value that's too high here.
1250 *
1251 * Why 2048? Windows 9x was the contemporaneous system when d3d 1-4
1252 * titles were written.
1253 *
1254 * Regardless of this value, we put ddraw4 vertex buffers into
1255 * system memory because games are using them poorly. This mitigates
1256 * negative effects of a large vertex count.
1257 *
1258 * Windows doesn't enforce this limit. A larger vertex buffer can
1259 * be created and used in draws. More vertices than dwMaxVertexCount
1260 * can be rendered in one draw call. SetExecuteData with a vertex
1261 * count exceeding dwMaxVertexCount succeeds too. */
1262 caps1->dwMaxVertexCount = 2048;
1263
1264 caps1->dwMinTextureWidth = caps7->dwMinTextureWidth;
1265 caps1->dwMinTextureHeight = caps7->dwMinTextureHeight;
1266 caps1->dwMaxTextureWidth = caps7->dwMaxTextureWidth;
1267 caps1->dwMaxTextureHeight = caps7->dwMaxTextureHeight;
1268 caps1->dwMinStippleWidth = 1;
1269 caps1->dwMinStippleHeight = 1;
1270 caps1->dwMaxStippleWidth = 32;
1271 caps1->dwMaxStippleHeight = 32;
1272 caps1->dwMaxTextureRepeat = caps7->dwMaxTextureRepeat;
1274 caps1->dwMaxAnisotropy = caps7->dwMaxAnisotropy;
1275 caps1->dvGuardBandLeft = caps7->dvGuardBandLeft;
1276 caps1->dvGuardBandTop = caps7->dvGuardBandTop;
1277 caps1->dvGuardBandRight = caps7->dvGuardBandRight;
1278 caps1->dvGuardBandBottom = caps7->dvGuardBandBottom;
1279 caps1->dvExtentsAdjust = caps7->dvExtentsAdjust;
1280 caps1->dwStencilCaps = caps7->dwStencilCaps;
1281 caps1->dwFVFCaps = caps7->dwFVFCaps;
1282 caps1->dwTextureOpCaps = caps7->dwTextureOpCaps;
1285}
1286
1288{
1290 HRESULT hr;
1291
1292 TRACE("ddraw %p, caps %p.\n", ddraw, caps);
1293
1294 memset(&wined3d_caps, 0, sizeof(wined3d_caps));
1295
1299 if (FAILED(hr))
1300 {
1301 WARN("Failed to get device caps, hr %#lx.\n", hr);
1302 return hr;
1303 }
1304
1316
1319
1324
1329
1332
1335
1338
1339 /* Remove all non-d3d7 caps */
1340 caps->dwDevCaps &= (
1348
1349 caps->dwStencilCaps &= (
1353
1354 /* FVF caps ?*/
1355
1356 caps->dwTextureOpCaps &= (
1365
1366 caps->dwVertexProcessingCaps &= (
1369
1370 caps->dpcLineCaps.dwMiscCaps &= (
1374
1375 caps->dpcLineCaps.dwRasterCaps &= (
1389
1390 caps->dpcLineCaps.dwZCmpCaps &= (
1394
1395 caps->dpcLineCaps.dwSrcBlendCaps &= (
1401
1402 caps->dpcLineCaps.dwDestBlendCaps &= (
1408
1409 caps->dpcLineCaps.dwAlphaCmpCaps &= (
1413
1414 caps->dpcLineCaps.dwShadeCaps &= (
1422
1423 caps->dpcLineCaps.dwTextureCaps &= (
1428
1436
1440
1442 {
1443 /* DirectX7 always has the np2 flag set, no matter what the card
1444 * supports. Some old games (Rollcage) check the caps incorrectly.
1445 * If wined3d supports nonpow2 textures it also has np2 conditional
1446 * support. */
1448 }
1449
1450 /* Fill the missing members, and do some fixup */
1451 caps->dpcLineCaps.dwSize = sizeof(caps->dpcLineCaps);
1460 caps->dpcLineCaps.dwStippleWidth = 32;
1461 caps->dpcLineCaps.dwStippleHeight = 32;
1462 /* Use the same for the TriCaps */
1463 caps->dpcTriCaps = caps->dpcLineCaps;
1464
1467 caps->dwMinTextureWidth = 1;
1468 caps->dwMinTextureHeight = 1;
1469
1470 /* Convert DWORDs safely to WORDs */
1475
1476 caps->deviceGUID = IID_IDirect3DTnLHalDevice;
1477
1478 caps->dwReserved1 = 0;
1479 caps->dwReserved2 = 0;
1480 caps->dwReserved3 = 0;
1481 caps->dwReserved4 = 0;
1482
1483 return DD_OK;
1484}
1485
1486/*****************************************************************************
1487 * IDirectDraw7::GetCaps
1488 *
1489 * Returns the drives capabilities
1490 *
1491 * Used for version 1, 2, 4 and 7
1492 *
1493 * Params:
1494 * DriverCaps: Structure to write the Hardware accelerated caps to
1495 * HelCaps: Structure to write the emulation caps to
1496 *
1497 * Returns
1498 * This implementation returns DD_OK only
1499 *
1500 *****************************************************************************/
1501static HRESULT WINAPI ddraw7_GetCaps(IDirectDraw7 *iface, DDCAPS *DriverCaps, DDCAPS *HELCaps)
1502{
1503 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
1504 DDSCAPS2 ddscaps = {0, 0, 0, {0}};
1505 struct wined3d_caps winecaps;
1506 DDCAPS caps;
1507 HRESULT hr;
1508
1509 TRACE("iface %p, driver_caps %p, hel_caps %p.\n", iface, DriverCaps, HELCaps);
1510
1511 /* One structure must be != NULL */
1512 if (!DriverCaps && !HELCaps)
1513 {
1514 WARN("Invalid parameters.\n");
1515 return DDERR_INVALIDPARAMS;
1516 }
1517
1518 memset(&caps, 0, sizeof(caps));
1519 memset(&winecaps, 0, sizeof(winecaps));
1520 caps.dwSize = sizeof(caps);
1521
1524 if (FAILED(hr))
1525 {
1526 WARN("Failed to get device caps, %#lx.\n", hr);
1528 return hr;
1529 }
1530
1531 hr = IDirectDraw7_GetAvailableVidMem(iface, &ddscaps, &caps.dwVidMemTotal, &caps.dwVidMemFree);
1532 if (FAILED(hr))
1533 {
1534 WARN("IDirectDraw7::GetAvailableVidMem failed\n");
1536 return hr;
1537 }
1538
1539 hr = IDirectDraw7_GetFourCCCodes(iface, &caps.dwNumFourCCCodes, NULL);
1541 if (FAILED(hr))
1542 {
1543 WARN("IDirectDraw7::GetFourCCCodes failed\n");
1544 return hr;
1545 }
1546
1547 caps.dwCaps = winecaps.ddraw_caps.caps;
1548 caps.dwCaps2 = winecaps.ddraw_caps.caps2;
1549 caps.dwCKeyCaps = winecaps.ddraw_caps.color_key_caps;
1550 caps.dwFXCaps = winecaps.ddraw_caps.fx_caps;
1551 caps.dwPalCaps = DDPCAPS_8BIT | DDPCAPS_PRIMARYSURFACE;
1552 caps.ddsCaps.dwCaps = winecaps.ddraw_caps.dds_caps;
1553 caps.dwSVBCaps = winecaps.ddraw_caps.svb_caps;
1554 caps.dwSVBCKeyCaps = winecaps.ddraw_caps.svb_color_key_caps;
1555 caps.dwSVBFXCaps = winecaps.ddraw_caps.svb_fx_caps;
1556 caps.dwVSBCaps = winecaps.ddraw_caps.vsb_caps;
1557 caps.dwVSBCKeyCaps = winecaps.ddraw_caps.vsb_color_key_caps;
1558 caps.dwVSBFXCaps = winecaps.ddraw_caps.vsb_fx_caps;
1559 caps.dwSSBCaps = winecaps.ddraw_caps.ssb_caps;
1560 caps.dwSSBCKeyCaps = winecaps.ddraw_caps.ssb_color_key_caps;
1561 caps.dwSSBFXCaps = winecaps.ddraw_caps.ssb_fx_caps;
1562
1563 caps.dwCaps |= DDCAPS_ALIGNSTRIDE;
1564 caps.dwAlignStrideAlign = DDRAW_STRIDE_ALIGNMENT;
1565
1566 caps.ddsOldCaps.dwCaps = caps.ddsCaps.dwCaps;
1567
1568 if(DriverCaps)
1569 {
1570 DD_STRUCT_COPY_BYSIZE(DriverCaps, &caps);
1571 if (TRACE_ON(ddraw))
1572 {
1573 TRACE("Driver Caps :\n");
1574 DDRAW_dump_DDCAPS(DriverCaps);
1575 }
1576
1577 }
1578 if(HELCaps)
1579 {
1580 DD_STRUCT_COPY_BYSIZE(HELCaps, &caps);
1581 if (TRACE_ON(ddraw))
1582 {
1583 TRACE("HEL Caps :\n");
1584 DDRAW_dump_DDCAPS(HELCaps);
1585 }
1586 }
1587
1588 return DD_OK;
1589}
1590
1591static HRESULT WINAPI ddraw4_GetCaps(IDirectDraw4 *iface, DDCAPS *driver_caps, DDCAPS *hel_caps)
1592{
1593 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
1594
1595 TRACE("iface %p, driver_caps %p, hel_caps %p.\n", iface, driver_caps, hel_caps);
1596
1597 return ddraw7_GetCaps(&ddraw->IDirectDraw7_iface, driver_caps, hel_caps);
1598}
1599
1600static HRESULT WINAPI ddraw2_GetCaps(IDirectDraw2 *iface, DDCAPS *driver_caps, DDCAPS *hel_caps)
1601{
1602 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
1603
1604 TRACE("iface %p, driver_caps %p, hel_caps %p.\n", iface, driver_caps, hel_caps);
1605
1606 return ddraw7_GetCaps(&ddraw->IDirectDraw7_iface, driver_caps, hel_caps);
1607}
1608
1609static HRESULT WINAPI ddraw1_GetCaps(IDirectDraw *iface, DDCAPS *driver_caps, DDCAPS *hel_caps)
1610{
1611 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
1612
1613 TRACE("iface %p, driver_caps %p, hel_caps %p.\n", iface, driver_caps, hel_caps);
1614
1615 return ddraw7_GetCaps(&ddraw->IDirectDraw7_iface, driver_caps, hel_caps);
1616}
1617
1618/*****************************************************************************
1619 * IDirectDraw7::Compact
1620 *
1621 * No idea what it does, MSDN says it's not implemented.
1622 *
1623 * Returns
1624 * DD_OK, but this is unchecked
1625 *
1626 *****************************************************************************/
1628{
1629 TRACE("iface %p.\n", iface);
1630
1631 return DD_OK;
1632}
1633
1634static HRESULT WINAPI ddraw4_Compact(IDirectDraw4 *iface)
1635{
1636 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
1637
1638 TRACE("iface %p.\n", iface);
1639
1641}
1642
1643static HRESULT WINAPI ddraw2_Compact(IDirectDraw2 *iface)
1644{
1645 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
1646
1647 TRACE("iface %p.\n", iface);
1648
1650}
1651
1652static HRESULT WINAPI ddraw1_Compact(IDirectDraw *iface)
1653{
1654 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
1655
1656 TRACE("iface %p.\n", iface);
1657
1659}
1660
1661/*****************************************************************************
1662 * IDirectDraw7::GetDisplayMode
1663 *
1664 * Returns information about the current display mode
1665 *
1666 * Exists in versions 1, 2, 4 and 7
1667 *
1668 * Params:
1669 * DDSD: Address of a surface description structure to write the info to
1670 *
1671 * Returns
1672 * DD_OK
1673 *
1674 *****************************************************************************/
1676{
1677 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
1679 HRESULT hr;
1680
1681 TRACE("iface %p, surface_desc %p.\n", iface, DDSD);
1682
1683 /* This seems sane */
1684 if (!DDSD || (DDSD->dwSize != sizeof(DDSURFACEDESC) && DDSD->dwSize != sizeof(DDSURFACEDESC2)))
1685 return DDERR_INVALIDPARAMS;
1686
1688
1690 {
1691 ERR("Failed to get display mode, hr %#lx.\n", hr);
1693 return hr;
1694 }
1695
1696 memset(DDSD, 0, DDSD->dwSize);
1697 DDSD->dwSize = sizeof(*DDSD);
1699 DDSD->dwWidth = mode.width;
1700 DDSD->dwHeight = mode.height;
1701 DDSD->dwRefreshRate = mode.refresh_rate;
1702 DDSD->ddpfPixelFormat.dwSize = sizeof(DDSD->ddpfPixelFormat);
1704 DDSD->lPitch = mode.width * DDSD->ddpfPixelFormat.dwRGBBitCount / 8;
1705
1706 if(TRACE_ON(ddraw))
1707 {
1708 TRACE("Returning surface desc :\n");
1710 }
1711
1713
1714 return DD_OK;
1715}
1716
1717static HRESULT WINAPI ddraw4_GetDisplayMode(IDirectDraw4 *iface, DDSURFACEDESC2 *surface_desc)
1718{
1719 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
1720
1721 TRACE("iface %p, surface_desc %p.\n", iface, surface_desc);
1722
1723 return ddraw7_GetDisplayMode(&ddraw->IDirectDraw7_iface, surface_desc);
1724}
1725
1726static HRESULT WINAPI ddraw2_GetDisplayMode(IDirectDraw2 *iface, DDSURFACEDESC *surface_desc)
1727{
1728 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
1729 HRESULT hr;
1730
1731 TRACE("iface %p, surface_desc %p.\n", iface, surface_desc);
1732
1734 if (SUCCEEDED(hr)) surface_desc->dwSize = sizeof(*surface_desc);
1735 return hr;
1736}
1737
1738static HRESULT WINAPI ddraw1_GetDisplayMode(IDirectDraw *iface, DDSURFACEDESC *surface_desc)
1739{
1740 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
1741 HRESULT hr;
1742
1743 TRACE("iface %p, surface_desc %p.\n", iface, surface_desc);
1744
1746 if (SUCCEEDED(hr)) surface_desc->dwSize = sizeof(*surface_desc);
1747 return hr;
1748}
1749
1750/*****************************************************************************
1751 * IDirectDraw7::GetFourCCCodes
1752 *
1753 * Returns an array of supported FourCC codes.
1754 *
1755 * Exists in versions 1, 2, 4 and 7
1756 *
1757 * Params:
1758 * NumCodes: Contains the number of Codes that Codes can carry. Returns the number
1759 * of enumerated codes
1760 * Codes: Pointer to an array of DWORDs where the supported codes are written
1761 * to
1762 *
1763 * Returns
1764 * Always returns DD_OK, as it's a stub for now
1765 *
1766 *****************************************************************************/
1768{
1769 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
1770 static const enum wined3d_format_id formats[] =
1771 {
1775 };
1777 DWORD count = 0, i, outsize;
1778 HRESULT hr;
1779
1780 TRACE("iface %p, codes_count %p, codes %p.\n", iface, NumCodes, Codes);
1781
1783 {
1784 ERR("Failed to get display mode, hr %#lx.\n", hr);
1785 return hr;
1786 }
1787
1788 outsize = NumCodes && Codes ? *NumCodes : 0;
1789
1790 for (i = 0; i < ARRAY_SIZE(formats); ++i)
1791 {
1793 mode.format_id, 0, 0, WINED3D_RTYPE_TEXTURE_2D, formats[i])))
1794 {
1795 if (count < outsize)
1796 Codes[count] = formats[i];
1797 ++count;
1798 }
1799 }
1800 if(NumCodes) {
1801 TRACE("Returning %lu FourCC codes\n", count);
1802 *NumCodes = count;
1803 }
1804
1805 return DD_OK;
1806}
1807
1808static HRESULT WINAPI ddraw4_GetFourCCCodes(IDirectDraw4 *iface, DWORD *codes_count, DWORD *codes)
1809{
1810 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
1811
1812 TRACE("iface %p, codes_count %p, codes %p.\n", iface, codes_count, codes);
1813
1814 return ddraw7_GetFourCCCodes(&ddraw->IDirectDraw7_iface, codes_count, codes);
1815}
1816
1817static HRESULT WINAPI ddraw2_GetFourCCCodes(IDirectDraw2 *iface, DWORD *codes_count, DWORD *codes)
1818{
1819 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
1820
1821 TRACE("iface %p, codes_count %p, codes %p.\n", iface, codes_count, codes);
1822
1823 return ddraw7_GetFourCCCodes(&ddraw->IDirectDraw7_iface, codes_count, codes);
1824}
1825
1826static HRESULT WINAPI ddraw1_GetFourCCCodes(IDirectDraw *iface, DWORD *codes_count, DWORD *codes)
1827{
1828 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
1829
1830 TRACE("iface %p, codes_count %p, codes %p.\n", iface, codes_count, codes);
1831
1832 return ddraw7_GetFourCCCodes(&ddraw->IDirectDraw7_iface, codes_count, codes);
1833}
1834
1836{
1837 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
1839 HRESULT hr;
1840
1841 TRACE("iface %p, frequency %p.\n", iface, frequency);
1842
1846 if (FAILED(hr))
1847 {
1848 WARN("Failed to get display mode, hr %#lx.\n", hr);
1849 return hr;
1850 }
1851
1852 *frequency = mode.refresh_rate;
1853
1854 return DD_OK;
1855}
1856
1858{
1859 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
1860
1861 TRACE("iface %p, frequency %p.\n", iface, frequency);
1862
1864}
1865
1867{
1868 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
1869
1870 TRACE("iface %p, frequency %p.\n", iface, frequency);
1871
1873}
1874
1876{
1877 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
1878
1879 TRACE("iface %p, frequency %p.\n", iface, frequency);
1880
1882}
1883
1885{
1886 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
1887 struct wined3d_raster_status raster_status;
1888 HRESULT hr;
1889
1890 TRACE("iface %p, status %p.\n", iface, status);
1891
1892 if(!status)
1893 return DDERR_INVALIDPARAMS;
1894
1898 if (FAILED(hr))
1899 {
1900 WARN("Failed to get raster status, hr %#lx.\n", hr);
1901 return hr;
1902 }
1903
1904 *status = raster_status.in_vblank;
1905
1906 return DD_OK;
1907}
1908
1910{
1911 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
1912
1913 TRACE("iface %p, status %p.\n", iface, status);
1914
1916}
1917
1919{
1920 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
1921
1922 TRACE("iface %p, status %p.\n", iface, status);
1923
1925}
1926
1928{
1929 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
1930
1931 TRACE("iface %p, status %p.\n", iface, status);
1932
1934}
1935
1936/*****************************************************************************
1937 * IDirectDraw7::GetAvailableVidMem
1938 *
1939 * Returns the total and free video memory
1940 *
1941 * Params:
1942 * caps: Specifies the memory type asked for
1943 * total: Pointer to a DWORD to be filled with the total memory
1944 * free: Pointer to a DWORD to be filled with the free memory
1945 *
1946 * Returns
1947 * DD_OK on success
1948 * DDERR_INVALIDPARAMS if free and total are NULL
1949 *
1950 *****************************************************************************/
1952 DWORD *free)
1953{
1954 unsigned int framebuffer_size, total_vidmem, free_vidmem;
1955 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
1957 HRESULT hr = DD_OK;
1958
1959 TRACE("iface %p, caps %p, total %p, free %p.\n", iface, caps, total, free);
1960
1961 if (!total && !free)
1962 return DDERR_INVALIDPARAMS;
1963
1964 if (TRACE_ON(ddraw))
1965 {
1966 TRACE("Asked for memory with description: ");
1967 DDRAW_dump_DDSCAPS2(caps);
1968 }
1970
1971 /* Todo: System memory vs local video memory vs non-local video memory
1972 * The MSDN also mentions differences between texture memory and other
1973 * resources, but that's not important
1974 */
1975
1976 /* Some applications (e.g. 3DMark 2000) assume that the reported amount of
1977 * video memory doesn't include the memory used by the default framebuffer.
1978 */
1980 {
1981 WARN("Failed to get display mode, hr %#lx.\n", hr);
1983 return hr;
1984 }
1986 mode.format_id, mode.width);
1987 framebuffer_size *= mode.height;
1988
1989 if (free)
1990 {
1992 *free = framebuffer_size > free_vidmem ? 0 : free_vidmem - framebuffer_size;
1993 TRACE("Free video memory %#lx.\n", *free);
1994 }
1995
1996 if (total)
1997 {
1998 struct wined3d_adapter_identifier desc = {0};
1999
2001 total_vidmem = min(UINT_MAX, desc.video_memory);
2002 *total = framebuffer_size > total_vidmem ? 0 : total_vidmem - framebuffer_size;
2003 TRACE("Total video memory %#lx.\n", *total);
2004 }
2005
2007
2008 return hr;
2009}
2010
2011static HRESULT WINAPI ddraw4_GetAvailableVidMem(IDirectDraw4 *iface,
2012 DDSCAPS2 *caps, DWORD *total, DWORD *free)
2013{
2014 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2015
2016 TRACE("iface %p, caps %p, total %p, free %p.\n", iface, caps, total, free);
2017
2019}
2020
2021static HRESULT WINAPI ddraw2_GetAvailableVidMem(IDirectDraw2 *iface,
2022 DDSCAPS *caps, DWORD *total, DWORD *free)
2023{
2024 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
2025 DDSCAPS2 caps2;
2026
2027 TRACE("iface %p, caps %p, total %p, free %p.\n", iface, caps, total, free);
2028
2029 DDRAW_Convert_DDSCAPS_1_To_2(caps, &caps2);
2031}
2032
2033/*****************************************************************************
2034 * IDirectDraw7::Initialize
2035 *
2036 * Initializes a DirectDraw interface.
2037 *
2038 * Params:
2039 * GUID: Interface identifier. Well, don't know what this is really good
2040 * for
2041 *
2042 * Returns
2043 * Returns DD_OK on the first call,
2044 * DDERR_ALREADYINITIALIZED on repeated calls
2045 *
2046 *****************************************************************************/
2048{
2049 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
2050
2051 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
2052
2055
2056 /* FIXME: To properly take the GUID into account we should call
2057 * ddraw_init() here instead of in DDRAW_Create(). */
2058 if (guid)
2059 FIXME("Ignoring guid %s.\n", debugstr_guid(guid));
2060
2062 return DD_OK;
2063}
2064
2065static HRESULT WINAPI ddraw4_Initialize(IDirectDraw4 *iface, GUID *guid)
2066{
2067 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2068
2069 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
2070
2072}
2073
2074static HRESULT WINAPI ddraw2_Initialize(IDirectDraw2 *iface, GUID *guid)
2075{
2076 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
2077
2078 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
2079
2081}
2082
2083static HRESULT WINAPI ddraw1_Initialize(IDirectDraw *iface, GUID *guid)
2084{
2085 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
2086
2087 TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
2088
2090}
2091
2092static HRESULT WINAPI d3d1_Initialize(IDirect3D *iface, REFIID riid)
2093{
2094 TRACE("iface %p, riid %s.\n", iface, debugstr_guid(riid));
2095
2097}
2098
2099/*****************************************************************************
2100 * IDirectDraw7::FlipToGDISurface
2101 *
2102 * "Makes the surface that the GDI writes to the primary surface"
2103 * Looks like some windows specific thing we don't have to care about.
2104 * According to MSDN it permits GDI dialog boxes in FULLSCREEN mode. Good to
2105 * show error boxes ;)
2106 * Well, just return DD_OK.
2107 *
2108 * Returns:
2109 * Always returns DD_OK
2110 *
2111 *****************************************************************************/
2113{
2114 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
2116 struct ddraw_surface *gdi_impl;
2117 HRESULT hr;
2118
2119 TRACE("iface %p.\n", iface);
2120
2122
2123 if (FAILED(hr = IDirectDraw7_GetGDISurface(iface, &gdi_surface)))
2124 {
2125 WARN("Failed to retrieve GDI surface, hr %#lx.\n", hr);
2127 return hr;
2128 }
2129
2130 gdi_impl = impl_from_IDirectDrawSurface7(gdi_surface);
2132 hr = DD_OK;
2133 else
2134 hr = IDirectDrawSurface7_Flip(&ddraw->primary->IDirectDrawSurface7_iface, gdi_surface, DDFLIP_WAIT);
2135 IDirectDrawSurface7_Release(gdi_surface);
2136
2138
2139 return hr;
2140}
2141
2142static HRESULT WINAPI ddraw4_FlipToGDISurface(IDirectDraw4 *iface)
2143{
2144 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2145
2146 TRACE("iface %p.\n", iface);
2147
2149}
2150
2151static HRESULT WINAPI ddraw2_FlipToGDISurface(IDirectDraw2 *iface)
2152{
2153 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
2154
2155 TRACE("iface %p.\n", iface);
2156
2158}
2159
2160static HRESULT WINAPI ddraw1_FlipToGDISurface(IDirectDraw *iface)
2161{
2162 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
2163
2164 TRACE("iface %p.\n", iface);
2165
2167}
2168
2169/*****************************************************************************
2170 * IDirectDraw7::WaitForVerticalBlank
2171 *
2172 * This method allows applications to get in sync with the vertical blank
2173 * interval.
2174 * The wormhole demo in the DirectX 7 sdk uses this call, and it doesn't
2175 * redraw the screen, most likely because of this stub
2176 *
2177 * Parameters:
2178 * Flags: one of DDWAITVB_BLOCKBEGIN, DDWAITVB_BLOCKBEGINEVENT
2179 * or DDWAITVB_BLOCKEND
2180 * h: Not used, according to MSDN
2181 *
2182 * Returns:
2183 * Always returns DD_OK
2184 *
2185 *****************************************************************************/
2187{
2188 static BOOL hide;
2189
2190 TRACE("iface %p, flags %#lx, event %p.\n", iface, Flags, event);
2191
2192 /* This function is called often, so print the fixme only once */
2193 if(!hide)
2194 {
2195 FIXME("iface %p, flags %#lx, event %p stub!\n", iface, Flags, event);
2196 hide = TRUE;
2197 }
2198
2199 /* MSDN says DDWAITVB_BLOCKBEGINEVENT is not supported */
2201 return DDERR_UNSUPPORTED; /* unchecked */
2202
2203 return DD_OK;
2204}
2205
2207{
2208 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2209
2210 TRACE("iface %p, flags %#lx, event %p.\n", iface, flags, event);
2211
2213}
2214
2216{
2217 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
2218
2219 TRACE("iface %p, flags %#lx, event %p.\n", iface, flags, event);
2220
2222}
2223
2225{
2226 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
2227
2228 TRACE("iface %p, flags %#lx, event %p.\n", iface, flags, event);
2229
2231}
2232
2234{
2235 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
2236 struct wined3d_raster_status raster_status;
2237 HRESULT hr;
2238
2239 TRACE("iface %p, line %p.\n", iface, Scanline);
2240
2244 if (FAILED(hr))
2245 {
2246 WARN("Failed to get raster status, hr %#lx.\n", hr);
2247 return hr;
2248 }
2249
2250 *Scanline = raster_status.scan_line;
2251
2252 if (raster_status.in_vblank)
2254
2255 return DD_OK;
2256}
2257
2258static HRESULT WINAPI ddraw4_GetScanLine(IDirectDraw4 *iface, DWORD *line)
2259{
2260 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2261
2262 TRACE("iface %p, line %p.\n", iface, line);
2263
2265}
2266
2267static HRESULT WINAPI ddraw2_GetScanLine(IDirectDraw2 *iface, DWORD *line)
2268{
2269 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
2270
2271 TRACE("iface %p, line %p.\n", iface, line);
2272
2274}
2275
2276static HRESULT WINAPI ddraw1_GetScanLine(IDirectDraw *iface, DWORD *line)
2277{
2278 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
2279
2280 TRACE("iface %p, line %p.\n", iface, line);
2281
2283}
2284
2286{
2287 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
2288
2289 TRACE("iface %p.\n", iface);
2290
2292}
2293
2294static HRESULT WINAPI ddraw4_TestCooperativeLevel(IDirectDraw4 *iface)
2295{
2296 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2297
2298 TRACE("iface %p.\n", iface);
2299
2301}
2302
2303/*****************************************************************************
2304 * IDirectDraw7::GetGDISurface
2305 *
2306 * Returns the surface that GDI is treating as the primary surface.
2307 * For Wine this is the front buffer
2308 *
2309 * Params:
2310 * GDISurface: Address to write the surface pointer to
2311 *
2312 * Returns:
2313 * DD_OK if the surface was found
2314 * DDERR_NOTFOUND if the GDI surface wasn't found
2315 *
2316 *****************************************************************************/
2318{
2319 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
2321
2322 TRACE("iface %p, surface %p.\n", iface, surface);
2323
2325
2327 {
2328 WARN("GDI surface not available.\n");
2329 *surface = NULL;
2331 return DDERR_NOTFOUND;
2332 }
2334 IDirectDrawSurface7_AddRef(*surface);
2335
2337
2338 return DD_OK;
2339}
2340
2341static HRESULT WINAPI ddraw4_GetGDISurface(IDirectDraw4 *iface, IDirectDrawSurface4 **surface)
2342{
2343 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2344 struct ddraw_surface *surface_impl;
2345 IDirectDrawSurface7 *surface7;
2346 HRESULT hr;
2347
2348 TRACE("iface %p, surface %p.\n", iface, surface);
2349
2351 if (FAILED(hr))
2352 {
2353 *surface = NULL;
2354 return hr;
2355 }
2356 surface_impl = impl_from_IDirectDrawSurface7(surface7);
2357 *surface = &surface_impl->IDirectDrawSurface4_iface;
2358 IDirectDrawSurface4_AddRef(*surface);
2359 IDirectDrawSurface7_Release(surface7);
2360
2361 return hr;
2362}
2363
2364static HRESULT WINAPI ddraw2_GetGDISurface(IDirectDraw2 *iface, IDirectDrawSurface **surface)
2365{
2366 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
2367 struct ddraw_surface *surface_impl;
2368 IDirectDrawSurface7 *surface7;
2369 HRESULT hr;
2370
2371 TRACE("iface %p, surface %p.\n", iface, surface);
2372
2374 if (FAILED(hr))
2375 {
2376 *surface = NULL;
2377 return hr;
2378 }
2379 surface_impl = impl_from_IDirectDrawSurface7(surface7);
2380 *surface = &surface_impl->IDirectDrawSurface_iface;
2381 IDirectDrawSurface_AddRef(*surface);
2382 IDirectDrawSurface7_Release(surface7);
2383
2384 return hr;
2385}
2386
2387static HRESULT WINAPI ddraw1_GetGDISurface(IDirectDraw *iface, IDirectDrawSurface **surface)
2388{
2389 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
2390 struct ddraw_surface *surface_impl;
2391 IDirectDrawSurface7 *surface7;
2392 HRESULT hr;
2393
2394 TRACE("iface %p, surface %p.\n", iface, surface);
2395
2397 if (FAILED(hr))
2398 {
2399 *surface = NULL;
2400 return hr;
2401 }
2402 surface_impl = impl_from_IDirectDrawSurface7(surface7);
2403 *surface = &surface_impl->IDirectDrawSurface_iface;
2404 IDirectDrawSurface_AddRef(*surface);
2405 IDirectDrawSurface7_Release(surface7);
2406
2407 return hr;
2408}
2409
2411{
2413 void *context;
2414};
2415
2417{
2418 struct displaymodescallback_context *cbcontext = context;
2420
2421 DDSD2_to_DDSD(surface_desc, &desc);
2422 return cbcontext->func(&desc, cbcontext->context);
2423}
2424
2425/*****************************************************************************
2426 * IDirectDraw7::EnumDisplayModes
2427 *
2428 * Enumerates the supported Display modes. The modes can be filtered with
2429 * the DDSD parameter.
2430 *
2431 * Params:
2432 * Flags: can be DDEDM_REFRESHRATES and DDEDM_STANDARDVGAMODES. For old ddraw
2433 * versions (3 and older?) this is reserved and must be 0.
2434 * DDSD: Surface description to filter the modes
2435 * Context: Pointer passed back to the callback function
2436 * cb: Application-provided callback function
2437 *
2438 * Returns:
2439 * DD_OK on success
2440 * DDERR_INVALIDPARAMS if the callback wasn't set
2441 *
2442 *****************************************************************************/
2445{
2446 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
2447 struct wined3d_display_mode *enum_modes = NULL;
2449 unsigned int modenum, fmt;
2450 DDSURFACEDESC2 callback_sd;
2451 unsigned enum_mode_count = 0, enum_mode_array_size = 16;
2453
2454 static const enum wined3d_format_id checkFormatList[] =
2455 {
2459 };
2460
2461 TRACE("iface %p, flags %#lx, surface_desc %p, context %p, callback %p.\n",
2462 iface, Flags, DDSD, Context, cb);
2463
2464 if (!cb)
2465 return DDERR_INVALIDPARAMS;
2466
2467 if (!(enum_modes = malloc(enum_mode_array_size * sizeof(*enum_modes))))
2468 return DDERR_OUTOFMEMORY;
2469
2471
2472 pixelformat.dwSize = sizeof(pixelformat);
2473 for(fmt = 0; fmt < ARRAY_SIZE(checkFormatList); fmt++)
2474 {
2475 modenum = 0;
2476 while (wined3d_output_get_mode(ddraw->wined3d_output, checkFormatList[fmt],
2477 WINED3D_SCANLINE_ORDERING_UNKNOWN, modenum++, &mode, false) == WINED3D_OK)
2478 {
2479 BOOL found = FALSE;
2480 unsigned i;
2481
2483 if (DDSD)
2484 {
2485 if (DDSD->dwFlags & DDSD_WIDTH && mode.width != DDSD->dwWidth)
2486 continue;
2487 if (DDSD->dwFlags & DDSD_HEIGHT && mode.height != DDSD->dwHeight)
2488 continue;
2489 if (DDSD->dwFlags & DDSD_REFRESHRATE && mode.refresh_rate != DDSD->dwRefreshRate)
2490 continue;
2491 if (DDSD->dwFlags & DDSD_PIXELFORMAT
2492 && pixelformat.dwRGBBitCount != DDSD->ddpfPixelFormat.dwRGBBitCount)
2493 continue;
2494 }
2495
2496 /* DX docs state EnumDisplayMode should return only unique modes */
2497 for (i = 0; i < enum_mode_count; i++)
2498 {
2499 if (enum_modes[i].width == mode.width && enum_modes[i].height == mode.height
2500 && enum_modes[i].format_id == mode.format_id
2501 && (enum_modes[i].refresh_rate == mode.refresh_rate || !(Flags & DDEDM_REFRESHRATES)))
2502 {
2503 found = TRUE;
2504 break;
2505 }
2506 }
2507 if(found) continue;
2508
2509 memset(&callback_sd, 0, sizeof(callback_sd));
2510 callback_sd.dwSize = sizeof(callback_sd);
2511 callback_sd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
2512
2515 callback_sd.dwRefreshRate = mode.refresh_rate;
2516
2517 callback_sd.dwWidth = mode.width;
2518 callback_sd.dwHeight = mode.height;
2519
2520 callback_sd.ddpfPixelFormat=pixelformat;
2521
2522 /* Calc pitch and DWORD align like MSDN says */
2523 callback_sd.lPitch = (callback_sd.ddpfPixelFormat.dwRGBBitCount / 8) * mode.width;
2524 callback_sd.lPitch = (callback_sd.lPitch + 3) & ~3;
2525
2526 TRACE("Enumerating %lux%lux%lu @%lu\n", callback_sd.dwWidth, callback_sd.dwHeight, callback_sd.ddpfPixelFormat.dwRGBBitCount,
2527 callback_sd.dwRefreshRate);
2528
2529 if(cb(&callback_sd, Context) == DDENUMRET_CANCEL)
2530 {
2531 TRACE("Application asked to terminate the enumeration\n");
2532 free(enum_modes);
2534 return DD_OK;
2535 }
2536
2537 if (enum_mode_count == enum_mode_array_size)
2538 {
2539 struct wined3d_display_mode *new_enum_modes;
2540
2541 enum_mode_array_size *= 2;
2542 if (!(new_enum_modes = realloc(enum_modes, enum_mode_array_size * sizeof(*new_enum_modes))))
2543 {
2544 free(enum_modes);
2546 return DDERR_OUTOFMEMORY;
2547 }
2548
2549 enum_modes = new_enum_modes;
2550 }
2551 enum_modes[enum_mode_count++] = mode;
2552 }
2553 }
2554
2555 TRACE("End of enumeration\n");
2556 free(enum_modes);
2558
2559 return DD_OK;
2560}
2561
2564{
2565 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2566
2567 TRACE("iface %p, flags %#lx, surface_desc %p, context %p, callback %p.\n",
2568 iface, flags, surface_desc, context, callback);
2569
2571}
2572
2575{
2576 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
2577 struct displaymodescallback_context cbcontext;
2578 DDSURFACEDESC2 surface_desc2;
2579
2580 TRACE("iface %p, flags %#lx, surface_desc %p, context %p, callback %p.\n",
2581 iface, flags, surface_desc, context, callback);
2582
2583 cbcontext.func = callback;
2584 cbcontext.context = context;
2585
2586 if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2);
2588 surface_desc ? &surface_desc2 : NULL, &cbcontext, EnumDisplayModesCallbackThunk);
2589}
2590
2593{
2594 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
2595 struct displaymodescallback_context cbcontext;
2596 DDSURFACEDESC2 surface_desc2;
2597
2598 TRACE("iface %p, flags %#lx, surface_desc %p, context %p, callback %p.\n",
2599 iface, flags, surface_desc, context, callback);
2600
2601 cbcontext.func = callback;
2602 cbcontext.context = context;
2603
2604 if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2);
2606 surface_desc ? &surface_desc2 : NULL, &cbcontext, EnumDisplayModesCallbackThunk);
2607}
2608
2609/*****************************************************************************
2610 * IDirectDraw7::EvaluateMode
2611 *
2612 * Used with IDirectDraw7::StartModeTest to test video modes.
2613 * EvaluateMode is used to pass or fail a mode, and continue with the next
2614 * mode
2615 *
2616 * Params:
2617 * Flags: DDEM_MODEPASSED or DDEM_MODEFAILED
2618 * Timeout: Returns the amount of seconds left before the mode would have
2619 * been failed automatically
2620 *
2621 * Returns:
2622 * This implementation always DD_OK, because it's a stub
2623 *
2624 *****************************************************************************/
2626{
2627 FIXME("iface %p, flags %#lx, timeout %p stub!\n", iface, Flags, Timeout);
2628
2629 /* When implementing this, implement it in WineD3D */
2630
2631 return DD_OK;
2632}
2633
2634/*****************************************************************************
2635 * IDirectDraw7::GetDeviceIdentifier
2636 *
2637 * Returns the device identifier, which gives information about the driver
2638 * Our device identifier is defined at the beginning of this file.
2639 *
2640 * Params:
2641 * DDDI: Address for the returned structure
2642 * Flags: Can be DDGDI_GETHOSTIDENTIFIER
2643 *
2644 * Returns:
2645 * On success it returns DD_OK
2646 * DDERR_INVALIDPARAMS if DDDI is NULL
2647 *
2648 *****************************************************************************/
2651{
2652 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
2653 struct wined3d_adapter_identifier adapter_id;
2654 HRESULT hr = S_OK;
2655
2656 TRACE("iface %p, device_identifier %p, flags %#lx.\n", iface, DDDI, Flags);
2657
2658 if (!DDDI)
2659 return DDERR_INVALIDPARAMS;
2660
2662 {
2663 /* The DDGDI_GETHOSTIDENTIFIER returns the information about the 2D
2664 * host adapter, if there's a secondary 3D adapter. This doesn't apply
2665 * to any modern hardware, nor is it interesting for Wine, so ignore it.
2666 * Size of DDDEVICEIDENTIFIER2 may be aligned to 8 bytes and thus 4
2667 * bytes too long. So only copy the relevant part of the structure
2668 */
2669
2670 memcpy(DDDI, &deviceidentifier, FIELD_OFFSET(DDDEVICEIDENTIFIER2, dwWHQLLevel) + sizeof(DWORD));
2671 return DD_OK;
2672 }
2673
2674 /* Drakan: Order of the Flame expects accurate D3D device information from ddraw */
2675 adapter_id.driver = DDDI->szDriver;
2676 adapter_id.driver_size = sizeof(DDDI->szDriver);
2677 adapter_id.description = DDDI->szDescription;
2678 adapter_id.description_size = sizeof(DDDI->szDescription);
2682 if (FAILED(hr)) return hr;
2683
2684 DDDI->liDriverVersion = adapter_id.driver_version;
2685 DDDI->dwVendorId = adapter_id.vendor_id;
2686 DDDI->dwDeviceId = adapter_id.device_id;
2687 DDDI->dwSubSysId = adapter_id.subsystem_id;
2688 DDDI->dwRevision = adapter_id.revision;
2689 DDDI->guidDeviceIdentifier = adapter_id.device_identifier;
2690 DDDI->dwWHQLLevel = adapter_id.whql_level;
2691 return DD_OK;
2692}
2693
2694static HRESULT WINAPI ddraw4_GetDeviceIdentifier(IDirectDraw4 *iface,
2695 DDDEVICEIDENTIFIER *identifier, DWORD flags)
2696{
2697 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2698 DDDEVICEIDENTIFIER2 identifier2;
2699 HRESULT hr;
2700
2701 TRACE("iface %p, identifier %p, flags %#lx.\n", iface, identifier, flags);
2702
2704 DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&identifier2, identifier);
2705
2706 return hr;
2707}
2708
2709/*****************************************************************************
2710 * IDirectDraw7::GetSurfaceFromDC
2711 *
2712 * Returns the Surface for a GDI device context handle.
2713 * Is this related to IDirectDrawSurface::GetDC ???
2714 *
2715 * Params:
2716 * hdc: hdc to return the surface for
2717 * Surface: Address to write the surface pointer to
2718 *
2719 * Returns:
2720 * Always returns DD_OK because it's a stub
2721 *
2722 *****************************************************************************/
2724 HDC dc, IDirectDrawSurface7 **surface)
2725{
2726 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
2727 struct ddraw_surface *surface_impl;
2728
2729 TRACE("iface %p, dc %p, surface %p.\n", iface, dc, surface);
2730
2731 if (!surface)
2732 return E_INVALIDARG;
2733
2734 if (!dc)
2735 goto done;
2736
2739 {
2740 if (surface_impl->dc != dc)
2741 continue;
2742
2743 TRACE("Found surface %p for dc %p.\n", surface_impl, dc);
2744 *surface = &surface_impl->IDirectDrawSurface7_iface;
2745 IDirectDrawSurface7_AddRef(*surface);
2747 return DD_OK;
2748 }
2750
2751done:
2752 TRACE("No surface found for dc %p.\n", dc);
2753 *surface = NULL;
2754 return DDERR_NOTFOUND;
2755}
2756
2757static HRESULT WINAPI ddraw4_GetSurfaceFromDC(IDirectDraw4 *iface, HDC dc,
2758 IDirectDrawSurface4 **surface)
2759{
2760 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2761 struct ddraw_surface *surface_impl;
2762 IDirectDrawSurface7 *surface7;
2763 HRESULT hr;
2764
2765 TRACE("iface %p, dc %p, surface %p.\n", iface, dc, surface);
2766
2767 if (!surface) return E_INVALIDARG;
2768
2770 if (FAILED(hr))
2771 {
2772 *surface = NULL;
2773 return hr;
2774 }
2775 surface_impl = impl_from_IDirectDrawSurface7(surface7);
2776 /* Tests say this is true */
2777 *surface = (IDirectDrawSurface4 *)&surface_impl->IDirectDrawSurface_iface;
2778 IDirectDrawSurface_AddRef(&surface_impl->IDirectDrawSurface_iface);
2779 IDirectDrawSurface7_Release(surface7);
2780
2781 return hr;
2782}
2783
2785{
2786 IDirectDrawSurface_Restore(surface);
2787 IDirectDrawSurface_Release(surface);
2788
2789 return DDENUMRET_OK;
2790}
2791
2793{
2794 TRACE("iface %p.\n", iface);
2795
2796 return IDirectDraw7_EnumSurfaces(iface, DDENUMSURFACES_ALL | DDENUMSURFACES_DOESEXIST,
2798}
2799
2800static HRESULT WINAPI ddraw4_RestoreAllSurfaces(IDirectDraw4 *iface)
2801{
2802 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2803
2804 TRACE("iface %p.\n", iface);
2805
2807}
2808
2809/*****************************************************************************
2810 * IDirectDraw7::StartModeTest
2811 *
2812 * Tests the specified video modes to update the system registry with
2813 * refresh rate information. StartModeTest starts the mode test,
2814 * EvaluateMode is used to fail or pass a mode. If EvaluateMode
2815 * isn't called within 15 seconds, the mode is failed automatically
2816 *
2817 * As refresh rates are handled by the X server, I don't think this
2818 * Method is important
2819 *
2820 * Params:
2821 * Modes: An array of mode specifications
2822 * NumModes: The number of modes in Modes
2823 * Flags: Some flags...
2824 *
2825 * Returns:
2826 * Returns DDERR_TESTFINISHED if flags contains DDSMT_ISTESTREQUIRED,
2827 * if no modes are passed, DDERR_INVALIDPARAMS is returned,
2828 * otherwise DD_OK
2829 *
2830 *****************************************************************************/
2832{
2833 FIXME("iface %p, modes %p, mode_count %lu, flags %#lx partial stub!\n",
2834 iface, Modes, NumModes, Flags);
2835
2836 /* This looks sane */
2837 if( (!Modes) || (NumModes == 0) ) return DDERR_INVALIDPARAMS;
2838
2839 /* DDSMT_ISTESTREQUIRED asks if a mode test is necessary.
2840 * As it is not, DDERR_TESTFINISHED is returned
2841 * (hopefully that's correct
2842 *
2843 if(Flags & DDSMT_ISTESTREQUIRED) return DDERR_TESTFINISHED;
2844 * well, that value doesn't (yet) exist in the wine headers, so ignore it
2845 */
2846
2847 return DD_OK;
2848}
2849
2851 IDirectDrawSurface7 **surface, IUnknown *outer_unknown)
2852{
2853 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
2854 struct ddraw_surface *impl;
2855 HRESULT hr;
2856
2857 TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n",
2858 iface, surface_desc, surface, outer_unknown);
2859
2861
2863 {
2864 WARN("Cooperative level not set.\n");
2867 }
2868
2869 if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC2))
2870 {
2871 WARN("Application supplied invalid surface descriptor\n");
2873 return DDERR_INVALIDPARAMS;
2874 }
2875
2876 __TRY
2877 {
2878 *surface = NULL;
2879 }
2881 {
2882 WARN("Surface pointer %p is invalid.\n", surface);
2884 return DDERR_INVALIDPARAMS;
2885 }
2886 __ENDTRY;
2887
2889 {
2890 if (TRACE_ON(ddraw))
2891 {
2892 TRACE(" (%p) Requesting surface desc :\n", iface);
2894 }
2895
2896 WARN("Application tried to create an explicit front or back buffer\n");
2898 return DDERR_INVALIDCAPS;
2899 }
2900
2901 hr = ddraw_surface_create(ddraw, surface_desc, &impl, outer_unknown, 7);
2903 if (FAILED(hr))
2904 return hr;
2905
2906 *surface = &impl->IDirectDrawSurface7_iface;
2907 IDirectDraw7_AddRef(iface);
2908 impl->ifaceToRelease = (IUnknown *)iface;
2909
2910 return hr;
2911}
2912
2913static HRESULT WINAPI ddraw4_CreateSurface(IDirectDraw4 *iface,
2914 DDSURFACEDESC2 *surface_desc, IDirectDrawSurface4 **surface, IUnknown *outer_unknown)
2915{
2916 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
2917 struct ddraw_surface *impl;
2918 HRESULT hr;
2919
2920 TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n",
2921 iface, surface_desc, surface, outer_unknown);
2922
2924
2926 {
2927 WARN("Cooperative level not set.\n");
2930 }
2931
2932 if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC2))
2933 {
2934 WARN("Application supplied invalid surface descriptor\n");
2936 return DDERR_INVALIDPARAMS;
2937 }
2938
2939 __TRY
2940 {
2941 *surface = NULL;
2942 }
2944 {
2945 WARN("Surface pointer %p is invalid.\n", surface);
2947 return DDERR_INVALIDPARAMS;
2948 }
2949 __ENDTRY;
2950
2952 {
2953 if (TRACE_ON(ddraw))
2954 {
2955 TRACE(" (%p) Requesting surface desc :\n", iface);
2957 }
2958
2959 WARN("Application tried to create an explicit front or back buffer\n");
2961 return DDERR_INVALIDCAPS;
2962 }
2963
2964 hr = ddraw_surface_create(ddraw, surface_desc, &impl, outer_unknown, 4);
2966 if (FAILED(hr))
2967 return hr;
2968
2969 *surface = &impl->IDirectDrawSurface4_iface;
2970 IDirectDraw4_AddRef(iface);
2971 impl->ifaceToRelease = (IUnknown *)iface;
2972
2973 return hr;
2974}
2975
2976static HRESULT WINAPI ddraw2_CreateSurface(IDirectDraw2 *iface,
2977 DDSURFACEDESC *surface_desc, IDirectDrawSurface **surface, IUnknown *outer_unknown)
2978{
2979 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
2980 struct ddraw_surface *impl;
2981 HRESULT hr;
2982 DDSURFACEDESC2 surface_desc2;
2983
2984 TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n",
2985 iface, surface_desc, surface, outer_unknown);
2986
2988
2990 {
2991 WARN("Cooperative level not set.\n");
2994 }
2995
2996 if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC))
2997 {
2998 WARN("Application supplied invalid surface descriptor\n");
3000 return DDERR_INVALIDPARAMS;
3001 }
3002
3003 __TRY
3004 {
3005 *surface = NULL;
3006 }
3008 {
3009 WARN("Surface pointer %p is invalid.\n", surface);
3011 return DDERR_INVALIDPARAMS;
3012 }
3013 __ENDTRY;
3014
3015 DDSD_to_DDSD2(surface_desc, &surface_desc2);
3017 {
3018 if (TRACE_ON(ddraw))
3019 {
3020 TRACE(" (%p) Requesting surface desc :\n", iface);
3022 }
3023
3024 WARN("Application tried to create an explicit front or back buffer\n");
3026 return DDERR_INVALIDCAPS;
3027 }
3028
3029 hr = ddraw_surface_create(ddraw, &surface_desc2, &impl, outer_unknown, 2);
3031 if (FAILED(hr))
3032 return hr;
3033
3034 *surface = &impl->IDirectDrawSurface_iface;
3035 impl->ifaceToRelease = NULL;
3036
3037 return hr;
3038}
3039
3040static HRESULT WINAPI ddraw1_CreateSurface(IDirectDraw *iface,
3041 DDSURFACEDESC *surface_desc, IDirectDrawSurface **surface, IUnknown *outer_unknown)
3042{
3043 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
3044 struct ddraw_surface *impl;
3045 HRESULT hr;
3046 DDSURFACEDESC2 surface_desc2;
3047
3048 TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n",
3049 iface, surface_desc, surface, outer_unknown);
3050
3052
3054 {
3055 WARN("Cooperative level not set.\n");
3058 }
3059
3060 if(surface_desc == NULL || surface_desc->dwSize != sizeof(DDSURFACEDESC))
3061 {
3062 WARN("Application supplied invalid surface descriptor\n");
3064 return DDERR_INVALIDPARAMS;
3065 }
3066
3067 __TRY
3068 {
3069 *surface = NULL;
3070 }
3072 {
3073 WARN("Surface pointer %p is invalid.\n", surface);
3075 return DDERR_INVALIDPARAMS;
3076 }
3077 __ENDTRY;
3078
3083 {
3084 WARN("Application tried to create an explicit front or back buffer.\n");
3086 return DDERR_INVALIDCAPS;
3087 }
3088
3089 DDSD_to_DDSD2(surface_desc, &surface_desc2);
3090 hr = ddraw_surface_create(ddraw, &surface_desc2, &impl, outer_unknown, 1);
3092 if (FAILED(hr))
3093 return hr;
3094
3095 *surface = &impl->IDirectDrawSurface_iface;
3096 impl->ifaceToRelease = NULL;
3097
3098 return hr;
3099}
3100
3101static BOOL
3103 const DDPIXELFORMAT *provided)
3104{
3105 /* Some flags must be present in both or neither for a match. */
3106 static const DWORD must_match = DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2
3109
3110 if ((requested->dwFlags & provided->dwFlags) != requested->dwFlags)
3111 return FALSE;
3112
3113 if ((requested->dwFlags & must_match) != (provided->dwFlags & must_match))
3114 return FALSE;
3115
3116 if (requested->dwFlags & DDPF_FOURCC)
3117 if (requested->dwFourCC != provided->dwFourCC)
3118 return FALSE;
3119
3122 if (requested->dwRGBBitCount != provided->dwRGBBitCount)
3123 return FALSE;
3124
3127 if (requested->dwRBitMask != provided->dwRBitMask)
3128 return FALSE;
3129
3131 if (requested->dwGBitMask != provided->dwGBitMask)
3132 return FALSE;
3133
3134 /* I could be wrong about the bumpmapping. MSDN docs are vague. */
3136 |DDPF_BUMPDUDV))
3137 if (requested->dwBBitMask != provided->dwBBitMask)
3138 return FALSE;
3139
3140 if (requested->dwFlags & (DDPF_ALPHAPIXELS|DDPF_ZPIXELS))
3141 if (requested->dwRGBAlphaBitMask != provided->dwRGBAlphaBitMask)
3142 return FALSE;
3143
3144 return TRUE;
3145}
3146
3147static BOOL ddraw_match_surface_desc(const DDSURFACEDESC2 *requested, const DDSURFACEDESC2 *provided)
3148{
3149 struct compare_info
3150 {
3151 DWORD flag;
3153 size_t size;
3154 };
3155
3156#define CMP(FLAG, FIELD) \
3157 { DDSD_##FLAG, offsetof(DDSURFACEDESC2, FIELD), \
3158 sizeof(((DDSURFACEDESC2 *)(NULL))->FIELD) }
3159
3160 static const struct compare_info compare[] =
3161 {
3162 CMP(ALPHABITDEPTH, dwAlphaBitDepth),
3163 CMP(BACKBUFFERCOUNT, dwBackBufferCount),
3164 CMP(CAPS, ddsCaps),
3165 CMP(CKDESTBLT, ddckCKDestBlt),
3166 CMP(CKDESTOVERLAY, ddckCKDestOverlay),
3167 CMP(CKSRCBLT, ddckCKSrcBlt),
3168 CMP(CKSRCOVERLAY, ddckCKSrcOverlay),
3169 CMP(HEIGHT, dwHeight),
3170 CMP(LINEARSIZE, dwLinearSize),
3171 CMP(LPSURFACE, lpSurface),
3172 CMP(MIPMAPCOUNT, dwMipMapCount),
3173 CMP(PITCH, lPitch),
3174 /* PIXELFORMAT: manual */
3175 CMP(REFRESHRATE, dwRefreshRate),
3176 CMP(TEXTURESTAGE, dwTextureStage),
3177 CMP(WIDTH, dwWidth),
3178 /* ZBUFFERBITDEPTH: "obsolete" */
3179 };
3180
3181#undef CMP
3182
3183 unsigned int i;
3184
3185 if ((requested->dwFlags & provided->dwFlags) != requested->dwFlags)
3186 return FALSE;
3187
3188 for (i=0; i < ARRAY_SIZE(compare); i++)
3189 {
3190 if (requested->dwFlags & compare[i].flag
3191 && memcmp((const char *)provided + compare[i].offset,
3192 (const char *)requested + compare[i].offset,
3193 compare[i].size) != 0)
3194 return FALSE;
3195 }
3196
3197 if (requested->dwFlags & DDSD_PIXELFORMAT)
3198 {
3200 &provided->ddpfPixelFormat))
3201 return FALSE;
3202 }
3203
3204 return TRUE;
3205}
3206
3208{
3210 void *context;
3211};
3212
3214{
3216 void *context;
3217};
3218
3220 DDSURFACEDESC2 *surface_desc, void *context)
3221{
3222 struct ddraw_surface *surface_impl = impl_from_IDirectDrawSurface7(surface);
3223 struct surfacescallback2_context *cbcontext = context;
3224
3225 if (!surface)
3226 return cbcontext->func(NULL, surface_desc, cbcontext->context);
3227
3228 IDirectDrawSurface4_AddRef(&surface_impl->IDirectDrawSurface4_iface);
3229 IDirectDrawSurface7_Release(surface);
3230
3231 return cbcontext->func(&surface_impl->IDirectDrawSurface4_iface,
3232 surface_desc, cbcontext->context);
3233}
3234
3236 DDSURFACEDESC2 *surface_desc, void *context)
3237{
3238 struct ddraw_surface *surface_impl = impl_from_IDirectDrawSurface7(surface);
3239 struct surfacescallback_context *cbcontext = context;
3240
3241 if (!surface)
3242 return cbcontext->func(NULL, (DDSURFACEDESC *)surface_desc, cbcontext->context);
3243
3244 IDirectDrawSurface_AddRef(&surface_impl->IDirectDrawSurface_iface);
3245 IDirectDrawSurface7_Release(surface);
3246
3247 return cbcontext->func(&surface_impl->IDirectDrawSurface_iface,
3248 (DDSURFACEDESC *)surface_desc, cbcontext->context);
3249}
3250
3252{
3256 void *context;
3257};
3258
3260{
3261 const struct enum_surface_mode_params *params = context;
3262 DDSURFACEDESC2 desc = *params->desc;
3263 IDirectDrawSurface7 *surface;
3264
3266 desc.dwWidth = surface_desc->dwWidth;
3267 desc.dwHeight = surface_desc->dwHeight;
3268 desc.lPitch = surface_desc->lPitch;
3269 desc.ddpfPixelFormat = surface_desc->ddpfPixelFormat;
3270
3271 if (SUCCEEDED(ddraw7_CreateSurface(params->ddraw, &desc, &surface, NULL)))
3272 {
3273 IDirectDrawSurface7_Release(surface);
3274 return params->callback(NULL, &desc, params->context);
3275 }
3276 return DDENUMRET_OK;
3277}
3278
3279/*****************************************************************************
3280 * IDirectDraw7::EnumSurfaces
3281 *
3282 * Loops through all surfaces attached to this device and calls the
3283 * application callback. This can't be relayed to WineD3DDevice,
3284 * because some WineD3DSurfaces' parents are IParent objects
3285 *
3286 * Params:
3287 * Flags: Some filtering flags. See IDirectDrawImpl_EnumSurfacesCallback
3288 * DDSD: Description to filter for
3289 * Context: Application-provided pointer, it's passed unmodified to the
3290 * Callback function
3291 * Callback: Address to call for each surface
3292 *
3293 * Returns:
3294 * DDERR_INVALIDPARAMS if the callback is NULL
3295 * DD_OK on success
3296 *
3297 *****************************************************************************/
3300{
3301 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
3302 HRESULT hr = DD_OK;
3303
3304 TRACE("iface %p, flags %#lx, surface_desc %p, context %p, callback %p.\n",
3305 iface, flags, surface_desc, context, callback);
3306
3307 if (!callback)
3308 return DDERR_INVALIDPARAMS;
3309
3311 {
3312 IDirectDrawSurface7 *surface;
3313
3315 return DDERR_INVALIDPARAMS;
3316
3318
3319 if (surface_desc->dwFlags & (DDSD_WIDTH | DDSD_HEIGHT))
3320 {
3321 if (SUCCEEDED(ddraw7_CreateSurface(iface, surface_desc, &surface, NULL)))
3322 {
3323 struct ddraw_surface *surface_impl = impl_from_IDirectDrawSurface7(surface);
3324 callback(NULL, &surface_impl->surface_desc, context);
3325 IDirectDrawSurface7_Release(surface);
3326 }
3327 }
3328 else
3329 {
3331 {
3332 .dwSize = sizeof(desc),
3335 };
3337 {
3338 .ddraw = iface,
3339 .desc = surface_desc,
3340 .callback = callback,
3341 .context = context,
3342 };
3344
3346 {
3347 ERR("Failed to get display mode, hr %#lx.\n", hr);
3349 return hr_ddraw_from_wined3d(hr);
3350 }
3351
3352 ddrawformat_from_wined3dformat(&desc.ddpfPixelFormat, mode.format_id);
3354 }
3355
3357 }
3359 {
3360 struct ddraw_surface *surface, *cursor;
3361 BOOL nomatch = !!(flags & DDENUMSURFACES_NOMATCH);
3362
3364
3365 /* Use the safe enumeration, as the callback may destroy surfaces. */
3367 {
3368 if (!surface->iface_count)
3369 {
3370 WARN("Not enumerating surface %p because it doesn't have any references.\n", surface);
3371 continue;
3372 }
3373
3375 || nomatch != ddraw_match_surface_desc(surface_desc, &surface->surface_desc))
3376 {
3377 DDSURFACEDESC2 desc = surface->surface_desc;
3378
3379 TRACE("Enumerating surface %p.\n", surface);
3380 IDirectDrawSurface7_AddRef(&surface->IDirectDrawSurface7_iface);
3382 break;
3383 }
3384 }
3385
3387 }
3388 else
3389 {
3390 return DDERR_INVALIDPARAMS;
3391 }
3392
3393 return hr;
3394}
3395
3396static HRESULT WINAPI ddraw4_EnumSurfaces(IDirectDraw4 *iface, DWORD flags,
3398{
3399 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
3400 struct surfacescallback2_context cbcontext;
3401
3402 TRACE("iface %p, flags %#lx, surface_desc %p, context %p, callback %p.\n",
3403 iface, flags, surface_desc, context, callback);
3404
3405 cbcontext.func = callback;
3406 cbcontext.context = context;
3407
3408 return ddraw7_EnumSurfaces(&ddraw->IDirectDraw7_iface, flags, surface_desc,
3409 &cbcontext, EnumSurfacesCallback2Thunk);
3410}
3411
3412static HRESULT WINAPI ddraw2_EnumSurfaces(IDirectDraw2 *iface, DWORD flags,
3414{
3415 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
3416 struct surfacescallback_context cbcontext;
3417 DDSURFACEDESC2 surface_desc2;
3418
3419 TRACE("iface %p, flags %#lx, surface_desc %p, context %p, callback %p.\n",
3420 iface, flags, surface_desc, context, callback);
3421
3422 cbcontext.func = callback;
3423 cbcontext.context = context;
3424
3425 if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2);
3427 surface_desc ? &surface_desc2 : NULL, &cbcontext, EnumSurfacesCallbackThunk);
3428}
3429
3430static HRESULT WINAPI ddraw1_EnumSurfaces(IDirectDraw *iface, DWORD flags,
3432{
3433 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
3434 struct surfacescallback_context cbcontext;
3435 DDSURFACEDESC2 surface_desc2;
3436
3437 TRACE("iface %p, flags %#lx, surface_desc %p, context %p, callback %p.\n",
3438 iface, flags, surface_desc, context, callback);
3439
3440 cbcontext.func = callback;
3441 cbcontext.context = context;
3442
3443 if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2);
3445 surface_desc ? &surface_desc2 : NULL, &cbcontext, EnumSurfacesCallbackThunk);
3446}
3447
3448/*****************************************************************************
3449 * DirectDrawCreateClipper (DDRAW.@)
3450 *
3451 * Creates a new IDirectDrawClipper object.
3452 *
3453 * Params:
3454 * Clipper: Address to write the interface pointer to
3455 * UnkOuter: For aggregation support, which ddraw doesn't have. Has to be
3456 * NULL
3457 *
3458 * Returns:
3459 * CLASS_E_NOAGGREGATION if UnkOuter != NULL
3460 * E_OUTOFMEMORY if allocating the object failed
3461 *
3462 *****************************************************************************/
3463HRESULT WINAPI DirectDrawCreateClipper(DWORD flags, IDirectDrawClipper **clipper, IUnknown *outer_unknown)
3464{
3465 struct ddraw_clipper *object;
3466 HRESULT hr;
3467
3468 TRACE("flags %#lx, clipper %p, outer_unknown %p.\n",
3469 flags, clipper, outer_unknown);
3470
3471 if (outer_unknown)
3472 return CLASS_E_NOAGGREGATION;
3473
3475
3476 if (!(object = calloc(1, sizeof(*object))))
3477 {
3479 return E_OUTOFMEMORY;
3480 }
3481
3482 hr = ddraw_clipper_init(object);
3483 if (FAILED(hr))
3484 {
3485 WARN("Failed to initialize clipper, hr %#lx.\n", hr);
3486 free(object);
3488 return hr;
3489 }
3490
3491 TRACE("Created clipper %p.\n", object);
3492 *clipper = &object->IDirectDrawClipper_iface;
3494
3495 return DD_OK;
3496}
3497
3498/*****************************************************************************
3499 * IDirectDraw7::CreateClipper
3500 *
3501 * Creates a DDraw clipper. See DirectDrawCreateClipper for details
3502 *
3503 *****************************************************************************/
3505 IDirectDrawClipper **Clipper, IUnknown *UnkOuter)
3506{
3507 TRACE("iface %p, flags %#lx, clipper %p, outer_unknown %p.\n",
3508 iface, Flags, Clipper, UnkOuter);
3509
3510 return DirectDrawCreateClipper(Flags, Clipper, UnkOuter);
3511}
3512
3513static HRESULT WINAPI ddraw4_CreateClipper(IDirectDraw4 *iface, DWORD flags,
3514 IDirectDrawClipper **clipper, IUnknown *outer_unknown)
3515{
3516 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
3517
3518 TRACE("iface %p, flags %#lx, clipper %p, outer_unknown %p.\n",
3519 iface, flags, clipper, outer_unknown);
3520
3521 return ddraw7_CreateClipper(&ddraw->IDirectDraw7_iface, flags, clipper, outer_unknown);
3522}
3523
3524static HRESULT WINAPI ddraw2_CreateClipper(IDirectDraw2 *iface,
3525 DWORD flags, IDirectDrawClipper **clipper, IUnknown *outer_unknown)
3526{
3527 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
3528
3529 TRACE("iface %p, flags %#lx, clipper %p, outer_unknown %p.\n",
3530 iface, flags, clipper, outer_unknown);
3531
3532 return ddraw7_CreateClipper(&ddraw->IDirectDraw7_iface, flags, clipper, outer_unknown);
3533}
3534
3535static HRESULT WINAPI ddraw1_CreateClipper(IDirectDraw *iface,
3536 DWORD flags, IDirectDrawClipper **clipper, IUnknown *outer_unknown)
3537{
3538 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
3539
3540 TRACE("iface %p, flags %#lx, clipper %p, outer_unknown %p.\n",
3541 iface, flags, clipper, outer_unknown);
3542
3543 return ddraw7_CreateClipper(&ddraw->IDirectDraw7_iface, flags, clipper, outer_unknown);
3544}
3545
3546/*****************************************************************************
3547 * IDirectDraw7::CreatePalette
3548 *
3549 * Creates a new IDirectDrawPalette object
3550 *
3551 * Params:
3552 * Flags: The flags for the new clipper
3553 * ColorTable: Color table to assign to the new clipper
3554 * Palette: Address to write the interface pointer to
3555 * UnkOuter: For aggregation support, which ddraw doesn't have. Has to be
3556 * NULL
3557 *
3558 * Returns:
3559 * CLASS_E_NOAGGREGATION if UnkOuter != NULL
3560 * E_OUTOFMEMORY if allocating the object failed
3561 *
3562 *****************************************************************************/
3564 PALETTEENTRY *ColorTable, IDirectDrawPalette **Palette, IUnknown *pUnkOuter)
3565{
3566 struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
3567 struct ddraw_palette *object;
3568 HRESULT hr;
3569
3570 TRACE("iface %p, flags %#lx, color_table %p, palette %p, outer_unknown %p.\n",
3571 iface, Flags, ColorTable, Palette, pUnkOuter);
3572
3573 if (pUnkOuter)
3574 return CLASS_E_NOAGGREGATION;
3575
3577
3578 /* The refcount test shows that a cooplevel is required for this */
3580 {
3581 WARN("No cooperative level set, returning DDERR_NOCOOPERATIVELEVELSET\n");
3584 }
3585
3586 if (!(object = malloc(sizeof(*object))))
3587 {
3588 ERR("Out of memory when allocating memory for a palette implementation\n");
3590 return E_OUTOFMEMORY;
3591 }
3592
3593 hr = ddraw_palette_init(object, ddraw, Flags, ColorTable);
3594 if (FAILED(hr))
3595 {
3596 WARN("Failed to initialize palette, hr %#lx.\n", hr);
3597 free(object);
3599 return hr;
3600 }
3601
3602 TRACE("Created palette %p.\n", object);
3603 *Palette = &object->IDirectDrawPalette_iface;
3605
3606 return DD_OK;
3607}
3608
3609static HRESULT WINAPI ddraw4_CreatePalette(IDirectDraw4 *iface, DWORD flags, PALETTEENTRY *entries,
3610 IDirectDrawPalette **palette, IUnknown *outer_unknown)
3611{
3612 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
3613 HRESULT hr;
3614
3615 TRACE("iface %p, flags %#lx, entries %p, palette %p, outer_unknown %p.\n",
3616 iface, flags, entries, palette, outer_unknown);
3617
3618 hr = ddraw7_CreatePalette(&ddraw->IDirectDraw7_iface, flags, entries, palette, outer_unknown);
3619 if (SUCCEEDED(hr) && *palette)
3620 {
3622 IDirectDraw7_Release(&ddraw->IDirectDraw7_iface);
3623 IDirectDraw4_AddRef(iface);
3624 impl->ifaceToRelease = (IUnknown *)iface;
3625 }
3626 return hr;
3627}
3628
3629static HRESULT WINAPI ddraw2_CreatePalette(IDirectDraw2 *iface, DWORD flags,
3630 PALETTEENTRY *entries, IDirectDrawPalette **palette, IUnknown *outer_unknown)
3631{
3632 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
3633 HRESULT hr;
3634
3635 TRACE("iface %p, flags %#lx, entries %p, palette %p, outer_unknown %p.\n",
3636 iface, flags, entries, palette, outer_unknown);
3637
3638 hr = ddraw7_CreatePalette(&ddraw->IDirectDraw7_iface, flags, entries, palette, outer_unknown);
3639 if (SUCCEEDED(hr) && *palette)
3640 {
3642 IDirectDraw7_Release(&ddraw->IDirectDraw7_iface);
3643 impl->ifaceToRelease = NULL;
3644 }
3645
3646 return hr;
3647}
3648
3649static HRESULT WINAPI ddraw1_CreatePalette(IDirectDraw *iface, DWORD flags,
3650 PALETTEENTRY *entries, IDirectDrawPalette **palette, IUnknown *outer_unknown)
3651{
3652 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
3653 HRESULT hr;
3654
3655 TRACE("iface %p, flags %#lx, entries %p, palette %p, outer_unknown %p.\n",
3656 iface, flags, entries, palette, outer_unknown);
3657
3658 hr = ddraw7_CreatePalette(&ddraw->IDirectDraw7_iface, flags, entries, palette, outer_unknown);
3659 if (SUCCEEDED(hr) && *palette)
3660 {
3662 IDirectDraw7_Release(&ddraw->IDirectDraw7_iface);
3663 impl->ifaceToRelease = NULL;
3664 }
3665
3666 return hr;
3667}
3668
3669/*****************************************************************************
3670 * IDirectDraw7::DuplicateSurface
3671 *
3672 * Duplicates a surface. The surface memory points to the same memory as
3673 * the original surface, and it's released when the last surface referencing
3674 * it is released. I guess that's beyond Wine's surface management right now
3675 * (Idea: create a new DDraw surface with the same WineD3DSurface. I need a
3676 * test application to implement this)
3677 *
3678 * Params:
3679 * Src: Address of the source surface
3680 * Dest: Address to write the new surface pointer to
3681 *
3682 * Returns:
3683 * See IDirectDraw7::CreateSurface
3684 *
3685 *****************************************************************************/
3688{
3689 struct ddraw_surface *src_surface = unsafe_impl_from_IDirectDrawSurface7(Src);
3690
3691 FIXME("iface %p, src %p, dst %p partial stub!\n", iface, Src, Dest);
3692
3693 /* For now, simply create a new, independent surface */
3694 return IDirectDraw7_CreateSurface(iface, &src_surface->surface_desc, Dest, NULL);
3695}
3696
3697static HRESULT WINAPI ddraw4_DuplicateSurface(IDirectDraw4 *iface, IDirectDrawSurface4 *src,
3698 IDirectDrawSurface4 **dst)
3699{
3701 struct ddraw *ddraw = impl_from_IDirectDraw4(iface);
3702 struct ddraw_surface *dst_impl;
3703 IDirectDrawSurface7 *dst7;
3704 HRESULT hr;
3705
3706 TRACE("iface %p, src %p, dst %p.\n", iface, src, dst);
3707
3709 src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, &dst7);
3710 if (FAILED(hr))
3711 {
3712 *dst = NULL;
3713 return hr;
3714 }
3715 dst_impl = impl_from_IDirectDrawSurface7(dst7);
3716 *dst = &dst_impl->IDirectDrawSurface4_iface;
3717 IDirectDrawSurface4_AddRef(*dst);
3718 IDirectDrawSurface7_Release(dst7);
3719
3720 return hr;
3721}
3722
3723static HRESULT WINAPI ddraw2_DuplicateSurface(IDirectDraw2 *iface,
3724 IDirectDrawSurface *src, IDirectDrawSurface **dst)
3725{
3727 struct ddraw *ddraw = impl_from_IDirectDraw2(iface);
3728 struct ddraw_surface *dst_impl;
3729 IDirectDrawSurface7 *dst7;
3730 HRESULT hr;
3731
3732 TRACE("iface %p, src %p, dst %p.\n", iface, src, dst);
3733
3735 src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, &dst7);
3736 if (FAILED(hr))
3737 return hr;
3738 dst_impl = impl_from_IDirectDrawSurface7(dst7);
3739 *dst = &dst_impl->IDirectDrawSurface_iface;
3740 IDirectDrawSurface_AddRef(*dst);
3741 IDirectDrawSurface7_Release(dst7);
3742
3743 return hr;
3744}
3745
3746static HRESULT WINAPI ddraw1_DuplicateSurface(IDirectDraw *iface, IDirectDrawSurface *src,
3747 IDirectDrawSurface **dst)
3748{
3750 struct ddraw *ddraw = impl_from_IDirectDraw(iface);
3751 struct ddraw_surface *dst_impl;
3752 IDirectDrawSurface7 *dst7;
3753 HRESULT hr;
3754
3755 TRACE("iface %p, src %p, dst %p.\n", iface, src, dst);
3756
3758 src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, &dst7);
3759 if (FAILED(hr))
3760 return hr;
3761 dst_impl = impl_from_IDirectDrawSurface7(dst7);
3762 *dst = &dst_impl->IDirectDrawSurface_iface;
3763 IDirectDrawSurface_AddRef(*dst);
3764 IDirectDrawSurface7_Release(dst7);
3765
3766 return hr;
3767}
3768
3769/*****************************************************************************
3770 * IDirect3D7::EnumDevices
3771 *
3772 * The EnumDevices method for IDirect3D7. It enumerates all supported
3773 * D3D7 devices. Currently the T&L, HAL and RGB devices are enumerated.
3774 *
3775 * Params:
3776 * callback: Function to call for each enumerated device
3777 * context: Pointer to pass back to the app
3778 *
3779 * Returns:
3780 * D3D_OK, or the return value of the GetCaps call
3781 *
3782 *****************************************************************************/
3784{
3785 struct ddraw *ddraw = impl_from_IDirect3D7(iface);
3786 D3DDEVICEDESC7 device_desc7;
3787 DWORD dev_caps;
3788 HRESULT hr;
3789 size_t i;
3790
3791 TRACE("iface %p, callback %p, context %p.\n", iface, callback, context);
3792
3793 if (!callback)
3794 return DDERR_INVALIDPARAMS;
3795
3797
3798 if (FAILED(hr = ddraw_get_d3dcaps(ddraw, &device_desc7)))
3799 {
3801 return hr;
3802 }
3803 dev_caps = device_desc7.dwDevCaps;
3804
3805 for (i = 0; i < ARRAY_SIZE(device_list7); i++)
3806 {
3807 HRESULT ret;
3808
3809 device_desc7.deviceGUID = *device_list7[i].device_guid;
3810 device_desc7.dwDevCaps = dev_caps & ~device_list7[i].unsupported_caps;
3811 ret = callback(device_list7[i].interface_name, device_list7[i].device_name, &device_desc7, context);
3812 if (ret != DDENUMRET_OK)
3813 {
3814 TRACE("Application cancelled the enumeration.\n");
3816 return D3D_OK;
3817 }
3818 }
3819
3820 TRACE("End of enumeration.\n");
3821
3823
3824 return D3D_OK;
3825}
3826
3827/*****************************************************************************
3828 * IDirect3D3::EnumDevices
3829 *
3830 * Enumerates all supported Direct3DDevice interfaces. This is the
3831 * implementation for Direct3D 1 to Direc3D 3, Version 7 has its own.
3832 *
3833 * Versions 1, 2 and 3
3834 *
3835 * Params:
3836 * callback: Application-provided routine to call for each enumerated device
3837 * Context: Pointer to pass to the callback
3838 *
3839 * Returns:
3840 * D3D_OK on success,
3841 * The result of IDirect3DImpl_GetCaps if it failed
3842 *
3843 *****************************************************************************/
3845{
3846 static CHAR wined3d_description[] = "Wine D3DDevice using WineD3D and OpenGL";
3847
3848 struct ddraw *ddraw = impl_from_IDirect3D3(iface);
3849 D3DDEVICEDESC device_desc1, hal_desc, hel_desc;
3850 D3DDEVICEDESC7 device_desc7;
3851 HRESULT hr;
3852
3853 /* Some games (Motoracer 2 demo) have the bad idea to modify the device
3854 * name string. Let's put the string in a sufficiently sized array in
3855 * writable memory. */
3856 char device_name[50];
3857 strcpy(device_name,"Direct3D HEL");
3858
3859 TRACE("iface %p, callback %p, context %p.\n", iface, callback, context);
3860
3861 if (!callback)
3862 return DDERR_INVALIDPARAMS;
3863
3865
3866 if (FAILED(hr = ddraw_get_d3dcaps(ddraw, &device_desc7)))
3867 {
3869 return hr;
3870 }
3871 ddraw_d3dcaps1_from_7(&device_desc1, &device_desc7);
3872
3873 /* Do I have to enumerate the reference id? Note from old d3d7:
3874 * "It seems that enumerating the reference IID on Direct3D 1 games
3875 * (AvP / Motoracer2) breaks them". So do not enumerate this iid in V1
3876 *
3877 * There's a registry key HKLM\Software\Microsoft\Direct3D\Drivers,
3878 * EnumReference which enables / disables enumerating the reference
3879 * rasterizer. It's a DWORD, 0 means disabled, 2 means enabled. The
3880 * enablerefrast.reg and disablerefrast.reg files in the DirectX 7.0 sdk
3881 * demo directory suggest this.
3882 *
3883 * Some games(GTA 2) seem to use the second enumerated device, so I have
3884 * to enumerate at least 2 devices. So enumerate the reference device to
3885 * have 2 devices.
3886 *
3887 * Other games (Rollcage) tell emulation and hal device apart by certain
3888 * flags. Rollcage expects D3DPTEXTURECAPS_POW2 to be set (yeah, it is a
3889 * limitation flag), and it refuses all devices that have the perspective
3890 * flag set. This way it refuses the emulation device, and HAL devices
3891 * never have POW2 unset in d3d7 on windows. */
3892 if (ddraw->d3dversion != 1)
3893 {
3894 /* Tomb Raider 3 overwrites the reference device description buffer
3895 * with its own custom string. Reserve some extra space in the array
3896 * to avoid a buffer overrun. */
3897 static CHAR reference_description[64] = "RGB Direct3D emulation";
3898
3899 TRACE("Enumerating WineD3D D3DDevice interface.\n");
3900 hal_desc = device_desc1;
3901 hel_desc = device_desc1;
3902 /* The rgb device has the pow2 flag set in the hel caps, but not in the hal caps. */
3907 /* RGB, RAMP and MMX devices have a HAL dcmColorModel of 0 */
3908 hal_desc.dcmColorModel = 0;
3909 /* RGB, RAMP and MMX devices cannot report HAL hardware flags */
3910 hal_desc.dwFlags = 0;
3911 /* RGB, REF, RAMP and MMX devices don't report hardware transform and lighting capability */
3914
3915 hr = callback((GUID *)&IID_IDirect3DRGBDevice, reference_description,
3916 device_name, &hal_desc, &hel_desc, context);
3917 if (hr != D3DENUMRET_OK)
3918 {
3919 TRACE("Application cancelled the enumeration.\n");
3921 return D3D_OK;
3922 }
3923 }
3924
3925 strcpy(device_name,"Direct3D HAL");
3926
3927 TRACE("Enumerating HAL Direct3D device.\n");
3928 hal_desc = device_desc1;
3929 hel_desc = device_desc1;
3930
3931 /* The hal device does not have the pow2 flag set in hel, but in hal. */
3936 /* HAL devices have a HEL dcmColorModel of 0 */
3937 hel_desc.dcmColorModel = 0;
3938 /* HAL devices report hardware transform and lighting capability, but not in hel */
3940
3941 hr = callback((GUID *)&IID_IDirect3DHALDevice, wined3d_description,
3942 device_name, &hal_desc, &hel_desc, context);
3943 if (hr != D3DENUMRET_OK)
3944 {
3945 TRACE("Application cancelled the enumeration.\n");
3947 return D3D_OK;
3948 }
3949
3950 TRACE("End of enumeration.\n");
3951
3953
3954 return D3D_OK;
3955}
3956
3958{
3959 struct ddraw *ddraw = impl_from_IDirect3D2(iface);
3960
3961 TRACE("iface %p, callback %p, context %p.\n", iface, callback, context);
3962
3964}
3965
3967{
3968 struct ddraw *ddraw = impl_from_IDirect3D(iface);
3969
3970 TRACE("iface %p, callback %p, context %p.\n", iface, callback, context);
3971
3973}
3974
3975/*****************************************************************************
3976 * IDirect3D3::CreateLight
3977 *
3978 * Creates an IDirect3DLight interface. This interface is used in
3979 * Direct3D3 or earlier for lighting. In Direct3D7 it has been replaced
3980 * by the DIRECT3DLIGHT7 structure. Wine's Direct3DLight implementation
3981 * uses the IDirect3DDevice7 interface with D3D7 lights.
3982 *
3983 * Versions 1, 2 and 3
3984 *
3985 * Params:
3986 * light: Address to store the new interface pointer
3987 * outer_unknown: Basically for aggregation, but ddraw doesn't support it.
3988 * Must be NULL
3989 *
3990 * Returns:
3991 * D3D_OK on success
3992 * DDERR_OUTOFMEMORY if memory allocation failed
3993 * CLASS_E_NOAGGREGATION if outer_unknown != NULL
3994 *
3995 *****************************************************************************/
3996static HRESULT WINAPI d3d3_CreateLight(IDirect3D3 *iface, IDirect3DLight **light,
3997 IUnknown *outer_unknown)
3998{
3999 struct ddraw *ddraw = impl_from_IDirect3D3(iface);
4000 struct d3d_light *object;
4001
4002 TRACE("iface %p, light %p, outer_unknown %p.\n", iface, light, outer_unknown);
4003
4004 if (outer_unknown)
4005 return CLASS_E_NOAGGREGATION;
4006
4007 if (!(object = calloc(1, sizeof(*object))))
4008 {
4009 ERR("Failed to allocate light memory.\n");
4010 return DDERR_OUTOFMEMORY;
4011 }
4012
4013 d3d_light_init(object, ddraw);
4014
4015 TRACE("Created light %p.\n", object);
4016 *light = &object->IDirect3DLight_iface;
4017
4018 return D3D_OK;
4019}
4020
4021static HRESULT WINAPI d3d2_CreateLight(IDirect3D2 *iface, IDirect3DLight **light, IUnknown *outer_unknown)
4022{
4023 struct ddraw *ddraw = impl_from_IDirect3D2(iface);
4024
4025 TRACE("iface %p, light %p, outer_unknown %p.\n", iface, light, outer_unknown);
4026
4027 return d3d3_CreateLight(&ddraw->IDirect3D3_iface, light, outer_unknown);
4028}
4029
4030static HRESULT WINAPI d3d1_CreateLight(IDirect3D *iface, IDirect3DLight **light, IUnknown *outer_unknown)
4031{
4032 struct ddraw *ddraw = impl_from_IDirect3D(iface);
4033
4034 TRACE("iface %p, light %p, outer_unknown %p.\n", iface, light, outer_unknown);
4035
4036 return d3d3_CreateLight(&ddraw->IDirect3D3_iface, light, outer_unknown);
4037}
4038
4039/*****************************************************************************
4040 * IDirect3D3::CreateMaterial
4041 *
4042 * Creates an IDirect3DMaterial interface. This interface is used by Direct3D3
4043 * and older versions. The IDirect3DMaterial implementation wraps its
4044 * functionality to IDirect3DDevice7::SetMaterial and friends.
4045 *
4046 * Versions 1, 2 and 3
4047 *
4048 * Params:
4049 * material: Address to store the new interface's pointer to
4050 * outer_unknown: Basically for aggregation, but ddraw doesn't support it.
4051 * Must be NULL
4052 *
4053 * Returns:
4054 * D3D_OK on success
4055 * DDERR_OUTOFMEMORY if memory allocation failed
4056 * CLASS_E_NOAGGREGATION if outer_unknown != NULL
4057 *
4058 *****************************************************************************/
4059static HRESULT WINAPI d3d3_CreateMaterial(IDirect3D3 *iface, IDirect3DMaterial3 **material,
4060 IUnknown *outer_unknown)
4061{
4062 struct ddraw *ddraw = impl_from_IDirect3D3(iface);
4063 struct d3d_material *object;
4064
4065 TRACE("iface %p, material %p, outer_unknown %p.\n", iface, material, outer_unknown);
4066
4067 if (outer_unknown) return CLASS_E_NOAGGREGATION;
4068
4069 object = d3d_material_create(ddraw);
4070 if (!object)
4071 {
4072 ERR("Failed to allocate material memory.\n");
4073 return DDERR_OUTOFMEMORY;
4074 }
4075
4076 TRACE("Created material %p.\n", object);
4077 *material = &object->IDirect3DMaterial3_iface;
4078
4079 return D3D_OK;
4080}
4081
4082static HRESULT WINAPI d3d2_CreateMaterial(IDirect3D2 *iface, IDirect3DMaterial2 **material,
4083 IUnknown *outer_unknown)
4084{
4085 struct ddraw *ddraw = impl_from_IDirect3D2(iface);
4086 struct d3d_material *object;
4087
4088 TRACE("iface %p, material %p, outer_unknown %p.\n", iface, material, outer_unknown);
4089
4090 object = d3d_material_create(ddraw);
4091 if (!object)
4092 {
4093 ERR("Failed to allocate material memory.\n");
4094 return DDERR_OUTOFMEMORY;
4095 }
4096
4097 TRACE("Created material %p.\n", object);
4098 *material = &object->IDirect3DMaterial2_iface;
4099
4100 return D3D_OK;
4101}
4102
4103static HRESULT WINAPI d3d1_CreateMaterial(IDirect3D *iface, IDirect3DMaterial **material,
4104 IUnknown *outer_unknown)
4105{
4106 struct ddraw *ddraw = impl_from_IDirect3D(iface);
4107 struct d3d_material *object;
4108
4109 TRACE("iface %p, material %p, outer_unknown %p.\n", iface, material, outer_unknown);
4110
4111 object = d3d_material_create(ddraw);
4112 if (!object)
4113 {
4114 ERR("Failed to allocate material memory.\n");
4115 return DDERR_OUTOFMEMORY;
4116 }
4117
4118 TRACE("Created material %p.\n", object);
4119 *material = &object->IDirect3DMaterial_iface;
4120
4121 return D3D_OK;
4122}
4123
4124/*****************************************************************************
4125 * IDirect3D3::CreateViewport
4126 *
4127 * Creates an IDirect3DViewport interface. This interface is used
4128 * by Direct3D and earlier versions for Viewport management. In Direct3D7
4129 * it has been replaced by a viewport structure and
4130 * IDirect3DDevice7::*Viewport. Wine's IDirect3DViewport implementation
4131 * uses the IDirect3DDevice7 methods for its functionality
4132 *
4133 * Params:
4134 * Viewport: Address to store the new interface pointer
4135 * outer_unknown: Basically for aggregation, but ddraw doesn't support it.
4136 * Must be NULL
4137 *
4138 * Returns:
4139 * D3D_OK on success
4140 * DDERR_OUTOFMEMORY if memory allocation failed
4141 * CLASS_E_NOAGGREGATION if outer_unknown != NULL
4142 *
4143 *****************************************************************************/
4144static HRESULT WINAPI d3d3_CreateViewport(IDirect3D3 *iface, IDirect3DViewport3 **viewport,
4145 IUnknown *outer_unknown)
4146{
4147 struct ddraw *ddraw = impl_from_IDirect3D3(iface);
4148 struct d3d_viewport *object;
4149
4150 TRACE("iface %p, viewport %p, outer_unknown %p.\n", iface, viewport, outer_unknown);
4151
4152 if (outer_unknown) return CLASS_E_NOAGGREGATION;
4153
4154 if (!(object = calloc(1, sizeof(*object))))
4155 {
4156 ERR("Failed to allocate viewport memory.\n");
4157 return DDERR_OUTOFMEMORY;
4158 }
4159
4160 d3d_viewport_init(object, ddraw);
4161
4162 TRACE("Created viewport %p.\n", object);
4163 *viewport = &object->IDirect3DViewport3_iface;
4164
4165 return D3D_OK;
4166}
4167
4168static HRESULT WINAPI d3d2_CreateViewport(IDirect3D2 *iface, IDirect3DViewport2 **viewport, IUnknown *outer_unknown)
4169{
4170 struct ddraw *ddraw = impl_from_IDirect3D2(iface);
4171
4172 TRACE("iface %p, viewport %p, outer_unknown %p.\n", iface, viewport, outer_unknown);
4173
4174 return d3d3_CreateViewport(&ddraw->IDirect3D3_iface, (IDirect3DViewport3 **)viewport,
4175 outer_unknown);
4176}
4177
4178static HRESULT WINAPI d3d1_CreateViewport(IDirect3D *iface, IDirect3DViewport **viewport, IUnknown *outer_unknown)
4179{
4180 struct ddraw *ddraw = impl_from_IDirect3D(iface);
4181
4182 TRACE("iface %p, viewport %p, outer_unknown %p.\n", iface, viewport, outer_unknown);
4183
4184 return d3d3_CreateViewport(&ddraw->IDirect3D3_iface, (IDirect3DViewport3 **)viewport,
4185 outer_unknown);
4186}
4187
4189 unsigned int guid_count, const GUID * const *guids, DWORD device_desc_size)
4190{
4191 struct ddraw_find_device_result_v1
4192 {
4193 DWORD size;
4194 GUID guid;
4195 D3DDEVICEDESC_V1 hw_desc;
4196 D3DDEVICEDESC_V1 sw_desc;
4197 } *fdr1;
4198 struct ddraw_find_device_result_v2
4199 {
4200 DWORD size;
4201 GUID guid;
4202 D3DDEVICEDESC_V2 hw_desc;
4203 D3DDEVICEDESC_V2 sw_desc;
4204 } *fdr2;
4205 D3DDEVICEDESC7 desc7;
4206 D3DDEVICEDESC desc1;
4207 unsigned int i;
4208 HRESULT hr;
4209
4210 TRACE("ddraw %p, fds %p, fdr %p, guid_count %u, guids %p, device_desc_size %lu.\n",
4211 ddraw, fds, fdr, guid_count, guids, device_desc_size);
4212
4213 if (!fds || !fdr)
4214 return DDERR_INVALIDPARAMS;
4215
4216 if (fds->dwSize != sizeof(*fds))
4217 {
4218 WARN("Got invalid search structure size %lu.\n", fds->dwSize);
4219 return DDERR_INVALIDPARAMS;
4220 }
4221
4222 if (fdr->dwSize != sizeof(*fdr) && fdr->dwSize != sizeof(*fdr2) && fdr->dwSize != sizeof(*fdr1))
4223 {
4224 WARN("Got invalid result structure size %lu.\n", fdr->dwSize);
4225 return DDERR_INVALIDPARAMS;
4226 }
4227
4228 if (fds->dwFlags & D3DFDS_COLORMODEL)
4229 WARN("Ignoring colour model %#lx.\n", fds->dcmColorModel);
4230
4231 if (fds->dwFlags & D3DFDS_GUID)
4232 {
4233 BOOL found = FALSE;
4234
4235 TRACE("Trying to match GUID %s.\n", debugstr_guid(&fds->guid));
4236
4237 if ((ddraw->flags & DDRAW_NO3D) && IsEqualGUID(&fds->guid, &IID_IDirect3DHALDevice))
4238 {
4239 WARN("HAL device not available without 3D support.\n");
4240 return DDERR_NOTFOUND;
4241 }
4242
4243 for (i = 0; i < guid_count; ++i)
4244 {
4245 if (IsEqualGUID(guids[i], &fds->guid))
4246 {
4247 found = TRUE;
4248 break;
4249 }
4250 }
4251
4252 if (!found)
4253 {
4254 WARN("Failed to match GUID %s.\n", debugstr_guid(&fds->guid));
4255 return DDERR_NOTFOUND;
4256 }
4257 }
4258
4259 /* Get the caps */
4260 if (FAILED(hr = ddraw_get_d3dcaps(ddraw, &desc7)))
4261 return hr;
4262
4263 /* Now return our own GUID */
4264 ddraw_d3dcaps1_from_7(&desc1, &desc7);
4266
4267 /* Note that "device_desc_size" doesn't necessarily have any relation to
4268 * the actual structure size. However, this matches the behaviour of
4269 * Windows since at least Windows 2000. */
4270 if (fdr->dwSize == sizeof(*fdr1))
4271 {
4272 fdr1 = (struct ddraw_find_device_result_v1 *)fdr;
4273 memcpy(&fdr1->hw_desc, &desc1, sizeof(fdr1->hw_desc));
4274 fdr1->hw_desc.dwSize = device_desc_size;
4275 memcpy(&fdr1->sw_desc, &desc1, sizeof(fdr1->sw_desc));
4276 fdr1->sw_desc.dwSize = device_desc_size;
4277 }
4278 else if (fdr->dwSize == sizeof(*fdr2))
4279 {
4280 fdr2 = (struct ddraw_find_device_result_v2 *)fdr;
4281 memcpy(&fdr2->hw_desc, &desc1, sizeof(fdr2->hw_desc));
4282 fdr2->hw_desc.dwSize = device_desc_size;
4283 memcpy(&fdr2->sw_desc, &desc1, sizeof(fdr2->sw_desc));
4284 fdr2->sw_desc.dwSize = device_desc_size;
4285 }
4286 else
4287 {
4288 fdr->ddHwDesc = desc1;
4289 fdr->ddHwDesc.dwSize = device_desc_size;
4290 fdr->ddSwDesc = desc1;
4291 fdr->ddSwDesc.dwSize = device_desc_size;
4292 }
4293
4294 TRACE("Returning Wine's wined3d device with (undumped) capabilities.\n");
4295
4296 return D3D_OK;
4297}
4298
4300{
4301 struct ddraw *ddraw = impl_from_IDirect3D3(iface);
4302 static const GUID * const guids[] =
4303 {
4305 &IID_IDirect3DHALDevice,
4306 &IID_IDirect3DRGBDevice,
4307 };
4308
4309 TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr);
4310
4311 return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids, sizeof(D3DDEVICEDESC_V3));
4312}
4313
4315{
4316 struct ddraw *ddraw = impl_from_IDirect3D2(iface);
4317 static const GUID * const guids[] =
4318 {
4320 &IID_IDirect3DHALDevice,
4321 &IID_IDirect3DMMXDevice,
4322 &IID_IDirect3DRGBDevice,
4323 &IID_IDirect3DRampDevice,
4324 };
4325
4326 TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr);
4327
4328 return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids, sizeof(D3DDEVICEDESC_V2));
4329}
4330
4332{
4333 struct ddraw *ddraw = impl_from_IDirect3D(iface);
4334 static const GUID * const guids[] =
4335 {
4337 &IID_IDirect3DHALDevice,
4338 &IID_IDirect3DRGBDevice,
4339 &IID_IDirect3DRampDevice,
4340 };
4341
4342 TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr);
4343
4344 return ddraw_find_device(ddraw, fds, fdr, ARRAY_SIZE(guids), guids, sizeof(D3DDEVICEDESC_V1));
4345}
4346
4347/*****************************************************************************
4348 * IDirect3D7::CreateDevice
4349 *
4350 * Creates an IDirect3DDevice7 interface.
4351 *
4352 * Versions 2, 3 and 7. IDirect3DDevice 1 interfaces are interfaces to
4353 * DirectDraw surfaces and are created with
4354 * IDirectDrawSurface::QueryInterface. This method uses CreateDevice to
4355 * create the device object and QueryInterfaces for IDirect3DDevice
4356 *
4357 * Params:
4358 * refiid: IID of the device to create
4359 * Surface: Initial rendertarget
4360 * Device: Address to return the interface pointer
4361 *
4362 * Returns:
4363 * D3D_OK on success
4364 * DDERR_OUTOFMEMORY if memory allocation failed
4365 * DDERR_INVALIDPARAMS if a device exists already
4366 *
4367 *****************************************************************************/
4369 IDirectDrawSurface7 *surface, IDirect3DDevice7 **device)
4370{
4372 struct ddraw *ddraw = impl_from_IDirect3D7(iface);
4373 struct d3d_device *object;
4374 HRESULT hr;
4375
4376 TRACE("iface %p, riid %s, surface %p, device %p.\n", iface, debugstr_guid(riid), surface, device);
4377
4379 if (SUCCEEDED(hr = d3d_device_create(ddraw, riid, target, (IUnknown *)surface, 7, &object, NULL)))
4380 {
4381 *device = &object->IDirect3DDevice7_iface;
4382 }
4383 else
4384 {
4385 WARN("Failed to create device, hr %#lx.\n", hr);
4386 *device = NULL;
4387 }
4389
4390 return hr;
4391}
4392
4394 IDirectDrawSurface4 *surface, IDirect3DDevice3 **device, IUnknown *outer_unknown)
4395{
4396 struct ddraw_surface *surface_impl = unsafe_impl_from_IDirectDrawSurface4(surface);
4397 struct ddraw *ddraw = impl_from_IDirect3D3(iface);
4398 struct d3d_device *device_impl;
4399 HRESULT hr;
4400
4401 TRACE("iface %p, riid %s, surface %p, device %p, outer_unknown %p.\n",
4402 iface, debugstr_guid(riid), surface, device, outer_unknown);
4403
4404 if (outer_unknown)
4405 return CLASS_E_NOAGGREGATION;
4406
4408 if (SUCCEEDED(hr = d3d_device_create(ddraw, riid, surface_impl, (IUnknown *)surface, 3, &device_impl, NULL)))
4409 {
4410 *device = &device_impl->IDirect3DDevice3_iface;
4411 }
4412 else
4413 {
4414 WARN("Failed to create device, hr %#lx.\n", hr);
4415 *device = NULL;
4416 }
4418
4419 return hr;
4420}
4421
4423 IDirectDrawSurface *surface, IDirect3DDevice2 **device)
4424{
4425 struct ddraw_surface *surface_impl = unsafe_impl_from_IDirectDrawSurface(surface);
4426 struct ddraw *ddraw = impl_from_IDirect3D2(iface);
4427 struct d3d_device *device_impl;
4428 HRESULT hr;
4429
4430 TRACE("iface %p, riid %s, surface %p, device %p.\n",
4431 iface, debugstr_guid(riid), surface, device);
4432
4434 if (SUCCEEDED(hr = d3d_device_create(ddraw, riid, surface_impl, (IUnknown *)surface, 2, &device_impl, NULL)))
4435 {
4436 *device = &device_impl->IDirect3DDevice2_iface;
4437 }
4438 else
4439 {
4440 WARN("Failed to create device, hr %#lx.\n", hr);
4441 *device = NULL;
4442 }
4444
4445 return hr;
4446}
4447
4448/*****************************************************************************
4449 * IDirect3D7::CreateVertexBuffer
4450 *
4451 * Creates a new vertex buffer object and returns a IDirect3DVertexBuffer7
4452 * interface.
4453 *
4454 * Versions 3 and 7
4455 *
4456 * Params:
4457 * desc: Requested Vertex buffer properties
4458 * vertex_buffer: Address to return the interface pointer at
4459 * flags: Some flags, should be 0
4460 *
4461 * Returns
4462 * D3D_OK on success
4463 * DDERR_OUTOFMEMORY if memory allocation failed
4464 * DDERR_INVALIDPARAMS if desc or vertex_buffer is NULL
4465 *
4466 *****************************************************************************/
4468 IDirect3DVertexBuffer7 **vertex_buffer, DWORD flags)
4469{
4470 struct ddraw *ddraw = impl_from_IDirect3D7(iface);
4471 struct d3d_vertex_buffer *object;
4472 HRESULT hr;
4473
4474 TRACE("iface %p, desc %p, vertex_buffer %p, flags %#lx.\n",
4475 iface, desc, vertex_buffer, flags);
4476
4477 if (!vertex_buffer || !desc) return DDERR_INVALIDPARAMS;
4478
4480 if (hr == D3D_OK)
4481 {
4482 TRACE("Created vertex buffer %p.\n", object);
4483 *vertex_buffer = &object->IDirect3DVertexBuffer7_iface;
4484 }
4485 else
4486 WARN("Failed to create vertex buffer, hr %#lx.\n", hr);
4487
4488 return hr;
4489}
4490
4492 IDirect3DVertexBuffer **vertex_buffer, DWORD flags, IUnknown *outer_unknown)
4493{
4494 struct ddraw *ddraw = impl_from_IDirect3D3(iface);
4495 struct d3d_vertex_buffer *object;
4496 HRESULT hr;
4497
4498 TRACE("iface %p, desc %p, vertex_buffer %p, flags %#lx, outer_unknown %p.\n",
4499 iface, desc, vertex_buffer, flags, outer_unknown);
4500
4501 if (outer_unknown)
4502 return CLASS_E_NOAGGREGATION;
4503 if (!vertex_buffer || !desc)
4504 return DDERR_INVALIDPARAMS;
4505
4507 if (hr == D3D_OK)
4508 {
4509 TRACE("Created vertex buffer %p.\n", object);
4510 *vertex_buffer = (IDirect3DVertexBuffer *)&object->IDirect3DVertexBuffer7_iface;
4511 }
4512 else
4513 WARN("Failed to create vertex buffer, hr %#lx.\n", hr);
4514
4515 return hr;
4516}
4517
4518/*****************************************************************************
4519 * IDirect3D7::EnumZBufferFormats
4520 *
4521 * Enumerates all supported Z buffer pixel formats
4522 *
4523 * Versions 3 and 7
4524 *
4525 * Params:
4526 * device_iid:
4527 * callback: callback to call for each pixel format
4528 * context: Pointer to pass back to the callback
4529 *
4530 * Returns:
4531 * D3D_OK on success
4532 * DDERR_INVALIDPARAMS if callback is NULL
4533 *
4534 *****************************************************************************/
4535static HRESULT WINAPI d3d7_EnumZBufferFormats(IDirect3D7 *iface, REFCLSID device_iid,
4537{
4538 struct ddraw *ddraw = impl_from_IDirect3D7(iface);
4541 unsigned int i;
4542 HRESULT hr;
4543
4544 /* Order matters. Specifically, BattleZone II (full version) expects the
4545 * 16-bit depth formats to be listed before the 24 and 32 ones. */
4546 static const enum wined3d_format_id formats[] =
4547 {
4554 };
4555
4556 TRACE("iface %p, device_iid %s, callback %p, context %p.\n",
4557 iface, debugstr_guid(device_iid), callback, context);
4558
4559 if (!callback) return DDERR_INVALIDPARAMS;
4560
4561 if (IsEqualGUID(device_iid, &IID_IDirect3DHALDevice)
4562 || IsEqualGUID(device_iid, &IID_IDirect3DTnLHalDevice)
4563 || IsEqualGUID(device_iid, &IID_D3DDEVICE_WineD3D))
4564 {
4565 TRACE("Asked for HAL device.\n");
4567 }
4568 else if (IsEqualGUID(device_iid, &IID_IDirect3DRGBDevice)
4569 || IsEqualGUID(device_iid, &IID_IDirect3DMMXDevice))
4570 {
4571 TRACE("Asked for SW device.\n");
4573 }
4574 else if (IsEqualGUID(device_iid, &IID_IDirect3DRefDevice))
4575 {
4576 TRACE("Asked for REF device.\n");
4578 }
4579 else if (IsEqualGUID(device_iid, &IID_IDirect3DNullDevice))
4580 {
4581 TRACE("Asked for NULLREF device.\n");
4583 }
4584 else
4585 {
4586 FIXME("Unexpected device GUID %s.\n", debugstr_guid(device_iid));
4588 }
4589
4591 /* We need an adapter format from somewhere to please wined3d and WGL.
4592 * Use the current display mode. So far all cards offer the same depth
4593 * stencil format for all modes, but if some do not and applications do
4594 * not like that we'll have to find some workaround, like iterating over
4595 * all imaginable formats and collecting all the depth stencil formats we
4596 * can get. */
4598 {
4599 ERR("Failed to get display mode, hr %#lx.\n", hr);
4601 return hr;
4602 }
4603
4604 for (i = 0; i < ARRAY_SIZE(formats); ++i)
4605 {
4608 {
4609 DDPIXELFORMAT pformat;
4610
4611 memset(&pformat, 0, sizeof(pformat));
4612 pformat.dwSize = sizeof(pformat);
4614
4615 TRACE("Enumerating wined3d format %#x.\n", formats[i]);
4616 hr = callback(&pformat, context);
4617 if (hr != DDENUMRET_OK)
4618 {
4619 TRACE("Format enumeration cancelled by application.\n");
4621 return D3D_OK;
4622 }
4623 }
4624 }
4625
4626 /* Historically some windows drivers used dwZBufferBitDepth=24 for WINED3DFMT_X8D24_UNORM,
4627 * while others used dwZBufferBitDepth=32. In either case the pitch matches a 32 bits per
4628 * pixel format, so we use dwZBufferBitDepth=32. Some games expect 24. Windows Vista and
4629 * newer enumerate both versions, so we do the same(bug 22434) */
4632 {
4633 DDPIXELFORMAT x8d24 =
4634 {
4635 sizeof(x8d24), DDPF_ZBUFFER, 0,
4636 {24}, {0x00000000}, {0x00ffffff}, {0x00000000}
4637 };
4638 TRACE("Enumerating WINED3DFMT_X8D24_UNORM, dwZBufferBitDepth=24 version\n");
4639 callback(&x8d24, context);
4640 }
4641
4642 TRACE("End of enumeration.\n");
4643
4645
4646 return D3D_OK;
4647}
4648
4649static HRESULT WINAPI d3d3_EnumZBufferFormats(IDirect3D3 *iface, REFCLSID device_iid,
4651{
4652 struct ddraw *ddraw = impl_from_IDirect3D3(iface);
4653
4654 TRACE("iface %p, device_iid %s, callback %p, context %p.\n",
4655 iface, debugstr_guid(device_iid), callback, context);
4656
4658}
4659
4660/*****************************************************************************
4661 * IDirect3D7::EvictManagedTextures
4662 *
4663 * Removes all managed textures (=surfaces with DDSCAPS2_TEXTUREMANAGE or
4664 * DDSCAPS2_D3DTEXTUREMANAGE caps) to be removed from video memory.
4665 *
4666 * Versions 3 and 7
4667 *
4668 * Returns:
4669 * D3D_OK, because it's a stub
4670 *
4671 *****************************************************************************/
4673{
4674 struct ddraw *ddraw = impl_from_IDirect3D7(iface);
4675
4676 TRACE("iface %p!\n", iface);
4677
4682
4683 return D3D_OK;
4684}
4685
4687{
4688 struct ddraw *ddraw = impl_from_IDirect3D3(iface);
4689
4690 TRACE("iface %p.\n", iface);
4691
4693}
4694
4695/*****************************************************************************
4696 * IDirectDraw7 VTable
4697 *****************************************************************************/
4698static const struct IDirectDraw7Vtbl ddraw7_vtbl =
4699{
4700 /* IUnknown */
4704 /* IDirectDraw */
4725 /* IDirectDraw2 */
4727 /* IDirectDraw3 */
4729 /* IDirectDraw4 */
4733 /* IDirectDraw7 */
4736};
4737
4738static const struct IDirectDraw4Vtbl ddraw4_vtbl =
4739{
4740 /* IUnknown */
4744 /* IDirectDraw */
4765 /* IDirectDraw2 */
4767 /* IDirectDraw3 */
4769 /* IDirectDraw4 */
4773};
4774
4775static const struct IDirectDraw2Vtbl ddraw2_vtbl =
4776{
4777 /* IUnknown */
4781 /* IDirectDraw */
4802 /* IDirectDraw2 */
4804};
4805
4806/* Bad Mojo Redux expects this vtbl to be writable. */
4807static struct IDirectDrawVtbl ddraw1_vtbl =
4808{
4809 /* IUnknown */
4813 /* IDirectDraw */
4834};
4835
4836static const struct IDirect3D7Vtbl d3d7_vtbl =
4837{
4838 /* IUnknown methods */
4842 /* IDirect3D7 methods */
4848};
4849
4850static const struct IDirect3D3Vtbl d3d3_vtbl =
4851{
4852 /* IUnknown methods */
4856 /* IDirect3D3 methods */
4866};
4867
4868static const struct IDirect3D2Vtbl d3d2_vtbl =
4869{
4870 /* IUnknown methods */
4874 /* IDirect3D2 methods */
4881};
4882
4883static const struct IDirect3DVtbl d3d1_vtbl =
4884{
4885 /* IUnknown methods */
4889 /* IDirect3D methods */
4896};
4897
4898/*****************************************************************************
4899 * ddraw_find_decl
4900 *
4901 * Finds the WineD3D vertex declaration for a specific fvf, and creates one
4902 * if none was found.
4903 *
4904 * This function is in ddraw.c and the DDraw object space because D3D7
4905 * vertex buffers are created using the IDirect3D interface to the ddraw
4906 * object, so they can be valid across D3D devices(theoretically. The ddraw
4907 * object also owns the wined3d device
4908 *
4909 * Parameters:
4910 * This: Device
4911 * fvf: Fvf to find the decl for
4912 *
4913 * Returns:
4914 * NULL in case of an error, the vertex declaration for the FVF otherwise.
4915 *
4916 *****************************************************************************/
4918{
4919 struct wined3d_vertex_declaration *pDecl = NULL;
4920 HRESULT hr;
4921 int p, low, high; /* deliberately signed */
4922 struct FvfToDecl *convertedDecls = This->decls;
4923
4924 TRACE("Searching for declaration for fvf %08lx... ", fvf);
4925
4926 low = 0;
4927 high = This->numConvertedDecls - 1;
4928 while(low <= high) {
4929 p = (low + high) >> 1;
4930 TRACE("%d ", p);
4931 if(convertedDecls[p].fvf == fvf) {
4932 TRACE("found %p\n", convertedDecls[p].decl);
4933 return convertedDecls[p].decl;
4934 } else if(convertedDecls[p].fvf < fvf) {
4935 low = p + 1;
4936 } else {
4937 high = p - 1;
4938 }
4939 }
4940 TRACE("not found. Creating and inserting at position %d.\n", low);
4941
4944 if (hr != S_OK) return NULL;
4945
4946 if (This->declArraySize == This->numConvertedDecls)
4947 {
4948 unsigned int grow = max(This->declArraySize / 2, 8);
4949
4950 if (!(convertedDecls = realloc(convertedDecls,
4951 (This->numConvertedDecls + grow) * sizeof(*convertedDecls))))
4952 {
4954 return NULL;
4955 }
4956 This->decls = convertedDecls;
4957 This->declArraySize += grow;
4958 }
4959
4960 memmove(convertedDecls + low + 1, convertedDecls + low, sizeof(convertedDecls[0]) * (This->numConvertedDecls - low));
4961 convertedDecls[low].decl = pDecl;
4962 convertedDecls[low].fvf = fvf;
4963 This->numConvertedDecls++;
4964
4965 TRACE("Returning %p. %d decls in array\n", pDecl, This->numConvertedDecls);
4966 return pDecl;
4967}
4968
4970{
4972}
4973
4975 struct wined3d_device *device)
4976{
4977 TRACE("device_parent %p, device %p.\n", device_parent, device);
4978}
4979
4980/* This is run from device_process_message() in wined3d, we can't take the
4981 * wined3d mutex. */
4982/* FIXME: We only get mode change notifications in exclusive mode, but we
4983 * should mark surfaces as lost on mode changes in DDSCL_NORMAL mode as well. */
4985{
4987 struct wined3d_output_desc output_desc;
4988 RECT *r;
4989
4990 TRACE("device_parent %p.\n", device_parent);
4991
4993 {
4994 TRACE("Nothing to resize.\n");
4995 return;
4996 }
4997
4999 {
5000 ERR("Failed to get output description.\n");
5001 return;
5002 }
5003
5004 r = &output_desc.desktop_rect;
5005 TRACE("Resizing window %p to %s.\n", ddraw->swapchain_window, wine_dbgstr_rect(r));
5006
5007 if (!SetWindowPos(ddraw->swapchain_window, HWND_TOP, r->left, r->top,
5008 r->right - r->left, r->bottom - r->top, SWP_SHOWWINDOW | SWP_NOACTIVATE))
5009 ERR("Failed to resize window.\n");
5010
5012}
5013
5014static void CDECL device_parent_activate(struct wined3d_device_parent *device_parent, BOOL activate)
5015{
5017
5018 TRACE("device_parent %p, activate %#x.\n", device_parent, activate);
5019
5020 if (!activate)
5021 {
5024 }
5025 else
5026 {
5028 }
5029}
5030
5032{
5033 struct ddraw_surface *surface;
5034
5035 /* Railroad Tycoon 2 tries to restore surfaces from within a
5036 * WM_QUERYNEWPALETTE message handler and expects it to succeed. We
5037 * haven't received the WM_ACTIVATEAPP message by that point, so the
5038 * device state is still DDRAW_DEVICE_STATE_LOST, even though we are in
5039 * the foreground. */
5041 {
5043
5044 if (window && GetForegroundWindow() == window)
5046 }
5047
5049 return;
5050
5052 {
5053 surface->is_lost = ddraw_surface_can_be_lost(surface);
5054 }
5056}
5057
5060 void **parent, const struct wined3d_parent_ops **parent_ops)
5061{
5062 TRACE("device_parent %p, type %#x, wined3d_texture %p, sub_resource_idx %u, parent %p, parent_ops %p.\n",
5063 device_parent, type, wined3d_texture, sub_resource_idx, parent, parent_ops);
5064
5065 *parent = NULL;
5066 *parent_ops = &ddraw_null_wined3d_parent_ops;
5067
5068 return DD_OK;
5069}
5070
5072{
5077};
5078
5080{
5081 struct wined3d_caps caps;
5082 HRESULT hr;
5083
5084 static const enum wined3d_feature_level feature_levels[] =
5085 {
5089 };
5090
5095 ddraw->IDirect3D_iface.lpVtbl = &d3d1_vtbl;
5096 ddraw->IDirect3D2_iface.lpVtbl = &d3d2_vtbl;
5097 ddraw->IDirect3D3_iface.lpVtbl = &d3d3_vtbl;
5098 ddraw->IDirect3D7_iface.lpVtbl = &d3d7_vtbl;
5101 ddraw->numIfaces = 1;
5102 ddraw->ref7 = 1;
5103
5105 if (!(ddraw->wined3d = wined3d_create(flags)))
5106 {
5108 if (!(ddraw->wined3d = wined3d_create(flags)))
5109 {
5110 WARN("Failed to create a wined3d object.\n");
5111 return E_FAIL;
5112 }
5113 }
5114
5116 {
5117 WARN("Failed to get the default wined3d adapter.\n");
5119 return E_FAIL;
5120 }
5121
5123 {
5124 WARN("Failed to get the default wined3d output.\n");
5126 return E_FAIL;
5127 }
5128
5130 {
5131 ERR("Failed to get device caps, hr %#lx.\n", hr);
5133 return E_FAIL;
5134 }
5135
5136 if (!(caps.ddraw_caps.caps & WINEDDCAPS_3D))
5137 {
5138 WARN("Created a wined3d object without 3D support.\n");
5140 }
5141
5145 {
5146 WARN("Failed to create a wined3d device, hr %#lx.\n", hr);
5148 return hr;
5149 }
5151
5154 return DD_OK;
5155}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
static const char * wine_dbgstr_rect(const RECT *prc)
Definition: atltest.h:160
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
Definition: list.h:39
HDC dc
Definition: cylfrac.c:34
#define D3DMAXUSERCLIPPLANES
Definition: d3d8types.h:75
#define D3D_OK
Definition: d3d.h:106
#define WIDTH
Definition: d3dtest.c:13
#define HEIGHT
Definition: d3dtest.c:14
#define D3DENUMRET_OK
Definition: d3dtypes.h:81
HRESULT(CALLBACK * LPD3DENUMPIXELFORMATSCALLBACK)(DDPIXELFORMAT *format, void *ctx)
Definition: d3dtypes.h:85
#define D3DCOLOR_RGB
Definition: d3dtypes.h:627
#define DDRAW_SCL_RECURSIVE
Definition: ddraw_private.h:58
DWORD force_refresh_rate
Definition: main.c:38
struct ddraw_surface * unsafe_impl_from_IDirectDrawSurface4(IDirectDrawSurface4 *iface)
Definition: surface.c:5966
@ DDRAW_DEVICE_STATE_LOST
Definition: ddraw_private.h:76
@ DDRAW_DEVICE_STATE_NOT_RESTORED
Definition: ddraw_private.h:77
@ DDRAW_DEVICE_STATE_OK
Definition: ddraw_private.h:75
void d3d_viewport_init(struct d3d_viewport *viewport, struct ddraw *ddraw)
Definition: viewport.c:1232
void DDSD_to_DDSD2(const DDSURFACEDESC *in, DDSURFACEDESC2 *out)
Definition: utils.c:1198
#define DDRAW_RESTORE_MODE
Definition: ddraw_private.h:55
void DDSD2_to_DDSD(const DDSURFACEDESC2 *in, DDSURFACEDESC *out)
Definition: utils.c:1242
static struct ddraw_palette * impl_from_IDirectDrawPalette(IDirectDrawPalette *iface)
HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **buffer, struct ddraw *ddraw, D3DVERTEXBUFFERDESC *desc)
Definition: vertexbuffer.c:443
#define DDRAW_INITIALIZED
Definition: ddraw_private.h:53
HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_desc, struct ddraw_surface **surface, IUnknown *outer_unknown, unsigned int version)
Definition: surface.c:6535
#define DDRAW_SCL_DDRAW1
Definition: ddraw_private.h:57
#define DDRAW_STRIDE_ALIGNMENT
Definition: ddraw_private.h:61
#define DDRAW_NO3D
Definition: ddraw_private.h:56
void DDRAW_dump_DDSCAPS2(const DDSCAPS2 *in)
Definition: utils.c:710
HRESULT hr_ddraw_from_wined3d(HRESULT hr)
Definition: utils.c:1183
#define DDRAW_WINDOW_CLASS_NAME
void DDRAW_dump_surface_desc(const DDSURFACEDESC2 *lpddsd)
Definition: utils.c:857
void DDRAW_dump_cooperativelevel(DWORD cooplevel)
Definition: utils.c:960
void d3d_light_init(struct d3d_light *light, struct ddraw *ddraw)
Definition: light.c:250
struct ddraw_surface * unsafe_impl_from_IDirectDrawSurface7(IDirectDrawSurface7 *iface)
Definition: surface.c:5950
#define DDRAW_D3D_INITIALIZED
Definition: ddraw_private.h:54
static void ddraw_set_swapchain_window(struct ddraw *ddraw, HWND window)
struct ddraw_surface * unsafe_impl_from_IDirectDrawSurface(IDirectDrawSurface *iface)
Definition: surface.c:6014
#define DD_STRUCT_COPY_BYSIZE(to, from)
#define DDRAW_WINED3D_SWAPCHAIN_FLAGS
Definition: ddraw_private.h:67
struct d3d_material * d3d_material_create(struct ddraw *ddraw)
Definition: material.c:498
void DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(const DDDEVICEIDENTIFIER2 *pIn, DDDEVICEIDENTIFIER *pOut)
Definition: utils.c:953
void ddrawformat_from_wined3dformat(DDPIXELFORMAT *ddraw_format, enum wined3d_format_id wined3d_format)
Definition: utils.c:30
static BOOL ddraw_surface_can_be_lost(const struct ddraw_surface *surface)
static struct ddraw_surface * impl_from_IDirectDrawSurface7(IDirectDrawSurface7 *iface)
HRESULT d3d_device_create(struct ddraw *ddraw, const GUID *guid, struct ddraw_surface *target, IUnknown *rt_iface, UINT version, struct d3d_device **device, IUnknown *outer_unknown)
Definition: device.c:6959
#define DDRAW_WINED3D_FLAGS
Definition: ddraw_private.h:63
HRESULT ddraw_palette_init(struct ddraw_palette *palette, struct ddraw *ddraw, DWORD flags, PALETTEENTRY *entries)
Definition: palette.c:256
void DDRAW_dump_DDCAPS(const DDCAPS *lpcaps)
Definition: utils.c:982
const GUID IID_D3DDEVICE_WineD3D
Definition: device.c:36
void DDRAW_Convert_DDSCAPS_1_To_2(const DDSCAPS *pIn, DDSCAPS2 *pOut)
Definition: utils.c:943
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
device_type
HRESULT ddraw_clipper_init(struct ddraw_clipper *clipper)
Definition: clipper.c:381
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static const struct pixel_format_desc formats[]
Definition: util.c:31
struct wined3d_vertex_declaration * ddraw_find_decl(struct ddraw *This, DWORD fvf)
Definition: ddraw.c:4917
static HRESULT WINAPI d3d1_CreateViewport(IDirect3D *iface, IDirect3DViewport **viewport, IUnknown *outer_unknown)
Definition: ddraw.c:4178
static HRESULT WINAPI ddraw7_SetDisplayMode(IDirectDraw7 *iface, DWORD width, DWORD height, DWORD bpp, DWORD refresh_rate, DWORD flags)
Definition: ddraw.c:1092
static void ddraw_destroy_swapchain(struct ddraw *ddraw)
Definition: ddraw.c:378
static HRESULT WINAPI ddraw4_GetGDISurface(IDirectDraw4 *iface, IDirectDrawSurface4 **surface)
Definition: ddraw.c:2341
static const struct ddraw * exclusive_ddraw
Definition: ddraw.c:32
static HRESULT WINAPI ddraw1_DuplicateSurface(IDirectDraw *iface, IDirectDrawSurface *src, IDirectDrawSurface **dst)
Definition: ddraw.c:3746
static HRESULT WINAPI ddraw4_EnumSurfaces(IDirectDraw4 *iface, DWORD flags, DDSURFACEDESC2 *surface_desc, void *context, LPDDENUMSURFACESCALLBACK2 callback)
Definition: ddraw.c:3396
static HRESULT WINAPI ddraw4_GetSurfaceFromDC(IDirectDraw4 *iface, HDC dc, IDirectDrawSurface4 **surface)
Definition: ddraw.c:2757
static HRESULT WINAPI ddraw4_GetVerticalBlankStatus(IDirectDraw4 *iface, BOOL *status)
Definition: ddraw.c:1909
static HRESULT WINAPI ddraw1_RestoreDisplayMode(IDirectDraw *iface)
Definition: ddraw.c:745
static HRESULT WINAPI ddraw1_WaitForVerticalBlank(IDirectDraw *iface, DWORD flags, HANDLE event)
Definition: ddraw.c:2224
static const struct IDirect3D3Vtbl d3d3_vtbl
Definition: ddraw.c:4850
static const struct wined3d_swapchain_state_parent_ops ddraw_swapchain_state_parent_ops
Definition: ddraw.c:93
static HRESULT WINAPI ddraw7_StartModeTest(IDirectDraw7 *iface, SIZE *Modes, DWORD NumModes, DWORD Flags)
Definition: ddraw.c:2831
static ULONG WINAPI d3d1_Release(IDirect3D *iface)
Definition: ddraw.c:539
static HRESULT WINAPI ddraw7_Compact(IDirectDraw7 *iface)
Definition: ddraw.c:1627
static HRESULT WINAPI d3d1_CreateLight(IDirect3D *iface, IDirect3DLight **light, IUnknown *outer_unknown)
Definition: ddraw.c:4030
static void CDECL ddraw_swapchain_windowed_state_changed(struct wined3d_swapchain_state_parent *parent, BOOL windowed)
Definition: ddraw.c:87
static void CDECL device_parent_mode_changed(struct wined3d_device_parent *device_parent)
Definition: ddraw.c:4984
HRESULT ddraw_get_d3dcaps(const struct ddraw *ddraw, D3DDEVICEDESC7 *caps)
Definition: ddraw.c:1287
static HRESULT WINAPI d3d3_CreateMaterial(IDirect3D3 *iface, IDirect3DMaterial3 **material, IUnknown *outer_unknown)
Definition: ddraw.c:4059
static HRESULT WINAPI ddraw4_CreatePalette(IDirectDraw4 *iface, DWORD flags, PALETTEENTRY *entries, IDirectDrawPalette **palette, IUnknown *outer_unknown)
Definition: ddraw.c:3609
HRESULT WINAPI DirectDrawCreateClipper(DWORD flags, IDirectDrawClipper **clipper, IUnknown *outer_unknown)
Definition: ddraw.c:3463
static const struct IDirect3D7Vtbl d3d7_vtbl
Definition: ddraw.c:4836
static HRESULT WINAPI d3d3_EvictManagedTextures(IDirect3D3 *iface)
Definition: ddraw.c:4686
static HRESULT WINAPI ddraw1_GetScanLine(IDirectDraw *iface, DWORD *line)
Definition: ddraw.c:2276
static HRESULT WINAPI d3d2_EnumDevices(IDirect3D2 *iface, LPD3DENUMDEVICESCALLBACK callback, void *context)
Definition: ddraw.c:3957
static struct ddraw * impl_from_IDirectDraw(IDirectDraw *iface)
Definition: ddraw.c:98
static HRESULT WINAPI d3d3_CreateLight(IDirect3D3 *iface, IDirect3DLight **light, IUnknown *outer_unknown)
Definition: ddraw.c:3996
static HRESULT WINAPI ddraw7_GetMonitorFrequency(IDirectDraw7 *iface, DWORD *frequency)
Definition: ddraw.c:1835
static BOOL ddraw_match_surface_desc(const DDSURFACEDESC2 *requested, const DDSURFACEDESC2 *provided)
Definition: ddraw.c:3147
static HRESULT WINAPI ddraw4_WaitForVerticalBlank(IDirectDraw4 *iface, DWORD flags, HANDLE event)
Definition: ddraw.c:2206
static HRESULT WINAPI ddraw7_CreateClipper(IDirectDraw7 *iface, DWORD Flags, IDirectDrawClipper **Clipper, IUnknown *UnkOuter)
Definition: ddraw.c:3504
static HRESULT WINAPI ddraw2_GetScanLine(IDirectDraw2 *iface, DWORD *line)
Definition: ddraw.c:2267
static struct ddraw * impl_from_IDirect3D(IDirect3D *iface)
Definition: ddraw.c:118
static HRESULT WINAPI ddraw7_CreateSurface(IDirectDraw7 *iface, DDSURFACEDESC2 *surface_desc, IDirectDrawSurface7 **surface, IUnknown *outer_unknown)
Definition: ddraw.c:2850
static HRESULT WINAPI ddraw1_GetDisplayMode(IDirectDraw *iface, DDSURFACEDESC *surface_desc)
Definition: ddraw.c:1738
static ULONG WINAPI d3d3_AddRef(IDirect3D3 *iface)
Definition: ddraw.c:351
static HRESULT WINAPI d3d7_EnumDevices(IDirect3D7 *iface, LPD3DENUMDEVICESCALLBACK7 callback, void *context)
Definition: ddraw.c:3783
static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr)
Definition: ddraw.c:4299
static HRESULT CALLBACK EnumDisplayModesCallbackThunk(DDSURFACEDESC2 *surface_desc, void *context)
Definition: ddraw.c:2416
static HRESULT WINAPI ddraw2_DuplicateSurface(IDirectDraw2 *iface, IDirectDrawSurface *src, IDirectDrawSurface **dst)
Definition: ddraw.c:3723
static HRESULT WINAPI ddraw1_EnumSurfaces(IDirectDraw *iface, DWORD flags, DDSURFACEDESC *surface_desc, void *context, LPDDENUMSURFACESCALLBACK callback)
Definition: ddraw.c:3430
static ULONG WINAPI d3d2_AddRef(IDirect3D2 *iface)
Definition: ddraw.c:360
static HRESULT WINAPI ddraw1_GetMonitorFrequency(IDirectDraw *iface, DWORD *frequency)
Definition: ddraw.c:1875
static HRESULT WINAPI ddraw2_EnumDisplayModes(IDirectDraw2 *iface, DWORD flags, DDSURFACEDESC *surface_desc, void *context, LPDDENUMMODESCALLBACK callback)
Definition: ddraw.c:2573
static HRESULT WINAPI ddraw1_GetFourCCCodes(IDirectDraw *iface, DWORD *codes_count, DWORD *codes)
Definition: ddraw.c:1826
static HRESULT WINAPI ddraw7_FlipToGDISurface(IDirectDraw7 *iface)
Definition: ddraw.c:2112
static HRESULT WINAPI ddraw4_FlipToGDISurface(IDirectDraw4 *iface)
Definition: ddraw.c:2142
static HRESULT WINAPI ddraw2_GetFourCCCodes(IDirectDraw2 *iface, DWORD *codes_count, DWORD *codes)
Definition: ddraw.c:1817
static ULONG WINAPI ddraw2_Release(IDirectDraw2 *iface)
Definition: ddraw.c:486
static HRESULT WINAPI d3d3_EnumZBufferFormats(IDirect3D3 *iface, REFCLSID device_iid, LPD3DENUMPIXELFORMATSCALLBACK callback, void *context)
Definition: ddraw.c:4649
static struct ddraw * impl_from_IDirect3D7(IDirect3D7 *iface)
Definition: ddraw.c:133
static HRESULT WINAPI ddraw2_SetCooperativeLevel(IDirectDraw2 *iface, HWND window, DWORD flags)
Definition: ddraw.c:1048
static ULONG WINAPI ddraw2_AddRef(IDirectDraw2 *iface)
Definition: ddraw.c:318
static HRESULT WINAPI ddraw4_CreateClipper(IDirectDraw4 *iface, DWORD flags, IDirectDrawClipper **clipper, IUnknown *outer_unknown)
Definition: ddraw.c:3513
static HRESULT WINAPI ddraw7_EnumSurfaces(IDirectDraw7 *iface, DWORD flags, DDSURFACEDESC2 *surface_desc, void *context, LPDDENUMSURFACESCALLBACK7 callback)
Definition: ddraw.c:3298
static const struct IDirect3D2Vtbl d3d2_vtbl
Definition: ddraw.c:4868
static HRESULT ddraw_find_device(struct ddraw *ddraw, const D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr, unsigned int guid_count, const GUID *const *guids, DWORD device_desc_size)
Definition: ddraw.c:4188
static ULONG WINAPI ddraw1_AddRef(IDirectDraw *iface)
Definition: ddraw.c:330
static HRESULT WINAPI ddraw2_Initialize(IDirectDraw2 *iface, GUID *guid)
Definition: ddraw.c:2074
static HRESULT WINAPI ddraw2_EnumSurfaces(IDirectDraw2 *iface, DWORD flags, DDSURFACEDESC *surface_desc, void *context, LPDDENUMSURFACESCALLBACK callback)
Definition: ddraw.c:3412
static HRESULT WINAPI d3d2_CreateDevice(IDirect3D2 *iface, REFCLSID riid, IDirectDrawSurface *surface, IDirect3DDevice2 **device)
Definition: ddraw.c:4422
static HRESULT WINAPI ddraw2_QueryInterface(IDirectDraw2 *iface, REFIID riid, void **object)
Definition: ddraw.c:222
static ULONG WINAPI ddraw7_AddRef(IDirectDraw7 *iface)
Definition: ddraw.c:294
static HRESULT WINAPI ddraw7_GetDisplayMode(IDirectDraw7 *iface, DDSURFACEDESC2 *DDSD)
Definition: ddraw.c:1675
static const struct IDirectDraw2Vtbl ddraw2_vtbl
Definition: ddraw.c:4775
static HRESULT WINAPI d3d1_QueryInterface(IDirect3D *iface, REFIID riid, void **object)
Definition: ddraw.c:267
static HRESULT WINAPI ddraw7_GetDeviceIdentifier(IDirectDraw7 *iface, DDDEVICEIDENTIFIER2 *DDDI, DWORD Flags)
Definition: ddraw.c:2649
static BOOL Main_DirectDraw_DDPIXELFORMAT_Match(const DDPIXELFORMAT *requested, const DDPIXELFORMAT *provided)
Definition: ddraw.c:3102
static HRESULT ddraw_set_cooperative_level(struct ddraw *ddraw, HWND window, DWORD cooplevel, BOOL restore_mode_on_normal)
Definition: ddraw.c:796
#define CMP(FLAG, FIELD)
static HRESULT WINAPI ddraw1_CreateClipper(IDirectDraw *iface, DWORD flags, IDirectDrawClipper **clipper, IUnknown *outer_unknown)
Definition: ddraw.c:3535
static HRESULT WINAPI d3d2_FindDevice(IDirect3D2 *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr)
Definition: ddraw.c:4314
static HRESULT WINAPI ddraw2_GetDisplayMode(IDirectDraw2 *iface, DDSURFACEDESC *surface_desc)
Definition: ddraw.c:1726
static HRESULT WINAPI ddraw4_Initialize(IDirectDraw4 *iface, GUID *guid)
Definition: ddraw.c:2065
static struct ddraw * impl_from_IDirectDraw2(IDirectDraw2 *iface)
Definition: ddraw.c:103
static void STDMETHODCALLTYPE ddraw_null_wined3d_object_destroyed(void *parent)
Definition: ddraw.c:80
static HRESULT WINAPI d3d3_CreateDevice(IDirect3D3 *iface, REFCLSID riid, IDirectDrawSurface4 *surface, IDirect3DDevice3 **device, IUnknown *outer_unknown)
Definition: ddraw.c:4393
static struct ddraw * ddraw_from_device_parent(struct wined3d_device_parent *device_parent)
Definition: ddraw.c:4969
static HRESULT WINAPI ddraw7_CreatePalette(IDirectDraw7 *iface, DWORD Flags, PALETTEENTRY *ColorTable, IDirectDrawPalette **Palette, IUnknown *pUnkOuter)
Definition: ddraw.c:3563
static HRESULT WINAPI ddraw4_EnumDisplayModes(IDirectDraw4 *iface, DWORD flags, DDSURFACEDESC2 *surface_desc, void *context, LPDDENUMMODESCALLBACK2 callback)
Definition: ddraw.c:2562
static HRESULT WINAPI ddraw4_TestCooperativeLevel(IDirectDraw4 *iface)
Definition: ddraw.c:2294
static HRESULT WINAPI ddraw4_GetMonitorFrequency(IDirectDraw4 *iface, DWORD *frequency)
Definition: ddraw.c:1857
static HRESULT WINAPI ddraw2_CreatePalette(IDirectDraw2 *iface, DWORD flags, PALETTEENTRY *entries, IDirectDrawPalette **palette, IUnknown *outer_unknown)
Definition: ddraw.c:3629
static ULONG WINAPI d3d7_Release(IDirect3D7 *iface)
Definition: ddraw.c:512
HRESULT ddraw_init(struct ddraw *ddraw, DWORD flags, enum wined3d_device_type device_type)
Definition: ddraw.c:5079
static HRESULT WINAPI ddraw1_GetVerticalBlankStatus(IDirectDraw *iface, BOOL *status)
Definition: ddraw.c:1927
static HRESULT WINAPI ddraw7_GetSurfaceFromDC(IDirectDraw7 *iface, HDC dc, IDirectDrawSurface7 **surface)
Definition: ddraw.c:2723
static HRESULT CALLBACK enum_surface_mode_callback(DDSURFACEDESC2 *surface_desc, void *context)
Definition: ddraw.c:3259
static HRESULT WINAPI ddraw4_GetDisplayMode(IDirectDraw4 *iface, DDSURFACEDESC2 *surface_desc)
Definition: ddraw.c:1717
static HRESULT WINAPI d3d1_CreateMaterial(IDirect3D *iface, IDirect3DMaterial **material, IUnknown *outer_unknown)
Definition: ddraw.c:4103
static HRESULT WINAPI ddraw2_GetGDISurface(IDirectDraw2 *iface, IDirectDrawSurface **surface)
Definition: ddraw.c:2364
static HRESULT WINAPI ddraw1_CreateSurface(IDirectDraw *iface, DDSURFACEDESC *surface_desc, IDirectDrawSurface **surface, IUnknown *outer_unknown)
Definition: ddraw.c:3040
static HRESULT WINAPI ddraw2_FlipToGDISurface(IDirectDraw2 *iface)
Definition: ddraw.c:2151
static ULONG WINAPI ddraw1_Release(IDirectDraw *iface)
Definition: ddraw.c:499
static HRESULT WINAPI d3d3_QueryInterface(IDirect3D3 *iface, REFIID riid, void **object)
Definition: ddraw.c:249
static HRESULT CALLBACK EnumSurfacesCallback2Thunk(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *surface_desc, void *context)
Definition: ddraw.c:3219
static HRESULT WINAPI ddraw2_SetDisplayMode(IDirectDraw2 *iface, DWORD width, DWORD height, DWORD bpp, DWORD refresh_rate, DWORD flags)
Definition: ddraw.c:1183
static HRESULT WINAPI ddraw7_QueryInterface(IDirectDraw7 *iface, REFIID riid, void **out)
Definition: ddraw.c:138
static HRESULT WINAPI ddraw1_FlipToGDISurface(IDirectDraw *iface)
Definition: ddraw.c:2160
static void CDECL device_parent_activate(struct wined3d_device_parent *device_parent, BOOL activate)
Definition: ddraw.c:5014
static HRESULT WINAPI ddraw7_EvaluateMode(IDirectDraw7 *iface, DWORD Flags, DWORD *Timeout)
Definition: ddraw.c:2625
static HRESULT WINAPI ddraw1_SetCooperativeLevel(IDirectDraw *iface, HWND window, DWORD flags)
Definition: ddraw.c:1057
static HRESULT WINAPI d3d2_CreateViewport(IDirect3D2 *iface, IDirect3DViewport2 **viewport, IUnknown *outer_unknown)
Definition: ddraw.c:4168
static struct enum_device_entry device_list7[]
static HRESULT WINAPI ddraw4_QueryInterface(IDirectDraw4 *iface, REFIID riid, void **object)
Definition: ddraw.c:213
static HWND exclusive_window
Definition: ddraw.c:33
static HRESULT WINAPI ddraw4_RestoreDisplayMode(IDirectDraw4 *iface)
Definition: ddraw.c:727
static HRESULT WINAPI ddraw4_SetDisplayMode(IDirectDraw4 *iface, DWORD width, DWORD height, DWORD bpp, DWORD refresh_rate, DWORD flags)
Definition: ddraw.c:1172
static HRESULT WINAPI d3d7_CreateVertexBuffer(IDirect3D7 *iface, D3DVERTEXBUFFERDESC *desc, IDirect3DVertexBuffer7 **vertex_buffer, DWORD flags)
Definition: ddraw.c:4467
static HRESULT WINAPI ddraw2_GetVerticalBlankStatus(IDirectDraw2 *iface, BOOL *status)
Definition: ddraw.c:1918
static HRESULT WINAPI ddraw4_Compact(IDirectDraw4 *iface)
Definition: ddraw.c:1634
static HRESULT WINAPI ddraw7_GetGDISurface(IDirectDraw7 *iface, IDirectDrawSurface7 **surface)
Definition: ddraw.c:2317
static HRESULT WINAPI ddraw7_Initialize(IDirectDraw7 *iface, GUID *guid)
Definition: ddraw.c:2047
static HRESULT WINAPI ddraw4_GetDeviceIdentifier(IDirectDraw4 *iface, DDDEVICEIDENTIFIER *identifier, DWORD flags)
Definition: ddraw.c:2694
static HRESULT WINAPI ddraw4_CreateSurface(IDirectDraw4 *iface, DDSURFACEDESC2 *surface_desc, IDirectDrawSurface4 **surface, IUnknown *outer_unknown)
Definition: ddraw.c:2913
static const DDDEVICEIDENTIFIER2 deviceidentifier
Definition: ddraw.c:36
static HRESULT WINAPI d3d3_CreateVertexBuffer(IDirect3D3 *iface, D3DVERTEXBUFFERDESC *desc, IDirect3DVertexBuffer **vertex_buffer, DWORD flags, IUnknown *outer_unknown)
Definition: ddraw.c:4491
static HRESULT WINAPI ddraw4_SetCooperativeLevel(IDirectDraw4 *iface, HWND window, DWORD flags)
Definition: ddraw.c:1039
static HRESULT WINAPI d3d2_CreateLight(IDirect3D2 *iface, IDirect3DLight **light, IUnknown *outer_unknown)
Definition: ddraw.c:4021
static struct ddraw * impl_from_IDirect3D2(IDirect3D2 *iface)
Definition: ddraw.c:123
static HRESULT WINAPI d3d7_QueryInterface(IDirect3D7 *iface, REFIID riid, void **object)
Definition: ddraw.c:240
static HRESULT WINAPI d3d1_Initialize(IDirect3D *iface, REFIID riid)
Definition: ddraw.c:2092
static HRESULT WINAPI ddraw1_Compact(IDirectDraw *iface)
Definition: ddraw.c:1652
static HRESULT WINAPI ddraw2_GetAvailableVidMem(IDirectDraw2 *iface, DDSCAPS *caps, DWORD *total, DWORD *free)
Definition: ddraw.c:2021
static const struct IDirectDraw7Vtbl ddraw7_vtbl
Definition: ddraw.c:4698
static HRESULT WINAPI ddraw1_CreatePalette(IDirectDraw *iface, DWORD flags, PALETTEENTRY *entries, IDirectDrawPalette **palette, IUnknown *outer_unknown)
Definition: ddraw.c:3649
void ddraw_update_lost_surfaces(struct ddraw *ddraw)
Definition: ddraw.c:5031
static HRESULT WINAPI ddraw2_GetCaps(IDirectDraw2 *iface, DDCAPS *driver_caps, DDCAPS *hel_caps)
Definition: ddraw.c:1600
static HRESULT WINAPI d3d1_EnumDevices(IDirect3D *iface, LPD3DENUMDEVICESCALLBACK callback, void *context)
Definition: ddraw.c:3966
static HRESULT WINAPI d3d7_EnumZBufferFormats(IDirect3D7 *iface, REFCLSID device_iid, LPD3DENUMPIXELFORMATSCALLBACK callback, void *context)
Definition: ddraw.c:4535
static ULONG WINAPI d3d2_Release(IDirect3D2 *iface)
Definition: ddraw.c:530
static HRESULT WINAPI ddraw4_GetFourCCCodes(IDirectDraw4 *iface, DWORD *codes_count, DWORD *codes)
Definition: ddraw.c:1808
static HRESULT WINAPI ddraw1_Initialize(IDirectDraw *iface, GUID *guid)
Definition: ddraw.c:2083
static HRESULT ddraw_create_swapchain(struct ddraw *ddraw, HWND window, DWORD cooplevel)
Definition: ddraw.c:651
static HRESULT WINAPI ddraw2_RestoreDisplayMode(IDirectDraw2 *iface)
Definition: ddraw.c:736
static HRESULT WINAPI ddraw7_GetVerticalBlankStatus(IDirectDraw7 *iface, BOOL *status)
Definition: ddraw.c:1884
static HRESULT WINAPI ddraw7_TestCooperativeLevel(IDirectDraw7 *iface)
Definition: ddraw.c:2285
static HRESULT WINAPI ddraw7_EnumDisplayModes(IDirectDraw7 *iface, DWORD Flags, DDSURFACEDESC2 *DDSD, void *Context, LPDDENUMMODESCALLBACK2 cb)
Definition: ddraw.c:2443
static HRESULT WINAPI ddraw1_GetGDISurface(IDirectDraw *iface, IDirectDrawSurface **surface)
Definition: ddraw.c:2387
static HRESULT WINAPI ddraw4_GetCaps(IDirectDraw4 *iface, DDCAPS *driver_caps, DDCAPS *hel_caps)
Definition: ddraw.c:1591
static ULONG WINAPI d3d7_AddRef(IDirect3D7 *iface)
Definition: ddraw.c:342
static ULONG WINAPI ddraw4_AddRef(IDirectDraw4 *iface)
Definition: ddraw.c:306
static const struct IDirect3DVtbl d3d1_vtbl
Definition: ddraw.c:4883
static HRESULT WINAPI ddraw7_GetAvailableVidMem(IDirectDraw7 *iface, DDSCAPS2 *caps, DWORD *total, DWORD *free)
Definition: ddraw.c:1951
static HRESULT WINAPI ddraw1_GetCaps(IDirectDraw *iface, DDCAPS *driver_caps, DDCAPS *hel_caps)
Definition: ddraw.c:1609
static HRESULT WINAPI ddraw4_GetAvailableVidMem(IDirectDraw4 *iface, DDSCAPS2 *caps, DWORD *total, DWORD *free)
Definition: ddraw.c:2011
static HRESULT WINAPI d3d7_CreateDevice(IDirect3D7 *iface, REFCLSID riid, IDirectDrawSurface7 *surface, IDirect3DDevice7 **device)
Definition: ddraw.c:4368
static HRESULT CALLBACK restore_callback(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *desc, void *context)
Definition: ddraw.c:2784
static HRESULT WINAPI ddraw2_GetMonitorFrequency(IDirectDraw2 *iface, DWORD *frequency)
Definition: ddraw.c:1866
static HRESULT WINAPI ddraw7_RestoreDisplayMode(IDirectDraw7 *iface)
Definition: ddraw.c:686
static HRESULT WINAPI ddraw7_GetScanLine(IDirectDraw7 *iface, DWORD *Scanline)
Definition: ddraw.c:2233
static const struct wined3d_device_parent_ops ddraw_wined3d_device_parent_ops
Definition: ddraw.c:5071
static HRESULT WINAPI ddraw7_SetCooperativeLevel(IDirectDraw7 *iface, HWND window, DWORD flags)
Definition: ddraw.c:1030
static HRESULT WINAPI d3d2_CreateMaterial(IDirect3D2 *iface, IDirect3DMaterial2 **material, IUnknown *outer_unknown)
Definition: ddraw.c:4082
static HRESULT WINAPI ddraw7_GetCaps(IDirectDraw7 *iface, DDCAPS *DriverCaps, DDCAPS *HELCaps)
Definition: ddraw.c:1501
static HRESULT WINAPI ddraw7_DuplicateSurface(IDirectDraw7 *iface, IDirectDrawSurface7 *Src, IDirectDrawSurface7 **Dest)
Definition: ddraw.c:3686
static const struct IDirectDraw4Vtbl ddraw4_vtbl
Definition: ddraw.c:4738
static HRESULT WINAPI ddraw7_WaitForVerticalBlank(IDirectDraw7 *iface, DWORD Flags, HANDLE event)
Definition: ddraw.c:2186
static HRESULT WINAPI d3d3_CreateViewport(IDirect3D3 *iface, IDirect3DViewport3 **viewport, IUnknown *outer_unknown)
Definition: ddraw.c:4144
static HRESULT WINAPI ddraw4_DuplicateSurface(IDirectDraw4 *iface, IDirectDrawSurface4 *src, IDirectDrawSurface4 **dst)
Definition: ddraw.c:3697
static HRESULT WINAPI d3d1_FindDevice(IDirect3D *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr)
Definition: ddraw.c:4331
static HRESULT WINAPI ddraw2_CreateClipper(IDirectDraw2 *iface, DWORD flags, IDirectDrawClipper **clipper, IUnknown *outer_unknown)
Definition: ddraw.c:3524
void ddraw_d3dcaps1_from_7(D3DDEVICEDESC *caps1, D3DDEVICEDESC7 *caps7)
Definition: ddraw.c:1203
static HRESULT WINAPI ddraw4_RestoreAllSurfaces(IDirectDraw4 *iface)
Definition: ddraw.c:2800
static HRESULT WINAPI ddraw2_WaitForVerticalBlank(IDirectDraw2 *iface, DWORD flags, HANDLE event)
Definition: ddraw.c:2215
static struct ddraw * impl_from_IDirectDraw4(IDirectDraw4 *iface)
Definition: ddraw.c:108
static struct ddraw * impl_from_IDirectDraw7(IDirectDraw7 *iface)
Definition: ddraw.c:113
static ULONG WINAPI d3d1_AddRef(IDirect3D *iface)
Definition: ddraw.c:369
static HRESULT CDECL device_parent_texture_sub_resource_created(struct wined3d_device_parent *device_parent, enum wined3d_resource_type type, struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx, void **parent, const struct wined3d_parent_ops **parent_ops)
Definition: ddraw.c:5058
static HRESULT WINAPI d3d3_EnumDevices(IDirect3D3 *iface, LPD3DENUMDEVICESCALLBACK callback, void *context)
Definition: ddraw.c:3844
static HRESULT WINAPI ddraw1_QueryInterface(IDirectDraw *iface, REFIID riid, void **object)
Definition: ddraw.c:231
static HRESULT CALLBACK EnumSurfacesCallbackThunk(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *surface_desc, void *context)
Definition: ddraw.c:3235
static HRESULT WINAPI ddraw1_EnumDisplayModes(IDirectDraw *iface, DWORD flags, DDSURFACEDESC *surface_desc, void *context, LPDDENUMMODESCALLBACK callback)
Definition: ddraw.c:2591
static HRESULT ddraw_set_focus_window(struct ddraw *ddraw, HWND window)
Definition: ddraw.c:552
static void CDECL device_parent_wined3d_device_created(struct wined3d_device_parent *device_parent, struct wined3d_device *device)
Definition: ddraw.c:4974
static ULONG WINAPI ddraw4_Release(IDirectDraw4 *iface)
Definition: ddraw.c:473
static HRESULT WINAPI ddraw1_SetDisplayMode(IDirectDraw *iface, DWORD width, DWORD height, DWORD bpp)
Definition: ddraw.c:1194
static HRESULT WINAPI ddraw4_GetScanLine(IDirectDraw4 *iface, DWORD *line)
Definition: ddraw.c:2258
static HRESULT WINAPI d3d2_QueryInterface(IDirect3D2 *iface, REFIID riid, void **object)
Definition: ddraw.c:258
static HRESULT WINAPI ddraw7_GetFourCCCodes(IDirectDraw7 *iface, DWORD *NumCodes, DWORD *Codes)
Definition: ddraw.c:1767
static void ddraw_destroy(struct ddraw *This)
Definition: ddraw.c:421
static HRESULT WINAPI ddraw2_Compact(IDirectDraw2 *iface)
Definition: ddraw.c:1643
static struct IDirectDrawVtbl ddraw1_vtbl
Definition: ddraw.c:4807
const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops
Definition: ddraw.c:82
static HRESULT ddraw_attach_d3d_device(struct ddraw *ddraw, HWND window, DWORD cooplevel, struct wined3d_swapchain **wined3d_swapchain)
Definition: ddraw.c:567
static HRESULT WINAPI ddraw7_RestoreAllSurfaces(IDirectDraw7 *iface)
Definition: ddraw.c:2792
static ULONG WINAPI ddraw7_Release(IDirectDraw7 *iface)
Definition: ddraw.c:460
static ULONG WINAPI d3d3_Release(IDirect3D3 *iface)
Definition: ddraw.c:521
static HRESULT WINAPI ddraw2_CreateSurface(IDirectDraw2 *iface, DDSURFACEDESC *surface_desc, IDirectDrawSurface **surface, IUnknown *outer_unknown)
Definition: ddraw.c:2976
static HRESULT WINAPI d3d7_EvictManagedTextures(IDirect3D7 *iface)
Definition: ddraw.c:4672
static struct ddraw * impl_from_IDirect3D3(IDirect3D3 *iface)
Definition: ddraw.c:128
HRESULT CDECL wined3d_device_acquire_focus_window(struct wined3d_device *device, HWND window)
Definition: device.c:1133
void CDECL wined3d_device_evict_managed_resources(struct wined3d_device *device)
Definition: device.c:4923
UINT CDECL wined3d_device_get_available_texture_mem(const struct wined3d_device *device)
Definition: device.c:1754
ULONG CDECL wined3d_device_decref(struct wined3d_device *device)
Definition: device.c:251
void CDECL wined3d_device_set_multithreaded(struct wined3d_device *device)
Definition: device.c:1746
struct wined3d_device_context *CDECL wined3d_device_get_immediate_context(struct wined3d_device *device)
Definition: device.c:1969
void CDECL wined3d_device_release_focus_window(struct wined3d_device *device)
Definition: device.c:1154
HRESULT CDECL wined3d_device_get_device_caps(const struct wined3d_device *device, struct wined3d_caps *caps)
Definition: device.c:3679
void *CDECL wined3d_texture_get_sub_resource_parent(struct wined3d_texture *texture, unsigned int sub_resource_idx)
Definition: texture.c:4033
#define CDECL
Definition: compat.h:29
#define __TRY
Definition: compat.h:80
#define TRACE_ON(x)
Definition: compat.h:75
#define __ENDTRY
Definition: compat.h:82
#define CALLBACK
Definition: compat.h:35
#define __EXCEPT_PAGE_FAULT
Definition: compat.h:81
UINT guid_count
Definition: locale.c:415
const struct sortguid * guids
Definition: locale.c:422
GUID guid
Definition: version.c:147
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
int ptrdiff_t
Definition: corecrt.h:194
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
#define UINT_MAX
Definition: limits.h:27
static int compare_info(WCHAR *name, DWORD flags, WCHAR *buff, const WCHAR *cmp, BOOL exact)
Definition: locale.c:255
pixelformat
Definition: converter.c:37
#define DDPF_LUMINANCE
Definition: ddsformat.c:61
#define DDPF_ALPHA
Definition: ddsformat.c:57
#define DDPF_FOURCC
Definition: ddsformat.c:58
#define DDPF_RGB
Definition: ddsformat.c:60
#define DDPF_PALETTEINDEXED8
Definition: ddsformat.c:59
#define DDPF_ALPHAPIXELS
Definition: ddsformat.c:56
#define DDPF_BUMPDUDV
Definition: ddsformat.c:62
return ret
Definition: mutex.c:147
r parent
Definition: btrfs.c:3010
static const WCHAR device_name[]
Definition: btrfs.c:60
#define D3DPCMPCAPS_EQUAL
Definition: d3d8caps.h:90
#define D3DPRASTERCAPS_ANTIALIASEDGES
Definition: d3d8caps.h:77
#define D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR
Definition: d3d8caps.h:171
#define D3DDEVCAPS_EXECUTESYSTEMMEMORY
Definition: d3d8caps.h:36
#define D3DTEXOPCAPS_MODULATE2X
Definition: d3d8caps.h:156
#define D3DTEXOPCAPS_ADDSIGNED2X
Definition: d3d8caps.h:160
#define D3DPTADDRESSCAPS_MIRROR
Definition: d3d8caps.h:139
#define D3DPBLENDCAPS_SRCCOLOR
Definition: d3d8caps.h:98
#define D3DDEVCAPS_CANRENDERAFTERFLIP
Definition: d3d8caps.h:43
#define D3DTEXOPCAPS_SELECTARG1
Definition: d3d8caps.h:153
#define D3DVTXPCAPS_LOCALVIEWER
Definition: d3d8caps.h:185
#define D3DPTEXTURECAPS_PROJECTED
Definition: d3d8caps.h:120
#define D3DTEXOPCAPS_BLENDCURRENTALPHA
Definition: d3d8caps.h:167
#define D3DPRASTERCAPS_WBUFFER
Definition: d3d8caps.h:83
#define D3DPBLENDCAPS_DESTCOLOR
Definition: d3d8caps.h:104
#define D3DTEXOPCAPS_ADDSMOOTH
Definition: d3d8caps.h:162
#define D3DDEVCAPS_HWTRANSFORMANDLIGHT
Definition: d3d8caps.h:48
#define D3DPTADDRESSCAPS_WRAP
Definition: d3d8caps.h:138
#define D3DPCMPCAPS_LESS
Definition: d3d8caps.h:89
#define D3DPMISCCAPS_CULLNONE
Definition: d3d8caps.h:58
#define D3DPTFILTERCAPS_MAGFAFLATCUBIC
Definition: d3d8caps.h:136
#define D3DPTFILTERCAPS_MIPFLINEAR
Definition: d3d8caps.h:132
#define D3DPMISCCAPS_CULLCW
Definition: d3d8caps.h:59
#define D3DDEVCAPS_TEXTUREVIDEOMEMORY
Definition: d3d8caps.h:41
#define D3DTEXOPCAPS_ADDSIGNED
Definition: d3d8caps.h:159
#define D3DDEVCAPS_DRAWPRIMITIVES2
Definition: d3d8caps.h:45
#define D3DPBLENDCAPS_INVSRCCOLOR
Definition: d3d8caps.h:99
#define D3DPBLENDCAPS_ZERO
Definition: d3d8caps.h:96
#define D3DSTENCILCAPS_DECR
Definition: d3d8caps.h:151
#define D3DTEXOPCAPS_BLENDTEXTUREALPHAPM
Definition: d3d8caps.h:166
#define D3DDEVCAPS_TEXTURESYSTEMMEMORY
Definition: d3d8caps.h:40
#define D3DPTFILTERCAPS_MINFANISOTROPIC
Definition: d3d8caps.h:130
#define D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE
Definition: d3d8caps.h:117
#define D3DPBLENDCAPS_INVDESTCOLOR
Definition: d3d8caps.h:105
#define D3DTEXOPCAPS_SUBTRACT
Definition: d3d8caps.h:161
#define D3DPBLENDCAPS_INVDESTALPHA
Definition: d3d8caps.h:103
#define D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA
Definition: d3d8caps.h:170
#define D3DSTENCILCAPS_INVERT
Definition: d3d8caps.h:149
#define D3DVTXPCAPS_MATERIALSOURCE7
Definition: d3d8caps.h:182
#define D3DPTFILTERCAPS_MINFLINEAR
Definition: d3d8caps.h:129
#define D3DPTEXTURECAPS_SQUAREONLY
Definition: d3d8caps.h:116
#define D3DDEVCAPS_DRAWPRIMITIVES2EX
Definition: d3d8caps.h:47
#define D3DPTFILTERCAPS_MAGFANISOTROPIC
Definition: d3d8caps.h:135
#define D3DPTEXTURECAPS_ALPHAPALETTE
Definition: d3d8caps.h:118
#define D3DPSHADECAPS_COLORGOURAUDRGB
Definition: d3d8caps.h:109
#define D3DPRASTERCAPS_ZBUFFERLESSHSR
Definition: d3d8caps.h:80
#define D3DPBLENDCAPS_SRCALPHASAT
Definition: d3d8caps.h:106
#define D3DPBLENDCAPS_BOTHSRCALPHA
Definition: d3d8caps.h:107
#define D3DDEVCAPS_EXECUTEVIDEOMEMORY
Definition: d3d8caps.h:37
#define D3DTEXOPCAPS_BUMPENVMAPLUMINANCE
Definition: d3d8caps.h:174
#define D3DPRASTERCAPS_WFOG
Definition: d3d8caps.h:84
#define D3DPTADDRESSCAPS_BORDER
Definition: d3d8caps.h:141
#define D3DPTADDRESSCAPS_INDEPENDENTUV
Definition: d3d8caps.h:142
#define D3DPSHADECAPS_FOGGOURAUD
Definition: d3d8caps.h:112
#define D3DPTEXTURECAPS_ALPHA
Definition: d3d8caps.h:115
#define D3DDEVCAPS_SEPARATETEXTUREMEMORIES
Definition: d3d8caps.h:46
#define D3DTEXOPCAPS_DISABLE
Definition: d3d8caps.h:152
#define D3DPSHADECAPS_SPECULARGOURAUDRGB
Definition: d3d8caps.h:110
#define D3DPMISCCAPS_CULLCCW
Definition: d3d8caps.h:60
#define D3DTEXOPCAPS_SELECTARG2
Definition: d3d8caps.h:154
#define D3DPMISCCAPS_LINEPATTERNREP
Definition: d3d8caps.h:57
#define D3DPCMPCAPS_NOTEQUAL
Definition: d3d8caps.h:93
#define D3DSTENCILCAPS_DECRSAT
Definition: d3d8caps.h:148
#define D3DDEVCAPS_DRAWPRIMTLVERTEX
Definition: d3d8caps.h:42
#define D3DPRASTERCAPS_ANISOTROPY
Definition: d3d8caps.h:82
#define D3DVTXPCAPS_DIRECTIONALLIGHTS
Definition: d3d8caps.h:183
#define D3DDEVCAPS_TLVERTEXSYSTEMMEMORY
Definition: d3d8caps.h:38
#define D3DPBLENDCAPS_INVSRCALPHA
Definition: d3d8caps.h:101
#define D3DSTENCILCAPS_ZERO
Definition: d3d8caps.h:145
#define D3DPRASTERCAPS_ZFOG
Definition: d3d8caps.h:85
#define D3DPCMPCAPS_GREATER
Definition: d3d8caps.h:92
#define D3DPBLENDCAPS_DESTALPHA
Definition: d3d8caps.h:102
#define D3DTEXOPCAPS_BLENDTEXTUREALPHA
Definition: d3d8caps.h:164
#define D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC
Definition: d3d8caps.h:137
#define D3DSTENCILCAPS_INCR
Definition: d3d8caps.h:150
#define D3DPTEXTURECAPS_NONPOW2CONDITIONAL
Definition: d3d8caps.h:119
#define D3DTEXOPCAPS_MODULATE
Definition: d3d8caps.h:155
#define D3DPRASTERCAPS_PAT
Definition: d3d8caps.h:73
#define D3DTEXOPCAPS_BUMPENVMAP
Definition: d3d8caps.h:173
#define D3DPCMPCAPS_ALWAYS
Definition: d3d8caps.h:95
#define D3DPRASTERCAPS_FOGRANGE
Definition: d3d8caps.h:81
#define D3DPSHADECAPS_ALPHAGOURAUDBLEND
Definition: d3d8caps.h:111
#define D3DPTEXTURECAPS_PERSPECTIVE
Definition: d3d8caps.h:113
#define D3DPBLENDCAPS_SRCALPHA
Definition: d3d8caps.h:100
#define D3DDEVCAPS_HWRASTERIZATION
Definition: d3d8caps.h:50
#define D3DPBLENDCAPS_ONE
Definition: d3d8caps.h:97
#define D3DTEXOPCAPS_PREMODULATE
Definition: d3d8caps.h:168
#define D3DPRASTERCAPS_FOGVERTEX
Definition: d3d8caps.h:75
#define D3DTEXOPCAPS_BLENDFACTORALPHA
Definition: d3d8caps.h:165
#define D3DSTENCILCAPS_INCRSAT
Definition: d3d8caps.h:147
#define D3DPCMPCAPS_LESSEQUAL
Definition: d3d8caps.h:91
#define D3DPTFILTERCAPS_MAGFLINEAR
Definition: d3d8caps.h:134
#define D3DPTADDRESSCAPS_CLAMP
Definition: d3d8caps.h:140
#define D3DPTFILTERCAPS_MINFPOINT
Definition: d3d8caps.h:128
#define D3DPTEXTURECAPS_CUBEMAP
Definition: d3d8caps.h:121
#define D3DDEVCAPS_TEXTURENONLOCALVIDMEM
Definition: d3d8caps.h:44
#define D3DVTXPCAPS_TEXGEN
Definition: d3d8caps.h:181
#define D3DTEXOPCAPS_DOTPRODUCT3
Definition: d3d8caps.h:175
#define D3DPBLENDCAPS_BOTHINVSRCALPHA
Definition: d3d8caps.h:108
#define D3DPCMPCAPS_NEVER
Definition: d3d8caps.h:88
#define D3DDEVCAPS_CANBLTSYSTONONLOCAL
Definition: d3d8caps.h:49
#define D3DPRASTERCAPS_FOGTABLE
Definition: d3d8caps.h:76
#define D3DSTENCILCAPS_KEEP
Definition: d3d8caps.h:144
#define D3DPTFILTERCAPS_MIPFPOINT
Definition: d3d8caps.h:131
#define D3DDEVCAPS_TLVERTEXVIDEOMEMORY
Definition: d3d8caps.h:39
#define D3DPMISCCAPS_MASKZ
Definition: d3d8caps.h:56
#define D3DPCMPCAPS_GREATEREQUAL
Definition: d3d8caps.h:94
#define D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR
Definition: d3d8caps.h:169
#define D3DPRASTERCAPS_ZTEST
Definition: d3d8caps.h:74
#define D3DVTXPCAPS_POSITIONALLIGHTS
Definition: d3d8caps.h:184
#define D3DPRASTERCAPS_ZBIAS
Definition: d3d8caps.h:79
#define D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA
Definition: d3d8caps.h:172
#define D3DPTEXTURECAPS_POW2
Definition: d3d8caps.h:114
#define D3DTEXOPCAPS_ADD
Definition: d3d8caps.h:158
#define D3DSTENCILCAPS_REPLACE
Definition: d3d8caps.h:146
#define D3DPTFILTERCAPS_MAGFPOINT
Definition: d3d8caps.h:133
#define D3DPRASTERCAPS_MIPMAPLODBIAS
Definition: d3d8caps.h:78
#define D3DTEXOPCAPS_MODULATE4X
Definition: d3d8caps.h:157
#define D3DPRASTERCAPS_DITHER
Definition: d3d8caps.h:72
#define D3DPTBLENDCAPS_COPY
Definition: d3dcaps.h:99
#define D3DPTBLENDCAPS_MODULATEALPHA
Definition: d3dcaps.h:96
#define D3DPRASTERCAPS_ROP2
Definition: d3dcaps.h:30
#define D3DDD_LIGHTINGCAPS
Definition: d3dcaps.h:108
#define D3DPTFILTERCAPS_LINEAR
Definition: d3dcaps.h:88
#define D3DFDS_COLORMODEL
Definition: d3dcaps.h:126
#define D3DDD_MAXBUFFERSIZE
Definition: d3dcaps.h:114
#define D3DDD_LINECAPS
Definition: d3dcaps.h:110
#define D3DFDS_GUID
Definition: d3dcaps.h:127
#define D3DPSHADECAPS_SPECULARFLATMONO
Definition: d3dcaps.h:66
#define D3DPTFILTERCAPS_LINEARMIPNEAREST
Definition: d3dcaps.h:91
#define D3DPTBLENDCAPS_MODULATEMASK
Definition: d3dcaps.h:98
#define D3DDD_DEVICEZBUFFERBITDEPTH
Definition: d3dcaps.h:113
#define D3DDEVCAPS_FLOATTLVERTEX
Definition: d3dcaps.h:116
#define D3DLIGHTCAPS_DIRECTIONAL
Definition: d3dcaps.h:20
#define D3DPTBLENDCAPS_MODULATE
Definition: d3dcaps.h:94
#define D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT
Definition: d3dcaps.h:159
#define D3DPRASTERCAPS_STIPPLE
Definition: d3dcaps.h:38
#define D3DPTEXTURECAPS_BORDER
Definition: d3dcaps.h:85
#define D3DPTFILTERCAPS_NEAREST
Definition: d3dcaps.h:87
#define D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED
Definition: d3dcaps.h:75
#define D3DPTBLENDCAPS_DECALMASK
Definition: d3dcaps.h:97
#define D3DDEVCAPS_SORTDECREASINGZ
Definition: d3dcaps.h:118
#define D3DPTEXTURECAPS_TRANSPARENCY
Definition: d3dcaps.h:84
#define D3DPSHADECAPS_SPECULARGOURAUDMONO
Definition: d3dcaps.h:68
#define D3DPSHADECAPS_ALPHAPHONGBLEND
Definition: d3dcaps.h:76
#define D3DPSHADECAPS_COLORPHONGRGB
Definition: d3dcaps.h:65
#define D3DPSHADECAPS_ALPHAPHONGSTIPPLED
Definition: d3dcaps.h:77
#define D3DDD_COLORMODEL
Definition: d3dcaps.h:105
#define D3DLIGHTCAPS_POINT
Definition: d3dcaps.h:18
#define D3DDD_DEVICERENDERBITDEPTH
Definition: d3dcaps.h:112
HRESULT(CALLBACK * LPD3DENUMDEVICESCALLBACK)(GUID *lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID)
Definition: d3dcaps.h:466
#define D3DPMISCCAPS_CONFORMANT
Definition: d3dcaps.h:25
#define D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT
Definition: d3dcaps.h:160
#define D3DPTFILTERCAPS_LINEARMIPLINEAR
Definition: d3dcaps.h:92
#define D3DDEVCAPS_SORTEXACT
Definition: d3dcaps.h:119
#define D3DPTFILTERCAPS_MIPNEAREST
Definition: d3dcaps.h:89
#define D3DPSHADECAPS_SPECULARFLATRGB
Definition: d3dcaps.h:67
HRESULT(CALLBACK * LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC7, LPVOID)
Definition: d3dcaps.h:469
#define D3DLIGHTCAPS_SPOT
Definition: d3dcaps.h:19
#define D3DVTXPCAPS_VERTEXFOG
Definition: d3dcaps.h:242
#define D3DDD_TRANSFORMCAPS
Definition: d3dcaps.h:107
#define D3DPTEXTURECAPS_COLORKEYBLEND
Definition: d3dcaps.h:236
#define D3DDD_TRICAPS
Definition: d3dcaps.h:111
#define D3DPTBLENDCAPS_ADD
Definition: d3dcaps.h:167
#define D3DPRASTERCAPS_TRANSLUCENTSORTINDEPENDENT
Definition: d3dcaps.h:177
#define D3DPSHADECAPS_COLORFLATMONO
Definition: d3dcaps.h:60
#define D3DPRASTERCAPS_SUBPIXELX
Definition: d3dcaps.h:35
#define D3DDD_DEVCAPS
Definition: d3dcaps.h:106
#define D3DPSHADECAPS_ALPHAFLATBLEND
Definition: d3dcaps.h:72
#define D3DPTBLENDCAPS_DECALALPHA
Definition: d3dcaps.h:95
#define D3DDD_BCLIPPING
Definition: d3dcaps.h:109
#define D3DTRANSFORMCAPS_CLIP
Definition: d3dcaps.h:15
#define D3DPRASTERCAPS_XOR
Definition: d3dcaps.h:31
#define D3DDD_MAXVERTEXCOUNT
Definition: d3dcaps.h:115
#define D3DPSHADECAPS_ALPHAFLATSTIPPLED
Definition: d3dcaps.h:73
#define D3DPMISCCAPS_MASKPLANES
Definition: d3dcaps.h:22
#define D3DPRASTERCAPS_SUBPIXEL
Definition: d3dcaps.h:34
#define D3DPSHADECAPS_FOGFLAT
Definition: d3dcaps.h:78
#define D3DPSHADECAPS_FOGPHONG
Definition: d3dcaps.h:80
#define D3DPSHADECAPS_COLORPHONGMONO
Definition: d3dcaps.h:64
#define D3DPSHADECAPS_COLORGOURAUDMONO
Definition: d3dcaps.h:62
#define D3DPSHADECAPS_SPECULARPHONGMONO
Definition: d3dcaps.h:70
#define D3DPSHADECAPS_SPECULARPHONGRGB
Definition: d3dcaps.h:71
#define D3DLIGHTINGMODEL_RGB
Definition: d3dcaps.h:16
#define D3DPSHADECAPS_COLORFLATRGB
Definition: d3dcaps.h:61
#define D3DPTBLENDCAPS_DECAL
Definition: d3dcaps.h:93
#define D3DDEVCAPS_SORTINCREASINGZ
Definition: d3dcaps.h:117
#define D3DPTFILTERCAPS_MIPLINEAR
Definition: d3dcaps.h:90
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
size_t total
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLint GLint GLsizei width
Definition: gl.h:1546
GLenum src
Definition: glext.h:6340
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLenum mode
Definition: glext.h:6217
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLenum dst
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean flag
Definition: glfuncs.h:52
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum light
Definition: glfuncs.h:170
static D3D_DRIVER_TYPE HMODULE UINT const D3D_FEATURE_LEVEL * feature_levels
Definition: hlsl_d3d11.c:28
const char cursor[]
Definition: icontest.c:13
REFIID riid
Definition: atlbase.h:39
#define InterlockedCompareExchange
Definition: interlocked.h:119
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
unsigned char size_t * outsize
Definition: jpeglib.h:983
#define CAPS
Definition: kerberos.c:274
#define debugstr_guid
Definition: kernel32.h:35
if(dx< 0)
Definition: linetemp.h:194
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define D3DLIGHTCAPS_PARALLELPOINT
Definition: dump.c:16
static HDC
Definition: imagelist.c:88
static IPrintDialogCallback callback
Definition: printdlg.c:325
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
static IHTMLWindow2 * window
Definition: events.c:77
static LARGE_INTEGER * frequency
Definition: time.c:38
static HPALETTE palette
Definition: clipboard.c:1457
#define min(a, b)
Definition: monoChain.cc:55
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define WS_POPUP
Definition: pedump.c:616
#define WS_DISABLED
Definition: pedump.c:621
char CHAR
Definition: pedump.c:57
static ULONG Timeout
Definition: ping.c:61
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
DWORD IDirectDrawSurface7
Definition: vmrender.idl:20
DWORD IDirectDraw7
Definition: vmrender.idl:21
#define SW_HIDE
Definition: winuser.h:779
#define SWP_NOACTIVATE
Definition: winuser.h:1253
HWND WINAPI CreateWindowExA(_In_ DWORD dwExStyle, _In_opt_ LPCSTR lpClassName, _In_opt_ LPCSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define SM_CYSCREEN
Definition: winuser.h:971
HWND WINAPI GetForegroundWindow(void)
Definition: ntwrapper.h:392
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
BOOL WINAPI ClipCursor(_In_opt_ LPCRECT)
#define SWP_NOMOVE
Definition: winuser.h:1255
#define SWP_NOSIZE
Definition: winuser.h:1256
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:628
#define HWND_TOP
Definition: winuser.h:1218
#define SWP_SHOWWINDOW
Definition: winuser.h:1259
#define SW_SHOW
Definition: winuser.h:786
#define SM_CXSCREEN
Definition: winuser.h:970
#define HWND_NOTOPMOST
Definition: winuser.h:1217
BOOL WINAPI DestroyWindow(_In_ HWND)
int WINAPI GetSystemMetrics(_In_ int)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
#define calloc
Definition: rosglue.h:14
#define DDSCL_SETDEVICEWINDOW
Definition: ddraw.h:541
#define DDPF_ZBUFFER
Definition: ddraw.h:513
#define DDPCAPS_PRIMARYSURFACE
Definition: ddraw.h:458
#define DDSD_WIDTH
Definition: ddraw.h:212
#define DDSCL_SETFOCUSWINDOW
Definition: ddraw.h:540
#define DDSCL_FPUPRESERVE
Definition: ddraw.h:545
#define DDSCAPS_FRONTBUFFER
Definition: ddraw.h:256
#define DDPF_PALETTEINDEXED4
Definition: ddraw.h:506
#define DDSD_PIXELFORMAT
Definition: ddraw.h:218
HRESULT(WINAPI * LPDDENUMMODESCALLBACK2)(LPDDSURFACEDESC2, LPVOID)
Definition: ddraw.h:1261
#define DDSCL_NORMAL
Definition: ddraw.h:537
#define DDPF_PALETTEINDEXED2
Definition: ddraw.h:515
DWORD dwAlphaBitDepth
Definition: ddraw.h:3
#define DDSD_PITCH
Definition: ddraw.h:213
#define DDEDM_REFRESHRATES
Definition: ddraw.h:531
#define DDSD_REFRESHRATE
Definition: ddraw.h:224
#define DDENUMRET_OK
Definition: ddraw.h:191
DWORD dwRefreshRate
Definition: ddraw.h:2
#define DDERR_VERTICALBLANKINPROGRESS
Definition: ddraw.h:133
#define DDENUMSURFACES_CANBECREATED
Definition: ddraw.h:526
#define DDSCL_MULTITHREADED
Definition: ddraw.h:543
#define DDSD_HEIGHT
Definition: ddraw.h:211
#define DDSCAPS_PRIMARYSURFACE
Definition: ddraw.h:260
#define DDERR_INVALIDCAPS
Definition: ddraw.h:77
#define DDWAITVB_BLOCKBEGINEVENT
Definition: ddraw.h:652
DDPIXELFORMAT ddpfPixelFormat
Definition: ddraw.h:0
#define DDERR_NOTFOUND
Definition: ddraw.h:99
#define DDSCL_EXCLUSIVE
Definition: ddraw.h:538
#define DDGDI_GETHOSTIDENTIFIER
Definition: ddraw.h:204
struct _DDPIXELFORMAT DDPIXELFORMAT
#define DDERR_NOHWND
Definition: ddraw.h:145
HRESULT(WINAPI * LPDDENUMSURFACESCALLBACK)(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, LPVOID)
Definition: ddraw.h:1262
#define DDPF_STENCILBUFFER
Definition: ddraw.h:517
LONG lPitch
Definition: ddraw.h:0
#define DDENUMSURFACES_ALL
Definition: ddraw.h:523
#define DDSCL_ALLOWREBOOT
Definition: ddraw.h:535
DDCOLORKEY ddckCKDestOverlay
Definition: ddraw.h:0
DWORD dwBackBufferCount
Definition: ddraw.h:0
HRESULT(WINAPI * LPDDENUMSURFACESCALLBACK2)(LPDIRECTDRAWSURFACE4, LPDDSURFACEDESC2, LPVOID)
Definition: ddraw.h:1263
DWORD dwMipMapCount
Definition: ddraw.h:0
#define DDERR_NOEXCLUSIVEMODE
Definition: ddraw.h:95
#define DDERR_OUTOFMEMORY
Definition: ddraw.h:113
#define DDPF_YUV
Definition: ddraw.h:512
#define DDERR_HWNDALREADYSET
Definition: ddraw.h:147
#define DDENUMRET_CANCEL
Definition: ddraw.h:190
HRESULT(WINAPI * LPDDENUMMODESCALLBACK)(LPDDSURFACEDESC, LPVOID)
Definition: ddraw.h:1260
#define DDPF_ZPIXELS
Definition: ddraw.h:516
#define DDENUMSURFACES_NOMATCH
Definition: ddraw.h:525
#define DDENUMSURFACES_MATCH
Definition: ddraw.h:524
#define DDERR_NOCOOPERATIVELEVELSET
Definition: ddraw.h:91
#define DDPF_PALETTEINDEXED1
Definition: ddraw.h:514
#define DD_OK
Definition: ddraw.h:188
#define DDSCAPS_FLIP
Definition: ddraw.h:255
#define DDENUMSURFACES_DOESEXIST
Definition: ddraw.h:527
#define DDERR_NOFOCUSWINDOW
Definition: ddraw.h:171
#define DDBD_24
Definition: ddraw.h:474
#define DDCAPS_ALIGNSTRIDE
Definition: ddraw.h:336
#define DDSCAPS_BACKBUFFER
Definition: ddraw.h:253
#define DDPCAPS_8BIT
Definition: ddraw.h:457
#define DDSCL_CREATEDEVICEWINDOW
Definition: ddraw.h:542
#define DDSCL_FPUSETUP
Definition: ddraw.h:544
#define DDERR_UNSUPPORTED
Definition: ddraw.h:129
#define DDFLIP_WAIT
Definition: ddraw.h:585
DWORD dwLinearSize
Definition: ddraw.h:1
HRESULT(WINAPI * LPDDENUMSURFACESCALLBACK7)(LPDIRECTDRAWSURFACE7, LPDDSURFACEDESC2, LPVOID)
Definition: ddraw.h:1264
#define DDSCL_NOWINDOWCHANGES
Definition: ddraw.h:536
#define DDERR_INVALIDPARAMS
Definition: ddraw.h:81
#define DDERR_ALREADYINITIALIZED
Definition: ddraw.h:69
#define DDSCL_ALLOWMODEX
Definition: ddraw.h:539
#define DDBD_32
Definition: ddraw.h:475
#define DDBD_16
Definition: ddraw.h:473
#define DDSCL_FULLSCREEN
Definition: ddraw.h:534
strcpy
Definition: string.h:131
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:236
__WINE_SERVER_LIST_INLINE struct list * list_prev(const struct list *list, const struct list *elem)
Definition: list.h:125
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:242
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
_In_ PVOID Context
Definition: storport.h:2269
struct wined3d_vertex_declaration * decl
Definition: ddraw_private.h:50
DWORD fvf
Definition: d3d8_private.h:96
Definition: dcommon.idl:28
D3DPRIMCAPS dpcTriCaps
Definition: d3dcaps.h:360
WORD wMaxSimultaneousTextures
Definition: d3dcaps.h:379
GUID deviceGUID
Definition: d3dcaps.h:382
DWORD dwMaxTextureAspectRatio
Definition: d3dcaps.h:368
DWORD dwMaxTextureHeight
Definition: d3dcaps.h:366
DWORD dwFVFCaps
Definition: d3dcaps.h:376
D3DPRIMCAPS dpcLineCaps
Definition: d3dcaps.h:359
DWORD dwMinTextureHeight
Definition: d3dcaps.h:364
DWORD dwMaxAnisotropy
Definition: d3dcaps.h:369
WORD wMaxUserClipPlanes
Definition: d3dcaps.h:383
DWORD dwDeviceRenderBitDepth
Definition: d3dcaps.h:361
DWORD dwStencilCaps
Definition: d3dcaps.h:375
DWORD dwMaxActiveLights
Definition: d3dcaps.h:380
DWORD dwMaxTextureRepeat
Definition: d3dcaps.h:367
DWORD dwDeviceZBufferBitDepth
Definition: d3dcaps.h:362
DWORD dwTextureOpCaps
Definition: d3dcaps.h:377
D3DVALUE dvGuardBandRight
Definition: d3dcaps.h:372
D3DVALUE dvGuardBandBottom
Definition: d3dcaps.h:373
WORD wMaxTextureBlendStages
Definition: d3dcaps.h:378
DWORD dwReserved2
Definition: d3dcaps.h:387
DWORD dwDevCaps
Definition: d3dcaps.h:358
D3DVALUE dvGuardBandTop
Definition: d3dcaps.h:371
DWORD dwMinTextureWidth
Definition: d3dcaps.h:363
D3DVALUE dvExtentsAdjust
Definition: d3dcaps.h:374
DWORD dwVertexProcessingCaps
Definition: d3dcaps.h:385
DWORD dwReserved4
Definition: d3dcaps.h:389
DWORD dwReserved1
Definition: d3dcaps.h:386
WORD wMaxVertexBlendMatrices
Definition: d3dcaps.h:384
DWORD dwReserved3
Definition: d3dcaps.h:388
DWORD dwMaxTextureWidth
Definition: d3dcaps.h:365
D3DVALUE dvGuardBandLeft
Definition: d3dcaps.h:370
D3DVALUE dvMaxVertexW
Definition: d3dcaps.h:381
DWORD dwMaxStippleWidth
Definition: d3dcaps.h:334
D3DVALUE dvGuardBandTop
Definition: d3dcaps.h:343
D3DPRIMCAPS dpcTriCaps
Definition: d3dcaps.h:326
DWORD dwDeviceZBufferBitDepth
Definition: d3dcaps.h:328
DWORD dwSize
Definition: d3dcaps.h:318
DWORD dwMaxTextureWidth
Definition: d3dcaps.h:333
D3DTRANSFORMCAPS dtcTransformCaps
Definition: d3dcaps.h:322
DWORD dwStencilCaps
Definition: d3dcaps.h:347
BOOL bClipping
Definition: d3dcaps.h:323
D3DVALUE dvGuardBandRight
Definition: d3dcaps.h:344
DWORD dwFlags
Definition: d3dcaps.h:319
DWORD dwMaxTextureAspectRatio
Definition: d3dcaps.h:340
DWORD dwMaxTextureRepeat
Definition: d3dcaps.h:339
DWORD dwDeviceRenderBitDepth
Definition: d3dcaps.h:327
DWORD dwMaxBufferSize
Definition: d3dcaps.h:329
DWORD dwMaxVertexCount
Definition: d3dcaps.h:330
DWORD dwMaxStippleHeight
Definition: d3dcaps.h:335
DWORD dwDevCaps
Definition: d3dcaps.h:321
D3DPRIMCAPS dpcLineCaps
Definition: d3dcaps.h:325
DWORD dwMaxTextureHeight
Definition: d3dcaps.h:333
WORD wMaxTextureBlendStages
Definition: d3dcaps.h:350
D3DVALUE dvExtentsAdjust
Definition: d3dcaps.h:346
D3DCOLORMODEL dcmColorModel
Definition: d3dcaps.h:320
DWORD dwMaxAnisotropy
Definition: d3dcaps.h:341
DWORD dwMinStippleWidth
Definition: d3dcaps.h:334
DWORD dwMinStippleHeight
Definition: d3dcaps.h:335
DWORD dwTextureOpCaps
Definition: d3dcaps.h:349
DWORD dwMinTextureWidth
Definition: d3dcaps.h:332
D3DVALUE dvGuardBandBottom
Definition: d3dcaps.h:345
D3DVALUE dvGuardBandLeft
Definition: d3dcaps.h:342
DWORD dwMinTextureHeight
Definition: d3dcaps.h:332
WORD wMaxSimultaneousTextures
Definition: d3dcaps.h:351
DWORD dwFVFCaps
Definition: d3dcaps.h:348
D3DLIGHTINGCAPS dlcLightingCaps
Definition: d3dcaps.h:324
D3DDEVICEDESC ddSwDesc
Definition: d3dcaps.h:423
D3DDEVICEDESC ddHwDesc
Definition: d3dcaps.h:422
D3DCOLORMODEL dcmColorModel
Definition: d3dcaps.h:398
DWORD dwNumLights
Definition: d3dcaps.h:259
DWORD dwLightingModel
Definition: d3dcaps.h:258
DWORD dwAlphaCmpCaps
Definition: d3dcaps.h:58
DWORD dwZCmpCaps
Definition: d3dcaps.h:55
DWORD dwShadeCaps
Definition: d3dcaps.h:59
DWORD dwStippleWidth
Definition: d3dcaps.h:64
DWORD dwRasterCaps
Definition: d3dcaps.h:54
DWORD dwSrcBlendCaps
Definition: d3dcaps.h:56
DWORD dwTextureBlendCaps
Definition: d3dcaps.h:62
DWORD dwTextureFilterCaps
Definition: d3dcaps.h:61
DWORD dwSize
Definition: d3dcaps.h:52
DWORD dwStippleHeight
Definition: d3dcaps.h:65
DWORD dwTextureAddressCaps
Definition: d3dcaps.h:63
DWORD dwTextureCaps
Definition: d3dcaps.h:60
DWORD dwMiscCaps
Definition: d3dcaps.h:53
DWORD dwDestBlendCaps
Definition: d3dcaps.h:57
DWORD dwBBitMask
Definition: ddraw.h:1108
DWORD dwSize
Definition: ddraw.h:1072
DWORD dwFourCC
Definition: ddraw.h:1074
DWORD dwRGBBitCount
Definition: ddraw.h:1077
DWORD dwRBitMask
Definition: ddraw.h:1087
DWORD dwGBitMask
Definition: ddraw.h:1096
DWORD dwFlags
Definition: ddraw.h:1073
DWORD dwRGBAlphaBitMask
Definition: ddraw.h:1115
DWORD dwCaps
Definition: ddraw.h:734
DWORD dwWidth
Definition: ddraw.h:1157
DWORD dwHeight
Definition: ddraw.h:1156
DDSCAPS2 ddsCaps
Definition: ddraw.h:1190
DWORD dwRefreshRate
Definition: ddraw.h:1171
DDPIXELFORMAT ddpfPixelFormat
Definition: ddraw.h:1187
DWORD dwFlags
Definition: ddraw.h:1155
DWORD dwSize
Definition: ddraw.h:1154
Definition: bug.cpp:8
Definition: http.c:7252
IUnknown * outer_unknown
IDirect3DDevice3 IDirect3DDevice3_iface
IDirect3DDevice2 IDirect3DDevice2_iface
struct list ddraw_entry
IUnknown * ifaceToRelease
IDirectDrawSurface IDirectDrawSurface_iface
DDSURFACEDESC2 surface_desc
unsigned int sub_resource_idx
IDirectDrawSurface7 IDirectDrawSurface7_iface
struct list surface_list_entry
IUnknown * ifaceToRelease
IDirectDrawSurface4 IDirectDrawSurface4_iface
unsigned int is_lost
struct wined3d_texture * gdi_surface
DWORD flags
struct wined3d_swapchain_state_parent state_parent
IDirectDraw2 IDirectDraw2_iface
Definition: ddraw_private.h:85
IDirect3D3 IDirect3D3_iface
Definition: ddraw_private.h:88
struct ddraw_surface * primary
HWND d3d_window
struct wined3d_device * wined3d_device
Definition: ddraw_private.h:99
LONG device_state
IDirectDraw7 IDirectDraw7_iface
Definition: ddraw_private.h:83
HWND devicewindow
IDirect3D IDirect3D_iface
Definition: ddraw_private.h:90
struct wined3d_device_context * immediate_context
LONG ref7
Definition: ddraw_private.h:94
DWORD cooperative_level
struct wined3d_swapchain * wined3d_swapchain
struct list d3ddevice_list
struct list surface_list
IDirectDraw4 IDirectDraw4_iface
Definition: ddraw_private.h:84
HWND swapchain_window
LONG numIfaces
Definition: ddraw_private.h:94
IDirect3D7 IDirect3D7_iface
Definition: ddraw_private.h:87
struct FvfToDecl * decls
HWND dest_window
struct wined3d_output * wined3d_output
Definition: ddraw_private.h:98
HWND focuswindow
struct wined3d_device_parent device_parent
Definition: ddraw_private.h:91
IDirect3D2 IDirect3D2_iface
Definition: ddraw_private.h:89
struct wined3d * wined3d
Definition: ddraw_private.h:96
int d3dversion
UINT numConvertedDecls
struct wined3d_adapter * wined3d_adapter
Definition: ddraw_private.h:97
IDirectDraw IDirectDraw_iface
Definition: ddraw_private.h:86
UINT declArraySize
Definition: devices.h:37
LPDDENUMMODESCALLBACK func
Definition: ddraw.c:2412
Definition: ddraw.c:48
DWORD unsupported_caps
Definition: ddraw.c:52
const GUID * device_guid
Definition: ddraw.c:51
char interface_name[100]
Definition: ddraw.c:49
char device_name[100]
Definition: ddraw.c:50
IDirectDraw7 * ddraw
Definition: ddraw.c:3253
LPDDENUMSURFACESCALLBACK7 callback
Definition: ddraw.c:3255
const DDSURFACEDESC2 * desc
Definition: ddraw.c:3254
Definition: filter.c:185
Definition: dsound.c:943
Definition: parser.c:49
Definition: send.c:48
Definition: ps.c:97
LPDDENUMSURFACESCALLBACK2 func
Definition: ddraw.c:3209
LPDDENUMSURFACESCALLBACK func
Definition: ddraw.c:3215
char szDescription[MAX_DDDEVICEID_STRING]
Definition: ddraw.h:1348
char szDriver[MAX_DDDEVICEID_STRING]
Definition: ddraw.h:1347
Definition: tools.h:99
unsigned int description_size
Definition: wined3d.h:1746
unsigned int driver_size
Definition: wined3d.h:1744
LARGE_INTEGER driver_version
Definition: wined3d.h:1747
DWORD MaxVertexBlendMatrices
Definition: wined3d.h:1967
DWORD MaxTextureBlendStages
Definition: wined3d.h:1961
float GuardBandTop
Definition: wined3d.h:1952
DWORD FVFCaps
Definition: wined3d.h:1959
DWORD PrimitiveMiscCaps
Definition: wined3d.h:1928
DWORD VertexProcessingCaps
Definition: wined3d.h:1964
DWORD TextureAddressCaps
Definition: wined3d.h:1939
DWORD TextureCaps
Definition: wined3d.h:1935
DWORD ShadeCaps
Definition: wined3d.h:1934
DWORD TextureOpCaps
Definition: wined3d.h:1960
DWORD MaxTextureRepeat
Definition: wined3d.h:1946
DWORD MaxAnisotropy
Definition: wined3d.h:1948
float ExtentsAdjust
Definition: wined3d.h:1956
float GuardBandLeft
Definition: wined3d.h:1951
DWORD DevCaps
Definition: wined3d.h:1927
DWORD ZCmpCaps
Definition: wined3d.h:1930
DWORD MaxTextureHeight
Definition: wined3d.h:1944
DWORD AlphaCmpCaps
Definition: wined3d.h:1933
DWORD DestBlendCaps
Definition: wined3d.h:1932
DWORD RasterCaps
Definition: wined3d.h:1929
float MaxVertexW
Definition: wined3d.h:1949
DWORD MaxTextureWidth
Definition: wined3d.h:1943
DWORD LineCaps
Definition: wined3d.h:1941
DWORD MaxUserClipPlanes
Definition: wined3d.h:1966
float GuardBandBottom
Definition: wined3d.h:1954
float GuardBandRight
Definition: wined3d.h:1953
DWORD MaxTextureAspectRatio
Definition: wined3d.h:1947
DWORD MaxSimultaneousTextures
Definition: wined3d.h:1962
DWORD MaxActiveLights
Definition: wined3d.h:1965
DWORD StencilCaps
Definition: wined3d.h:1957
DWORD SrcBlendCaps
Definition: wined3d.h:1931
DWORD TextureFilterCaps
Definition: wined3d.h:1936
struct wined3d_ddraw_caps ddraw_caps
Definition: wined3d.h:1999
enum wined3d_format_id format_id
Definition: wined3d.h:1614
unsigned int backbuffer_height
Definition: wined3d.h:1773
struct wined3d_output * output
Definition: wined3d.h:1771
unsigned int backbuffer_width
Definition: wined3d.h:1772
unsigned int backbuffer_count
Definition: wined3d.h:1775
enum wined3d_format_id backbuffer_format
Definition: wined3d.h:1774
enum wined3d_swap_effect swap_effect
Definition: wined3d.h:1779
unsigned int backbuffer_bind_flags
Definition: wined3d.h:1776
static const VBE_MODE Modes[VBE_MODE_COUNT]
Definition: vbe.c:189
#define max(a, b)
Definition: svc.c:63
#define LIST_ENTRY(type)
Definition: queue.h:175
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define WINAPI
Definition: msvc.h:6
ULONG CDECL wined3d_decref(struct wined3d *wined3d)
Definition: directx.c:198
HRESULT CDECL wined3d_output_set_display_mode(struct wined3d_output *output, const struct wined3d_display_mode *mode)
Definition: directx.c:1693
HRESULT CDECL wined3d_restore_display_modes(struct wined3d *wined3d)
Definition: directx.c:1618
HRESULT CDECL wined3d_output_get_desc(const struct wined3d_output *output, struct wined3d_output_desc *desc)
Definition: directx.c:1256
HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, const struct wined3d_adapter *adapter, enum wined3d_device_type device_type, enum wined3d_format_id adapter_format_id, uint32_t usage, unsigned int bind_flags, enum wined3d_resource_type resource_type, enum wined3d_format_id check_format_id)
Definition: directx.c:1972
HRESULT CDECL wined3d_get_device_caps(const struct wined3d_adapter *adapter, enum wined3d_device_type device_type, struct wined3d_caps *caps)
Definition: directx.c:2366
HRESULT CDECL wined3d_device_create(struct wined3d *wined3d, struct wined3d_adapter *adapter, enum wined3d_device_type device_type, HWND focus_window, uint32_t flags, BYTE surface_alignment, const enum wined3d_feature_level *feature_levels, unsigned int feature_level_count, struct wined3d_device_parent *device_parent, struct wined3d_device **device)
Definition: directx.c:2777
HRESULT CDECL wined3d_adapter_get_identifier(const struct wined3d_adapter *adapter, uint32_t flags, struct wined3d_adapter_identifier *identifier)
Definition: directx.c:1785
HRESULT CDECL wined3d_output_get_mode(struct wined3d_output *output, enum wined3d_format_id format_id, enum wined3d_scanline_ordering scanline_ordering, unsigned int mode_idx, struct wined3d_display_mode *mode, bool cached)
Definition: directx.c:1369
struct wined3d_adapter *CDECL wined3d_get_adapter(const struct wined3d *wined3d, unsigned int idx)
Definition: directx.c:1009
unsigned int CDECL wined3d_calculate_format_pitch(const struct wined3d_adapter *adapter, enum wined3d_format_id format_id, unsigned int width)
Definition: directx.c:2197
struct wined3d_output *CDECL wined3d_adapter_get_output(const struct wined3d_adapter *adapter, unsigned int idx)
Definition: directx.c:1027
HRESULT CDECL wined3d_output_get_display_mode(const struct wined3d_output *output, struct wined3d_display_mode *mode, enum wined3d_display_rotation *rotation)
Definition: directx.c:1515
HRESULT CDECL wined3d_output_get_raster_status(const struct wined3d_output *output, struct wined3d_raster_status *raster_status)
Definition: directx.c:1814
HRESULT CDECL wined3d_stateblock_create(struct wined3d_device *device, const struct wined3d_stateblock *device_state, enum wined3d_stateblock_type type, struct wined3d_stateblock **stateblock)
Definition: stateblock.c:2508
ULONG CDECL wined3d_stateblock_decref(struct wined3d_stateblock *stateblock)
Definition: stateblock.c:670
void CDECL wined3d_stateblock_apply(const struct wined3d_stateblock *stateblock, struct wined3d_stateblock *device_state)
Definition: stateblock.c:1156
HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapchain, unsigned int buffer_count, unsigned int width, unsigned int height, enum wined3d_format_id format_id, enum wined3d_multisample_type multisample_type, unsigned int multisample_quality)
Definition: swapchain.c:1923
ULONG CDECL wined3d_swapchain_decref(struct wined3d_swapchain *swapchain)
Definition: swapchain.c:144
HRESULT CDECL wined3d_swapchain_create(struct wined3d_device *device, const struct wined3d_swapchain_desc *desc, struct wined3d_swapchain_state_parent *state_parent, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_swapchain **swapchain)
Definition: swapchain.c:1732
void CDECL wined3d_swapchain_set_palette(struct wined3d_swapchain *swapchain, struct wined3d_palette *palette)
Definition: swapchain.c:372
ULONG CDECL wined3d_swapchain_incref(struct wined3d_swapchain *swapchain)
Definition: swapchain.c:135
ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration *declaration)
HRESULT CDECL wined3d_vertex_declaration_create_from_fvf(struct wined3d_device *device, uint32_t fvf, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_vertex_declaration **declaration)
@ WINED3D_SBT_ALL
Definition: wined3d.h:787
#define WINED3D_NO3D
Definition: wined3d.h:1323
@ WINED3D_MULTISAMPLE_NONE
Definition: wined3d.h:573
#define WINED3DENUM_WHQL_LEVEL
Definition: wined3d.h:872
#define WINED3D_OK
Definition: wined3d.h:33
@ WINED3D_SWAP_EFFECT_DISCARD
Definition: wined3d.h:534
#define WINED3DADAPTER_DEFAULT
Definition: wined3d.h:871
wined3d_resource_type
Definition: wined3d.h:716
@ WINED3D_RTYPE_TEXTURE_2D
Definition: wined3d.h:720
#define WINEDDCAPS_3D
Definition: wined3d.h:1500
wined3d_format_id
Definition: wined3d.h:126
@ WINED3DFMT_X8D24_UNORM
Definition: wined3d.h:151
@ WINED3DFMT_DXT2
Definition: wined3d.h:261
@ WINED3DFMT_S1_UINT_D15_UNORM
Definition: wined3d.h:150
@ WINED3DFMT_B8G8R8X8_UNORM
Definition: wined3d.h:245
@ WINED3DFMT_B5G5R5X1_UNORM
Definition: wined3d.h:129
@ WINED3DFMT_D16_UNORM
Definition: wined3d.h:212
@ WINED3DFMT_NVHS
Definition: wined3d.h:273
@ WINED3DFMT_UNKNOWN
Definition: wined3d.h:127
@ WINED3DFMT_B8G8R8_UNORM
Definition: wined3d.h:128
@ WINED3DFMT_DXT1
Definition: wined3d.h:260
@ WINED3DFMT_DXT3
Definition: wined3d.h:262
@ WINED3DFMT_DXT4
Definition: wined3d.h:263
@ WINED3DFMT_D32_UNORM
Definition: wined3d.h:149
@ WINED3DFMT_NVHU
Definition: wined3d.h:272
@ WINED3DFMT_YV12
Definition: wined3d.h:259
@ WINED3DFMT_B5G6R5_UNORM
Definition: wined3d.h:242
@ WINED3DFMT_S4X4_UINT_D24_UNORM
Definition: wined3d.h:152
@ WINED3DFMT_DXT5
Definition: wined3d.h:264
@ WINED3DFMT_YUY2
Definition: wined3d.h:258
@ WINED3DFMT_P8_UINT
Definition: wined3d.h:137
@ WINED3DFMT_UYVY
Definition: wined3d.h:257
@ WINED3DFMT_ATI2N
Definition: wined3d.h:269
@ WINED3DFMT_D24_UNORM_S8_UINT
Definition: wined3d.h:202
#define WINED3D_BIND_DEPTH_STENCIL
Definition: wined3d.h:915
#define WINED3DLINECAPS_ANTIALIAS
Definition: wined3d.h:1073
#define WINED3DPRASTERCAPS_DEPTHBIAS
Definition: wined3d.h:1222
@ WINED3D_SCANLINE_ORDERING_UNKNOWN
Definition: wined3d.h:825
wined3d_feature_level
Definition: wined3d.h:98
@ WINED3D_FEATURE_LEVEL_7
Definition: wined3d.h:102
@ WINED3D_FEATURE_LEVEL_6
Definition: wined3d.h:101
@ WINED3D_FEATURE_LEVEL_5
Definition: wined3d.h:100
wined3d_device_type
Definition: wined3d.h:90
@ WINED3D_DEVICE_TYPE_NULLREF
Definition: wined3d.h:94
@ WINED3D_DEVICE_TYPE_SW
Definition: wined3d.h:93
@ WINED3D_DEVICE_TYPE_HAL
Definition: wined3d.h:91
@ WINED3D_DEVICE_TYPE_REF
Definition: wined3d.h:92
#define WINED3D_SWAPCHAIN_NO_WINDOW_CHANGES
Definition: wined3d.h:903
void WINAPI wined3d_mutex_unlock(void)
Definition: wined3d_main.c:544
void WINAPI wined3d_mutex_lock(void)
Definition: wined3d_main.c:539
struct wined3d *CDECL wined3d_create(uint32_t flags)
Definition: wined3d_main.c:142
#define E_NOINTERFACE
Definition: winerror.h:3479
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771
ULONG bpp[]
Definition: xlate.c:19