ReactOS 0.4.17-dev-966-gf06eace
surface.c
Go to the documentation of this file.
1/* DirectDraw Surface Implementation
2 *
3 * Copyright (c) 1997-2000 Marcus Meissner
4 * Copyright (c) 1998-2000 Lionel Ulmer
5 * Copyright (c) 2000-2001 TransGaming Technologies Inc.
6 * Copyright (c) 2006 Stefan Dösinger
7 * Copyright (c) 2011 Ričardas Barkauskas 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
28
29static struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface2(IDirectDrawSurface2 *iface);
30static struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface);
31
35
36static inline struct ddraw_surface *impl_from_IDirectDrawGammaControl(IDirectDrawGammaControl *iface)
37{
39}
40
41static BOOL ddraw_surface_is_lost(const struct ddraw_surface *surface)
42{
43 return ddraw_surface_can_be_lost(surface)
44 && (surface->ddraw->device_state != DDRAW_DEVICE_STATE_OK || surface->is_lost);
45}
46
48{
49 struct ddraw_surface *surface;
50
52 return FALSE;
53
55}
56
57/* This is slow, of course. Also, in case of locks, we can't prevent other
58 * applications from drawing to the screen while we've locked the frontbuffer.
59 * We'd like to do this in wined3d instead, but for that to work wined3d needs
60 * to support windowless rendering first. */
62 const RECT *rect, BOOL read, unsigned int swap_interval)
63{
64 struct wined3d_texture *dst_texture, *wined3d_texture;
65 struct ddraw *ddraw = surface->ddraw;
66 HDC surface_dc, screen_dc;
67 int x, y, w, h;
68 HRESULT hr;
69 BOOL ret;
70 RECT r;
71
72 TRACE("surface %p, rect %s, read %#x, swap_interval %u.\n",
73 surface, wine_dbgstr_rect(rect), read, swap_interval);
74
75 if (ddraw->flags & DDRAW_SWAPPED && !read)
76 {
77 ddraw->flags &= ~DDRAW_SWAPPED;
78 rect = NULL;
79 }
80
81 if (!rect)
82 {
83 SetRect(&r, 0, 0, surface->surface_desc.dwWidth, surface->surface_desc.dwHeight);
84 rect = &r;
85 }
86
87 x = rect->left;
88 y = rect->top;
89 w = rect->right - rect->left;
90 h = rect->bottom - rect->top;
91
92 if (w <= 0 || h <= 0)
93 return DD_OK;
94
95 if (!read && TRACE_ON(fps))
96 {
98 ++ddraw->frames;
99
100 /* every 1.5 seconds */
101 if (time - ddraw->prev_frame_time > 1500)
102 {
103 TRACE_(fps)("%p @ approx %.2ffps\n",
104 ddraw, 1000.0 * ddraw->frames / (time - ddraw->prev_frame_time));
106 ddraw->frames = 0;
107 }
108 }
109
110 /* The interaction between ddraw and GDI drawing is not all that well
111 * documented, and somewhat arcane. In ddraw exclusive mode, GDI draws
112 * seemingly go to the *original* frontbuffer/primary surface, while ddraw
113 * draws/flips go to the *current* frontbuffer surface. The bottom line is
114 * that if the current frontbuffer is not the GDI frontbuffer, and there's
115 * e.g. a popup window in front of the ddraw swapchain window, we can't
116 * use wined3d_swapchain_present() to get the ddraw contents to the screen
117 * while in exclusive mode, since it would get obscured by the popup
118 * window. On the other hand, if the current frontbuffer *is* the GDI
119 * frontbuffer, that's what's supposed to happen; the popup should obscure
120 * (part of) the ddraw swapchain window.
121 *
122 * This affects the "Deer Hunter" demo, which uses a popup window and GDI
123 * draws to draw part of the user interface. See also the "fswindow"
124 * sample is the DirectX 7 SDK. */
127 {
128 /* Nothing to do, we control the frontbuffer, or at least the parts we
129 * care about. */
130 if (read)
131 return DD_OK;
132
133 if (swap_interval)
135 else
137
140 NULL, WINED3D_TEXF_POINT)) && swap_interval)
141 {
144 }
145 return hr;
146 }
147
150
151 if (FAILED(hr = wined3d_texture_get_dc(wined3d_texture, surface->sub_resource_idx, &surface_dc)))
152 {
153 ERR("Failed to get surface DC, hr %#lx.\n", hr);
154 return hr;
155 }
156 if (surface->palette)
157 wined3d_palette_apply_to_dc(surface->palette->wined3d_palette, surface_dc);
158
159 if (!(screen_dc = GetDC(NULL)))
160 {
162 ERR("Failed to get screen DC.\n");
163 return E_FAIL;
164 }
165
166 if (read)
167 ret = BitBlt(surface_dc, x, y, w, h,
168 screen_dc, x, y, SRCCOPY);
169 else
170 ret = BitBlt(screen_dc, x, y, w, h,
171 surface_dc, x, y, SRCCOPY);
172
173 ReleaseDC(NULL, screen_dc);
175
176 if (!ret)
177 {
178 ERR("Failed to blit to/from screen.\n");
179 return E_FAIL;
180 }
181
182 return DD_OK;
183}
184
185/*****************************************************************************
186 * IUnknown parts follow
187 *****************************************************************************/
188
189/*****************************************************************************
190 * IDirectDrawSurface7::QueryInterface
191 *
192 * A normal QueryInterface implementation. For QueryInterface rules
193 * see ddraw.c, IDirectDraw7::QueryInterface. This method
194 * can Query IDirectDrawSurface interfaces in all version, IDirect3DTexture
195 * in all versions, the IDirectDrawGammaControl interface and it can
196 * create an IDirect3DDevice. (Uses IDirect3D7::CreateDevice)
197 *
198 * Params:
199 * riid: The interface id queried for
200 * obj: Address to write the pointer to
201 *
202 * Returns:
203 * S_OK on success
204 * E_NOINTERFACE if the requested interface wasn't found
205 *
206 *****************************************************************************/
208{
210
211 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj);
212
213 /* According to COM docs, if the QueryInterface fails, obj should be set to NULL */
214 *obj = NULL;
215
216 if(!riid)
217 return DDERR_INVALIDPARAMS;
218
219 if (IsEqualGUID(riid, &IID_IDirectDrawSurface7))
220 {
221 IDirectDrawSurface7_AddRef(iface);
222 *obj = iface;
223 TRACE("(%p) returning IDirectDrawSurface7 interface at %p\n", This, *obj);
224 return S_OK;
225 }
226
227 if (IsEqualGUID(riid, &IID_IDirectDrawSurface4))
228 {
229 IDirectDrawSurface4_AddRef(&This->IDirectDrawSurface4_iface);
230 *obj = &This->IDirectDrawSurface4_iface;
231 TRACE("(%p) returning IDirectDrawSurface4 interface at %p\n", This, *obj);
232 return S_OK;
233 }
234
235 if (IsEqualGUID(riid, &IID_IDirectDrawSurface3))
236 {
237 IDirectDrawSurface3_AddRef(&This->IDirectDrawSurface3_iface);
238 *obj = &This->IDirectDrawSurface3_iface;
239 TRACE("(%p) returning IDirectDrawSurface3 interface at %p\n", This, *obj);
240 return S_OK;
241 }
242
243 if (IsEqualGUID(riid, &IID_IDirectDrawSurface2))
244 {
245 IDirectDrawSurface2_AddRef(&This->IDirectDrawSurface2_iface);
246 *obj = &This->IDirectDrawSurface2_iface;
247 TRACE("(%p) returning IDirectDrawSurface2 interface at %p\n", This, *obj);
248 return S_OK;
249 }
250
251 if (IsEqualGUID(riid, &IID_IDirectDrawSurface)
253 {
254 IDirectDrawSurface_AddRef(&This->IDirectDrawSurface_iface);
255 *obj = &This->IDirectDrawSurface_iface;
256 TRACE("(%p) returning IDirectDrawSurface interface at %p\n", This, *obj);
257 return S_OK;
258 }
259
260 if (IsEqualGUID(riid, &IID_IDirectDrawGammaControl))
261 {
262 IDirectDrawGammaControl_AddRef(&This->IDirectDrawGammaControl_iface);
263 *obj = &This->IDirectDrawGammaControl_iface;
264 TRACE("(%p) returning IDirectDrawGammaControl interface at %p\n", This, *obj);
265 return S_OK;
266 }
267
268 if (IsEqualGUID(riid, &IID_IDirectDrawColorControl))
269 {
270 WARN("Color control not implemented.\n");
271 *obj = NULL;
272 return E_NOINTERFACE;
273 }
274
275 if (This->version != 7)
276 {
278 || IsEqualGUID(riid, &IID_IDirect3DHALDevice)
279 || IsEqualGUID(riid, &IID_IDirect3DRGBDevice))
280 {
282 if (!This->device1)
283 {
284 HRESULT hr;
285
286 if (FAILED(hr = d3d_device_create(This->ddraw, riid, This, (IUnknown *)&This->IDirectDrawSurface_iface,
287 1, &This->device1, (IUnknown *)&This->IDirectDrawSurface_iface)))
288 {
289 This->device1 = NULL;
291 WARN("Failed to create device, hr %#lx.\n", hr);
292 return hr;
293 }
294 }
296
297 IDirect3DDevice_AddRef(&This->device1->IDirect3DDevice_iface);
298 *obj = &This->device1->IDirect3DDevice_iface;
299 return S_OK;
300 }
301
302 if (IsEqualGUID(&IID_IDirect3DTexture2, riid))
303 {
304 IDirect3DTexture2_AddRef(&This->IDirect3DTexture2_iface);
305 *obj = &This->IDirect3DTexture2_iface;
306 return S_OK;
307 }
308
309 if (IsEqualGUID( &IID_IDirect3DTexture, riid ))
310 {
311 IDirect3DTexture2_AddRef(&This->IDirect3DTexture_iface);
312 *obj = &This->IDirect3DTexture_iface;
313 return S_OK;
314 }
315 }
316
317 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
318
319 if (This->version != 7)
320 return E_INVALIDARG;
321
322 return E_NOINTERFACE;
323}
324
325static HRESULT WINAPI ddraw_surface4_QueryInterface(IDirectDrawSurface4 *iface, REFIID riid, void **object)
326{
327 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
328
329 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
330
332}
333
334static HRESULT WINAPI ddraw_surface3_QueryInterface(IDirectDrawSurface3 *iface, REFIID riid, void **object)
335{
336 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
337
338 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
339
341}
342
343static HRESULT WINAPI ddraw_surface2_QueryInterface(IDirectDrawSurface2 *iface, REFIID riid, void **object)
344{
345 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
346
347 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
348
350}
351
352static HRESULT WINAPI ddraw_surface1_QueryInterface(IDirectDrawSurface *iface, REFIID riid, void **object)
353{
354 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
355
356 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
357
359}
360
361static HRESULT WINAPI ddraw_gamma_control_QueryInterface(IDirectDrawGammaControl *iface,
362 REFIID riid, void **object)
363{
364 struct ddraw_surface *surface = impl_from_IDirectDrawGammaControl(iface);
365
366 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
367
369}
370
371static HRESULT WINAPI d3d_texture2_QueryInterface(IDirect3DTexture2 *iface, REFIID riid, void **object)
372{
373 struct ddraw_surface *surface = impl_from_IDirect3DTexture2(iface);
374
375 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
376
378}
379
380static HRESULT WINAPI d3d_texture1_QueryInterface(IDirect3DTexture *iface, REFIID riid, void **object)
381{
382 struct ddraw_surface *surface = impl_from_IDirect3DTexture(iface);
383
384 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
385
387}
388
389static void ddraw_surface_add_iface(struct ddraw_surface *surface)
390{
392 TRACE("%p increasing iface count to %lu.\n", surface, iface_count);
393
394 if (iface_count == 1)
395 {
396 if (surface->ifaceToRelease)
397 IUnknown_AddRef(surface->ifaceToRelease);
399 if (surface->wined3d_rtv)
401 wined3d_texture_incref(surface->draw_texture ? surface->draw_texture : surface->wined3d_texture);
403 }
404}
405
406/*****************************************************************************
407 * IDirectDrawSurface7::AddRef
408 *
409 * A normal addref implementation
410 *
411 * Returns:
412 * The new refcount
413 *
414 *****************************************************************************/
416{
418 ULONG refcount = InterlockedIncrement(&This->ref7);
419
420 TRACE("iface %p increasing refcount to %lu.\n", iface, refcount);
421
422 if (refcount == 1)
423 {
425 }
426
427 return refcount;
428}
429
430static ULONG WINAPI ddraw_surface4_AddRef(IDirectDrawSurface4 *iface)
431{
433 ULONG refcount = InterlockedIncrement(&This->ref4);
434
435 TRACE("iface %p increasing refcount to %lu.\n", iface, refcount);
436
437 if (refcount == 1)
438 {
440 }
441
442 return refcount;
443}
444
445static ULONG WINAPI ddraw_surface3_AddRef(IDirectDrawSurface3 *iface)
446{
448 ULONG refcount = InterlockedIncrement(&This->ref3);
449
450 TRACE("iface %p increasing refcount to %lu.\n", iface, refcount);
451
452 if (refcount == 1)
453 {
455 }
456
457 return refcount;
458}
459
460static ULONG WINAPI ddraw_surface2_AddRef(IDirectDrawSurface2 *iface)
461{
463 ULONG refcount = InterlockedIncrement(&This->ref2);
464
465 TRACE("iface %p increasing refcount to %lu.\n", iface, refcount);
466
467 if (refcount == 1)
468 {
470 }
471
472 return refcount;
473}
474
475static ULONG WINAPI ddraw_surface1_AddRef(IDirectDrawSurface *iface)
476{
478 ULONG refcount = InterlockedIncrement(&This->ref1);
479
480 TRACE("iface %p increasing refcount to %lu.\n", iface, refcount);
481
482 if (refcount == 1)
483 {
485 }
486
487 return refcount;
488}
489
490static ULONG WINAPI ddraw_gamma_control_AddRef(IDirectDrawGammaControl *iface)
491{
493 ULONG refcount = InterlockedIncrement(&This->gamma_count);
494
495 TRACE("iface %p increasing refcount to %lu.\n", iface, refcount);
496
497 if (refcount == 1)
498 {
500 }
501
502 return refcount;
503}
504
505static ULONG WINAPI d3d_texture2_AddRef(IDirect3DTexture2 *iface)
506{
507 struct ddraw_surface *surface = impl_from_IDirect3DTexture2(iface);
508
509 TRACE("iface %p.\n", iface);
510
511 return IUnknown_AddRef(surface->texture_outer);
512}
513
514static ULONG WINAPI d3d_texture1_AddRef(IDirect3DTexture *iface)
515{
516 struct ddraw_surface *surface = impl_from_IDirect3DTexture(iface);
517
518 TRACE("iface %p.\n", iface);
519
520 return IUnknown_AddRef(surface->texture_outer);
521}
522
523static HRESULT ddraw_surface_set_palette(struct ddraw_surface *surface, IDirectDrawPalette *palette)
524{
526 struct ddraw_palette *prev;
527
528 TRACE("iface %p, palette %p.\n", surface, palette);
529
530 if (palette_impl && palette_impl->flags & DDPCAPS_ALPHA
532 {
533 WARN("Alpha palette set on non-texture surface, returning DDERR_INVALIDSURFACETYPE.\n");
535 }
536
539
541
542 prev = surface->palette;
544 {
545 if (prev)
546 prev->flags &= ~DDPCAPS_PRIMARYSURFACE;
547 if (palette_impl)
548 palette_impl->flags |= DDPCAPS_PRIMARYSURFACE;
549 wined3d_swapchain_set_palette(surface->ddraw->wined3d_swapchain,
550 palette_impl ? palette_impl->wined3d_palette : NULL);
552 }
553 if (palette_impl)
554 IDirectDrawPalette_AddRef(&palette_impl->IDirectDrawPalette_iface);
555 if (prev)
556 IDirectDrawPalette_Release(&prev->IDirectDrawPalette_iface);
557 surface->palette = palette_impl;
558
560
561 return DD_OK;
562}
563
564static void ddraw_surface_cleanup(struct ddraw_surface *surface)
565{
566 struct ddraw_surface *surf;
567 UINT i;
568
569 TRACE("surface %p.\n", surface);
570
571 /* The refcount test shows that the palette is detached when the surface
572 * is destroyed. */
574
575 /* Loop through all complex attached surfaces and destroy them.
576 *
577 * Yet again, only the root can have more than one complexly attached
578 * surface, all the others have a total of one. */
579 for (i = 0; i < MAX_COMPLEX_ATTACHED; ++i)
580 {
581 if (!surface->complex_array[i])
582 break;
583
584 surf = surface->complex_array[i];
585 surface->complex_array[i] = NULL;
586 if (!surf->is_root)
587 {
589 struct wined3d_device *wined3d_device = texture->wined3d_device;
590 struct ddraw_surface *root = texture->root;
591
593
594 if (surf == root)
596 }
597 }
598
599 if (surface->device1)
600 IUnknown_Release(&surface->device1->IUnknown_inner);
601
602 if (surface->iface_count > 1)
603 {
604 /* This can happen when a complex surface is destroyed, because the
605 * 2nd surface was addref()ed when the app called
606 * GetAttachedSurface(). */
607 WARN("Destroying surface %p with refcounts 7: %lu 4: %lu 3: %lu 2: %lu 1: %lu.\n",
608 surface, surface->ref7, surface->ref4, surface->ref3, surface->ref2, surface->ref1);
609 }
610
611 if (surface->wined3d_rtv)
613 wined3d_texture_decref(surface->draw_texture ? surface->draw_texture : surface->wined3d_texture);
614}
615
617{
619
620 /* Prevent the surface from being destroyed if it's still attached to
621 * another surface. It will be destroyed when the root is destroyed. */
622 if (This->iface_count == 1 && This->attached_iface)
623 IUnknown_AddRef(This->attached_iface);
624 iface_count = InterlockedDecrement(&This->iface_count);
625
626 TRACE("%p decreasing iface count to %lu.\n", This, iface_count);
627
628 if (iface_count == 0)
629 {
630 struct ddraw_texture *texture = wined3d_texture_get_parent(This->wined3d_texture);
631 struct wined3d_device *wined3d_device = texture->wined3d_device;
632 IUnknown *release_iface = This->ifaceToRelease;
633
634 /* Complex attached surfaces are destroyed implicitly when the root is released */
636 if (!This->is_root)
637 {
638 WARN("(%p) Attempt to destroy a surface that is not a complex root\n", This);
640 return iface_count;
641 }
642 if ((This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
643 && (This->ddraw->flags & DDRAW_RESTORE_MODE) && This->ddraw->swapchain_window)
644 RedrawWindow(This->ddraw->swapchain_window, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME);
647
648 if (release_iface)
649 IUnknown_Release(release_iface);
650 /* Release the device only after anything that may reference it (the
651 * wined3d texture and rendertarget view in particular) is released. */
653 }
654
655 return iface_count;
656}
657
658/*****************************************************************************
659 * IDirectDrawSurface7::Release
660 *
661 * Reduces the surface's refcount by 1. If the refcount falls to 0, the
662 * surface is destroyed.
663 *
664 * Destroying the surface is a bit tricky. For the connection between
665 * WineD3DSurfaces and DirectDrawSurfaces see IDirectDraw7::CreateSurface
666 * It has a nice graph explaining the connection.
667 *
668 * What happens here is basically this:
669 * When a surface is destroyed, its WineD3DSurface is released,
670 * and the refcount of the DirectDraw interface is reduced by 1. If it has
671 * complex surfaces attached to it, then these surfaces are destroyed too,
672 * regardless of their refcount. If any surface being destroyed has another
673 * surface attached to it (with a "soft" attachment, not complex), then
674 * this surface is detached with DeleteAttachedSurface.
675 *
676 * When the surface is a texture, the WineD3DTexture is released.
677 * If the surface is the Direct3D render target, then the D3D
678 * capabilities of the WineD3DDevice are uninitialized, which causes the
679 * swapchain to be released.
680 *
681 * When a complex sublevel falls to ref zero, then this is ignored.
682 *
683 * Returns:
684 * The new refcount
685 *
686 *****************************************************************************/
688{
690 ULONG refcount = InterlockedDecrement(&This->ref7);
691
692 TRACE("iface %p decreasing refcount to %lu.\n", iface, refcount);
693
694 if (refcount == 0)
695 {
697 }
698
699 return refcount;
700}
701
702static ULONG WINAPI ddraw_surface4_Release(IDirectDrawSurface4 *iface)
703{
705 ULONG refcount = InterlockedDecrement(&This->ref4);
706
707 TRACE("iface %p decreasing refcount to %lu.\n", iface, refcount);
708
709 if (refcount == 0)
710 {
712 }
713
714 return refcount;
715}
716
717static ULONG WINAPI ddraw_surface3_Release(IDirectDrawSurface3 *iface)
718{
720 ULONG refcount = InterlockedDecrement(&This->ref3);
721
722 TRACE("iface %p decreasing refcount to %lu.\n", iface, refcount);
723
724 if (refcount == 0)
725 {
727 }
728
729 return refcount;
730}
731
732static ULONG WINAPI ddraw_surface2_Release(IDirectDrawSurface2 *iface)
733{
735 ULONG refcount = InterlockedDecrement(&This->ref2);
736
737 TRACE("iface %p decreasing refcount to %lu.\n", iface, refcount);
738
739 if (refcount == 0)
740 {
742 }
743
744 return refcount;
745}
746
747static ULONG WINAPI ddraw_surface1_Release(IDirectDrawSurface *iface)
748{
750 ULONG refcount = InterlockedDecrement(&This->ref1);
751
752 TRACE("iface %p decreasing refcount to %lu.\n", iface, refcount);
753
754 if (refcount == 0)
755 {
757 }
758
759 return refcount;
760}
761
762static ULONG WINAPI ddraw_gamma_control_Release(IDirectDrawGammaControl *iface)
763{
765 ULONG refcount = InterlockedDecrement(&This->gamma_count);
766
767 TRACE("iface %p decreasing refcount to %lu.\n", iface, refcount);
768
769 if (refcount == 0)
770 {
772 }
773
774 return refcount;
775}
776
777static ULONG WINAPI d3d_texture2_Release(IDirect3DTexture2 *iface)
778{
779 struct ddraw_surface *surface = impl_from_IDirect3DTexture2(iface);
780
781 TRACE("iface %p.\n", iface);
782
783 return IUnknown_Release(surface->texture_outer);
784}
785
786static ULONG WINAPI d3d_texture1_Release(IDirect3DTexture *iface)
787{
788 struct ddraw_surface *surface = impl_from_IDirect3DTexture(iface);
789
790 TRACE("iface %p.\n", iface);
791
792 return IUnknown_Release(surface->texture_outer);
793}
794
795/*****************************************************************************
796 * IDirectDrawSurface7::GetAttachedSurface
797 *
798 * Returns an attached surface with the requested caps. Surface attachment
799 * and complex surfaces are not clearly described by the MSDN or sdk,
800 * so this method is tricky and likely to contain problems.
801 * This implementation searches the complex list first, then the
802 * attachment chain.
803 *
804 * The chains are searched from This down to the last surface in the chain,
805 * not from the first element in the chain. The first surface found is
806 * returned. The MSDN says that this method fails if more than one surface
807 * matches the caps, but it is not sure if that is right. The attachment
808 * structure may not even allow two matching surfaces.
809 *
810 * The found surface is AddRef-ed before it is returned.
811 *
812 * Params:
813 * Caps: Pointer to a DDCAPS2 structure describing the caps asked for
814 * Surface: Address to store the found surface
815 *
816 * Returns:
817 * DD_OK on success
818 * DDERR_INVALIDPARAMS if Caps or Surface is NULL
819 * DDERR_NOTFOUND if no surface was found
820 *
821 *****************************************************************************/
823 DDSCAPS2 *caps, IDirectDrawSurface7 **surface)
824{
825 struct ddraw_surface *head_surface = impl_from_IDirectDrawSurface7(iface);
826 struct ddraw_surface *surf;
827 DDSCAPS2 our_caps;
828 int i;
829
830 TRACE("iface %p, caps %p, attachment %p.\n", iface, caps, surface);
831
832 if (ddraw_surface_is_lost(head_surface))
833 {
834 WARN("Surface %p is lost.\n", head_surface);
835
836 *surface = NULL;
837 return DDERR_SURFACELOST;
838 }
839
841
842 if(head_surface->version < 7)
843 {
844 /* Earlier dx apps put garbage into these members, clear them */
845 our_caps.dwCaps = caps->dwCaps;
846 our_caps.dwCaps2 = 0;
847 our_caps.dwCaps3 = 0;
848 our_caps.dwCaps4 = 0;
849 }
850 else
851 {
852 our_caps = *caps;
853 }
854
855 TRACE("head_surface %p, looking for caps %#lx, %#lx, %#lx, %#lx.\n", head_surface, our_caps.dwCaps,
856 our_caps.dwCaps2, our_caps.dwCaps3, our_caps.dwCaps4); /* FIXME: Better debugging */
857
858 for(i = 0; i < MAX_COMPLEX_ATTACHED; i++)
859 {
860 surf = head_surface->complex_array[i];
861 if(!surf) break;
862
863 TRACE("Surface %p, caps %#lx, %#lx, %#lx, %#lx.\n", surf,
868
869 if (((surf->surface_desc.ddsCaps.dwCaps & our_caps.dwCaps) == our_caps.dwCaps) &&
870 ((surf->surface_desc.ddsCaps.dwCaps2 & our_caps.dwCaps2) == our_caps.dwCaps2)) {
871
872 /* MSDN: "This method fails if more than one surface is attached
873 * that matches the capabilities requested."
874 *
875 * Not sure how to test this.
876 */
877
878 TRACE("head_surface %p, returning surface %p.\n", head_surface, surf);
879 *surface = &surf->IDirectDrawSurface7_iface;
880 ddraw_surface7_AddRef(*surface);
882
883 return DD_OK;
884 }
885 }
886
887 /* Next, look at the attachment chain */
888 surf = head_surface;
889
890 while( (surf = surf->next_attached) )
891 {
892 TRACE("Surface %p, caps %#lx, %#lx, %#lx, %#lx.\n", surf,
897
898 if (((surf->surface_desc.ddsCaps.dwCaps & our_caps.dwCaps) == our_caps.dwCaps) &&
899 ((surf->surface_desc.ddsCaps.dwCaps2 & our_caps.dwCaps2) == our_caps.dwCaps2)) {
900
901 TRACE("head_surface %p, returning surface %p.\n", head_surface, surf);
902 *surface = &surf->IDirectDrawSurface7_iface;
903 ddraw_surface7_AddRef(*surface);
905 return DD_OK;
906 }
907 }
908
909 TRACE("head_surface %p, didn't find a valid surface.\n", head_surface);
910
912
913 *surface = NULL;
914 return DDERR_NOTFOUND;
915}
916
917static HRESULT WINAPI ddraw_surface4_GetAttachedSurface(IDirectDrawSurface4 *iface,
918 DDSCAPS2 *caps, IDirectDrawSurface4 **attachment)
919{
920 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
921 struct ddraw_surface *attachment_impl;
922 IDirectDrawSurface7 *attachment7;
923 HRESULT hr;
924
925 TRACE("iface %p, caps %p, attachment %p.\n", iface, caps, attachment);
926
928 caps, &attachment7);
929 if (FAILED(hr))
930 {
931 *attachment = NULL;
932 return hr;
933 }
934 attachment_impl = impl_from_IDirectDrawSurface7(attachment7);
935 *attachment = &attachment_impl->IDirectDrawSurface4_iface;
937 ddraw_surface7_Release(attachment7);
938
939 return hr;
940}
941
942static HRESULT WINAPI ddraw_surface3_GetAttachedSurface(IDirectDrawSurface3 *iface,
943 DDSCAPS *caps, IDirectDrawSurface3 **attachment)
944{
945 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
946 struct ddraw_surface *attachment_impl;
947 IDirectDrawSurface7 *attachment7;
948 DDSCAPS2 caps2;
949 HRESULT hr;
950
951 TRACE("iface %p, caps %p, attachment %p.\n", iface, caps, attachment);
952
953 caps2.dwCaps = caps->dwCaps;
954 caps2.dwCaps2 = 0;
955 caps2.dwCaps3 = 0;
956 caps2.dwCaps4 = 0;
957
959 &caps2, &attachment7);
960 if (FAILED(hr))
961 {
962 *attachment = NULL;
963 return hr;
964 }
965 attachment_impl = impl_from_IDirectDrawSurface7(attachment7);
966 *attachment = &attachment_impl->IDirectDrawSurface3_iface;
968 ddraw_surface7_Release(attachment7);
969
970 return hr;
971}
972
973static HRESULT WINAPI ddraw_surface2_GetAttachedSurface(IDirectDrawSurface2 *iface,
974 DDSCAPS *caps, IDirectDrawSurface2 **attachment)
975{
976 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
977 struct ddraw_surface *attachment_impl;
978 IDirectDrawSurface7 *attachment7;
979 DDSCAPS2 caps2;
980 HRESULT hr;
981
982 TRACE("iface %p, caps %p, attachment %p.\n", iface, caps, attachment);
983
984 caps2.dwCaps = caps->dwCaps;
985 caps2.dwCaps2 = 0;
986 caps2.dwCaps3 = 0;
987 caps2.dwCaps4 = 0;
988
990 &caps2, &attachment7);
991 if (FAILED(hr))
992 {
993 *attachment = NULL;
994 return hr;
995 }
996 attachment_impl = impl_from_IDirectDrawSurface7(attachment7);
997 *attachment = &attachment_impl->IDirectDrawSurface2_iface;
999 ddraw_surface7_Release(attachment7);
1000
1001 return hr;
1002}
1003
1004static HRESULT WINAPI ddraw_surface1_GetAttachedSurface(IDirectDrawSurface *iface,
1005 DDSCAPS *caps, IDirectDrawSurface **attachment)
1006{
1007 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
1008 struct ddraw_surface *attachment_impl;
1009 IDirectDrawSurface7 *attachment7;
1010 DDSCAPS2 caps2;
1011 HRESULT hr;
1012
1013 TRACE("iface %p, caps %p, attachment %p.\n", iface, caps, attachment);
1014
1015 caps2.dwCaps = caps->dwCaps;
1016 caps2.dwCaps2 = 0;
1017 caps2.dwCaps3 = 0;
1018 caps2.dwCaps4 = 0;
1019
1021 &caps2, &attachment7);
1022 if (FAILED(hr))
1023 {
1024 *attachment = NULL;
1025 return hr;
1026 }
1027 attachment_impl = impl_from_IDirectDrawSurface7(attachment7);
1028 *attachment = &attachment_impl->IDirectDrawSurface_iface;
1030 ddraw_surface7_Release(attachment7);
1031
1032 return hr;
1033}
1034
1035/*****************************************************************************
1036 * IDirectDrawSurface7::Lock
1037 *
1038 * Locks the surface and returns a pointer to the surface's memory
1039 *
1040 * Params:
1041 * Rect: Rectangle to lock. If NULL, the whole surface is locked
1042 * DDSD: Pointer to a DDSURFACEDESC2 which shall receive the surface's desc.
1043 * Flags: Locking flags, e.g Read only or write only
1044 * h: An event handle that's not used and must be NULL
1045 *
1046 * Returns:
1047 * DD_OK on success
1048 * DDERR_INVALIDPARAMS if DDSD is NULL
1049 *
1050 *****************************************************************************/
1051static HRESULT surface_lock(struct ddraw_surface *surface,
1052 RECT *rect, DDSURFACEDESC2 *surface_desc, unsigned int surface_desc_size,
1054{
1055 struct wined3d_map_desc map_desc;
1056 unsigned int wined3d_flags;
1057 struct wined3d_box box;
1058 HRESULT hr = DD_OK;
1059
1060 TRACE("surface %p, rect %s, surface_desc %p, surface_desc_size %u, flags %#lx, h %p.\n",
1061 surface, wine_dbgstr_rect(rect), surface_desc, surface_desc_size, flags, h);
1062
1063 /* surface->surface_desc.dwWidth and dwHeight are changeable, thus lock */
1065
1066 /* Should I check for the handle to be NULL?
1067 *
1068 * The DDLOCK flags and the D3DLOCK flags are equal
1069 * for the supported values. The others are ignored by WineD3D
1070 */
1071
1072 /* Windows zeroes this if the rect is invalid */
1073 surface_desc->lpSurface = NULL;
1074
1075 if (rect)
1076 {
1077 if ((rect->left < 0) || (rect->top < 0)
1078 || (rect->left > rect->right) || (rect->right > surface->surface_desc.dwWidth)
1079 || (rect->top > rect->bottom) || (rect->bottom > surface->surface_desc.dwHeight))
1080 {
1081 WARN("Trying to lock an invalid rectangle, returning DDERR_INVALIDPARAMS\n");
1083 return DDERR_INVALIDPARAMS;
1084 }
1086 }
1087
1090 if (SUCCEEDED(hr))
1091 {
1095 : DDRAW_SURFACE_READ)), surface->sub_resource_idx, &map_desc, rect ? &box : NULL, wined3d_flags);
1096 }
1097 if (FAILED(hr))
1098 {
1100 switch(hr)
1101 {
1102 /* D3D8 and D3D9 return the general D3DERR_INVALIDCALL error, but ddraw has a more
1103 * specific error. But since wined3d returns that error in this only occasion,
1104 * keep d3d8 and d3d9 free from the return value override. There are many different
1105 * places where d3d8/9 would have to catch the DDERR_SURFACEBUSY, it is much easier
1106 * to do it in one place in ddraw.
1107 */
1109 default: return hr;
1110 }
1111 }
1112
1114 {
1115 if (flags & DDLOCK_READONLY)
1116 SetRectEmpty(&surface->ddraw->primary_lock);
1117 else if (rect)
1118 surface->ddraw->primary_lock = *rect;
1119 else
1120 SetRect(&surface->ddraw->primary_lock, 0, 0, surface->surface_desc.dwWidth, surface->surface_desc.dwHeight);
1121 }
1122
1123 /* Windows does not set DDSD_LPSURFACE on locked surfaces. */
1124 DD_STRUCT_COPY_BYSIZE_(surface_desc, &surface->surface_desc, surface_desc_size, surface->surface_desc.dwSize);
1125 surface_desc->lpSurface = map_desc.data;
1126
1127 TRACE("locked surface returning description :\n");
1128 if (TRACE_ON(ddraw))
1129 DDRAW_dump_surface_desc(surface_desc);
1130
1132
1133 return DD_OK;
1134}
1135
1137 const DDSURFACEDESC *desc, unsigned int *size)
1138{
1139 if (!desc)
1140 return FALSE;
1141
1142 if (desc->dwSize == sizeof(DDSURFACEDESC) || desc->dwSize == sizeof(DDSURFACEDESC2))
1143 {
1144 *size = desc->dwSize;
1145 return TRUE;
1146 }
1147
1148 if (surface->version == 7
1151 {
1152 if (desc->dwSize >= sizeof(DDSURFACEDESC2))
1153 *size = sizeof(DDSURFACEDESC2);
1154 else
1155 *size = sizeof(DDSURFACEDESC);
1156 return TRUE;
1157 }
1158
1159 WARN("Invalid structure size %lu.\n", desc->dwSize);
1160 return FALSE;
1161}
1162
1164 RECT *rect, DDSURFACEDESC2 *surface_desc, DWORD flags, HANDLE h)
1165{
1166 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
1167 unsigned int surface_desc_size;
1168
1169 TRACE("iface %p, rect %s, surface_desc %p, flags %#lx, h %p.\n",
1171
1172 if (!surface_validate_lock_desc(surface, (DDSURFACEDESC *)surface_desc, &surface_desc_size))
1173 return DDERR_INVALIDPARAMS;
1174
1175 if (ddraw_surface_is_lost(surface))
1176 {
1177 WARN("Surface is lost.\n");
1178 return DDERR_SURFACELOST;
1179 }
1180
1181 return surface_lock(surface, rect, surface_desc, surface_desc_size, flags, h);
1182}
1183
1184static HRESULT WINAPI ddraw_surface4_Lock(IDirectDrawSurface4 *iface, RECT *rect,
1186{
1187 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
1188 unsigned int surface_desc_size;
1189
1190 TRACE("iface %p, rect %s, surface_desc %p, flags %#lx, h %p.\n",
1192
1193 if (!surface_validate_lock_desc(surface, (DDSURFACEDESC *)surface_desc, &surface_desc_size))
1194 return DDERR_INVALIDPARAMS;
1195
1196 if (ddraw_surface_is_lost(surface))
1197 {
1198 WARN("Surface is lost.\n");
1199 return DDERR_SURFACELOST;
1200 }
1201
1202 return surface_lock(surface, rect, surface_desc, surface_desc_size, flags, h);
1203}
1204
1207{
1208 unsigned int surface_desc_size;
1209 DDSURFACEDESC2 surface_desc2;
1210 HRESULT hr;
1211
1212 if (!surface_validate_lock_desc(surface, surface_desc, &surface_desc_size))
1213 return DDERR_INVALIDPARAMS;
1214
1215 if (ddraw_surface_is_lost(surface))
1216 {
1217 WARN("Surface is lost.\n");
1218 return DDERR_SURFACELOST;
1219 }
1220
1221 surface_desc2.dwSize = surface_desc->dwSize;
1222 surface_desc2.dwFlags = 0;
1223 hr = surface_lock(surface, rect, &surface_desc2, surface_desc_size, flags, h);
1224 DDSD2_to_DDSD(&surface_desc2, surface_desc);
1225 surface_desc->dwSize = surface_desc2.dwSize;
1226 return hr;
1227}
1228
1229static HRESULT WINAPI ddraw_surface3_Lock(IDirectDrawSurface3 *iface, RECT *rect,
1231{
1232 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
1233
1234 TRACE("iface %p, rect %s, surface_desc %p, flags %#lx, h %p.\n",
1236
1237 return ddraw_surface_lock_ddsd(surface, rect, surface_desc, flags, h);
1238}
1239
1240static HRESULT WINAPI ddraw_surface2_Lock(IDirectDrawSurface2 *iface, RECT *rect,
1242{
1243 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
1244
1245 TRACE("iface %p, rect %s, surface_desc %p, flags %#lx, h %p.\n",
1247
1248 return ddraw_surface_lock_ddsd(surface, rect, surface_desc, flags, h);
1249}
1250
1251static HRESULT WINAPI ddraw_surface1_Lock(IDirectDrawSurface *iface, RECT *rect,
1253{
1254 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
1255
1256 TRACE("iface %p, rect %s, surface_desc %p, flags %#lx, h %p.\n",
1258
1259 return ddraw_surface_lock_ddsd(surface, rect, surface_desc, flags, h);
1260}
1261
1262/* FRAPS hooks IDirectDrawSurface::Unlock and expects the version 1 method to be called when the
1263 * game uses later interfaces. */
1264static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Unlock(IDirectDrawSurface *iface, void *data)
1265{
1266 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
1267 HRESULT hr;
1268
1269 TRACE("iface %p, data %p.\n", iface, data);
1270
1273 (ddraw_surface_get_default_texture(surface, 0)), surface->sub_resource_idx);
1275 hr = ddraw_surface_update_frontbuffer(surface, &surface->ddraw->primary_lock, FALSE, 0);
1277
1278 return hr;
1279}
1280
1282{
1283 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
1284
1285 TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(rect));
1286
1288}
1289
1291{
1292 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
1293
1294 TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(rect));
1295
1297}
1298
1299static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface3_Unlock(IDirectDrawSurface3 *iface, void *data)
1300{
1301 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
1302
1303 TRACE("iface %p, data %p.\n", iface, data);
1304
1306}
1307
1308static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_Unlock(IDirectDrawSurface2 *iface, void *data)
1309{
1310 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
1311
1312 TRACE("iface %p, data %p.\n", iface, data);
1313
1315}
1316
1318{
1319 if (flags & DDFLIP_NOVSYNC)
1320 return 0;
1321
1323 {
1324 case DDFLIP_INTERVAL2:
1325 return 2;
1326 case DDFLIP_INTERVAL3:
1327 return 3;
1328 case DDFLIP_INTERVAL4:
1329 return 4;
1330 default:
1331 return 1;
1332 }
1333}
1334
1336 struct wined3d_texture *draw_texture, struct wined3d_rendertarget_view *rtv, void *texture_memory,
1337 struct wined3d_rendertarget_view *current_rtv)
1338{
1339 struct ddraw_surface *dst_surface = dst_texture->root;
1340
1341 /* We don't have to worry about potential texture bindings, since
1342 * flippable surfaces can never be textures. */
1343
1344 if (current_rtv == dst_surface->wined3d_rtv)
1345 wined3d_device_context_set_rendertarget_views(dst_surface->ddraw->immediate_context, 0, 1, &rtv, FALSE);
1347 dst_surface->wined3d_rtv = rtv;
1348
1349 if (dst_surface->sub_resource_idx)
1350 ERR("Invalid sub-resource index %u for surface %p.\n", dst_surface->sub_resource_idx, dst_surface);
1351
1352 if (draw_texture)
1353 {
1357 dst_texture, &ddraw_texture_wined3d_parent_ops);
1359 dst_texture, &ddraw_null_wined3d_parent_ops);
1360 }
1361 else
1362 {
1365 dst_texture, &ddraw_texture_wined3d_parent_ops);
1366 }
1367
1368 dst_surface->wined3d_texture = wined3d_texture;
1369 dst_surface->draw_texture = draw_texture;
1370
1371 dst_texture->texture_memory = texture_memory;
1372}
1373
1374/* FRAPS hooks IDirectDrawSurface::Flip and expects the version 1 method to be called when the
1375 * game uses later interfaces. */
1376static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Flip(IDirectDrawSurface *iface,
1377 IDirectDrawSurface *src, DWORD flags)
1378{
1379 struct ddraw_surface *dst_impl = impl_from_IDirectDrawSurface(iface);
1381 struct ddraw_texture *dst_ddraw_texture, *src_ddraw_texture;
1382 struct wined3d_rendertarget_view *tmp_rtv, *current_rtv;
1383 struct wined3d_texture *texture, *draw_texture;
1384 DDSCAPS caps = {DDSCAPS_FLIP};
1385 IDirectDrawSurface *current;
1386 void *texture_memory;
1387 HRESULT hr;
1388
1389 TRACE("iface %p, src %p, flags %#lx.\n", iface, src, flags);
1390
1391 if (src == iface || !(dst_impl->surface_desc.ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_OVERLAY)))
1392 return DDERR_NOTFLIPPABLE;
1393
1394 if (ddraw_surface_is_lost(dst_impl))
1395 return DDERR_SURFACELOST;
1396
1398
1400 && !(dst_impl->ddraw->cooperative_level & DDSCL_EXCLUSIVE))
1401 {
1402 WARN("Not in exclusive mode.\n");
1404 return DDERR_NOEXCLUSIVEMODE;
1405 }
1406
1407 tmp_rtv = ddraw_surface_get_rendertarget_view(dst_impl);
1408 texture = dst_impl->wined3d_texture;
1409 dst_ddraw_texture = wined3d_texture_get_parent(dst_impl->wined3d_texture);
1410 texture_memory = dst_ddraw_texture->texture_memory;
1411 draw_texture = dst_impl->draw_texture;
1412 current_rtv = wined3d_device_context_get_rendertarget_view(dst_impl->ddraw->immediate_context, 0);
1413
1414 if (src_impl)
1415 {
1416 for (current = iface; current != src;)
1417 {
1419 {
1420 WARN("Surface %p is not on the same flip chain as surface %p.\n", src, iface);
1422 return DDERR_NOTFLIPPABLE;
1423 }
1425 if (current == iface)
1426 {
1427 WARN("Surface %p is not on the same flip chain as surface %p.\n", src, iface);
1429 return DDERR_NOTFLIPPABLE;
1430 }
1431 }
1432
1433 src_ddraw_texture = wined3d_texture_get_parent(src_impl->wined3d_texture);
1434
1435 ddraw_texture_rename_to(dst_ddraw_texture, src_impl->wined3d_texture, src_impl->draw_texture,
1436 ddraw_surface_get_rendertarget_view(src_impl), src_ddraw_texture->texture_memory, current_rtv);
1437
1438 dst_ddraw_texture = src_ddraw_texture;
1439 }
1440 else
1441 {
1442 for (current = iface;;)
1443 {
1445 {
1446 ERR("Can't find a flip target\n");
1448 return DDERR_NOTFLIPPABLE; /* Unchecked */
1449 }
1451 if (current == iface)
1452 {
1453 dst_impl = impl_from_IDirectDrawSurface(iface);
1454 break;
1455 }
1456
1458 src_ddraw_texture = wined3d_texture_get_parent(src_impl->wined3d_texture);
1459
1460 ddraw_texture_rename_to(dst_ddraw_texture, src_impl->wined3d_texture, src_impl->draw_texture,
1461 ddraw_surface_get_rendertarget_view(src_impl), src_ddraw_texture->texture_memory, current_rtv);
1462
1463 dst_ddraw_texture = src_ddraw_texture;
1464 dst_impl = src_impl;
1465 }
1466 }
1467
1468 ddraw_texture_rename_to(dst_ddraw_texture, texture, draw_texture, tmp_rtv, texture_memory, current_rtv);
1469
1471 {
1472 static UINT once;
1473 if (!once++)
1474 FIXME("Ignoring flags %#lx.\n", flags);
1475 else
1476 WARN("Ignoring flags %#lx.\n", flags);
1477 }
1478
1481 else
1482 hr = DD_OK;
1483
1485
1486 return hr;
1487}
1488
1491{
1492 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
1494
1495 TRACE("iface %p, src %p, flags %#lx.\n", iface, src, flags);
1496
1498 src_impl ? &src_impl->IDirectDrawSurface_iface : NULL, flags);
1499}
1500
1501static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface4_Flip(IDirectDrawSurface4 *iface,
1502 IDirectDrawSurface4 *src, DWORD flags)
1503{
1504 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
1506
1507 TRACE("iface %p, src %p, flags %#lx.\n", iface, src, flags);
1508
1510 src_impl ? &src_impl->IDirectDrawSurface_iface : NULL, flags);
1511}
1512
1513static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface3_Flip(IDirectDrawSurface3 *iface,
1514 IDirectDrawSurface3 *src, DWORD flags)
1515{
1516 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
1518
1519 TRACE("iface %p, src %p, flags %#lx.\n", iface, src, flags);
1520
1522 src_impl ? &src_impl->IDirectDrawSurface_iface : NULL, flags);
1523}
1524
1525static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_Flip(IDirectDrawSurface2 *iface,
1526 IDirectDrawSurface2 *src, DWORD flags)
1527{
1528 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
1530
1531 TRACE("iface %p, src %p, flags %#lx.\n", iface, src, flags);
1532
1534 src_impl ? &src_impl->IDirectDrawSurface_iface : NULL, flags);
1535}
1536
1537static HRESULT ddraw_surface_blt(struct ddraw_surface *dst_surface, const RECT *dst_rect,
1538 struct ddraw_surface *src_surface, const RECT *src_rect, DWORD flags, DWORD fill_colour,
1540{
1541 struct ddraw *ddraw = dst_surface->ddraw;
1542 struct wined3d_color colour;
1543 DWORD wined3d_flags;
1544
1545 if (flags & DDBLT_COLORFILL)
1546 {
1547 unsigned int location_flags = dst_rect ? DDRAW_SURFACE_RW : DDRAW_SURFACE_WRITE;
1548
1549 wined3d_flags = WINED3DCLEAR_TARGET;
1550 if (!(flags & DDBLT_ASYNC))
1551 wined3d_flags |= WINED3DCLEAR_SYNCHRONOUS;
1552
1554 dst_surface->palette, fill_colour, &colour))
1555 return DDERR_INVALIDPARAMS;
1556
1559 ddraw_surface_get_default_texture(dst_surface, location_flags),
1560 dst_surface->sub_resource_idx, dst_rect, wined3d_flags, &colour);
1561
1562 ddraw_surface_get_draw_texture(dst_surface, location_flags);
1565 dst_rect, wined3d_flags, &colour, 0.0f, 0);
1566 }
1567
1568 if (flags & DDBLT_DEPTHFILL)
1569 {
1570 wined3d_flags = WINED3DCLEAR_ZBUFFER;
1571 if (!(flags & DDBLT_ASYNC))
1572 wined3d_flags |= WINED3DCLEAR_SYNCHRONOUS;
1573
1575 dst_surface->palette, fill_colour, &colour))
1576 return DDERR_INVALIDPARAMS;
1577
1581 dst_rect, wined3d_flags, NULL, colour.r, 0);
1582 }
1583
1584 wined3d_flags = flags & ~DDBLT_ASYNC;
1585 if (wined3d_flags & ~WINED3D_BLT_MASK)
1586 {
1587 FIXME("Unhandled flags %#lx.\n", flags);
1588 return E_NOTIMPL;
1589 }
1590
1591 if (!(flags & DDBLT_ASYNC))
1592 wined3d_flags |= WINED3D_BLT_SYNCHRONOUS;
1593
1595 ddraw_surface_get_any_texture(dst_surface, DDRAW_SURFACE_RW), dst_surface->sub_resource_idx, dst_rect,
1596 ddraw_surface_get_any_texture(src_surface, DDRAW_SURFACE_READ), src_surface->sub_resource_idx, src_rect,
1597 wined3d_flags, fx, filter);
1598}
1599
1600static HRESULT ddraw_surface_blt_clipped(struct ddraw_surface *dst_surface, const RECT *dst_rect_in,
1601 struct ddraw_surface *src_surface, const RECT *src_rect_in, DWORD flags, DWORD fill_colour,
1603{
1604 RECT src_rect, dst_rect;
1605 float scale_x, scale_y;
1606 const RECT *clip_rect;
1607 DWORD clip_list_size;
1608 RGNDATA *clip_list;
1609 HRESULT hr = DD_OK;
1610 UINT i;
1611
1612 if (!dst_rect_in)
1613 SetRect(&dst_rect, 0, 0, dst_surface->surface_desc.dwWidth,
1614 dst_surface->surface_desc.dwHeight);
1615 else
1616 dst_rect = *dst_rect_in;
1617
1618 if (IsRectEmpty(&dst_rect))
1619 return DDERR_INVALIDRECT;
1620
1621 if (src_surface)
1622 {
1623 if (!src_rect_in)
1624 SetRect(&src_rect, 0, 0, src_surface->surface_desc.dwWidth,
1625 src_surface->surface_desc.dwHeight);
1626 else
1627 src_rect = *src_rect_in;
1628
1629 if (IsRectEmpty(&src_rect))
1630 return DDERR_INVALIDRECT;
1631 }
1632 else
1633 {
1634 SetRectEmpty(&src_rect);
1635 }
1636
1637 if (!dst_surface->clipper)
1638 {
1639 if (src_surface && src_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
1640 hr = ddraw_surface_update_frontbuffer(src_surface, &src_rect, TRUE, 0);
1641 if (SUCCEEDED(hr))
1642 hr = ddraw_surface_blt(dst_surface, &dst_rect, src_surface, &src_rect, flags, fill_colour, fx, filter);
1644 hr = ddraw_surface_update_frontbuffer(dst_surface, &dst_rect, FALSE, 0);
1645
1646 return hr;
1647 }
1648
1649 if (!ddraw_clipper_is_valid(dst_surface->clipper))
1650 {
1651 FIXME("Attempting to blit with an invalid clipper.\n");
1652 return DDERR_INVALIDPARAMS;
1653 }
1654
1655 scale_x = (float)(src_rect.right - src_rect.left) / (float)(dst_rect.right - dst_rect.left);
1656 scale_y = (float)(src_rect.bottom - src_rect.top) / (float)(dst_rect.bottom - dst_rect.top);
1657
1658 if (FAILED(hr = IDirectDrawClipper_GetClipList(&dst_surface->clipper->IDirectDrawClipper_iface,
1659 &dst_rect, NULL, &clip_list_size)))
1660 {
1661 WARN("Failed to get clip list size, hr %#lx.\n", hr);
1662 return hr;
1663 }
1664
1665 if (!(clip_list = malloc(clip_list_size)))
1666 {
1667 WARN("Failed to allocate clip list.\n");
1668 return E_OUTOFMEMORY;
1669 }
1670
1671 if (FAILED(hr = IDirectDrawClipper_GetClipList(&dst_surface->clipper->IDirectDrawClipper_iface,
1672 &dst_rect, clip_list, &clip_list_size)))
1673 {
1674 WARN("Failed to get clip list, hr %#lx.\n", hr);
1675 free(clip_list);
1676 return hr;
1677 }
1678
1679 clip_rect = (RECT *)clip_list->Buffer;
1680 for (i = 0; i < clip_list->rdh.nCount; ++i)
1681 {
1682 RECT src_rect_clipped = src_rect;
1683
1684 if (src_surface)
1685 {
1686 src_rect_clipped.left += (LONG)((clip_rect[i].left - dst_rect.left) * scale_x);
1687 src_rect_clipped.top += (LONG)((clip_rect[i].top - dst_rect.top) * scale_y);
1688 src_rect_clipped.right -= (LONG)((dst_rect.right - clip_rect[i].right) * scale_x);
1689 src_rect_clipped.bottom -= (LONG)((dst_rect.bottom - clip_rect[i].bottom) * scale_y);
1690
1692 {
1693 if (FAILED(hr = ddraw_surface_update_frontbuffer(src_surface, &src_rect_clipped, TRUE, 0)))
1694 break;
1695 }
1696 }
1697
1698 if (FAILED(hr = ddraw_surface_blt(dst_surface, &clip_rect[i],
1699 src_surface, &src_rect_clipped, flags, fill_colour, fx, filter)))
1700 break;
1701
1703 {
1704 if (FAILED(hr = ddraw_surface_update_frontbuffer(dst_surface, &clip_rect[i], FALSE, 0)))
1705 break;
1706 }
1707 }
1708
1709 free(clip_list);
1710 return hr;
1711}
1712
1713/* FRAPS hooks IDirectDrawSurface::Blt and expects the version 1 method to be called when the
1714 * game uses later interfaces. */
1715static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Blt(IDirectDrawSurface *iface, RECT *dst_rect,
1716 IDirectDrawSurface *src_surface, RECT *src_rect, DWORD flags, DDBLTFX *fx)
1717{
1718 struct ddraw_surface *dst_impl = impl_from_IDirectDrawSurface(iface);
1719 struct ddraw_surface *src_impl = unsafe_impl_from_IDirectDrawSurface(src_surface);
1720 struct wined3d_blt_fx wined3d_fx = {0};
1721 DWORD unsupported_flags;
1722 DWORD fill_colour = 0;
1723 HRESULT hr = DD_OK;
1724 DDBLTFX rop_fx;
1725
1726 TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#lx, fx %p.\n",
1727 iface, wine_dbgstr_rect(dst_rect), src_surface, wine_dbgstr_rect(src_rect), flags, fx);
1728
1729 unsupported_flags = DDBLT_ALPHADEST
1743 if (flags & unsupported_flags)
1744 {
1745 WARN("Ignoring unsupported flags %#lx.\n", flags & unsupported_flags);
1746 flags &= ~unsupported_flags;
1747 }
1748
1749 if ((flags & DDBLT_KEYSRCOVERRIDE) && (!fx || flags & DDBLT_KEYSRC))
1750 {
1751 WARN("Invalid source color key parameters, returning DDERR_INVALIDPARAMS\n");
1752 return DDERR_INVALIDPARAMS;
1753 }
1754
1756 {
1757 WARN("Invalid destination color key parameters, returning DDERR_INVALIDPARAMS\n");
1758 return DDERR_INVALIDPARAMS;
1759 }
1760
1761 if (flags & DDBLT_DDROPS)
1762 {
1763 FIXME("DDBLT_DDROPS not implemented.\n");
1764 if (fx)
1765 FIXME(" rop %#lx, pattern %p.\n", fx->dwDDROP, fx->lpDDSPattern);
1766 return DDERR_NORASTEROPHW;
1767 }
1768
1770
1772 {
1773 if (flags & DDBLT_ROP)
1774 {
1776 WARN("DDBLT_ROP used with DDBLT_COLORFILL or DDBLT_DEPTHFILL, returning DDERR_INVALIDPARAMS.\n");
1777 return DDERR_INVALIDPARAMS;
1778 }
1779 if (src_impl)
1780 {
1782 WARN("Depth or colorfill is not compatible with source surfaces, returning DDERR_INVALIDPARAMS\n");
1783 return DDERR_INVALIDPARAMS;
1784 }
1785 if (!fx)
1786 {
1788 WARN("Depth or colorfill used with NULL fx, returning DDERR_INVALIDPARAMS.\n");
1789 return DDERR_INVALIDPARAMS;
1790 }
1791
1793 flags &= ~DDBLT_DEPTHFILL;
1794
1796 {
1798 WARN("DDBLT_COLORFILL used on a depth buffer, returning DDERR_INVALIDPARAMS.\n");
1799 return DDERR_INVALIDPARAMS;
1800 }
1802 {
1804 WARN("DDBLT_DEPTHFILL used on a color buffer, returning DDERR_INVALIDPARAMS.\n");
1805 return DDERR_INVALIDPARAMS;
1806 }
1807 }
1808
1809 if (flags & DDBLT_ROP)
1810 {
1811 if (!fx)
1812 {
1814 WARN("DDBLT_ROP used with NULL fx, returning DDERR_INVALIDPARAMS.\n");
1815 return DDERR_INVALIDPARAMS;
1816 }
1817
1818 if (src_impl && src_rect
1819 && ((ULONG)src_rect->left >= src_rect->right || src_rect->right > src_impl->surface_desc.dwWidth
1820 || (ULONG)src_rect->top >= src_rect->bottom || src_rect->bottom > src_impl->surface_desc.dwHeight))
1821 {
1823 WARN("Invalid source rectangle.\n");
1824 return DDERR_INVALIDRECT;
1825 }
1826
1827 flags &= ~DDBLT_ROP;
1828 switch (fx->dwROP)
1829 {
1830 case SRCCOPY:
1831 break;
1832
1833 case WHITENESS:
1834 case BLACKNESS:
1835 rop_fx = *fx;
1836
1837 if (fx->dwROP == WHITENESS)
1838 rop_fx.dwFillColor = 0xffffffff;
1839 else
1840 rop_fx.dwFillColor = 0;
1841
1844 else
1846
1847 fx = &rop_fx;
1848 break;
1849
1850 default:
1852 WARN("Unsupported ROP %#lx used, returning DDERR_NORASTEROPHW.\n", fx->dwROP);
1853 return DDERR_NORASTEROPHW;
1854 }
1855 }
1856
1857 if (!(flags & (DDBLT_COLORFILL | DDBLT_DEPTHFILL)) && !src_impl)
1858 {
1859 WARN("No source surface.\n");
1861 return DDERR_INVALIDPARAMS;
1862 }
1863
1864 if (flags & DDBLT_KEYSRC && (!src_impl || !(src_impl->surface_desc.dwFlags & DDSD_CKSRCBLT)))
1865 {
1866 WARN("DDBLT_KEYSRC blit without color key in surface, returning DDERR_INVALIDPARAMS\n");
1868 return DDERR_INVALIDPARAMS;
1869 }
1870 if (flags & DDBLT_KEYDEST && !(dst_impl->surface_desc.dwFlags & DDSD_CKDESTBLT))
1871 {
1872 WARN("DDBLT_KEYDEST blit without color key in surface, returning DDERR_INVALIDPARAMS\n");
1874 return DDERR_INVALIDPARAMS;
1875 }
1876
1877 if (fx)
1878 {
1879 wined3d_fx.fx = fx->dwDDFX;
1880 fill_colour = fx->dwFillColor;
1881 wined3d_fx.dst_color_key.color_space_low_value = fx->ddckDestColorkey.dwColorSpaceLowValue;
1882 wined3d_fx.dst_color_key.color_space_high_value = fx->ddckDestColorkey.dwColorSpaceHighValue;
1883 wined3d_fx.src_color_key.color_space_low_value = fx->ddckSrcColorkey.dwColorSpaceLowValue;
1884 wined3d_fx.src_color_key.color_space_high_value = fx->ddckSrcColorkey.dwColorSpaceHighValue;
1885 }
1886
1887 hr = ddraw_surface_blt_clipped(dst_impl, dst_rect, src_impl,
1888 src_rect, flags, fill_colour, fx ? &wined3d_fx : NULL, WINED3D_TEXF_LINEAR);
1889
1891 switch(hr)
1892 {
1894 default: return hr;
1895 }
1896}
1897
1899 IDirectDrawSurface7 *src_surface, RECT *src_rect, DWORD flags, DDBLTFX *fx)
1900{
1903
1904 TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#lx, fx %p.\n",
1905 iface, wine_dbgstr_rect(dst_rect), src_surface, wine_dbgstr_rect(src_rect), flags, fx);
1906
1907 return ddraw_surface1_Blt(&dst->IDirectDrawSurface_iface, dst_rect,
1908 src ? &src->IDirectDrawSurface_iface : NULL, src_rect, flags, fx);
1909}
1910
1911static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface4_Blt(IDirectDrawSurface4 *iface, RECT *dst_rect,
1912 IDirectDrawSurface4 *src_surface, RECT *src_rect, DWORD flags, DDBLTFX *fx)
1913{
1916
1917 TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#lx, fx %p.\n",
1918 iface, wine_dbgstr_rect(dst_rect), src_surface, wine_dbgstr_rect(src_rect), flags, fx);
1919
1920 return ddraw_surface1_Blt(&dst->IDirectDrawSurface_iface, dst_rect,
1921 src ? &src->IDirectDrawSurface_iface : NULL, src_rect, flags, fx);
1922}
1923
1924static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface3_Blt(IDirectDrawSurface3 *iface, RECT *dst_rect,
1925 IDirectDrawSurface3 *src_surface, RECT *src_rect, DWORD flags, DDBLTFX *fx)
1926{
1929
1930 TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#lx, fx %p.\n",
1931 iface, wine_dbgstr_rect(dst_rect), src_surface, wine_dbgstr_rect(src_rect), flags, fx);
1932
1933 return ddraw_surface1_Blt(&dst->IDirectDrawSurface_iface, dst_rect,
1934 src ? &src->IDirectDrawSurface_iface : NULL, src_rect, flags, fx);
1935}
1936
1937static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_Blt(IDirectDrawSurface2 *iface, RECT *dst_rect,
1938 IDirectDrawSurface2 *src_surface, RECT *src_rect, DWORD flags, DDBLTFX *fx)
1939{
1942
1943 TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#lx, fx %p.\n",
1944 iface, wine_dbgstr_rect(dst_rect), src_surface, wine_dbgstr_rect(src_rect), flags, fx);
1945
1946 return ddraw_surface1_Blt(&dst->IDirectDrawSurface_iface, dst_rect,
1947 src ? &src->IDirectDrawSurface_iface : NULL, src_rect, flags, fx);
1948}
1949
1950/*****************************************************************************
1951 * IDirectDrawSurface7::AddAttachedSurface
1952 *
1953 * Attaches a surface to another surface. How the surface attachments work
1954 * is not totally understood yet, and this method is prone to problems.
1955 * The surface that is attached is AddRef-ed.
1956 *
1957 * Tests with complex surfaces suggest that the surface attachments form a
1958 * tree, but no method to test this has been found yet.
1959 *
1960 * The attachment list consists of a first surface (first_attached) and
1961 * for each surface a pointer to the next attached surface (next_attached).
1962 * For the first surface, and a surface that has no attachments
1963 * first_attached points to the surface itself. A surface that has
1964 * no successors in the chain has next_attached set to NULL.
1965 *
1966 * Newly attached surfaces are attached right after the root surface.
1967 * If a surface is attached to a complex surface compound, it's attached to
1968 * the surface that the app requested, not the complex root. See
1969 * GetAttachedSurface for a description how surfaces are found.
1970 *
1971 * This is how the current implementation works, and it was coded by looking
1972 * at the needs of the applications.
1973 *
1974 * So far only Z-Buffer attachments are tested, and they are activated in
1975 * WineD3D. Mipmaps could be tricky to activate in WineD3D.
1976 * Back buffers should work in 2D mode, but they are not tested(They can be
1977 * attached in older iface versions). Rendering to the front buffer and
1978 * switching between that and double buffering is not yet implemented in
1979 * WineD3D, so for 3D it might have unexpected results.
1980 *
1981 * ddraw_surface_attach_surface is the real thing,
1982 * ddraw_surface7_AddAttachedSurface is a wrapper around it that
1983 * performs additional checks. Version 7 of this interface is much more restrictive
1984 * than its predecessors.
1985 *
1986 * Params:
1987 * Attach: Surface to attach to iface
1988 *
1989 * Returns:
1990 * DD_OK on success
1991 * DDERR_CANNOTATTACHSURFACE if the surface can't be attached for some reason
1992 *
1993 *****************************************************************************/
1995{
1996 struct d3d_device *device;
1997
1998 TRACE("surface %p, attachment %p.\n", This, Surf);
1999
2000 if(Surf == This)
2001 return DDERR_CANNOTATTACHSURFACE; /* unchecked */
2002
2004
2005 /* Check if the surface is already attached somewhere */
2006 if (Surf->next_attached || Surf->first_attached != Surf)
2007 {
2008 /* TODO: Test for the structure of the manual attachment. Is it a
2009 * chain or a list? What happens if one surface is attached to 2
2010 * different surfaces? */
2011 WARN("Surface %p is already attached somewhere. next_attached %p, first_attached %p.\n",
2012 Surf, Surf->next_attached, Surf->first_attached);
2013
2016 }
2017
2018 /* This inserts the new surface at the 2nd position in the chain, right after the root surface */
2019 Surf->next_attached = This->next_attached;
2020 Surf->first_attached = This->first_attached;
2021 This->next_attached = Surf;
2022
2023 /* Check if the WineD3D depth stencil needs updating */
2024 LIST_FOR_EACH_ENTRY(device, &This->ddraw->d3ddevice_list, struct d3d_device, ddraw_entry)
2025 {
2027 }
2028
2030
2031 return DD_OK;
2032}
2033
2035{
2038 HRESULT hr;
2039
2040 TRACE("iface %p, attachment %p.\n", iface, attachment);
2041
2042 /* Version 7 of this interface seems to refuse everything except z buffers, as per msdn */
2043 if(!(attachment_impl->surface_desc.ddsCaps.dwCaps & DDSCAPS_ZBUFFER))
2044 {
2045
2046 WARN("Application tries to attach a non Z buffer surface. caps %#lx.\n",
2047 attachment_impl->surface_desc.ddsCaps.dwCaps);
2049 }
2050
2051 hr = ddraw_surface_attach_surface(This, attachment_impl);
2052 if (FAILED(hr))
2053 {
2054 return hr;
2055 }
2056 attachment_impl->attached_iface = (IUnknown *)attachment;
2057 IUnknown_AddRef(attachment_impl->attached_iface);
2058 return hr;
2059}
2060
2061static HRESULT WINAPI ddraw_surface4_AddAttachedSurface(IDirectDrawSurface4 *iface, IDirectDrawSurface4 *attachment)
2062{
2063 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2065 HRESULT hr;
2066
2067 TRACE("iface %p, attachment %p.\n", iface, attachment);
2068
2069 /* Tests suggest that
2070 * -> offscreen plain surfaces can be attached to other offscreen plain surfaces
2071 * -> offscreen plain surfaces can be attached to primaries
2072 * -> primaries can be attached to offscreen plain surfaces
2073 * -> z buffers can be attached to primaries */
2076 {
2077 /* Sizes have to match */
2078 if (attachment_impl->surface_desc.dwWidth != surface->surface_desc.dwWidth
2079 || attachment_impl->surface_desc.dwHeight != surface->surface_desc.dwHeight)
2080 {
2081 WARN("Surface sizes do not match.\n");
2083 }
2084 }
2086 || !(attachment_impl->surface_desc.ddsCaps.dwCaps & (DDSCAPS_ZBUFFER)))
2087 {
2088 WARN("Invalid attachment combination.\n");
2090 }
2091
2092 if (FAILED(hr = ddraw_surface_attach_surface(surface, attachment_impl)))
2093 return hr;
2094
2095 attachment_impl->attached_iface = (IUnknown *)attachment;
2096 IUnknown_AddRef(attachment_impl->attached_iface);
2097 return hr;
2098}
2099
2100static HRESULT WINAPI ddraw_surface3_AddAttachedSurface(IDirectDrawSurface3 *iface, IDirectDrawSurface3 *attachment)
2101{
2102 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
2104 HRESULT hr;
2105
2106 TRACE("iface %p, attachment %p.\n", iface, attachment);
2107
2109 attachment_impl ? &attachment_impl->IDirectDrawSurface4_iface : NULL)))
2110 return hr;
2111
2112 attachment_impl->attached_iface = (IUnknown *)attachment;
2113 IUnknown_AddRef(attachment_impl->attached_iface);
2115 return hr;
2116}
2117
2118static HRESULT WINAPI ddraw_surface2_AddAttachedSurface(IDirectDrawSurface2 *iface, IDirectDrawSurface2 *attachment)
2119{
2120 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
2122 HRESULT hr;
2123
2124 TRACE("iface %p, attachment %p.\n", iface, attachment);
2125
2127 attachment_impl ? &attachment_impl->IDirectDrawSurface4_iface : NULL)))
2128 return hr;
2129
2130 attachment_impl->attached_iface = (IUnknown *)attachment;
2131 IUnknown_AddRef(attachment_impl->attached_iface);
2133 return hr;
2134}
2135
2136static HRESULT WINAPI ddraw_surface1_AddAttachedSurface(IDirectDrawSurface *iface, IDirectDrawSurface *attachment)
2137{
2138 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
2140 HRESULT hr;
2141
2142 TRACE("iface %p, attachment %p.\n", iface, attachment);
2143
2145 attachment_impl ? &attachment_impl->IDirectDrawSurface4_iface : NULL)))
2146 return hr;
2147
2148 attachment_impl->attached_iface = (IUnknown *)attachment;
2149 IUnknown_AddRef(attachment_impl->attached_iface);
2151 return hr;
2152}
2153
2154/*****************************************************************************
2155 * IDirectDrawSurface7::DeleteAttachedSurface
2156 *
2157 * Removes a surface from the attachment chain. The surface's refcount
2158 * is decreased by one after it has been removed
2159 *
2160 * Params:
2161 * Flags: Some flags, not used by this implementation
2162 * Attach: Surface to detach
2163 *
2164 * Returns:
2165 * DD_OK on success
2166 * DDERR_SURFACENOTATTACHED if the surface isn't attached to
2167 *
2168 *****************************************************************************/
2170 struct ddraw_surface *attachment, IUnknown *detach_iface)
2171{
2172 struct wined3d_rendertarget_view *dsv;
2173 struct ddraw_surface *prev = surface;
2174 struct d3d_device *device;
2175
2176 TRACE("surface %p, attachment %p, detach_iface %p.\n", surface, attachment, detach_iface);
2177
2179 if (!attachment || (attachment->first_attached != surface) || (attachment == surface) )
2180 {
2183 }
2184
2185 if (attachment->attached_iface != detach_iface)
2186 {
2187 WARN("attachment->attach_iface %p != detach_iface %p.\n", attachment->attached_iface, detach_iface);
2190 }
2191
2192 /* Remove MIPMAPSUBLEVEL if this seemed to be one */
2193 if (surface->surface_desc.ddsCaps.dwCaps & attachment->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)
2194 {
2195 attachment->surface_desc.ddsCaps.dwCaps2 &= ~DDSCAPS2_MIPMAPSUBLEVEL;
2196 /* FIXME: we should probably also subtract from dwMipMapCount of this
2197 * and all parent surfaces */
2198 }
2199
2200 /* Find the predecessor of the detached surface */
2201 while (prev->next_attached != attachment)
2202 {
2203 if (!(prev = prev->next_attached))
2204 {
2205 ERR("Failed to find predecessor of %p.\n", attachment);
2208 }
2209 }
2210
2211 /* Unchain the surface */
2212 prev->next_attached = attachment->next_attached;
2213 attachment->next_attached = NULL;
2214 attachment->first_attached = attachment;
2215
2216 /* Check if the wined3d depth stencil needs updating. Note that we don't
2217 * just call d3d_device_update_depth_stencil() here since it uses
2218 * QueryInterface(). Some applications, SCP - Containment Breach in
2219 * particular, modify the QueryInterface() pointer in the surface vtbl
2220 * but don't cleanup properly after the relevant dll is unloaded. */
2221 dsv = wined3d_device_context_get_depth_stencil_view(surface->ddraw->immediate_context);
2222 if (attachment->surface_desc.ddsCaps.dwCaps & DDSCAPS_ZBUFFER && dsv == attachment->wined3d_rtv)
2223 {
2224 wined3d_device_context_set_depth_stencil_view(surface->ddraw->immediate_context, NULL);
2225 LIST_FOR_EACH_ENTRY(device, &surface->ddraw->d3ddevice_list, struct d3d_device, ddraw_entry)
2227 }
2229
2230 /* Set attached_iface to NULL before releasing it, the surface may go
2231 * away. */
2232 attachment->attached_iface = NULL;
2233 IUnknown_Release(detach_iface);
2234
2235 return DD_OK;
2236}
2237
2240{
2241 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
2243
2244 TRACE("iface %p, flags %#lx, attachment %p.\n", iface, flags, attachment);
2245
2246 return ddraw_surface_delete_attached_surface(surface, attachment_impl, (IUnknown *)attachment);
2247}
2248
2249static HRESULT WINAPI ddraw_surface4_DeleteAttachedSurface(IDirectDrawSurface4 *iface,
2250 DWORD flags, IDirectDrawSurface4 *attachment)
2251{
2252 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2254
2255 TRACE("iface %p, flags %#lx, attachment %p.\n", iface, flags, attachment);
2256
2257 return ddraw_surface_delete_attached_surface(surface, attachment_impl, (IUnknown *)attachment);
2258}
2259
2260static HRESULT WINAPI ddraw_surface3_DeleteAttachedSurface(IDirectDrawSurface3 *iface,
2261 DWORD flags, IDirectDrawSurface3 *attachment)
2262{
2263 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
2265
2266 TRACE("iface %p, flags %#lx, attachment %p.\n", iface, flags, attachment);
2267
2268 return ddraw_surface_delete_attached_surface(surface, attachment_impl, (IUnknown *)attachment);
2269}
2270
2271static HRESULT WINAPI ddraw_surface2_DeleteAttachedSurface(IDirectDrawSurface2 *iface,
2272 DWORD flags, IDirectDrawSurface2 *attachment)
2273{
2274 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
2276
2277 TRACE("iface %p, flags %#lx, attachment %p.\n", iface, flags, attachment);
2278
2279 return ddraw_surface_delete_attached_surface(surface, attachment_impl, (IUnknown *)attachment);
2280}
2281
2282static HRESULT WINAPI ddraw_surface1_DeleteAttachedSurface(IDirectDrawSurface *iface,
2283 DWORD flags, IDirectDrawSurface *attachment)
2284{
2285 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
2287
2288 TRACE("iface %p, flags %#lx, attachment %p.\n", iface, flags, attachment);
2289
2290 return ddraw_surface_delete_attached_surface(surface, attachment_impl, (IUnknown *)attachment);
2291}
2292
2293/*****************************************************************************
2294 * IDirectDrawSurface7::AddOverlayDirtyRect
2295 *
2296 * "This method is not currently implemented"
2297 *
2298 * Params:
2299 * Rect: ?
2300 *
2301 * Returns:
2302 * DDERR_UNSUPPORTED
2303 *
2304 *****************************************************************************/
2306{
2307 TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(Rect));
2308
2309 return DDERR_UNSUPPORTED; /* unchecked */
2310}
2311
2312static HRESULT WINAPI ddraw_surface4_AddOverlayDirtyRect(IDirectDrawSurface4 *iface, RECT *rect)
2313{
2314 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2315
2316 TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(rect));
2317
2319}
2320
2321static HRESULT WINAPI ddraw_surface3_AddOverlayDirtyRect(IDirectDrawSurface3 *iface, RECT *rect)
2322{
2323 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
2324
2325 TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(rect));
2326
2328}
2329
2330static HRESULT WINAPI ddraw_surface2_AddOverlayDirtyRect(IDirectDrawSurface2 *iface, RECT *rect)
2331{
2332 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
2333
2334 TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(rect));
2335
2337}
2338
2339static HRESULT WINAPI ddraw_surface1_AddOverlayDirtyRect(IDirectDrawSurface *iface, RECT *rect)
2340{
2341 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
2342
2343 TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(rect));
2344
2346}
2347
2348/*****************************************************************************
2349 * IDirectDrawSurface7::GetDC
2350 *
2351 * Returns a GDI device context for the surface
2352 *
2353 * Params:
2354 * hdc: Address of a HDC variable to store the dc to
2355 *
2356 * Returns:
2357 * DD_OK on success
2358 * DDERR_INVALIDPARAMS if hdc is NULL
2359 *
2360 *****************************************************************************/
2362{
2363 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
2364 HRESULT hr = DD_OK;
2365
2366 TRACE("iface %p, dc %p.\n", iface, dc);
2367
2368 if (!dc)
2369 return DDERR_INVALIDPARAMS;
2370
2372 if (surface->dc)
2376 if (SUCCEEDED(hr))
2378
2379 if (SUCCEEDED(hr))
2380 {
2381 surface->dc = *dc;
2382
2384 {
2385 const struct ddraw_palette *palette;
2386
2387 if (surface->palette)
2388 palette = surface->palette;
2389 else if (surface->ddraw->primary)
2390 palette = surface->ddraw->primary->palette;
2391 else
2392 palette = NULL;
2393
2394 if (palette)
2395 wined3d_palette_apply_to_dc(palette->wined3d_palette, *dc);
2396 }
2397 }
2398
2400 switch (hr)
2401 {
2402 /* Some, but not all errors set *dc to NULL. E.g. DCALREADYCREATED
2403 * does not touch *dc. */
2405 *dc = NULL;
2406 return DDERR_CANTCREATEDC;
2407
2408 default:
2409 return hr;
2410 }
2411}
2412
2413static HRESULT WINAPI ddraw_surface4_GetDC(IDirectDrawSurface4 *iface, HDC *dc)
2414{
2415 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2416
2417 TRACE("iface %p, dc %p.\n", iface, dc);
2418
2420}
2421
2422static HRESULT WINAPI ddraw_surface3_GetDC(IDirectDrawSurface3 *iface, HDC *dc)
2423{
2424 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
2425
2426 TRACE("iface %p, dc %p.\n", iface, dc);
2427
2429}
2430
2431static HRESULT WINAPI ddraw_surface2_GetDC(IDirectDrawSurface2 *iface, HDC *dc)
2432{
2433 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
2434
2435 TRACE("iface %p, dc %p.\n", iface, dc);
2436
2438}
2439
2440static HRESULT WINAPI ddraw_surface1_GetDC(IDirectDrawSurface *iface, HDC *dc)
2441{
2442 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
2443
2444 TRACE("iface %p, dc %p.\n", iface, dc);
2445
2447}
2448
2449/*****************************************************************************
2450 * IDirectDrawSurface7::ReleaseDC
2451 *
2452 * Releases the DC that was constructed with GetDC
2453 *
2454 * Params:
2455 * hdc: HDC to release
2456 *
2457 * Returns:
2458 * DD_OK on success, error code otherwise.
2459 *
2460 *****************************************************************************/
2462{
2463 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
2464 HRESULT hr;
2465
2466 TRACE("iface %p, dc %p.\n", iface, hdc);
2467
2469 if (!surface->dc)
2470 {
2471 hr = DDERR_NODC;
2472 }
2474 surface->sub_resource_idx, hdc)))
2475 {
2476 surface->dc = NULL;
2479 }
2481
2482
2483 return hr;
2484}
2485
2486static HRESULT WINAPI ddraw_surface4_ReleaseDC(IDirectDrawSurface4 *iface, HDC dc)
2487{
2488 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2489
2490 TRACE("iface %p, dc %p.\n", iface, dc);
2491
2493}
2494
2495static HRESULT WINAPI ddraw_surface3_ReleaseDC(IDirectDrawSurface3 *iface, HDC dc)
2496{
2497 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
2498
2499 TRACE("iface %p, dc %p.\n", iface, dc);
2500
2502}
2503
2504static HRESULT WINAPI ddraw_surface2_ReleaseDC(IDirectDrawSurface2 *iface, HDC dc)
2505{
2506 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
2507
2508 TRACE("iface %p, dc %p.\n", iface, dc);
2509
2511}
2512
2513static HRESULT WINAPI ddraw_surface1_ReleaseDC(IDirectDrawSurface *iface, HDC dc)
2514{
2515 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
2516
2517 TRACE("iface %p, dc %p.\n", iface, dc);
2518
2520}
2521
2522/*****************************************************************************
2523 * IDirectDrawSurface7::GetCaps
2524 *
2525 * Returns the surface's caps
2526 *
2527 * Params:
2528 * Caps: Address to write the caps to
2529 *
2530 * Returns:
2531 * DD_OK on success
2532 * DDERR_INVALIDPARAMS if Caps is NULL
2533 *
2534 *****************************************************************************/
2536{
2537 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
2538
2539 TRACE("iface %p, caps %p.\n", iface, Caps);
2540
2541 if(!Caps)
2542 return DDERR_INVALIDPARAMS;
2543
2544 *Caps = surface->surface_desc.ddsCaps;
2545
2546 return DD_OK;
2547}
2548
2549static HRESULT WINAPI ddraw_surface4_GetCaps(IDirectDrawSurface4 *iface, DDSCAPS2 *caps)
2550{
2551 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2552
2553 TRACE("iface %p, caps %p.\n", iface, caps);
2554
2555 return ddraw_surface7_GetCaps(&surface->IDirectDrawSurface7_iface, caps);
2556}
2557
2558static HRESULT WINAPI ddraw_surface3_GetCaps(IDirectDrawSurface3 *iface, DDSCAPS *caps)
2559{
2560 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
2561 DDSCAPS2 caps2;
2562 HRESULT hr;
2563
2564 TRACE("iface %p, caps %p.\n", iface, caps);
2565
2567 if (FAILED(hr)) return hr;
2568
2569 caps->dwCaps = caps2.dwCaps;
2570 return hr;
2571}
2572
2573static HRESULT WINAPI ddraw_surface2_GetCaps(IDirectDrawSurface2 *iface, DDSCAPS *caps)
2574{
2575 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
2576 DDSCAPS2 caps2;
2577 HRESULT hr;
2578
2579 TRACE("iface %p, caps %p.\n", iface, caps);
2580
2582 if (FAILED(hr)) return hr;
2583
2584 caps->dwCaps = caps2.dwCaps;
2585 return hr;
2586}
2587
2588static HRESULT WINAPI ddraw_surface1_GetCaps(IDirectDrawSurface *iface, DDSCAPS *caps)
2589{
2590 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
2591 DDSCAPS2 caps2;
2592 HRESULT hr;
2593
2594 TRACE("iface %p, caps %p.\n", iface, caps);
2595
2597 if (FAILED(hr)) return hr;
2598
2599 caps->dwCaps = caps2.dwCaps;
2600 return hr;
2601}
2602
2604{
2605 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
2607 HRESULT hr;
2608 struct wined3d_resource *resource;
2609
2610 TRACE("iface %p, priority %lu.\n", iface, priority);
2611
2613 /* No need to check for offscreen plain surfaces or mipmap sublevels. SetPriority
2614 * calls on such surfaces segfault on Windows. */
2615 if (!(surface->surface_desc.ddsCaps.dwCaps2 & managed))
2616 {
2617 WARN("Called on non-managed texture returning DDERR_INVALIDPARAMS.\n");
2619 }
2620 else
2621 {
2624 if (surface->draw_texture)
2626
2627 hr = DD_OK;
2628 }
2630
2631 return hr;
2632}
2633
2635{
2636 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
2637 const struct wined3d_resource *resource;
2639 HRESULT hr;
2640
2641 TRACE("iface %p, priority %p.\n", iface, priority);
2642
2645 {
2646 WARN("Called on offscreenplain surface, returning DDERR_INVALIDOBJECT.\n");
2648 }
2649 else if (!(surface->surface_desc.ddsCaps.dwCaps2 & managed) || !surface->is_root)
2650 {
2651 WARN("Called on non-managed texture or non-root surface, returning DDERR_INVALIDPARAMS.\n");
2653 }
2654 else
2655 {
2658 hr = DD_OK;
2659 }
2661
2662 return hr;
2663}
2664
2665/*****************************************************************************
2666 * IDirectDrawSurface7::SetPrivateData
2667 *
2668 * Stores some data in the surface that is intended for the application's
2669 * use.
2670 *
2671 * Params:
2672 * tag: GUID that identifies the data
2673 * Data: Pointer to the private data
2674 * Size: Size of the private data
2675 * Flags: Some flags
2676 *
2677 * Returns:
2678 * D3D_OK on success, error code otherwise.
2679 *
2680 *****************************************************************************/
2682 REFGUID tag, void *data, DWORD size, DWORD flags)
2683{
2684 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
2685 HRESULT hr;
2686
2687 TRACE("iface %p, tag %s, data %p, data_size %lu, flags %#lx.\n",
2688 iface, debugstr_guid(tag), data, size, flags);
2689
2690 if (!data)
2691 {
2692 WARN("data is NULL, returning DDERR_INVALIDPARAMS.\n");
2693 return DDERR_INVALIDPARAMS;
2694 }
2695
2699 return hr_ddraw_from_wined3d(hr);
2700}
2701
2702static HRESULT WINAPI ddraw_surface4_SetPrivateData(IDirectDrawSurface4 *iface,
2703 REFGUID tag, void *data, DWORD size, DWORD flags)
2704{
2705 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2706
2707 TRACE("iface %p, tag %s, data %p, data_size %lu, flags %#lx.\n",
2708 iface, debugstr_guid(tag), data, size, flags);
2709
2711}
2712
2713/*****************************************************************************
2714 * IDirectDrawSurface7::GetPrivateData
2715 *
2716 * Returns the private data set with IDirectDrawSurface7::SetPrivateData
2717 *
2718 * Params:
2719 * tag: GUID of the data to return
2720 * Data: Address where to write the data to
2721 * Size: Size of the buffer at Data
2722 *
2723 * Returns:
2724 * DD_OK on success
2725 * DDERR_INVALIDPARAMS if Data is NULL
2726 *
2727 *****************************************************************************/
2729{
2730 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
2731 const struct wined3d_private_data *stored_data;
2732 HRESULT hr;
2733
2734 TRACE("iface %p, tag %s, data %p, data_size %p.\n",
2735 iface, debugstr_guid(tag), data, size);
2736
2739 if (!stored_data)
2740 {
2742 goto done;
2743 }
2744 if (!size)
2745 {
2747 goto done;
2748 }
2749 if (*size < stored_data->size)
2750 {
2751 *size = stored_data->size;
2753 goto done;
2754 }
2755 if (!data)
2756 {
2758 goto done;
2759 }
2760
2761 *size = stored_data->size;
2762 memcpy(data, stored_data->content.data, stored_data->size);
2763 hr = DD_OK;
2764
2765done:
2767 return hr;
2768}
2769
2770static HRESULT WINAPI ddraw_surface4_GetPrivateData(IDirectDrawSurface4 *iface, REFGUID tag, void *data, DWORD *size)
2771{
2772 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2773
2774 TRACE("iface %p, tag %s, data %p, data_size %p.\n",
2775 iface, debugstr_guid(tag), data, size);
2776
2778}
2779
2780/*****************************************************************************
2781 * IDirectDrawSurface7::FreePrivateData
2782 *
2783 * Frees private data stored in the surface
2784 *
2785 * Params:
2786 * tag: Tag of the data to free
2787 *
2788 * Returns:
2789 * D3D_OK on success, error code otherwise.
2790 *
2791 *****************************************************************************/
2793{
2794 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
2796
2797 TRACE("iface %p, tag %s.\n", iface, debugstr_guid(tag));
2798
2801 if (!entry)
2802 {
2804 return DDERR_NOTFOUND;
2805 }
2806
2809
2810 return DD_OK;
2811}
2812
2813static HRESULT WINAPI ddraw_surface4_FreePrivateData(IDirectDrawSurface4 *iface, REFGUID tag)
2814{
2815 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2816
2817 TRACE("iface %p, tag %s.\n", iface, debugstr_guid(tag));
2818
2820}
2821
2822/*****************************************************************************
2823 * IDirectDrawSurface7::PageLock
2824 *
2825 * Prevents a sysmem surface from being paged out
2826 *
2827 * Params:
2828 * Flags: Not used, must be 0(unchecked)
2829 *
2830 * Returns:
2831 * DD_OK, because it's a stub
2832 *
2833 *****************************************************************************/
2835{
2836 TRACE("iface %p, flags %#lx.\n", iface, Flags);
2837
2838 /* This is Windows memory management related - we don't need this */
2839 return DD_OK;
2840}
2841
2842static HRESULT WINAPI ddraw_surface4_PageLock(IDirectDrawSurface4 *iface, DWORD flags)
2843{
2844 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2845
2846 TRACE("iface %p, flags %#lx.\n", iface, flags);
2847
2849}
2850
2851static HRESULT WINAPI ddraw_surface3_PageLock(IDirectDrawSurface3 *iface, DWORD flags)
2852{
2853 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
2854
2855 TRACE("iface %p, flags %#lx.\n", iface, flags);
2856
2858}
2859
2860static HRESULT WINAPI ddraw_surface2_PageLock(IDirectDrawSurface2 *iface, DWORD flags)
2861{
2862 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
2863
2864 TRACE("iface %p, flags %#lx.\n", iface, flags);
2865
2867}
2868
2869/*****************************************************************************
2870 * IDirectDrawSurface7::PageUnlock
2871 *
2872 * Allows a sysmem surface to be paged out
2873 *
2874 * Params:
2875 * Flags: Not used, must be 0(unchecked)
2876 *
2877 * Returns:
2878 * DD_OK, because it's a stub
2879 *
2880 *****************************************************************************/
2882{
2883 TRACE("iface %p, flags %#lx.\n", iface, Flags);
2884
2885 return DD_OK;
2886}
2887
2888static HRESULT WINAPI ddraw_surface4_PageUnlock(IDirectDrawSurface4 *iface, DWORD flags)
2889{
2890 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2891
2892 TRACE("iface %p, flags %#lx.\n", iface, flags);
2893
2895}
2896
2897static HRESULT WINAPI ddraw_surface3_PageUnlock(IDirectDrawSurface3 *iface, DWORD flags)
2898{
2899 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
2900
2901 TRACE("iface %p, flags %#lx.\n", iface, flags);
2902
2904}
2905
2906static HRESULT WINAPI ddraw_surface2_PageUnlock(IDirectDrawSurface2 *iface, DWORD flags)
2907{
2908 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
2909
2910 TRACE("iface %p, flags %#lx.\n", iface, flags);
2911
2913}
2914
2915/*****************************************************************************
2916 * IDirectDrawSurface7::BltBatch
2917 *
2918 * An unimplemented function
2919 *
2920 * Params:
2921 * ?
2922 *
2923 * Returns:
2924 * DDERR_UNSUPPORTED
2925 *
2926 *****************************************************************************/
2928{
2929 TRACE("iface %p, batch %p, count %lu, flags %#lx.\n", iface, Batch, Count, Flags);
2930
2931 /* MSDN: "not currently implemented" */
2932 return DDERR_UNSUPPORTED;
2933}
2934
2936{
2937 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
2938
2939 TRACE("iface %p, batch %p, count %lu, flags %#lx.\n", iface, batch, count, flags);
2940
2942}
2943
2945{
2946 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
2947
2948 TRACE("iface %p, batch %p, count %lu, flags %#lx.\n", iface, batch, count, flags);
2949
2951}
2952
2954{
2955 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
2956
2957 TRACE("iface %p, batch %p, count %lu, flags %#lx.\n", iface, batch, count, flags);
2958
2960}
2961
2963{
2964 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
2965
2966 TRACE("iface %p, batch %p, count %lu, flags %#lx.\n", iface, batch, count, flags);
2967
2969}
2970
2971/*****************************************************************************
2972 * IDirectDrawSurface7::EnumAttachedSurfaces
2973 *
2974 * Enumerates all surfaces attached to this surface
2975 *
2976 * Params:
2977 * context: Pointer to pass unmodified to the callback
2978 * cb: Callback function to call for each surface
2979 *
2980 * Returns:
2981 * DD_OK on success
2982 * DDERR_INVALIDPARAMS if cb is NULL
2983 *
2984 *****************************************************************************/
2987{
2988 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
2989 struct ddraw_surface *surf;
2991 int i;
2992
2993 /* Attached surfaces aren't handled in WineD3D */
2994 TRACE("iface %p, context %p, callback %p.\n", iface, context, cb);
2995
2996 if(!cb)
2997 return DDERR_INVALIDPARAMS;
2998
3000
3001 for(i = 0; i < MAX_COMPLEX_ATTACHED; i++)
3002 {
3003 surf = surface->complex_array[i];
3004 if(!surf) break;
3005
3007 desc = surf->surface_desc;
3008 /* check: != DDENUMRET_OK or == DDENUMRET_CANCEL? */
3010 {
3012 return DD_OK;
3013 }
3014 }
3015
3016 for (surf = surface->next_attached; surf != NULL; surf = surf->next_attached)
3017 {
3019 desc = surf->surface_desc;
3020 /* check: != DDENUMRET_OK or == DDENUMRET_CANCEL? */
3022 {
3024 return DD_OK;
3025 }
3026 }
3027
3028 TRACE(" end of enumeration.\n");
3029
3031
3032 return DD_OK;
3033}
3034
3036{
3038 void *context;
3039};
3040
3041struct callback_info
3042{
3044 void *context;
3045};
3046
3048{
3049 struct ddraw_surface *surface_impl = impl_from_IDirectDrawSurface7(surface);
3050 const struct callback_info2 *info = context;
3051
3053 ddraw_surface7_Release(surface);
3054
3055 return info->callback(&surface_impl->IDirectDrawSurface4_iface, surface_desc, info->context);
3056}
3057
3059{
3060 struct ddraw_surface *surface_impl = impl_from_IDirectDrawSurface7(surface);
3061 const struct callback_info *info = context;
3062
3064 ddraw_surface7_Release(surface);
3065
3066 /* FIXME: Check surface_test.dwSize */
3067 return info->callback(&surface_impl->IDirectDrawSurface_iface,
3068 (DDSURFACEDESC *)surface_desc, info->context);
3069}
3070
3071static HRESULT WINAPI ddraw_surface4_EnumAttachedSurfaces(IDirectDrawSurface4 *iface,
3073{
3074 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3075 struct callback_info2 info;
3076
3077 TRACE("iface %p, context %p, callback %p.\n", iface, context, callback);
3078
3079 info.callback = callback;
3080 info.context = context;
3081
3084}
3085
3086static HRESULT WINAPI ddraw_surface3_EnumAttachedSurfaces(IDirectDrawSurface3 *iface,
3088{
3089 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3090 struct callback_info info;
3091
3092 TRACE("iface %p, context %p, callback %p.\n", iface, context, callback);
3093
3094 info.callback = callback;
3095 info.context = context;
3096
3098 &info, EnumCallback);
3099}
3100
3101static HRESULT WINAPI ddraw_surface2_EnumAttachedSurfaces(IDirectDrawSurface2 *iface,
3103{
3104 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3105 struct callback_info info;
3106
3107 TRACE("iface %p, context %p, callback %p.\n", iface, context, callback);
3108
3109 info.callback = callback;
3110 info.context = context;
3111
3113 &info, EnumCallback);
3114}
3115
3116static HRESULT WINAPI ddraw_surface1_EnumAttachedSurfaces(IDirectDrawSurface *iface,
3118{
3119 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3120 struct callback_info info;
3121
3122 TRACE("iface %p, context %p, callback %p.\n", iface, context, callback);
3123
3124 info.callback = callback;
3125 info.context = context;
3126
3128 &info, EnumCallback);
3129}
3130
3131/*****************************************************************************
3132 * IDirectDrawSurface7::EnumOverlayZOrders
3133 *
3134 * "Enumerates the overlay surfaces on the specified destination"
3135 *
3136 * Params:
3137 * Flags: DDENUMOVERLAYZ_BACKTOFRONT or DDENUMOVERLAYZ_FRONTTOBACK
3138 * context: context to pass back to the callback
3139 * cb: callback function to call for each enumerated surface
3140 *
3141 * Returns:
3142 * DD_OK, because it's a stub
3143 *
3144 *****************************************************************************/
3147{
3148 FIXME("iface %p, flags %#lx, context %p, callback %p stub!\n", iface, Flags, context, cb);
3149
3150 return DD_OK;
3151}
3152
3153static HRESULT WINAPI ddraw_surface4_EnumOverlayZOrders(IDirectDrawSurface4 *iface,
3155{
3156 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3157 struct callback_info2 info;
3158
3159 TRACE("iface %p, flags %#lx, context %p, callback %p.\n", iface, flags, context, callback);
3160
3161 info.callback = callback;
3162 info.context = context;
3163
3166}
3167
3168static HRESULT WINAPI ddraw_surface3_EnumOverlayZOrders(IDirectDrawSurface3 *iface,
3170{
3171 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3172 struct callback_info info;
3173
3174 TRACE("iface %p, flags %#lx, context %p, callback %p.\n", iface, flags, context, callback);
3175
3176 info.callback = callback;
3177 info.context = context;
3178
3181}
3182
3183static HRESULT WINAPI ddraw_surface2_EnumOverlayZOrders(IDirectDrawSurface2 *iface,
3185{
3186 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3187 struct callback_info info;
3188
3189 TRACE("iface %p, flags %#lx, context %p, callback %p.\n", iface, flags, context, callback);
3190
3191 info.callback = callback;
3192 info.context = context;
3193
3196}
3197
3198static HRESULT WINAPI ddraw_surface1_EnumOverlayZOrders(IDirectDrawSurface *iface,
3200{
3201 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3202 struct callback_info info;
3203
3204 TRACE("iface %p, flags %#lx, context %p, callback %p.\n", iface, flags, context, callback);
3205
3206 info.callback = callback;
3207 info.context = context;
3208
3211}
3212
3213/*****************************************************************************
3214 * IDirectDrawSurface7::GetBltStatus
3215 *
3216 * Returns the blitting status
3217 *
3218 * Params:
3219 * Flags: DDGBS_CANBLT or DDGBS_ISBLTDONE
3220 *
3221 *****************************************************************************/
3223{
3224 TRACE("iface %p, flags %#lx.\n", iface, Flags);
3225
3226 switch (Flags)
3227 {
3228 case WINEDDGBS_CANBLT:
3230 return DD_OK;
3231
3232 default:
3233 return DDERR_INVALIDPARAMS;
3234 }
3235}
3236
3237static HRESULT WINAPI ddraw_surface4_GetBltStatus(IDirectDrawSurface4 *iface, DWORD flags)
3238{
3239 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3240
3241 TRACE("iface %p, flags %#lx.\n", iface, flags);
3242
3244}
3245
3246static HRESULT WINAPI ddraw_surface3_GetBltStatus(IDirectDrawSurface3 *iface, DWORD flags)
3247{
3248 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3249
3250 TRACE("iface %p, flags %#lx.\n", iface, flags);
3251
3253}
3254
3255static HRESULT WINAPI ddraw_surface2_GetBltStatus(IDirectDrawSurface2 *iface, DWORD flags)
3256{
3257 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3258
3259 TRACE("iface %p, flags %#lx.\n", iface, flags);
3260
3262}
3263
3264static HRESULT WINAPI ddraw_surface1_GetBltStatus(IDirectDrawSurface *iface, DWORD flags)
3265{
3266 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3267
3268 TRACE("iface %p, flags %#lx.\n", iface, flags);
3269
3271}
3272
3273/*****************************************************************************
3274 * IDirectDrawSurface7::GetColorKey
3275 *
3276 * Returns the color key assigned to the surface
3277 *
3278 * Params:
3279 * Flags: Some flags
3280 * CKey: Address to store the key to
3281 *
3282 * Returns:
3283 * DD_OK on success
3284 * DDERR_INVALIDPARAMS if CKey is NULL
3285 *
3286 *****************************************************************************/
3288{
3290
3291 TRACE("iface %p, flags %#lx, color_key %p.\n", iface, Flags, CKey);
3292
3293 if(!CKey)
3294 return DDERR_INVALIDPARAMS;
3295
3297
3298 switch (Flags)
3299 {
3300 case DDCKEY_DESTBLT:
3301 if (!(This->surface_desc.dwFlags & DDSD_CKDESTBLT))
3302 {
3304 return DDERR_NOCOLORKEY;
3305 }
3306 *CKey = This->surface_desc.ddckCKDestBlt;
3307 break;
3308
3309 case DDCKEY_DESTOVERLAY:
3310 if (!(This->surface_desc.dwFlags & DDSD_CKDESTOVERLAY))
3311 {
3313 return DDERR_NOCOLORKEY;
3314 }
3315 *CKey = This->surface_desc.ddckCKDestOverlay;
3316 break;
3317
3318 case DDCKEY_SRCBLT:
3319 if (!(This->surface_desc.dwFlags & DDSD_CKSRCBLT))
3320 {
3322 return DDERR_NOCOLORKEY;
3323 }
3324 *CKey = This->surface_desc.ddckCKSrcBlt;
3325 break;
3326
3327 case DDCKEY_SRCOVERLAY:
3328 if (!(This->surface_desc.dwFlags & DDSD_CKSRCOVERLAY))
3329 {
3331 return DDERR_NOCOLORKEY;
3332 }
3333 *CKey = This->surface_desc.ddckCKSrcOverlay;
3334 break;
3335
3336 default:
3338 return DDERR_INVALIDPARAMS;
3339 }
3340
3342
3343 return DD_OK;
3344}
3345
3347{
3348 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3349
3350 TRACE("iface %p, flags %#lx, color_key %p.\n", iface, flags, color_key);
3351
3353}
3354
3356{
3357 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3358
3359 TRACE("iface %p, flags %#lx, color_key %p.\n", iface, flags, color_key);
3360
3362}
3363
3365{
3366 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3367
3368 TRACE("iface %p, flags %#lx, color_key %p.\n", iface, flags, color_key);
3369
3371}
3372
3374{
3375 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3376
3377 TRACE("iface %p, flags %#lx, color_key %p.\n", iface, flags, color_key);
3378
3380}
3381
3382/*****************************************************************************
3383 * IDirectDrawSurface7::GetFlipStatus
3384 *
3385 * Returns the flipping status of the surface
3386 *
3387 * Params:
3388 * Flags: DDGFS_CANFLIP of DDGFS_ISFLIPDONE
3389 *
3390 *****************************************************************************/
3392{
3393 TRACE("iface %p, flags %#lx.\n", iface, Flags);
3394
3395 /* XXX: DDERR_INVALIDSURFACETYPE */
3396
3397 switch (Flags)
3398 {
3399 case WINEDDGFS_CANFLIP:
3401 return DD_OK;
3402
3403 default:
3404 return DDERR_INVALIDPARAMS;
3405 }
3406}
3407
3408static HRESULT WINAPI ddraw_surface4_GetFlipStatus(IDirectDrawSurface4 *iface, DWORD flags)
3409{
3410 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3411
3412 TRACE("iface %p, flags %#lx.\n", iface, flags);
3413
3415}
3416
3417static HRESULT WINAPI ddraw_surface3_GetFlipStatus(IDirectDrawSurface3 *iface, DWORD flags)
3418{
3419 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3420
3421 TRACE("iface %p, flags %#lx.\n", iface, flags);
3422
3424}
3425
3426static HRESULT WINAPI ddraw_surface2_GetFlipStatus(IDirectDrawSurface2 *iface, DWORD flags)
3427{
3428 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3429
3430 TRACE("iface %p, flags %#lx.\n", iface, flags);
3431
3433}
3434
3435static HRESULT WINAPI ddraw_surface1_GetFlipStatus(IDirectDrawSurface *iface, DWORD flags)
3436{
3437 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3438
3439 TRACE("iface %p, flags %#lx.\n", iface, flags);
3440
3442}
3443
3444/*****************************************************************************
3445 * IDirectDrawSurface7::GetOverlayPosition
3446 *
3447 * Returns the display coordinates of a visible and active overlay surface
3448 *
3449 * Params:
3450 * X
3451 * Y
3452 *
3453 * Returns:
3454 * DDERR_NOTAOVERLAYSURFACE, because it's a stub
3455 *****************************************************************************/
3457{
3458 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
3459 HRESULT hr;
3460
3461 TRACE("iface %p, x %p, y %p.\n", iface, x, y);
3462
3465 surface->sub_resource_idx, x, y);
3467
3468 return hr;
3469}
3470
3471static HRESULT WINAPI ddraw_surface4_GetOverlayPosition(IDirectDrawSurface4 *iface, LONG *x, LONG *y)
3472{
3473 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3474
3475 TRACE("iface %p, x %p, y %p.\n", iface, x, y);
3476
3478}
3479
3480static HRESULT WINAPI ddraw_surface3_GetOverlayPosition(IDirectDrawSurface3 *iface, LONG *x, LONG *y)
3481{
3482 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3483
3484 TRACE("iface %p, x %p, y %p.\n", iface, x, y);
3485
3487}
3488
3489static HRESULT WINAPI ddraw_surface2_GetOverlayPosition(IDirectDrawSurface2 *iface, LONG *x, LONG *y)
3490{
3491 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3492
3493 TRACE("iface %p, x %p, y %p.\n", iface, x, y);
3494
3496}
3497
3498static HRESULT WINAPI ddraw_surface1_GetOverlayPosition(IDirectDrawSurface *iface, LONG *x, LONG *y)
3499{
3500 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3501
3502 TRACE("iface %p, x %p, y %p.\n", iface, x, y);
3503
3505}
3506
3507/*****************************************************************************
3508 * IDirectDrawSurface7::GetPixelFormat
3509 *
3510 * Returns the pixel format of the Surface
3511 *
3512 * Params:
3513 * PixelFormat: Pointer to a DDPIXELFORMAT structure to which the pixel
3514 * format should be written
3515 *
3516 * Returns:
3517 * DD_OK on success
3518 * DDERR_INVALIDPARAMS if PixelFormat is NULL
3519 *
3520 *****************************************************************************/
3522{
3523 /* What is DDERR_INVALIDSURFACETYPE for here? */
3524 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
3525
3526 TRACE("iface %p, pixel_format %p.\n", iface, PixelFormat);
3527
3528 if(!PixelFormat)
3529 return DDERR_INVALIDPARAMS;
3530
3534
3535 return DD_OK;
3536}
3537
3539{
3540 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3541
3542 TRACE("iface %p, pixel_format %p.\n", iface, pixel_format);
3543
3545}
3546
3548{
3549 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3550
3551 TRACE("iface %p, pixel_format %p.\n", iface, pixel_format);
3552
3554}
3555
3557{
3558 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3559
3560 TRACE("iface %p, pixel_format %p.\n", iface, pixel_format);
3561
3563}
3564
3566{
3567 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3568
3569 TRACE("iface %p, pixel_format %p.\n", iface, pixel_format);
3570
3572}
3573
3574/*****************************************************************************
3575 * IDirectDrawSurface7::GetSurfaceDesc
3576 *
3577 * Returns the description of this surface
3578 *
3579 * Params:
3580 * DDSD: Address of a DDSURFACEDESC2 structure that is to be filled with the
3581 * surface desc
3582 *
3583 * Returns:
3584 * DD_OK on success
3585 * DDERR_INVALIDPARAMS if DDSD is NULL
3586 *
3587 *****************************************************************************/
3589{
3590 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
3591
3592 TRACE("iface %p, surface_desc %p.\n", iface, surface_desc);
3593
3594 if (!surface_desc) return DDERR_INVALIDPARAMS;
3595
3596 if (surface_desc->dwSize != sizeof(DDSURFACEDESC2))
3597 {
3598 WARN("Incorrect struct size %lu.\n", surface_desc->dwSize);
3599 return DDERR_INVALIDPARAMS;
3600 }
3601
3604 TRACE("Returning surface desc:\n");
3607
3608 return DD_OK;
3609}
3610
3611static HRESULT WINAPI ddraw_surface4_GetSurfaceDesc(IDirectDrawSurface4 *iface, DDSURFACEDESC2 *DDSD)
3612{
3613 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3614
3615 TRACE("iface %p, surface_desc %p.\n", iface, DDSD);
3616
3618}
3619
3621{
3622 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3623
3624 TRACE("iface %p, surface_desc %p.\n", iface, surface_desc);
3625
3626 if (!surface_desc) return DDERR_INVALIDPARAMS;
3627
3628 if (surface_desc->dwSize != sizeof(DDSURFACEDESC))
3629 {
3630 WARN("Incorrect structure size %lu.\n", surface_desc->dwSize);
3631 return DDERR_INVALIDPARAMS;
3632 }
3633
3636 TRACE("Returning surface desc:\n");
3637 if (TRACE_ON(ddraw))
3638 {
3639 /* DDRAW_dump_surface_desc handles the smaller size */
3641 }
3643
3644 return DD_OK;
3645}
3646
3647static HRESULT WINAPI ddraw_surface2_GetSurfaceDesc(IDirectDrawSurface2 *iface, DDSURFACEDESC *DDSD)
3648{
3649 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3650
3651 TRACE("iface %p, surface_desc %p.\n", iface, DDSD);
3652
3654}
3655
3656static HRESULT WINAPI ddraw_surface1_GetSurfaceDesc(IDirectDrawSurface *iface, DDSURFACEDESC *DDSD)
3657{
3658 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3659
3660 TRACE("iface %p, surface_desc %p.\n", iface, DDSD);
3661
3663}
3664
3665/*****************************************************************************
3666 * IDirectDrawSurface7::Initialize
3667 *
3668 * Initializes the surface. This is a no-op in Wine
3669 *
3670 * Params:
3671 * DD: Pointer to an DirectDraw interface
3672 * DDSD: Surface description for initialization
3673 *
3674 * Returns:
3675 * DDERR_ALREADYINITIALIZED
3676 *
3677 *****************************************************************************/
3679 IDirectDraw *ddraw, DDSURFACEDESC2 *surface_desc)
3680{
3681 TRACE("iface %p, ddraw %p, surface_desc %p.\n", iface, ddraw, surface_desc);
3682
3684}
3685
3686static HRESULT WINAPI ddraw_surface4_Initialize(IDirectDrawSurface4 *iface,
3687 IDirectDraw *ddraw, DDSURFACEDESC2 *surface_desc)
3688{
3689 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3690
3691 TRACE("iface %p, ddraw %p, surface_desc %p.\n", iface, ddraw, surface_desc);
3692
3695}
3696
3697static HRESULT WINAPI ddraw_surface3_Initialize(IDirectDrawSurface3 *iface,
3698 IDirectDraw *ddraw, DDSURFACEDESC *surface_desc)
3699{
3700 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3701 DDSURFACEDESC2 surface_desc2;
3702
3703 TRACE("iface %p, ddraw %p, surface_desc %p.\n", iface, ddraw, surface_desc);
3704
3705 if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2);
3707 ddraw, surface_desc ? &surface_desc2 : NULL);
3708}
3709
3710static HRESULT WINAPI ddraw_surface2_Initialize(IDirectDrawSurface2 *iface,
3711 IDirectDraw *ddraw, DDSURFACEDESC *surface_desc)
3712{
3713 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3714 DDSURFACEDESC2 surface_desc2;
3715
3716 TRACE("iface %p, ddraw %p, surface_desc %p.\n", iface, ddraw, surface_desc);
3717
3718 if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2);
3720 ddraw, surface_desc ? &surface_desc2 : NULL);
3721}
3722
3723static HRESULT WINAPI ddraw_surface1_Initialize(IDirectDrawSurface *iface,
3724 IDirectDraw *ddraw, DDSURFACEDESC *surface_desc)
3725{
3726 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3727 DDSURFACEDESC2 surface_desc2;
3728
3729 TRACE("iface %p, ddraw %p, surface_desc %p.\n", iface, ddraw, surface_desc);
3730
3731 if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2);
3733 ddraw, surface_desc ? &surface_desc2 : NULL);
3734}
3735
3736/*****************************************************************************
3737 * IDirect3DTexture1::Initialize
3738 *
3739 * The sdk says it's not implemented
3740 *
3741 * Params:
3742 * ?
3743 *
3744 * Returns
3745 * DDERR_UNSUPPORTED
3746 *
3747 *****************************************************************************/
3748static HRESULT WINAPI d3d_texture1_Initialize(IDirect3DTexture *iface,
3749 IDirect3DDevice *device, IDirectDrawSurface *surface)
3750{
3751 TRACE("iface %p, device %p, surface %p.\n", iface, device, surface);
3752
3753 return DDERR_UNSUPPORTED; /* Unchecked */
3754}
3755
3756/*****************************************************************************
3757 * IDirectDrawSurface7::IsLost
3758 *
3759 * Checks if the surface is lost
3760 *
3761 * Returns:
3762 * DD_OK, if the surface is usable
3763 * DDERR_ISLOST if the surface is lost
3764 *
3765 *****************************************************************************/
3767{
3768 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
3769
3770 TRACE("iface %p.\n", iface);
3771
3772 return ddraw_surface_is_lost(surface) ? DDERR_SURFACELOST : DD_OK;
3773}
3774
3775static HRESULT WINAPI ddraw_surface4_IsLost(IDirectDrawSurface4 *iface)
3776{
3777 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3778
3779 TRACE("iface %p.\n", iface);
3780
3781 return ddraw_surface_is_lost(surface) ? DDERR_SURFACELOST : DD_OK;
3782}
3783
3784static HRESULT WINAPI ddraw_surface3_IsLost(IDirectDrawSurface3 *iface)
3785{
3786 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3787
3788 TRACE("iface %p.\n", iface);
3789
3790 return ddraw_surface_is_lost(surface) ? DDERR_SURFACELOST : DD_OK;
3791}
3792
3793static HRESULT WINAPI ddraw_surface2_IsLost(IDirectDrawSurface2 *iface)
3794{
3795 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3796
3797 TRACE("iface %p.\n", iface);
3798
3799 return ddraw_surface_is_lost(surface) ? DDERR_SURFACELOST : DD_OK;
3800}
3801
3802static HRESULT WINAPI ddraw_surface1_IsLost(IDirectDrawSurface *iface)
3803{
3804 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3805
3806 TRACE("iface %p.\n", iface);
3807
3808 return ddraw_surface_is_lost(surface) ? DDERR_SURFACELOST : DD_OK;
3809}
3810
3811/*****************************************************************************
3812 * IDirectDrawSurface7::Restore
3813 *
3814 * Restores a lost surface. This makes the surface usable again, but
3815 * doesn't reload its old contents
3816 *
3817 * Returns:
3818 * DD_OK on success, error code otherwise.
3819 *
3820 *****************************************************************************/
3822{
3823 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
3824 struct ddraw_surface *attachment;
3825 unsigned int i;
3826
3827 TRACE("iface %p.\n", iface);
3828
3830 {
3831 struct wined3d_swapchain *swapchain = surface->ddraw->wined3d_swapchain;
3832 struct wined3d_sub_resource_desc wined3d_desc;
3834 HRESULT hr;
3835
3837 {
3838 WARN("Failed to get display mode, hr %#lx.\n", hr);
3839 return hr;
3840 }
3841
3842 if (FAILED(hr = wined3d_texture_get_sub_resource_desc(surface->wined3d_texture, 0, &wined3d_desc)))
3843 {
3844 WARN("Failed to get resource desc, hr %#lx.\n", hr);
3845 return hr;
3846 }
3847
3848 if (mode.width != wined3d_desc.width || mode.height != wined3d_desc.height)
3849 {
3850 WARN("Display mode dimensions %ux%u don't match surface dimensions %ux%u.\n",
3851 mode.width, mode.height, wined3d_desc.width, wined3d_desc.height);
3852 return DDERR_WRONGMODE;
3853 }
3854
3855 if (mode.format_id != wined3d_desc.format)
3856 {
3857 WARN("Display mode format %#x doesn't match surface format %#x.\n",
3858 mode.format_id, wined3d_desc.format);
3859 return DDERR_WRONGMODE;
3860 }
3861 }
3862
3863 if (!ddraw_surface_can_be_lost(surface))
3864 return DD_OK;
3866 if (surface->ddraw->device_state == DDRAW_DEVICE_STATE_LOST)
3867 return DDERR_WRONGMODE;
3868
3869 surface->is_lost = FALSE;
3870
3871 for(i = 0; i < MAX_COMPLEX_ATTACHED; i++)
3872 {
3873 attachment = surface->complex_array[i];
3874 while (attachment)
3875 {
3876 attachment->is_lost = FALSE;
3877 attachment = attachment->complex_array[0];
3878 if (attachment == surface->complex_array[i])
3879 break;
3880 }
3881 }
3882
3883 return DD_OK;
3884}
3885
3886static HRESULT WINAPI ddraw_surface4_Restore(IDirectDrawSurface4 *iface)
3887{
3888 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3889
3890 TRACE("iface %p.\n", iface);
3891
3893}
3894
3895static HRESULT WINAPI ddraw_surface3_Restore(IDirectDrawSurface3 *iface)
3896{
3897 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3898
3899 TRACE("iface %p.\n", iface);
3900
3902}
3903
3904static HRESULT WINAPI ddraw_surface2_Restore(IDirectDrawSurface2 *iface)
3905{
3906 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3907
3908 TRACE("iface %p.\n", iface);
3909
3911}
3912
3913static HRESULT WINAPI ddraw_surface1_Restore(IDirectDrawSurface *iface)
3914{
3915 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3916
3917 TRACE("iface %p.\n", iface);
3918
3920}
3921
3922/*****************************************************************************
3923 * IDirectDrawSurface7::SetOverlayPosition
3924 *
3925 * Changes the display coordinates of an overlay surface
3926 *
3927 * Params:
3928 * X:
3929 * Y:
3930 *
3931 * Returns:
3932 * DDERR_NOTAOVERLAYSURFACE, because we don't support overlays right now
3933 *****************************************************************************/
3935{
3936 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
3937 HRESULT hr;
3938
3939 TRACE("iface %p, x %ld, y %ld.\n", iface, x, y);
3940
3943 surface->sub_resource_idx, x, y);
3945
3946 return hr;
3947}
3948
3949static HRESULT WINAPI ddraw_surface4_SetOverlayPosition(IDirectDrawSurface4 *iface, LONG x, LONG y)
3950{
3951 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
3952
3953 TRACE("iface %p, x %ld, y %ld.\n", iface, x, y);
3954
3956}
3957
3958static HRESULT WINAPI ddraw_surface3_SetOverlayPosition(IDirectDrawSurface3 *iface, LONG x, LONG y)
3959{
3960 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
3961
3962 TRACE("iface %p, x %ld, y %ld.\n", iface, x, y);
3963
3965}
3966
3967static HRESULT WINAPI ddraw_surface2_SetOverlayPosition(IDirectDrawSurface2 *iface, LONG x, LONG y)
3968{
3969 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
3970
3971 TRACE("iface %p, x %ld, y %ld.\n", iface, x, y);
3972
3974}
3975
3976static HRESULT WINAPI ddraw_surface1_SetOverlayPosition(IDirectDrawSurface *iface, LONG x, LONG y)
3977{
3978 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
3979
3980 TRACE("iface %p, x %ld, y %ld.\n", iface, x, y);
3981
3983}
3984
3985/*****************************************************************************
3986 * IDirectDrawSurface7::UpdateOverlay
3987 *
3988 * Modifies the attributes of an overlay surface.
3989 *
3990 * Params:
3991 * SrcRect: The section of the source being used for the overlay
3992 * DstSurface: Address of the surface that is overlaid
3993 * DstRect: Place of the overlay
3994 * Flags: some DDOVER_* flags
3995 *
3996 * Returns:
3997 * DDERR_UNSUPPORTED, because we don't support overlays
3998 *
3999 *****************************************************************************/
4001 IDirectDrawSurface7 *dst_surface, RECT *dst_rect, DWORD flags, DDOVERLAYFX *fx)
4002{
4003 struct ddraw_surface *src_impl = impl_from_IDirectDrawSurface7(iface);
4004 struct ddraw_surface *dst_impl = unsafe_impl_from_IDirectDrawSurface7(dst_surface);
4005 struct wined3d_texture *dst_wined3d_texture = NULL;
4006 unsigned int dst_sub_resource_idx = 0;
4007 HRESULT hr;
4008
4009 TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#lx, fx %p.\n",
4010 iface, wine_dbgstr_rect(src_rect), dst_surface, wine_dbgstr_rect(dst_rect), flags, fx);
4011
4012 if (fx)
4013 FIXME("Ignoring fx %p.\n", fx);
4014
4016 if (dst_impl)
4017 {
4018 dst_wined3d_texture = dst_impl->wined3d_texture;
4019 dst_sub_resource_idx = dst_impl->sub_resource_idx;
4020 }
4022 src_rect, dst_wined3d_texture, dst_sub_resource_idx, dst_rect, flags);
4024
4025 return hr_ddraw_from_wined3d(hr);
4026}
4027
4028static HRESULT WINAPI ddraw_surface4_UpdateOverlay(IDirectDrawSurface4 *iface, RECT *src_rect,
4029 IDirectDrawSurface4 *dst_surface, RECT *dst_rect, DWORD flags, DDOVERLAYFX *fx)
4030{
4031 struct ddraw_surface *src_impl = impl_from_IDirectDrawSurface4(iface);
4032 struct ddraw_surface *dst_impl = unsafe_impl_from_IDirectDrawSurface4(dst_surface);
4033
4034 TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#lx, fx %p.\n",
4035 iface, wine_dbgstr_rect(src_rect), dst_surface, wine_dbgstr_rect(dst_rect), flags, fx);
4036
4037 return ddraw_surface7_UpdateOverlay(&src_impl->IDirectDrawSurface7_iface, src_rect,
4038 dst_impl ? &dst_impl->IDirectDrawSurface7_iface : NULL, dst_rect, flags, fx);
4039}
4040
4041static HRESULT WINAPI ddraw_surface3_UpdateOverlay(IDirectDrawSurface3 *iface, RECT *src_rect,
4042 IDirectDrawSurface3 *dst_surface, RECT *dst_rect, DWORD flags, DDOVERLAYFX *fx)
4043{
4044 struct ddraw_surface *src_impl = impl_from_IDirectDrawSurface3(iface);
4045 struct ddraw_surface *dst_impl = unsafe_impl_from_IDirectDrawSurface3(dst_surface);
4046
4047 TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#lx, fx %p.\n",
4048 iface, wine_dbgstr_rect(src_rect), dst_surface, wine_dbgstr_rect(dst_rect), flags, fx);
4049
4050 return ddraw_surface7_UpdateOverlay(&src_impl->IDirectDrawSurface7_iface, src_rect,
4051 dst_impl ? &dst_impl->IDirectDrawSurface7_iface : NULL, dst_rect, flags, fx);
4052}
4053
4054static HRESULT WINAPI ddraw_surface2_UpdateOverlay(IDirectDrawSurface2 *iface, RECT *src_rect,
4055 IDirectDrawSurface2 *dst_surface, RECT *dst_rect, DWORD flags, DDOVERLAYFX *fx)
4056{
4057 struct ddraw_surface *src_impl = impl_from_IDirectDrawSurface2(iface);
4058 struct ddraw_surface *dst_impl = unsafe_impl_from_IDirectDrawSurface2(dst_surface);
4059
4060 TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#lx, fx %p.\n",
4061 iface, wine_dbgstr_rect(src_rect), dst_surface, wine_dbgstr_rect(dst_rect), flags, fx);
4062
4063 return ddraw_surface7_UpdateOverlay(&src_impl->IDirectDrawSurface7_iface, src_rect,
4064 dst_impl ? &dst_impl->IDirectDrawSurface7_iface : NULL, dst_rect, flags, fx);
4065}
4066
4067static HRESULT WINAPI ddraw_surface1_UpdateOverlay(IDirectDrawSurface *iface, RECT *src_rect,
4068 IDirectDrawSurface *dst_surface, RECT *dst_rect, DWORD flags, DDOVERLAYFX *fx)
4069{
4070 struct ddraw_surface *src_impl = impl_from_IDirectDrawSurface(iface);
4071 struct ddraw_surface *dst_impl = unsafe_impl_from_IDirectDrawSurface(dst_surface);
4072
4073 TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#lx, fx %p.\n",
4074 iface, wine_dbgstr_rect(src_rect), dst_surface, wine_dbgstr_rect(dst_rect), flags, fx);
4075
4076 return ddraw_surface7_UpdateOverlay(&src_impl->IDirectDrawSurface7_iface, src_rect,
4077 dst_impl ? &dst_impl->IDirectDrawSurface7_iface : NULL, dst_rect, flags, fx);
4078}
4079
4080/*****************************************************************************
4081 * IDirectDrawSurface7::UpdateOverlayDisplay
4082 *
4083 * The DX7 sdk says that it's not implemented
4084 *
4085 * Params:
4086 * Flags: ?
4087 *
4088 * Returns: DDERR_UNSUPPORTED, because we don't support overlays
4089 *
4090 *****************************************************************************/
4092{
4093 TRACE("iface %p, flags %#lx.\n", iface, Flags);
4094
4095 return DDERR_UNSUPPORTED;
4096}
4097
4099{
4100 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
4101
4102 TRACE("iface %p, flags %#lx.\n", iface, flags);
4103
4105}
4106
4108{
4109 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
4110
4111 TRACE("iface %p, flags %#lx.\n", iface, flags);
4112
4114}
4115
4117{
4118 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
4119
4120 TRACE("iface %p, flags %#lx.\n", iface, flags);
4121
4123}
4124
4126{
4127 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
4128
4129 TRACE("iface %p, flags %#lx.\n", iface, flags);
4130
4132}
4133
4134/*****************************************************************************
4135 * IDirectDrawSurface7::UpdateOverlayZOrder
4136 *
4137 * Sets an overlay's Z order
4138 *
4139 * Params:
4140 * Flags: DDOVERZ_* flags
4141 * DDSRef: Defines the relative position in the overlay chain
4142 *
4143 * Returns:
4144 * DDERR_NOTOVERLAYSURFACE, because we don't support overlays
4145 *
4146 *****************************************************************************/
4149{
4150 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
4151
4152 FIXME("iface %p, flags %#lx, reference %p stub!\n", iface, flags, reference);
4153
4155 if (!(surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_OVERLAY))
4156 {
4157 WARN("Not an overlay surface.\n");
4160 }
4162
4163 return DD_OK;
4164}
4165
4166static HRESULT WINAPI ddraw_surface4_UpdateOverlayZOrder(IDirectDrawSurface4 *iface,
4167 DWORD flags, IDirectDrawSurface4 *reference)
4168{
4169 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
4171
4172 TRACE("iface %p, flags %#lx, reference %p.\n", iface, flags, reference);
4173
4175 reference_impl ? &reference_impl->IDirectDrawSurface7_iface : NULL);
4176}
4177
4178static HRESULT WINAPI ddraw_surface3_UpdateOverlayZOrder(IDirectDrawSurface3 *iface,
4179 DWORD flags, IDirectDrawSurface3 *reference)
4180{
4181 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
4183
4184 TRACE("iface %p, flags %#lx, reference %p.\n", iface, flags, reference);
4185
4187 reference_impl ? &reference_impl->IDirectDrawSurface7_iface : NULL);
4188}
4189
4190static HRESULT WINAPI ddraw_surface2_UpdateOverlayZOrder(IDirectDrawSurface2 *iface,
4191 DWORD flags, IDirectDrawSurface2 *reference)
4192{
4193 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
4195
4196 TRACE("iface %p, flags %#lx, reference %p.\n", iface, flags, reference);
4197
4199 reference_impl ? &reference_impl->IDirectDrawSurface7_iface : NULL);
4200}
4201
4202static HRESULT WINAPI ddraw_surface1_UpdateOverlayZOrder(IDirectDrawSurface *iface,
4203 DWORD flags, IDirectDrawSurface *reference)
4204{
4205 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
4207
4208 TRACE("iface %p, flags %#lx, reference %p.\n", iface, flags, reference);
4209
4211 reference_impl ? &reference_impl->IDirectDrawSurface7_iface : NULL);
4212}
4213
4214/*****************************************************************************
4215 * IDirectDrawSurface7::GetDDInterface
4216 *
4217 * Returns the IDirectDraw7 interface pointer of the DirectDraw object this
4218 * surface belongs to
4219 *
4220 * Params:
4221 * DD: Address to write the interface pointer to
4222 *
4223 * Returns:
4224 * DD_OK on success
4225 * DDERR_INVALIDPARAMS if DD is NULL
4226 *
4227 *****************************************************************************/
4229{
4231
4232 TRACE("iface %p, ddraw %p.\n", iface, DD);
4233
4234 if(!DD)
4235 return DDERR_INVALIDPARAMS;
4236
4237 switch(This->version)
4238 {
4239 case 7:
4240 *DD = &This->ddraw->IDirectDraw7_iface;
4241 break;
4242
4243 case 4:
4244 *DD = &This->ddraw->IDirectDraw4_iface;
4245 break;
4246
4247 case 2:
4248 *DD = &This->ddraw->IDirectDraw2_iface;
4249 break;
4250
4251 case 1:
4252 *DD = &This->ddraw->IDirectDraw_iface;
4253 break;
4254
4255 }
4256 IUnknown_AddRef((IUnknown *)*DD);
4257
4258 return DD_OK;
4259}
4260
4261static HRESULT WINAPI ddraw_surface4_GetDDInterface(IDirectDrawSurface4 *iface, void **ddraw)
4262{
4263 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
4264
4265 TRACE("iface %p, ddraw %p.\n", iface, ddraw);
4266
4268}
4269
4270static HRESULT WINAPI ddraw_surface3_GetDDInterface(IDirectDrawSurface3 *iface, void **ddraw)
4271{
4272 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
4273
4274 TRACE("iface %p, ddraw %p.\n", iface, ddraw);
4275
4277}
4278
4279static HRESULT WINAPI ddraw_surface2_GetDDInterface(IDirectDrawSurface2 *iface, void **ddraw)
4280{
4281 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
4282
4283 TRACE("iface %p, ddraw %p.\n", iface, ddraw);
4284
4286}
4287
4289{
4290 TRACE("iface %p.\n", iface);
4291
4292 return DD_OK;
4293}
4294
4295static HRESULT WINAPI ddraw_surface4_ChangeUniquenessValue(IDirectDrawSurface4 *iface)
4296{
4297 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
4298
4299 TRACE("iface %p.\n", iface);
4300
4302}
4303
4305{
4306 TRACE("iface %p, value %p.\n", iface, pValue);
4307
4308 *pValue = 0;
4309
4310 return DD_OK;
4311}
4312
4314{
4315 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
4316
4317 TRACE("iface %p, value %p.\n", iface, pValue);
4318
4320}
4321
4322/*****************************************************************************
4323 * IDirectDrawSurface7::SetLOD
4324 *
4325 * Sets the level of detail of a texture
4326 *
4327 * Params:
4328 * MaxLOD: LOD to set
4329 *
4330 * Returns:
4331 * DD_OK on success
4332 * DDERR_INVALIDOBJECT if the surface is invalid for this method
4333 *
4334 *****************************************************************************/
4336{
4337 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
4338 struct d3d_device *device;
4339
4340 TRACE("iface %p, lod %lu.\n", iface, MaxLOD);
4341
4344 {
4346 return DDERR_INVALIDOBJECT;
4347 }
4348
4349 wined3d_texture_set_lod(surface->wined3d_texture, MaxLOD);
4350 if (surface->draw_texture)
4351 wined3d_texture_set_lod(surface->draw_texture, MaxLOD);
4352
4353 LIST_FOR_EACH_ENTRY(device, &surface->ddraw->d3ddevice_list, struct d3d_device, ddraw_entry)
4354 {
4356 if (surface->draw_texture)
4358 }
4360 return DD_OK;
4361}
4362
4363/*****************************************************************************
4364 * IDirectDrawSurface7::GetLOD
4365 *
4366 * Returns the level of detail of a Direct3D texture
4367 *
4368 * Params:
4369 * MaxLOD: Address to write the LOD to
4370 *
4371 * Returns:
4372 * DD_OK on success
4373 * DDERR_INVALIDPARAMS if MaxLOD is NULL
4374 * DDERR_INVALIDOBJECT if the surface is invalid for this method
4375 *
4376 *****************************************************************************/
4378{
4379 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
4380
4381 TRACE("iface %p, lod %p.\n", iface, MaxLOD);
4382
4383 if(!MaxLOD)
4384 return DDERR_INVALIDPARAMS;
4385
4388 {
4390 return DDERR_INVALIDOBJECT;
4391 }
4392
4393 *MaxLOD = wined3d_texture_get_lod(surface->wined3d_texture);
4395
4396 return DD_OK;
4397}
4398
4399/*****************************************************************************
4400 * IDirectDrawSurface7::BltFast
4401 *
4402 * Performs a fast Blit.
4403 *
4404 * Params:
4405 * dstx: The x coordinate to blit to on the destination
4406 * dsty: The y coordinate to blit to on the destination
4407 * Source: The source surface
4408 * rsrc: The source rectangle
4409 * trans: Type of transfer. Some DDBLTFAST_* flags
4410 *
4411 * Returns:
4412 * DD_OK on success, error code otherwise.
4413 *
4414 *****************************************************************************/
4416 DWORD dst_x, DWORD dst_y, IDirectDrawSurface7 *src_surface, RECT *src_rect, DWORD trans)
4417{
4418 struct ddraw_surface *dst_impl = impl_from_IDirectDrawSurface7(iface);
4419 struct ddraw_surface *src_impl = unsafe_impl_from_IDirectDrawSurface7(src_surface);
4421 DWORD src_w, src_h, dst_w, dst_h;
4422 HRESULT hr = DD_OK;
4423 RECT dst_rect, s;
4424
4425 TRACE("iface %p, dst_x %lu, dst_y %lu, src_surface %p, src_rect %s, flags %#lx.\n",
4426 iface, dst_x, dst_y, src_surface, wine_dbgstr_rect(src_rect), trans);
4427
4428 dst_w = dst_impl->surface_desc.dwWidth;
4429 dst_h = dst_impl->surface_desc.dwHeight;
4430
4431 if (!src_rect)
4432 {
4433 SetRect(&s, 0, 0, src_impl->surface_desc.dwWidth, src_impl->surface_desc.dwHeight);
4434 src_rect = &s;
4435 }
4436
4437 src_w = src_rect->right - src_rect->left;
4438 src_h = src_rect->bottom - src_rect->top;
4439 if (src_w > dst_w || dst_x > dst_w - src_w
4440 || src_h > dst_h || dst_y > dst_h - src_h)
4441 {
4442 WARN("Destination area out of bounds, returning DDERR_INVALIDRECT.\n");
4443 return DDERR_INVALIDRECT;
4444 }
4445
4446 SetRect(&dst_rect, dst_x, dst_y, dst_x + src_w, dst_y + src_h);
4447 if (trans & DDBLTFAST_SRCCOLORKEY)
4449 if (trans & DDBLTFAST_DESTCOLORKEY)
4451 if (trans & DDBLTFAST_WAIT)
4453 if (trans & DDBLTFAST_DONOTWAIT)
4455
4457 if (dst_impl->clipper)
4458 {
4460 WARN("Destination surface has a clipper set, returning DDERR_BLTFASTCANTCLIP.\n");
4461 return DDERR_BLTFASTCANTCLIP;
4462 }
4463
4465 hr = ddraw_surface_update_frontbuffer(src_impl, src_rect, TRUE, 0);
4466 if (SUCCEEDED(hr))
4467 hr = wined3d_device_context_blt(dst_impl->ddraw->immediate_context,
4468 ddraw_surface_get_any_texture(dst_impl, DDRAW_SURFACE_RW), dst_impl->sub_resource_idx, &dst_rect,
4472 hr = ddraw_surface_update_frontbuffer(dst_impl, &dst_rect, FALSE, 0);
4474
4475 switch(hr)
4476 {
4478 default: return hr;
4479 }
4480}
4481
4482static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface4_BltFast(IDirectDrawSurface4 *iface, DWORD dst_x, DWORD dst_y,
4483 IDirectDrawSurface4 *src_surface, RECT *src_rect, DWORD flags)
4484{
4485 struct ddraw_surface *dst_impl = impl_from_IDirectDrawSurface4(iface);
4486 struct ddraw_surface *src_impl = unsafe_impl_from_IDirectDrawSurface4(src_surface);
4487
4488 TRACE("iface %p, dst_x %lu, dst_y %lu, src_surface %p, src_rect %s, flags %#lx.\n",
4489 iface, dst_x, dst_y, src_surface, wine_dbgstr_rect(src_rect), flags);
4490
4491 return ddraw_surface7_BltFast(&dst_impl->IDirectDrawSurface7_iface, dst_x, dst_y,
4492 src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, src_rect, flags);
4493}
4494
4495static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface3_BltFast(IDirectDrawSurface3 *iface, DWORD dst_x, DWORD dst_y,
4496 IDirectDrawSurface3 *src_surface, RECT *src_rect, DWORD flags)
4497{
4498 struct ddraw_surface *dst_impl = impl_from_IDirectDrawSurface3(iface);
4499 struct ddraw_surface *src_impl = unsafe_impl_from_IDirectDrawSurface3(src_surface);
4500
4501 TRACE("iface %p, dst_x %lu, dst_y %lu, src_surface %p, src_rect %s, flags %#lx.\n",
4502 iface, dst_x, dst_y, src_surface, wine_dbgstr_rect(src_rect), flags);
4503
4504 return ddraw_surface7_BltFast(&dst_impl->IDirectDrawSurface7_iface, dst_x, dst_y,
4505 src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, src_rect, flags);
4506}
4507
4508static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_BltFast(IDirectDrawSurface2 *iface, DWORD dst_x, DWORD dst_y,
4509 IDirectDrawSurface2 *src_surface, RECT *src_rect, DWORD flags)
4510{
4511 struct ddraw_surface *dst_impl = impl_from_IDirectDrawSurface2(iface);
4512 struct ddraw_surface *src_impl = unsafe_impl_from_IDirectDrawSurface2(src_surface);
4513
4514 TRACE("iface %p, dst_x %lu, dst_y %lu, src_surface %p, src_rect %s, flags %#lx.\n",
4515 iface, dst_x, dst_y, src_surface, wine_dbgstr_rect(src_rect), flags);
4516
4517 return ddraw_surface7_BltFast(&dst_impl->IDirectDrawSurface7_iface, dst_x, dst_y,
4518 src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, src_rect, flags);
4519}
4520
4521static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_BltFast(IDirectDrawSurface *iface, DWORD dst_x, DWORD dst_y,
4522 IDirectDrawSurface *src_surface, RECT *src_rect, DWORD flags)
4523{
4524 struct ddraw_surface *dst_impl = impl_from_IDirectDrawSurface(iface);
4525 struct ddraw_surface *src_impl = unsafe_impl_from_IDirectDrawSurface(src_surface);
4526
4527 TRACE("iface %p, dst_x %lu, dst_y %lu, src_surface %p, src_rect %s, flags %#lx.\n",
4528 iface, dst_x, dst_y, src_surface, wine_dbgstr_rect(src_rect), flags);
4529
4530 return ddraw_surface7_BltFast(&dst_impl->IDirectDrawSurface7_iface, dst_x, dst_y,
4531 src_impl ? &src_impl->IDirectDrawSurface7_iface : NULL, src_rect, flags);
4532}
4533
4535{
4536 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
4537
4538 TRACE("iface %p, clipper %p.\n", iface, clipper);
4539
4540 if (!clipper)
4541 return DDERR_INVALIDPARAMS;
4542
4544 if (!surface->clipper)
4545 {
4547 *clipper = NULL;
4549 }
4550
4551 *clipper = &surface->clipper->IDirectDrawClipper_iface;
4552 if (ddraw_clipper_is_valid(surface->clipper))
4553 IDirectDrawClipper_AddRef(*clipper);
4555
4556 return DD_OK;
4557}
4558
4559static HRESULT WINAPI ddraw_surface4_GetClipper(IDirectDrawSurface4 *iface, IDirectDrawClipper **clipper)
4560{
4561 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
4562
4563 TRACE("iface %p, clipper %p.\n", iface, clipper);
4564
4566}
4567
4568static HRESULT WINAPI ddraw_surface3_GetClipper(IDirectDrawSurface3 *iface, IDirectDrawClipper **clipper)
4569{
4570 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
4571
4572 TRACE("iface %p, clipper %p.\n", iface, clipper);
4573
4575}
4576
4577static HRESULT WINAPI ddraw_surface2_GetClipper(IDirectDrawSurface2 *iface, IDirectDrawClipper **clipper)
4578{
4579 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
4580
4581 TRACE("iface %p, clipper %p.\n", iface, clipper);
4582
4584}
4585
4586static HRESULT WINAPI ddraw_surface1_GetClipper(IDirectDrawSurface *iface, IDirectDrawClipper **clipper)
4587{
4588 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
4589
4590 TRACE("iface %p, clipper %p.\n", iface, clipper);
4591
4593}
4594
4595/*****************************************************************************
4596 * IDirectDrawSurface7::SetClipper
4597 *
4598 * Sets a clipper for the surface
4599 *
4600 * Params:
4601 * Clipper: IDirectDrawClipper interface of the clipper to set
4602 *
4603 * Returns:
4604 * DD_OK on success
4605 *
4606 *****************************************************************************/
4608 IDirectDrawClipper *iclipper)
4609{
4611 struct ddraw_clipper *clipper = unsafe_impl_from_IDirectDrawClipper(iclipper);
4612 struct ddraw_clipper *old_clipper = This->clipper;
4613 HWND clipWindow;
4614
4615 TRACE("iface %p, clipper %p.\n", iface, iclipper);
4616
4618 if (clipper == This->clipper)
4619 {
4621 return DD_OK;
4622 }
4623
4624 This->clipper = clipper;
4625
4626 if (clipper != NULL)
4627 IDirectDrawClipper_AddRef(iclipper);
4628 if (old_clipper && ddraw_clipper_is_valid(old_clipper))
4629 IDirectDrawClipper_Release(&old_clipper->IDirectDrawClipper_iface);
4630
4631 if ((This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && This->ddraw->wined3d_swapchain)
4632 {
4633 clipWindow = NULL;
4634 if(clipper) {
4635 IDirectDrawClipper_GetHWnd(iclipper, &clipWindow);
4636 }
4637
4638 if (clipWindow)
4639 {
4640 wined3d_swapchain_set_window(This->ddraw->wined3d_swapchain, clipWindow);
4641 ddraw_set_swapchain_window(This->ddraw, clipWindow);
4642 }
4643 else
4644 {
4645 wined3d_swapchain_set_window(This->ddraw->wined3d_swapchain, This->ddraw->d3d_window);
4646 ddraw_set_swapchain_window(This->ddraw, This->ddraw->dest_window);
4647 }
4648 }
4649
4651
4652 return DD_OK;
4653}
4654
4655static HRESULT WINAPI ddraw_surface4_SetClipper(IDirectDrawSurface4 *iface, IDirectDrawClipper *clipper)
4656{
4657 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
4658
4659 TRACE("iface %p, clipper %p.\n", iface, clipper);
4660
4662}
4663
4664static HRESULT WINAPI ddraw_surface3_SetClipper(IDirectDrawSurface3 *iface, IDirectDrawClipper *clipper)
4665{
4666 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
4667
4668 TRACE("iface %p, clipper %p.\n", iface, clipper);
4669
4671}
4672
4673static HRESULT WINAPI ddraw_surface2_SetClipper(IDirectDrawSurface2 *iface, IDirectDrawClipper *clipper)
4674{
4675 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
4676
4677 TRACE("iface %p, clipper %p.\n", iface, clipper);
4678
4680}
4681
4682static HRESULT WINAPI ddraw_surface1_SetClipper(IDirectDrawSurface *iface, IDirectDrawClipper *clipper)
4683{
4684 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
4685
4686 TRACE("iface %p, clipper %p.\n", iface, clipper);
4687
4689}
4690
4693{
4694 struct d3d_device *device;
4695 HRESULT hr;
4696
4698 if (surface->draw_texture && SUCCEEDED(hr))
4700
4701 LIST_FOR_EACH_ENTRY(device, &surface->ddraw->d3ddevice_list, struct d3d_device, ddraw_entry)
4702 {
4704 if (surface->draw_texture)
4706 }
4707
4708 return hr;
4709}
4710
4712{
4713 const DDSURFACEDESC2 *desc = &surface->surface_desc;
4714
4715 if (desc->dwFlags & DDSD_CKDESTOVERLAY)
4717 (struct wined3d_color_key *)&desc->ddckCKDestOverlay);
4718 if (desc->dwFlags & DDSD_CKDESTBLT)
4720 (struct wined3d_color_key *)&desc->ddckCKDestBlt);
4721 if (desc->dwFlags & DDSD_CKSRCOVERLAY)
4723 (struct wined3d_color_key *)&desc->ddckCKSrcOverlay);
4724 if (desc->dwFlags & DDSD_CKSRCBLT)
4726 (struct wined3d_color_key *)&desc->ddckCKSrcBlt);
4727}
4728
4730{
4731 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
4732 enum wined3d_format_id current_format_id, format_id;
4733 HRESULT hr;
4734 const DWORD allowed_flags = DDSD_LPSURFACE | DDSD_PIXELFORMAT | DDSD_WIDTH
4736 UINT pitch, width, height;
4737
4738 TRACE("iface %p, surface_desc %p, flags %#lx.\n", iface, DDSD, Flags);
4739
4740 if (!DDSD)
4741 {
4742 WARN("DDSD is NULL, returning DDERR_INVALIDPARAMS\n");
4743 return DDERR_INVALIDPARAMS;
4744 }
4745 if (Flags)
4746 {
4747 WARN("Flags is %lx, returning DDERR_INVALIDPARAMS\n", Flags);
4748 return DDERR_INVALIDPARAMS;
4749 }
4753 {
4754 WARN("Surface is not in system memory, returning DDERR_INVALIDSURFACETYPE.\n");
4756 }
4757
4758 if (DDSD->dwFlags & ~allowed_flags)
4759 {
4760 WARN("Invalid flags %#lx set, returning DDERR_INVALIDPARAMS\n", DDSD->dwFlags);
4761 return DDERR_INVALIDPARAMS;
4762 }
4763 if (!(DDSD->dwFlags & DDSD_LPSURFACE) || !DDSD->lpSurface)
4764 {
4765 WARN("DDSD_LPSURFACE is not set or lpSurface is NULL, returning DDERR_INVALIDPARAMS\n");
4766 return DDERR_INVALIDPARAMS;
4767 }
4768 if ((DDSD->dwFlags & DDSD_CAPS) && DDSD->ddsCaps.dwCaps)
4769 {
4770 WARN("DDSD_CAPS is set, returning DDERR_INVALIDCAPS.\n");
4771 return DDERR_INVALIDCAPS;
4772 }
4773 if (DDSD->dwFlags & DDSD_WIDTH)
4774 {
4775 if (!(DDSD->dwFlags & DDSD_PITCH))
4776 {
4777 WARN("DDSD_WIDTH is set, but DDSD_PITCH is not, returning DDERR_INVALIDPARAMS.\n");
4778 return DDERR_INVALIDPARAMS;
4779 }
4780 if (!DDSD->dwWidth || DDSD->lPitch <= 0 || DDSD->lPitch & 0x3)
4781 {
4782 WARN("Pitch is %ld, width is %lu, returning DDERR_INVALIDPARAMS.\n",
4783 DDSD->lPitch, DDSD->dwWidth);
4784 return DDERR_INVALIDPARAMS;
4785 }
4786 if (DDSD->dwWidth != surface->surface_desc.dwWidth)
4787 TRACE("Surface width changed from %lu to %lu.\n", surface->surface_desc.dwWidth, DDSD->dwWidth);
4788 if (DDSD->lPitch != surface->surface_desc.lPitch)
4789 TRACE("Surface pitch changed from %lu to %lu.\n", surface->surface_desc.lPitch, DDSD->lPitch);
4790 pitch = DDSD->lPitch;
4791 width = DDSD->dwWidth;
4792 }
4793 else if (DDSD->dwFlags & DDSD_PITCH)
4794 {
4795 WARN("DDSD_PITCH is set, but DDSD_WIDTH is not, returning DDERR_INVALIDPARAMS.\n");
4796 return DDERR_INVALIDPARAMS;
4797 }
4798 else
4799 {
4800 pitch = surface->surface_desc.lPitch;
4801 width = surface->surface_desc.dwWidth;
4802 }
4803
4804 if (DDSD->dwFlags & DDSD_HEIGHT)
4805 {
4806 if (!DDSD->dwHeight)
4807 {
4808 WARN("Height is 0, returning DDERR_INVALIDPARAMS.\n");
4809 return DDERR_INVALIDPARAMS;
4810 }
4811 if (DDSD->dwHeight != surface->surface_desc.dwHeight)
4812 TRACE("Surface height changed from %lu to %lu.\n", surface->surface_desc.dwHeight, DDSD->dwHeight);
4813 height = DDSD->dwHeight;
4814 }
4815 else
4816 {
4817 height = surface->surface_desc.dwHeight;
4818 }
4819
4821 if (DDSD->dwFlags & DDSD_PIXELFORMAT)
4822 {
4824
4826 {
4827 ERR("Requested to set an unknown pixelformat\n");
4829 return DDERR_INVALIDPARAMS;
4830 }
4831 current_format_id = wined3dformat_from_ddrawformat(&surface->surface_desc.ddpfPixelFormat);
4832 if (format_id != current_format_id)
4833 TRACE("Surface format changed from %#x to %#x.\n", current_format_id, format_id);
4834 }
4835 else
4836 {
4838 }
4839
4840 if (width == surface->surface_desc.dwWidth && height == surface->surface_desc.dwHeight
4841 && format_id == current_format_id)
4842 {
4843 /* Updating memory only. */
4844
4846 surface->sub_resource_idx, DDSD->lpSurface, pitch)))
4847 {
4848 WARN("Failed to update surface desc, hr %#lx.\n", hr);
4850 return hr_ddraw_from_wined3d(hr);
4851 }
4852 }
4853 else
4854 {
4856 struct wined3d_rendertarget_view *old_rtv = surface->wined3d_rtv;
4857 struct wined3d_texture *old_draw_texture = surface->draw_texture;
4858 struct wined3d_texture *old_texture = surface->wined3d_texture;
4859 struct wined3d_texture *new_texture, *new_draw_texture = NULL;
4860 struct wined3d_resource_desc wined3d_desc;
4861 struct ddraw *ddraw = surface->ddraw;
4862
4863 /* Updating surface attributes; recreate the texture. */
4864
4865 if (wined3d_texture_get_level_count(old_texture) > 1
4867 {
4868 FIXME("Texture has multiple sub-resources, not supported.\n");
4870 return DDERR_INVALIDPARAMS;
4871 }
4872
4873 /* Create the new textures. */
4874
4875 wined3d_resource_get_desc(wined3d_texture_get_resource(old_texture), &wined3d_desc);
4876
4877 wined3d_desc.width = width;
4878 wined3d_desc.height = height;
4879 wined3d_desc.format = format_id;
4880
4881 if (FAILED(hr = wined3d_texture_create(ddraw->wined3d_device, &wined3d_desc, 1, 1,
4883 {
4884 ERR("Failed to create texture, hr %#lx.\n", hr);
4886 return hr_ddraw_from_wined3d(hr);
4887 }
4888
4889 if (FAILED(hr = wined3d_texture_update_desc(new_texture, 0, DDSD->lpSurface, pitch)))
4890 {
4891 ERR("Failed to set user memory, hr %#lx.\n", hr);
4892 wined3d_texture_decref(new_texture);
4894 return hr_ddraw_from_wined3d(hr);
4895 }
4896
4897 if (old_draw_texture)
4898 {
4899 wined3d_resource_get_desc(wined3d_texture_get_resource(old_draw_texture), &wined3d_desc);
4900
4901 wined3d_desc.width = width;
4902 wined3d_desc.height = height;
4903 wined3d_desc.format = format_id;
4904
4905 if (FAILED(hr = wined3d_texture_create(ddraw->wined3d_device, &wined3d_desc, 1, 1,
4906 0, NULL, NULL, &ddraw_null_wined3d_parent_ops, &new_draw_texture)))
4907 {
4908 ERR("Failed to create draw texture, hr %#lx.\n", hr);
4909 wined3d_texture_decref(new_texture);
4911 return hr_ddraw_from_wined3d(hr);
4912 }
4913 }
4914
4918
4919 if (surface->draw_texture)
4920 {
4924
4929
4932
4933 wined3d_texture_decref(old_draw_texture);
4934 }
4935 else
4936 {
4939
4941 }
4942
4943 surface->wined3d_texture = new_texture;
4944 surface->draw_texture = new_draw_texture;
4945
4946 wined3d_texture_decref(old_texture);
4947
4948 /* Don't try to replace existing bound textures. Testing implies that
4949 * SetSurfaceDesc() doesn't quite work with texture surfaces anyway:
4950 * it succeeds, and mapping the surface does return the new user memory,
4951 * but drawing from the surface doesn't actually sample from that
4952 * memory. */
4953
4954 /* Destroy the existing RTV. */
4955
4956 if (old_rtv)
4957 {
4958 struct wined3d_rendertarget_view *current_rtv, *new_rtv;
4959
4960 surface->wined3d_rtv = NULL;
4961
4963 if (old_rtv == current_rtv)
4964 {
4965 new_rtv = ddraw_surface_get_rendertarget_view(surface);
4967 }
4968
4971 }
4972
4974
4975 /* No need to sync the LOD or overlays; neither can be set on sysmem
4976 * surfaces, and SetSurfaceDesc() can only be used on sysmem surfaces.
4977 *
4978 * No need to sync the palette either, since wined3d doesn't track it
4979 * except on primary surfaces, and SetSurfaceDesc() is illegal on those
4980 * too. */
4981 }
4982
4983 if (DDSD->dwFlags & DDSD_WIDTH)
4984 surface->surface_desc.dwWidth = width;
4985 if (DDSD->dwFlags & DDSD_PITCH)
4986 surface->surface_desc.lPitch = DDSD->lPitch;
4987 if (DDSD->dwFlags & DDSD_HEIGHT)
4988 surface->surface_desc.dwHeight = height;
4989 if (DDSD->dwFlags & DDSD_PIXELFORMAT)
4991
4993
4994 return DD_OK;
4995}
4996
4997static HRESULT WINAPI ddraw_surface4_SetSurfaceDesc(IDirectDrawSurface4 *iface,
4998 DDSURFACEDESC2 *surface_desc, DWORD flags)
4999{
5000 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
5001
5002 TRACE("iface %p, surface_desc %p, flags %#lx.\n", iface, surface_desc, flags);
5003
5006}
5007
5008static HRESULT WINAPI ddraw_surface3_SetSurfaceDesc(IDirectDrawSurface3 *iface,
5010{
5011 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
5012 DDSURFACEDESC2 surface_desc2;
5013
5014 TRACE("iface %p, surface_desc %p, flags %#lx.\n", iface, surface_desc, flags);
5015
5016 if (surface_desc) DDSD_to_DDSD2(surface_desc, &surface_desc2);
5018 surface_desc ? &surface_desc2 : NULL, flags);
5019}
5020
5022{
5023 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
5024 struct ddraw_palette *palette_impl;
5025 HRESULT hr = DD_OK;
5026
5027 TRACE("iface %p, palette %p.\n", iface, palette);
5028
5029 if (!palette)
5030 return DDERR_INVALIDPARAMS;
5031 if (ddraw_surface_is_lost(surface))
5032 {
5033 WARN("Surface lost, returning DDERR_SURFACELOST.\n");
5034 return DDERR_SURFACELOST;
5035 }
5036
5038 if ((palette_impl = surface->palette))
5039 {
5040 *palette = &palette_impl->IDirectDrawPalette_iface;
5041 IDirectDrawPalette_AddRef(*palette);
5042 }
5043 else
5044 {
5045 *palette = NULL;
5047 }
5049
5050 return hr;
5051}
5052
5053static HRESULT WINAPI ddraw_surface4_GetPalette(IDirectDrawSurface4 *iface, IDirectDrawPalette **palette)
5054{
5055 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
5056
5057 TRACE("iface %p, palette %p.\n", iface, palette);
5058
5060}
5061
5062static HRESULT WINAPI ddraw_surface3_GetPalette(IDirectDrawSurface3 *iface, IDirectDrawPalette **palette)
5063{
5064 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
5065
5066 TRACE("iface %p, palette %p.\n", iface, palette);
5067
5069}
5070
5071static HRESULT WINAPI ddraw_surface2_GetPalette(IDirectDrawSurface2 *iface, IDirectDrawPalette **palette)
5072{
5073 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
5074
5075 TRACE("iface %p, palette %p.\n", iface, palette);
5076
5078}
5079
5080static HRESULT WINAPI ddraw_surface1_GetPalette(IDirectDrawSurface *iface, IDirectDrawPalette **palette)
5081{
5082 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
5083
5084 TRACE("iface %p, palette %p.\n", iface, palette);
5085
5087}
5088
5090{
5091 DDCOLORKEY fixed_color_key;
5093
5095 {
5096 if (color_key && color_key->dwColorSpaceLowValue != color_key->dwColorSpaceHighValue)
5097 {
5098 WARN("Range color keys are not supported, returning DDERR_NOCOLORKEYHW.\n");
5099 return DDERR_NOCOLORKEYHW;
5100 }
5101 flags &= ~DDCKEY_COLORSPACE;
5102 }
5103
5105
5106 if (color_key)
5107 {
5108 fixed_color_key.dwColorSpaceLowValue = fixed_color_key.dwColorSpaceHighValue = color_key->dwColorSpaceLowValue;
5109 switch (flags & ~DDCKEY_COLORSPACE)
5110 {
5111 case DDCKEY_DESTBLT:
5112 surface->surface_desc.ddckCKDestBlt = fixed_color_key;
5114 break;
5115
5116 case DDCKEY_DESTOVERLAY:
5117 surface->surface_desc.ddckCKDestOverlay = fixed_color_key;
5119 break;
5120
5121 case DDCKEY_SRCOVERLAY:
5122 surface->surface_desc.ddckCKSrcOverlay = fixed_color_key;
5124 break;
5125
5126 case DDCKEY_SRCBLT:
5127 surface->surface_desc.ddckCKSrcBlt = fixed_color_key;
5129 break;
5130
5131 default:
5133 return DDERR_INVALIDPARAMS;
5134 }
5135 }
5136 else
5137 {
5138 switch (flags & ~DDCKEY_COLORSPACE)
5139 {
5140 case DDCKEY_DESTBLT:
5141 surface->surface_desc.dwFlags &= ~DDSD_CKDESTBLT;
5142 break;
5143
5144 case DDCKEY_DESTOVERLAY:
5145 surface->surface_desc.dwFlags &= ~DDSD_CKDESTOVERLAY;
5146 break;
5147
5148 case DDCKEY_SRCOVERLAY:
5149 surface->surface_desc.dwFlags &= ~DDSD_CKSRCOVERLAY;
5150 break;
5151
5152 case DDCKEY_SRCBLT:
5153 surface->surface_desc.dwFlags &= ~DDSD_CKSRCBLT;
5154 break;
5155
5156 default:
5158 return DDERR_INVALIDPARAMS;
5159 }
5160 }
5161
5162 if (surface->is_root)
5164 color_key ? (struct wined3d_color_key *)&fixed_color_key : NULL);
5165
5167
5168 return hr_ddraw_from_wined3d(hr);
5169}
5170
5172{
5173 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
5174
5175 TRACE("iface %p, flags %#lx, color_key %p.\n", iface, flags, color_key);
5176
5179
5181}
5182
5184{
5185 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
5186
5187 TRACE("iface %p, flags %#lx, color_key %p.\n", iface, flags, color_key);
5188
5190}
5191
5193{
5194 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
5195
5196 TRACE("iface %p, flags %#lx, color_key %p.\n", iface, flags, color_key);
5197
5199}
5200
5202{
5203 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
5204
5205 TRACE("iface %p, flags %#lx, color_key %p.\n", iface, flags, color_key);
5206
5208}
5209
5211{
5212 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
5213
5214 TRACE("iface %p, flags %#lx, color_key %p.\n", iface, flags, color_key);
5215
5217}
5218
5220{
5221 struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
5222
5223 TRACE("iface %p, palette %p.\n", iface, palette);
5224
5227 if (ddraw_surface_is_lost(surface))
5228 {
5229 WARN("Surface lost, returning DDERR_SURFACELOST.\n");
5230 return DDERR_SURFACELOST;
5231 }
5232
5233 return ddraw_surface_set_palette(surface, palette);
5234}
5235
5236static HRESULT WINAPI ddraw_surface4_SetPalette(IDirectDrawSurface4 *iface, IDirectDrawPalette *palette)
5237{
5238 struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
5239
5240 TRACE("iface %p, palette %p.\n", iface, palette);
5241
5242 if (ddraw_surface_is_lost(surface))
5243 {
5244 WARN("Surface lost, returning DDERR_SURFACELOST.\n");
5245 return DDERR_SURFACELOST;
5246 }
5247
5248 return ddraw_surface_set_palette(surface, palette);
5249}
5250
5251static HRESULT WINAPI ddraw_surface3_SetPalette(IDirectDrawSurface3 *iface, IDirectDrawPalette *palette)
5252{
5253 struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
5254
5255 TRACE("iface %p, palette %p.\n", iface, palette);
5256
5257 if (ddraw_surface_is_lost(surface))
5258 {
5259 WARN("Surface lost, returning DDERR_SURFACELOST.\n");
5260 return DDERR_SURFACELOST;
5261 }
5262
5263 return ddraw_surface_set_palette(surface, palette);
5264}
5265
5266static HRESULT WINAPI ddraw_surface2_SetPalette(IDirectDrawSurface2 *iface, IDirectDrawPalette *palette)
5267{
5268 struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
5269
5270 TRACE("iface %p, palette %p.\n", iface, palette);
5271
5272 if (ddraw_surface_is_lost(surface))
5273 {
5274 WARN("Surface lost, returning DDERR_SURFACELOST.\n");
5275 return DDERR_SURFACELOST;
5276 }
5277
5278 return ddraw_surface_set_palette(surface, palette);
5279}
5280
5281static HRESULT WINAPI ddraw_surface1_SetPalette(IDirectDrawSurface *iface, IDirectDrawPalette *palette)
5282{
5283 struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
5284
5285 TRACE("iface %p, palette %p.\n", iface, palette);
5286
5287 if (ddraw_surface_is_lost(surface))
5288 {
5289 WARN("Surface lost, returning DDERR_SURFACELOST.\n");
5290 return DDERR_SURFACELOST;
5291 }
5292
5293 return ddraw_surface_set_palette(surface, palette);
5294}
5295
5296/**********************************************************
5297 * IDirectDrawGammaControl::GetGammaRamp
5298 *
5299 * Returns the current gamma ramp for a surface
5300 *
5301 * Params:
5302 * flags: Ignored
5303 * gamma_ramp: Address to write the ramp to
5304 *
5305 * Returns:
5306 * DD_OK on success
5307 * DDERR_INVALIDPARAMS if gamma_ramp is NULL
5308 *
5309 **********************************************************/
5310static HRESULT WINAPI ddraw_gamma_control_GetGammaRamp(IDirectDrawGammaControl *iface,
5311 DWORD flags, DDGAMMARAMP *gamma_ramp)
5312{
5313 struct ddraw_surface *surface = impl_from_IDirectDrawGammaControl(iface);
5314
5315 TRACE("iface %p, flags %#lx, gamma_ramp %p.\n", iface, flags, gamma_ramp);
5316
5317 if (!gamma_ramp)
5318 {
5319 WARN("Invalid gamma_ramp passed.\n");
5320 return DDERR_INVALIDPARAMS;
5321 }
5322
5325 {
5326 /* Note: DDGAMMARAMP is compatible with struct wined3d_gamma_ramp. */
5327 wined3d_device_get_gamma_ramp(surface->ddraw->wined3d_device, 0, (struct wined3d_gamma_ramp *)gamma_ramp);
5328 }
5329 else
5330 {
5331 ERR("Not implemented for non-primary surfaces.\n");
5332 }
5334
5335 return DD_OK;
5336}
5337
5338/**********************************************************
5339 * IDirectDrawGammaControl::SetGammaRamp
5340 *
5341 * Sets the red, green and blue gamma ramps for
5342 *
5343 * Params:
5344 * flags: Can be DDSGR_CALIBRATE to request calibration
5345 * gamma_ramp: Structure containing the new gamma ramp
5346 *
5347 * Returns:
5348 * DD_OK on success
5349 * DDERR_INVALIDPARAMS if gamma_ramp is NULL
5350 *
5351 **********************************************************/
5352static HRESULT WINAPI ddraw_gamma_control_SetGammaRamp(IDirectDrawGammaControl *iface,
5353 DWORD flags, DDGAMMARAMP *gamma_ramp)
5354{
5355 struct ddraw_surface *surface = impl_from_IDirectDrawGammaControl(iface);
5356
5357 TRACE("iface %p, flags %#lx, gamma_ramp %p.\n", iface, flags, gamma_ramp);
5358
5359 if (!gamma_ramp)
5360 {
5361 WARN("Invalid gamma_ramp passed.\n");
5362 return DDERR_INVALIDPARAMS;
5363 }
5364
5367 {
5368 /* Note: DDGAMMARAMP is compatible with struct wined3d_gamma_ramp. */
5369 wined3d_device_set_gamma_ramp(surface->ddraw->wined3d_device,
5370 0, flags, (struct wined3d_gamma_ramp *)gamma_ramp);
5371 }
5372 else
5373 {
5374 ERR("Not implemented for non-primary surfaces.\n");
5375 }
5377
5378 return DD_OK;
5379}
5380
5381/*****************************************************************************
5382 * IDirect3DTexture2::PaletteChanged
5383 *
5384 * Informs the texture about a palette change
5385 *
5386 * Params:
5387 * start: Start index of the change
5388 * count: The number of changed entries
5389 *
5390 * Returns
5391 * D3D_OK, because it's a stub
5392 *
5393 *****************************************************************************/
5395{
5396 FIXME("iface %p, start %lu, count %lu stub!\n", iface, start, count);
5397
5398 return D3D_OK;
5399}
5400
5402{
5403 struct ddraw_surface *surface = impl_from_IDirect3DTexture(iface);
5404
5405 TRACE("iface %p, start %lu, count %lu.\n", iface, start, count);
5406
5408}
5409
5410/*****************************************************************************
5411 * IDirect3DTexture::Unload
5412 *
5413 * DX5 SDK: "The IDirect3DTexture2::Unload method is not implemented
5414 *
5415 *
5416 * Returns:
5417 * DDERR_UNSUPPORTED
5418 *
5419 *****************************************************************************/
5420static HRESULT WINAPI d3d_texture1_Unload(IDirect3DTexture *iface)
5421{
5422 WARN("iface %p. Not implemented.\n", iface);
5423
5424 return DDERR_UNSUPPORTED;
5425}
5426
5427/*****************************************************************************
5428 * IDirect3DTexture2::GetHandle
5429 *
5430 * Returns handle for the texture.
5431 *
5432 * Params:
5433 * device: Device this handle is assigned to
5434 * handle: Address to store the handle at.
5435 *
5436 * Returns:
5437 * D3D_OK
5438 *
5439 *****************************************************************************/
5440static HRESULT WINAPI d3d_texture2_GetHandle(IDirect3DTexture2 *iface,
5441 IDirect3DDevice2 *device, D3DTEXTUREHANDLE *handle)
5442{
5443 struct ddraw_surface *surface = impl_from_IDirect3DTexture2(iface);
5444
5445 TRACE("iface %p, device %p, handle %p.\n", iface, device, handle);
5446
5448
5449 if (!surface->Handle)
5450 {
5452 if (h == DDRAW_INVALID_HANDLE)
5453 {
5454 ERR("Failed to allocate a texture handle.\n");
5456 return DDERR_OUTOFMEMORY;
5457 }
5458
5459 surface->Handle = h + 1;
5460 }
5461
5462 TRACE("Returning handle %08lx.\n", surface->Handle);
5463 *handle = surface->Handle;
5464
5466
5467 return D3D_OK;
5468}
5469
5470static HRESULT WINAPI d3d_texture1_GetHandle(IDirect3DTexture *iface,
5471 IDirect3DDevice *device, D3DTEXTUREHANDLE *handle)
5472{
5473 struct ddraw_surface *surface = impl_from_IDirect3DTexture(iface);
5474 struct d3d_device *device_impl = unsafe_impl_from_IDirect3DDevice(device);
5475
5476 TRACE("iface %p, device %p, handle %p.\n", iface, device, handle);
5477
5479 device_impl ? &device_impl->IDirect3DDevice2_iface : NULL, handle);
5480}
5481
5482/*****************************************************************************
5483 * get_sub_mimaplevel
5484 *
5485 * Helper function that returns the next mipmap level
5486 *
5487 * tex_ptr: Surface of which to return the next level
5488 *
5489 *****************************************************************************/
5490static struct ddraw_surface *get_sub_mimaplevel(struct ddraw_surface *surface)
5491{
5492 /* Now go down the mipmap chain to the next surface */
5493 static DDSCAPS2 mipmap_caps = { DDSCAPS_MIPMAP | DDSCAPS_TEXTURE, 0, 0, {0} };
5494 IDirectDrawSurface7 *next_level;
5495 HRESULT hr;
5496
5497 hr = ddraw_surface7_GetAttachedSurface(&surface->IDirectDrawSurface7_iface, &mipmap_caps, &next_level);
5498 if (FAILED(hr)) return NULL;
5499
5500 ddraw_surface7_Release(next_level);
5501
5502 return impl_from_IDirectDrawSurface7(next_level);
5503}
5504
5505/*****************************************************************************
5506 * IDirect3DTexture2::Load
5507 *
5508 * Loads a texture created with the DDSCAPS_ALLOCONLOAD
5509 *
5510 * This function isn't relayed to WineD3D because the whole interface is
5511 * implemented in DDraw only. For speed improvements an implementation which
5512 * takes OpenGL more into account could be placed into WineD3D.
5513 *
5514 * Params:
5515 * src_texture: Address of the texture to load
5516 *
5517 * Returns:
5518 * D3D_OK on success
5519 * D3DERR_TEXTURE_LOAD_FAILED.
5520 *
5521 *****************************************************************************/
5522static HRESULT WINAPI d3d_texture2_Load(IDirect3DTexture2 *iface, IDirect3DTexture2 *src_texture)
5523{
5524 struct ddraw_surface *dst_surface = impl_from_IDirect3DTexture2(iface);
5525 struct ddraw_surface *src_surface = unsafe_impl_from_IDirect3DTexture2(src_texture);
5526 struct wined3d_resource *dst_resource, *src_resource;
5527 HRESULT hr;
5528
5529 TRACE("iface %p, src_texture %p.\n", iface, src_texture);
5530
5531 if (src_surface == dst_surface)
5532 {
5533 TRACE("copying surface %p to surface %p, why?\n", src_surface, dst_surface);
5534 return D3D_OK;
5535 }
5536
5538
5541
5542 if (((src_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)
5543 != (dst_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP))
5544 || (src_surface->surface_desc.dwMipMapCount != dst_surface->surface_desc.dwMipMapCount))
5545 {
5546 ERR("Trying to load surfaces with different mip-map counts.\n");
5547 }
5548
5549 for (;;)
5550 {
5551 struct ddraw_palette *dst_pal, *src_pal;
5552 DDSURFACEDESC *src_desc, *dst_desc;
5553
5554 TRACE("Copying surface %p to surface %p.\n", src_surface, dst_surface);
5555
5556 /* Suppress the ALLOCONLOAD flag */
5557 dst_surface->surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_ALLOCONLOAD;
5558
5559 /* Get the palettes */
5560 dst_pal = dst_surface->palette;
5561 src_pal = src_surface->palette;
5562
5563 if (src_pal)
5564 {
5565 PALETTEENTRY palent[256];
5566
5567 if (!dst_pal)
5568 {
5571 }
5572 IDirectDrawPalette_GetEntries(&src_pal->IDirectDrawPalette_iface, 0, 0, 256, palent);
5573 IDirectDrawPalette_SetEntries(&dst_pal->IDirectDrawPalette_iface, 0, 0, 256, palent);
5574 }
5575
5576 /* Copy one surface on the other */
5577 dst_desc = (DDSURFACEDESC *)&(dst_surface->surface_desc);
5578 src_desc = (DDSURFACEDESC *)&(src_surface->surface_desc);
5579
5580 if ((src_desc->dwWidth != dst_desc->dwWidth) || (src_desc->dwHeight != dst_desc->dwHeight))
5581 {
5582 /* Should also check for same pixel format, lPitch, ... */
5583 ERR("Error in surface sizes.\n");
5586 }
5587 else
5588 {
5589 struct wined3d_map_desc src_map_desc, dst_map_desc;
5590
5591 /* Copy the src blit color key if the source has one, don't erase
5592 * the destination's ckey if the source has none */
5593 if (src_desc->dwFlags & DDSD_CKSRCBLT)
5594 {
5595 IDirectDrawSurface7_SetColorKey(&dst_surface->IDirectDrawSurface7_iface,
5596 DDCKEY_SRCBLT, &src_desc->ddckCKSrcBlt);
5597 }
5598
5599 if (FAILED(hr = wined3d_resource_map(src_resource,
5600 src_surface->sub_resource_idx, &src_map_desc, NULL, WINED3D_MAP_READ)))
5601 {
5602 ERR("Failed to lock source surface, hr %#lx.\n", hr);
5605 }
5606
5607 if (FAILED(hr = wined3d_resource_map(dst_resource,
5608 dst_surface->sub_resource_idx, &dst_map_desc, NULL, WINED3D_MAP_WRITE)))
5609 {
5610 ERR("Failed to lock destination surface, hr %#lx.\n", hr);
5611 wined3d_resource_unmap(src_resource, src_surface->sub_resource_idx);
5614 }
5615
5617 memcpy(dst_map_desc.data, src_map_desc.data, src_surface->surface_desc.dwLinearSize);
5618 else
5619 memcpy(dst_map_desc.data, src_map_desc.data, src_map_desc.row_pitch * src_desc->dwHeight);
5620
5621 wined3d_resource_unmap(dst_resource, dst_surface->sub_resource_idx);
5622 wined3d_resource_unmap(src_resource, src_surface->sub_resource_idx);
5623 }
5624
5625 if (src_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)
5626 src_surface = get_sub_mimaplevel(src_surface);
5627 else
5628 src_surface = NULL;
5629
5630 if (dst_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)
5631 dst_surface = get_sub_mimaplevel(dst_surface);
5632 else
5633 dst_surface = NULL;
5634
5635 if (!src_surface || !dst_surface)
5636 {
5637 if (src_surface != dst_surface)
5638 ERR("Loading surface with different mipmap structure.\n");
5639 break;
5640 }
5641 }
5642
5644
5645 return hr;
5646}
5647
5648static HRESULT WINAPI d3d_texture1_Load(IDirect3DTexture *iface, IDirect3DTexture *src_texture)
5649{
5650 struct ddraw_surface *dst_surface = impl_from_IDirect3DTexture(iface);
5651 struct ddraw_surface *src_surface = unsafe_impl_from_IDirect3DTexture(src_texture);
5652
5653 TRACE("iface %p, src_texture %p.\n", iface, src_texture);
5654
5655 return d3d_texture2_Load(&dst_surface->IDirect3DTexture2_iface,
5656 src_surface ? &src_surface->IDirect3DTexture2_iface : NULL);
5657}
5658
5659/*****************************************************************************
5660 * The VTable
5661 *****************************************************************************/
5662
5663/* Some windowed mode wrappers expect this vtbl to be writable. */
5664static struct IDirectDrawSurface7Vtbl ddraw_surface7_vtbl =
5665{
5666 /* IUnknown */
5670 /* IDirectDrawSurface */
5704 /* IDirectDrawSurface2 */
5708 /* IDirectDrawSurface3 */
5710 /* IDirectDrawSurface4 */
5716 /* IDirectDrawSurface7 */
5721};
5722
5723/* Some windowed mode wrappers expect this vtbl to be writable. */
5724static struct IDirectDrawSurface4Vtbl ddraw_surface4_vtbl =
5725{
5726 /* IUnknown */
5730 /* IDirectDrawSurface */
5764 /* IDirectDrawSurface2 */
5768 /* IDirectDrawSurface3 */
5770 /* IDirectDrawSurface4 */
5776};
5777
5778/* Some windowed mode wrappers expect this vtbl to be writable. */
5779static struct IDirectDrawSurface3Vtbl ddraw_surface3_vtbl =
5780{
5781 /* IUnknown */
5785 /* IDirectDrawSurface */
5819 /* IDirectDrawSurface2 */
5823 /* IDirectDrawSurface3 */
5825};
5826
5827/* Some windowed mode wrappers expect this vtbl to be writable. */
5828static struct IDirectDrawSurface2Vtbl ddraw_surface2_vtbl =
5829{
5830 /* IUnknown */
5834 /* IDirectDrawSurface */
5868 /* IDirectDrawSurface2 */
5872};
5873
5874/* Bad Mojo Redux expects this vtbl to be writable. */
5875static struct IDirectDrawSurfaceVtbl ddraw_surface1_vtbl =
5876{
5877 /* IUnknown */
5881 /* IDirectDrawSurface */
5915};
5916
5917static const struct IDirectDrawGammaControlVtbl ddraw_gamma_control_vtbl =
5918{
5924};
5925
5926static const struct IDirect3DTexture2Vtbl d3d_texture2_vtbl =
5927{
5934};
5935
5936static const struct IDirect3DTextureVtbl d3d_texture1_vtbl =
5937{
5946};
5947
5948/* Some games (e.g. Tomb Raider 3) pass the wrong version of the
5949 * IDirectDrawSurface interface to ddraw methods. */
5951{
5952 if (!iface) return NULL;
5953 if (iface->lpVtbl != &ddraw_surface7_vtbl)
5954 {
5955 HRESULT hr = IDirectDrawSurface7_QueryInterface(iface, &IID_IDirectDrawSurface7, (void **)&iface);
5956 if (FAILED(hr))
5957 {
5958 WARN("Object %p doesn't expose interface IDirectDrawSurface7.\n", iface);
5959 return NULL;
5960 }
5961 IDirectDrawSurface7_Release(iface);
5962 }
5964}
5965
5966struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface4(IDirectDrawSurface4 *iface)
5967{
5968 if (!iface) return NULL;
5969 if (iface->lpVtbl != &ddraw_surface4_vtbl)
5970 {
5971 HRESULT hr = IDirectDrawSurface4_QueryInterface(iface, &IID_IDirectDrawSurface4, (void **)&iface);
5972 if (FAILED(hr))
5973 {
5974 WARN("Object %p doesn't expose interface IDirectDrawSurface4.\n", iface);
5975 return NULL;
5976 }
5977 IDirectDrawSurface4_Release(iface);
5978 }
5980}
5981
5982static struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface)
5983{
5984 if (!iface) return NULL;
5985 if (iface->lpVtbl != &ddraw_surface3_vtbl)
5986 {
5987 HRESULT hr = IDirectDrawSurface3_QueryInterface(iface, &IID_IDirectDrawSurface3, (void **)&iface);
5988 if (FAILED(hr))
5989 {
5990 WARN("Object %p doesn't expose interface IDirectDrawSurface3.\n", iface);
5991 return NULL;
5992 }
5993 IDirectDrawSurface3_Release(iface);
5994 }
5996}
5997
5998static struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface2(IDirectDrawSurface2 *iface)
5999{
6000 if (!iface) return NULL;
6001 if (iface->lpVtbl != &ddraw_surface2_vtbl)
6002 {
6003 HRESULT hr = IDirectDrawSurface2_QueryInterface(iface, &IID_IDirectDrawSurface2, (void **)&iface);
6004 if (FAILED(hr))
6005 {
6006 WARN("Object %p doesn't expose interface IDirectDrawSurface2.\n", iface);
6007 return NULL;
6008 }
6009 IDirectDrawSurface2_Release(iface);
6010 }
6012}
6013
6014struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface(IDirectDrawSurface *iface)
6015{
6016 if (!iface) return NULL;
6017 if (iface->lpVtbl != &ddraw_surface1_vtbl)
6018 {
6019 HRESULT hr = IDirectDrawSurface_QueryInterface(iface, &IID_IDirectDrawSurface, (void **)&iface);
6020 if (FAILED(hr))
6021 {
6022 WARN("Object %p doesn't expose interface IDirectDrawSurface.\n", iface);
6023 return NULL;
6024 }
6025 IDirectDrawSurface_Release(iface);
6026 }
6028}
6029
6030struct ddraw_surface *unsafe_impl_from_IDirect3DTexture2(IDirect3DTexture2 *iface)
6031{
6032 if (!iface) return NULL;
6033 assert(iface->lpVtbl == &d3d_texture2_vtbl);
6035}
6036
6037struct ddraw_surface *unsafe_impl_from_IDirect3DTexture(IDirect3DTexture *iface)
6038{
6039 if (!iface) return NULL;
6040 assert(iface->lpVtbl == &d3d_texture1_vtbl);
6042}
6043
6045{
6046 struct ddraw_surface *surface = parent;
6047
6048 TRACE("surface %p.\n", surface);
6049
6050 /* This shouldn't happen, ddraw_surface_release_iface() should prevent the
6051 * surface from being destroyed in this case. */
6052 if (surface->first_attached != surface)
6053 ERR("Surface is still attached to surface %p.\n", surface->first_attached);
6054
6055 while (surface->next_attached)
6057 surface->next_attached, surface->next_attached->attached_iface)))
6058 ERR("DeleteAttachedSurface failed.\n");
6059
6060 /* Having a texture handle set implies that the device still exists. */
6061 if (surface->Handle)
6063
6064 /* Reduce the ddraw surface count. */
6066
6067 if (surface->clipper && ddraw_clipper_is_valid(surface->clipper))
6068 IDirectDrawClipper_Release(&surface->clipper->IDirectDrawClipper_iface);
6069
6070 if (surface == surface->ddraw->primary)
6071 {
6072 surface->ddraw->primary = NULL;
6073 surface->ddraw->gdi_surface = NULL;
6074 }
6075
6077
6078 if (surface->draw_texture)
6080
6081 free(surface);
6082}
6083
6085{
6087};
6088
6089static void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw,
6090 struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx)
6091{
6093 unsigned int version = texture->version;
6094
6101 surface->IDirect3DTexture2_iface.lpVtbl = &d3d_texture2_vtbl;
6102 surface->IDirect3DTexture_iface.lpVtbl = &d3d_texture1_vtbl;
6103 surface->iface_count = 1;
6104 surface->version = version;
6105 surface->ddraw = ddraw;
6106
6107 if (version == 7)
6108 {
6109 surface->ref7 = 1;
6110 surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface7_iface;
6111 }
6112 else if (version == 4)
6113 {
6114 surface->ref4 = 1;
6115 surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface4_iface;
6116 }
6117 else
6118 {
6119 surface->ref1 = 1;
6120 surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface_iface;
6121 }
6122
6123 surface->first_attached = surface;
6124
6126 surface->sub_resource_idx = sub_resource_idx;
6128
6130}
6131
6133{
6134 struct ddraw_texture *texture = parent;
6135
6136 TRACE("texture %p, texture_memory %p.\n", texture, texture->texture_memory);
6137
6138 free(texture->texture_memory);
6139 free(parent);
6140}
6141
6143{
6145};
6146
6148{
6149 return DD_OK;
6150}
6151
6153 unsigned int sub_resource_count)
6154{
6155 static const unsigned int extra_size = 0x10000;
6156
6158 struct wined3d_resource_desc resource_desc;
6160 unsigned int pitch, slice_pitch;
6162 unsigned int offset, i;
6163
6165 if (!(texture->texture_memory = calloc(1, resource_desc.size + extra_size)))
6166 {
6167 ERR("Out of memory.\n");
6168 return E_OUTOFMEMORY;
6169 }
6170 TRACE("texture->texture_memory %p.\n", texture->texture_memory);
6171
6172 offset = 0;
6173 for (i = 0; i < sub_resource_count; ++i)
6174 {
6176 {
6177 ERR("Subresource %u not found.\n", i);
6178 free(texture->texture_memory);
6179 texture->texture_memory = NULL;
6180 return hr;
6181 }
6182 wined3d_texture_get_pitch(wined3d_texture, i, &pitch, &slice_pitch);
6183
6185 (BYTE *)texture->texture_memory + offset, pitch)))
6186 {
6187 free(texture->texture_memory);
6188 texture->texture_memory = NULL;
6189 break;
6190 }
6191 offset += desc.size;
6192 }
6193 return hr;
6194}
6195
6197 struct wined3d_resource_desc *wined3d_desc, const DDSURFACEDESC2 *desc)
6198{
6199 const DWORD caps = desc->ddsCaps.dwCaps;
6200 const DWORD caps2 = desc->ddsCaps.dwCaps2;
6201
6203 wined3d_desc->format = wined3dformat_from_ddrawformat(&desc->ddpfPixelFormat);
6205 wined3d_desc->multisample_quality = 0;
6206 wined3d_desc->usage = WINED3DUSAGE_VIDMEM_ACCOUNTING;
6207 wined3d_desc->bind_flags = 0;
6209 wined3d_desc->width = desc->dwWidth;
6210 wined3d_desc->height = desc->dwHeight;
6211 wined3d_desc->depth = 1;
6212 wined3d_desc->size = 0;
6213
6214 /* Always specify WINED3D_BIND_SHADER_RESOURCE.
6215 * Surfaces without it can be bound on software devices on ddraw < 4. */
6217 if (caps & DDSCAPS_ZBUFFER)
6218 wined3d_desc->bind_flags |= WINED3D_BIND_DEPTH_STENCIL;
6219 else if (caps & DDSCAPS_3DDEVICE)
6220 wined3d_desc->bind_flags |= WINED3D_BIND_RENDER_TARGET;
6221
6223 {
6224 wined3d_desc->access = WINED3D_RESOURCE_ACCESS_CPU
6226 }
6227 else
6228 {
6230 {
6231 wined3d_desc->access |= WINED3D_RESOURCE_ACCESS_CPU;
6232 wined3d_desc->usage |= WINED3DUSAGE_MANAGED;
6233 }
6234 else if (caps & DDSCAPS_VIDEOMEMORY)
6235 {
6236 /* Dynamic resources can't be written by the GPU. */
6237 if (!(caps & (DDSCAPS_3DDEVICE | DDSCAPS_ZBUFFER)))
6238 wined3d_desc->usage |= WINED3DUSAGE_DYNAMIC;
6239 }
6240 }
6241
6242 if (caps & DDSCAPS_OVERLAY)
6243 wined3d_desc->usage |= WINED3DUSAGE_OVERLAY;
6244
6245 if (caps & DDSCAPS_OWNDC)
6246 wined3d_desc->usage |= WINED3DUSAGE_OWNDC;
6247
6248 if (caps2 & DDSCAPS2_CUBEMAP)
6249 wined3d_desc->usage |= WINED3DUSAGE_LEGACY_CUBEMAP;
6250}
6251
6253 unsigned int layers, unsigned int levels, bool sysmem_fallback, bool reserve_memory)
6254{
6256 const DDSURFACEDESC2 *desc = &texture->surface_desc;
6257 struct wined3d_texture *draw_texture = NULL;
6258 struct wined3d_resource_desc wined3d_desc;
6260 struct ddraw_surface *parent, *root;
6261 unsigned int draw_bind_flags;
6262 unsigned int pitch = 0;
6263 unsigned int i, j;
6264 HRESULT hr;
6265
6267
6268 if (wined3d_desc.format == WINED3DFMT_UNKNOWN)
6269 {
6270 WARN("Unsupported / unknown pixelformat.\n");
6272 }
6273
6274 /* Validate the pitch. */
6275 if (desc->dwFlags & DDSD_LPSURFACE)
6276 {
6277 if (format_is_compressed(&desc->ddpfPixelFormat))
6278 {
6279 if ((desc->dwFlags & DDSD_LINEARSIZE)
6281 wined3d_desc.format, wined3d_desc.width) * ((wined3d_desc.height + 3) / 4))
6282 {
6283 WARN("Invalid linear size %lu specified.\n", desc->dwLinearSize);
6284 return DDERR_INVALIDPARAMS;
6285 }
6286 }
6287 else
6288 {
6290 wined3d_desc.format, wined3d_desc.width) || desc->lPitch & 3)
6291 {
6292 WARN("Invalid pitch %lu specified.\n", desc->lPitch);
6293 return DDERR_INVALIDPARAMS;
6294 }
6295
6296 pitch = desc->lPitch;
6297 }
6298 }
6299
6300 draw_bind_flags = wined3d_desc.bind_flags;
6301
6302 if (!(wined3d_desc.access & WINED3D_RESOURCE_ACCESS_GPU))
6303 wined3d_desc.bind_flags = 0;
6304 else if (wined3d_desc.usage & WINED3DUSAGE_MANAGED)
6305 wined3d_desc.bind_flags &= ~WINED3D_BIND_RENDER_TARGET;
6306
6307 if (draw_bind_flags && (wined3d_desc.bind_flags != draw_bind_flags))
6308 {
6309 struct wined3d_resource_desc draw_texture_desc;
6310
6311 draw_texture_desc = wined3d_desc;
6312 draw_texture_desc.bind_flags = draw_bind_flags;
6313 draw_texture_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
6314 draw_texture_desc.usage = 0;
6315
6316 if (FAILED(hr = wined3d_texture_create(wined3d_device, &draw_texture_desc, layers,
6317 levels, 0, NULL, texture, &ddraw_texture_wined3d_parent_ops, &draw_texture)))
6318 WARN("Failed to create draw texture, hr %#lx.\n", hr);
6319 }
6320
6321 /* Some applications assume surfaces will always be mapped at the same
6322 * address. Some of those also assume that this address is valid even when
6323 * the surface isn't mapped, and that updates done this way will be
6324 * visible on the screen. The game Nox is such an application,
6325 * Commandos: Behind Enemy Lines is another. Setting
6326 * WINED3D_TEXTURE_CREATE_GET_DC_LENIENT will ensure this. */
6327
6328 if (draw_texture)
6329 {
6330 if (FAILED(hr = wined3d_texture_create(wined3d_device, &wined3d_desc,
6333 goto fail;
6334
6337 }
6338 else
6339 {
6340 /* DDSCAPS_TEXTURE is not actually necessary to bind a surface as a
6341 * texture for a software device. Worse, one can bind a hardware
6342 * surface to a software device. However, some formats (e.g. YUY2) can
6343 * live on the GPU but truly aren't texturable, and we don't want to
6344 * fail to create them.
6345 *
6346 * Hence, if we fail to create a texture, and the user didn't
6347 * explicitly ask for a texture, strip WINED3D_BIND_SHADER_RESOURCE and
6348 * try again. */
6349
6350 if (FAILED(hr = wined3d_texture_create(wined3d_device, &wined3d_desc,
6353 {
6354 if ((desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE) || (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP))
6355 return hr;
6356
6357 wined3d_desc.bind_flags &= ~WINED3D_BIND_SHADER_RESOURCE;
6358 if (FAILED(hr = wined3d_texture_create(wined3d_device, &wined3d_desc,
6361 return hr;
6362 }
6363 }
6364
6365 if ((desc->dwFlags & DDSD_LPSURFACE)
6366 && FAILED(hr = wined3d_texture_update_desc(wined3d_texture, 0, desc->lpSurface, pitch)))
6367 {
6368 ERR("Failed to set surface memory, hr %#lx.\n", hr);
6369 goto fail;
6370 }
6371
6372 for (i = 0; i < layers; ++i)
6373 {
6374 struct ddraw_surface *prev_level = NULL;
6375
6376 for (j = 0; j < levels; ++j)
6377 {
6378 struct wined3d_sub_resource_desc wined3d_mip_desc;
6379 unsigned int sub_resource_idx = i * levels + j;
6380 unsigned int row_pitch, slice_pitch;
6381 struct ddraw_surface *mip;
6382 DDSURFACEDESC2 *mip_desc;
6383
6384 if (!(mip = calloc(1, sizeof(*mip))))
6385 {
6387 goto fail;
6388 }
6389
6391
6392 if (draw_texture)
6393 {
6399 }
6400 else
6401 {
6404 }
6405
6407 mip_desc = &mip->surface_desc;
6408
6409 *mip_desc = *desc;
6410
6411 wined3d_texture_get_pitch(wined3d_texture, j, &row_pitch, &slice_pitch);
6412 if (format_is_compressed(&desc->ddpfPixelFormat))
6413 {
6414 if (desc->dwFlags & DDSD_LPSURFACE)
6415 mip_desc->dwLinearSize = ~0u;
6416 else
6417 mip_desc->dwLinearSize = slice_pitch;
6418 mip_desc->dwFlags |= DDSD_LINEARSIZE;
6419 mip_desc->dwFlags &= ~DDSD_PITCH;
6420 }
6421 else
6422 {
6423 if (!(desc->dwFlags & DDSD_LPSURFACE))
6424 mip_desc->lPitch = row_pitch;
6425 mip_desc->dwFlags |= DDSD_PITCH;
6426 mip_desc->dwFlags &= ~DDSD_LINEARSIZE;
6427 }
6428
6429 mip_desc->dwFlags &= ~DDSD_LPSURFACE;
6430 mip_desc->lpSurface = NULL;
6431
6432 if (desc->ddsCaps.dwCaps & DDSCAPS_MIPMAP)
6433 mip_desc->dwMipMapCount = levels - j;
6434
6435 if (j)
6436 {
6438 mip_desc->dwWidth = wined3d_mip_desc.width;
6439 mip_desc->dwHeight = wined3d_mip_desc.height;
6440
6442 }
6443 else
6444 {
6445 mip_desc->ddsCaps.dwCaps2 &= ~DDSCAPS2_MIPMAPSUBLEVEL;
6446 }
6447
6448 if (mip_desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP)
6449 {
6450 mip_desc->ddsCaps.dwCaps2 &= ~DDSCAPS2_CUBEMAP_ALLFACES;
6451
6452 switch (i)
6453 {
6456 break;
6459 break;
6462 break;
6465 break;
6468 break;
6471 break;
6472 }
6473
6474 }
6475
6478
6479 TRACE("Created ddraw surface %p.\n", mip);
6480
6481 if (!j)
6482 {
6483 if (!i)
6484 texture->root = mip;
6485 else
6486 texture->root->complex_array[layers - 1 - i] = mip;
6487 }
6488 else if (j == 1 && !i)
6489 {
6490 texture->root->complex_array[layers - 1] = mip;
6491 }
6492 else
6493 {
6494 prev_level->complex_array[0] = mip;
6495 }
6496 prev_level = mip;
6497 }
6498 }
6499
6500 root = texture->root;
6501
6503
6505
6507 if (draw_texture)
6509
6510 if (reserve_memory && FAILED(hr = ddraw_surface_reserve_memory(wined3d_texture, 1)))
6511 {
6513 goto fail;
6514 }
6515
6516 TRACE("Surface %p, created draw_texture %p, wined3d_texture %p.\n", root, draw_texture, wined3d_texture);
6517 return D3D_OK;
6518
6519fail:
6520 if (draw_texture)
6521 {
6523
6525 if (texture->version == 7)
6526 IDirectDrawSurface7_Release(&parent->IDirectDrawSurface7_iface);
6527 else if (texture->version == 4)
6528 IDirectDrawSurface4_Release(&parent->IDirectDrawSurface4_iface);
6529 else
6530 IDirectDrawSurface_Release(&parent->IDirectDrawSurface_iface);
6531 }
6532 return hr;
6533}
6534
6536 struct ddraw_surface **surface, IUnknown *outer_unknown, unsigned int version)
6537{
6538 DDPIXELFORMAT wined3d_display_mode_format;
6539 struct ddraw_surface *root, **attach;
6541 struct ddraw_texture *texture;
6542 BOOL sysmem_fallback = FALSE;
6543 unsigned int layers = 1;
6545 bool reserve_memory;
6546 UINT levels, i;
6547 HRESULT hr;
6548
6549 TRACE("ddraw %p, surface_desc %p, surface %p, outer_unknown %p, version %u.\n",
6550 ddraw, surface_desc, surface, outer_unknown, version);
6551 if (TRACE_ON(ddraw))
6552 {
6553 TRACE("Requesting surface desc:\n");
6555 }
6556
6557 if (outer_unknown)
6558 return CLASS_E_NOAGGREGATION;
6559
6560 if (!surface)
6561 return E_POINTER;
6562
6563 if (!(texture = malloc(sizeof(*texture))))
6564 return E_OUTOFMEMORY;
6565
6566 texture->texture_memory = NULL;
6567 texture->version = version;
6568 texture->surface_desc = *surface_desc;
6569 desc = &texture->surface_desc;
6570
6571 /* Ensure DDSD_CAPS is always set. */
6572 desc->dwFlags |= DDSD_CAPS;
6573
6574 if ((desc->ddsCaps.dwCaps & DDSCAPS_COMPLEX)
6575 && !(desc->ddsCaps.dwCaps & (DDSCAPS_FLIP | DDSCAPS_MIPMAP))
6576 && !(desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP))
6577 {
6578 WARN("DDSCAPS_COMPLEX specified for a surface which is neither flippable, mipmapped, nor a cubemap.\n");
6579 free(texture);
6580 return DDERR_INVALIDCAPS;
6581 }
6582
6583 if ((desc->dwFlags & DDSD_MIPMAPCOUNT) && !(desc->ddsCaps.dwCaps & DDSCAPS_COMPLEX))
6584 {
6585 /* This is illegal even if there is only one mipmap level. */
6586 WARN("DDSD_MIPMAPCOUNT specified without DDSCAPS_COMPLEX.\n");
6587 free(texture);
6588 return DDERR_INVALIDCAPS;
6589 }
6590
6591 if (desc->ddsCaps.dwCaps & DDSCAPS_FLIP)
6592 {
6593 if (!(desc->dwFlags & DDSD_BACKBUFFERCOUNT) || !desc->dwBackBufferCount)
6594 {
6595 WARN("Tried to create a flippable surface without any back buffers.\n");
6596 free(texture);
6597 return DDERR_INVALIDCAPS;
6598 }
6599
6600 if (!(desc->ddsCaps.dwCaps & DDSCAPS_COMPLEX))
6601 {
6602 WARN("Tried to create a flippable surface without DDSCAPS_COMPLEX.\n");
6603 free(texture);
6604 return DDERR_INVALIDCAPS;
6605 }
6606
6607 if (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP)
6608 {
6609 WARN("Tried to create a flippable cubemap.\n");
6610 free(texture);
6611 return DDERR_INVALIDPARAMS;
6612 }
6613
6614 if (desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE)
6615 {
6616 FIXME("Flippable textures not implemented.\n");
6617 free(texture);
6618 return DDERR_INVALIDCAPS;
6619 }
6620 }
6621 else
6622 {
6623 if (desc->dwFlags & DDSD_BACKBUFFERCOUNT)
6624 {
6625 WARN("Tried to specify a back buffer count for a non-flippable surface.\n");
6627 free(texture);
6628 return hr;
6629 }
6630 }
6631
6632 if (desc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
6633 {
6634 if (desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE)
6635 {
6636 WARN("Tried to create a primary surface with DDSCAPS_TEXTURE.\n");
6637 free(texture);
6638 return DDERR_INVALIDCAPS;
6639 }
6640
6641 if ((desc->ddsCaps.dwCaps & DDSCAPS_COMPLEX) && !(desc->ddsCaps.dwCaps & DDSCAPS_FLIP))
6642 {
6643 WARN("Tried to create a flippable primary surface without both DDSCAPS_FLIP and DDSCAPS_COMPLEX.\n");
6644 free(texture);
6645 return DDERR_INVALIDCAPS;
6646 }
6647
6648 if ((desc->ddsCaps.dwCaps & DDSCAPS_FLIP) && !(ddraw->cooperative_level & DDSCL_EXCLUSIVE))
6649 {
6650 WARN("Tried to create a flippable primary surface without DDSCL_EXCLUSIVE.\n");
6651 free(texture);
6652 return DDERR_NOEXCLUSIVEMODE;
6653 }
6654 }
6655
6656 /* This is a special case in ddrawex, but not allowed in ddraw. */
6657 if ((desc->ddsCaps.dwCaps & (DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY))
6659 {
6660 WARN("Tried to create a surface in both system and video memory.\n");
6661 free(texture);
6662 return DDERR_INVALIDCAPS;
6663 }
6664
6665 if ((desc->ddsCaps.dwCaps & (DDSCAPS_ALLOCONLOAD | DDSCAPS_MIPMAP))
6666 && !(desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE))
6667 {
6668 WARN("Caps %#lx require DDSCAPS_TEXTURE.\n", desc->ddsCaps.dwCaps);
6669 free(texture);
6670 return DDERR_INVALIDCAPS;
6671 }
6672
6673 if ((desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP_ALLFACES)
6674 && !(desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP))
6675 {
6676 WARN("Cube map faces requested without cube map flag.\n");
6677 free(texture);
6678 return DDERR_INVALIDCAPS;
6679 }
6680
6681 if ((desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP)
6682 && !(desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP_ALLFACES))
6683 {
6684 WARN("Cube map without faces requested.\n");
6685 free(texture);
6686 return DDERR_INVALIDPARAMS;
6687 }
6688
6689 if ((desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP)
6690 && (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP_ALLFACES) != DDSCAPS2_CUBEMAP_ALLFACES)
6691 FIXME("Partial cube maps not implemented.\n");
6692
6693 if (desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))
6694 {
6695 if (!(desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE))
6696 {
6697 WARN("DDSCAPS2_TEXTUREMANAGE used without DDSCAPS_TEXTURE, returning DDERR_INVALIDCAPS.\n");
6698 free(texture);
6699 return DDERR_INVALIDCAPS;
6700 }
6701 if (desc->ddsCaps.dwCaps & (DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY))
6702 {
6703 WARN("DDSCAPS2_TEXTUREMANAGE used with DDSCAPS_VIDEOMEMORY "
6704 "or DDSCAPS_SYSTEMMEMORY, returning DDERR_INVALIDCAPS.\n");
6705 free(texture);
6706 return DDERR_INVALIDCAPS;
6707 }
6708 }
6709
6710 if (desc->ddsCaps.dwCaps & DDSCAPS_WRITEONLY
6711 && !(desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE)))
6712 {
6713 WARN("DDSCAPS_WRITEONLY used without DDSCAPS2_TEXTUREMANAGE, returning DDERR_INVALIDCAPS.\n");
6714 free(texture);
6715 return DDERR_INVALIDCAPS;
6716 }
6717
6719 {
6720 ERR("Failed to get display mode, hr %#lx.\n", hr);
6721 free(texture);
6722 return hr_ddraw_from_wined3d(hr);
6723 }
6724
6725 wined3d_display_mode_format.dwSize = sizeof(wined3d_display_mode_format);
6726 ddrawformat_from_wined3dformat(&wined3d_display_mode_format, mode.format_id);
6727
6728 /* No pixelformat given? Use the current screen format. */
6729 if (!(desc->dwFlags & DDSD_PIXELFORMAT))
6730 {
6731 desc->dwFlags |= DDSD_PIXELFORMAT;
6732 desc->ddpfPixelFormat = wined3d_display_mode_format;
6733 }
6734
6735 /* No width or no height? Use the screen size. */
6736 if (!(desc->dwFlags & DDSD_WIDTH) || !(desc->dwFlags & DDSD_HEIGHT))
6737 {
6738 if (!(desc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE))
6739 {
6740 WARN("No width / height specified.\n");
6741 free(texture);
6742 return DDERR_INVALIDPARAMS;
6743 }
6744
6745 desc->dwFlags |= DDSD_WIDTH | DDSD_HEIGHT;
6746 desc->dwWidth = mode.width;
6747 desc->dwHeight = mode.height;
6748 }
6749
6750 if (!desc->dwWidth || !desc->dwHeight)
6751 {
6752 free(texture);
6753 return DDERR_INVALIDPARAMS;
6754 }
6755
6756 if (desc->ddsCaps.dwCaps & DDSCAPS_FLIP)
6757 desc->ddsCaps.dwCaps |= DDSCAPS_FRONTBUFFER;
6758
6759 if (desc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
6760 {
6761 /* The first surface is a front buffer, the back buffers are created
6762 * afterwards. */
6763 desc->ddsCaps.dwCaps |= DDSCAPS_VISIBLE;
6765 {
6766 struct wined3d_swapchain_desc swapchain_desc;
6767
6769 swapchain_desc.backbuffer_width = mode.width;
6770 swapchain_desc.backbuffer_height = mode.height;
6771 swapchain_desc.backbuffer_format = mode.format_id;
6772
6774 &swapchain_desc, NULL, ddraw_reset_enum_callback, FALSE)))
6775 {
6776 ERR("Failed to reset device.\n");
6777 free(texture);
6778 return hr_ddraw_from_wined3d(hr);
6779 }
6780 }
6781 }
6782
6783 if ((desc->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) && (ddraw->flags & DDRAW_NO3D))
6784 {
6785 WARN("The application requests a 3D capable surface, but the ddraw object was created without 3D support.\n");
6786 /* Do not fail surface creation, only fail 3D device creation. */
6787 }
6788
6789 /* Mipmap count fixes */
6790 if (desc->ddsCaps.dwCaps & DDSCAPS_MIPMAP)
6791 {
6792 if (desc->ddsCaps.dwCaps & DDSCAPS_COMPLEX)
6793 {
6794 if (desc->dwFlags & DDSD_MIPMAPCOUNT)
6795 {
6796 /* Mipmap count is given, should not be 0. */
6797 if (!desc->dwMipMapCount)
6798 {
6799 free(texture);
6800 return DDERR_INVALIDPARAMS;
6801 }
6802 }
6803 else
6804 {
6805 /* Undocumented feature: Create sublevels until either the
6806 * width or the height is 1. */
6807 if (version == 7)
6808 desc->dwMipMapCount = wined3d_log2i(max(desc->dwWidth, desc->dwHeight)) + 1;
6809 else
6810 desc->dwMipMapCount = wined3d_log2i(min(desc->dwWidth, desc->dwHeight)) + 1;
6811 }
6812 }
6813 else
6814 {
6815 desc->dwMipMapCount = 1;
6816 }
6817
6818 desc->dwFlags |= DDSD_MIPMAPCOUNT;
6819 levels = desc->dwMipMapCount;
6820 }
6821 else
6822 {
6823 levels = 1;
6824 }
6825
6826 if (!(desc->ddsCaps.dwCaps & (DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY)))
6827 {
6828 if (!(desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE)))
6829 {
6830 unsigned int bind_flags = 0;
6831 DWORD usage = 0;
6832
6833 if (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP)
6834 {
6836 bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
6837 }
6838 else if (desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE)
6839 {
6840 bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
6841 }
6842
6843 if (desc->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)
6844 bind_flags |= WINED3D_BIND_DEPTH_STENCIL;
6845 else if (desc->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)
6846 bind_flags |= WINED3D_BIND_RENDER_TARGET;
6847
6850 usage, bind_flags, WINED3D_RTYPE_TEXTURE_2D, wined3dformat_from_ddrawformat(&desc->ddpfPixelFormat))))
6851 {
6852 desc->ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY;
6853 }
6854 else
6855 {
6856 desc->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
6857 sysmem_fallback = TRUE;
6858 }
6859 }
6860 else if (!(desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE))
6861 {
6862 /* Tests show surfaces without memory flags get these flags added
6863 * right after creation. */
6864 desc->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY;
6865 }
6866 }
6867
6868 if ((desc->ddsCaps.dwCaps & (DDSCAPS_OVERLAY | DDSCAPS_SYSTEMMEMORY))
6870 {
6871 WARN("System memory overlays are not allowed.\n");
6872 free(texture);
6873 return DDERR_NOOVERLAYHW;
6874 }
6875
6876 if (desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))
6877 desc->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
6878
6879 if (desc->ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)
6880 desc->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM;
6881
6882 if (desc->dwFlags & DDSD_LPSURFACE)
6883 {
6884 if (!(desc->ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY))
6885 {
6886 WARN("User memory surfaces should not be GPU accessible.\n");
6887 free(texture);
6888 return DDERR_INVALIDCAPS;
6889 }
6890
6891 if (version < 4)
6892 {
6893 WARN("User memory surfaces not supported before version 4.\n");
6894 free(texture);
6895 return DDERR_INVALIDPARAMS;
6896 }
6897
6898 if (!desc->lpSurface)
6899 {
6900 WARN("NULL surface memory pointer specified.\n");
6901 free(texture);
6902 return DDERR_INVALIDPARAMS;
6903 }
6904
6905 if (format_is_compressed(&desc->ddpfPixelFormat))
6906 {
6907 if (version != 4 && (desc->dwFlags & DDSD_PITCH))
6908 {
6909 WARN("Pitch specified on a compressed user memory surface.\n");
6910 free(texture);
6911 return DDERR_INVALIDPARAMS;
6912 }
6913
6914 if (!(desc->dwFlags & (DDSD_LINEARSIZE | DDSD_PITCH)))
6915 {
6916 WARN("Compressed user memory surfaces should explicitly specify the linear size.\n");
6917 free(texture);
6918 return DDERR_INVALIDPARAMS;
6919 }
6920 }
6921 else
6922 {
6923 if (!(desc->dwFlags & DDSD_PITCH))
6924 {
6925 WARN("User memory surfaces should explicitly specify the pitch.\n");
6926 free(texture);
6927 return DDERR_INVALIDPARAMS;
6928 }
6929 }
6930 }
6931
6932 if (((desc->dwFlags & DDSD_CKDESTOVERLAY)
6933 && desc->ddckCKDestOverlay.dwColorSpaceLowValue != desc->ddckCKDestOverlay.dwColorSpaceHighValue)
6934 || ((desc->dwFlags & DDSD_CKDESTBLT)
6935 && desc->ddckCKDestBlt.dwColorSpaceLowValue != desc->ddckCKDestBlt.dwColorSpaceHighValue)
6936 || ((desc->dwFlags & DDSD_CKSRCOVERLAY)
6937 && desc->ddckCKSrcOverlay.dwColorSpaceLowValue != desc->ddckCKSrcOverlay.dwColorSpaceHighValue)
6938 || ((desc->dwFlags & DDSD_CKSRCBLT)
6939 && desc->ddckCKSrcBlt.dwColorSpaceLowValue != desc->ddckCKSrcBlt.dwColorSpaceHighValue))
6940 {
6941 WARN("Range color keys not supported, returning DDERR_NOCOLORKEYHW.\n");
6942 free(texture);
6943 return DDERR_NOCOLORKEYHW;
6944 }
6945
6946 if ((ddraw->flags & DDRAW_NO3D) && (desc->ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY))
6947 {
6948 WARN("Video memory surfaces not supported without 3D support.\n");
6949 free(texture);
6950 return DDERR_NODIRECTDRAWHW;
6951 }
6952
6953 if (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP)
6954 layers = 6;
6955
6956 reserve_memory = !(desc->dwFlags & DDSD_LPSURFACE)
6957 && desc->ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY
6958 && wined3d_display_mode_format.dwRGBBitCount <= 16;
6959
6960 if (FAILED(hr = ddraw_texture_init(texture, ddraw, layers, levels, sysmem_fallback, reserve_memory)))
6961 {
6962 WARN("Failed to create wined3d texture, hr %#lx.\n", hr);
6963 free(texture);
6964 return hr_ddraw_from_wined3d(hr);
6965 }
6966
6967 root = texture->root;
6968 root->is_root = TRUE;
6969
6970 if (desc->dwFlags & DDSD_BACKBUFFERCOUNT)
6971 {
6972 unsigned int count = desc->dwBackBufferCount;
6973 struct ddraw_surface *last = root;
6974
6975 attach = &last->complex_array[0];
6976 for (i = 0; i < count; ++i)
6977 {
6978 if (!(texture = malloc(sizeof(*texture))))
6979 {
6980 hr = E_OUTOFMEMORY;
6981 goto fail;
6982 }
6983
6984 texture->texture_memory = NULL;
6985 texture->version = version;
6986 texture->surface_desc = root->surface_desc;
6987 desc = &texture->surface_desc;
6988
6989 /* Only one surface in the flipping chain is a back buffer, one is
6990 * a front buffer, the others are just flippable surfaces. */
6993 if (!i)
6994 desc->ddsCaps.dwCaps |= DDSCAPS_BACKBUFFER;
6995 desc->dwBackBufferCount = 0;
6996
6997 if (FAILED(hr = ddraw_texture_init(texture, ddraw, 1, 1, sysmem_fallback, reserve_memory)))
6998 {
6999 free(texture);
7001 goto fail;
7002 }
7003
7004 last = texture->root;
7005
7006 *attach = last;
7007 attach = &last->complex_array[0];
7008 }
7009 *attach = root;
7010 }
7011
7013 {
7014 ddraw->primary = root;
7015 ddraw->gdi_surface = root->wined3d_texture;
7016 }
7017 *surface = root;
7018
7019 return DD_OK;
7020
7021fail:
7022 if (version == 7)
7023 IDirectDrawSurface7_Release(&root->IDirectDrawSurface7_iface);
7024 else if (version == 4)
7025 IDirectDrawSurface4_Release(&root->IDirectDrawSurface4_iface);
7026 else
7027 IDirectDrawSurface_Release(&root->IDirectDrawSurface_iface);
7028
7029 return hr;
7030}
7031
7033{
7034 struct ddraw_surface *surface = parent;
7035
7036 /* If the surface reference count drops to zero, we release our reference
7037 * to the view, but don't clear the pointer yet, in case e.g. a
7038 * GetRenderTarget() call brings the surface back before the view is
7039 * actually destroyed. When the view is destroyed, we need to clear the
7040 * pointer, or a subsequent surface AddRef() would reference it again.
7041 *
7042 * This is safe because as long as the view still has a reference to the
7043 * texture, the surface is also still alive, and we're called before the
7044 * view releases that reference. */
7045 surface->wined3d_rtv = NULL;
7046}
7047
7049{
7051};
7052
7054{
7056 HRESULT hr;
7057
7058 if (surface->wined3d_rtv)
7059 return surface->wined3d_rtv;
7060
7061 wined3d_texture = surface->draw_texture ? surface->draw_texture : surface->wined3d_texture;
7063 surface->sub_resource_idx, surface, &ddraw_view_wined3d_parent_ops, &surface->wined3d_rtv)))
7064 {
7065 ERR("Failed to create rendertarget view, hr %#lx.\n", hr);
7066 return NULL;
7067 }
7068
7069 return surface->wined3d_rtv;
7070}
#define DECLSPEC_HOTPATCH
Definition: _mingw.h:240
#define read
Definition: acwin.h:97
#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
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
#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
struct _root root
RECT rect
Definition: combotst.c:67
HRESULT CDECL wined3d_device_context_clear_sysmem_texture(struct wined3d_device_context *context, struct wined3d_texture *texture, unsigned int sub_resource_idx, const RECT *rect, unsigned int flags, const struct wined3d_color *color)
Definition: cs.c:896
HDC dc
Definition: cylfrac.c:34
#define IDirect3DDevice_AddRef(p)
Definition: d3d.h:965
#define D3DERR_TEXTURE_LOAD_FAILED
Definition: d3d.h:125
#define D3D_OK
Definition: d3d.h:106
#define IDirect3DTexture2_AddRef(p)
Definition: d3d.h:627
DWORD D3DTEXTUREHANDLE
Definition: d3dtypes.h:155
#define DDRAW_SURFACE_WRITE
static struct wined3d_texture * ddraw_surface_get_any_texture(struct ddraw_surface *surface, unsigned int flags)
enum wined3d_format_id wined3dformat_from_ddrawformat(const DDPIXELFORMAT *format)
Definition: utils.c:330
void * ddraw_free_handle(struct ddraw_handle_table *t, DWORD handle, enum ddraw_handle_type type)
Definition: main.c:184
unsigned int wined3dmapflags_from_ddrawmapflags(unsigned int flags)
Definition: utils.c:561
static struct wined3d_texture * ddraw_surface_get_default_texture(struct ddraw_surface *surface, unsigned int flags)
#define DDRAW_SWAPPED
Definition: ddraw_private.h:59
static struct ddraw_surface * impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface)
static struct ddraw_surface * impl_from_IDirectDrawSurface4(IDirectDrawSurface4 *iface)
@ DDRAW_DEVICE_STATE_LOST
Definition: ddraw_private.h:76
@ DDRAW_DEVICE_STATE_OK
Definition: ddraw_private.h:75
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_surface * impl_from_IDirectDrawSurface(IDirectDrawSurface *iface)
struct d3d_device * unsafe_impl_from_IDirect3DDevice(IDirect3DDevice *iface)
Definition: device.c:6810
static BOOL format_is_compressed(const DDPIXELFORMAT *format)
#define MAX_COMPLEX_ATTACHED
enum wined3d_depth_buffer_type d3d_device_update_depth_stencil(struct d3d_device *device)
Definition: device.c:6817
#define DDRAW_NO3D
Definition: ddraw_private.h:56
struct ddraw_palette * unsafe_impl_from_IDirectDrawPalette(IDirectDrawPalette *iface)
Definition: palette.c:232
static struct ddraw_surface * impl_from_IDirectDrawSurface2(IDirectDrawSurface2 *iface)
HRESULT hr_ddraw_from_wined3d(HRESULT hr)
Definition: utils.c:1183
#define DD_STRUCT_COPY_BYSIZE_(to, from, to_size, from_size)
void DDRAW_dump_surface_desc(const DDSURFACEDESC2 *lpddsd)
Definition: utils.c:857
static BOOL format_is_paletteindexed(const DDPIXELFORMAT *fmt)
#define DDRAW_SURFACE_LOCATION_DEFAULT
#define DDRAW_SURFACE_RW
static void ddraw_set_swapchain_window(struct ddraw *ddraw, HWND window)
static struct ddraw_surface * impl_from_IDirect3DTexture2(IDirect3DTexture2 *iface)
#define DDRAW_SURFACE_READ
#define DDRAW_INVALID_HANDLE
#define DD_STRUCT_COPY_BYSIZE(to, from)
DWORD ddraw_allocate_handle(struct ddraw_handle_table *t, void *object, enum ddraw_handle_type type)
Definition: main.c:138
@ DDRAW_HANDLE_SURFACE
static struct wined3d_texture * ddraw_surface_get_draw_texture(struct ddraw_surface *surface, unsigned int flags)
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
BOOL wined3d_colour_from_ddraw_colour(const DDPIXELFORMAT *pf, const struct ddraw_palette *palette, DWORD colour, struct wined3d_color *wined3d_colour)
Definition: utils.c:593
static struct ddraw_surface * impl_from_IDirect3DTexture(IDirect3DTexture *iface)
const GUID IID_D3DDEVICE_WineD3D
Definition: device.c:36
#define DDSD_LPSURFACE
Definition: ddrawex.h:22
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
BOOL ddraw_clipper_is_valid(const struct ddraw_clipper *clipper)
Definition: clipper.c:33
struct ddraw_clipper * unsafe_impl_from_IDirectDrawClipper(IDirectDrawClipper *iface)
Definition: clipper.c:389
_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 void STDMETHODCALLTYPE view_wined3d_object_destroyed(void *parent)
Definition: surface.c:350
void ddraw_update_lost_surfaces(struct ddraw *ddraw)
Definition: ddraw.c:5031
const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops
Definition: ddraw.c:82
static struct ddraw_surface * unsafe_impl_from_IDirectDrawSurface2(IDirectDrawSurface2 *iface)
Definition: surface.c:5998
static HRESULT WINAPI ddraw_surface2_SetOverlayPosition(IDirectDrawSurface2 *iface, LONG x, LONG y)
Definition: surface.c:3967
static ULONG WINAPI ddraw_surface4_AddRef(IDirectDrawSurface4 *iface)
Definition: surface.c:430
static HRESULT ddraw_surface_delete_attached_surface(struct ddraw_surface *surface, struct ddraw_surface *attachment, IUnknown *detach_iface)
Definition: surface.c:2169
static HRESULT WINAPI ddraw_surface3_PageUnlock(IDirectDrawSurface3 *iface, DWORD flags)
Definition: surface.c:2897
static HRESULT WINAPI ddraw_surface2_UpdateOverlay(IDirectDrawSurface2 *iface, RECT *src_rect, IDirectDrawSurface2 *dst_surface, RECT *dst_rect, DWORD flags, DDOVERLAYFX *fx)
Definition: surface.c:4054
static HRESULT WINAPI ddraw_surface2_QueryInterface(IDirectDrawSurface2 *iface, REFIID riid, void **object)
Definition: surface.c:343
static const struct IDirect3DTexture2Vtbl d3d_texture2_vtbl
Definition: surface.c:5926
static BOOL ddraw_gdi_is_front(struct ddraw *ddraw)
Definition: surface.c:47
static HRESULT WINAPI ddraw_surface1_EnumOverlayZOrders(IDirectDrawSurface *iface, DWORD flags, void *context, LPDDENUMSURFACESCALLBACK callback)
Definition: surface.c:3198
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Blt(IDirectDrawSurface7 *iface, RECT *dst_rect, IDirectDrawSurface7 *src_surface, RECT *src_rect, DWORD flags, DDBLTFX *fx)
Definition: surface.c:1898
static HRESULT WINAPI ddraw_surface1_EnumAttachedSurfaces(IDirectDrawSurface *iface, void *context, LPDDENUMSURFACESCALLBACK callback)
Definition: surface.c:3116
static HRESULT WINAPI ddraw_surface1_Initialize(IDirectDrawSurface *iface, IDirectDraw *ddraw, DDSURFACEDESC *surface_desc)
Definition: surface.c:3723
static HRESULT WINAPI ddraw_surface3_GetDC(IDirectDrawSurface3 *iface, HDC *dc)
Definition: surface.c:2422
static HRESULT ddraw_surface_set_wined3d_textures_colour_key(struct ddraw_surface *surface, DWORD flags, struct wined3d_color_key *color_key)
Definition: surface.c:4691
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_Unlock(IDirectDrawSurface2 *iface, void *data)
Definition: surface.c:1308
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_BltFast(IDirectDrawSurface2 *iface, DWORD dst_x, DWORD dst_y, IDirectDrawSurface2 *src_surface, RECT *src_rect, DWORD flags)
Definition: surface.c:4508
static unsigned int ddraw_swap_interval_from_flags(DWORD flags)
Definition: surface.c:1317
static HRESULT WINAPI ddraw_surface4_Lock(IDirectDrawSurface4 *iface, RECT *rect, DDSURFACEDESC2 *surface_desc, DWORD flags, HANDLE h)
Definition: surface.c:1184
static void wined3d_resource_desc_from_ddraw(struct ddraw *ddraw, struct wined3d_resource_desc *wined3d_desc, const DDSURFACEDESC2 *desc)
Definition: surface.c:6196
static HRESULT WINAPI ddraw_surface4_GetClipper(IDirectDrawSurface4 *iface, IDirectDrawClipper **clipper)
Definition: surface.c:4559
static HRESULT WINAPI ddraw_surface2_DeleteAttachedSurface(IDirectDrawSurface2 *iface, DWORD flags, IDirectDrawSurface2 *attachment)
Definition: surface.c:2271
static HRESULT WINAPI ddraw_surface4_SetSurfaceDesc(IDirectDrawSurface4 *iface, DDSURFACEDESC2 *surface_desc, DWORD flags)
Definition: surface.c:4997
static HRESULT WINAPI ddraw_surface7_AddOverlayDirtyRect(IDirectDrawSurface7 *iface, RECT *Rect)
Definition: surface.c:2305
static HRESULT WINAPI ddraw_surface1_UpdateOverlay(IDirectDrawSurface *iface, RECT *src_rect, IDirectDrawSurface *dst_surface, RECT *dst_rect, DWORD flags, DDOVERLAYFX *fx)
Definition: surface.c:4067
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Blt(IDirectDrawSurface *iface, RECT *dst_rect, IDirectDrawSurface *src_surface, RECT *src_rect, DWORD flags, DDBLTFX *fx)
Definition: surface.c:1715
static HRESULT WINAPI ddraw_surface4_IsLost(IDirectDrawSurface4 *iface)
Definition: surface.c:3775
static HRESULT WINAPI d3d_texture1_Initialize(IDirect3DTexture *iface, IDirect3DDevice *device, IDirectDrawSurface *surface)
Definition: surface.c:3748
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_BltBatch(IDirectDrawSurface7 *iface, DDBLTBATCH *Batch, DWORD Count, DWORD Flags)
Definition: surface.c:2927
static HRESULT WINAPI ddraw_surface7_Lock(IDirectDrawSurface7 *iface, RECT *rect, DDSURFACEDESC2 *surface_desc, DWORD flags, HANDLE h)
Definition: surface.c:1163
static struct ddraw_surface * impl_from_IDirectDrawGammaControl(IDirectDrawGammaControl *iface)
Definition: surface.c:36
static HRESULT WINAPI ddraw_surface4_QueryInterface(IDirectDrawSurface4 *iface, REFIID riid, void **object)
Definition: surface.c:325
static HRESULT WINAPI ddraw_surface2_EnumOverlayZOrders(IDirectDrawSurface2 *iface, DWORD flags, void *context, LPDDENUMSURFACESCALLBACK callback)
Definition: surface.c:3183
static HRESULT WINAPI ddraw_surface7_UpdateOverlay(IDirectDrawSurface7 *iface, RECT *src_rect, IDirectDrawSurface7 *dst_surface, RECT *dst_rect, DWORD flags, DDOVERLAYFX *fx)
Definition: surface.c:4000
static HRESULT WINAPI ddraw_surface1_DeleteAttachedSurface(IDirectDrawSurface *iface, DWORD flags, IDirectDrawSurface *attachment)
Definition: surface.c:2282
static HRESULT WINAPI ddraw_surface3_Lock(IDirectDrawSurface3 *iface, RECT *rect, DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h)
Definition: surface.c:1229
static HRESULT WINAPI ddraw_surface1_SetClipper(IDirectDrawSurface *iface, IDirectDrawClipper *clipper)
Definition: surface.c:4682
static ULONG WINAPI ddraw_surface4_Release(IDirectDrawSurface4 *iface)
Definition: surface.c:702
static HRESULT WINAPI ddraw_surface7_PageUnlock(IDirectDrawSurface7 *iface, DWORD Flags)
Definition: surface.c:2881
static HRESULT WINAPI ddraw_surface4_UpdateOverlayZOrder(IDirectDrawSurface4 *iface, DWORD flags, IDirectDrawSurface4 *reference)
Definition: surface.c:4166
static HRESULT WINAPI ddraw_surface4_AddAttachedSurface(IDirectDrawSurface4 *iface, IDirectDrawSurface4 *attachment)
Definition: surface.c:2061
struct ddraw_surface * unsafe_impl_from_IDirectDrawSurface4(IDirectDrawSurface4 *iface)
Definition: surface.c:5966
static HRESULT WINAPI ddraw_surface2_IsLost(IDirectDrawSurface2 *iface)
Definition: surface.c:3793
static HRESULT WINAPI ddraw_surface1_SetColorKey(IDirectDrawSurface *iface, DWORD flags, DDCOLORKEY *color_key)
Definition: surface.c:5210
static HRESULT WINAPI ddraw_surface2_Restore(IDirectDrawSurface2 *iface)
Definition: surface.c:3904
static const struct IDirectDrawGammaControlVtbl ddraw_gamma_control_vtbl
Definition: surface.c:5917
static HRESULT WINAPI ddraw_surface7_SetPriority(IDirectDrawSurface7 *iface, DWORD priority)
Definition: surface.c:2603
static HRESULT WINAPI ddraw_surface4_SetOverlayPosition(IDirectDrawSurface4 *iface, LONG x, LONG y)
Definition: surface.c:3949
HRESULT ddraw_surface_update_frontbuffer(struct ddraw_surface *surface, const RECT *rect, BOOL read, unsigned int swap_interval)
Definition: surface.c:61
static HRESULT WINAPI d3d_texture2_Load(IDirect3DTexture2 *iface, IDirect3DTexture2 *src_texture)
Definition: surface.c:5522
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface3_Blt(IDirectDrawSurface3 *iface, RECT *dst_rect, IDirectDrawSurface3 *src_surface, RECT *src_rect, DWORD flags, DDBLTFX *fx)
Definition: surface.c:1924
static void ddraw_texture_rename_to(struct ddraw_texture *dst_texture, struct wined3d_texture *wined3d_texture, struct wined3d_texture *draw_texture, struct wined3d_rendertarget_view *rtv, void *texture_memory, struct wined3d_rendertarget_view *current_rtv)
Definition: surface.c:1335
static HRESULT WINAPI ddraw_surface4_PageLock(IDirectDrawSurface4 *iface, DWORD flags)
Definition: surface.c:2842
static HRESULT WINAPI ddraw_surface4_UpdateOverlayDisplay(IDirectDrawSurface4 *iface, DWORD flags)
Definition: surface.c:4098
static HRESULT WINAPI ddraw_surface7_DeleteAttachedSurface(IDirectDrawSurface7 *iface, DWORD flags, IDirectDrawSurface7 *attachment)
Definition: surface.c:2238
static HRESULT WINAPI ddraw_surface3_SetClipper(IDirectDrawSurface3 *iface, IDirectDrawClipper *clipper)
Definition: surface.c:4664
static HRESULT WINAPI ddraw_surface2_GetClipper(IDirectDrawSurface2 *iface, IDirectDrawClipper **clipper)
Definition: surface.c:4577
static HRESULT WINAPI ddraw_surface1_GetClipper(IDirectDrawSurface *iface, IDirectDrawClipper **clipper)
Definition: surface.c:4586
static ULONG WINAPI ddraw_surface1_Release(IDirectDrawSurface *iface)
Definition: surface.c:747
static HRESULT WINAPI ddraw_surface2_PageLock(IDirectDrawSurface2 *iface, DWORD flags)
Definition: surface.c:2860
static struct IDirectDrawSurface4Vtbl ddraw_surface4_vtbl
Definition: surface.c:5724
static HRESULT WINAPI ddraw_surface4_GetCaps(IDirectDrawSurface4 *iface, DDSCAPS2 *caps)
Definition: surface.c:2549
static const struct wined3d_parent_ops ddraw_texture_wined3d_parent_ops
Definition: surface.c:33
static ULONG WINAPI ddraw_gamma_control_Release(IDirectDrawGammaControl *iface)
Definition: surface.c:762
static ULONG ddraw_surface_release_iface(struct ddraw_surface *This)
Definition: surface.c:616
static HRESULT WINAPI ddraw_surface1_GetSurfaceDesc(IDirectDrawSurface *iface, DDSURFACEDESC *DDSD)
Definition: surface.c:3656
static HRESULT WINAPI ddraw_surface3_UpdateOverlayDisplay(IDirectDrawSurface3 *iface, DWORD flags)
Definition: surface.c:4107
static HRESULT WINAPI ddraw_surface7_ReleaseDC(IDirectDrawSurface7 *iface, HDC hdc)
Definition: surface.c:2461
static HRESULT WINAPI ddraw_surface4_GetAttachedSurface(IDirectDrawSurface4 *iface, DDSCAPS2 *caps, IDirectDrawSurface4 **attachment)
Definition: surface.c:917
static HRESULT WINAPI ddraw_surface7_SetPrivateData(IDirectDrawSurface7 *iface, REFGUID tag, void *data, DWORD size, DWORD flags)
Definition: surface.c:2681
static HRESULT WINAPI ddraw_surface7_AddAttachedSurface(IDirectDrawSurface7 *iface, IDirectDrawSurface7 *attachment)
Definition: surface.c:2034
static HRESULT WINAPI ddraw_surface1_GetOverlayPosition(IDirectDrawSurface *iface, LONG *x, LONG *y)
Definition: surface.c:3498
static HRESULT WINAPI ddraw_surface3_UpdateOverlayZOrder(IDirectDrawSurface3 *iface, DWORD flags, IDirectDrawSurface3 *reference)
Definition: surface.c:4178
static HRESULT WINAPI ddraw_surface2_UpdateOverlayZOrder(IDirectDrawSurface2 *iface, DWORD flags, IDirectDrawSurface2 *reference)
Definition: surface.c:4190
static HRESULT WINAPI ddraw_surface4_UpdateOverlay(IDirectDrawSurface4 *iface, RECT *src_rect, IDirectDrawSurface4 *dst_surface, RECT *dst_rect, DWORD flags, DDOVERLAYFX *fx)
Definition: surface.c:4028
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface4_Blt(IDirectDrawSurface4 *iface, RECT *dst_rect, IDirectDrawSurface4 *src_surface, RECT *src_rect, DWORD flags, DDBLTFX *fx)
Definition: surface.c:1911
static HRESULT WINAPI ddraw_surface1_UpdateOverlayZOrder(IDirectDrawSurface *iface, DWORD flags, IDirectDrawSurface *reference)
Definition: surface.c:4202
static HRESULT WINAPI ddraw_surface3_GetBltStatus(IDirectDrawSurface3 *iface, DWORD flags)
Definition: surface.c:3246
static HRESULT WINAPI ddraw_surface3_EnumOverlayZOrders(IDirectDrawSurface3 *iface, DWORD flags, void *context, LPDDENUMSURFACESCALLBACK callback)
Definition: surface.c:3168
static struct IDirectDrawSurface3Vtbl ddraw_surface3_vtbl
Definition: surface.c:5779
static HRESULT WINAPI ddraw_surface3_Restore(IDirectDrawSurface3 *iface)
Definition: surface.c:3895
static HRESULT WINAPI ddraw_surface1_AddAttachedSurface(IDirectDrawSurface *iface, IDirectDrawSurface *attachment)
Definition: surface.c:2136
static HRESULT WINAPI ddraw_surface1_GetPixelFormat(IDirectDrawSurface *iface, DDPIXELFORMAT *pixel_format)
Definition: surface.c:3565
static HRESULT WINAPI ddraw_surface2_PageUnlock(IDirectDrawSurface2 *iface, DWORD flags)
Definition: surface.c:2906
static HRESULT WINAPI ddraw_surface3_Initialize(IDirectDrawSurface3 *iface, IDirectDraw *ddraw, DDSURFACEDESC *surface_desc)
Definition: surface.c:3697
static HRESULT WINAPI ddraw_surface2_GetSurfaceDesc(IDirectDrawSurface2 *iface, DDSURFACEDESC *DDSD)
Definition: surface.c:3647
static HRESULT WINAPI ddraw_surface2_Lock(IDirectDrawSurface2 *iface, RECT *rect, DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h)
Definition: surface.c:1240
static ULONG WINAPI ddraw_gamma_control_AddRef(IDirectDrawGammaControl *iface)
Definition: surface.c:490
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_Flip(IDirectDrawSurface2 *iface, IDirectDrawSurface2 *src, DWORD flags)
Definition: surface.c:1525
static ULONG WINAPI ddraw_surface2_Release(IDirectDrawSurface2 *iface)
Definition: surface.c:732
static HRESULT WINAPI ddraw_surface3_GetOverlayPosition(IDirectDrawSurface3 *iface, LONG *x, LONG *y)
Definition: surface.c:3480
static HRESULT CALLBACK EnumCallback2(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *surface_desc, void *context)
Definition: surface.c:3047
static HRESULT WINAPI ddraw_surface4_DeleteAttachedSurface(IDirectDrawSurface4 *iface, DWORD flags, IDirectDrawSurface4 *attachment)
Definition: surface.c:2249
static HRESULT WINAPI ddraw_surface2_ReleaseDC(IDirectDrawSurface2 *iface, HDC dc)
Definition: surface.c:2504
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
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface4_Unlock(IDirectDrawSurface4 *iface, RECT *rect)
Definition: surface.c:1290
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface4_Flip(IDirectDrawSurface4 *iface, IDirectDrawSurface4 *src, DWORD flags)
Definition: surface.c:1501
static HRESULT WINAPI ddraw_surface4_GetDC(IDirectDrawSurface4 *iface, HDC *dc)
Definition: surface.c:2413
static HRESULT ddraw_texture_init(struct ddraw_texture *texture, struct ddraw *ddraw, unsigned int layers, unsigned int levels, bool sysmem_fallback, bool reserve_memory)
Definition: surface.c:6252
static HRESULT WINAPI ddraw_surface3_GetCaps(IDirectDrawSurface3 *iface, DDSCAPS *caps)
Definition: surface.c:2558
static HRESULT WINAPI ddraw_surface7_UpdateOverlayDisplay(IDirectDrawSurface7 *iface, DWORD Flags)
Definition: surface.c:4091
static HRESULT WINAPI ddraw_surface3_SetSurfaceDesc(IDirectDrawSurface3 *iface, DDSURFACEDESC *surface_desc, DWORD flags)
Definition: surface.c:5008
static HRESULT WINAPI ddraw_surface2_EnumAttachedSurfaces(IDirectDrawSurface2 *iface, void *context, LPDDENUMSURFACESCALLBACK callback)
Definition: surface.c:3101
static struct ddraw_surface * get_sub_mimaplevel(struct ddraw_surface *surface)
Definition: surface.c:5490
static HRESULT WINAPI ddraw_surface3_PageLock(IDirectDrawSurface3 *iface, DWORD flags)
Definition: surface.c:2851
static HRESULT ddraw_surface_reserve_memory(struct wined3d_texture *wined3d_texture, unsigned int sub_resource_count)
Definition: surface.c:6152
static struct IDirectDrawSurfaceVtbl ddraw_surface1_vtbl
Definition: surface.c:5875
static void STDMETHODCALLTYPE ddraw_texture_wined3d_object_destroyed(void *parent)
Definition: surface.c:6132
static ULONG WINAPI ddraw_surface3_Release(IDirectDrawSurface3 *iface)
Definition: surface.c:717
struct wined3d_rendertarget_view * ddraw_surface_get_rendertarget_view(struct ddraw_surface *surface)
Definition: surface.c:7053
static HRESULT WINAPI ddraw_surface4_GetDDInterface(IDirectDrawSurface4 *iface, void **ddraw)
Definition: surface.c:4261
static HRESULT WINAPI ddraw_surface7_GetSurfaceDesc(IDirectDrawSurface7 *iface, DDSURFACEDESC2 *surface_desc)
Definition: surface.c:3588
static ULONG WINAPI d3d_texture1_AddRef(IDirect3DTexture *iface)
Definition: surface.c:514
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Unlock(IDirectDrawSurface *iface, void *data)
Definition: surface.c:1264
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_BltFast(IDirectDrawSurface *iface, DWORD dst_x, DWORD dst_y, IDirectDrawSurface *src_surface, RECT *src_rect, DWORD flags)
Definition: surface.c:4521
static HRESULT WINAPI ddraw_surface1_Lock(IDirectDrawSurface *iface, RECT *rect, DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h)
Definition: surface.c:1251
static ULONG WINAPI d3d_texture2_Release(IDirect3DTexture2 *iface)
Definition: surface.c:777
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Flip(IDirectDrawSurface7 *iface, IDirectDrawSurface7 *src, DWORD flags)
Definition: surface.c:1489
static HRESULT WINAPI ddraw_surface2_GetPixelFormat(IDirectDrawSurface2 *iface, DDPIXELFORMAT *pixel_format)
Definition: surface.c:3556
static HRESULT WINAPI ddraw_surface3_AddAttachedSurface(IDirectDrawSurface3 *iface, IDirectDrawSurface3 *attachment)
Definition: surface.c:2100
static HRESULT WINAPI d3d_texture1_PaletteChanged(IDirect3DTexture *iface, DWORD start, DWORD count)
Definition: surface.c:5401
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface3_Flip(IDirectDrawSurface3 *iface, IDirectDrawSurface3 *src, DWORD flags)
Definition: surface.c:1513
static void ddraw_surface_sync_color_keys(struct ddraw_surface *surface)
Definition: surface.c:4711
static HRESULT WINAPI ddraw_surface4_EnumOverlayZOrders(IDirectDrawSurface4 *iface, DWORD flags, void *context, LPDDENUMSURFACESCALLBACK2 callback)
Definition: surface.c:3153
static HRESULT ddraw_surface_blt_clipped(struct ddraw_surface *dst_surface, const RECT *dst_rect_in, struct ddraw_surface *src_surface, const RECT *src_rect_in, DWORD flags, DWORD fill_colour, const struct wined3d_blt_fx *fx, enum wined3d_texture_filter_type filter)
Definition: surface.c:1600
static HRESULT WINAPI ddraw_surface1_GetCaps(IDirectDrawSurface *iface, DDSCAPS *caps)
Definition: surface.c:2588
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_Blt(IDirectDrawSurface2 *iface, RECT *dst_rect, IDirectDrawSurface2 *src_surface, RECT *src_rect, DWORD flags, DDBLTFX *fx)
Definition: surface.c:1937
static HRESULT WINAPI ddraw_surface1_Restore(IDirectDrawSurface *iface)
Definition: surface.c:3913
static HRESULT WINAPI ddraw_surface7_GetClipper(IDirectDrawSurface7 *iface, IDirectDrawClipper **clipper)
Definition: surface.c:4534
static HRESULT WINAPI ddraw_surface7_GetLOD(IDirectDrawSurface7 *iface, DWORD *MaxLOD)
Definition: surface.c:4377
static HRESULT WINAPI ddraw_surface7_GetFlipStatus(IDirectDrawSurface7 *iface, DWORD Flags)
Definition: surface.c:3391
static HRESULT WINAPI ddraw_surface1_GetBltStatus(IDirectDrawSurface *iface, DWORD flags)
Definition: surface.c:3264
static HRESULT WINAPI ddraw_surface2_UpdateOverlayDisplay(IDirectDrawSurface2 *iface, DWORD flags)
Definition: surface.c:4116
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_Flip(IDirectDrawSurface *iface, IDirectDrawSurface *src, DWORD flags)
Definition: surface.c:1376
static HRESULT WINAPI ddraw_surface2_GetDDInterface(IDirectDrawSurface2 *iface, void **ddraw)
Definition: surface.c:4279
static HRESULT WINAPI ddraw_surface4_ReleaseDC(IDirectDrawSurface4 *iface, HDC dc)
Definition: surface.c:2486
static HRESULT WINAPI ddraw_surface3_GetAttachedSurface(IDirectDrawSurface3 *iface, DDSCAPS *caps, IDirectDrawSurface3 **attachment)
Definition: surface.c:942
static HRESULT WINAPI ddraw_surface7_GetDC(IDirectDrawSurface7 *iface, HDC *dc)
Definition: surface.c:2361
static HRESULT WINAPI ddraw_surface7_SetColorKey(IDirectDrawSurface7 *iface, DWORD flags, DDCOLORKEY *color_key)
Definition: surface.c:5171
static HRESULT WINAPI ddraw_surface2_GetFlipStatus(IDirectDrawSurface2 *iface, DWORD flags)
Definition: surface.c:3426
struct ddraw_surface * unsafe_impl_from_IDirectDrawSurface7(IDirectDrawSurface7 *iface)
Definition: surface.c:5950
static HRESULT WINAPI ddraw_surface7_GetColorKey(IDirectDrawSurface7 *iface, DWORD Flags, DDCOLORKEY *CKey)
Definition: surface.c:3287
static HRESULT WINAPI ddraw_surface1_GetDC(IDirectDrawSurface *iface, HDC *dc)
Definition: surface.c:2440
static HRESULT WINAPI ddraw_surface7_GetOverlayPosition(IDirectDrawSurface7 *iface, LONG *x, LONG *y)
Definition: surface.c:3456
static HRESULT WINAPI ddraw_surface1_GetAttachedSurface(IDirectDrawSurface *iface, DDSCAPS *caps, IDirectDrawSurface **attachment)
Definition: surface.c:1004
static HRESULT WINAPI ddraw_surface2_GetBltStatus(IDirectDrawSurface2 *iface, DWORD flags)
Definition: surface.c:3255
static HRESULT WINAPI ddraw_surface2_AddAttachedSurface(IDirectDrawSurface2 *iface, IDirectDrawSurface2 *attachment)
Definition: surface.c:2118
static HRESULT WINAPI ddraw_surface1_GetColorKey(IDirectDrawSurface *iface, DWORD flags, DDCOLORKEY *color_key)
Definition: surface.c:3373
struct ddraw_surface * unsafe_impl_from_IDirect3DTexture(IDirect3DTexture *iface)
Definition: surface.c:6037
static HRESULT WINAPI ddraw_surface1_SetOverlayPosition(IDirectDrawSurface *iface, LONG x, LONG y)
Definition: surface.c:3976
static HRESULT WINAPI ddraw_surface4_EnumAttachedSurfaces(IDirectDrawSurface4 *iface, void *context, LPDDENUMSURFACESCALLBACK2 callback)
Definition: surface.c:3071
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface3_BltFast(IDirectDrawSurface3 *iface, DWORD dst_x, DWORD dst_y, IDirectDrawSurface3 *src_surface, RECT *src_rect, DWORD flags)
Definition: surface.c:4495
static HRESULT WINAPI ddraw_surface2_GetAttachedSurface(IDirectDrawSurface2 *iface, DDSCAPS *caps, IDirectDrawSurface2 **attachment)
Definition: surface.c:973
static ULONG WINAPI d3d_texture2_AddRef(IDirect3DTexture2 *iface)
Definition: surface.c:505
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_BltFast(IDirectDrawSurface7 *iface, DWORD dst_x, DWORD dst_y, IDirectDrawSurface7 *src_surface, RECT *src_rect, DWORD trans)
Definition: surface.c:4415
static HRESULT WINAPI ddraw_surface3_GetColorKey(IDirectDrawSurface3 *iface, DWORD flags, DDCOLORKEY *color_key)
Definition: surface.c:3355
static HRESULT WINAPI ddraw_surface7_SetClipper(IDirectDrawSurface7 *iface, IDirectDrawClipper *iclipper)
Definition: surface.c:4607
static const struct IDirect3DTextureVtbl d3d_texture1_vtbl
Definition: surface.c:5936
static HRESULT WINAPI ddraw_surface4_SetColorKey(IDirectDrawSurface4 *iface, DWORD flags, DDCOLORKEY *color_key)
Definition: surface.c:5183
static void ddraw_surface_cleanup(struct ddraw_surface *surface)
Definition: surface.c:564
static HRESULT WINAPI ddraw_surface7_GetPixelFormat(IDirectDrawSurface7 *iface, DDPIXELFORMAT *PixelFormat)
Definition: surface.c:3521
static HRESULT WINAPI ddraw_surface4_SetPalette(IDirectDrawSurface4 *iface, IDirectDrawPalette *palette)
Definition: surface.c:5236
static ULONG WINAPI ddraw_surface7_Release(IDirectDrawSurface7 *iface)
Definition: surface.c:687
static HRESULT WINAPI ddraw_surface1_QueryInterface(IDirectDrawSurface *iface, REFIID riid, void **object)
Definition: surface.c:352
static const struct wined3d_parent_ops ddraw_view_wined3d_parent_ops
Definition: surface.c:34
static HRESULT WINAPI ddraw_surface1_UpdateOverlayDisplay(IDirectDrawSurface *iface, DWORD flags)
Definition: surface.c:4125
static HRESULT ddraw_surface_set_color_key(struct ddraw_surface *surface, DWORD flags, DDCOLORKEY *color_key)
Definition: surface.c:5089
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface3_BltBatch(IDirectDrawSurface3 *iface, DDBLTBATCH *batch, DWORD count, DWORD flags)
Definition: surface.c:2944
static HRESULT WINAPI ddraw_surface7_GetUniquenessValue(IDirectDrawSurface7 *iface, DWORD *pValue)
Definition: surface.c:4304
static HRESULT WINAPI ddraw_surface7_QueryInterface(IDirectDrawSurface7 *iface, REFIID riid, void **obj)
Definition: surface.c:207
static HRESULT surface_lock(struct ddraw_surface *surface, RECT *rect, DDSURFACEDESC2 *surface_desc, unsigned int surface_desc_size, DWORD flags, HANDLE h)
Definition: surface.c:1051
static ULONG WINAPI d3d_texture1_Release(IDirect3DTexture *iface)
Definition: surface.c:786
static HRESULT WINAPI ddraw_surface7_SetLOD(IDirectDrawSurface7 *iface, DWORD MaxLOD)
Definition: surface.c:4335
static HRESULT WINAPI ddraw_surface4_GetColorKey(IDirectDrawSurface4 *iface, DWORD flags, DDCOLORKEY *color_key)
Definition: surface.c:3346
static HRESULT WINAPI ddraw_surface4_GetSurfaceDesc(IDirectDrawSurface4 *iface, DDSURFACEDESC2 *DDSD)
Definition: surface.c:3611
static HRESULT WINAPI ddraw_surface3_GetFlipStatus(IDirectDrawSurface3 *iface, DWORD flags)
Definition: surface.c:3417
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface7_Unlock(IDirectDrawSurface7 *iface, RECT *rect)
Definition: surface.c:1281
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface4_BltFast(IDirectDrawSurface4 *iface, DWORD dst_x, DWORD dst_y, IDirectDrawSurface4 *src_surface, RECT *src_rect, DWORD flags)
Definition: surface.c:4482
static HRESULT WINAPI ddraw_surface7_GetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette **palette)
Definition: surface.c:5021
static const struct wined3d_parent_ops ddraw_surface_wined3d_parent_ops
Definition: surface.c:32
static HRESULT ddraw_surface_set_palette(struct ddraw_surface *surface, IDirectDrawPalette *palette)
Definition: surface.c:523
static HRESULT WINAPI ddraw_surface3_GetSurfaceDesc(IDirectDrawSurface3 *iface, DDSURFACEDESC *surface_desc)
Definition: surface.c:3620
static ULONG WINAPI ddraw_surface3_AddRef(IDirectDrawSurface3 *iface)
Definition: surface.c:445
static HRESULT WINAPI ddraw_surface4_PageUnlock(IDirectDrawSurface4 *iface, DWORD flags)
Definition: surface.c:2888
static HRESULT WINAPI ddraw_surface3_AddOverlayDirtyRect(IDirectDrawSurface3 *iface, RECT *rect)
Definition: surface.c:2321
static HRESULT WINAPI ddraw_surface3_GetPixelFormat(IDirectDrawSurface3 *iface, DDPIXELFORMAT *pixel_format)
Definition: surface.c:3547
struct ddraw_surface * unsafe_impl_from_IDirectDrawSurface(IDirectDrawSurface *iface)
Definition: surface.c:6014
static HRESULT WINAPI ddraw_surface4_GetFlipStatus(IDirectDrawSurface4 *iface, DWORD flags)
Definition: surface.c:3408
static HRESULT ddraw_surface_attach_surface(struct ddraw_surface *This, struct ddraw_surface *Surf)
Definition: surface.c:1994
static void ddraw_surface_add_iface(struct ddraw_surface *surface)
Definition: surface.c:389
static HRESULT WINAPI ddraw_surface7_SetOverlayPosition(IDirectDrawSurface7 *iface, LONG x, LONG y)
Definition: surface.c:3934
static HRESULT WINAPI ddraw_surface3_GetClipper(IDirectDrawSurface3 *iface, IDirectDrawClipper **clipper)
Definition: surface.c:4568
static HRESULT WINAPI ddraw_surface7_ChangeUniquenessValue(IDirectDrawSurface7 *iface)
Definition: surface.c:4288
static HRESULT WINAPI ddraw_surface3_UpdateOverlay(IDirectDrawSurface3 *iface, RECT *src_rect, IDirectDrawSurface3 *dst_surface, RECT *dst_rect, DWORD flags, DDOVERLAYFX *fx)
Definition: surface.c:4041
static HRESULT WINAPI ddraw_gamma_control_SetGammaRamp(IDirectDrawGammaControl *iface, DWORD flags, DDGAMMARAMP *gamma_ramp)
Definition: surface.c:5352
static HRESULT CDECL ddraw_reset_enum_callback(struct wined3d_resource *resource)
Definition: surface.c:6147
static HRESULT WINAPI ddraw_surface7_EnumOverlayZOrders(IDirectDrawSurface7 *iface, DWORD Flags, void *context, LPDDENUMSURFACESCALLBACK7 cb)
Definition: surface.c:3145
struct ddraw_surface * unsafe_impl_from_IDirect3DTexture2(IDirect3DTexture2 *iface)
Definition: surface.c:6030
static HRESULT WINAPI ddraw_surface3_GetPalette(IDirectDrawSurface3 *iface, IDirectDrawPalette **palette)
Definition: surface.c:5062
static ULONG WINAPI ddraw_surface1_AddRef(IDirectDrawSurface *iface)
Definition: surface.c:475
static HRESULT WINAPI ddraw_surface4_GetPalette(IDirectDrawSurface4 *iface, IDirectDrawPalette **palette)
Definition: surface.c:5053
static HRESULT WINAPI ddraw_surface3_EnumAttachedSurfaces(IDirectDrawSurface3 *iface, void *context, LPDDENUMSURFACESCALLBACK callback)
Definition: surface.c:3086
static HRESULT WINAPI ddraw_surface3_ReleaseDC(IDirectDrawSurface3 *iface, HDC dc)
Definition: surface.c:2495
static HRESULT WINAPI d3d_texture1_Load(IDirect3DTexture *iface, IDirect3DTexture *src_texture)
Definition: surface.c:5648
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface2_BltBatch(IDirectDrawSurface2 *iface, DDBLTBATCH *batch, DWORD count, DWORD flags)
Definition: surface.c:2953
static HRESULT WINAPI ddraw_surface7_GetCaps(IDirectDrawSurface7 *iface, DDSCAPS2 *Caps)
Definition: surface.c:2535
static HRESULT ddraw_surface_blt(struct ddraw_surface *dst_surface, const RECT *dst_rect, struct ddraw_surface *src_surface, const RECT *src_rect, DWORD flags, DWORD fill_colour, const struct wined3d_blt_fx *fx, enum wined3d_texture_filter_type filter)
Definition: surface.c:1537
static HRESULT WINAPI ddraw_surface7_SetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette *palette)
Definition: surface.c:5219
static HRESULT WINAPI ddraw_surface4_GetPixelFormat(IDirectDrawSurface4 *iface, DDPIXELFORMAT *pixel_format)
Definition: surface.c:3538
static HRESULT WINAPI d3d_texture2_GetHandle(IDirect3DTexture2 *iface, IDirect3DDevice2 *device, D3DTEXTUREHANDLE *handle)
Definition: surface.c:5440
static HRESULT WINAPI ddraw_surface4_Restore(IDirectDrawSurface4 *iface)
Definition: surface.c:3886
static HRESULT WINAPI ddraw_surface7_IsLost(IDirectDrawSurface7 *iface)
Definition: surface.c:3766
static HRESULT WINAPI ddraw_surface4_GetPrivateData(IDirectDrawSurface4 *iface, REFGUID tag, void *data, DWORD *size)
Definition: surface.c:2770
static ULONG WINAPI ddraw_surface7_AddRef(IDirectDrawSurface7 *iface)
Definition: surface.c:415
static HRESULT WINAPI ddraw_surface4_GetUniquenessValue(IDirectDrawSurface4 *iface, DWORD *pValue)
Definition: surface.c:4313
static struct IDirectDrawSurface7Vtbl ddraw_surface7_vtbl
Definition: surface.c:5664
static HRESULT ddraw_surface_lock_ddsd(struct ddraw_surface *surface, RECT *rect, DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h)
Definition: surface.c:1205
static HRESULT WINAPI ddraw_surface2_SetPalette(IDirectDrawSurface2 *iface, IDirectDrawPalette *palette)
Definition: surface.c:5266
static HRESULT WINAPI ddraw_surface7_UpdateOverlayZOrder(IDirectDrawSurface7 *iface, DWORD flags, IDirectDrawSurface7 *reference)
Definition: surface.c:4147
static HRESULT WINAPI d3d_texture1_Unload(IDirect3DTexture *iface)
Definition: surface.c:5420
static struct ddraw_surface * unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface)
Definition: surface.c:5982
static HRESULT WINAPI d3d_texture2_QueryInterface(IDirect3DTexture2 *iface, REFIID riid, void **object)
Definition: surface.c:371
static HRESULT WINAPI ddraw_surface4_FreePrivateData(IDirectDrawSurface4 *iface, REFGUID tag)
Definition: surface.c:2813
static HRESULT WINAPI ddraw_surface3_SetPalette(IDirectDrawSurface3 *iface, IDirectDrawPalette *palette)
Definition: surface.c:5251
static HRESULT CALLBACK EnumCallback(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *surface_desc, void *context)
Definition: surface.c:3058
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface4_BltBatch(IDirectDrawSurface4 *iface, DDBLTBATCH *batch, DWORD count, DWORD flags)
Definition: surface.c:2935
static HRESULT WINAPI ddraw_surface3_IsLost(IDirectDrawSurface3 *iface)
Definition: surface.c:3784
static HRESULT WINAPI ddraw_surface1_SetPalette(IDirectDrawSurface *iface, IDirectDrawPalette *palette)
Definition: surface.c:5281
static HRESULT WINAPI ddraw_surface1_GetPalette(IDirectDrawSurface *iface, IDirectDrawPalette **palette)
Definition: surface.c:5080
static void STDMETHODCALLTYPE ddraw_surface_wined3d_object_destroyed(void *parent)
Definition: surface.c:6044
static HRESULT WINAPI ddraw_surface3_SetColorKey(IDirectDrawSurface3 *iface, DWORD flags, DDCOLORKEY *color_key)
Definition: surface.c:5192
static HRESULT WINAPI d3d_texture1_QueryInterface(IDirect3DTexture *iface, REFIID riid, void **object)
Definition: surface.c:380
static HRESULT WINAPI ddraw_surface3_GetDDInterface(IDirectDrawSurface3 *iface, void **ddraw)
Definition: surface.c:4270
static HRESULT WINAPI ddraw_surface4_Initialize(IDirectDrawSurface4 *iface, IDirectDraw *ddraw, DDSURFACEDESC2 *surface_desc)
Definition: surface.c:3686
static HRESULT WINAPI ddraw_surface2_GetCaps(IDirectDrawSurface2 *iface, DDSCAPS *caps)
Definition: surface.c:2573
static HRESULT WINAPI ddraw_surface7_FreePrivateData(IDirectDrawSurface7 *iface, REFGUID tag)
Definition: surface.c:2792
static HRESULT WINAPI ddraw_surface1_GetFlipStatus(IDirectDrawSurface *iface, DWORD flags)
Definition: surface.c:3435
static HRESULT WINAPI ddraw_gamma_control_QueryInterface(IDirectDrawGammaControl *iface, REFIID riid, void **object)
Definition: surface.c:361
static HRESULT WINAPI ddraw_surface2_GetColorKey(IDirectDrawSurface2 *iface, DWORD flags, DDCOLORKEY *color_key)
Definition: surface.c:3364
static HRESULT WINAPI ddraw_surface2_Initialize(IDirectDrawSurface2 *iface, IDirectDraw *ddraw, DDSURFACEDESC *surface_desc)
Definition: surface.c:3710
static HRESULT WINAPI ddraw_surface2_GetPalette(IDirectDrawSurface2 *iface, IDirectDrawPalette **palette)
Definition: surface.c:5071
static HRESULT WINAPI ddraw_surface7_GetPrivateData(IDirectDrawSurface7 *iface, REFGUID tag, void *data, DWORD *size)
Definition: surface.c:2728
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface1_BltBatch(IDirectDrawSurface *iface, DDBLTBATCH *batch, DWORD count, DWORD flags)
Definition: surface.c:2962
static void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx)
Definition: surface.c:6089
static ULONG WINAPI ddraw_surface2_AddRef(IDirectDrawSurface2 *iface)
Definition: surface.c:460
static struct IDirectDrawSurface2Vtbl ddraw_surface2_vtbl
Definition: surface.c:5828
static HRESULT WINAPI ddraw_surface2_SetClipper(IDirectDrawSurface2 *iface, IDirectDrawClipper *clipper)
Definition: surface.c:4673
static HRESULT WINAPI ddraw_surface1_IsLost(IDirectDrawSurface *iface)
Definition: surface.c:3802
static HRESULT WINAPI ddraw_surface1_ReleaseDC(IDirectDrawSurface *iface, HDC dc)
Definition: surface.c:2513
static BOOL ddraw_surface_is_lost(const struct ddraw_surface *surface)
Definition: surface.c:41
static HRESULT WINAPI ddraw_surface7_SetSurfaceDesc(IDirectDrawSurface7 *iface, DDSURFACEDESC2 *DDSD, DWORD Flags)
Definition: surface.c:4729
static HRESULT WINAPI ddraw_surface7_PageLock(IDirectDrawSurface7 *iface, DWORD Flags)
Definition: surface.c:2834
static HRESULT WINAPI ddraw_surface2_SetColorKey(IDirectDrawSurface2 *iface, DWORD flags, DDCOLORKEY *color_key)
Definition: surface.c:5201
static HRESULT WINAPI ddraw_surface7_GetPriority(IDirectDrawSurface7 *iface, DWORD *priority)
Definition: surface.c:2634
static HRESULT WINAPI ddraw_surface1_AddOverlayDirtyRect(IDirectDrawSurface *iface, RECT *rect)
Definition: surface.c:2339
static HRESULT WINAPI ddraw_surface4_AddOverlayDirtyRect(IDirectDrawSurface4 *iface, RECT *rect)
Definition: surface.c:2312
static HRESULT WINAPI ddraw_surface4_GetOverlayPosition(IDirectDrawSurface4 *iface, LONG *x, LONG *y)
Definition: surface.c:3471
static HRESULT WINAPI ddraw_gamma_control_GetGammaRamp(IDirectDrawGammaControl *iface, DWORD flags, DDGAMMARAMP *gamma_ramp)
Definition: surface.c:5310
static HRESULT WINAPI ddraw_surface7_EnumAttachedSurfaces(IDirectDrawSurface7 *iface, void *context, LPDDENUMSURFACESCALLBACK7 cb)
Definition: surface.c:2985
static HRESULT WINAPI DECLSPEC_HOTPATCH ddraw_surface3_Unlock(IDirectDrawSurface3 *iface, void *data)
Definition: surface.c:1299
static HRESULT WINAPI ddraw_surface4_GetBltStatus(IDirectDrawSurface4 *iface, DWORD flags)
Definition: surface.c:3237
static HRESULT WINAPI d3d_texture1_GetHandle(IDirect3DTexture *iface, IDirect3DDevice *device, D3DTEXTUREHANDLE *handle)
Definition: surface.c:5470
static HRESULT WINAPI ddraw_surface2_GetDC(IDirectDrawSurface2 *iface, HDC *dc)
Definition: surface.c:2431
static HRESULT WINAPI ddraw_surface3_DeleteAttachedSurface(IDirectDrawSurface3 *iface, DWORD flags, IDirectDrawSurface3 *attachment)
Definition: surface.c:2260
static HRESULT WINAPI ddraw_surface7_Initialize(IDirectDrawSurface7 *iface, IDirectDraw *ddraw, DDSURFACEDESC2 *surface_desc)
Definition: surface.c:3678
static HRESULT WINAPI ddraw_surface7_GetBltStatus(IDirectDrawSurface7 *iface, DWORD Flags)
Definition: surface.c:3222
static HRESULT WINAPI d3d_texture2_PaletteChanged(IDirect3DTexture2 *iface, DWORD start, DWORD count)
Definition: surface.c:5394
static HRESULT WINAPI ddraw_surface4_ChangeUniquenessValue(IDirectDrawSurface4 *iface)
Definition: surface.c:4295
static HRESULT WINAPI ddraw_surface2_AddOverlayDirtyRect(IDirectDrawSurface2 *iface, RECT *rect)
Definition: surface.c:2330
static HRESULT WINAPI ddraw_surface7_Restore(IDirectDrawSurface7 *iface)
Definition: surface.c:3821
static HRESULT WINAPI ddraw_surface7_GetAttachedSurface(IDirectDrawSurface7 *iface, DDSCAPS2 *caps, IDirectDrawSurface7 **surface)
Definition: surface.c:822
static HRESULT WINAPI ddraw_surface2_GetOverlayPosition(IDirectDrawSurface2 *iface, LONG *x, LONG *y)
Definition: surface.c:3489
static HRESULT WINAPI ddraw_surface3_SetOverlayPosition(IDirectDrawSurface3 *iface, LONG x, LONG y)
Definition: surface.c:3958
static HRESULT WINAPI ddraw_surface3_QueryInterface(IDirectDrawSurface3 *iface, REFIID riid, void **object)
Definition: surface.c:334
static BOOL surface_validate_lock_desc(struct ddraw_surface *surface, const DDSURFACEDESC *desc, unsigned int *size)
Definition: surface.c:1136
static HRESULT WINAPI ddraw_surface7_GetDDInterface(IDirectDrawSurface7 *iface, void **DD)
Definition: surface.c:4228
static HRESULT WINAPI ddraw_surface4_SetClipper(IDirectDrawSurface4 *iface, IDirectDrawClipper *clipper)
Definition: surface.c:4655
static HRESULT WINAPI ddraw_surface4_SetPrivateData(IDirectDrawSurface4 *iface, REFGUID tag, void *data, DWORD size, DWORD flags)
Definition: surface.c:2702
HRESULT CDECL wined3d_device_context_set_rendertarget_views(struct wined3d_device_context *context, unsigned int start_idx, unsigned int count, struct wined3d_rendertarget_view *const *views, BOOL set_viewport)
Definition: device.c:2377
struct wined3d_rendertarget_view *CDECL wined3d_device_context_get_depth_stencil_view(const struct wined3d_device_context *context)
Definition: device.c:4676
ULONG CDECL wined3d_device_decref(struct wined3d_device *device)
Definition: device.c:251
HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, const struct wined3d_swapchain_desc *swapchain_desc, const struct wined3d_display_mode *mode, wined3d_device_reset_cb callback, BOOL reset_state)
Definition: device.c:4970
struct wined3d_rendertarget_view *CDECL wined3d_device_context_get_rendertarget_view(const struct wined3d_device_context *context, unsigned int view_idx)
Definition: device.c:4659
void CDECL wined3d_device_set_gamma_ramp(const struct wined3d_device *device, UINT swapchain_idx, uint32_t flags, const struct wined3d_gamma_ramp *ramp)
Definition: device.c:5289
HRESULT CDECL wined3d_device_context_clear_rendertarget_view(struct wined3d_device_context *context, struct wined3d_rendertarget_view *view, const RECT *rect, unsigned int flags, const struct wined3d_color *color, float depth, unsigned int stencil)
Definition: device.c:4468
void CDECL wined3d_device_get_gamma_ramp(const struct wined3d_device *device, UINT swapchain_idx, struct wined3d_gamma_ramp *ramp)
Definition: device.c:5301
ULONG CDECL wined3d_device_incref(struct wined3d_device *device)
Definition: device.c:161
HRESULT CDECL wined3d_device_context_set_depth_stencil_view(struct wined3d_device_context *context, struct wined3d_rendertarget_view *view)
Definition: device.c:2453
void CDECL wined3d_palette_apply_to_dc(const struct wined3d_palette *palette, HDC dc)
Definition: palette.c:91
unsigned int CDECL wined3d_resource_set_priority(struct wined3d_resource *resource, unsigned int priority)
Definition: resource.c:247
unsigned int CDECL wined3d_resource_get_priority(const struct wined3d_resource *resource)
Definition: resource.c:263
HRESULT CDECL wined3d_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx)
Definition: resource.c:304
void CDECL wined3d_resource_get_desc(const struct wined3d_resource *resource, struct wined3d_resource_desc *desc)
Definition: resource.c:280
HRESULT CDECL wined3d_resource_map(struct wined3d_resource *resource, unsigned int sub_resource_idx, struct wined3d_map_desc *map_desc, const struct wined3d_box *box, uint32_t flags)
Definition: resource.c:295
void CDECL wined3d_resource_set_parent(struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: resource.c:274
HRESULT CDECL wined3d_texture_get_overlay_position(const struct wined3d_texture *texture, unsigned int sub_resource_idx, LONG *x, LONG *y)
Definition: texture.c:3915
void *CDECL wined3d_texture_get_parent(const struct wined3d_texture *texture)
Definition: texture.c:1690
HRESULT CDECL wined3d_texture_get_dc(struct wined3d_texture *texture, unsigned int sub_resource_idx, HDC *dc)
Definition: texture.c:4243
HRESULT CDECL wined3d_texture_get_sub_resource_desc(const struct wined3d_texture *texture, unsigned int sub_resource_idx, struct wined3d_sub_resource_desc *desc)
Definition: texture.c:4055
HRESULT CDECL wined3d_texture_set_color_key(struct wined3d_texture *texture, uint32_t flags, const struct wined3d_color_key *color_key)
Definition: texture.c:1753
unsigned int CDECL wined3d_texture_get_lod(const struct wined3d_texture *texture)
Definition: texture.c:1715
HRESULT CDECL wined3d_texture_create(struct wined3d_device *device, const struct wined3d_resource_desc *desc, UINT layer_count, UINT level_count, uint32_t flags, const struct wined3d_sub_resource_data *data, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture)
Definition: texture.c:4158
HRESULT CDECL wined3d_texture_update_overlay(struct wined3d_texture *texture, unsigned int sub_resource_idx, const RECT *src_rect, struct wined3d_texture *dst_texture, unsigned int dst_sub_resource_idx, const RECT *dst_rect, uint32_t flags)
Definition: texture.c:3963
void CDECL wined3d_texture_set_sub_resource_parent(struct wined3d_texture *texture, unsigned int sub_resource_idx, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: texture.c:4043
void *CDECL wined3d_texture_get_sub_resource_parent(struct wined3d_texture *texture, unsigned int sub_resource_idx)
Definition: texture.c:4033
struct wined3d_resource *CDECL wined3d_texture_get_resource(struct wined3d_texture *texture)
Definition: texture.c:1649
ULONG CDECL wined3d_texture_decref(struct wined3d_texture *texture)
Definition: texture.c:1606
HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, unsigned int sub_resource_idx, void *mem, unsigned int pitch)
Definition: texture.c:1868
ULONG CDECL wined3d_texture_incref(struct wined3d_texture *texture)
Definition: texture.c:1516
HRESULT CDECL wined3d_texture_release_dc(struct wined3d_texture *texture, unsigned int sub_resource_idx, HDC dc)
Definition: texture.c:4291
UINT CDECL wined3d_texture_get_level_count(const struct wined3d_texture *texture)
Definition: texture.c:1746
HRESULT CDECL wined3d_device_context_blt(struct wined3d_device_context *context, struct wined3d_texture *dst_texture, unsigned int dst_sub_resource_idx, const RECT *dst_rect, struct wined3d_texture *src_texture, unsigned int src_sub_resource_idx, const RECT *src_rect, unsigned int flags, const struct wined3d_blt_fx *fx, enum wined3d_texture_filter_type filter)
Definition: texture.c:3854
HRESULT CDECL wined3d_texture_set_overlay_position(struct wined3d_texture *texture, unsigned int sub_resource_idx, LONG x, LONG y)
Definition: texture.c:3943
unsigned int CDECL wined3d_texture_set_lod(struct wined3d_texture *texture, unsigned int lod)
Definition: texture.c:1722
void CDECL wined3d_texture_get_pitch(const struct wined3d_texture *texture, unsigned int level, unsigned int *row_pitch, unsigned int *slice_pitch)
Definition: texture.c:1697
HRESULT CDECL wined3d_rendertarget_view_create_from_sub_resource(struct wined3d_texture *texture, unsigned int sub_resource_idx, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_rendertarget_view **view)
Definition: view.c:946
void CDECL wined3d_rendertarget_view_set_parent(struct wined3d_rendertarget_view *view, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: view.c:421
ULONG CDECL wined3d_rendertarget_view_incref(struct wined3d_rendertarget_view *view)
Definition: view.c:365
ULONG CDECL wined3d_rendertarget_view_decref(struct wined3d_rendertarget_view *view)
Definition: view.c:379
#define CDECL
Definition: compat.h:29
#define TRACE_(x)
Definition: compat.h:76
#define TRACE_ON(x)
Definition: compat.h:75
#define WINE_DECLARE_DEBUG_CHANNEL(x)
Definition: compat.h:45
#define CALLBACK
Definition: compat.h:35
static const WCHAR version[]
Definition: asmname.c:66
ULONG WINAPI DECLSPEC_HOTPATCH GetTickCount(void)
Definition: sync.c:182
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
#define assert(_expr)
Definition: assert.h:32
#define DD(x)
#define DDPF_FOURCC
Definition: ddsformat.c:58
#define DDSCAPS2_CUBEMAP
Definition: ddsformat.c:64
static VOID BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Height *Stride) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Stride)
Definition: common.c:42
return ret
Definition: mutex.c:147
r parent
Definition: btrfs.c:3010
void DDSURFACEDESC
Definition: amvideo.idl:25
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
PWCHAR pValue
INT PixelFormat
GLuint start
Definition: gl.h:1545
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLdouble s
Definition: gl.h:2039
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLint GLint GLsizei width
Definition: gl.h:1546
GLenum GLuint texture
Definition: glext.h:6295
GLenum src
Definition: glext.h:6340
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLenum mode
Definition: glext.h:6217
GLint reference
Definition: glext.h:11729
GLint left
Definition: glext.h:7726
GLenum GLenum dst
Definition: glext.h:6340
GLbitfield flags
Definition: glext.h:7161
GLsizei levels
Definition: glext.h:7884
GLenum attachment
Definition: glext.h:6295
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
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 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 * u
Definition: glfuncs.h:240
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 GLint GLint j
Definition: glfuncs.h:250
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
#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
#define resource
Definition: kernel32.h:9
#define debugstr_guid
Definition: kernel32.h:35
if(dx< 0)
Definition: linetemp.h:194
__u16 time
Definition: mkdosfs.c:8
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
struct task_struct * current
Definition: linux.c:32
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:88
static IPrintDialogCallback callback
Definition: printdlg.c:325
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
static const LARGE_INTEGER *static const HANDLE const LARGE_INTEGER *static PSLIST_ENTRY PSLIST_ENTRY last
Definition: sync.c:64
static float(__cdecl *square_half_float)(float x
static HPALETTE palette
Definition: clipboard.c:1457
static UINT format_id
Definition: clipboard.c:1455
static int priority
Definition: timer.c:163
#define min(a, b)
Definition: monoChain.cc:55
int Count
Definition: noreturn.cpp:7
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
@ Batch
Definition: ntsecapi.h:291
DWORD IDirectDrawSurface7
Definition: vmrender.idl:20
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
BOOL WINAPI RedrawWindow(_In_opt_ HWND, _In_opt_ LPCRECT, _In_opt_ HRGN, _In_ UINT)
HWND WINAPI GetForegroundWindow(void)
Definition: ntwrapper.h:392
BOOL WINAPI IsRectEmpty(_In_ LPCRECT)
#define RDW_ERASE
Definition: winuser.h:1222
#define RDW_FRAME
Definition: winuser.h:1223
HDC WINAPI GetDC(_In_opt_ HWND)
BOOL WINAPI SetRectEmpty(_Out_ LPRECT)
#define RDW_INVALIDATE
Definition: winuser.h:1225
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
#define calloc
Definition: rosglue.h:14
#define DDBLT_COLORFILL
Definition: ddraw.h:557
#define DDFLIP_INTERVAL4
Definition: ddraw.h:593
#define DDPCAPS_PRIMARYSURFACE
Definition: ddraw.h:458
#define DDSD_WIDTH
Definition: ddraw.h:212
#define DDSCAPS2_CUBEMAP_NEGATIVEZ
Definition: ddraw.h:298
#define DDSCAPS_FRONTBUFFER
Definition: ddraw.h:256
#define DDSCAPS_ALLOCONLOAD
Definition: ddraw.h:276
#define DDERR_NOTAOVERLAYSURFACE
Definition: ddraw.h:156
#define DDSCAPS_ZBUFFER
Definition: ddraw.h:269
#define DDCKEY_COLORSPACE
Definition: ddraw.h:477
#define DDSCAPS2_CUBEMAP_ALLFACES
Definition: ddraw.h:299
#define DDBLT_ZBUFFERDESTOVERRIDE
Definition: ddraw.h:568
#define DDSD_PIXELFORMAT
Definition: ddraw.h:218
#define DDSCAPS_OVERLAY
Definition: ddraw.h:258
#define DDSCAPS_VISIBLE
Definition: ddraw.h:267
#define DDERR_INVALIDRECT
Definition: ddraw.h:83
#define DDSD_PITCH
Definition: ddraw.h:213
#define DDBLT_KEYDESTOVERRIDE
Definition: ddraw.h:561
#define DDBLT_ZBUFFERDESTCONSTOVERRIDE
Definition: ddraw.h:567
struct _DDSURFACEDESC2 DDSURFACEDESC2
#define DDSD_MIPMAPCOUNT
Definition: ddraw.h:223
#define DDERR_INVALIDPIXELFORMAT
Definition: ddraw.h:82
#define DDBLT_ALPHAEDGEBLEND
Definition: ddraw.h:551
#define DDLOCK_READONLY
Definition: ddraw.h:626
#define DDERR_NOTFLIPPABLE
Definition: ddraw.h:158
#define DDSCAPS2_CUBEMAP_POSITIVEX
Definition: ddraw.h:293
#define DDSCAPS_MIPMAP
Definition: ddraw.h:274
#define DDERR_NODC
Definition: ddraw.h:162
#define DDBLT_ALPHASRC
Definition: ddraw.h:552
#define DDERR_WRONGMODE
Definition: ddraw.h:163
#define DDSD_HEIGHT
Definition: ddraw.h:211
#define DDSCAPS_PRIMARYSURFACE
Definition: ddraw.h:260
#define DDBLTFAST_WAIT
Definition: ddraw.h:582
#define DDERR_INVALIDCAPS
Definition: ddraw.h:77
#define DDERR_INVALIDOBJECT
Definition: ddraw.h:80
#define DDERR_CANNOTATTACHSURFACE
Definition: ddraw.h:70
#define DDFLIP_INTERVAL3
Definition: ddraw.h:592
#define DDBLT_ZBUFFERSRCCONSTOVERRIDE
Definition: ddraw.h:569
#define DDSCAPS_WRITEONLY
Definition: ddraw.h:268
#define DDBLT_ALPHADESTSURFACEOVERRIDE
Definition: ddraw.h:550
#define DDSD_CKDESTOVERLAY
Definition: ddraw.h:219
#define DDBLT_ROP
Definition: ddraw.h:564
#define DDERR_NOTFOUND
Definition: ddraw.h:99
#define DDERR_SURFACELOST
Definition: ddraw.h:124
#define DDBLT_ZBUFFERSRCOVERRIDE
Definition: ddraw.h:570
#define DDERR_NOOVERLAYHW
Definition: ddraw.h:100
#define DDSCL_EXCLUSIVE
Definition: ddraw.h:538
HRESULT(WINAPI * LPDDENUMSURFACESCALLBACK)(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, LPVOID)
Definition: ddraw.h:1262
#define DDSCAPS2_MIPMAPSUBLEVEL
Definition: ddraw.h:306
#define DDCKEY_SRCOVERLAY
Definition: ddraw.h:481
#define DDBLT_ALPHADEST
Definition: ddraw.h:547
#define DDCKEY_DESTOVERLAY
Definition: ddraw.h:479
HRESULT(WINAPI * LPDDENUMSURFACESCALLBACK2)(LPDIRECTDRAWSURFACE4, LPDDSURFACEDESC2, LPVOID)
Definition: ddraw.h:1263
#define DDERR_NOEXCLUSIVEMODE
Definition: ddraw.h:95
#define DDBLTFAST_SRCCOLORKEY
Definition: ddraw.h:580
#define DDERR_OUTOFMEMORY
Definition: ddraw.h:113
#define DDSCAPS2_D3DTEXTUREMANAGE
Definition: ddraw.h:307
#define DDSCAPS_OFFSCREENPLAIN
Definition: ddraw.h:257
#define DDFLIP_NOVSYNC
Definition: ddraw.h:588
#define DDERR_CANTCREATEDC
Definition: ddraw.h:161
#define DDERR_NOPALETTEATTACHED
Definition: ddraw.h:148
#define DDENUMRET_CANCEL
Definition: ddraw.h:190
#define DDERR_MOREDATA
Definition: ddraw.h:178
#define DDSD_CKSRCBLT
Definition: ddraw.h:222
#define DDCKEY_DESTBLT
Definition: ddraw.h:478
#define DDERR_NOCOLORKEY
Definition: ddraw.h:92
#define DDERR_OUTOFVIDEOMEMORY
Definition: ddraw.h:114
#define DD_OK
Definition: ddraw.h:188
#define DDBLTFAST_DESTCOLORKEY
Definition: ddraw.h:581
#define DDERR_SURFACENOTATTACHED
Definition: ddraw.h:125
#define DDSCAPS_FLIP
Definition: ddraw.h:255
#define DDERR_NOTONMIPMAPSUBLEVEL
Definition: ddraw.h:172
#define DDSCAPS_BACKBUFFER
Definition: ddraw.h:253
#define DDBLT_ALPHASRCNEG
Definition: ddraw.h:554
#define DDFLIP_INTERVAL2
Definition: ddraw.h:591
#define DDSCAPS2_CUBEMAP_NEGATIVEY
Definition: ddraw.h:296
#define DDERR_NOCOLORKEYHW
Definition: ddraw.h:93
#define DDERR_UNSUPPORTED
Definition: ddraw.h:129
#define DDSCAPS_3DDEVICE
Definition: ddraw.h:265
#define DDSD_LINEARSIZE
Definition: ddraw.h:225
#define DDCKEY_SRCBLT
Definition: ddraw.h:480
HRESULT(WINAPI * LPDDENUMSURFACESCALLBACK7)(LPDIRECTDRAWSURFACE7, LPDDSURFACEDESC2, LPVOID)
Definition: ddraw.h:1264
#define DDBLT_KEYSRC
Definition: ddraw.h:562
#define DDSCAPS2_CUBEMAP_POSITIVEY
Definition: ddraw.h:295
#define DDBLT_ZBUFFER
Definition: ddraw.h:566
#define DDSCAPS2_CUBEMAP_NEGATIVEX
Definition: ddraw.h:294
#define DDERR_NOCLIPPERATTACHED
Definition: ddraw.h:144
#define DDSCAPS2_TEXTUREMANAGE
Definition: ddraw.h:287
#define DDPCAPS_ALPHA
Definition: ddraw.h:464
#define DDSCAPS2_CUBEMAP_POSITIVEZ
Definition: ddraw.h:297
#define DDBLT_DDROPS
Definition: ddraw.h:559
#define DDERR_INVALIDPARAMS
Definition: ddraw.h:81
#define DDSCAPS_TEXTURE
Definition: ddraw.h:264
#define DDSCAPS_VIDEOMEMORY
Definition: ddraw.h:266
#define DDERR_DCALREADYCREATED
Definition: ddraw.h:173
#define DDBLT_KEYSRCOVERRIDE
Definition: ddraw.h:563
#define DDSCAPS_LOCALVIDMEM
Definition: ddraw.h:278
#define DDSD_CAPS
Definition: ddraw.h:210
#define DDBLT_ALPHADESTNEG
Definition: ddraw.h:549
#define DDSD_CKDESTBLT
Definition: ddraw.h:220
#define DDERR_NORASTEROPHW
Definition: ddraw.h:102
#define DDERR_SURFACEALREADYATTACHED
Definition: ddraw.h:119
#define DDSCAPS_OWNDC
Definition: ddraw.h:270
#define DDERR_ALREADYINITIALIZED
Definition: ddraw.h:69
#define DDERR_CANNOTDETACHSURFACE
Definition: ddraw.h:71
#define DDERR_SURFACEBUSY
Definition: ddraw.h:121
#define DDBLTFAST_DONOTWAIT
Definition: ddraw.h:583
#define DDERR_NODIRECTDRAWHW
Definition: ddraw.h:139
#define DDBLT_ASYNC
Definition: ddraw.h:556
#define DDSCAPS_SYSTEMMEMORY
Definition: ddraw.h:263
#define DDBLT_ALPHADESTCONSTOVERRIDE
Definition: ddraw.h:548
#define DDSD_BACKBUFFERCOUNT
Definition: ddraw.h:214
#define DDBLT_ALPHASRCCONSTOVERRIDE
Definition: ddraw.h:553
#define DDBLT_KEYDEST
Definition: ddraw.h:560
#define DDERR_INVALIDSURFACETYPE
Definition: ddraw.h:168
#define DDBLT_DEPTHFILL
Definition: ddraw.h:572
#define DDBLT_ALPHASRCSURFACEOVERRIDE
Definition: ddraw.h:555
#define DDERR_BLTFASTCANTCLIP
Definition: ddraw.h:150
#define DDSCAPS_COMPLEX
Definition: ddraw.h:254
#define DDSD_CKSRCOVERLAY
Definition: ddraw.h:221
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:236
#define TRACE(s)
Definition: solgame.cpp:4
Definition: dcommon.idl:28
long bottom
Definition: dcommon.idl:29
long right
Definition: dcommon.idl:29
long left
Definition: dcommon.idl:29
long top
Definition: dcommon.idl:29
DWORD dwFillColor
Definition: ddraw.h:1312
DWORD dwSize
Definition: ddraw.h:1072
DWORD dwRGBBitCount
Definition: ddraw.h:1077
DWORD dwFlags
Definition: ddraw.h:1073
DWORD dwCaps4
Definition: ddraw.h:739
DWORD dwCaps3
Definition: ddraw.h:736
DWORD dwCaps2
Definition: ddraw.h:735
DWORD dwCaps
Definition: ddraw.h:734
DWORD dwCaps
Definition: ddraw.h:729
DWORD dwWidth
Definition: ddraw.h:1157
DWORD dwHeight
Definition: ddraw.h:1156
DDSCAPS2 ddsCaps
Definition: ddraw.h:1190
DDPIXELFORMAT ddpfPixelFormat
Definition: ddraw.h:1187
DWORD dwLinearSize
Definition: ddraw.h:1161
DDCOLORKEY ddckCKDestOverlay
Definition: ddraw.h:1179
DDCOLORKEY ddckCKSrcOverlay
Definition: ddraw.h:1183
DDCOLORKEY ddckCKDestBlt
Definition: ddraw.h:1182
DWORD dwFlags
Definition: ddraw.h:1155
DDCOLORKEY ddckCKSrcBlt
Definition: ddraw.h:1184
LPVOID lpSurface
Definition: ddraw.h:1176
DWORD dwMipMapCount
Definition: ddraw.h:1170
DWORD dwSize
Definition: ddraw.h:1154
Definition: scsiwmi.h:51
RGNDATAHEADER rdh
Definition: axextend.idl:401
char Buffer[1]
Definition: axextend.idl:402
Definition: palette.c:466
void * context
Definition: surface.c:3038
LPDDENUMSURFACESCALLBACK2 callback
Definition: surface.c:3037
LPDDENUMSURFACESCALLBACK callback
Definition: surface.c:3043
void * context
Definition: main.c:46
Definition: http.c:7252
IDirect3DDevice2 IDirect3DDevice2_iface
struct list ddraw_entry
IDirectDrawClipper IDirectDrawClipper_iface
struct wined3d_palette * wined3d_palette
IDirectDrawPalette IDirectDrawPalette_iface
IDirectDrawSurface IDirectDrawSurface_iface
struct wined3d_texture * draw_texture
IDirectDrawSurface2 IDirectDrawSurface2_iface
struct ddraw * ddraw
struct ddraw_clipper * clipper
IDirectDrawGammaControl IDirectDrawGammaControl_iface
DDSURFACEDESC2 surface_desc
unsigned int sysmem_fallback
unsigned int is_root
IUnknown * texture_outer
IUnknown * attached_iface
struct wined3d_private_store private_store
IDirectDrawSurface3 IDirectDrawSurface3_iface
struct ddraw_surface * first_attached
struct wined3d_rendertarget_view * wined3d_rtv
unsigned int sub_resource_idx
IDirect3DTexture IDirect3DTexture_iface
struct d3d_device * device1
struct ddraw_palette * palette
IDirectDrawSurface7 IDirectDrawSurface7_iface
struct ddraw_surface * next_attached
struct list surface_list_entry
IUnknown * ifaceToRelease
IDirectDrawSurface4 IDirectDrawSurface4_iface
struct ddraw_surface * complex_array[MAX_COMPLEX_ATTACHED]
unsigned int is_lost
unsigned int texture_location
struct wined3d_texture * wined3d_texture
IDirect3DTexture2 IDirect3DTexture2_iface
struct ddraw_surface * root
void * texture_memory
DDSURFACEDESC2 surface_desc
struct wined3d_texture * gdi_surface
DWORD flags
struct ddraw_surface * primary
struct wined3d_device * wined3d_device
Definition: ddraw_private.h:99
DWORD prev_frame_time
struct wined3d_device_context * immediate_context
unsigned int frames
DWORD cooperative_level
struct wined3d_swapchain * wined3d_swapchain
struct list surface_list
HWND swapchain_window
struct wined3d_output * wined3d_output
Definition: ddraw_private.h:98
struct wined3d * wined3d
Definition: ddraw_private.h:96
struct wined3d_adapter * wined3d_adapter
Definition: ddraw_private.h:97
Definition: devices.h:37
Definition: filter.c:165
Definition: ecma_167.h:138
uint32_t fx
Definition: wined3d.h:2018
struct wined3d_color_key src_color_key
Definition: wined3d.h:2020
struct wined3d_color_key dst_color_key
Definition: wined3d.h:2019
union wined3d_private_data::@4825 content
unsigned int size
Definition: wined3d.h:1801
enum wined3d_resource_type resource_type
Definition: wined3d.h:1791
unsigned int width
Definition: wined3d.h:1798
unsigned int height
Definition: wined3d.h:1799
enum wined3d_multisample_type multisample_type
Definition: wined3d.h:1793
unsigned int multisample_quality
Definition: wined3d.h:1794
unsigned int bind_flags
Definition: wined3d.h:1796
unsigned int usage
Definition: wined3d.h:1795
unsigned int depth
Definition: wined3d.h:1800
enum wined3d_format_id format
Definition: wined3d.h:1792
unsigned int access
Definition: wined3d.h:1797
enum wined3d_format_id format
Definition: wined3d.h:1806
unsigned int backbuffer_height
Definition: wined3d.h:1773
unsigned int backbuffer_width
Definition: wined3d.h:1772
enum wined3d_format_id backbuffer_format
Definition: wined3d.h:1774
#define max(a, b)
Definition: svc.c:63
#define release_iface(a)
Definition: tmarshal.c:41
GLfixed fx
Definition: tritemp.h:484
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define WINAPI
Definition: msvc.h:6
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
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
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
void CDECL wined3d_stateblock_depth_buffer_changed(struct wined3d_stateblock *stateblock)
Definition: stateblock.c:4043
void CDECL wined3d_stateblock_texture_changed(struct wined3d_stateblock *stateblock, const struct wined3d_texture *texture)
Definition: stateblock.c:4033
struct wined3d_texture *CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, UINT back_buffer_idx)
Definition: swapchain.c:256
void CDECL wined3d_swapchain_get_desc(const struct wined3d_swapchain *swapchain, struct wined3d_swapchain_desc *desc)
Definition: swapchain.c:345
void CDECL wined3d_swapchain_set_window(struct wined3d_swapchain *swapchain, HWND window)
Definition: swapchain.c:177
void CDECL wined3d_swapchain_set_palette(struct wined3d_swapchain *swapchain, struct wined3d_palette *palette)
Definition: swapchain.c:372
HRESULT CDECL wined3d_swapchain_get_display_mode(const struct wined3d_swapchain *swapchain, struct wined3d_display_mode *mode, enum wined3d_display_rotation *rotation)
Definition: swapchain.c:316
HRESULT CDECL wined3d_swapchain_present(struct wined3d_swapchain *swapchain, const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override, unsigned int swap_interval, uint32_t flags)
Definition: swapchain.c:192
struct wined3d_texture *CDECL wined3d_swapchain_get_front_buffer(const struct wined3d_swapchain *swapchain)
Definition: swapchain.c:280
@ WINED3D_CUBEMAP_FACE_NEGATIVE_Z
Definition: wined3d.h:700
@ WINED3D_CUBEMAP_FACE_NEGATIVE_X
Definition: wined3d.h:696
@ WINED3D_CUBEMAP_FACE_POSITIVE_Z
Definition: wined3d.h:699
@ WINED3D_CUBEMAP_FACE_POSITIVE_X
Definition: wined3d.h:695
@ WINED3D_CUBEMAP_FACE_NEGATIVE_Y
Definition: wined3d.h:698
@ WINED3D_CUBEMAP_FACE_POSITIVE_Y
Definition: wined3d.h:697
static unsigned int wined3d_log2i(unsigned int x)
Definition: wined3d.h:2952
#define WINED3DCLEAR_TARGET
Definition: wined3d.h:1008
@ WINED3D_MULTISAMPLE_NONE
Definition: wined3d.h:573
static void wined3d_private_store_cleanup(struct wined3d_private_store *store)
Definition: wined3d.h:2636
#define WINED3D_BLT_DST_CKEY
Definition: wined3d.h:1365
#define WINED3D_BLT_MASK
Definition: wined3d.h:1374
#define WINED3D_OK
Definition: wined3d.h:33
#define WINED3DUSAGE_OWNDC
Definition: wined3d.h:935
#define WINED3DUSAGE_LEGACY_CUBEMAP
Definition: wined3d.h:934
#define WINED3D_RESOURCE_ACCESS_GPU
Definition: wined3d.h:51
#define WINED3D_BLT_SRC_CKEY
Definition: wined3d.h:1367
#define WINED3D_RESOURCE_ACCESS_CPU
Definition: wined3d.h:52
@ WINED3D_RTYPE_TEXTURE_2D
Definition: wined3d.h:720
#define WINEDDGFS_ISFLIPDONE
Definition: wined3d.h:1382
#define WINED3DERR_NOTAVAILABLE
Definition: wined3d.h:42
wined3d_texture_filter_type
Definition: wined3d.h:704
@ WINED3D_TEXF_POINT
Definition: wined3d.h:706
@ WINED3D_TEXF_LINEAR
Definition: wined3d.h:707
static struct wined3d_private_data * wined3d_private_store_get_private_data(const struct wined3d_private_store *store, const GUID *tag)
Definition: wined3d.h:2612
#define WINED3D_MAP_READ
Definition: wined3d.h:957
#define WINED3DUSAGE_OVERLAY
Definition: wined3d.h:937
#define WINEDDGBS_ISBLTDONE
Definition: wined3d.h:1378
#define WINED3D_BIND_SHADER_RESOURCE
Definition: wined3d.h:912
#define WINED3DUSAGE_VIDMEM_ACCOUNTING
Definition: wined3d.h:939
wined3d_format_id
Definition: wined3d.h:126
@ WINED3DFMT_UNKNOWN
Definition: wined3d.h:127
#define WINED3D_BIND_DEPTH_STENCIL
Definition: wined3d.h:915
static void wined3d_box_set(struct wined3d_box *box, unsigned int left, unsigned int top, unsigned int right, unsigned int bottom, unsigned int front, unsigned int back)
Definition: wined3d.h:3006
#define WINED3DCLEAR_SYNCHRONOUS
Definition: wined3d.h:1011
#define WINED3D_RESOURCE_ACCESS_MAP_R
Definition: wined3d.h:53
static void wined3d_private_store_free_private_data(struct wined3d_private_store *store, struct wined3d_private_data *entry)
Definition: wined3d.h:2627
#define WINED3DUSAGE_MANAGED
Definition: wined3d.h:938
static void wined3d_private_store_init(struct wined3d_private_store *store)
Definition: wined3d.h:2607
#define WINED3D_MAP_WRITE
Definition: wined3d.h:956
#define WINED3D_BLT_SYNCHRONOUS
Definition: wined3d.h:1372
#define WINED3D_BLT_DO_NOT_WAIT
Definition: wined3d.h:1370
#define WINED3DCLEAR_ZBUFFER
Definition: wined3d.h:1009
#define WINED3D_BIND_RENDER_TARGET
Definition: wined3d.h:914
#define WINED3D_BLT_WAIT
Definition: wined3d.h:1369
#define WINED3DUSAGE_DYNAMIC
Definition: wined3d.h:924
#define WINEDDGBS_CANBLT
Definition: wined3d.h:1377
#define WINED3DERR_INVALIDCALL
Definition: wined3d.h:44
static HRESULT wined3d_private_store_set_private_data(struct wined3d_private_store *store, const GUID *guid, const void *data, DWORD data_size, uint32_t flags)
Definition: wined3d.h:2648
#define WINED3D_TEXTURE_CREATE_GET_DC_LENIENT
Definition: wined3d.h:1564
@ WINED3D_DEVICE_TYPE_HAL
Definition: wined3d.h:91
#define WINED3D_RESOURCE_ACCESS_MAP_W
Definition: wined3d.h:54
#define WINEDDGFS_CANFLIP
Definition: wined3d.h:1381
void WINAPI wined3d_mutex_unlock(void)
Definition: wined3d_main.c:544
void WINAPI wined3d_mutex_lock(void)
Definition: wined3d_main.c:539
#define E_NOINTERFACE
Definition: winerror.h:3479
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771
#define E_POINTER
Definition: winerror.h:3480
#define BLACKNESS
Definition: wingdi.h:323
#define WHITENESS
Definition: wingdi.h:337
#define SRCCOPY
Definition: wingdi.h:333
unsigned char BYTE
Definition: xxhash.c:193