ddraw_private.h 23.4 KB
Newer Older
1
/*
2
 * Copyright 2006 Stefan Dösinger
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 23 24 25 26
#include <assert.h>
#define COBJMACROS
#define NONAMELESSSTRUCT
#define NONAMELESSUNION
#include "wine/debug.h"
27

28 29
#include "winbase.h"
#include "wingdi.h"
Patrik Stridvall's avatar
Patrik Stridvall committed
30
#include "winuser.h"
31

32 33
#include "d3d.h"
#include "ddraw.h"
34 35 36
#ifdef DDRAW_INIT_GUID
#include "initguid.h"
#endif
37
#include "wine/list.h"
38
#include "wine/wined3d.h"
39

40 41
extern const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops DECLSPEC_HIDDEN;

42
/*****************************************************************************
43 44 45 46
 * IParent - a helper interface
 *****************************************************************************/
DEFINE_GUID(IID_IParent, 0xc20e4c88, 0x74e7, 0x4940, 0xba, 0x9f, 0x2e, 0x32, 0x3f, 0x9d, 0xc9, 0x81);
typedef struct IParent *LPPARENT, *PPARENT;
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 77
#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;
78

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

82
/* Global critical section */
83
extern CRITICAL_SECTION ddraw_cs DECLSPEC_HIDDEN;
84

85
extern DWORD force_refresh_rate DECLSPEC_HIDDEN;
86

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

struct IDirectDrawImpl
{
98
    /* IUnknown fields */
99
    const IDirectDraw7Vtbl *lpVtbl;
100 101 102 103 104 105 106 107
    const IDirectDraw4Vtbl *IDirectDraw4_vtbl;
    const IDirectDraw3Vtbl *IDirectDraw3_vtbl;
    const IDirectDraw2Vtbl *IDirectDraw2_vtbl;
    const IDirectDrawVtbl *IDirectDraw_vtbl;
    const IDirect3D7Vtbl *IDirect3D7_vtbl;
    const IDirect3D3Vtbl *IDirect3D3_vtbl;
    const IDirect3D2Vtbl *IDirect3D2_vtbl;
    const IDirect3DVtbl *IDirect3D_vtbl;
108
    const IWineD3DDeviceParentVtbl *device_parent_vtbl;
109

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

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

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

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

127 128
    DWORD                   orig_width, orig_height;
    DWORD                   orig_bpp;
129

130 131 132 133
    /* D3D things */
    IDirectDrawSurfaceImpl  *d3d_target;
    HWND                    d3d_window;
    IDirect3DDeviceImpl     *d3ddevice;
134
    int                     d3dversion;
135

136
    /* Various HWNDs */
137 138
    HWND                    focuswindow;
    HWND                    devicewindow;
139
    HWND                    dest_window;
140

141
    /* The surface type to request */
142
    WINED3DSURFTYPE         ImplType;
143

144 145 146 147 148
    /* Helpers for surface creation */
    IDirectDrawSurfaceImpl *tex_root;
    BOOL                    depthstencil;

    /* For the dll unload cleanup code */
149
    struct list ddraw_list_entry;
150 151 152 153
    /* The surface list - can't relay this to WineD3D
     * because of IParent
     */
    struct list surface_list;
154
    LONG surfaces;
155 156 157 158

    /* FVF management */
    struct FvfToDecl       *decls;
    UINT                    numConvertedDecls, declArraySize;
159 160
};

161 162
#define DDRAW_WINDOW_CLASS_NAME "ddraw_wc"

163
HRESULT ddraw_init(IDirectDrawImpl *ddraw, WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN;
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180

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

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

/* Utility functions */
181 182
void DDRAW_Convert_DDSCAPS_1_To_2(const DDSCAPS *pIn, DDSCAPS2 *pOut) DECLSPEC_HIDDEN;
void DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(const DDDEVICEIDENTIFIER2 *pIn, DDDEVICEIDENTIFIER *pOut) DECLSPEC_HIDDEN;
183
HRESULT WINAPI ddraw_recreate_surfaces_cb(IDirectDrawSurface7 *surf,
184
        DDSURFACEDESC2 *desc, void *Context) DECLSPEC_HIDDEN;
185
IWineD3DVertexDeclaration *ddraw_find_decl(IDirectDrawImpl *This, DWORD fvf) DECLSPEC_HIDDEN;
186

187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
static inline IDirectDrawImpl *ddraw_from_d3d1(IDirect3D *iface)
{
    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirect3D_vtbl));
}

