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