ddraw_private.h 21.6 KB
Newer Older
1
/*
2
 * Copyright 2006 Stefan Dsinger
3 4 5 6 7 8 9 10 11 12 13 14 15
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * 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 20
#ifndef __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H
#define __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H
21

22
/* MAY NOT CONTAIN X11 or DGA specific includes/defines/structs! */
23

24
#include <stdarg.h>
25 26
#include <stdio.h>

27
#include "windef.h"
28
#include "winbase.h"
29
#include "wtypes.h"
30
#include "wingdi.h"
Patrik Stridvall's avatar
Patrik Stridvall committed
31
#include "winuser.h"
32
#include "ddraw.h"
33
#include "ddrawi.h"
34
#include "d3d.h"
35

36
#include "ddcomimpl.h"
37

38
#include "wine/wined3d_interface.h"
39
#include "wine/list.h"
40

41
/*****************************************************************************
42 43 44 45
 * IParent - a helper interface
 *****************************************************************************/
DEFINE_GUID(IID_IParent, 0xc20e4c88, 0x74e7, 0x4940, 0xba, 0x9f, 0x2e, 0x32, 0x3f, 0x9d, 0xc9, 0x81);
typedef struct IParent *LPPARENT, *PPARENT;
46

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
#define INTERFACE IParent
DECLARE_INTERFACE_(IParent,IUnknown)
{
    /*** IUnknown methods ***/
    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
    STDMETHOD_(ULONG,Release)(THIS) PURE;
};
#undef INTERFACE

#if !defined(__cplusplus) || defined(CINTERFACE)
/*** IUnknown methods ***/
#define IParent_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IParent_AddRef(p)             (p)->lpVtbl->AddRef(p)
#define IParent_Release(p)            (p)->lpVtbl->Release(p)
#endif


/* Typdef the interfaces */
typedef struct IDirectDrawImpl            IDirectDrawImpl;
typedef struct IDirectDrawSurfaceImpl     IDirectDrawSurfaceImpl;
typedef struct IDirectDrawClipperImpl     IDirectDrawClipperImpl;
typedef struct IDirectDrawPaletteImpl     IDirectDrawPaletteImpl;
typedef struct IDirect3DDeviceImpl        IDirect3DDeviceImpl;
typedef struct IDirect3DLightImpl         IDirect3DLightImpl;
typedef struct IDirect3DViewportImpl      IDirect3DViewportImpl;
typedef struct IDirect3DMaterialImpl      IDirect3DMaterialImpl;
typedef struct IDirect3DExecuteBufferImpl IDirect3DExecuteBufferImpl;
typedef struct IDirect3DVertexBufferImpl  IDirect3DVertexBufferImpl;
typedef struct IParentImpl                IParentImpl;
77

78
/* Callbacks for implicit object destruction */
79 80
extern ULONG WINAPI D3D7CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain);

81 82
extern ULONG WINAPI D3D7CB_DestroyDepthStencilSurface(IWineD3DSurface *pSurface);

83 84 85
/* Global critical section */
extern CRITICAL_SECTION ddraw_cs;

86 87
extern DWORD force_refresh_rate;

88 89 90
/*****************************************************************************
 * IDirectDraw implementation structure
 *****************************************************************************/
91 92 93 94 95
struct FvfToDecl
{
    DWORD fvf;
    IWineD3DVertexDeclaration *decl;
};
96 97 98