static inline IDirectDrawImpl *ddraw_from_d3d2(IDirect3D2 *iface)
{
    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirect3D2_vtbl));
}

static inline IDirectDrawImpl *ddraw_from_d3d3(IDirect3D3 *iface)
{
    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirect3D3_vtbl));
}

static inline IDirectDrawImpl *ddraw_from_d3d7(IDirect3D7 *iface)
{
    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirect3D7_vtbl));
}

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

210 211 212 213
extern typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper DECLSPEC_HIDDEN;
extern typeof(WineDirect3DCreate) *pWineDirect3DCreate DECLSPEC_HIDDEN;


214 215
/*****************************************************************************
 * IDirectDrawSurface implementation structure
216
 *****************************************************************************/
217 218

struct IDirectDrawSurfaceImpl
219
{
220
    /* IUnknown fields */
221
    const IDirectDrawSurface7Vtbl *lpVtbl;
222 223 224 225
    const IDirectDrawSurface3Vtbl *IDirectDrawSurface3_vtbl;
    const IDirectDrawGammaControlVtbl *IDirectDrawGammaControl_vtbl;
    const IDirect3DTexture2Vtbl *IDirect3DTexture2_vtbl;
    const IDirect3DTextureVtbl *IDirect3DTexture_vtbl;
226

227
    LONG                     ref;
228
    IUnknown                *ifaceToRelease;
229

230
    int                     version;
231

232 233 234
    /* Connections to other Objects */
    IDirectDrawImpl         *ddraw;
    IWineD3DSurface         *WineD3DSurface;
235
    IWineD3DBaseTexture     *wineD3DTexture;
236
    IWineD3DSwapChain       *wineD3DSwapChain;
237

238 239 240
    /* This implementation handles attaching surfaces to other surfaces */
    IDirectDrawSurfaceImpl  *next_attached;
    IDirectDrawSurfaceImpl  *first_attached;
241 242 243 244 245 246 247 248 249 250 251 252

    /* 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;
253

254 255
    /* Surface description, for GetAttachedSurface */
    DDSURFACEDESC2          surface_desc;
256

257 258 259 260
    /* Misc things */
    DWORD                   uniqueness_value;
    UINT                    mipmap_level;
    WINED3DSURFTYPE         ImplType;
261

262 263
    /* For D3DDevice creation */
    BOOL                    isRenderTarget;
264

265 266
    /* Clipper objects */
    IDirectDrawClipperImpl  *clipper;
267

268
    /* For the ddraw surface list */
269
    struct list             surface_list_entry;
270 271

    DWORD                   Handle;
272
};
273

274
void ddraw_surface_destroy(IDirectDrawSurfaceImpl *surface) DECLSPEC_HIDDEN;
275 276
HRESULT ddraw_surface_init(IDirectDrawSurfaceImpl *surface, IDirectDrawImpl *ddraw,
        DDSURFACEDESC2 *desc, UINT mip_level, WINED3DSURFTYPE surface_type) DECLSPEC_HIDDEN;
277

278 279 280 281 282 283 284 285 286 287
static inline IDirectDrawSurfaceImpl *surface_from_texture1(IDirect3DTexture *iface)
{
    return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirect3DTexture_vtbl));
}

static inline IDirectDrawSurfaceImpl *surface_from_texture2(IDirect3DTexture2 *iface)
{
    return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirect3DTexture2_vtbl));
}

288 289 290 291 292
static inline IDirectDrawSurfaceImpl *surface_from_surface3(IDirectDrawSurface3 *iface)
{
    return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirectDrawSurface3_vtbl));
}

293 294 295
/* 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)
296

297 298 299 300 301 302
/*****************************************************************************
 * IParent Implementation
 *****************************************************************************/
struct IParentImpl
{
    /* IUnknown fields */
303
    const IParentVtbl *lpVtbl;
304
    LONG                    ref;
305

306 307
    /* IParentImpl fields */
    IUnknown      *child;
308

309
};
310

311
void ddraw_parent_init(IParentImpl *parent) DECLSPEC_HIDDEN;
312

313 314 315
/*****************************************************************************
 * IDirect3DDevice implementation
 *****************************************************************************/
316

317 318 319 320 321 322
#define DDRAW_INVALID_HANDLE ~0U

