xref: /reactos/dll/directx/wine/ddraw/ddraw_private.h (revision 5100859e)
1 /*
2  * Copyright 2006 Stefan Dösinger
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #ifndef __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H
20 #define __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H
21 
22 #include <assert.h>
23 #include <limits.h>
24 #define COBJMACROS
25 #define NONAMELESSSTRUCT
26 #define NONAMELESSUNION
27 #include "wine/debug.h"
28 #include "wine/heap.h"
29 
30 #include "winbase.h"
31 #include "wingdi.h"
32 #include "winuser.h"
33 
34 #include "d3d.h"
35 #include "ddraw.h"
36 #ifdef DDRAW_INIT_GUID
37 #include "initguid.h"
38 #endif
39 #include "wine/list.h"
40 #include "wine/wined3d.h"
41 
42 #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
43 
44 extern const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops DECLSPEC_HIDDEN;
45 extern DWORD force_refresh_rate DECLSPEC_HIDDEN;
46 
47 /*****************************************************************************
48  * IDirectDraw implementation structure
49  *****************************************************************************/
50 struct FvfToDecl
51 {
52     DWORD fvf;
53     struct wined3d_vertex_declaration *decl;
54 };
55 
56 #define DDRAW_INITIALIZED       0x00000001
57 #define DDRAW_D3D_INITIALIZED   0x00000002
58 #define DDRAW_RESTORE_MODE      0x00000004
59 #define DDRAW_NO3D              0x00000008
60 #define DDRAW_SCL_DDRAW1        0x00000010
61 #define DDRAW_SCL_RECURSIVE     0x00000020
62 #define DDRAW_GDI_FLIP          0x00000040
63 
64 #define DDRAW_STRIDE_ALIGNMENT  8
65 
66 #define DDRAW_WINED3D_FLAGS     (WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING \
67         | WINED3D_RESTORE_MODE_ON_ACTIVATE | WINED3D_FOCUS_MESSAGES | WINED3D_PIXEL_CENTER_INTEGER \
68         | WINED3D_LEGACY_UNBOUND_RESOURCE_COLOR | WINED3D_NO_PRIMITIVE_RESTART \
69         | WINED3D_LEGACY_CUBEMAP_FILTERING | WINED3D_LIMIT_VIEWPORT)
70 
71 enum ddraw_device_state
72 {
73     DDRAW_DEVICE_STATE_OK,
74     DDRAW_DEVICE_STATE_LOST,
75     DDRAW_DEVICE_STATE_NOT_RESTORED,
76 };
77 
78 struct ddraw
79 {
80     /* Interfaces */
81     IDirectDraw7 IDirectDraw7_iface;
82     IDirectDraw4 IDirectDraw4_iface;
83     IDirectDraw2 IDirectDraw2_iface;
84     IDirectDraw IDirectDraw_iface;
85     IDirect3D7 IDirect3D7_iface;
86     IDirect3D3 IDirect3D3_iface;
87     IDirect3D2 IDirect3D2_iface;
88     IDirect3D IDirect3D_iface;
89     struct wined3d_device_parent device_parent;
90 
91     /* See comment in IDirectDraw::AddRef */
92     LONG                    ref7, ref4, ref2, ref3, ref1, numIfaces;
93 
94     struct wined3d *wined3d;
95     struct wined3d_device *wined3d_device;
96     DWORD flags;
97     LONG device_state;
98 
99     struct ddraw_surface *primary;
100     RECT primary_lock;
101     struct wined3d_texture *wined3d_frontbuffer;
102     struct wined3d_swapchain *wined3d_swapchain;
103     HWND swapchain_window;
104 
105     /* DirectDraw things, which are not handled by WineD3D */
106     DWORD                   cooperative_level;
107 
108     /* D3D things */
109     HWND                    d3d_window;
110     struct d3d_device *d3ddevice;
111     int                     d3dversion;
112 
113     /* Various HWNDs */
114     HWND                    focuswindow;
115     HWND                    devicewindow;
116     HWND                    dest_window;
117 
118     /* For the dll unload cleanup code */
119     struct list ddraw_list_entry;
120     /* The surface list - can't relay this to WineD3D
121      * because of IParent
122      */
123     struct list surface_list;
124 
125     /* FVF management */
126     struct FvfToDecl       *decls;
127     UINT                    numConvertedDecls, declArraySize;
128 };
129 
130 #define DDRAW_WINDOW_CLASS_NAME "DirectDrawDeviceWnd"
131 
132 HRESULT ddraw_init(struct ddraw *ddraw, DWORD flags, enum wined3d_device_type device_type) DECLSPEC_HIDDEN;
133 void ddraw_d3dcaps1_from_7(D3DDEVICEDESC *caps1, D3DDEVICEDESC7 *caps7) DECLSPEC_HIDDEN;
134 HRESULT ddraw_get_d3dcaps(const struct ddraw *ddraw, D3DDEVICEDESC7 *caps) DECLSPEC_HIDDEN;
135 void ddraw_update_lost_surfaces(struct ddraw *ddraw) DECLSPEC_HIDDEN;
136 
137 static inline void ddraw_set_swapchain_window(struct ddraw *ddraw, HWND window)
138 {
139     if (window == GetDesktopWindow())
140         window = NULL;
141     ddraw->swapchain_window = window;
142 }
143 
144 /* Utility functions */
145 void DDRAW_Convert_DDSCAPS_1_To_2(const DDSCAPS *pIn, DDSCAPS2 *pOut) DECLSPEC_HIDDEN;
146 void DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(const DDDEVICEIDENTIFIER2 *pIn, DDDEVICEIDENTIFIER *pOut) DECLSPEC_HIDDEN;
147 struct wined3d_vertex_declaration *ddraw_find_decl(struct ddraw *ddraw, DWORD fvf) DECLSPEC_HIDDEN;
148 
149 struct ddraw_surface
150 {
151     /* IUnknown fields */
152     IDirectDrawSurface7 IDirectDrawSurface7_iface;
153     IDirectDrawSurface4 IDirectDrawSurface4_iface;
154     IDirectDrawSurface3 IDirectDrawSurface3_iface;
155     IDirectDrawSurface2 IDirectDrawSurface2_iface;
156     IDirectDrawSurface IDirectDrawSurface_iface;
157     IDirectDrawGammaControl IDirectDrawGammaControl_iface;
158     IDirect3DTexture2 IDirect3DTexture2_iface;
159     IDirect3DTexture IDirect3DTexture_iface;
160 
161     LONG                     ref7, ref4, ref3, ref2, ref1, iface_count, gamma_count;
162     IUnknown                *ifaceToRelease;
163     IUnknown *texture_outer;
164 
165     int                     version;
166 
167     /* Connections to other Objects */
168     struct ddraw *ddraw;
169     struct wined3d_texture *wined3d_texture;
170     unsigned int sub_resource_idx;
171     struct wined3d_rendertarget_view *wined3d_rtv;
172     struct wined3d_private_store private_store;
173     struct d3d_device *device1;
174 
175     /* This implementation handles attaching surfaces to other surfaces */
176     struct ddraw_surface *next_attached;
177     struct ddraw_surface *first_attached;
178     IUnknown                *attached_iface;
179 
180     /* Complex surfaces are organized in a tree, although the tree is degenerated to a list in most cases.
181      * In mipmap and primary surfaces each level has only one attachment, which is the next surface level.
182      * Only the cube texture root has 6 surfaces attached, which then have a normal mipmap chain attached
183      * to them. So hardcode the array to 6, a dynamic array or a list would be an overkill.
184      */
185 #define MAX_COMPLEX_ATTACHED 6
186     struct ddraw_surface *complex_array[MAX_COMPLEX_ATTACHED];
187     /* You can't traverse the tree upwards. Only a flag for Surface::Release because it's needed there,
188      * but no pointer to prevent temptations to traverse it in the wrong direction.
189      */
190     BOOL                    is_complex_root;
191     BOOL is_lost;
192 
193     /* Surface description, for GetAttachedSurface */
194     DDSURFACEDESC2          surface_desc;
195 
196     /* Clipper objects */
197     struct ddraw_clipper *clipper;
198     struct ddraw_palette *palette;
199 
200     /* For the ddraw surface list */
201     struct list             surface_list_entry;
202 
203     DWORD                   Handle;
204     HDC dc;
205 };
206 
207 struct ddraw_texture
208 {
209     unsigned int version;
210     DDSURFACEDESC2 surface_desc;
211 
212     struct ddraw_surface *root;
213     struct wined3d_device *wined3d_device;
214 };
215 
216 HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_desc,
217         struct ddraw_surface **surface, IUnknown *outer_unknown, unsigned int version) DECLSPEC_HIDDEN;
218 struct wined3d_rendertarget_view *ddraw_surface_get_rendertarget_view(struct ddraw_surface *surface) DECLSPEC_HIDDEN;
219 void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw,
220         struct wined3d_texture *wined3d_texture, unsigned int sub_resource_idx,
221         const struct wined3d_parent_ops **parent_ops) DECLSPEC_HIDDEN;
222 HRESULT ddraw_surface_update_frontbuffer(struct ddraw_surface *surface,
223         const RECT *rect, BOOL read) DECLSPEC_HIDDEN;
224 
225 static inline struct ddraw_surface *impl_from_IDirect3DTexture(IDirect3DTexture *iface)
226 {
227     return CONTAINING_RECORD(iface, struct ddraw_surface, IDirect3DTexture_iface);
228 }
229 
230 static inline struct ddraw_surface *impl_from_IDirect3DTexture2(IDirect3DTexture2 *iface)
231 {
232     return CONTAINING_RECORD(iface, struct ddraw_surface, IDirect3DTexture2_iface);
233 }
234 
235 static inline struct ddraw_surface *impl_from_IDirectDrawSurface(IDirectDrawSurface *iface)
236 {
237     return CONTAINING_RECORD(iface, struct ddraw_surface, IDirectDrawSurface_iface);
238 }
239 
240 static inline struct ddraw_surface *impl_from_IDirectDrawSurface2(IDirectDrawSurface2 *iface)
241 {
242     return CONTAINING_RECORD(iface, struct ddraw_surface, IDirectDrawSurface2_iface);
243 }
244 
245 static inline struct ddraw_surface *impl_from_IDirectDrawSurface3(IDirectDrawSurface3 *iface)
246 {
247     return CONTAINING_RECORD(iface, struct ddraw_surface, IDirectDrawSurface3_iface);
248 }
249 
250 static inline struct ddraw_surface *impl_from_IDirectDrawSurface4(IDirectDrawSurface4 *iface)
251 {
252     return CONTAINING_RECORD(iface, struct ddraw_surface, IDirectDrawSurface4_iface);
253 }
254 
255 static inline struct ddraw_surface *impl_from_IDirectDrawSurface7(IDirectDrawSurface7 *iface)
256 {
257     return CONTAINING_RECORD(iface, struct ddraw_surface, IDirectDrawSurface7_iface);
258 }
259 
260 struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface(IDirectDrawSurface *iface) DECLSPEC_HIDDEN;
261 struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface4(IDirectDrawSurface4 *iface) DECLSPEC_HIDDEN;
262 struct ddraw_surface *unsafe_impl_from_IDirectDrawSurface7(IDirectDrawSurface7 *iface) DECLSPEC_HIDDEN;
263 
264 struct ddraw_surface *unsafe_impl_from_IDirect3DTexture(IDirect3DTexture *iface) DECLSPEC_HIDDEN;
265 struct ddraw_surface *unsafe_impl_from_IDirect3DTexture2(IDirect3DTexture2 *iface) DECLSPEC_HIDDEN;
266 
267 #define DDRAW_INVALID_HANDLE ~0U
268 
269 enum ddraw_handle_type
270 {
271     DDRAW_HANDLE_FREE,
272     DDRAW_HANDLE_MATERIAL,
273     DDRAW_HANDLE_MATRIX,
274     DDRAW_HANDLE_STATEBLOCK,
275     DDRAW_HANDLE_SURFACE,
276 };
277 
278 struct ddraw_handle_entry
279 {
280     void *object;
281     enum ddraw_handle_type type;
282 };
283 
284 struct ddraw_handle_table
285 {
286     struct ddraw_handle_entry *entries;
287     struct ddraw_handle_entry *free_entries;
288     UINT table_size;
289     UINT entry_count;
290 };
291 
292 BOOL ddraw_handle_table_init(struct ddraw_handle_table *t, UINT initial_size) DECLSPEC_HIDDEN;
293 void ddraw_handle_table_destroy(struct ddraw_handle_table *t) DECLSPEC_HIDDEN;
294 DWORD ddraw_allocate_handle(struct ddraw_handle_table *t, void *object, enum ddraw_handle_type type) DECLSPEC_HIDDEN;
295 void *ddraw_free_handle(struct ddraw_handle_table *t, DWORD handle, enum ddraw_handle_type type) DECLSPEC_HIDDEN;
296 void *ddraw_get_object(struct ddraw_handle_table *t, DWORD handle, enum ddraw_handle_type type) DECLSPEC_HIDDEN;
297 
298 struct d3d_device
299 {
300     /* IUnknown */
301     IDirect3DDevice7 IDirect3DDevice7_iface;
302     IDirect3DDevice3 IDirect3DDevice3_iface;
303     IDirect3DDevice2 IDirect3DDevice2_iface;
304     IDirect3DDevice IDirect3DDevice_iface;
305     IUnknown IUnknown_inner;
306     LONG ref;
307     UINT version;
308     BOOL hw;
309 
310     IUnknown *outer_unknown;
311     struct wined3d_device *wined3d_device;
312     struct ddraw *ddraw;
313     IUnknown *rt_iface;
314 
315     struct wined3d_buffer *index_buffer;
316     UINT index_buffer_size;
317     UINT index_buffer_pos;
318 
319     struct wined3d_buffer *vertex_buffer;
320     UINT vertex_buffer_size;
321     UINT vertex_buffer_pos;
322 
323     /* Viewport management */
324     struct list viewport_list;
325     struct d3d_viewport *current_viewport;
326     D3DVIEWPORT7 active_viewport;
327 
328     /* Required to keep track which of two available texture blending modes in d3ddevice3 is used */
329     BOOL legacyTextureBlending;
330 
331     D3DMATRIX legacy_projection;
332     D3DMATRIX legacy_clipspace;
333 
334     /* Light state */
335     DWORD material;
336 
337     /* Rendering functions to wrap D3D(1-3) to D3D7 */
338     D3DPRIMITIVETYPE primitive_type;
339     DWORD vertex_type;
340     DWORD render_flags;
341     DWORD nb_vertices;
342     BYTE *sysmem_vertex_buffer;
343     DWORD vertex_size;
344     DWORD buffer_size;
345 
346     /* Handle management */
347     struct ddraw_handle_table handle_table;
348     D3DMATRIXHANDLE          world, proj, view;
349 
350     struct wined3d_vec4 user_clip_planes[D3DMAXUSERCLIPPLANES];
351 };
352 
353 HRESULT d3d_device_create(struct ddraw *ddraw, const GUID *guid, struct ddraw_surface *target, IUnknown *rt_iface,
354         UINT version, struct d3d_device **device, IUnknown *outer_unknown) DECLSPEC_HIDDEN;
355 enum wined3d_depth_buffer_type d3d_device_update_depth_stencil(struct d3d_device *device) DECLSPEC_HIDDEN;
356 
357 /* The IID */
358 extern const GUID IID_D3DDEVICE_WineD3D DECLSPEC_HIDDEN;
359 
360 static inline struct d3d_device *impl_from_IDirect3DDevice(IDirect3DDevice *iface)
361 {
362     return CONTAINING_RECORD(iface, struct d3d_device, IDirect3DDevice_iface);
363 }
364 
365 static inline struct d3d_device *impl_from_IDirect3DDevice2(IDirect3DDevice2 *iface)
366 {
367     return CONTAINING_RECORD(iface, struct d3d_device, IDirect3DDevice2_iface);
368 }
369 
370 static inline struct d3d_device *impl_from_IDirect3DDevice3(IDirect3DDevice3 *iface)
371 {
372     return CONTAINING_RECORD(iface, struct d3d_device, IDirect3DDevice3_iface);
373 }
374 
375 static inline struct d3d_device *impl_from_IDirect3DDevice7(IDirect3DDevice7 *iface)
376 {
377     return CONTAINING_RECORD(iface, struct d3d_device, IDirect3DDevice7_iface);
378 }
379 
380 struct d3d_device *unsafe_impl_from_IDirect3DDevice(IDirect3DDevice *iface) DECLSPEC_HIDDEN;
381 struct d3d_device *unsafe_impl_from_IDirect3DDevice2(IDirect3DDevice2 *iface) DECLSPEC_HIDDEN;
382 struct d3d_device *unsafe_impl_from_IDirect3DDevice3(IDirect3DDevice3 *iface) DECLSPEC_HIDDEN;
383 struct d3d_device *unsafe_impl_from_IDirect3DDevice7(IDirect3DDevice7 *iface) DECLSPEC_HIDDEN;
384 
385 struct ddraw_clipper
386 {
387     IDirectDrawClipper IDirectDrawClipper_iface;
388     LONG ref;
389     HWND window;
390     HRGN region;
391     BOOL initialized;
392 };
393 
394 HRESULT ddraw_clipper_init(struct ddraw_clipper *clipper) DECLSPEC_HIDDEN;
395 struct ddraw_clipper *unsafe_impl_from_IDirectDrawClipper(IDirectDrawClipper *iface) DECLSPEC_HIDDEN;
396 
397 /*****************************************************************************
398  * IDirectDrawPalette implementation structure
399  *****************************************************************************/
400 struct ddraw_palette
401 {
402     /* IUnknown fields */
403     IDirectDrawPalette IDirectDrawPalette_iface;
404     LONG ref;
405 
406     struct wined3d_palette *wined3d_palette;
407     struct ddraw *ddraw;
408     IUnknown *ifaceToRelease;
409     DWORD flags;
410 };
411 
412 static inline struct ddraw_palette *impl_from_IDirectDrawPalette(IDirectDrawPalette *iface)
413 {
414     return CONTAINING_RECORD(iface, struct ddraw_palette, IDirectDrawPalette_iface);
415 }
416 
417 struct ddraw_palette *unsafe_impl_from_IDirectDrawPalette(IDirectDrawPalette *iface) DECLSPEC_HIDDEN;
418 
419 HRESULT ddraw_palette_init(struct ddraw_palette *palette,
420         struct ddraw *ddraw, DWORD flags, PALETTEENTRY *entries) DECLSPEC_HIDDEN;
421 
422 /* Helper structures */
423 struct object_creation_info
424 {
425     const CLSID *clsid;
426     HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, REFIID riid,
427                                  void **ppObj);
428 };
429 
430 /******************************************************************************
431  * IDirect3DLight implementation structure - Wraps to D3D7
432  ******************************************************************************/
433 struct d3d_light
434 {
435     IDirect3DLight IDirect3DLight_iface;
436     LONG ref;
437 
438     /* IDirect3DLight fields */
439     struct ddraw *ddraw;
440 
441     /* If this light is active for one viewport, put the viewport here */
442     struct d3d_viewport *active_viewport;
443 
444     D3DLIGHT2 light;
445     D3DLIGHT7 light7;
446 
447     DWORD dwLightIndex;
448 
449     struct list entry;
450 };
451 
452 /* Helper functions */
453 void light_activate(struct d3d_light *light) DECLSPEC_HIDDEN;
454 void light_deactivate(struct d3d_light *light) DECLSPEC_HIDDEN;
455 void d3d_light_init(struct d3d_light *light, struct ddraw *ddraw) DECLSPEC_HIDDEN;
456 struct d3d_light *unsafe_impl_from_IDirect3DLight(IDirect3DLight *iface) DECLSPEC_HIDDEN;
457 
458 /******************************************************************************
459  * IDirect3DMaterial implementation structure - Wraps to D3D7
460  ******************************************************************************/
461 struct d3d_material
462 {
463     IDirect3DMaterial3 IDirect3DMaterial3_iface;
464     IDirect3DMaterial2 IDirect3DMaterial2_iface;
465     IDirect3DMaterial IDirect3DMaterial_iface;
466     LONG  ref;
467 
468     /* IDirect3DMaterial2 fields */
469     struct ddraw *ddraw;
470     struct d3d_device *active_device;
471 
472     D3DMATERIAL mat;
473     DWORD Handle;
474 };
475 
476 /* Helper functions */
477 void material_activate(struct d3d_material *material) DECLSPEC_HIDDEN;
478 struct d3d_material *d3d_material_create(struct ddraw *ddraw) DECLSPEC_HIDDEN;
479 
480 /*****************************************************************************
481  * IDirect3DViewport - Wraps to D3D7
482  *****************************************************************************/
483 struct d3d_viewport
484 {
485     IDirect3DViewport3 IDirect3DViewport3_iface;
486     LONG ref;
487 
488     /* IDirect3DViewport fields */
489     struct ddraw *ddraw;
490 
491     /* If this viewport is active for one device, put the device here */
492     struct d3d_device *active_device;
493 
494     DWORD                     num_lights;
495     DWORD                     map_lights;
496 
497     int                       use_vp2;
498 
499     union
500     {
501         D3DVIEWPORT vp1;
502         D3DVIEWPORT2 vp2;
503     } viewports;
504 
505     struct list entry;
506     struct list light_list;
507     struct d3d_material *background;
508 };
509 
510 struct d3d_viewport *unsafe_impl_from_IDirect3DViewport3(IDirect3DViewport3 *iface) DECLSPEC_HIDDEN;
511 struct d3d_viewport *unsafe_impl_from_IDirect3DViewport2(IDirect3DViewport2 *iface) DECLSPEC_HIDDEN;
512 struct d3d_viewport *unsafe_impl_from_IDirect3DViewport(IDirect3DViewport *iface) DECLSPEC_HIDDEN;
513 
514 /* Helper functions */
515 void viewport_activate(struct d3d_viewport *viewport, BOOL ignore_lights) DECLSPEC_HIDDEN;
516 void d3d_viewport_init(struct d3d_viewport *viewport, struct ddraw *ddraw) DECLSPEC_HIDDEN;
517 
518 /*****************************************************************************
519  * IDirect3DExecuteBuffer - Wraps to D3D7
520  *****************************************************************************/
521 struct d3d_execute_buffer
522 {
523     IDirect3DExecuteBuffer IDirect3DExecuteBuffer_iface;
524     LONG ref;
525     /* IDirect3DExecuteBuffer fields */
526     struct ddraw *ddraw;
527     struct d3d_device *d3ddev;
528 
529     D3DEXECUTEBUFFERDESC desc;
530     D3DEXECUTEDATA       data;
531 
532     /* This buffer will store the transformed vertices */
533     unsigned int         index_size, index_pos;
534     unsigned int         vertex_size, src_vertex_pos;
535     struct wined3d_buffer *src_vertex_buffer, *dst_vertex_buffer, *index_buffer;
536 
537     /* This flags is set to TRUE if we allocated ourselves the
538      * data buffer
539      */
540     BOOL                 need_free;
541 };
542 
543 HRESULT d3d_execute_buffer_init(struct d3d_execute_buffer *execute_buffer,
544         struct d3d_device *device, D3DEXECUTEBUFFERDESC *desc) DECLSPEC_HIDDEN;
545 struct d3d_execute_buffer *unsafe_impl_from_IDirect3DExecuteBuffer(IDirect3DExecuteBuffer *iface) DECLSPEC_HIDDEN;
546 
547 /* The execute function */
548 HRESULT d3d_execute_buffer_execute(struct d3d_execute_buffer *execute_buffer,
549         struct d3d_device *device, struct d3d_viewport *viewport) DECLSPEC_HIDDEN;
550 
551 /*****************************************************************************
552  * IDirect3DVertexBuffer
553  *****************************************************************************/
554 struct d3d_vertex_buffer
555 {
556     IDirect3DVertexBuffer7 IDirect3DVertexBuffer7_iface;
557     LONG ref;
558     unsigned int version;
559 
560     /*** WineD3D and ddraw links ***/
561     struct wined3d_buffer *wined3d_buffer;
562     struct wined3d_vertex_declaration *wined3d_declaration;
563     struct ddraw *ddraw;
564 
565     /*** Storage for D3D7 specific things ***/
566     DWORD                Caps;
567     DWORD                fvf;
568     DWORD                size;
569     BOOL                 dynamic;
570 };
571 
572 HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **buffer, struct ddraw *ddraw,
573         D3DVERTEXBUFFERDESC *desc) DECLSPEC_HIDDEN;
574 struct d3d_vertex_buffer *unsafe_impl_from_IDirect3DVertexBuffer(IDirect3DVertexBuffer *iface) DECLSPEC_HIDDEN;
575 struct d3d_vertex_buffer *unsafe_impl_from_IDirect3DVertexBuffer7(IDirect3DVertexBuffer7 *iface) DECLSPEC_HIDDEN;
576 
577 /*****************************************************************************
578  * Helper functions from utils.c
579  *****************************************************************************/
580 
581 #define GET_TEXCOUNT_FROM_FVF(d3dvtVertexType) \
582     (((d3dvtVertexType) & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT)
583 
584 #define GET_TEXCOORD_SIZE_FROM_FVF(d3dvtVertexType, tex_num) \
585     (((((d3dvtVertexType) >> (16 + (2 * (tex_num)))) + 1) & 0x03) + 1)
586 
587 void ddrawformat_from_wined3dformat(DDPIXELFORMAT *ddraw_format,
588         enum wined3d_format_id wined3d_format) DECLSPEC_HIDDEN;
589 BOOL wined3d_colour_from_ddraw_colour(const DDPIXELFORMAT *pf, const struct ddraw_palette *palette,
590         DWORD colour, struct wined3d_color *wined3d_colour) DECLSPEC_HIDDEN;
591 enum wined3d_format_id wined3dformat_from_ddrawformat(const DDPIXELFORMAT *format) DECLSPEC_HIDDEN;
592 unsigned int wined3dmapflags_from_ddrawmapflags(unsigned int flags) DECLSPEC_HIDDEN;
593 void DDRAW_dump_surface_desc(const DDSURFACEDESC2 *lpddsd) DECLSPEC_HIDDEN;
594 void dump_D3DMATRIX(const D3DMATRIX *mat) DECLSPEC_HIDDEN;
595 void DDRAW_dump_DDCAPS(const DDCAPS *lpcaps) DECLSPEC_HIDDEN;
596 DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN;
597 void DDRAW_dump_DDSCAPS2(const DDSCAPS2 *in) DECLSPEC_HIDDEN;
598 void DDRAW_dump_cooperativelevel(DWORD cooplevel) DECLSPEC_HIDDEN;
599 void DDSD_to_DDSD2(const DDSURFACEDESC *in, DDSURFACEDESC2 *out) DECLSPEC_HIDDEN;
600 void DDSD2_to_DDSD(const DDSURFACEDESC2 *in, DDSURFACEDESC *out) DECLSPEC_HIDDEN;
601 
602 void multiply_matrix(D3DMATRIX *dst, const D3DMATRIX *src1, const D3DMATRIX *src2) DECLSPEC_HIDDEN;
603 
604 static inline BOOL format_is_compressed(const DDPIXELFORMAT *format)
605 {
606     return (format->dwFlags & DDPF_FOURCC) && (format->dwFourCC == WINED3DFMT_DXT1
607             || format->dwFourCC == WINED3DFMT_DXT2 || format->dwFourCC == WINED3DFMT_DXT3
608             || format->dwFourCC == WINED3DFMT_DXT4 || format->dwFourCC == WINED3DFMT_DXT5);
609 }
610 
611 static inline BOOL format_is_paletteindexed(const DDPIXELFORMAT *fmt)
612 {
613     DWORD flags = DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 | DDPF_PALETTEINDEXED4
614             | DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8;
615     return !!(fmt->dwFlags & flags);
616 }
617 
618 /* Used for generic dumping */
619 struct flag_info
620 {
621     DWORD val;
622     const char *name;
623 };
624 
625 #define FE(x) { x, #x }
626 
627 struct member_info
628 {
629     DWORD val;
630     const char *name;
631     void (*func)(const void *);
632     ptrdiff_t offset;
633 };
634 
635 /* Structure copy */
636 #define ME(x,f,e) { x, #x, (void (*)(const void *))(f), offsetof(STRUCT, e) }
637 
638 #define DD_STRUCT_COPY_BYSIZE_(to,from,to_size,from_size)         \
639     do {                                                          \
640         DWORD __size = (to)->dwSize;                              \
641         DWORD __resetsize = min(to_size, sizeof(*to));            \
642         DWORD __copysize = min(__resetsize, from_size);           \
643         assert(to != from);                                       \
644         memcpy(to, from, __copysize);                             \
645         memset((char*)(to) + __copysize, 0, __resetsize - __copysize); \
646         (to)->dwSize = __size; /* restore size */                 \
647     } while (0)
648 
649 #define DD_STRUCT_COPY_BYSIZE(to,from) DD_STRUCT_COPY_BYSIZE_(to,from,(to)->dwSize,(from)->dwSize)
650 
651 HRESULT hr_ddraw_from_wined3d(HRESULT hr) DECLSPEC_HIDDEN;
652 
653 #endif
654