struct IDirectDrawImpl
{
99
    /* IUnknown fields */
100 101
    ICOM_VFIELD_MULTI(IDirectDraw7);
    ICOM_VFIELD_MULTI(IDirectDraw4);
102
    ICOM_VFIELD_MULTI(IDirectDraw3);
103 104
    ICOM_VFIELD_MULTI(IDirectDraw2);
    ICOM_VFIELD_MULTI(IDirectDraw);
105 106 107 108
    ICOM_VFIELD_MULTI(IDirect3D7);
    ICOM_VFIELD_MULTI(IDirect3D3);
    ICOM_VFIELD_MULTI(IDirect3D2);
    ICOM_VFIELD_MULTI(IDirect3D);
109

110
    /* See comment in IDirectDraw::AddRef */
111
    LONG                    ref7, ref4, ref2, ref3, ref1, numIfaces;
112

113 114 115 116 117
    /* WineD3D linkage */
    IWineD3D                *wineD3D;
    IWineD3DDevice          *wineD3DDevice;
    IDirectDrawSurfaceImpl  *DepthStencilBuffer;
    BOOL                    d3d_initialized;
118

119
    /* Misc ddraw fields */
120 121 122 123
    UINT                    total_vidmem;
    DWORD                   cur_scanline;
    BOOL                    fake_vblank;
    BOOL                    initialized;
124

125 126
    /* DirectDraw things, which are not handled by WineD3D */
    DWORD                   cooperative_level;
127

128 129
    DWORD                   orig_width, orig_height;
    DWORD                   orig_bpp;
130

131
    DDCAPS                  caps;
132

133 134 135 136
    /* D3D things */
    IDirectDrawSurfaceImpl  *d3d_target;
    HWND                    d3d_window;
    IDirect3DDeviceImpl     *d3ddevice;
137
    int                     d3dversion;
138

139
    /* Various HWNDs */
140 141
    HWND                    focuswindow;
    HWND                    devicewindow;
142

143
    /* The surface type to request */
144
    WINED3DSURFTYPE         ImplType;
145

146 147 148 149 150 151 152 153 154 155

    /* Our private window class */
    char classname[32];
    WNDCLASSA wnd_class;

    /* Helpers for surface creation */
    IDirectDrawSurfaceImpl *tex_root;
    BOOL                    depthstencil;

    /* For the dll unload cleanup code */
156
    struct list ddraw_list_entry;
157 158 159 160
    /* The surface list - can't relay this to WineD3D
     * because of IParent
     */
    struct list surface_list;
161
    LONG surfaces;
162 163 164 165

    /* FVF management */
    struct FvfToDecl       *decls;
    UINT                    numConvertedDecls, declArraySize;
166 167
};

168 169 170
/* Declare the VTables. They can be found ddraw.c */
const IDirectDraw7Vtbl IDirectDraw7_Vtbl;
const IDirectDraw4Vtbl IDirectDraw4_Vtbl;
171
const IDirectDraw3Vtbl IDirectDraw3_Vtbl;
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
const IDirectDraw2Vtbl IDirectDraw2_Vtbl;
const IDirectDrawVtbl  IDirectDraw1_Vtbl;

/* Helper structures */
typedef struct EnumDisplayModesCBS
{
    void *context;
    LPDDENUMMODESCALLBACK2 callback;
} EnumDisplayModesCBS;

typedef struct EnumSurfacesCBS
{
    void *context;
    LPDDENUMSURFACESCALLBACK7 callback;
    LPDDSURFACEDESC2 pDDSD;
    DWORD Flags;
} EnumSurfacesCBS;

/* Utility functions */
void
DDRAW_Convert_DDSCAPS_1_To_2(const DDSCAPS* pIn,
                             DDSCAPS2* pOut);
void
DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(const DDDEVICEIDENTIFIER2* pIn,
                                        DDDEVICEIDENTIFIER* pOut);
void
IDirectDrawImpl_Destroy(IDirectDrawImpl *This);

HRESULT WINAPI
IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf,
                                         DDSURFACEDESC2 *desc,
                                         void *Context);
204 205 206 207
IWineD3DVertexDeclaration *
IDirectDrawImpl_FindDecl(IDirectDrawImpl *This,
                         DWORD fvf);

208 209 210
/* The default surface type */
extern WINED3DSURFTYPE DefaultSurfaceType;

211 212
/*****************************************************************************
 * IDirectDrawSurface implementation structure
213
 *****************************************************************************/
214 215