enum ddraw_handle_type
{
    DDRAW_HANDLE_FREE,
    DDRAW_HANDLE_MATERIAL,
323
    DDRAW_HANDLE_MATRIX,
324
    DDRAW_HANDLE_STATEBLOCK,
325
    DDRAW_HANDLE_SURFACE,
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
};

struct ddraw_handle_entry
{
    void *object;
    enum ddraw_handle_type type;
};

struct ddraw_handle_table
{
    struct ddraw_handle_entry *entries;
    struct ddraw_handle_entry *free_entries;
    UINT table_size;
    UINT entry_count;
};

BOOL ddraw_handle_table_init(struct ddraw_handle_table *t, UINT initial_size) DECLSPEC_HIDDEN;
void ddraw_handle_table_destroy(struct ddraw_handle_table *t) DECLSPEC_HIDDEN;
DWORD ddraw_allocate_handle(struct ddraw_handle_table *t, void *object, enum ddraw_handle_type type) DECLSPEC_HIDDEN;
void *ddraw_free_handle(struct ddraw_handle_table *t, DWORD handle, enum ddraw_handle_type type) DECLSPEC_HIDDEN;
void *ddraw_get_object(struct ddraw_handle_table *t, DWORD handle, enum ddraw_handle_type type) DECLSPEC_HIDDEN;

348 349 350
struct IDirect3DDeviceImpl
{
    /* IUnknown */
351
    const IDirect3DDevice7Vtbl *lpVtbl;
352 353 354
    const IDirect3DDevice3Vtbl *IDirect3DDevice3_vtbl;
    const IDirect3DDevice2Vtbl *IDirect3DDevice2_vtbl;
    const IDirect3DDeviceVtbl *IDirect3DDevice_vtbl;
355 356 357 358 359
    LONG                    ref;

    /* Other object connections */
    IWineD3DDevice          *wineD3DDevice;
    IDirectDrawImpl         *ddraw;
360
    IWineD3DBuffer          *indexbuffer;
361 362 363 364 365 366 367
    IDirectDrawSurfaceImpl  *target;

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

368 369 370
    /* Required to keep track which of two available texture blending modes in d3ddevice3 is used */
    BOOL legacyTextureBlending;

371 372 373 374 375 376 377 378 379 380 381
    /* 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;
382 383

    /* Handle management */
384
    struct ddraw_handle_table handle_table;
385
    D3DMATRIXHANDLE          world, proj, view;
386
};
387

388 389
HRESULT d3d_device_init(IDirect3DDeviceImpl *device, IDirectDrawImpl *ddraw,
        IDirectDrawSurfaceImpl *target) DECLSPEC_HIDDEN;
390

391
/* The IID */
392
extern const GUID IID_D3DDEVICE_WineD3D DECLSPEC_HIDDEN;
393

394
/* Helper functions */
395 396
HRESULT IDirect3DImpl_GetCaps(IWineD3D *WineD3D, D3DDEVICEDESC *Desc123, D3DDEVICEDESC7 *Desc7) DECLSPEC_HIDDEN;
WINED3DZBUFFERTYPE IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DDeviceImpl *This) DECLSPEC_HIDDEN;
397

398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
static inline IDirect3DDeviceImpl *device_from_device1(IDirect3DDevice *iface)
{
    return (IDirect3DDeviceImpl *)((char*)iface - FIELD_OFFSET(IDirect3DDeviceImpl, IDirect3DDevice_vtbl));
}

static inline IDirect3DDeviceImpl *device_from_device2(IDirect3DDevice2 *iface)
{
    return (IDirect3DDeviceImpl *)((char*)iface - FIELD_OFFSET(IDirect3DDeviceImpl, IDirect3DDevice2_vtbl));
}

static inline IDirect3DDeviceImpl *device_from_device3(IDirect3DDevice3 *iface)
{
    return (IDirect3DDeviceImpl *)((char*)iface - FIELD_OFFSET(IDirect3DDeviceImpl, IDirect3DDevice3_vtbl));
}

413 414
/* Structures */
struct EnumTextureFormatsCBS
415
{
416 417 418 419
    LPD3DENUMTEXTUREFORMATSCALLBACK cbv2;
    LPD3DENUMPIXELFORMATSCALLBACK cbv7;
    void *Context;
};
420

421 422
/* Structure for EnumZBufferFormats */
struct EnumZBufferFormatsData
423
{
424 425 426
    LPD3DENUMPIXELFORMATSCALLBACK Callback;
    void *Context;
};
427

