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