struct IDirectDrawSurfaceImpl
216
{
217 218 219
    /* IUnknown fields */
    ICOM_VFIELD_MULTI(IDirectDrawSurface7);
    ICOM_VFIELD_MULTI(IDirectDrawSurface3);
220
    ICOM_VFIELD_MULTI(IDirectDrawGammaControl);
221 222
    ICOM_VFIELD_MULTI(IDirect3DTexture2);
    ICOM_VFIELD_MULTI(IDirect3DTexture);
223

224
    LONG                     ref;
225
    IUnknown                *ifaceToRelease;
226

227
    int                     version;
228

229 230 231
    /* Connections to other Objects */
    IDirectDrawImpl         *ddraw;
    IWineD3DSurface         *WineD3DSurface;
232
    IWineD3DBaseTexture     *wineD3DTexture;
233

234 235 236
    /* This implementation handles attaching surfaces to other surfaces */
    IDirectDrawSurfaceImpl  *next_attached;
    IDirectDrawSurfaceImpl  *first_attached;
237 238 239 240 241 242 243 244 245 246 247 248

    /* Complex surfaces are organized in a tree, although the tree is degenerated to a list in most cases.
     * In mipmap and primary surfaces each level has only one attachment, which is the next surface level.
     * Only the cube texture root has 6 surfaces attached, which then have a normal mipmap chain attached
     * to them. So hardcode the array to 6, a dynamic array or a list would be an overkill.
     */
#define MAX_COMPLEX_ATTACHED 6
    IDirectDrawSurfaceImpl  *complex_array[MAX_COMPLEX_ATTACHED];
    /* You can't traverse the tree upwards. Only a flag for Surface::Release because its needed there,
     * but no pointer to prevent temptations to traverse it in the wrong direction.
     */
    BOOL                    is_complex_root;
249

250 251
    /* Surface description, for GetAttachedSurface */
    DDSURFACEDESC2          surface_desc;
252

253 254 255 256
    /* Misc things */
    DWORD                   uniqueness_value;
    UINT                    mipmap_level;
    WINED3DSURFTYPE         ImplType;
257

258 259
    /* For D3DDevice creation */
    BOOL                    isRenderTarget;
260

261 262
    /* Clipper objects */
    IDirectDrawClipperImpl  *clipper;
263

264
    /* For the ddraw surface list */
265
    struct list             surface_list_entry;
266 267

    DWORD                   Handle;
268
};
269

270 271 272 273 274 275
/* VTable declaration. It's located in surface.c / surface_thunks.c */
const IDirectDrawSurface7Vtbl IDirectDrawSurface7_Vtbl;
const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl;
const IDirectDrawGammaControlVtbl IDirectDrawGammaControl_Vtbl;
const IDirect3DTexture2Vtbl IDirect3DTexture2_Vtbl;
const IDirect3DTextureVtbl IDirect3DTexture1_Vtbl;
276

277
HRESULT WINAPI IDirectDrawSurfaceImpl_AddAttachedSurface(IDirectDrawSurfaceImpl *This, IDirectDrawSurfaceImpl *Surf);
278
void IDirectDrawSurfaceImpl_Destroy(IDirectDrawSurfaceImpl *This);
279

280 281 282
/* Get the number of bytes per pixel for a given surface */
#define PFGET_BPP(pf) (pf.dwFlags&DDPF_PALETTEINDEXED8?1:((pf.dwRGBBitCount+7)/8))
#define GET_BPP(desc) PFGET_BPP(desc.ddpfPixelFormat)
283

284 285 286 287 288 289 290 291
/*****************************************************************************
 * IParent Implementation
 *****************************************************************************/
struct IParentImpl
{
    /* IUnknown fields */
    ICOM_VFIELD_MULTI(IParent);
    LONG                    ref;
292

293 294
    /* IParentImpl fields */
    IUnknown      *child;
295

296
};
297

298
const IParentVtbl IParent_Vtbl;
299

300 301 302
/*****************************************************************************
 * IDirect3DDevice implementation
 *****************************************************************************/
303 304 305 306
typedef enum
{
    DDrawHandle_Unknown       = 0,
    DDrawHandle_Texture       = 1,
307
    DDrawHandle_Material      = 2,
308 309
    DDrawHandle_Matrix        = 3,
    DDrawHandle_StateBlock    = 4
310 311 312 313 314 315 316 317
} DDrawHandleTypes;

struct HandleEntry
{
    void    *ptr;
    DDrawHandleTypes      type;
};

318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349
struct IDirect3DDeviceImpl
{
    /* IUnknown */
    ICOM_VFIELD_MULTI(IDirect3DDevice7);
    ICOM_VFIELD_MULTI(IDirect3DDevice3);
    ICOM_VFIELD_MULTI(IDirect3DDevice2);
    ICOM_VFIELD_MULTI(IDirect3DDevice);
    LONG                    ref;

    /* Other object connections */
    IWineD3DDevice          *wineD3DDevice;
    IDirectDrawImpl         *ddraw;
    IWineD3DIndexBuffer     *indexbuffer;
    IDirectDrawSurfaceImpl  *target;
    BOOL                    OffScreenTarget;

    /* Viewport management */
    IDirect3DViewportImpl *viewport_list;
    IDirect3DViewportImpl *current_viewport;
    D3DVIEWPORT7 active_viewport;