428 429 430 431 432 433
/*****************************************************************************
 * IDirectDrawClipper implementation structure
 *****************************************************************************/
struct IDirectDrawClipperImpl
{
    /* IUnknown fields */
434
    const IDirectDrawClipperVtbl *lpVtbl;
435
    LONG ref;
436

437
    IWineD3DClipper           *wineD3DClipper;
438
    BOOL initialized;
439
};
440

441
HRESULT ddraw_clipper_init(IDirectDrawClipperImpl *clipper) DECLSPEC_HIDDEN;
442 443

/*****************************************************************************
444 445 446 447 448
 * IDirectDrawPalette implementation structure
 *****************************************************************************/
struct IDirectDrawPaletteImpl
{
    /* IUnknown fields */
449
    const IDirectDrawPaletteVtbl *lpVtbl;
450
    LONG ref;
451

452 453
    /* WineD3D uplink */
    IWineD3DPalette           *wineD3DPalette;
454

455
    /* IDirectDrawPalette fields */
456
    IUnknown                  *ifaceToRelease;
457
};
458 459 460

HRESULT ddraw_palette_init(IDirectDrawPaletteImpl *palette,
        IDirectDrawImpl *ddraw, DWORD flags, PALETTEENTRY *entries) DECLSPEC_HIDDEN;
461

462
/******************************************************************************
463
 * DirectDraw ClassFactory implementation - incomplete
464 465 466
 ******************************************************************************/
typedef struct
{
467
    const IClassFactoryVtbl *lpVtbl;
468

469 470 471
    LONG ref;
    HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, REFIID iid, LPVOID *ppObj);
} IClassFactoryImpl;
472

473 474 475 476 477 478 479
/* Helper structures */
struct object_creation_info
{
    const CLSID *clsid;
    HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, REFIID riid,
                                 void **ppObj);
};
480

481 482 483 484 485
/******************************************************************************
 * IDirect3DLight implementation structure - Wraps to D3D7
 ******************************************************************************/
struct IDirect3DLightImpl
{
486
    const IDirect3DLightVtbl *lpVtbl;
487
    LONG ref;
488

489 490
    /* IDirect3DLight fields */
    IDirectDrawImpl           *ddraw;
491

492 493
    /* If this light is active for one viewport, put the viewport here */
    IDirect3DViewportImpl     *active_viewport;
494

495 496
    D3DLIGHT2 light;
    D3DLIGHT7 light7;
497

498
    DWORD dwLightIndex;
499

500 501 502
    /* Chained list used for adding / removing from viewports */
    IDirect3DLightImpl        *next;
};
503