    /* Light state */
    DWORD material;

    /* Rendering functions to wrap D3D(1-3) to D3D7 */
    D3DPRIMITIVETYPE primitive_type;
    DWORD vertex_type;
    DWORD render_flags;
    DWORD nb_vertices;
    LPBYTE vertex_buffer;
    DWORD vertex_size;
    DWORD buffer_size;
350 351 352 353

    /* Handle management */
    struct HandleEntry      *Handles;
    DWORD                    numHandles;
354
    D3DMATRIXHANDLE          world, proj, view;
355
};
356

357 358 359 360 361
/* Vtables in various versions */
const IDirect3DDevice7Vtbl IDirect3DDevice7_Vtbl;
const IDirect3DDevice3Vtbl IDirect3DDevice3_Vtbl;
const IDirect3DDevice2Vtbl IDirect3DDevice2_Vtbl;
const IDirect3DDeviceVtbl  IDirect3DDevice1_Vtbl;
362

363 364
/* The IID */
const GUID IID_D3DDEVICE_WineD3D;
365

366 367
/* Helper functions */
HRESULT IDirect3DImpl_GetCaps(IWineD3D *WineD3D, D3DDEVICEDESC *Desc123, D3DDEVICEDESC7 *Desc7);
368
DWORD IDirect3DDeviceImpl_CreateHandle(IDirect3DDeviceImpl *This);
369
WINED3DZBUFFERTYPE IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DDeviceImpl *This);
370

371 372
/* Structures */
struct EnumTextureFormatsCBS
373
{
374 375 376 377
    LPD3DENUMTEXTUREFORMATSCALLBACK cbv2;
    LPD3DENUMPIXELFORMATSCALLBACK cbv7;
    void *Context;
};
378

379 380 381
/*****************************************************************************
 * IDirect3D implementation
 *****************************************************************************/
382

383 384 385 386 387 388 389 390 391 392
/* No implementation structure as this is only another interface to DirectDraw */

/* the Vtables */
const IDirect3DVtbl  IDirect3D1_Vtbl;
const IDirect3D2Vtbl IDirect3D2_Vtbl;
const IDirect3D3Vtbl IDirect3D3_Vtbl;
const IDirect3D7Vtbl IDirect3D7_Vtbl;

/* Structure for EnumZBufferFormats */
struct EnumZBufferFormatsData
393
{
394 395 396
    LPD3DENUMPIXELFORMATSCALLBACK Callback;
    void *Context;
};
397

398 399 400 401 402 403 404 405
/*****************************************************************************
 * IDirectDrawClipper implementation structure
 *****************************************************************************/
struct IDirectDrawClipperImpl
{
    /* IUnknown fields */
    ICOM_VFIELD_MULTI(IDirectDrawClipper);
    LONG ref;
406

407 408
    IWineD3DClipper           *wineD3DClipper;
    IDirectDrawImpl           *ddraw_owner;
409
};
410

411
const IDirectDrawClipperVtbl IDirectDrawClipper_Vtbl;
412

413 414 415
typedef IWineD3DClipper* (WINAPI *fnWineDirect3DCreateClipper)(IUnknown *);
fnWineDirect3DCreateClipper pWineDirect3DCreateClipper;

416
/*****************************************************************************
417 418 419 420 421 422 423
 * IDirectDrawPalette implementation structure
 *****************************************************************************/
struct IDirectDrawPaletteImpl
{
    /* IUnknown fields */
    ICOM_VFIELD_MULTI(IDirectDrawPalette);
    LONG ref;
424

425 426
    /* WineD3D uplink */
    IWineD3DPalette           *wineD3DPalette;
427

428 429
    /* IDirectDrawPalette fields */
    IDirectDrawImpl           *ddraw_owner;
430
    IUnknown                  *ifaceToRelease;
431 432
};
const IDirectDrawPaletteVtbl IDirectDrawPalette_Vtbl;
433

434
/******************************************************************************
435
 * DirectDraw ClassFactory implementation - incomplete
436 437 438 439
 ******************************************************************************/
typedef struct
{
    ICOM_VFIELD_MULTI(IClassFactory);
440

441 442 443
    LONG ref;
    HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, REFIID iid, LPVOID *ppObj);
} IClassFactoryImpl;
444

445 446 447 448 449 450 451
/* Helper structures */
struct object_creation_info
{
    const CLSID *clsid;
    HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, REFIID riid,
                                 void **ppObj);
};
452

453 454 455 456 457 458 459
/******************************************************************************
 * IDirect3DLight implementation structure - Wraps to D3D7
 ******************************************************************************/
struct IDirect3DLightImpl
{
    ICOM_VFIELD_MULTI(IDirect3DLight);
    LONG ref;
460

461 462
    /* IDirect3DLight fields */
    IDirectDrawImpl           *ddraw;
463

464 465
    /* If this light is active for one viewport, put the viewport here */
    IDirect3DViewportImpl     *active_viewport;
466

467 468
    D3DLIGHT2 light;
    D3DLIGHT7 light7;
469

470
    DWORD dwLightIndex;
471

472 473
    /* Chained list used for adding / removing from viewports */
    IDirect3DLightImpl        *next;
474

475 476 477 478 479
    /* Activation function */
    void                      (*activate)(IDirect3DLightImpl*);
    void                      (*desactivate)(IDirect3DLightImpl*);
    void                      (*update)(IDirect3DLightImpl*);
};
480

481 482
/* Vtable */
const IDirect3DLightVtbl IDirect3DLight_Vtbl;
483

484 485 486 487
/* Helper functions */
void light_update(IDirect3DLightImpl* This);
void light_activate(IDirect3DLightImpl* This);
void light_desactivate(IDirect3DLightImpl* This);
488

489 490 491 492
/******************************************************************************
 * IDirect3DMaterial implementation structure - Wraps to D3D7
 ******************************************************************************/
struct IDirect3DMaterialImpl
493
{
494 495 496 497
    ICOM_VFIELD_MULTI(IDirect3DMaterial3);
    ICOM_VFIELD_MULTI(IDirect3DMaterial2);
    ICOM_VFIELD_MULTI(IDirect3DMaterial);
    LONG  ref;
498

499 500 501
    /* IDirect3DMaterial2 fields */
    IDirectDrawImpl               *ddraw;
    IDirect3DDeviceImpl           *active_device;
502

503
    D3DMATERIAL mat;
504
    DWORD Handle;
505 506 507 508

    void (*activate)(IDirect3DMaterialImpl* this);
};

509
/* VTables in various versions */
510 511 512 513 514 515
const IDirect3DMaterialVtbl IDirect3DMaterial_Vtbl;
const IDirect3DMaterial2Vtbl IDirect3DMaterial2_Vtbl;
const IDirect3DMaterial3Vtbl IDirect3DMaterial3_Vtbl;

/* Helper functions */
void material_activate(IDirect3DMaterialImpl* This);
516 517

/*****************************************************************************
518 519 520
 * IDirect3DViewport - Wraps to D3D7
 *****************************************************************************/
struct IDirect3DViewportImpl
521
{
522 523 524 525 526 527 528 529
    ICOM_VFIELD_MULTI(IDirect3DViewport3);
    LONG ref;

    /* IDirect3DViewport fields */
    IDirectDrawImpl           *ddraw;

    /* If this viewport is active for one device, put the device here */
    IDirect3DDeviceImpl       *active_device;
530

531 532 533 534
    DWORD                     num_lights;
    DWORD                     map_lights;

    int                       use_vp2;
535 536 537

    union
    {
538 539 540
        D3DVIEWPORT vp1;
        D3DVIEWPORT2 vp2;
    } viewports;
541

542 543
    /* Activation function */
    void                      (*activate)(IDirect3DViewportImpl*);
544

545 546
    /* Field used to chain viewports together */
    IDirect3DViewportImpl     *next;
547

548 549 550 551 552
    /* Lights list */
    IDirect3DLightImpl        *lights;

    /* Background material */
    IDirect3DMaterialImpl     *background;
553 554
};

555 556
/* Vtable */
const IDirect3DViewport3Vtbl IDirect3DViewport3_Vtbl;
557

558 559
/* Helper functions */
void viewport_activate(IDirect3DViewportImpl* This);
560 561

/*****************************************************************************
562 563 564
 * IDirect3DExecuteBuffer - Wraps to D3D7
 *****************************************************************************/
struct IDirect3DExecuteBufferImpl
565
{
566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
    /* IUnknown */
    ICOM_VFIELD_MULTI(IDirect3DExecuteBuffer);
    LONG                 ref;

    /* IDirect3DExecuteBuffer fields */
    IDirectDrawImpl      *ddraw;
    IDirect3DDeviceImpl  *d3ddev;

    D3DEXECUTEBUFFERDESC desc;
    D3DEXECUTEDATA       data;

    /* This buffer will store the transformed vertices */
    void                 *vertex_data;
    WORD                 *indices;
    int                  nb_indices;

    /* This flags is set to TRUE if we allocated ourselves the
     * data buffer
     */
    BOOL                 need_free;
586 587
};