504
/* Helper functions */
505 506
void light_activate(IDirect3DLightImpl *light) DECLSPEC_HIDDEN;
void light_deactivate(IDirect3DLightImpl *light) DECLSPEC_HIDDEN;
507
void d3d_light_init(IDirect3DLightImpl *light, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN;
508

509 510 511 512
/******************************************************************************
 * IDirect3DMaterial implementation structure - Wraps to D3D7
 ******************************************************************************/
struct IDirect3DMaterialImpl
513
{
514
    const IDirect3DMaterial3Vtbl *lpVtbl;
515 516
    const IDirect3DMaterial2Vtbl *IDirect3DMaterial2_vtbl;
    const IDirect3DMaterialVtbl *IDirect3DMaterial_vtbl;
517
    LONG  ref;
518

519 520 521
    /* IDirect3DMaterial2 fields */
    IDirectDrawImpl               *ddraw;
    IDirect3DDeviceImpl           *active_device;
522

523
    D3DMATERIAL mat;
524
    DWORD Handle;
525 526 527
};

/* Helper functions */
528
void material_activate(IDirect3DMaterialImpl* This) DECLSPEC_HIDDEN;
529
void d3d_material_init(IDirect3DMaterialImpl *material, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN;
530 531

/*****************************************************************************
532 533 534
 * IDirect3DViewport - Wraps to D3D7
 *****************************************************************************/
struct IDirect3DViewportImpl
535
{
536
    const IDirect3DViewport3Vtbl *lpVtbl;
537 538 539 540 541 542 543
    LONG ref;

    /* IDirect3DViewport fields */
    IDirectDrawImpl           *ddraw;

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

545 546 547 548
    DWORD                     num_lights;
    DWORD                     map_lights;

    int                       use_vp2;
549 550 551

    union
    {
552 553 554
        D3DVIEWPORT vp1;
        D3DVIEWPORT2 vp2;
    } viewports;
555

556 557
    /* Field used to chain viewports together */
    IDirect3DViewportImpl     *next;
558

559 560 561 562 563
    /* Lights list */
    IDirect3DLightImpl        *lights;

    /* Background material */
    IDirect3DMaterialImpl     *background;
564 565
};

566
/* Helper functions */
567
void viewport_activate(IDirect3DViewportImpl* This, BOOL ignore_lights) DECLSPEC_HIDDEN;
568
void d3d_viewport_init(IDirect3DViewportImpl *viewport, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN;
569 570

/*****************************************************************************
571 572 573
 * IDirect3DExecuteBuffer - Wraps to D3D7
 *****************************************************************************/
struct IDirect3DExecuteBufferImpl
574
{
575
    /* IUnknown */
576
    const IDirect3DExecuteBufferVtbl *lpVtbl;
577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594
    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;
595 596
};

597 598
HRESULT d3d_execute_buffer_init(IDirect3DExecuteBufferImpl *execute_buffer,
        IDirect3DDeviceImpl *device, D3DEXECUTEBUFFERDESC *desc) DECLSPEC_HIDDEN;
599 600

/* The execute function */
601 602
void IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
        IDirect3DDeviceImpl *Device, IDirect3DViewportImpl *ViewportImpl) DECLSPEC_HIDDEN;
603 604

/*****************************************************************************
605 606 607 608 609
 * IDirect3DVertexBuffer
 *****************************************************************************/
struct IDirect3DVertexBufferImpl
{
    /*** IUnknown Methods ***/
610
    const IDirect3DVertexBuffer7Vtbl *lpVtbl;
611
    const IDirect3DVertexBufferVtbl *IDirect3DVertexBuffer_vtbl;
612
    LONG                 ref;
613

614
    /*** WineD3D and ddraw links ***/
615
    IWineD3DBuffer *wineD3DVertexBuffer;
616
    IWineD3DVertexDeclaration *wineD3DVertexDeclaration;
617
    IDirectDrawImpl *ddraw;
618

619 620
    /*** Storage for D3D7 specific things ***/
    DWORD                Caps;
621
    DWORD                fvf;
622 623
};

624 625
HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer,
        IDirectDrawImpl *ddraw, D3DVERTEXBUFFERDESC *desc) DECLSPEC_HIDDEN;
626

627 628 629 630 631 632
static inline IDirect3DVertexBufferImpl *vb_from_vb1(IDirect3DVertexBuffer *iface)
{
    return (IDirect3DVertexBufferImpl *)((char*)iface
            - FIELD_OFFSET(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer_vtbl));
}

633
/*****************************************************************************
634 635 636 637 638 639 640 641 642
 * 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)

643 644
void PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, enum wined3d_format_id WineD3DFormat) DECLSPEC_HIDDEN;
enum wined3d_format_id PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) DECLSPEC_HIDDEN;
645 646 647 648 649 650
void DDRAW_dump_surface_desc(const DDSURFACEDESC2 *lpddsd) DECLSPEC_HIDDEN;
void dump_D3DMATRIX(const D3DMATRIX *mat) DECLSPEC_HIDDEN;
void DDRAW_dump_DDCAPS(const DDCAPS *lpcaps) DECLSPEC_HIDDEN;
DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN;
void DDRAW_dump_DDSCAPS2(const DDSCAPS2 *in) DECLSPEC_HIDDEN;
void DDRAW_dump_cooperativelevel(DWORD cooplevel) DECLSPEC_HIDDEN;
651 652 653

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

656
/* Helper function in main.c */
657
BOOL LoadWineD3D(void) DECLSPEC_HIDDEN;
658

659
/* Used for generic dumping */
660 661
typedef struct
{
662 663 664
    DWORD val;
    const char* name;
} flag_info;
665

666
#define FE(x) { x, #x }
667

668 669 670 671 672 673 674
typedef struct
{
    DWORD val;
    const char* name;
    void (*func)(const void *);
    ptrdiff_t offset;
} member_info;
675

676 677
/* Structure copy */
#define ME(x,f,e) { x, #x, (void (*)(const void *))(f), offsetof(STRUCT, e) }
678

679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696
#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

697
HRESULT hr_ddraw_from_wined3d(HRESULT hr) DECLSPEC_HIDDEN;