588 589 590 591 592 593 594 595
/* The VTable */
const IDirect3DExecuteBufferVtbl IDirect3DExecuteBuffer_Vtbl;

/* The execute function */
void
IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
                                   IDirect3DDeviceImpl *Device,
                                   IDirect3DViewportImpl *ViewportImpl);
596 597

/*****************************************************************************
598 599 600 601 602 603 604 605
 * IDirect3DVertexBuffer
 *****************************************************************************/
struct IDirect3DVertexBufferImpl
{
    /*** IUnknown Methods ***/
    ICOM_VFIELD_MULTI(IDirect3DVertexBuffer7);
    ICOM_VFIELD_MULTI(IDirect3DVertexBuffer);
    LONG                 ref;
606

607
    /*** WineD3D and ddraw links ***/
608
    IWineD3DVertexBuffer *wineD3DVertexBuffer;
609
    IWineD3DVertexDeclaration *wineD3DVertexDeclaration;
610
    IDirectDrawImpl *ddraw;
611

612 613
    /*** Storage for D3D7 specific things ***/
    DWORD                Caps;
614 615
};

616 617 618
/* The Vtables */
const IDirect3DVertexBuffer7Vtbl IDirect3DVertexBuffer7_Vtbl;
const IDirect3DVertexBufferVtbl IDirect3DVertexBuffer1_Vtbl;
619 620

/*****************************************************************************
621 622 623 624 625 626 627 628 629 630
 * Helper functions from utils.c
 *****************************************************************************/

#define GET_TEXCOUNT_FROM_FVF(d3dvtVertexType) \
    (((d3dvtVertexType) & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT)

#define GET_TEXCOORD_SIZE_FROM_FVF(d3dvtVertexType, tex_num) \
    (((((d3dvtVertexType) >> (16 + (2 * (tex_num)))) + 1) & 0x03) + 1)

void PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, WINED3DFORMAT WineD3DFormat);
631
WINED3DFORMAT PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat);
632 633
void DDRAW_dump_surface_desc(const DDSURFACEDESC2 *lpddsd);
void DDRAW_dump_pixelformat(const DDPIXELFORMAT *PixelFormat);
634
void dump_D3DMATRIX(const D3DMATRIX *mat);
635 636 637 638 639 640 641
void DDRAW_dump_DDCAPS(const DDCAPS *lpcaps);
DWORD get_flexible_vertex_size(DWORD d3dvtVertexType);
void DDRAW_dump_DDSCAPS2(const DDSCAPS2 *in);
void DDRAW_dump_cooperativelevel(DWORD cooplevel);

/* This only needs to be here as long the processvertices functionality of
 * IDirect3DExecuteBuffer isn't in WineD3D */
642
void multiply_matrix(LPD3DMATRIX dest, const D3DMATRIX *src1, const D3DMATRIX *src2);
643 644

/* Used for generic dumping */
645 646
typedef struct
{
647 648 649
    DWORD val;
    const char* name;
} flag_info;
650

651
#define FE(x) { x, #x }
652

653 654 655 656 657 658 659
typedef struct
{
    DWORD val;
    const char* name;
    void (*func)(const void *);
    ptrdiff_t offset;
} member_info;
660

661 662
/* Structure copy */
#define ME(x,f,e) { x, #x, (void (*)(const void *))(f), offsetof(STRUCT, e) }
663

664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682
#define DD_STRUCT_COPY_BYSIZE(to,from)                  \
        do {                                            \
                DWORD __size = (to)->dwSize;            \
                DWORD __copysize = __size;              \
                DWORD __resetsize = __size;             \
                assert(to != from);                     \
                if (__resetsize > sizeof(*to))          \
                    __resetsize = sizeof(*to);          \
                memset(to,0,__resetsize);               \
                if ((from)->dwSize < __size)            \
                    __copysize = (from)->dwSize;        \
                memcpy(to,from,__copysize);             \
                (to)->dwSize = __size;/*restore size*/  \
        } while (0)


#endif

HRESULT hr_ddraw_from_wined3d(HRESULT hr);