From 53240a7115b3c5fbc42bcc959e6bba859c76f4d4 Mon Sep 17 00:00:00 2001 From: Kamil Hornicek Date: Sat, 26 Sep 2009 11:13:40 +0000 Subject: [PATCH] - sync d3d8, d3d9, ddraw, wined3d with Wine 1.1.30 svn path=/trunk/; revision=43166 --- reactos/dll/directx/wine/d3d8/cubetexture.c | 54 +- reactos/dll/directx/wine/d3d8/d3d8_private.h | 116 +-- reactos/dll/directx/wine/d3d8/device.c | 685 ++++++-------- reactos/dll/directx/wine/d3d8/directx.c | 20 - reactos/dll/directx/wine/d3d8/indexbuffer.c | 51 +- reactos/dll/directx/wine/d3d8/pixelshader.c | 44 +- reactos/dll/directx/wine/d3d8/surface.c | 64 +- reactos/dll/directx/wine/d3d8/swapchain.c | 2 +- reactos/dll/directx/wine/d3d8/texture.c | 51 +- reactos/dll/directx/wine/d3d8/vertexbuffer.c | 50 +- .../dll/directx/wine/d3d8/vertexdeclaration.c | 87 +- reactos/dll/directx/wine/d3d8/vertexshader.c | 114 ++- reactos/dll/directx/wine/d3d8/volume.c | 47 +- reactos/dll/directx/wine/d3d8/volumetexture.c | 54 +- reactos/dll/directx/wine/d3d9/cubetexture.c | 75 +- reactos/dll/directx/wine/d3d9/d3d9_private.h | 144 +-- reactos/dll/directx/wine/d3d9/device.c | 488 +++++++--- reactos/dll/directx/wine/d3d9/directx.c | 21 +- reactos/dll/directx/wine/d3d9/indexbuffer.c | 71 +- reactos/dll/directx/wine/d3d9/pixelshader.c | 69 +- reactos/dll/directx/wine/d3d9/surface.c | 88 +- reactos/dll/directx/wine/d3d9/swapchain.c | 2 +- reactos/dll/directx/wine/d3d9/texture.c | 72 +- reactos/dll/directx/wine/d3d9/vertexbuffer.c | 69 +- .../dll/directx/wine/d3d9/vertexdeclaration.c | 100 +- reactos/dll/directx/wine/d3d9/vertexshader.c | 65 +- reactos/dll/directx/wine/d3d9/volume.c | 47 +- reactos/dll/directx/wine/d3d9/volumetexture.c | 76 +- reactos/dll/directx/wine/ddraw/ddraw.c | 174 ++-- .../dll/directx/wine/ddraw/ddraw_private.h | 150 ++- reactos/dll/directx/wine/ddraw/device.c | 64 +- reactos/dll/directx/wine/ddraw/direct3d.c | 15 +- reactos/dll/directx/wine/ddraw/main.c | 4 - reactos/dll/directx/wine/ddraw/surface.c | 60 +- reactos/dll/directx/wine/ddraw/utils.c | 109 ++- .../directx/wine/wined3d/arb_program_shader.c | 61 +- reactos/dll/directx/wine/wined3d/baseshader.c | 8 +- .../dll/directx/wine/wined3d/basetexture.c | 169 ++-- reactos/dll/directx/wine/wined3d/buffer.c | 62 +- reactos/dll/directx/wine/wined3d/context.c | 149 +-- .../dll/directx/wine/wined3d/cubetexture.c | 271 +++--- reactos/dll/directx/wine/wined3d/device.c | 481 ++++------ reactos/dll/directx/wine/wined3d/directx.c | 260 ++++-- reactos/dll/directx/wine/wined3d/drawprim.c | 46 +- .../dll/directx/wine/wined3d/glsl_shader.c | 46 +- .../dll/directx/wine/wined3d/pixelshader.c | 94 +- reactos/dll/directx/wine/wined3d/resource.c | 4 +- reactos/dll/directx/wine/wined3d/state.c | 12 +- reactos/dll/directx/wine/wined3d/stateblock.c | 7 +- reactos/dll/directx/wine/wined3d/surface.c | 189 ++-- .../dll/directx/wine/wined3d/surface_base.c | 36 +- .../dll/directx/wine/wined3d/surface_gdi.c | 27 +- reactos/dll/directx/wine/wined3d/swapchain.c | 14 +- .../dll/directx/wine/wined3d/swapchain_base.c | 2 +- .../dll/directx/wine/wined3d/swapchain_gdi.c | 13 +- reactos/dll/directx/wine/wined3d/texture.c | 376 ++++---- reactos/dll/directx/wine/wined3d/utils.c | 661 ++++++------- .../directx/wine/wined3d/vertexdeclaration.c | 168 ++-- .../dll/directx/wine/wined3d/vertexshader.c | 115 ++- reactos/dll/directx/wine/wined3d/volume.c | 44 +- .../dll/directx/wine/wined3d/volumetexture.c | 215 +++-- reactos/dll/directx/wine/wined3d/wined3d_gl.h | 884 +++++++++++------- .../dll/directx/wine/wined3d/wined3d_main.c | 12 +- .../directx/wine/wined3d/wined3d_private.h | 647 +++++++------ reactos/include/reactos/wine/wined3d.idl | 135 ++- 65 files changed, 4804 insertions(+), 3806 deletions(-) diff --git a/reactos/dll/directx/wine/d3d8/cubetexture.c b/reactos/dll/directx/wine/d3d8/cubetexture.c index d0b8f724ec0..d3ec98c1330 100644 --- a/reactos/dll/directx/wine/d3d8/cubetexture.c +++ b/reactos/dll/directx/wine/d3d8/cubetexture.c @@ -46,6 +46,14 @@ static ULONG WINAPI IDirect3DCubeTexture8Impl_AddRef(LPDIRECT3DCUBETEXTURE8 ifac TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IUnknown_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DCubeTexture_AddRef(This->wineD3DCubeTexture); + wined3d_mutex_unlock(); + } + return ref; } @@ -58,12 +66,10 @@ static ULONG WINAPI IDirect3DCubeTexture8Impl_Release(LPDIRECT3DCUBETEXTURE8 ifa if (ref == 0) { TRACE("Releasing child %p\n", This->wineD3DCubeTexture); - wined3d_mutex_lock(); - IWineD3DCubeTexture_Destroy(This->wineD3DCubeTexture, D3D8CB_DestroySurface); - wined3d_mutex_unlock(); - IUnknown_Release(This->parentDevice); - HeapFree(GetProcessHeap(), 0, This); + wined3d_mutex_lock(); + IWineD3DCubeTexture_Release(This->wineD3DCubeTexture); + wined3d_mutex_unlock(); } return ref; } @@ -286,8 +292,7 @@ static HRESULT WINAPI IDirect3DCubeTexture8Impl_AddDirtyRect(LPDIRECT3DCUBETEXTU return hr; } - -const IDirect3DCubeTexture8Vtbl Direct3DCubeTexture8_Vtbl = +static const IDirect3DCubeTexture8Vtbl Direct3DCubeTexture8_Vtbl = { /* IUnknown */ IDirect3DCubeTexture8Impl_QueryInterface, @@ -313,3 +318,38 @@ const IDirect3DCubeTexture8Vtbl Direct3DCubeTexture8_Vtbl = IDirect3DCubeTexture8Impl_UnlockRect, IDirect3DCubeTexture8Impl_AddDirtyRect }; + +static void STDMETHODCALLTYPE d3d8_cubetexture_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_cubetexture_wined3d_parent_ops = +{ + d3d8_cubetexture_wined3d_object_destroyed, +}; + +HRESULT cubetexture_init(IDirect3DCubeTexture8Impl *texture, IDirect3DDevice8Impl *device, + UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; + + texture->lpVtbl = &Direct3DCubeTexture8_Vtbl; + texture->ref = 1; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateCubeTexture(device->WineD3DDevice, edge_length, levels, usage & WINED3DUSAGE_MASK, + wined3dformat_from_d3dformat(format), pool, &texture->wineD3DCubeTexture, + (IUnknown *)texture, &d3d8_cubetexture_wined3d_parent_ops); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d cube texture, hr %#x.\n", hr); + return hr; + } + + texture->parentDevice = (IDirect3DDevice8 *)device; + IDirect3DDevice8_AddRef(texture->parentDevice); + + return D3D_OK; +} diff --git a/reactos/dll/directx/wine/d3d8/d3d8_private.h b/reactos/dll/directx/wine/d3d8/d3d8_private.h index 52abb84b5ec..2218f31ee98 100644 --- a/reactos/dll/directx/wine/d3d8/d3d8_private.h +++ b/reactos/dll/directx/wine/d3d8/d3d8_private.h @@ -97,7 +97,7 @@ _pD3D8Caps->PixelShaderVersion = _pWineCaps->PixelShaderVersion; \ _pD3D8Caps->MaxPixelShaderValue = _pWineCaps->PixelShader1xMaxValue; -void fixup_caps(WINED3DCAPS *pWineCaps); +void fixup_caps(WINED3DCAPS *pWineCaps) DECLSPEC_HIDDEN; /* Direct3D8 Interfaces: */ typedef struct IDirect3DBaseTexture8Impl IDirect3DBaseTexture8Impl; @@ -133,7 +133,7 @@ typedef struct IDirect3DVertexShader8Impl IDirect3DVertexShader8Impl; /***************************************************************************** * Predeclare the interface implementation structures */ -extern const IDirect3D8Vtbl Direct3D8_Vtbl; +extern const IDirect3D8Vtbl Direct3D8_Vtbl DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3D implementation structure @@ -155,8 +155,8 @@ struct IDirect3D8Impl /***************************************************************************** * Predeclare the interface implementation structures */ -extern const IDirect3DDevice8Vtbl Direct3DDevice8_Vtbl; -extern const IWineD3DDeviceParentVtbl d3d8_wined3d_device_parent_vtbl; +extern const IDirect3DDevice8Vtbl Direct3DDevice8_Vtbl DECLSPEC_HIDDEN; +extern const IWineD3DDeviceParentVtbl d3d8_wined3d_device_parent_vtbl DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DDevice8 implementation structure @@ -218,7 +218,6 @@ struct IDirect3DDevice8Impl /***************************************************************************** * IDirect3DVolume8 implementation structure */ -extern const IDirect3DVolume8Vtbl Direct3DVolume8_Vtbl; struct IDirect3DVolume8Impl { /* IUnknown fields */ @@ -235,6 +234,9 @@ struct IDirect3DVolume8Impl IUnknown *forwardReference; }; +HRESULT volume_init(IDirect3DVolume8Impl *volume, IDirect3DDevice8Impl *device, UINT width, UINT height, + UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool) DECLSPEC_HIDDEN; + /* ------------------- */ /* IDirect3DSwapChain8 */ /* ------------------- */ @@ -242,7 +244,7 @@ struct IDirect3DVolume8Impl /***************************************************************************** * Predeclare the interface implementation structures */ -extern const IDirect3DSwapChain8Vtbl Direct3DSwapChain8_Vtbl; +extern const IDirect3DSwapChain8Vtbl Direct3DSwapChain8_Vtbl DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DSwapChain8 implementation structure @@ -264,11 +266,6 @@ struct IDirect3DSwapChain8Impl /* IDirect3DSurface8 */ /* ----------------- */ -/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DSurface8Vtbl Direct3DSurface8_Vtbl; - /***************************************************************************** * IDirect3DSurface8 implementation structure */ @@ -289,11 +286,12 @@ struct IDirect3DSurface8Impl /* If set forward refcounting to this object */ IUnknown *forwardReference; - - /* Flags an implicit surface */ - BOOL isImplicit; }; +HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *device, + UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level, + DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) DECLSPEC_HIDDEN; + /* ------------------ */ /* IDirect3DResource8 */ /* ------------------ */ @@ -301,7 +299,7 @@ struct IDirect3DSurface8Impl /***************************************************************************** * Predeclare the interface implementation structures */ -extern const IDirect3DResource8Vtbl Direct3DResource8_Vtbl; +extern const IDirect3DResource8Vtbl Direct3DResource8_Vtbl DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DResource8 implementation structure @@ -320,11 +318,6 @@ struct IDirect3DResource8Impl /* IDirect3DVertexBuffer8 */ /* ---------------------- */ -/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl; - /***************************************************************************** * IDirect3DVertexBuffer8 implementation structure */ @@ -343,15 +336,13 @@ struct IDirect3DVertexBuffer8Impl DWORD fvf; }; +HRESULT vertexbuffer_init(IDirect3DVertexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, + UINT size, DWORD usage, DWORD fvf, D3DPOOL pool) DECLSPEC_HIDDEN; + /* --------------------- */ /* IDirect3DIndexBuffer8 */ /* --------------------- */ -/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DIndexBuffer8Vtbl Direct3DIndexBuffer8_Vtbl; - /***************************************************************************** * IDirect3DIndexBuffer8 implementation structure */ @@ -370,6 +361,9 @@ struct IDirect3DIndexBuffer8Impl WINED3DFORMAT format; }; +HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, + UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; + /* --------------------- */ /* IDirect3DBaseTexture8 */ /* --------------------- */ @@ -391,11 +385,6 @@ struct IDirect3DBaseTexture8Impl /* IDirect3DCubeTexture8 */ /* --------------------- */ -/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DCubeTexture8Vtbl Direct3DCubeTexture8_Vtbl; - /***************************************************************************** * IDirect3DCubeTexture8 implementation structure */ @@ -412,15 +401,13 @@ struct IDirect3DCubeTexture8Impl LPDIRECT3DDEVICE8 parentDevice; }; +HRESULT cubetexture_init(IDirect3DCubeTexture8Impl *texture, IDirect3DDevice8Impl *device, + UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; + /* ----------------- */ /* IDirect3DTexture8 */ /* ----------------- */ -/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl; - /***************************************************************************** * IDirect3DTexture8 implementation structure */ @@ -437,15 +424,13 @@ struct IDirect3DTexture8Impl LPDIRECT3DDEVICE8 parentDevice; }; +HRESULT texture_init(IDirect3DTexture8Impl *texture, IDirect3DDevice8Impl *device, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; + /* ----------------------- */ /* IDirect3DVolumeTexture8 */ /* ----------------------- */ -/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DVolumeTexture8Vtbl Direct3DVolumeTexture8_Vtbl; - /***************************************************************************** * IDirect3DVolumeTexture8 implementation structure */ @@ -462,6 +447,9 @@ struct IDirect3DVolumeTexture8Impl LPDIRECT3DDEVICE8 parentDevice; }; +HRESULT volumetexture_init(IDirect3DVolumeTexture8Impl *texture, IDirect3DDevice8Impl *device, + UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; + /* ----------------------- */ /* IDirect3DStateBlockImpl */ /* ----------------------- */ @@ -510,7 +498,7 @@ DECLARE_INTERFACE_(IDirect3DStateBlock8, IUnknown) /***************************************************************************** * Predeclare the interface implementation structures */ -extern const IDirect3DStateBlock8Vtbl Direct3DStateBlock8_Vtbl; +extern const IDirect3DStateBlock8Vtbl Direct3DStateBlock8_Vtbl DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DStateBlock implementation structure @@ -542,9 +530,6 @@ DECLARE_INTERFACE_(IDirect3DVertexDeclaration8, IUnknown) #define IDirect3DVertexDeclaration8_AddRef(p) (p)->lpVtbl->AddRef(p) #define IDirect3DVertexDeclaration8_Release(p) (p)->lpVtbl->Release(p) -/*** Implementation ***/ -extern const IDirect3DVertexDeclaration8Vtbl Direct3DVertexDeclaration8_Vtbl; - typedef struct { const IDirect3DVertexDeclaration8Vtbl *lpVtbl; LONG ref_count; @@ -556,6 +541,10 @@ typedef struct { DWORD shader_handle; } IDirect3DVertexDeclaration8Impl; +HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration8Impl *declaration, + IDirect3DDevice8Impl *device, const DWORD *elements, DWORD shader_handle) DECLSPEC_HIDDEN; +HRESULT vertexdeclaration_init_fvf(IDirect3DVertexDeclaration8Impl *declaration, + IDirect3DDevice8Impl *device, DWORD fvf) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DVertexShader8 interface @@ -597,11 +586,6 @@ DECLARE_INTERFACE_(IDirect3DPixelShader8,IUnknown) #define IDirect3DPixelShader8_AddRef(p) (p)->lpVtbl->AddRef(p) #define IDirect3DPixelShader8_Release(p) (p)->lpVtbl->Release(p) -/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DVertexShader8Vtbl Direct3DVertexShader8_Vtbl; - /***************************************************************************** * IDirect3DVertexShader implementation structure */ @@ -614,19 +598,11 @@ struct IDirect3DVertexShader8Impl { IWineD3DVertexShader *wineD3DVertexShader; }; +HRESULT vertexshader_init(IDirect3DVertexShader8Impl *shader, IDirect3DDevice8Impl *device, + const DWORD *declaration, const DWORD *byte_code, DWORD shader_handle, DWORD usage) DECLSPEC_HIDDEN; + #define D3D8_MAX_VERTEX_SHADER_CONSTANTF 256 - -/* ------------------------ */ -/* IDirect3DPixelShaderImpl */ -/* ------------------------ */ - - -/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DPixelShader8Vtbl Direct3DPixelShader8_Vtbl; - /***************************************************************************** * IDirect3DPixelShader implementation structure */ @@ -638,22 +614,22 @@ typedef struct IDirect3DPixelShader8Impl { IWineD3DPixelShader *wineD3DPixelShader; } IDirect3DPixelShader8Impl; +HRESULT pixelshader_init(IDirect3DPixelShader8Impl *shader, IDirect3DDevice8Impl *device, + const DWORD *byte_code, DWORD shader_handle) DECLSPEC_HIDDEN; + /** * Internals functions * * to see how not defined it here */ -D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format); -WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format); -void load_local_constants(const DWORD *d3d8_elements, IWineD3DVertexShader *wined3d_vertex_shader); -UINT convert_to_wined3d_declaration(const DWORD *d3d8_elements, DWORD *d3d8_elements_size, WINED3DVERTEXELEMENT **wined3d_elements); -size_t parse_token(const DWORD* pToken); +D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format) DECLSPEC_HIDDEN; +WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN; +void load_local_constants(const DWORD *d3d8_elements, IWineD3DVertexShader *wined3d_vertex_shader) DECLSPEC_HIDDEN; +UINT convert_to_wined3d_declaration(const DWORD *d3d8_elements, DWORD *d3d8_elements_size, + WINED3DVERTEXELEMENT **wined3d_elements) DECLSPEC_HIDDEN; +size_t parse_token(const DWORD *pToken) DECLSPEC_HIDDEN; /* Callbacks */ -extern ULONG WINAPI D3D8CB_DestroySwapChain (IWineD3DSwapChain *pSwapChain); -extern ULONG WINAPI D3D8CB_DestroyDepthStencilSurface (IWineD3DSurface *pSurface); -extern ULONG WINAPI D3D8CB_DestroyRenderTarget (IWineD3DSurface *pSurface); -extern ULONG WINAPI D3D8CB_DestroySurface(IWineD3DSurface *pSurface); -extern ULONG WINAPI D3D8CB_DestroyVolume(IWineD3DVolume *pVolume); +extern ULONG WINAPI D3D8CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain) DECLSPEC_HIDDEN; #endif /* __WINE_D3DX8_PRIVATE_H */ diff --git a/reactos/dll/directx/wine/d3d8/device.c b/reactos/dll/directx/wine/d3d8/device.c index 675eac134f3..0ec2e0736b5 100644 --- a/reactos/dll/directx/wine/d3d8/device.c +++ b/reactos/dll/directx/wine/d3d8/device.c @@ -46,37 +46,37 @@ D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format) switch(format) { case WINED3DFMT_UNKNOWN: return D3DFMT_UNKNOWN; - case WINED3DFMT_R8G8B8: return D3DFMT_R8G8B8; - case WINED3DFMT_A8R8G8B8: return D3DFMT_A8R8G8B8; - case WINED3DFMT_X8R8G8B8: return D3DFMT_X8R8G8B8; - case WINED3DFMT_R5G6B5: return D3DFMT_R5G6B5; - case WINED3DFMT_X1R5G5B5: return D3DFMT_X1R5G5B5; - case WINED3DFMT_A1R5G5B5: return D3DFMT_A1R5G5B5; - case WINED3DFMT_A4R4G4B4: return D3DFMT_A4R4G4B4; - case WINED3DFMT_R3G3B2: return D3DFMT_R3G3B2; + case WINED3DFMT_B8G8R8_UNORM: return D3DFMT_R8G8B8; + case WINED3DFMT_B8G8R8A8_UNORM: return D3DFMT_A8R8G8B8; + case WINED3DFMT_B8G8R8X8_UNORM: return D3DFMT_X8R8G8B8; + case WINED3DFMT_B5G6R5_UNORM: return D3DFMT_R5G6B5; + case WINED3DFMT_B5G5R5X1_UNORM: return D3DFMT_X1R5G5B5; + case WINED3DFMT_B5G5R5A1_UNORM: return D3DFMT_A1R5G5B5; + case WINED3DFMT_B4G4R4A4_UNORM: return D3DFMT_A4R4G4B4; + case WINED3DFMT_B2G3R3_UNORM: return D3DFMT_R3G3B2; case WINED3DFMT_A8_UNORM: return D3DFMT_A8; - case WINED3DFMT_A8R3G3B2: return D3DFMT_A8R3G3B2; - case WINED3DFMT_X4R4G4B4: return D3DFMT_X4R4G4B4; + case WINED3DFMT_B2G3R3A8_UNORM: return D3DFMT_A8R3G3B2; + case WINED3DFMT_B4G4R4X4_UNORM: return D3DFMT_X4R4G4B4; case WINED3DFMT_R10G10B10A2_UNORM: return D3DFMT_A2B10G10R10; case WINED3DFMT_R16G16_UNORM: return D3DFMT_G16R16; - case WINED3DFMT_A8P8: return D3DFMT_A8P8; - case WINED3DFMT_P8: return D3DFMT_P8; - case WINED3DFMT_L8: return D3DFMT_L8; - case WINED3DFMT_A8L8: return D3DFMT_A8L8; - case WINED3DFMT_A4L4: return D3DFMT_A4L4; + case WINED3DFMT_P8_UINT_A8_UNORM: return D3DFMT_A8P8; + case WINED3DFMT_P8_UINT: return D3DFMT_P8; + case WINED3DFMT_L8_UNORM: return D3DFMT_L8; + case WINED3DFMT_L8A8_UNORM: return D3DFMT_A8L8; + case WINED3DFMT_L4A4_UNORM: return D3DFMT_A4L4; case WINED3DFMT_R8G8_SNORM: return D3DFMT_V8U8; - case WINED3DFMT_L6V5U5: return D3DFMT_L6V5U5; - case WINED3DFMT_X8L8V8U8: return D3DFMT_X8L8V8U8; + case WINED3DFMT_R5G5_SNORM_L6_UNORM: return D3DFMT_L6V5U5; + case WINED3DFMT_R8G8_SNORM_L8X8_UNORM: return D3DFMT_X8L8V8U8; case WINED3DFMT_R8G8B8A8_SNORM: return D3DFMT_Q8W8V8U8; case WINED3DFMT_R16G16_SNORM: return D3DFMT_V16U16; - case WINED3DFMT_W11V11U10: return D3DFMT_W11V11U10; - case WINED3DFMT_A2W10V10U10: return D3DFMT_A2W10V10U10; + case WINED3DFMT_R10G11B11_SNORM: return D3DFMT_W11V11U10; + case WINED3DFMT_R10G10B10_SNORM_A2_UNORM: return D3DFMT_A2W10V10U10; case WINED3DFMT_D16_LOCKABLE: return D3DFMT_D16_LOCKABLE; - case WINED3DFMT_D32: return D3DFMT_D32; - case WINED3DFMT_D15S1: return D3DFMT_D15S1; - case WINED3DFMT_D24S8: return D3DFMT_D24S8; - case WINED3DFMT_D24X8: return D3DFMT_D24X8; - case WINED3DFMT_D24X4S4: return D3DFMT_D24X4S4; + case WINED3DFMT_D32_UNORM: return D3DFMT_D32; + case WINED3DFMT_S1_UINT_D15_UNORM: return D3DFMT_D15S1; + case WINED3DFMT_S8_UINT_D24_UNORM: return D3DFMT_D24S8; + case WINED3DFMT_X8D24_UNORM: return D3DFMT_D24X8; + case WINED3DFMT_S4X4_UINT_D24_UNORM: return D3DFMT_D24X4S4; case WINED3DFMT_D16_UNORM: return D3DFMT_D16; case WINED3DFMT_VERTEXDATA: return D3DFMT_VERTEXDATA; case WINED3DFMT_R16_UINT: return D3DFMT_INDEX16; @@ -97,37 +97,37 @@ WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format) switch(format) { case D3DFMT_UNKNOWN: return WINED3DFMT_UNKNOWN; - case D3DFMT_R8G8B8: return WINED3DFMT_R8G8B8; - case D3DFMT_A8R8G8B8: return WINED3DFMT_A8R8G8B8; - case D3DFMT_X8R8G8B8: return WINED3DFMT_X8R8G8B8; - case D3DFMT_R5G6B5: return WINED3DFMT_R5G6B5; - case D3DFMT_X1R5G5B5: return WINED3DFMT_X1R5G5B5; - case D3DFMT_A1R5G5B5: return WINED3DFMT_A1R5G5B5; - case D3DFMT_A4R4G4B4: return WINED3DFMT_A4R4G4B4; - case D3DFMT_R3G3B2: return WINED3DFMT_R3G3B2; + case D3DFMT_R8G8B8: return WINED3DFMT_B8G8R8_UNORM; + case D3DFMT_A8R8G8B8: return WINED3DFMT_B8G8R8A8_UNORM; + case D3DFMT_X8R8G8B8: return WINED3DFMT_B8G8R8X8_UNORM; + case D3DFMT_R5G6B5: return WINED3DFMT_B5G6R5_UNORM; + case D3DFMT_X1R5G5B5: return WINED3DFMT_B5G5R5X1_UNORM; + case D3DFMT_A1R5G5B5: return WINED3DFMT_B5G5R5A1_UNORM; + case D3DFMT_A4R4G4B4: return WINED3DFMT_B4G4R4A4_UNORM; + case D3DFMT_R3G3B2: return WINED3DFMT_B2G3R3_UNORM; case D3DFMT_A8: return WINED3DFMT_A8_UNORM; - case D3DFMT_A8R3G3B2: return WINED3DFMT_A8R3G3B2; - case D3DFMT_X4R4G4B4: return WINED3DFMT_X4R4G4B4; + case D3DFMT_A8R3G3B2: return WINED3DFMT_B2G3R3A8_UNORM; + case D3DFMT_X4R4G4B4: return WINED3DFMT_B4G4R4X4_UNORM; case D3DFMT_A2B10G10R10: return WINED3DFMT_R10G10B10A2_UNORM; case D3DFMT_G16R16: return WINED3DFMT_R16G16_UNORM; - case D3DFMT_A8P8: return WINED3DFMT_A8P8; - case D3DFMT_P8: return WINED3DFMT_P8; - case D3DFMT_L8: return WINED3DFMT_L8; - case D3DFMT_A8L8: return WINED3DFMT_A8L8; - case D3DFMT_A4L4: return WINED3DFMT_A4L4; + case D3DFMT_A8P8: return WINED3DFMT_P8_UINT_A8_UNORM; + case D3DFMT_P8: return WINED3DFMT_P8_UINT; + case D3DFMT_L8: return WINED3DFMT_L8_UNORM; + case D3DFMT_A8L8: return WINED3DFMT_L8A8_UNORM; + case D3DFMT_A4L4: return WINED3DFMT_L4A4_UNORM; case D3DFMT_V8U8: return WINED3DFMT_R8G8_SNORM; - case D3DFMT_L6V5U5: return WINED3DFMT_L6V5U5; - case D3DFMT_X8L8V8U8: return WINED3DFMT_X8L8V8U8; + case D3DFMT_L6V5U5: return WINED3DFMT_R5G5_SNORM_L6_UNORM; + case D3DFMT_X8L8V8U8: return WINED3DFMT_R8G8_SNORM_L8X8_UNORM; case D3DFMT_Q8W8V8U8: return WINED3DFMT_R8G8B8A8_SNORM; case D3DFMT_V16U16: return WINED3DFMT_R16G16_SNORM; - case D3DFMT_W11V11U10: return WINED3DFMT_W11V11U10; - case D3DFMT_A2W10V10U10: return WINED3DFMT_A2W10V10U10; + case D3DFMT_W11V11U10: return WINED3DFMT_R10G11B11_SNORM; + case D3DFMT_A2W10V10U10: return WINED3DFMT_R10G10B10_SNORM_A2_UNORM; case D3DFMT_D16_LOCKABLE: return WINED3DFMT_D16_LOCKABLE; - case D3DFMT_D32: return WINED3DFMT_D32; - case D3DFMT_D15S1: return WINED3DFMT_D15S1; - case D3DFMT_D24S8: return WINED3DFMT_D24S8; - case D3DFMT_D24X8: return WINED3DFMT_D24X8; - case D3DFMT_D24X4S4: return WINED3DFMT_D24X4S4; + case D3DFMT_D32: return WINED3DFMT_D32_UNORM; + case D3DFMT_D15S1: return WINED3DFMT_S1_UINT_D15_UNORM; + case D3DFMT_D24S8: return WINED3DFMT_S8_UINT_D24_UNORM; + case D3DFMT_D24X8: return WINED3DFMT_X8D24_UNORM; + case D3DFMT_D24X4S4: return WINED3DFMT_S4X4_UINT_D24_UNORM; case D3DFMT_D16: return WINED3DFMT_D16_UNORM; case D3DFMT_VERTEXDATA: return WINED3DFMT_VERTEXDATA; case D3DFMT_INDEX16: return WINED3DFMT_R16_UINT; @@ -309,7 +309,7 @@ static ULONG WINAPI IDirect3DDevice8Impl_Release(LPDIRECT3DDEVICE8 iface) { } HeapFree(GetProcessHeap(), 0, This->decls); - IWineD3DDevice_Uninit3D(This->WineD3DDevice, D3D8CB_DestroyDepthStencilSurface, D3D8CB_DestroySwapChain); + IWineD3DDevice_Uninit3D(This->WineD3DDevice, D3D8CB_DestroySwapChain); IWineD3DDevice_Release(This->WineD3DDevice); HeapFree(GetProcessHeap(), 0, This->handle_table.entries); HeapFree(GetProcessHeap(), 0, This); @@ -654,255 +654,193 @@ static void WINAPI IDirect3DDevice8Impl_GetGammaRamp(LPDIRECT3DDEVICE8 iface, D3 wined3d_mutex_unlock(); } -static HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, UINT Levels, DWORD Usage, - D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture8 **ppTexture) { - IDirect3DTexture8Impl *object; +static HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(IDirect3DDevice8 *iface, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, + D3DPOOL pool, IDirect3DTexture8 **texture) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hrc = D3D_OK; + IDirect3DTexture8Impl *object; + HRESULT hr; - TRACE("(%p) : W(%d) H(%d), Lvl(%d) d(%d), Fmt(%u), Pool(%d)\n", This, Width, Height, Levels, Usage, Format, Pool); + TRACE("iface %p, width %u, height %u, levels %u, usage %#x, format %#x, pool %#x, texture %p.\n", + iface, width, height, levels, usage, format, pool, texture); - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTexture8Impl)); - - if (NULL == object) { - FIXME("Allocation of memory failed\n"); -/* *ppTexture = NULL; */ + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate texture memory.\n"); return D3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &Direct3DTexture8_Vtbl; - object->ref = 1; - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateTexture(This->WineD3DDevice, Width, Height, Levels, Usage & WINED3DUSAGE_MASK, - wined3dformat_from_d3dformat(Format), Pool, &object->wineD3DTexture, (IUnknown *)object); - wined3d_mutex_unlock(); - - if (FAILED(hrc)) { - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreateTexture failed\n", This); + hr = texture_init(object, This, width, height, levels, usage, format, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize texture, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); -/* *ppTexture = NULL; */ - } else { - IUnknown_AddRef(iface); - object->parentDevice = iface; - *ppTexture = (LPDIRECT3DTEXTURE8) object; - TRACE("(%p) Created Texture %p, %p\n",This,object,object->wineD3DTexture); - } + return hr; + } - return hrc; + TRACE("Created texture %p.\n", object); + *texture = (IDirect3DTexture8 *)object; + + return D3D_OK; } static HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(IDirect3DDevice8 *iface, - UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, - D3DPOOL Pool, IDirect3DVolumeTexture8 **ppVolumeTexture) + UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, + D3DPOOL pool, IDirect3DVolumeTexture8 **texture) { - IDirect3DVolumeTexture8Impl *object; IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hrc = D3D_OK; + IDirect3DVolumeTexture8Impl *object; + HRESULT hr; - TRACE("(%p) Relay\n", This); + TRACE("iface %p, width %u, height %u, depth %u, levels %u, usage %#x, format %#x, pool %#x, texture %p.\n", + iface, width, height, depth, levels, usage, format, pool, texture); - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVolumeTexture8Impl)); - if (NULL == object) { - FIXME("(%p) allocation of memory failed\n", This); - *ppVolumeTexture = NULL; + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate volume texture memory.\n"); return D3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &Direct3DVolumeTexture8_Vtbl; - object->ref = 1; - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateVolumeTexture(This->WineD3DDevice, Width, Height, Depth, Levels, - Usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(Format), - Pool, &object->wineD3DVolumeTexture, (IUnknown *)object); - wined3d_mutex_unlock(); - - if (hrc != D3D_OK) { - - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreateVolumeTexture failed\n", This); + hr = volumetexture_init(object, This, width, height, depth, levels, usage, format, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize volume texture, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); - *ppVolumeTexture = NULL; - } else { - IUnknown_AddRef(iface); - object->parentDevice = iface; - *ppVolumeTexture = (LPDIRECT3DVOLUMETEXTURE8) object; + return hr; } - TRACE("(%p) returning %p\n", This , *ppVolumeTexture); - return hrc; + + TRACE("Created volume texture %p.\n", object); + *texture = (IDirect3DVolumeTexture8 *)object; + + return D3D_OK; } -static HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(IDirect3DDevice8 *iface, UINT EdgeLength, - UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture8 **ppCubeTexture) +static HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(IDirect3DDevice8 *iface, UINT edge_length, + UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, IDirect3DCubeTexture8 **texture) { - IDirect3DCubeTexture8Impl *object; IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hr = D3D_OK; + IDirect3DCubeTexture8Impl *object; + HRESULT hr; - TRACE("(%p) : ELen(%d) Lvl(%d) Usage(%d) fmt(%u), Pool(%d)\n" , This, EdgeLength, Levels, Usage, Format, Pool); + TRACE("iface %p, edge_length %u, levels %u, usage %#x, format %#x, pool %#x, texture %p.\n", + iface, edge_length, levels, usage, format, pool, texture); - /* Allocate the storage for the device */ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - - if (NULL == object) { - FIXME("(%p) allocation of CubeTexture failed\n", This); - *ppCubeTexture = NULL; + if (!object) + { + ERR("Failed to allocate cube texture memory.\n"); return D3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &Direct3DCubeTexture8_Vtbl; - object->ref = 1; - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateCubeTexture(This->WineD3DDevice, EdgeLength, Levels, Usage & WINED3DUSAGE_MASK, - wined3dformat_from_d3dformat(Format), Pool, &object->wineD3DCubeTexture, (IUnknown *)object); - wined3d_mutex_unlock(); - - if (hr != D3D_OK){ - - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreateCubeTexture failed\n", This); + hr = cubetexture_init(object, This, edge_length, levels, usage, format, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize cube texture, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); - *ppCubeTexture = NULL; - } else { - IUnknown_AddRef(iface); - object->parentDevice = iface; - *ppCubeTexture = (LPDIRECT3DCUBETEXTURE8) object; + return hr; } - TRACE("(%p) returning %p\n",This, *ppCubeTexture); + TRACE("Created cube texture %p.\n", object); + *texture = (IDirect3DCubeTexture8 *)object; + return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8 iface, UINT Size, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer8** ppVertexBuffer) { - IDirect3DVertexBuffer8Impl *object; +static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(IDirect3DDevice8 *iface, UINT size, DWORD usage, + DWORD fvf, D3DPOOL pool, IDirect3DVertexBuffer8 **buffer) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hrc = D3D_OK; + IDirect3DVertexBuffer8Impl *object; + HRESULT hr; - TRACE("(%p) Relay\n", This); - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVertexBuffer8Impl)); - if (NULL == object) { - FIXME("Allocation of memory failed\n"); - *ppVertexBuffer = NULL; + TRACE("iface %p, size %u, usage %#x, fvf %#x, pool %#x, buffer %p.\n", + iface, size, usage, fvf, pool, buffer); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate buffer memory.\n"); return D3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &Direct3DVertexBuffer8_Vtbl; - object->ref = 1; - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage & WINED3DUSAGE_MASK, - 0 /* fvf for ddraw only */, (WINED3DPOOL)Pool, &object->wineD3DVertexBuffer, (IUnknown *)object); - wined3d_mutex_unlock(); - - object->fvf = FVF; - - if (D3D_OK != hrc) { - - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreateVertexBuffer failed\n", This); + hr = vertexbuffer_init(object, This, size, usage, fvf, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize vertex buffer, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); - *ppVertexBuffer = NULL; - } else { - IUnknown_AddRef(iface); - object->parentDevice = iface; - *ppVertexBuffer = (LPDIRECT3DVERTEXBUFFER8) object; + return hr; } - return hrc; + + TRACE("Created vertex buffer %p.\n", object); + *buffer = (IDirect3DVertexBuffer8 *)object; + + return D3D_OK; } -static HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 iface, UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer8** ppIndexBuffer) { - IDirect3DIndexBuffer8Impl *object; +static HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(IDirect3DDevice8 *iface, UINT size, DWORD usage, + D3DFORMAT format, D3DPOOL pool, IDirect3DIndexBuffer8 **buffer) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hrc = D3D_OK; + IDirect3DIndexBuffer8Impl *object; + HRESULT hr; + + TRACE("iface %p, size %u, usage %#x, format %#x, pool %#x, buffer %p.\n", + iface, size, usage, format, pool, buffer); - TRACE("(%p) Relay\n", This); - /* Allocate the storage for the device */ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if (NULL == object) { - FIXME("Allocation of memory failed\n"); - *ppIndexBuffer = NULL; + if (!object) + { + ERR("Failed to allocate buffer memory.\n"); return D3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &Direct3DIndexBuffer8_Vtbl; - object->ref = 1; - object->format = wined3dformat_from_d3dformat(Format); - TRACE("Calling wined3d create index buffer\n"); - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateIndexBuffer(This->WineD3DDevice, Length, Usage & WINED3DUSAGE_MASK, - (WINED3DPOOL)Pool, &object->wineD3DIndexBuffer, (IUnknown *)object); - wined3d_mutex_unlock(); - - if (D3D_OK != hrc) { - - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreateIndexBuffer failed\n", This); + hr = indexbuffer_init(object, This, size, usage, format, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize index buffer, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); - *ppIndexBuffer = NULL; - } else { - IUnknown_AddRef(iface); - object->parentDevice = iface; - *ppIndexBuffer = (LPDIRECT3DINDEXBUFFER8)object; + return hr; } - return hrc; + + TRACE("Created index buffer %p.\n", object); + *buffer = (IDirect3DIndexBuffer8 *)object; + + return D3D_OK; } static HRESULT IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface8 **ppSurface, UINT Usage, D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality) { - HRESULT hrc; + IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; IDirect3DSurface8Impl *object; - IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - TRACE("(%p) Relay\n", This); - - if(MultisampleQuality > 0){ - FIXME("MultisampleQuality set to %d, substituting 0\n" , MultisampleQuality); - /* - MultisampleQuality - [in] Quality level. The valid range is between zero and one less than the level returned by pQualityLevels used by IDirect3D8::CheckDeviceMultiSampleType. Passing a larger value returns the error D3DERR_INVALIDCALL. The MultisampleQuality values of paired render targets, depth stencil surfaces, and the MultiSample type must all match. - */ - MultisampleQuality=0; - } - /*FIXME: Check MAX bounds of MultisampleQuality*/ - - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl)); - if (NULL == object) { - FIXME("Allocation of memory failed\n"); - *ppSurface = NULL; - return D3DERR_OUTOFVIDEOMEMORY; - } - - object->lpVtbl = &Direct3DSurface8_Vtbl; - object->ref = 1; + HRESULT hr; TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p\n", This, Width, Height, Format, *ppSurface); - wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, wined3dformat_from_d3dformat(Format), - Lockable, Discard, Level, &object->wineD3DSurface, Usage & WINED3DUSAGE_MASK, (WINED3DPOOL)Pool, - MultiSample, MultisampleQuality, SURFACE_OPENGL, (IUnknown *)object); - wined3d_mutex_unlock(); - - if (hrc != D3D_OK || NULL == object->wineD3DSurface) { - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreateSurface failed\n", This); - HeapFree(GetProcessHeap(), 0, object); - *ppSurface = NULL; - } else { - IUnknown_AddRef(iface); - object->parentDevice = iface; - *ppSurface = (LPDIRECT3DSURFACE8) object; + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl)); + if (!object) + { + FIXME("Failed to allocate surface memory.\n"); + return D3DERR_OUTOFVIDEOMEMORY; } - return hrc; + + hr = surface_init(object, This, Width, Height, Format, Lockable, Discard, + Level, Usage, Pool, MultiSample, MultisampleQuality); + if (FAILED(hr)) + { + WARN("Failed to initialize surface, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created surface %p.\n", object); + *ppSurface = (IDirect3DSurface8 *)object; + + return D3D_OK; } static HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface) { @@ -1533,8 +1471,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetClipStatus(LPDIRECT3DDEVICE8 iface static HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage,IDirect3DBaseTexture8** ppTexture) { IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - IWineD3DBaseTexture *retTexture = NULL; - HRESULT rc = D3D_OK; + IWineD3DBaseTexture *retTexture; + HRESULT hr; TRACE("(%p) Relay\n" , This); @@ -1543,17 +1481,27 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, D } wined3d_mutex_lock(); - rc = IWineD3DDevice_GetTexture(This->WineD3DDevice, Stage, &retTexture); - if (rc == D3D_OK && NULL != retTexture) { + hr = IWineD3DDevice_GetTexture(This->WineD3DDevice, Stage, &retTexture); + if (FAILED(hr)) + { + WARN("Failed to get texture for stage %u, hr %#x.\n", Stage, hr); + wined3d_mutex_unlock(); + *ppTexture = NULL; + return hr; + } + + if (retTexture) + { IWineD3DBaseTexture_GetParent(retTexture, (IUnknown **)ppTexture); IWineD3DBaseTexture_Release(retTexture); - } else { - FIXME("Call to get texture (%d) failed (%p)\n", Stage, retTexture); + } + else + { *ppTexture = NULL; } wined3d_mutex_unlock(); - return rc; + return D3D_OK; } static HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage, IDirect3DBaseTexture8* pTexture) { @@ -1725,8 +1673,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DrawIndexedPrimitive(LPDIRECT3DDEVICE wined3d_mutex_lock(); IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType); - hr = IWineD3DDevice_DrawIndexedPrimitive(This->WineD3DDevice, MinVertexIndex, NumVertices, - startIndex, vertex_count_from_primitive_count(PrimitiveType, primCount)); + hr = IWineD3DDevice_DrawIndexedPrimitive(This->WineD3DDevice, startIndex, + vertex_count_from_primitive_count(PrimitiveType, primCount)); wined3d_mutex_unlock(); return hr; @@ -1757,7 +1705,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DrawIndexedPrimitiveUP(LPDIRECT3DDEVI wined3d_mutex_lock(); IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType); - hr = IWineD3DDevice_DrawIndexedPrimitiveUP(This->WineD3DDevice, MinVertexIndex, NumVertexIndices, + hr = IWineD3DDevice_DrawIndexedPrimitiveUP(This->WineD3DDevice, vertex_count_from_primitive_count(PrimitiveType, PrimitiveCount), pIndexData, wined3dformat_from_d3dformat(IndexDataFormat), pVertexStreamZeroData, VertexStreamZeroStride); wined3d_mutex_unlock(); @@ -1778,141 +1726,55 @@ static HRESULT WINAPI IDirect3DDevice8Impl_ProcessVertices(LPDIRECT3DDEVICE8 ifa return hr; } -static HRESULT IDirect3DDevice8Impl_CreateVertexDeclaration(IDirect3DDevice8 *iface, CONST DWORD *declaration, IDirect3DVertexDeclaration8 **decl_ptr) { +static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(IDirect3DDevice8 *iface, + const DWORD *declaration, const DWORD *byte_code, DWORD *shader, DWORD usage) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - IDirect3DVertexDeclaration8Impl *object; - WINED3DVERTEXELEMENT *wined3d_elements; - UINT wined3d_element_count; - HRESULT hr = D3D_OK; - - TRACE("(%p) : declaration %p\n", This, declaration); - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if (!object) { - ERR("Memory allocation failed\n"); - *decl_ptr = NULL; - return D3DERR_OUTOFVIDEOMEMORY; - } - - object->ref_count = 1; - object->lpVtbl = &Direct3DVertexDeclaration8_Vtbl; - - wined3d_element_count = convert_to_wined3d_declaration(declaration, &object->elements_size, &wined3d_elements); - object->elements = HeapAlloc(GetProcessHeap(), 0, object->elements_size); - if (!object->elements) { - ERR("Memory allocation failed\n"); - HeapFree(GetProcessHeap(), 0, wined3d_elements); - HeapFree(GetProcessHeap(), 0, object); - *decl_ptr = NULL; - return D3DERR_OUTOFVIDEOMEMORY; - } - - CopyMemory(object->elements, declaration, object->elements_size); - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateVertexDeclaration(This->WineD3DDevice, &object->wined3d_vertex_declaration, - (IUnknown *)object, wined3d_elements, wined3d_element_count); - wined3d_mutex_unlock(); - - HeapFree(GetProcessHeap(), 0, wined3d_elements); - - if (FAILED(hr)) { - ERR("(%p) : IWineD3DDevice_CreateVertexDeclaration call failed\n", This); - HeapFree(GetProcessHeap(), 0, object->elements); - HeapFree(GetProcessHeap(), 0, object); - } else { - *decl_ptr = (IDirect3DVertexDeclaration8 *)object; - TRACE("(%p) : Created vertex declaration %p\n", This, object); - } - - return hr; -} - -static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(LPDIRECT3DDEVICE8 iface, CONST DWORD* pDeclaration, CONST DWORD* pFunction, DWORD* ppShader, DWORD Usage) { - IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; - HRESULT hrc = D3D_OK; IDirect3DVertexShader8Impl *object; - const DWORD *token = pDeclaration; + DWORD shader_handle; DWORD handle; + HRESULT hr; - /* Test if the vertex declaration is valid */ - while (D3DVSD_END() != *token) { - D3DVSD_TOKENTYPE token_type = ((*token & D3DVSD_TOKENTYPEMASK) >> D3DVSD_TOKENTYPESHIFT); + TRACE("iface %p, declaration %p, byte_code %p, shader %p, usage %#x.\n", + iface, declaration, byte_code, shader, usage); - if (token_type == D3DVSD_TOKEN_STREAMDATA && !(token_type & 0x10000000)) { - DWORD type = ((*token & D3DVSD_DATATYPEMASK) >> D3DVSD_DATATYPESHIFT); - DWORD reg = ((*token & D3DVSD_VERTEXREGMASK) >> D3DVSD_VERTEXREGSHIFT); - - if(reg == D3DVSDE_NORMAL && type != D3DVSDT_FLOAT3 && !pFunction) { - WARN("Attempt to use a non-FLOAT3 normal with the fixed function function\n"); - return D3DERR_INVALIDCALL; - } - } - token += parse_token(token); - } - - /* Setup a stub object for now */ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - TRACE("(%p) : pFunction(%p), ppShader(%p)\n", This, pFunction, ppShader); - if (NULL == object) { - FIXME("Allocation of memory failed\n"); - *ppShader = 0; - return D3DERR_OUTOFVIDEOMEMORY; - } - - object->ref = 1; - object->lpVtbl = &Direct3DVertexShader8_Vtbl; - - hrc = IDirect3DDevice8Impl_CreateVertexDeclaration(iface, pDeclaration, &object->vertex_declaration); - if (FAILED(hrc)) { - ERR("(%p) : IDirect3DDeviceImpl_CreateVertexDeclaration call failed\n", This); - HeapFree(GetProcessHeap(), 0, object); - *ppShader = 0; - return D3DERR_INVALIDCALL; + if (!object) + { + ERR("Failed to allocate vertex shader memory.\n"); + *shader = 0; + return E_OUTOFMEMORY; } wined3d_mutex_lock(); handle = d3d8_allocate_handle(&This->handle_table, object, D3D8_HANDLE_VS); + wined3d_mutex_unlock(); if (handle == D3D8_INVALID_HANDLE) { - ERR("Failed to allocate shader handle\n"); - wined3d_mutex_unlock(); - IDirect3DVertexDeclaration8_Release(object->vertex_declaration); + ERR("Failed to allocate vertex shader handle.\n"); HeapFree(GetProcessHeap(), 0, object); - *ppShader = 0; + *shader = 0; return E_OUTOFMEMORY; } - else + + shader_handle = handle + VS_HIGHESTFIXEDFXF + 1; + + hr = vertexshader_init(object, This, declaration, byte_code, shader_handle, usage); + if (FAILED(hr)) { - DWORD shader_handle = handle + VS_HIGHESTFIXEDFXF + 1; - *ppShader = ((IDirect3DVertexDeclaration8Impl *)object->vertex_declaration)->shader_handle = shader_handle; + WARN("Failed to initialize vertex shader, hr %#x.\n", hr); + wined3d_mutex_lock(); + d3d8_free_handle(&This->handle_table, handle, D3D8_HANDLE_VS); + wined3d_mutex_unlock(); + HeapFree(GetProcessHeap(), 0, object); + *shader = 0; + return hr; } - if (pFunction) - { - /* Usage is missing ... Use SetRenderState to set the sw vp render state in SetVertexShader */ - hrc = IWineD3DDevice_CreateVertexShader(This->WineD3DDevice, pFunction, - NULL /* output signature */, &object->wineD3DVertexShader, (IUnknown *)object); + TRACE("Created vertex shader %p (handle %#x).\n", object, shader_handle); + *shader = shader_handle; - if (FAILED(hrc)) - { - /* free up object */ - FIXME("Call to IWineD3DDevice_CreateVertexShader failed\n"); - d3d8_free_handle(&This->handle_table, handle, D3D8_HANDLE_VS); - IDirect3DVertexDeclaration8_Release(object->vertex_declaration); - HeapFree(GetProcessHeap(), 0, object); - *ppShader = 0; - } - else - { - load_local_constants(pDeclaration, object->wineD3DVertexShader); - TRACE("(%p) : returning %p (handle %#x)\n", This, object, *ppShader); - } - } - - wined3d_mutex_unlock(); - - return hrc; + return D3D_OK; } static IDirect3DVertexDeclaration8Impl *IDirect3DDevice8Impl_FindDecl(IDirect3DDevice8Impl *This, DWORD fvf) @@ -1947,17 +1809,10 @@ static IDirect3DVertexDeclaration8Impl *IDirect3DDevice8Impl_FindDecl(IDirect3DD return NULL; } - d3d8_declaration->ref_count = 1; - d3d8_declaration->lpVtbl = &Direct3DVertexDeclaration8_Vtbl; - d3d8_declaration->elements = NULL; - d3d8_declaration->elements_size = 0; - d3d8_declaration->shader_handle = fvf; - - hr = IWineD3DDevice_CreateVertexDeclarationFromFVF(This->WineD3DDevice, - &d3d8_declaration->wined3d_vertex_declaration, (IUnknown *)d3d8_declaration, fvf); + hr = vertexdeclaration_init_fvf(d3d8_declaration, This, fvf); if (FAILED(hr)) { - ERR("Failed to create wined3d vertex declaration.\n"); + WARN("Failed to initialize vertex declaration, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, d3d8_declaration); return NULL; } @@ -2215,7 +2070,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetIndices(LPDIRECT3DDEVICE8 iface, I */ wined3d_mutex_lock(); IWineD3DDevice_SetBaseVertexIndex(This->WineD3DDevice, baseVertexIndex); - hr = IWineD3DDevice_SetIndices(This->WineD3DDevice, + hr = IWineD3DDevice_SetIndexBuffer(This->WineD3DDevice, ib ? ib->wineD3DIndexBuffer : NULL, ib ? ib->format : WINED3DFMT_UNKNOWN); wined3d_mutex_unlock(); @@ -2237,7 +2092,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetIndices(LPDIRECT3DDEVICE8 iface, I /* The case from UINT to INT is safe because d3d8 will never set negative values */ wined3d_mutex_lock(); IWineD3DDevice_GetBaseVertexIndex(This->WineD3DDevice, (INT *) pBaseVertexIndex); - rc = IWineD3DDevice_GetIndices(This->WineD3DDevice, &retIndexData); + rc = IWineD3DDevice_GetIndexBuffer(This->WineD3DDevice, &retIndexData); if (SUCCEEDED(rc) && retIndexData) { IWineD3DBuffer_GetParent(retIndexData, (IUnknown **)ppIndexData); IWineD3DBuffer_Release(retIndexData); @@ -2249,15 +2104,20 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetIndices(LPDIRECT3DDEVICE8 iface, I return rc; } -static HRESULT WINAPI IDirect3DDevice8Impl_CreatePixelShader(LPDIRECT3DDEVICE8 iface, CONST DWORD* pFunction, DWORD* ppShader) { + +static HRESULT WINAPI IDirect3DDevice8Impl_CreatePixelShader(IDirect3DDevice8 *iface, + const DWORD *byte_code, DWORD *shader) +{ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; IDirect3DPixelShader8Impl *object; + DWORD shader_handle; DWORD handle; HRESULT hr; - TRACE("(%p) : pFunction(%p), ppShader(%p)\n", This, pFunction, ppShader); + TRACE("iface %p, byte_code %p, shader %p.\n", iface, byte_code, shader); - if (NULL == ppShader) { + if (!shader) + { TRACE("(%p) Invalid call\n", This); return D3DERR_INVALIDCALL; } @@ -2265,39 +2125,38 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreatePixelShader(LPDIRECT3DDEVICE8 i object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if (!object) { - ERR("Failed to allocate memmory.\n"); + ERR("Failed to allocate pixel shader memmory.\n"); return E_OUTOFMEMORY; } - object->ref = 1; - object->lpVtbl = &Direct3DPixelShader8_Vtbl; - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreatePixelShader(This->WineD3DDevice, pFunction, - NULL, &object->wineD3DPixelShader, (IUnknown *)object); + handle = d3d8_allocate_handle(&This->handle_table, object, D3D8_HANDLE_PS); + wined3d_mutex_unlock(); + if (handle == D3D8_INVALID_HANDLE) + { + ERR("Failed to allocate pixel shader handle.\n"); + HeapFree(GetProcessHeap(), 0, object); + return E_OUTOFMEMORY; + } + + shader_handle = handle + VS_HIGHESTFIXEDFXF + 1; + + hr = pixelshader_init(object, This, byte_code, shader_handle); if (FAILED(hr)) { + WARN("Failed to initialize pixel shader, hr %#x.\n", hr); + wined3d_mutex_lock(); + d3d8_free_handle(&This->handle_table, handle, D3D8_HANDLE_PS); wined3d_mutex_unlock(); - FIXME("(%p) call to IWineD3DDevice_CreatePixelShader failed\n", This); - HeapFree(GetProcessHeap(), 0 , object); - *ppShader = 0; + HeapFree(GetProcessHeap(), 0, object); + *shader = 0; return hr; } - handle = d3d8_allocate_handle(&This->handle_table, object, D3D8_HANDLE_PS); - wined3d_mutex_unlock(); + TRACE("Created pixel shader %p (handle %#x).\n", object, shader_handle); + *shader = shader_handle; - if (handle == D3D8_INVALID_HANDLE) - { - ERR("Failed to allocate shader handle\n"); - IDirect3DVertexShader8_Release((IUnknown *)object); - return E_OUTOFMEMORY; - } - - *ppShader = object->handle = handle + VS_HIGHESTFIXEDFXF + 1; - TRACE("(%p) : returning %p (handle %#x)\n", This, object, *ppShader); - - return hr; + return D3D_OK; } static HRESULT WINAPI IDirect3DDevice8Impl_SetPixelShader(LPDIRECT3DDEVICE8 iface, DWORD pShader) { @@ -2621,17 +2480,6 @@ const IDirect3DDevice8Vtbl Direct3DDevice8_Vtbl = IDirect3DDevice8Impl_DeletePatch }; -ULONG WINAPI D3D8CB_DestroySurface(IWineD3DSurface *pSurface) { - IDirect3DSurface8Impl* surfaceParent; - TRACE("(%p) call back\n", pSurface); - - IWineD3DSurface_GetParent(pSurface, (IUnknown **) &surfaceParent); - /* GetParent's AddRef was forwarded to an object in destruction. - * Releasing it here again would cause an endless recursion. */ - surfaceParent->forwardReference = NULL; - return IDirect3DSurface8_Release((IDirect3DSurface8*) surfaceParent); -} - /* IWineD3DDeviceParent IUnknown methods */ static inline struct IDirect3DDevice8Impl *device_from_device_parent(IWineD3DDeviceParent *iface) @@ -2691,9 +2539,13 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParen } *surface = d3d_surface->wineD3DSurface; + IWineD3DSurface_AddRef(*surface); + d3d_surface->container = superior; IUnknown_Release(d3d_surface->parentDevice); d3d_surface->parentDevice = NULL; + + IDirect3DSurface8_Release((IDirect3DSurface8 *)d3d_surface); d3d_surface->forwardReference = superior; return hr; @@ -2720,8 +2572,9 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateRenderTarget(IWineD3DDevice } *surface = d3d_surface->wineD3DSurface; + IWineD3DSurface_AddRef(*surface); + d3d_surface->container = (IUnknown *)This; - d3d_surface->isImplicit = TRUE; /* Implicit surfaces are created with an refcount of 0 */ IUnknown_Release((IUnknown *)d3d_surface); @@ -2749,8 +2602,9 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3 } *surface = d3d_surface->wineD3DSurface; + IWineD3DSurface_AddRef(*surface); + d3d_surface->container = (IUnknown *)This; - d3d_surface->isImplicit = TRUE; /* Implicit surfaces are created with an refcount of 0 */ IUnknown_Release((IUnknown *)d3d_surface); @@ -2777,23 +2631,22 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateVolume(IWineD3DDeviceParent return D3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &Direct3DVolume8_Vtbl; - object->ref = 1; - hr = IWineD3DDevice_CreateVolume(This->WineD3DDevice, width, height, depth, usage, - format, pool, &object->wineD3DVolume, (IUnknown *)object); + hr = volume_init(object, This, width, height, depth, usage, format, pool); if (FAILED(hr)) { - ERR("(%p) CreateVolume failed, returning %#x\n", iface, hr); + WARN("Failed to initialize volume, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); - *volume = NULL; return hr; } *volume = object->wineD3DVolume; + IWineD3DVolume_AddRef(*volume); + IDirect3DVolume8_Release((IDirect3DVolume8 *)object); + object->container = superior; object->forwardReference = superior; - TRACE("(%p) Created volume %p\n", iface, *volume); + TRACE("(%p) Created volume %p\n", iface, object); return hr; } diff --git a/reactos/dll/directx/wine/d3d8/directx.c b/reactos/dll/directx/wine/d3d8/directx.c index 3368794d732..1ad7aef0b31 100644 --- a/reactos/dll/directx/wine/d3d8/directx.c +++ b/reactos/dll/directx/wine/d3d8/directx.c @@ -312,16 +312,6 @@ static HMONITOR WINAPI IDirect3D8Impl_GetAdapterMonitor(LPDIRECT3D8 iface, UINT return ret; } -ULONG WINAPI D3D8CB_DestroyRenderTarget(IWineD3DSurface *pSurface) { - IDirect3DSurface8Impl* surfaceParent; - TRACE("(%p) call back\n", pSurface); - - IWineD3DSurface_GetParent(pSurface, (IUnknown **) &surfaceParent); - surfaceParent->isImplicit = FALSE; - /* Surface had refcount of 0 GetParent addrefed to 1, so 1 Release is enough */ - return IDirect3DSurface8_Release((IDirect3DSurface8*) surfaceParent); -} - ULONG WINAPI D3D8CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain) { IUnknown* swapChainParent; TRACE("(%p) call back\n", pSwapChain); @@ -331,16 +321,6 @@ ULONG WINAPI D3D8CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain) { return IUnknown_Release(swapChainParent); } -ULONG WINAPI D3D8CB_DestroyDepthStencilSurface(IWineD3DSurface *pSurface) { - IDirect3DSurface8Impl* surfaceParent; - TRACE("(%p) call back\n", pSurface); - - IWineD3DSurface_GetParent(pSurface, (IUnknown **) &surfaceParent); - surfaceParent->isImplicit = FALSE; - /* Surface had refcount of 0 GetParent addrefed to 1, so 1 Release is enough */ - return IDirect3DSurface8_Release((IDirect3DSurface8*) surfaceParent); -} - static HRESULT WINAPI IDirect3D8Impl_CreateDevice(LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviourFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice8** ppReturnedDeviceInterface) { diff --git a/reactos/dll/directx/wine/d3d8/indexbuffer.c b/reactos/dll/directx/wine/d3d8/indexbuffer.c index b59b1ab292d..49391222663 100644 --- a/reactos/dll/directx/wine/d3d8/indexbuffer.c +++ b/reactos/dll/directx/wine/d3d8/indexbuffer.c @@ -46,6 +46,14 @@ static ULONG WINAPI IDirect3DIndexBuffer8Impl_AddRef(LPDIRECT3DINDEXBUFFER8 ifac TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IDirect3DDevice8_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DBuffer_AddRef(This->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + } + return ref; } @@ -56,12 +64,10 @@ static ULONG WINAPI IDirect3DIndexBuffer8Impl_Release(LPDIRECT3DINDEXBUFFER8 ifa TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { + IDirect3DDevice8_Release(This->parentDevice); wined3d_mutex_lock(); IWineD3DBuffer_Release(This->wineD3DIndexBuffer); wined3d_mutex_unlock(); - - IUnknown_Release(This->parentDevice); - HeapFree(GetProcessHeap(), 0, This); } return ref; } @@ -207,8 +213,7 @@ static HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetDesc(LPDIRECT3DINDEXBUFFER8 i return hr; } - -const IDirect3DIndexBuffer8Vtbl Direct3DIndexBuffer8_Vtbl = +static const IDirect3DIndexBuffer8Vtbl Direct3DIndexBuffer8_Vtbl = { /* IUnknown */ IDirect3DIndexBuffer8Impl_QueryInterface, @@ -228,3 +233,39 @@ const IDirect3DIndexBuffer8Vtbl Direct3DIndexBuffer8_Vtbl = IDirect3DIndexBuffer8Impl_Unlock, IDirect3DIndexBuffer8Impl_GetDesc }; + +static void STDMETHODCALLTYPE d3d8_indexbuffer_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_indexbuffer_wined3d_parent_ops = +{ + d3d8_indexbuffer_wined3d_object_destroyed, +}; + +HRESULT indexbuffer_init(IDirect3DIndexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, + UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; + + buffer->lpVtbl = &Direct3DIndexBuffer8_Vtbl; + buffer->ref = 1; + buffer->format = wined3dformat_from_d3dformat(format); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateIndexBuffer(device->WineD3DDevice, size, + usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, &buffer->wineD3DIndexBuffer, + (IUnknown *)buffer, &d3d8_indexbuffer_wined3d_parent_ops); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d buffer, hr %#x.\n", hr); + return hr; + } + + buffer->parentDevice = (IDirect3DDevice8 *)device; + IUnknown_AddRef(buffer->parentDevice); + + return D3D_OK; +} diff --git a/reactos/dll/directx/wine/d3d8/pixelshader.c b/reactos/dll/directx/wine/d3d8/pixelshader.c index 2f0fb1c4c32..f56549522a7 100644 --- a/reactos/dll/directx/wine/d3d8/pixelshader.c +++ b/reactos/dll/directx/wine/d3d8/pixelshader.c @@ -46,6 +46,13 @@ static ULONG WINAPI IDirect3DPixelShader8Impl_AddRef(IDirect3DPixelShader8 *ifac TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + wined3d_mutex_lock(); + IWineD3DPixelShader_AddRef(This->wineD3DPixelShader); + wined3d_mutex_unlock(); + } + return ref; } @@ -59,16 +66,47 @@ static ULONG WINAPI IDirect3DPixelShader8Impl_Release(IDirect3DPixelShader8 * if wined3d_mutex_lock(); IWineD3DPixelShader_Release(This->wineD3DPixelShader); wined3d_mutex_unlock(); - - HeapFree(GetProcessHeap(), 0, This); } return ref; } -const IDirect3DPixelShader8Vtbl Direct3DPixelShader8_Vtbl = +static const IDirect3DPixelShader8Vtbl Direct3DPixelShader8_Vtbl = { /* IUnknown */ IDirect3DPixelShader8Impl_QueryInterface, IDirect3DPixelShader8Impl_AddRef, IDirect3DPixelShader8Impl_Release, }; + +static void STDMETHODCALLTYPE d3d8_pixelshader_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_pixelshader_wined3d_parent_ops = +{ + d3d8_pixelshader_wined3d_object_destroyed, +}; + +HRESULT pixelshader_init(IDirect3DPixelShader8Impl *shader, IDirect3DDevice8Impl *device, + const DWORD *byte_code, DWORD shader_handle) +{ + HRESULT hr; + + shader->ref = 1; + shader->lpVtbl = &Direct3DPixelShader8_Vtbl; + shader->handle = shader_handle; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreatePixelShader(device->WineD3DDevice, byte_code, + NULL, &shader->wineD3DPixelShader, (IUnknown *)shader, + &d3d8_pixelshader_wined3d_parent_ops); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d pixel shader, hr %#x.\n", hr); + return hr; + } + + return D3D_OK; +} diff --git a/reactos/dll/directx/wine/d3d8/surface.c b/reactos/dll/directx/wine/d3d8/surface.c index 3185a1f88ac..2d00fce822c 100644 --- a/reactos/dll/directx/wine/d3d8/surface.c +++ b/reactos/dll/directx/wine/d3d8/surface.c @@ -52,7 +52,13 @@ static ULONG WINAPI IDirect3DSurface8Impl_AddRef(LPDIRECT3DSURFACE8 iface) { } else { /* No container, handle our own refcounting */ ULONG ref = InterlockedIncrement(&This->ref); - if(ref == 1 && This->parentDevice) IUnknown_AddRef(This->parentDevice); + if (ref == 1) + { + if (This->parentDevice) IUnknown_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IUnknown_AddRef(This->wineD3DSurface); + wined3d_mutex_unlock(); + } TRACE("(%p) : AddRef from %d\n", This, ref - 1); return ref; } @@ -75,13 +81,9 @@ static ULONG WINAPI IDirect3DSurface8Impl_Release(LPDIRECT3DSURFACE8 iface) { if (ref == 0) { if (This->parentDevice) IUnknown_Release(This->parentDevice); /* Implicit surfaces are destroyed with the device, not if refcount reaches 0. */ - if (!This->isImplicit) { - wined3d_mutex_lock(); - IWineD3DSurface_Release(This->wineD3DSurface); - wined3d_mutex_unlock(); - - HeapFree(GetProcessHeap(), 0, This); - } + wined3d_mutex_lock(); + IWineD3DSurface_Release(This->wineD3DSurface); + wined3d_mutex_unlock(); } return ref; @@ -229,7 +231,7 @@ static HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) } } -const IDirect3DSurface8Vtbl Direct3DSurface8_Vtbl = +static const IDirect3DSurface8Vtbl Direct3DSurface8_Vtbl = { /* IUnknown */ IDirect3DSurface8Impl_QueryInterface, @@ -246,3 +248,47 @@ const IDirect3DSurface8Vtbl Direct3DSurface8_Vtbl = IDirect3DSurface8Impl_LockRect, IDirect3DSurface8Impl_UnlockRect }; + +static void STDMETHODCALLTYPE surface_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_surface_wined3d_parent_ops = +{ + surface_wined3d_object_destroyed, +}; + +HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *device, + UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level, + DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) +{ + HRESULT hr; + + surface->lpVtbl = &Direct3DSurface8_Vtbl; + surface->ref = 1; + + /* FIXME: Check MAX bounds of MultisampleQuality. */ + if (multisample_quality > 0) + { + FIXME("Multisample quality set to %u, substituting 0.\n", multisample_quality); + multisample_quality = 0; + } + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateSurface(device->WineD3DDevice, width, height, wined3dformat_from_d3dformat(format), + lockable, discard, level, &surface->wineD3DSurface, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, + multisample_type, multisample_quality, SURFACE_OPENGL, (IUnknown *)surface, + &d3d8_surface_wined3d_parent_ops); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d surface, hr %#x.\n", hr); + return hr; + } + + surface->parentDevice = (IDirect3DDevice8 *)device; + IUnknown_AddRef(surface->parentDevice); + + return D3D_OK; +} diff --git a/reactos/dll/directx/wine/d3d8/swapchain.c b/reactos/dll/directx/wine/d3d8/swapchain.c index 67f3429cad6..e85154885dc 100644 --- a/reactos/dll/directx/wine/d3d8/swapchain.c +++ b/reactos/dll/directx/wine/d3d8/swapchain.c @@ -57,7 +57,7 @@ static ULONG WINAPI IDirect3DSwapChain8Impl_Release(LPDIRECT3DSWAPCHAIN8 iface) if (ref == 0) { wined3d_mutex_lock(); - IWineD3DSwapChain_Destroy(This->wineD3DSwapChain, D3D8CB_DestroyRenderTarget); + IWineD3DSwapChain_Destroy(This->wineD3DSwapChain); wined3d_mutex_unlock(); if (This->parentDevice) IUnknown_Release(This->parentDevice); diff --git a/reactos/dll/directx/wine/d3d8/texture.c b/reactos/dll/directx/wine/d3d8/texture.c index c22c49111b8..e377fffec69 100644 --- a/reactos/dll/directx/wine/d3d8/texture.c +++ b/reactos/dll/directx/wine/d3d8/texture.c @@ -47,6 +47,14 @@ static ULONG WINAPI IDirect3DTexture8Impl_AddRef(LPDIRECT3DTEXTURE8 iface) { TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IDirect3DDevice8_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DTexture_AddRef(This->wineD3DTexture); + wined3d_mutex_unlock(); + } + return ref; } @@ -57,12 +65,10 @@ static ULONG WINAPI IDirect3DTexture8Impl_Release(LPDIRECT3DTEXTURE8 iface) { TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { + IDirect3DDevice8_Release(This->parentDevice); wined3d_mutex_lock(); - IWineD3DTexture_Destroy(This->wineD3DTexture, D3D8CB_DestroySurface); + IWineD3DTexture_Release(This->wineD3DTexture); wined3d_mutex_unlock(); - - IUnknown_Release(This->parentDevice); - HeapFree(GetProcessHeap(), 0, This); } return ref; } @@ -285,7 +291,7 @@ static HRESULT WINAPI IDirect3DTexture8Impl_AddDirtyRect(LPDIRECT3DTEXTURE8 ifac return hr; } -const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl = +static const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl = { /* IUnknown */ IDirect3DTexture8Impl_QueryInterface, @@ -311,3 +317,38 @@ const IDirect3DTexture8Vtbl Direct3DTexture8_Vtbl = IDirect3DTexture8Impl_UnlockRect, IDirect3DTexture8Impl_AddDirtyRect }; + +static void STDMETHODCALLTYPE d3d8_texture_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_texture_wined3d_parent_ops = +{ + d3d8_texture_wined3d_object_destroyed, +}; + +HRESULT texture_init(IDirect3DTexture8Impl *texture, IDirect3DDevice8Impl *device, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; + + texture->lpVtbl = &Direct3DTexture8_Vtbl; + texture->ref = 1; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateTexture(device->WineD3DDevice, width, height, levels, + usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, + &texture->wineD3DTexture, (IUnknown *)texture, &d3d8_texture_wined3d_parent_ops); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d texture, hr %#x.\n", hr); + return hr; + } + + texture->parentDevice = (IDirect3DDevice8 *)device; + IDirect3DDevice8_AddRef(texture->parentDevice); + + return D3D_OK; +} diff --git a/reactos/dll/directx/wine/d3d8/vertexbuffer.c b/reactos/dll/directx/wine/d3d8/vertexbuffer.c index 617aff3529a..99e8304ecd2 100644 --- a/reactos/dll/directx/wine/d3d8/vertexbuffer.c +++ b/reactos/dll/directx/wine/d3d8/vertexbuffer.c @@ -47,6 +47,14 @@ static ULONG WINAPI IDirect3DVertexBuffer8Impl_AddRef(LPDIRECT3DVERTEXBUFFER8 if TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IDirect3DDevice8_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DBuffer_AddRef(This->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + } + return ref; } @@ -57,12 +65,10 @@ static ULONG WINAPI IDirect3DVertexBuffer8Impl_Release(LPDIRECT3DVERTEXBUFFER8 i TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { + IDirect3DDevice8_Release(This->parentDevice); wined3d_mutex_lock(); IWineD3DBuffer_Release(This->wineD3DVertexBuffer); wined3d_mutex_unlock(); - - IUnknown_Release(This->parentDevice); - HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -210,7 +216,7 @@ static HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetDesc(LPDIRECT3DVERTEXBUFFER8 return hr; } -const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl = +static const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl = { /* IUnknown */ IDirect3DVertexBuffer8Impl_QueryInterface, @@ -230,3 +236,39 @@ const IDirect3DVertexBuffer8Vtbl Direct3DVertexBuffer8_Vtbl = IDirect3DVertexBuffer8Impl_Unlock, IDirect3DVertexBuffer8Impl_GetDesc }; + +static void STDMETHODCALLTYPE d3d8_vertexbuffer_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_vertexbuffer_wined3d_parent_ops = +{ + d3d8_vertexbuffer_wined3d_object_destroyed, +}; + +HRESULT vertexbuffer_init(IDirect3DVertexBuffer8Impl *buffer, IDirect3DDevice8Impl *device, + UINT size, DWORD usage, DWORD fvf, D3DPOOL pool) +{ + HRESULT hr; + + buffer->lpVtbl = &Direct3DVertexBuffer8_Vtbl; + buffer->ref = 1; + buffer->fvf = fvf; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateVertexBuffer(device->WineD3DDevice, size, + usage & WINED3DUSAGE_MASK, 0, (WINED3DPOOL)pool, &buffer->wineD3DVertexBuffer, + (IUnknown *)buffer, &d3d8_vertexbuffer_wined3d_parent_ops); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d buffer, hr %#x.\n", hr); + return hr; + } + + buffer->parentDevice = (IDirect3DDevice8 *)device; + IUnknown_AddRef(buffer->parentDevice); + + return D3D_OK; +} diff --git a/reactos/dll/directx/wine/d3d8/vertexdeclaration.c b/reactos/dll/directx/wine/d3d8/vertexdeclaration.c index 2eea098a4e5..a6195fea0d9 100644 --- a/reactos/dll/directx/wine/d3d8/vertexdeclaration.c +++ b/reactos/dll/directx/wine/d3d8/vertexdeclaration.c @@ -50,6 +50,13 @@ static ULONG WINAPI IDirect3DVertexDeclaration8Impl_AddRef(IDirect3DVertexDeclar ULONG ref_count = InterlockedIncrement(&This->ref_count); TRACE("(%p) : AddRef increasing to %d\n", This, ref_count); + if (ref_count == 1) + { + wined3d_mutex_lock(); + IWineD3DVertexDeclaration_AddRef(This->wined3d_vertex_declaration); + wined3d_mutex_unlock(); + } + return ref_count; } @@ -64,9 +71,6 @@ static ULONG WINAPI IDirect3DVertexDeclaration8Impl_Release(IDirect3DVertexDecla wined3d_mutex_lock(); IWineD3DVertexDeclaration_Release(This->wined3d_vertex_declaration); wined3d_mutex_unlock(); - - HeapFree(GetProcessHeap(), 0, This->elements); - HeapFree(GetProcessHeap(), 0, This); } return ref_count; @@ -256,7 +260,7 @@ static const WINED3DFORMAT wined3d_format_lookup[] = /*WINED3DDECLTYPE_FLOAT2*/ WINED3DFMT_R32G32_FLOAT, /*WINED3DDECLTYPE_FLOAT3*/ WINED3DFMT_R32G32B32_FLOAT, /*WINED3DDECLTYPE_FLOAT4*/ WINED3DFMT_R32G32B32A32_FLOAT, - /*WINED3DDECLTYPE_D3DCOLOR*/ WINED3DFMT_A8R8G8B8, + /*WINED3DDECLTYPE_D3DCOLOR*/ WINED3DFMT_B8G8R8A8_UNORM, /*WINED3DDECLTYPE_UBYTE4*/ WINED3DFMT_R8G8B8A8_UINT, /*WINED3DDECLTYPE_SHORT2*/ WINED3DFMT_R16G16_SINT, /*WINED3DDECLTYPE_SHORT4*/ WINED3DFMT_R16G16B16A16_SINT, @@ -352,9 +356,82 @@ UINT convert_to_wined3d_declaration(const DWORD *d3d8_elements, DWORD *d3d8_elem return element_count; } -const IDirect3DVertexDeclaration8Vtbl Direct3DVertexDeclaration8_Vtbl = +static const IDirect3DVertexDeclaration8Vtbl Direct3DVertexDeclaration8_Vtbl = { IDirect3DVertexDeclaration8Impl_QueryInterface, IDirect3DVertexDeclaration8Impl_AddRef, IDirect3DVertexDeclaration8Impl_Release }; + +static void STDMETHODCALLTYPE d3d8_vertexdeclaration_wined3d_object_destroyed(void *parent) +{ + IDirect3DVertexDeclaration8Impl *declaration = parent; + HeapFree(GetProcessHeap(), 0, declaration->elements); + HeapFree(GetProcessHeap(), 0, declaration); +} + +static const struct wined3d_parent_ops d3d8_vertexdeclaration_wined3d_parent_ops = +{ + d3d8_vertexdeclaration_wined3d_object_destroyed, +}; + +HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration8Impl *declaration, + IDirect3DDevice8Impl *device, const DWORD *elements, DWORD shader_handle) +{ + WINED3DVERTEXELEMENT *wined3d_elements; + UINT wined3d_element_count; + HRESULT hr; + + declaration->lpVtbl = &Direct3DVertexDeclaration8_Vtbl; + declaration->ref_count = 1; + declaration->shader_handle = shader_handle; + + wined3d_element_count = convert_to_wined3d_declaration(elements, &declaration->elements_size, &wined3d_elements); + declaration->elements = HeapAlloc(GetProcessHeap(), 0, declaration->elements_size); + if (!declaration->elements) + { + ERR("Failed to allocate vertex declaration elements memory.\n"); + HeapFree(GetProcessHeap(), 0, wined3d_elements); + return E_OUTOFMEMORY; + } + + memcpy(declaration->elements, elements, declaration->elements_size); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateVertexDeclaration(device->WineD3DDevice, &declaration->wined3d_vertex_declaration, + (IUnknown *)declaration, &d3d8_vertexdeclaration_wined3d_parent_ops, + wined3d_elements, wined3d_element_count); + wined3d_mutex_unlock(); + HeapFree(GetProcessHeap(), 0, wined3d_elements); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex declaration, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, declaration->elements); + return hr; + } + + return D3D_OK; +} + +HRESULT vertexdeclaration_init_fvf(IDirect3DVertexDeclaration8Impl *declaration, + IDirect3DDevice8Impl *device, DWORD fvf) +{ + HRESULT hr; + + declaration->ref_count = 1; + declaration->lpVtbl = &Direct3DVertexDeclaration8_Vtbl; + declaration->elements = NULL; + declaration->elements_size = 0; + declaration->shader_handle = fvf; + + hr = IWineD3DDevice_CreateVertexDeclarationFromFVF(device->WineD3DDevice, + &declaration->wined3d_vertex_declaration, (IUnknown *)declaration, + &d3d8_vertexdeclaration_wined3d_parent_ops, fvf); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex declaration, hr %#x.\n", hr); + return hr; + } + + return D3D_OK; +} diff --git a/reactos/dll/directx/wine/d3d8/vertexshader.c b/reactos/dll/directx/wine/d3d8/vertexshader.c index 1a9b5ea9535..92bd1fea04f 100644 --- a/reactos/dll/directx/wine/d3d8/vertexshader.c +++ b/reactos/dll/directx/wine/d3d8/vertexshader.c @@ -46,9 +46,23 @@ static ULONG WINAPI IDirect3DVertexShader8Impl_AddRef(IDirect3DVertexShader8 *if TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1 && This->wineD3DVertexShader) + { + wined3d_mutex_lock(); + IWineD3DVertexShader_AddRef(This->wineD3DVertexShader); + wined3d_mutex_unlock(); + } + return ref; } +static void STDMETHODCALLTYPE d3d8_vertexshader_wined3d_object_destroyed(void *parent) +{ + IDirect3DVertexShader8Impl *shader = parent; + IDirect3DVertexDeclaration8_Release(shader->vertex_declaration); + HeapFree(GetProcessHeap(), 0, shader); +} + static ULONG WINAPI IDirect3DVertexShader8Impl_Release(IDirect3DVertexShader8 *iface) { IDirect3DVertexShader8Impl *This = (IDirect3DVertexShader8Impl *)iface; ULONG ref = InterlockedDecrement(&This->ref); @@ -56,22 +70,116 @@ static ULONG WINAPI IDirect3DVertexShader8Impl_Release(IDirect3DVertexShader8 *i TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { - IDirect3DVertexDeclaration8_Release(This->vertex_declaration); if (This->wineD3DVertexShader) { wined3d_mutex_lock(); IWineD3DVertexShader_Release(This->wineD3DVertexShader); wined3d_mutex_unlock(); } - HeapFree(GetProcessHeap(), 0, This); + else + { + d3d8_vertexshader_wined3d_object_destroyed(This); + } } return ref; } -const IDirect3DVertexShader8Vtbl Direct3DVertexShader8_Vtbl = +static const IDirect3DVertexShader8Vtbl Direct3DVertexShader8_Vtbl = { /* IUnknown */ IDirect3DVertexShader8Impl_QueryInterface, IDirect3DVertexShader8Impl_AddRef, IDirect3DVertexShader8Impl_Release, }; + +static const struct wined3d_parent_ops d3d8_vertexshader_wined3d_parent_ops = +{ + d3d8_vertexshader_wined3d_object_destroyed, +}; + +static HRESULT vertexshader_create_vertexdeclaration(IDirect3DDevice8Impl *device, + const DWORD *declaration, DWORD shader_handle, IDirect3DVertexDeclaration8 **decl_ptr) +{ + IDirect3DVertexDeclaration8Impl *object; + HRESULT hr; + + TRACE("device %p, declaration %p, shader_handle %#x, decl_ptr %p.\n", + device, declaration, shader_handle, decl_ptr); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) { + ERR("Memory allocation failed\n"); + *decl_ptr = NULL; + return D3DERR_OUTOFVIDEOMEMORY; + } + + hr = vertexdeclaration_init(object, device, declaration, shader_handle); + if (FAILED(hr)) + { + WARN("Failed to initialize vertex declaration, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created vertex declaration %p.\n", object); + *decl_ptr = (IDirect3DVertexDeclaration8 *)object; + + return D3D_OK; +} + +HRESULT vertexshader_init(IDirect3DVertexShader8Impl *shader, IDirect3DDevice8Impl *device, + const DWORD *declaration, const DWORD *byte_code, DWORD shader_handle, DWORD usage) +{ + const DWORD *token = declaration; + HRESULT hr; + + /* Test if the vertex declaration is valid */ + while (D3DVSD_END() != *token) + { + D3DVSD_TOKENTYPE token_type = ((*token & D3DVSD_TOKENTYPEMASK) >> D3DVSD_TOKENTYPESHIFT); + + if (token_type == D3DVSD_TOKEN_STREAMDATA && !(token_type & 0x10000000)) + { + DWORD type = ((*token & D3DVSD_DATATYPEMASK) >> D3DVSD_DATATYPESHIFT); + DWORD reg = ((*token & D3DVSD_VERTEXREGMASK) >> D3DVSD_VERTEXREGSHIFT); + + if (reg == D3DVSDE_NORMAL && type != D3DVSDT_FLOAT3 && !byte_code) + { + WARN("Attempt to use a non-FLOAT3 normal with the fixed function function\n"); + return D3DERR_INVALIDCALL; + } + } + token += parse_token(token); + } + + shader->ref = 1; + shader->lpVtbl = &Direct3DVertexShader8_Vtbl; + + hr = vertexshader_create_vertexdeclaration(device, declaration, shader_handle, &shader->vertex_declaration); + if (FAILED(hr)) + { + WARN("Failed to create vertex declaration, hr %#x.\n", hr); + return hr; + } + + if (byte_code) + { + if (usage) FIXME("Usage %#x not implemented.\n", usage); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateVertexShader(device->WineD3DDevice, byte_code, + NULL /* output signature */, &shader->wineD3DVertexShader, + (IUnknown *)shader, &d3d8_vertexshader_wined3d_parent_ops); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr); + IDirect3DVertexDeclaration8_Release(shader->vertex_declaration); + return hr; + } + + load_local_constants(declaration, shader->wineD3DVertexShader); + } + + return D3D_OK; +} diff --git a/reactos/dll/directx/wine/d3d8/volume.c b/reactos/dll/directx/wine/d3d8/volume.c index 968b5348a87..2d29d10f1f8 100644 --- a/reactos/dll/directx/wine/d3d8/volume.c +++ b/reactos/dll/directx/wine/d3d8/volume.c @@ -52,6 +52,14 @@ static ULONG WINAPI IDirect3DVolume8Impl_AddRef(LPDIRECT3DVOLUME8 iface) { /* No container, handle our own refcounting */ ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) : AddRef from %d\n", This, ref - 1); + + if (ref == 1) + { + wined3d_mutex_lock(); + IWineD3DVolume_AddRef(This->wineD3DVolume); + wined3d_mutex_unlock(); + } + return ref; } } @@ -75,8 +83,6 @@ static ULONG WINAPI IDirect3DVolume8Impl_Release(LPDIRECT3DVOLUME8 iface) { wined3d_mutex_lock(); IWineD3DVolume_Release(This->wineD3DVolume); wined3d_mutex_unlock(); - - HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -202,7 +208,7 @@ static HRESULT WINAPI IDirect3DVolume8Impl_UnlockBox(LPDIRECT3DVOLUME8 iface) { return hr; } -const IDirect3DVolume8Vtbl Direct3DVolume8_Vtbl = +static const IDirect3DVolume8Vtbl Direct3DVolume8_Vtbl = { /* IUnknown */ IDirect3DVolume8Impl_QueryInterface, @@ -219,12 +225,31 @@ const IDirect3DVolume8Vtbl Direct3DVolume8_Vtbl = IDirect3DVolume8Impl_UnlockBox }; -ULONG WINAPI D3D8CB_DestroyVolume(IWineD3DVolume *pVolume) { - IDirect3DVolume8Impl* volumeParent; - - IWineD3DVolume_GetParent(pVolume, (IUnknown **) &volumeParent); - /* GetParent's AddRef was forwarded to an object in destruction. - * Releasing it here again would cause an endless recursion. */ - volumeParent->forwardReference = NULL; - return IDirect3DVolume8_Release((IDirect3DVolume8*) volumeParent); +static void STDMETHODCALLTYPE volume_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_volume_wined3d_parent_ops = +{ + volume_wined3d_object_destroyed, +}; + +HRESULT volume_init(IDirect3DVolume8Impl *volume, IDirect3DDevice8Impl *device, UINT width, UINT height, + UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool) +{ + HRESULT hr; + + volume->lpVtbl = &Direct3DVolume8_Vtbl; + volume->ref = 1; + + hr = IWineD3DDevice_CreateVolume(device->WineD3DDevice, width, height, depth, usage, + format, pool, &volume->wineD3DVolume, (IUnknown *)volume, &d3d8_volume_wined3d_parent_ops); + if (FAILED(hr)) + { + WARN("Failed to create wined3d volume, hr %#x.\n", hr); + return hr; + } + + return D3D_OK; } diff --git a/reactos/dll/directx/wine/d3d8/volumetexture.c b/reactos/dll/directx/wine/d3d8/volumetexture.c index 1875081a3bd..46c1ec5af83 100644 --- a/reactos/dll/directx/wine/d3d8/volumetexture.c +++ b/reactos/dll/directx/wine/d3d8/volumetexture.c @@ -47,6 +47,14 @@ static ULONG WINAPI IDirect3DVolumeTexture8Impl_AddRef(LPDIRECT3DVOLUMETEXTURE8 TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IDirect3DDevice8_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DVolumeTexture_AddRef(This->wineD3DVolumeTexture); + wined3d_mutex_unlock(); + } + return ref; } @@ -57,12 +65,10 @@ static ULONG WINAPI IDirect3DVolumeTexture8Impl_Release(LPDIRECT3DVOLUMETEXTURE8 TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { - wined3d_mutex_lock(); - IWineD3DVolumeTexture_Destroy(This->wineD3DVolumeTexture, D3D8CB_DestroyVolume); - wined3d_mutex_unlock(); - IUnknown_Release(This->parentDevice); - HeapFree(GetProcessHeap(), 0, This); + wined3d_mutex_lock(); + IWineD3DVolumeTexture_Release(This->wineD3DVolumeTexture); + wined3d_mutex_unlock(); } return ref; } @@ -285,8 +291,7 @@ static HRESULT WINAPI IDirect3DVolumeTexture8Impl_AddDirtyBox(LPDIRECT3DVOLUMETE return hr; } - -const IDirect3DVolumeTexture8Vtbl Direct3DVolumeTexture8_Vtbl = +static const IDirect3DVolumeTexture8Vtbl Direct3DVolumeTexture8_Vtbl = { /* IUnknown */ IDirect3DVolumeTexture8Impl_QueryInterface, @@ -312,3 +317,38 @@ const IDirect3DVolumeTexture8Vtbl Direct3DVolumeTexture8_Vtbl = IDirect3DVolumeTexture8Impl_UnlockBox, IDirect3DVolumeTexture8Impl_AddDirtyBox }; + +static void STDMETHODCALLTYPE volumetexture_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d8_volumetexture_wined3d_parent_ops = +{ + volumetexture_wined3d_object_destroyed, +}; + +HRESULT volumetexture_init(IDirect3DVolumeTexture8Impl *texture, IDirect3DDevice8Impl *device, + UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; + + texture->lpVtbl = &Direct3DVolumeTexture8_Vtbl; + texture->ref = 1; + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateVolumeTexture(device->WineD3DDevice, width, height, depth, levels, + usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, + &texture->wineD3DVolumeTexture, (IUnknown *)texture, &d3d8_volumetexture_wined3d_parent_ops); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d volume texture, hr %#x.\n", hr); + return hr; + } + + texture->parentDevice = (IDirect3DDevice8 *)device; + IDirect3DDevice8_AddRef(texture->parentDevice); + + return D3D_OK; +} diff --git a/reactos/dll/directx/wine/d3d9/cubetexture.c b/reactos/dll/directx/wine/d3d9/cubetexture.c index 8209d0b367f..4bab9dfd021 100644 --- a/reactos/dll/directx/wine/d3d9/cubetexture.c +++ b/reactos/dll/directx/wine/d3d9/cubetexture.c @@ -49,6 +49,14 @@ static ULONG WINAPI IDirect3DCubeTexture9Impl_AddRef(LPDIRECT3DCUBETEXTURE9 ifac TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IDirect3DDevice9Ex_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DCubeTexture_AddRef(This->wineD3DCubeTexture); + wined3d_mutex_unlock(); + } + return ref; } @@ -61,12 +69,10 @@ static ULONG WINAPI IDirect3DCubeTexture9Impl_Release(LPDIRECT3DCUBETEXTURE9 ifa if (ref == 0) { TRACE("Releasing child %p\n", This->wineD3DCubeTexture); - wined3d_mutex_lock(); - IWineD3DCubeTexture_Destroy(This->wineD3DCubeTexture, D3D9CB_DestroySurface); IDirect3DDevice9Ex_Release(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DCubeTexture_Release(This->wineD3DCubeTexture); wined3d_mutex_unlock(); - - HeapFree(GetProcessHeap(), 0, This); } return ref; } @@ -352,48 +358,37 @@ static const IDirect3DCubeTexture9Vtbl Direct3DCubeTexture9_Vtbl = IDirect3DCubeTexture9Impl_AddDirtyRect }; +static void STDMETHODCALLTYPE cubetexture_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} +static const struct wined3d_parent_ops d3d9_cubetexture_wined3d_parent_ops = +{ + cubetexture_wined3d_object_destroyed, +}; +HRESULT cubetexture_init(IDirect3DCubeTexture9Impl *texture, IDirect3DDevice9Impl *device, + UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; -/* IDirect3DDevice9 IDirect3DCubeTexture9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateCubeTexture(LPDIRECT3DDEVICE9EX iface, - UINT EdgeLength, UINT Levels, DWORD Usage, - D3DFORMAT Format, D3DPOOL Pool, - IDirect3DCubeTexture9** ppCubeTexture, HANDLE* pSharedHandle) { - - IDirect3DCubeTexture9Impl *object; - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hr = D3D_OK; - - TRACE("(%p) : ELen(%d) Lvl(%d) Usage(%d) fmt(%u), Pool(%d) Shared(%p)\n", This, EdgeLength, Levels, Usage, Format, Pool, pSharedHandle); - - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - - if (NULL == object) { - ERR("(%p) allocation of CubeTexture failed\n", This); - return D3DERR_OUTOFVIDEOMEMORY; - } - object->lpVtbl = &Direct3DCubeTexture9_Vtbl; - object->ref = 1; + texture->lpVtbl = &Direct3DCubeTexture9_Vtbl; + texture->ref = 1; wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateCubeTexture(This->WineD3DDevice, EdgeLength, Levels, Usage, - wined3dformat_from_d3dformat(Format), Pool, &object->wineD3DCubeTexture, (IUnknown *)object); + hr = IWineD3DDevice_CreateCubeTexture(device->WineD3DDevice, edge_length, levels, usage, + wined3dformat_from_d3dformat(format), pool, &texture->wineD3DCubeTexture, + (IUnknown *)texture, &d3d9_cubetexture_wined3d_parent_ops); wined3d_mutex_unlock(); - - if (hr != D3D_OK){ - - /* free up object */ - WARN("(%p) call to IWineD3DDevice_CreateCubeTexture failed\n", This); - HeapFree(GetProcessHeap(), 0, object); - } else { - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - *ppCubeTexture = (LPDIRECT3DCUBETEXTURE9) object; - TRACE("(%p) : Created cube texture %p\n", This, object); + if (FAILED(hr)) + { + WARN("Failed to create wined3d cube texture, hr %#x.\n", hr); + return hr; } - TRACE("(%p) returning %p\n",This, *ppCubeTexture); - return hr; + texture->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(texture->parentDevice); + + return D3D_OK; } diff --git a/reactos/dll/directx/wine/d3d9/d3d9_private.h b/reactos/dll/directx/wine/d3d9/d3d9_private.h index b6ef7cf90cb..6184df29f7a 100644 --- a/reactos/dll/directx/wine/d3d9/d3d9_private.h +++ b/reactos/dll/directx/wine/d3d9/d3d9_private.h @@ -41,11 +41,9 @@ /* =========================================================================== Internal use =========================================================================== */ -extern HRESULT vdecl_convert_fvf( - DWORD FVF, - D3DVERTEXELEMENT9** ppVertexElements); -D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format); -WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format); +extern HRESULT vdecl_convert_fvf(DWORD FVF, D3DVERTEXELEMENT9 **ppVertexElements) DECLSPEC_HIDDEN; +D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format) DECLSPEC_HIDDEN; +WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_HIDDEN; /* =========================================================================== Macros @@ -140,7 +138,7 @@ WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format); /***************************************************************************** * Predeclare the interface implementation structures */ -extern const IDirect3D9ExVtbl Direct3D9_Vtbl; +extern const IDirect3D9ExVtbl Direct3D9_Vtbl DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3D implementation structure @@ -158,7 +156,7 @@ typedef struct IDirect3D9Impl BOOL extended; } IDirect3D9Impl; -void filter_caps(D3DCAPS9* pCaps); +void filter_caps(D3DCAPS9* pCaps) DECLSPEC_HIDDEN; /* ---------------- */ /* IDirect3DDevice9 */ @@ -167,8 +165,8 @@ void filter_caps(D3DCAPS9* pCaps); /***************************************************************************** * Predeclare the interface implementation structures */ -extern const IDirect3DDevice9ExVtbl Direct3DDevice9_Vtbl; -extern const IWineD3DDeviceParentVtbl d3d9_wined3d_device_parent_vtbl; +extern const IDirect3DDevice9ExVtbl Direct3DDevice9_Vtbl DECLSPEC_HIDDEN; +extern const IWineD3DDeviceParentVtbl d3d9_wined3d_device_parent_vtbl DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DDevice9 implementation structure @@ -194,39 +192,54 @@ typedef struct IDirect3DDevice9Impl /* IDirect3DDevice9: */ -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateAdditionalSwapChain(LPDIRECT3DDEVICE9EX iface, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain9** pSwapChain); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain); -extern UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(LPDIRECT3DDEVICE9EX iface); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateTexture(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, HANDLE* pSharedHandle); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateVolumeTexture(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DVolumeTexture9** ppVolumeTexture, HANDLE* pSharedHandle); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateCubeTexture(LPDIRECT3DDEVICE9EX iface, UINT EdgeLength, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture9** ppCubeTexture, HANDLE* pSharedHandle); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexBuffer(LPDIRECT3DDEVICE9EX iface, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateIndexBuffer(LPDIRECT3DDEVICE9EX iface, UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(LPDIRECT3DDEVICE9EX iface, D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppSB); -extern HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(LPDIRECT3DDEVICE9EX iface); -extern HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(LPDIRECT3DDEVICE9EX iface, IDirect3DStateBlock9** ppSB); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexDeclaration(LPDIRECT3DDEVICE9EX iface, CONST D3DVERTEXELEMENT9* pVertexElements, IDirect3DVertexDeclaration9** ppDecl); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexDeclaration9* pDecl); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexDeclaration9** ppDecl); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexShader(LPDIRECT3DDEVICE9EX iface, CONST DWORD* pFunction, IDirect3DVertexShader9** ppShader); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShader(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexShader9* pShader); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexShader9** ppShader); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantF(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, CONST float* pConstantData, UINT Vector4fCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantF(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, float* pConstantData, UINT Vector4fCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantI(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, CONST int* pConstantData, UINT Vector4iCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantI(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, int* pConstantData, UINT Vector4iCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantB(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, CONST BOOL* pConstantData, UINT BoolCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantB(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, BOOL* pConstantData, UINT BoolCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreatePixelShader(LPDIRECT3DDEVICE9EX iface, CONST DWORD* pFunction, IDirect3DPixelShader9** ppShader); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShader(LPDIRECT3DDEVICE9EX iface, IDirect3DPixelShader9* pShader); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(LPDIRECT3DDEVICE9EX iface, IDirect3DPixelShader9** ppShader); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantF(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, CONST float* pConstantData, UINT Vector4fCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantF(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, float* pConstantData, UINT Vector4fCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantI(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, CONST int* pConstantData, UINT Vector4iCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantI(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, int* pConstantData, UINT Vector4iCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, CONST BOOL* pConstantData, UINT BoolCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(LPDIRECT3DDEVICE9EX iface, UINT StartRegister, BOOL* pConstantData, UINT BoolCount); -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(LPDIRECT3DDEVICE9EX iface, D3DQUERYTYPE Type, IDirect3DQuery9** ppQuery); +extern HRESULT WINAPI IDirect3DDevice9Impl_CreateAdditionalSwapChain(IDirect3DDevice9Ex *iface, + D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DSwapChain9 **pSwapChain) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(IDirect3DDevice9Ex *iface, + UINT iSwapChain, IDirect3DSwapChain9 **pSwapChain) DECLSPEC_HIDDEN; +extern UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(IDirect3DDevice9Ex *iface, + D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9 **ppSB) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface, + IDirect3DStateBlock9 **ppSB) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(IDirect3DDevice9Ex *iface, + IDirect3DVertexDeclaration9 *pDecl) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(IDirect3DDevice9Ex *iface, + IDirect3DVertexDeclaration9 **ppDecl) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShader(IDirect3DDevice9Ex *iface, + IDirect3DVertexShader9 *pShader) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(IDirect3DDevice9Ex *iface, + IDirect3DVertexShader9 **ppShader) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantF(IDirect3DDevice9Ex *iface, + UINT StartRegister, const float *pConstantData, UINT Vector4fCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantF(IDirect3DDevice9Ex *iface, + UINT StartRegister, float *pConstantData, UINT Vector4fCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantI(IDirect3DDevice9Ex *iface, + UINT StartRegister, const int *pConstantData, UINT Vector4iCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantI(IDirect3DDevice9Ex *iface, + UINT StartRegister, int *pConstantData, UINT Vector4iCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShaderConstantB(IDirect3DDevice9Ex *iface, + UINT StartRegister, const BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShaderConstantB(IDirect3DDevice9Ex *iface, + UINT StartRegister, BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShader(IDirect3DDevice9Ex *iface, + IDirect3DPixelShader9 *pShader) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShader(IDirect3DDevice9Ex *iface, + IDirect3DPixelShader9 **ppShader) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantF(IDirect3DDevice9Ex *iface, + UINT StartRegister, const float *pConstantData, UINT Vector4fCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantF(IDirect3DDevice9Ex *iface, + UINT StartRegister, float *pConstantData, UINT Vector4fCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantI(IDirect3DDevice9Ex *iface, + UINT StartRegister, const int *pConstantData, UINT Vector4iCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantI(IDirect3DDevice9Ex *iface, + UINT StartRegister, int *pConstantData, UINT Vector4iCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(IDirect3DDevice9Ex *iface, + UINT StartRegister, const BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(IDirect3DDevice9Ex *iface, + UINT StartRegister, BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN; +extern HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(IDirect3DDevice9Ex *iface, + D3DQUERYTYPE Type, IDirect3DQuery9 **ppQuery) DECLSPEC_HIDDEN; /* ---------------- */ @@ -236,7 +249,6 @@ extern HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(LPDIRECT3DDEVICE9EX ifa /***************************************************************************** * IDirect3DVolume9 implementation structure */ -extern const IDirect3DVolume9Vtbl Direct3DVolume9_Vtbl; typedef struct IDirect3DVolume9Impl { /* IUnknown fields */ @@ -253,6 +265,9 @@ typedef struct IDirect3DVolume9Impl IUnknown *forwardReference; } IDirect3DVolume9Impl; +HRESULT volume_init(IDirect3DVolume9Impl *volume, IDirect3DDevice9Impl *device, UINT width, UINT height, + UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool) DECLSPEC_HIDDEN; + /* ------------------- */ /* IDirect3DSwapChain9 */ /* ------------------- */ @@ -280,11 +295,6 @@ typedef struct IDirect3DSwapChain9Impl /* IDirect3DSurface9 */ /* ----------------- */ -/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DSurface9Vtbl Direct3DSurface9_Vtbl; - /***************************************************************************** * IDirect3DSurface9 implementation structure */ @@ -306,10 +316,13 @@ typedef struct IDirect3DSurface9Impl /* If set forward refcounting to this object */ IUnknown *forwardReference; - /* Flags an implicit surface */ - BOOL isImplicit; + BOOL getdc_supported; } IDirect3DSurface9Impl; +HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *device, + UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level, + DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) DECLSPEC_HIDDEN; + /* ---------------------- */ /* IDirect3DVertexBuffer9 */ /* ---------------------- */ @@ -332,6 +345,9 @@ typedef struct IDirect3DVertexBuffer9Impl DWORD fvf; } IDirect3DVertexBuffer9Impl; +HRESULT vertexbuffer_init(IDirect3DVertexBuffer9Impl *buffer, IDirect3DDevice9Impl *device, + UINT size, UINT usage, DWORD fvf, D3DPOOL pool) DECLSPEC_HIDDEN; + /* --------------------- */ /* IDirect3DIndexBuffer9 */ /* --------------------- */ @@ -353,6 +369,9 @@ typedef struct IDirect3DIndexBuffer9Impl WINED3DFORMAT format; } IDirect3DIndexBuffer9Impl; +HRESULT indexbuffer_init(IDirect3DIndexBuffer9Impl *buffer, IDirect3DDevice9Impl *device, + UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; + /* --------------------- */ /* IDirect3DBaseTexture9 */ /* --------------------- */ @@ -390,6 +409,8 @@ typedef struct IDirect3DCubeTexture9Impl LPDIRECT3DDEVICE9EX parentDevice; } IDirect3DCubeTexture9Impl; +HRESULT cubetexture_init(IDirect3DCubeTexture9Impl *texture, IDirect3DDevice9Impl *device, + UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; /* ----------------- */ /* IDirect3DTexture9 */ @@ -411,6 +432,9 @@ typedef struct IDirect3DTexture9Impl LPDIRECT3DDEVICE9EX parentDevice; } IDirect3DTexture9Impl; +HRESULT texture_init(IDirect3DTexture9Impl *texture, IDirect3DDevice9Impl *device, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; + /* ----------------------- */ /* IDirect3DVolumeTexture9 */ /* ----------------------- */ @@ -431,6 +455,9 @@ typedef struct IDirect3DVolumeTexture9Impl LPDIRECT3DDEVICE9EX parentDevice; } IDirect3DVolumeTexture9Impl; +HRESULT volumetexture_init(IDirect3DVolumeTexture9Impl *texture, IDirect3DDevice9Impl *device, + UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) DECLSPEC_HIDDEN; + /* ----------------------- */ /* IDirect3DStateBlock9 */ /* ----------------------- */ @@ -474,7 +501,9 @@ typedef struct IDirect3DVertexDeclaration9Impl { LPDIRECT3DDEVICE9EX parentDevice; } IDirect3DVertexDeclaration9Impl; -void IDirect3DVertexDeclaration9Impl_Destroy(LPDIRECT3DVERTEXDECLARATION9 iface); +void IDirect3DVertexDeclaration9Impl_Destroy(LPDIRECT3DVERTEXDECLARATION9 iface) DECLSPEC_HIDDEN; +HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declaration, + IDirect3DDevice9Impl *device, const D3DVERTEXELEMENT9 *elements) DECLSPEC_HIDDEN; /* ---------------------- */ /* IDirect3DVertexShader9 */ @@ -495,7 +524,11 @@ typedef struct IDirect3DVertexShader9Impl { LPDIRECT3DDEVICE9EX parentDevice; } IDirect3DVertexShader9Impl; +HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader, + IDirect3DDevice9Impl *device, const DWORD *byte_code) DECLSPEC_HIDDEN; + #define D3D9_MAX_VERTEX_SHADER_CONSTANTF 256 +#define D3D9_MAX_SIMULTANEOUS_RENDERTARGETS 4 /* --------------------- */ /* IDirect3DPixelShader9 */ @@ -516,6 +549,9 @@ typedef struct IDirect3DPixelShader9Impl { LPDIRECT3DDEVICE9EX parentDevice; } IDirect3DPixelShader9Impl; +HRESULT pixelshader_init(IDirect3DPixelShader9Impl *shader, + IDirect3DDevice9Impl *device, const DWORD *byte_code) DECLSPEC_HIDDEN; + /* --------------- */ /* IDirect3DQuery9 */ /* --------------- */ @@ -537,10 +573,6 @@ typedef struct IDirect3DQuery9Impl { /* Callbacks */ -extern ULONG WINAPI D3D9CB_DestroySwapChain (IWineD3DSwapChain *pSwapChain); -extern ULONG WINAPI D3D9CB_DestroyDepthStencilSurface (IWineD3DSurface *pSurface); -extern ULONG WINAPI D3D9CB_DestroyRenderTarget (IWineD3DSurface *pSurface); -extern ULONG WINAPI D3D9CB_DestroySurface(IWineD3DSurface *pSurface); -extern ULONG WINAPI D3D9CB_DestroyVolume(IWineD3DVolume *pVolume); +extern ULONG WINAPI D3D9CB_DestroySwapChain (IWineD3DSwapChain *pSwapChain) DECLSPEC_HIDDEN; #endif /* __WINE_D3D9_PRIVATE_H */ diff --git a/reactos/dll/directx/wine/d3d9/device.c b/reactos/dll/directx/wine/d3d9/device.c index 5a87a8f1ef3..5a37f81dd98 100644 --- a/reactos/dll/directx/wine/d3d9/device.c +++ b/reactos/dll/directx/wine/d3d9/device.c @@ -35,44 +35,44 @@ D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format) switch(format) { case WINED3DFMT_UNKNOWN: return D3DFMT_UNKNOWN; - case WINED3DFMT_R8G8B8: return D3DFMT_R8G8B8; - case WINED3DFMT_A8R8G8B8: return D3DFMT_A8R8G8B8; - case WINED3DFMT_X8R8G8B8: return D3DFMT_X8R8G8B8; - case WINED3DFMT_R5G6B5: return D3DFMT_R5G6B5; - case WINED3DFMT_X1R5G5B5: return D3DFMT_X1R5G5B5; - case WINED3DFMT_A1R5G5B5: return D3DFMT_A1R5G5B5; - case WINED3DFMT_A4R4G4B4: return D3DFMT_A4R4G4B4; - case WINED3DFMT_R3G3B2: return D3DFMT_R3G3B2; + case WINED3DFMT_B8G8R8_UNORM: return D3DFMT_R8G8B8; + case WINED3DFMT_B8G8R8A8_UNORM: return D3DFMT_A8R8G8B8; + case WINED3DFMT_B8G8R8X8_UNORM: return D3DFMT_X8R8G8B8; + case WINED3DFMT_B5G6R5_UNORM: return D3DFMT_R5G6B5; + case WINED3DFMT_B5G5R5X1_UNORM: return D3DFMT_X1R5G5B5; + case WINED3DFMT_B5G5R5A1_UNORM: return D3DFMT_A1R5G5B5; + case WINED3DFMT_B4G4R4A4_UNORM: return D3DFMT_A4R4G4B4; + case WINED3DFMT_B2G3R3_UNORM: return D3DFMT_R3G3B2; case WINED3DFMT_A8_UNORM: return D3DFMT_A8; - case WINED3DFMT_A8R3G3B2: return D3DFMT_A8R3G3B2; - case WINED3DFMT_X4R4G4B4: return D3DFMT_X4R4G4B4; + case WINED3DFMT_B2G3R3A8_UNORM: return D3DFMT_A8R3G3B2; + case WINED3DFMT_B4G4R4X4_UNORM: return D3DFMT_X4R4G4B4; case WINED3DFMT_R10G10B10A2_UNORM: return D3DFMT_A2B10G10R10; case WINED3DFMT_R8G8B8A8_UNORM: return D3DFMT_A8B8G8R8; - case WINED3DFMT_X8B8G8R8: return D3DFMT_X8B8G8R8; + case WINED3DFMT_R8G8B8X8_UNORM: return D3DFMT_X8B8G8R8; case WINED3DFMT_R16G16_UNORM: return D3DFMT_G16R16; - case WINED3DFMT_A2R10G10B10: return D3DFMT_A2R10G10B10; + case WINED3DFMT_B10G10R10A2_UNORM: return D3DFMT_A2R10G10B10; case WINED3DFMT_R16G16B16A16_UNORM: return D3DFMT_A16B16G16R16; - case WINED3DFMT_A8P8: return D3DFMT_A8P8; - case WINED3DFMT_P8: return D3DFMT_P8; - case WINED3DFMT_L8: return D3DFMT_L8; - case WINED3DFMT_A8L8: return D3DFMT_A8L8; - case WINED3DFMT_A4L4: return D3DFMT_A4L4; + case WINED3DFMT_P8_UINT_A8_UNORM: return D3DFMT_A8P8; + case WINED3DFMT_P8_UINT: return D3DFMT_P8; + case WINED3DFMT_L8_UNORM: return D3DFMT_L8; + case WINED3DFMT_L8A8_UNORM: return D3DFMT_A8L8; + case WINED3DFMT_L4A4_UNORM: return D3DFMT_A4L4; case WINED3DFMT_R8G8_SNORM: return D3DFMT_V8U8; - case WINED3DFMT_L6V5U5: return D3DFMT_L6V5U5; - case WINED3DFMT_X8L8V8U8: return D3DFMT_X8L8V8U8; + case WINED3DFMT_R5G5_SNORM_L6_UNORM: return D3DFMT_L6V5U5; + case WINED3DFMT_R8G8_SNORM_L8X8_UNORM: return D3DFMT_X8L8V8U8; case WINED3DFMT_R8G8B8A8_SNORM: return D3DFMT_Q8W8V8U8; case WINED3DFMT_R16G16_SNORM: return D3DFMT_V16U16; - case WINED3DFMT_A2W10V10U10: return D3DFMT_A2W10V10U10; + case WINED3DFMT_R10G10B10_SNORM_A2_UNORM: return D3DFMT_A2W10V10U10; case WINED3DFMT_D16_LOCKABLE: return D3DFMT_D16_LOCKABLE; - case WINED3DFMT_D32: return D3DFMT_D32; - case WINED3DFMT_D15S1: return D3DFMT_D15S1; - case WINED3DFMT_D24S8: return D3DFMT_D24S8; - case WINED3DFMT_D24X8: return D3DFMT_D24X8; - case WINED3DFMT_D24X4S4: return D3DFMT_D24X4S4; + case WINED3DFMT_D32_UNORM: return D3DFMT_D32; + case WINED3DFMT_S1_UINT_D15_UNORM: return D3DFMT_D15S1; + case WINED3DFMT_S8_UINT_D24_UNORM: return D3DFMT_D24S8; + case WINED3DFMT_X8D24_UNORM: return D3DFMT_D24X8; + case WINED3DFMT_S4X4_UINT_D24_UNORM: return D3DFMT_D24X4S4; case WINED3DFMT_D16_UNORM: return D3DFMT_D16; - case WINED3DFMT_L16: return D3DFMT_L16; - case WINED3DFMT_D32F_LOCKABLE: return D3DFMT_D32F_LOCKABLE; - case WINED3DFMT_D24FS8: return D3DFMT_D24FS8; + case WINED3DFMT_L16_UNORM: return D3DFMT_L16; + case WINED3DFMT_D32_FLOAT: return D3DFMT_D32F_LOCKABLE; + case WINED3DFMT_S8_UINT_D24_FLOAT: return D3DFMT_D24FS8; case WINED3DFMT_VERTEXDATA: return D3DFMT_VERTEXDATA; case WINED3DFMT_R16_UINT: return D3DFMT_INDEX16; case WINED3DFMT_R32_UINT: return D3DFMT_INDEX32; @@ -83,7 +83,7 @@ D3DFORMAT d3dformat_from_wined3dformat(WINED3DFORMAT format) case WINED3DFMT_R32_FLOAT: return D3DFMT_R32F; case WINED3DFMT_R32G32_FLOAT: return D3DFMT_G32R32F; case WINED3DFMT_R32G32B32A32_FLOAT: return D3DFMT_A32B32G32R32F; - case WINED3DFMT_CxV8U8: return D3DFMT_CxV8U8; + case WINED3DFMT_R8G8_SNORM_Cx: return D3DFMT_CxV8U8; default: FIXME("Unhandled WINED3DFORMAT %#x\n", format); return D3DFMT_UNKNOWN; @@ -100,44 +100,44 @@ WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format) switch(format) { case D3DFMT_UNKNOWN: return WINED3DFMT_UNKNOWN; - case D3DFMT_R8G8B8: return WINED3DFMT_R8G8B8; - case D3DFMT_A8R8G8B8: return WINED3DFMT_A8R8G8B8; - case D3DFMT_X8R8G8B8: return WINED3DFMT_X8R8G8B8; - case D3DFMT_R5G6B5: return WINED3DFMT_R5G6B5; - case D3DFMT_X1R5G5B5: return WINED3DFMT_X1R5G5B5; - case D3DFMT_A1R5G5B5: return WINED3DFMT_A1R5G5B5; - case D3DFMT_A4R4G4B4: return WINED3DFMT_A4R4G4B4; - case D3DFMT_R3G3B2: return WINED3DFMT_R3G3B2; + case D3DFMT_R8G8B8: return WINED3DFMT_B8G8R8_UNORM; + case D3DFMT_A8R8G8B8: return WINED3DFMT_B8G8R8A8_UNORM; + case D3DFMT_X8R8G8B8: return WINED3DFMT_B8G8R8X8_UNORM; + case D3DFMT_R5G6B5: return WINED3DFMT_B5G6R5_UNORM; + case D3DFMT_X1R5G5B5: return WINED3DFMT_B5G5R5X1_UNORM; + case D3DFMT_A1R5G5B5: return WINED3DFMT_B5G5R5A1_UNORM; + case D3DFMT_A4R4G4B4: return WINED3DFMT_B4G4R4A4_UNORM; + case D3DFMT_R3G3B2: return WINED3DFMT_B2G3R3_UNORM; case D3DFMT_A8: return WINED3DFMT_A8_UNORM; - case D3DFMT_A8R3G3B2: return WINED3DFMT_A8R3G3B2; - case D3DFMT_X4R4G4B4: return WINED3DFMT_X4R4G4B4; + case D3DFMT_A8R3G3B2: return WINED3DFMT_B2G3R3A8_UNORM; + case D3DFMT_X4R4G4B4: return WINED3DFMT_B4G4R4X4_UNORM; case D3DFMT_A2B10G10R10: return WINED3DFMT_R10G10B10A2_UNORM; case D3DFMT_A8B8G8R8: return WINED3DFMT_R8G8B8A8_UNORM; - case D3DFMT_X8B8G8R8: return WINED3DFMT_X8B8G8R8; + case D3DFMT_X8B8G8R8: return WINED3DFMT_R8G8B8X8_UNORM; case D3DFMT_G16R16: return WINED3DFMT_R16G16_UNORM; - case D3DFMT_A2R10G10B10: return WINED3DFMT_A2R10G10B10; + case D3DFMT_A2R10G10B10: return WINED3DFMT_B10G10R10A2_UNORM; case D3DFMT_A16B16G16R16: return WINED3DFMT_R16G16B16A16_UNORM; - case D3DFMT_A8P8: return WINED3DFMT_A8P8; - case D3DFMT_P8: return WINED3DFMT_P8; - case D3DFMT_L8: return WINED3DFMT_L8; - case D3DFMT_A8L8: return WINED3DFMT_A8L8; - case D3DFMT_A4L4: return WINED3DFMT_A4L4; + case D3DFMT_A8P8: return WINED3DFMT_P8_UINT_A8_UNORM; + case D3DFMT_P8: return WINED3DFMT_P8_UINT; + case D3DFMT_L8: return WINED3DFMT_L8_UNORM; + case D3DFMT_A8L8: return WINED3DFMT_L8A8_UNORM; + case D3DFMT_A4L4: return WINED3DFMT_L4A4_UNORM; case D3DFMT_V8U8: return WINED3DFMT_R8G8_SNORM; - case D3DFMT_L6V5U5: return WINED3DFMT_L6V5U5; - case D3DFMT_X8L8V8U8: return WINED3DFMT_X8L8V8U8; + case D3DFMT_L6V5U5: return WINED3DFMT_R5G5_SNORM_L6_UNORM; + case D3DFMT_X8L8V8U8: return WINED3DFMT_R8G8_SNORM_L8X8_UNORM; case D3DFMT_Q8W8V8U8: return WINED3DFMT_R8G8B8A8_SNORM; case D3DFMT_V16U16: return WINED3DFMT_R16G16_SNORM; - case D3DFMT_A2W10V10U10: return WINED3DFMT_A2W10V10U10; + case D3DFMT_A2W10V10U10: return WINED3DFMT_R10G10B10_SNORM_A2_UNORM; case D3DFMT_D16_LOCKABLE: return WINED3DFMT_D16_LOCKABLE; - case D3DFMT_D32: return WINED3DFMT_D32; - case D3DFMT_D15S1: return WINED3DFMT_D15S1; - case D3DFMT_D24S8: return WINED3DFMT_D24S8; - case D3DFMT_D24X8: return WINED3DFMT_D24X8; - case D3DFMT_D24X4S4: return WINED3DFMT_D24X4S4; + case D3DFMT_D32: return WINED3DFMT_D32_UNORM; + case D3DFMT_D15S1: return WINED3DFMT_S1_UINT_D15_UNORM; + case D3DFMT_D24S8: return WINED3DFMT_S8_UINT_D24_UNORM; + case D3DFMT_D24X8: return WINED3DFMT_X8D24_UNORM; + case D3DFMT_D24X4S4: return WINED3DFMT_S4X4_UINT_D24_UNORM; case D3DFMT_D16: return WINED3DFMT_D16_UNORM; - case D3DFMT_L16: return WINED3DFMT_L16; - case D3DFMT_D32F_LOCKABLE: return WINED3DFMT_D32F_LOCKABLE; - case D3DFMT_D24FS8: return WINED3DFMT_D24FS8; + case D3DFMT_L16: return WINED3DFMT_L16_UNORM; + case D3DFMT_D32F_LOCKABLE: return WINED3DFMT_D32_FLOAT; + case D3DFMT_D24FS8: return WINED3DFMT_S8_UINT_D24_FLOAT; case D3DFMT_VERTEXDATA: return WINED3DFMT_VERTEXDATA; case D3DFMT_INDEX16: return WINED3DFMT_R16_UINT; case D3DFMT_INDEX32: return WINED3DFMT_R32_UINT; @@ -148,7 +148,7 @@ WINED3DFORMAT wined3dformat_from_d3dformat(D3DFORMAT format) case D3DFMT_R32F: return WINED3DFMT_R32_FLOAT; case D3DFMT_G32R32F: return WINED3DFMT_R32G32_FLOAT; case D3DFMT_A32B32G32R32F: return WINED3DFMT_R32G32B32A32_FLOAT; - case D3DFMT_CxV8U8: return WINED3DFMT_CxV8U8; + case D3DFMT_CxV8U8: return WINED3DFMT_R8G8_SNORM_Cx; default: FIXME("Unhandled D3DFORMAT %#x\n", format); return WINED3DFMT_UNKNOWN; @@ -257,7 +257,7 @@ static ULONG WINAPI IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) { } HeapFree(GetProcessHeap(), 0, This->convertedDecls); - IWineD3DDevice_Uninit3D(This->WineD3DDevice, D3D9CB_DestroyDepthStencilSurface, D3D9CB_DestroySwapChain); + IWineD3DDevice_Uninit3D(This->WineD3DDevice, D3D9CB_DestroySwapChain); IWineD3DDevice_Release(This->WineD3DDevice); wined3d_mutex_unlock(); @@ -508,7 +508,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3 * below fails, the device is considered "lost", and _Reset and _Release are the only allowed calls */ wined3d_mutex_lock(); - IWineD3DDevice_SetIndices(This->WineD3DDevice, NULL, WINED3DFMT_UNKNOWN); + IWineD3DDevice_SetIndexBuffer(This->WineD3DDevice, NULL, WINED3DFMT_UNKNOWN); for(i = 0; i < 16; i++) { IWineD3DDevice_SetStreamSource(This->WineD3DDevice, i, NULL, 0, 0); } @@ -644,53 +644,196 @@ static void WINAPI IDirect3DDevice9Impl_GetGammaRamp(LPDIRECT3DDEVICE9EX iface, wined3d_mutex_unlock(); } +static HRESULT WINAPI IDirect3DDevice9Impl_CreateTexture(IDirect3DDevice9Ex *iface, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, + D3DPOOL pool, IDirect3DTexture9 **texture, HANDLE *shared_handle) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DTexture9Impl *object; + HRESULT hr; + + TRACE("iface %p, width %u, height %u, levels %u, usage %#x, format %#x, pool %#x, texture %p, shared_handle %p.\n", + iface, width, height, levels, usage, format, pool, texture, shared_handle); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate texture memory.\n"); + return D3DERR_OUTOFVIDEOMEMORY; + } + + hr = texture_init(object, This, width, height, levels, usage, format, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize texture, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created texture %p.\n", object); + *texture = (IDirect3DTexture9 *)object; + + return D3D_OK; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_CreateVolumeTexture(IDirect3DDevice9Ex *iface, + UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, + D3DPOOL pool, IDirect3DVolumeTexture9 **texture, HANDLE *shared_handle) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DVolumeTexture9Impl *object; + HRESULT hr; + + TRACE("iface %p, width %u, height %u, depth %u, levels %u\n", + iface, width, height, depth, levels); + TRACE("usage %#x, format %#x, pool %#x, texture %p, shared_handle %p.\n", + usage, format, pool, texture, shared_handle); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate volume texture memory.\n"); + return D3DERR_OUTOFVIDEOMEMORY; + } + + hr = volumetexture_init(object, This, width, height, depth, levels, usage, format, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize volume texture, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created volume texture %p.\n", object); + *texture = (IDirect3DVolumeTexture9 *)object; + + return D3D_OK; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_CreateCubeTexture(IDirect3DDevice9Ex *iface, + UINT edge_length, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, + IDirect3DCubeTexture9 **texture, HANDLE *shared_handle) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DCubeTexture9Impl *object; + HRESULT hr; + + TRACE("iface %p, edge_length %u, levels %u, usage %#x, format %#x, pool %#x, texture %p, shared_handle %p.\n", + iface, edge_length, levels, usage, format, pool, texture, shared_handle); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate cube texture memory.\n"); + return D3DERR_OUTOFVIDEOMEMORY; + } + + hr = cubetexture_init(object, This, edge_length, levels, usage, format, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize cube texture, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created cube texture %p.\n", object); + *texture = (IDirect3DCubeTexture9 *)object; + + return D3D_OK; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexBuffer(IDirect3DDevice9Ex *iface, UINT size, DWORD usage, + DWORD fvf, D3DPOOL pool, IDirect3DVertexBuffer9 **buffer, HANDLE *shared_handle) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DVertexBuffer9Impl *object; + HRESULT hr; + + TRACE("iface %p, size %u, usage %#x, fvf %#x, pool %#x, buffer %p, shared_handle %p.\n", + iface, size, usage, fvf, pool, buffer, shared_handle); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate buffer memory.\n"); + return D3DERR_OUTOFVIDEOMEMORY; + } + + hr = vertexbuffer_init(object, This, size, usage, fvf, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize vertex buffer, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created vertex buffer %p.\n", object); + *buffer = (IDirect3DVertexBuffer9 *)object; + + return D3D_OK; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_CreateIndexBuffer(IDirect3DDevice9Ex *iface, UINT size, DWORD usage, + D3DFORMAT format, D3DPOOL pool, IDirect3DIndexBuffer9 **buffer, HANDLE *shared_handle) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DIndexBuffer9Impl *object; + HRESULT hr; + + TRACE("iface %p, size %u, usage %#x, format %#x, pool %#x, buffer %p, shared_handle %p.\n", + iface, size, usage, format, pool, buffer, shared_handle); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate buffer memory.\n"); + return D3DERR_OUTOFVIDEOMEMORY; + } + + hr = indexbuffer_init(object, This, size, usage, format, pool); + if (FAILED(hr)) + { + WARN("Failed to initialize index buffer, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created index buffer %p.\n", object); + *buffer = (IDirect3DIndexBuffer9 *)object; + + return D3D_OK; +} static HRESULT IDirect3DDevice9Impl_CreateSurface(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height, D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface9 **ppSurface, UINT Usage, D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality) { - HRESULT hrc; + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; IDirect3DSurface9Impl *object; - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - TRACE("(%p) Relay\n", This); - - if (MultisampleQuality > 0) - { - FIXME("MultisampleQuality set to %d, bstituting 0\n", MultisampleQuality); - MultisampleQuality = 0; - } - /*FIXME: Check MAX bounds of MultisampleQuality*/ - - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface9Impl)); - if (NULL == object) { - FIXME("Allocation of memory failed\n"); - return D3DERR_OUTOFVIDEOMEMORY; - } - - object->lpVtbl = &Direct3DSurface9_Vtbl; - object->ref = 1; + HRESULT hr; TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p\n", This, Width, Height, Format, *ppSurface); - wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, wined3dformat_from_d3dformat(Format), - Lockable, Discard, Level, &object->wineD3DSurface, Usage & WINED3DUSAGE_MASK, (WINED3DPOOL)Pool, - MultiSample, MultisampleQuality, SURFACE_OPENGL, (IUnknown *)object); - wined3d_mutex_unlock(); - - if (hrc != D3D_OK || NULL == object->wineD3DSurface) { - - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreateSurface failed\n", This); - HeapFree(GetProcessHeap(), 0, object); - } else { - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - TRACE("(%p) : Created surface %p\n", This, object); - *ppSurface = (LPDIRECT3DSURFACE9) object; + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface9Impl)); + if (!object) + { + FIXME("Failed to allocate surface memory.\n"); + return D3DERR_OUTOFVIDEOMEMORY; } - return hrc; + + hr = surface_init(object, This, Width, Height, Format, Lockable, Discard, + Level, Usage, Pool, MultiSample, MultisampleQuality); + if (FAILED(hr)) + { + WARN("Failed to initialize surface, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created surface %p.\n", object); + *ppSurface = (IDirect3DSurface9 *)object; + + return D3D_OK; } static HRESULT WINAPI IDirect3DDevice9Impl_CreateRenderTarget(IDirect3DDevice9Ex *iface, UINT Width, UINT Height, @@ -849,6 +992,12 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetRenderTarget(LPDIRECT3DDEVICE9EX HRESULT hr; TRACE("(%p) Relay\n" , This); + if (RenderTargetIndex >= D3D9_MAX_SIMULTANEOUS_RENDERTARGETS) + { + WARN("Invalid index %u specified.\n", RenderTargetIndex); + return D3DERR_INVALIDCALL; + } + wined3d_mutex_lock(); hr = IWineD3DDevice_SetRenderTarget(This->WineD3DDevice, RenderTargetIndex, pSurface ? pSurface->wineD3DSurface : NULL); wined3d_mutex_unlock(); @@ -867,6 +1016,12 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTarget(LPDIRECT3DDEVICE9EX return D3DERR_INVALIDCALL; } + if (RenderTargetIndex >= D3D9_MAX_SIMULTANEOUS_RENDERTARGETS) + { + WARN("Invalid index %u specified.\n", RenderTargetIndex); + return D3DERR_INVALIDCALL; + } + wined3d_mutex_lock(); hr=IWineD3DDevice_GetRenderTarget(This->WineD3DDevice,RenderTargetIndex,&pRenderTarget); @@ -1468,8 +1623,8 @@ static HRESULT WINAPI IDirect3DDevice9Impl_DrawIndexedPrimitive(LPDIRECT3DDEVI wined3d_mutex_lock(); IWineD3DDevice_SetBaseVertexIndex(This->WineD3DDevice, BaseVertexIndex); IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType); - hr = IWineD3DDevice_DrawIndexedPrimitive(This->WineD3DDevice, MinVertexIndex, NumVertices, - startIndex, vertex_count_from_primitive_count(PrimitiveType, primCount)); + hr = IWineD3DDevice_DrawIndexedPrimitive(This->WineD3DDevice, startIndex, + vertex_count_from_primitive_count(PrimitiveType, primCount)); wined3d_mutex_unlock(); return hr; @@ -1501,7 +1656,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_DrawIndexedPrimitiveUP(LPDIRECT3DDE wined3d_mutex_lock(); IWineD3DDevice_SetPrimitiveType(This->WineD3DDevice, PrimitiveType); - hr = IWineD3DDevice_DrawIndexedPrimitiveUP(This->WineD3DDevice, MinVertexIndex, NumVertexIndices, + hr = IWineD3DDevice_DrawIndexedPrimitiveUP(This->WineD3DDevice, vertex_count_from_primitive_count(PrimitiveType, PrimitiveCount), pIndexData, wined3dformat_from_d3dformat(IndexDataFormat), pVertexStreamZeroData, VertexStreamZeroStride); wined3d_mutex_unlock(); @@ -1523,6 +1678,42 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ProcessVertices(LPDIRECT3DDEVICE9EX return hr; } +static HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexDeclaration(IDirect3DDevice9Ex *iface, + const D3DVERTEXELEMENT9 *elements, IDirect3DVertexDeclaration9 **declaration) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DVertexDeclaration9Impl *object; + HRESULT hr; + + TRACE("iface %p, elements %p, declaration %p.\n", iface, elements, declaration); + + if (!declaration) + { + WARN("Caller passed a NULL declaration, returning D3DERR_INVALIDCALL.\n"); + return D3DERR_INVALIDCALL; + } + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate vertex declaration memory.\n"); + return E_OUTOFMEMORY; + } + + hr = vertexdeclaration_init(object, This, elements); + if (FAILED(hr)) + { + WARN("Failed to initialize vertex declaration, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created vertex declaration %p.\n", object); + *declaration = (IDirect3DVertexDeclaration9 *)object; + + return D3D_OK; +} + static IDirect3DVertexDeclaration9 *getConvertedDecl(IDirect3DDevice9Impl *This, DWORD fvf) { HRESULT hr; D3DVERTEXELEMENT9* elements = NULL; @@ -1639,6 +1830,36 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetFVF(LPDIRECT3DDEVICE9EX iface, DWO return hr; } +static HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexShader(IDirect3DDevice9Ex *iface, + const DWORD *byte_code, IDirect3DVertexShader9 **shader) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DVertexShader9Impl *object; + HRESULT hr; + + TRACE("iface %p, byte_code %p, shader %p.\n", iface, byte_code, shader); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate vertex shader memory.\n"); + return E_OUTOFMEMORY; + } + + hr = vertexshader_init(object, This, byte_code); + if (FAILED(hr)) + { + WARN("Failed to initialize vertex shader, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created vertex shader %p.\n", object); + *shader = (IDirect3DVertexShader9 *)object; + + return D3D_OK; +} + static HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSource(LPDIRECT3DDEVICE9EX iface, UINT StreamNumber, IDirect3DVertexBuffer9* pStreamData, UINT OffsetInBytes, UINT Stride) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; @@ -1713,7 +1934,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetIndices(LPDIRECT3DDEVICE9EX ifac TRACE("(%p) Relay\n", This); wined3d_mutex_lock(); - hr = IWineD3DDevice_SetIndices(This->WineD3DDevice, + hr = IWineD3DDevice_SetIndexBuffer(This->WineD3DDevice, ib ? ib->wineD3DIndexBuffer : NULL, ib ? ib->format : WINED3DFMT_UNKNOWN); wined3d_mutex_unlock(); @@ -1733,7 +1954,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetIndices(LPDIRECT3DDEVICE9EX ifac } wined3d_mutex_lock(); - rc = IWineD3DDevice_GetIndices(This->WineD3DDevice, &retIndexData); + rc = IWineD3DDevice_GetIndexBuffer(This->WineD3DDevice, &retIndexData); if (SUCCEEDED(rc) && retIndexData) { IWineD3DBuffer_GetParent(retIndexData, (IUnknown **)ppIndexData); IWineD3DBuffer_Release(retIndexData); @@ -1746,6 +1967,36 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetIndices(LPDIRECT3DDEVICE9EX ifac return rc; } +static HRESULT WINAPI IDirect3DDevice9Impl_CreatePixelShader(IDirect3DDevice9Ex *iface, + const DWORD *byte_code, IDirect3DPixelShader9 **shader) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DPixelShader9Impl *object; + HRESULT hr; + + TRACE("iface %p, byte_code %p, shader %p.\n", iface, byte_code, shader); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + FIXME("Failed to allocate pixel shader memory.\n"); + return E_OUTOFMEMORY; + } + + hr = pixelshader_init(object, This, byte_code); + if (FAILED(hr)) + { + WARN("Failed to initialize pixel shader, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created pixel shader %p.\n", object); + *shader = (IDirect3DPixelShader9 *)object; + + return D3D_OK; +} + static HRESULT WINAPI IDirect3DDevice9Impl_DrawRectPatch(LPDIRECT3DDEVICE9EX iface, UINT Handle, CONST float* pNumSegs, CONST D3DRECTPATCH_INFO* pRectPatchInfo) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; @@ -2014,17 +2265,6 @@ const IDirect3DDevice9ExVtbl Direct3DDevice9_Vtbl = IDirect3DDevice9ExImpl_GetDisplayModeEx }; -ULONG WINAPI D3D9CB_DestroySurface(IWineD3DSurface *pSurface) { - IDirect3DSurface9Impl* surfaceParent; - TRACE("(%p) call back\n", pSurface); - - IWineD3DSurface_GetParent(pSurface, (IUnknown **) &surfaceParent); - /* GetParent's AddRef was forwarded to an object in destruction. - * Releasing it here again would cause an endless recursion. */ - surfaceParent->forwardReference = NULL; - return IDirect3DSurface9_Release((IDirect3DSurface9*) surfaceParent); -} - /* IWineD3DDeviceParent IUnknown methods */ static inline struct IDirect3DDevice9Impl *device_from_device_parent(IWineD3DDeviceParent *iface) @@ -2084,9 +2324,13 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParen } *surface = d3d_surface->wineD3DSurface; + IWineD3DSurface_AddRef(*surface); + d3d_surface->container = superior; IDirect3DDevice9Ex_Release(d3d_surface->parentDevice); d3d_surface->parentDevice = NULL; + + IDirect3DSurface9_Release((IDirect3DSurface9 *)d3d_surface); d3d_surface->forwardReference = superior; return hr; @@ -2114,8 +2358,9 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateRenderTarget(IWineD3DDevice } *surface = d3d_surface->wineD3DSurface; + IWineD3DSurface_AddRef(*surface); + d3d_surface->container = superior; - d3d_surface->isImplicit = TRUE; /* Implicit surfaces are created with an refcount of 0 */ IDirect3DSurface9_Release((IDirect3DSurface9 *)d3d_surface); @@ -2144,8 +2389,8 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3 } *surface = d3d_surface->wineD3DSurface; + IWineD3DSurface_AddRef(*surface); d3d_surface->container = (IUnknown *)This; - d3d_surface->isImplicit = TRUE; /* Implicit surfaces are created with an refcount of 0 */ IDirect3DSurface9_Release((IDirect3DSurface9 *)d3d_surface); @@ -2172,23 +2417,22 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateVolume(IWineD3DDeviceParent return D3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &Direct3DVolume9_Vtbl; - object->ref = 1; - hr = IWineD3DDevice_CreateVolume(This->WineD3DDevice, width, height, depth, usage & WINED3DUSAGE_MASK, - format, pool, &object->wineD3DVolume, (IUnknown *)object); + hr = volume_init(object, This, width, height, depth, usage, format, pool); if (FAILED(hr)) { - ERR("(%p) CreateVolume failed, returning %#x\n", iface, hr); + WARN("Failed to initialize volume, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); - *volume = NULL; return hr; } *volume = object->wineD3DVolume; + IWineD3DVolume_AddRef(*volume); + IDirect3DVolume9_Release((IDirect3DVolume9 *)object); + object->container = superior; object->forwardReference = superior; - TRACE("(%p) Created volume %p\n", iface, *volume); + TRACE("(%p) Created volume %p\n", iface, object); return hr; } diff --git a/reactos/dll/directx/wine/d3d9/directx.c b/reactos/dll/directx/wine/d3d9/directx.c index fe229166904..301f901e5ba 100644 --- a/reactos/dll/directx/wine/d3d9/directx.c +++ b/reactos/dll/directx/wine/d3d9/directx.c @@ -337,6 +337,7 @@ void filter_caps(D3DCAPS9* pCaps) D3DPTEXTURECAPS_CUBEMAP_POW2 | D3DPTEXTURECAPS_VOLUMEMAP_POW2| D3DPTEXTURECAPS_NOPROJECTEDBUMPENV; pCaps->MaxVertexShaderConst = min(D3D9_MAX_VERTEX_SHADER_CONSTANTF, pCaps->MaxVertexShaderConst); + pCaps->NumSimultaneousRTs = min(D3D9_MAX_SIMULTANEOUS_RENDERTARGETS, pCaps->NumSimultaneousRTs); } static HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9EX iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps) { @@ -383,16 +384,6 @@ static HMONITOR WINAPI IDirect3D9Impl_GetAdapterMonitor(LPDIRECT3D9EX iface, UIN return ret; } -ULONG WINAPI D3D9CB_DestroyRenderTarget(IWineD3DSurface *pSurface) { - IDirect3DSurface9Impl* surfaceParent; - TRACE("(%p) call back\n", pSurface); - - IWineD3DSurface_GetParent(pSurface, (IUnknown **) &surfaceParent); - surfaceParent->isImplicit = FALSE; - /* Surface had refcount of 0 GetParent addrefed to 1, so 1 Release is enough */ - return IDirect3DSurface9_Release((IDirect3DSurface9*) surfaceParent); -} - ULONG WINAPI D3D9CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain) { IDirect3DSwapChain9Impl* swapChainParent; TRACE("(%p) call back\n", pSwapChain); @@ -403,16 +394,6 @@ ULONG WINAPI D3D9CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain) { return IDirect3DSwapChain9_Release((IDirect3DSwapChain9*) swapChainParent); } -ULONG WINAPI D3D9CB_DestroyDepthStencilSurface(IWineD3DSurface *pSurface) { - IDirect3DSurface9Impl* surfaceParent; - TRACE("(%p) call back\n", pSurface); - - IWineD3DSurface_GetParent(pSurface, (IUnknown **) &surfaceParent); - surfaceParent->isImplicit = FALSE; - /* Surface had refcount of 0 GetParent addrefed to 1, so 1 Release is enough */ - return IDirect3DSurface9_Release((IDirect3DSurface9*) surfaceParent); -} - static HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9EX iface, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviourFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, diff --git a/reactos/dll/directx/wine/d3d9/indexbuffer.c b/reactos/dll/directx/wine/d3d9/indexbuffer.c index 49f6fc8013a..e089beaddc0 100644 --- a/reactos/dll/directx/wine/d3d9/indexbuffer.c +++ b/reactos/dll/directx/wine/d3d9/indexbuffer.c @@ -47,6 +47,14 @@ static ULONG WINAPI IDirect3DIndexBuffer9Impl_AddRef(LPDIRECT3DINDEXBUFFER9 ifac TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IDirect3DDevice9Ex_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DBuffer_AddRef(This->wineD3DIndexBuffer); + wined3d_mutex_unlock(); + } + return ref; } @@ -57,12 +65,10 @@ static ULONG WINAPI IDirect3DIndexBuffer9Impl_Release(LPDIRECT3DINDEXBUFFER9 ifa TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { + IDirect3DDevice9Ex_Release(This->parentDevice); wined3d_mutex_lock(); IWineD3DBuffer_Release(This->wineD3DIndexBuffer); wined3d_mutex_unlock(); - - IDirect3DDevice9Ex_Release(This->parentDevice); - HeapFree(GetProcessHeap(), 0, This); } return ref; } @@ -230,43 +236,38 @@ static const IDirect3DIndexBuffer9Vtbl Direct3DIndexBuffer9_Vtbl = IDirect3DIndexBuffer9Impl_GetDesc }; - -/* IDirect3DDevice9 IDirect3DIndexBuffer9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateIndexBuffer(IDirect3DDevice9Ex *iface, UINT Length, DWORD Usage, - D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9 **ppIndexBuffer, HANDLE *pSharedHandle) +static void STDMETHODCALLTYPE d3d9_indexbuffer_wined3d_object_destroyed(void *parent) { - IDirect3DIndexBuffer9Impl *object; - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hrc = D3D_OK; + HeapFree(GetProcessHeap(), 0, parent); +} - TRACE("(%p) Relay\n", This); - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if (NULL == object) { - FIXME("Allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n"); - return D3DERR_OUTOFVIDEOMEMORY; - } +static const struct wined3d_parent_ops d3d9_indexbuffer_wined3d_parent_ops = +{ + d3d9_indexbuffer_wined3d_object_destroyed, +}; - object->lpVtbl = &Direct3DIndexBuffer9_Vtbl; - object->ref = 1; - object->format = wined3dformat_from_d3dformat(Format); - TRACE("Calling wined3d create index buffer\n"); +HRESULT indexbuffer_init(IDirect3DIndexBuffer9Impl *buffer, IDirect3DDevice9Impl *device, + UINT size, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; + + buffer->lpVtbl = &Direct3DIndexBuffer9_Vtbl; + buffer->ref = 1; + buffer->format = wined3dformat_from_d3dformat(format); wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateIndexBuffer(This->WineD3DDevice, Length, Usage & WINED3DUSAGE_MASK, - (WINED3DPOOL)Pool, &object->wineD3DIndexBuffer, (IUnknown *)object); + hr = IWineD3DDevice_CreateIndexBuffer(device->WineD3DDevice, size, + usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, &buffer->wineD3DIndexBuffer, + (IUnknown *)buffer, &d3d9_indexbuffer_wined3d_parent_ops); wined3d_mutex_unlock(); - - if (hrc != D3D_OK) { - - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreateIndexBuffer failed\n", This); - HeapFree(GetProcessHeap(), 0, object); - } else { - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - *ppIndexBuffer = (LPDIRECT3DINDEXBUFFER9) object; - TRACE("(%p) : Created index buffer %p\n", This, object); + if (FAILED(hr)) + { + WARN("Failed to create wined3d buffer, hr %#x.\n", hr); + return hr; } - return hrc; + + buffer->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(buffer->parentDevice); + + return D3D_OK; } diff --git a/reactos/dll/directx/wine/d3d9/pixelshader.c b/reactos/dll/directx/wine/d3d9/pixelshader.c index 37950454521..547dc746496 100644 --- a/reactos/dll/directx/wine/d3d9/pixelshader.c +++ b/reactos/dll/directx/wine/d3d9/pixelshader.c @@ -46,6 +46,14 @@ static ULONG WINAPI IDirect3DPixelShader9Impl_AddRef(LPDIRECT3DPIXELSHADER9 ifac TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IDirect3DDevice9Ex_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DPixelShader_AddRef(This->wineD3DPixelShader); + wined3d_mutex_unlock(); + } + return ref; } @@ -56,12 +64,10 @@ static ULONG WINAPI IDirect3DPixelShader9Impl_Release(LPDIRECT3DPIXELSHADER9 ifa TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { + IDirect3DDevice9Ex_Release(This->parentDevice); wined3d_mutex_lock(); IWineD3DPixelShader_Release(This->wineD3DPixelShader); wined3d_mutex_unlock(); - - IDirect3DDevice9Ex_Release(This->parentDevice); - HeapFree(GetProcessHeap(), 0, This); } return ref; } @@ -107,49 +113,38 @@ static const IDirect3DPixelShader9Vtbl Direct3DPixelShader9_Vtbl = IDirect3DPixelShader9Impl_GetFunction }; +static void STDMETHODCALLTYPE d3d9_pixelshader_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} -/* IDirect3DDevice9 IDirect3DPixelShader9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreatePixelShader(LPDIRECT3DDEVICE9EX iface, CONST DWORD* pFunction, IDirect3DPixelShader9** ppShader) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - IDirect3DPixelShader9Impl *object; - HRESULT hrc = D3D_OK; +static const struct wined3d_parent_ops d3d9_pixelshader_wined3d_parent_ops = +{ + d3d9_pixelshader_wined3d_object_destroyed, +}; - TRACE("(%p) Relay\n", This); +HRESULT pixelshader_init(IDirect3DPixelShader9Impl *shader, IDirect3DDevice9Impl *device, const DWORD *byte_code) +{ + HRESULT hr; - if (ppShader == NULL) { - TRACE("(%p) Invalid call\n", This); - return D3DERR_INVALIDCALL; - } - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - - if (NULL == object) { - FIXME("Allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n"); - return E_OUTOFMEMORY; - } - - object->ref = 1; - object->lpVtbl = &Direct3DPixelShader9_Vtbl; + shader->ref = 1; + shader->lpVtbl = &Direct3DPixelShader9_Vtbl; wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreatePixelShader(This->WineD3DDevice, pFunction, NULL, - &object->wineD3DPixelShader, (IUnknown *)object); + hr = IWineD3DDevice_CreatePixelShader(device->WineD3DDevice, byte_code, + NULL, &shader->wineD3DPixelShader, (IUnknown *)shader, + &d3d9_pixelshader_wined3d_parent_ops); wined3d_mutex_unlock(); - - if (hrc != D3D_OK) + if (FAILED(hr)) { - /* free up object */ - FIXME("(%p) call to IWineD3DDevice_CreatePixelShader failed\n", This); - HeapFree(GetProcessHeap(), 0 , object); - } else { - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - *ppShader = (IDirect3DPixelShader9*) object; - TRACE("(%p) : Created pixel shader %p\n", This, object); + WARN("Failed to created wined3d pixel shader, hr %#x.\n", hr); + return hr; } - TRACE("(%p) : returning %p\n", This, *ppShader); - return hrc; + shader->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(shader->parentDevice); + + return D3D_OK; } HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShader(LPDIRECT3DDEVICE9EX iface, IDirect3DPixelShader9* pShader) { diff --git a/reactos/dll/directx/wine/d3d9/surface.c b/reactos/dll/directx/wine/d3d9/surface.c index b4defaf6ee0..f9b2794a25c 100644 --- a/reactos/dll/directx/wine/d3d9/surface.c +++ b/reactos/dll/directx/wine/d3d9/surface.c @@ -53,7 +53,13 @@ static ULONG WINAPI IDirect3DSurface9Impl_AddRef(LPDIRECT3DSURFACE9 iface) { } else { /* No container, handle our own refcounting */ ULONG ref = InterlockedIncrement(&This->ref); - if(ref == 1 && This->parentDevice) IDirect3DDevice9Ex_AddRef(This->parentDevice); + if (ref == 1) + { + if (This->parentDevice) IDirect3DDevice9Ex_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DSurface_AddRef(This->wineD3DSurface); + wined3d_mutex_unlock(); + } TRACE("(%p) : AddRef from %d\n", This, ref - 1); return ref; @@ -77,13 +83,9 @@ static ULONG WINAPI IDirect3DSurface9Impl_Release(LPDIRECT3DSURFACE9 iface) { if (ref == 0) { if (This->parentDevice) IDirect3DDevice9Ex_Release(This->parentDevice); - if (!This->isImplicit) { - wined3d_mutex_lock(); - IWineD3DSurface_Release(This->wineD3DSurface); - wined3d_mutex_unlock(); - - HeapFree(GetProcessHeap(), 0, This); - } + wined3d_mutex_lock(); + IWineD3DSurface_Release(This->wineD3DSurface); + wined3d_mutex_unlock(); } return ref; @@ -269,6 +271,13 @@ static HRESULT WINAPI IDirect3DSurface9Impl_GetDC(LPDIRECT3DSURFACE9 iface, HDC* HRESULT hr; TRACE("(%p) Relay\n", This); + if(!This->getdc_supported) + { + WARN("Surface does not support GetDC, returning D3DERR_INVALIDCALL\n"); + /* Don't touch the DC */ + return D3DERR_INVALIDCALL; + } + wined3d_mutex_lock(); hr = IWineD3DSurface_GetDC(This->wineD3DSurface, phdc); wined3d_mutex_unlock(); @@ -291,8 +300,7 @@ static HRESULT WINAPI IDirect3DSurface9Impl_ReleaseDC(LPDIRECT3DSURFACE9 iface, } } - -const IDirect3DSurface9Vtbl Direct3DSurface9_Vtbl = +static const IDirect3DSurface9Vtbl Direct3DSurface9_Vtbl = { /* IUnknown */ IDirect3DSurface9Impl_QueryInterface, @@ -315,3 +323,63 @@ const IDirect3DSurface9Vtbl Direct3DSurface9_Vtbl = IDirect3DSurface9Impl_GetDC, IDirect3DSurface9Impl_ReleaseDC }; + +static void STDMETHODCALLTYPE surface_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d9_surface_wined3d_parent_ops = +{ + surface_wined3d_object_destroyed, +}; + +HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *device, + UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level, + DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) +{ + HRESULT hr; + + surface->lpVtbl = &Direct3DSurface9_Vtbl; + surface->ref = 1; + + switch (format) + { + case D3DFMT_A8R8G8B8: + case D3DFMT_X8R8G8B8: + case D3DFMT_R5G6B5: + case D3DFMT_X1R5G5B5: + case D3DFMT_A1R5G5B5: + case D3DFMT_R8G8B8: + surface->getdc_supported = TRUE; + break; + + default: + surface->getdc_supported = FALSE; + break; + } + + /* FIXME: Check MAX bounds of MultisampleQuality. */ + if (multisample_quality > 0) + { + FIXME("Multisample quality set to %u, substituting 0.\n", multisample_quality); + multisample_quality = 0; + } + + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateSurface(device->WineD3DDevice, width, height, wined3dformat_from_d3dformat(format), + lockable, discard, level, &surface->wineD3DSurface, usage & WINED3DUSAGE_MASK, (WINED3DPOOL)pool, + multisample_type, multisample_quality, SURFACE_OPENGL, (IUnknown *)surface, + &d3d9_surface_wined3d_parent_ops); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d surface, hr %#x.\n", hr); + return hr; + } + + surface->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(surface->parentDevice); + + return D3D_OK; +} diff --git a/reactos/dll/directx/wine/d3d9/swapchain.c b/reactos/dll/directx/wine/d3d9/swapchain.c index fb6680742f2..e63e3435b60 100644 --- a/reactos/dll/directx/wine/d3d9/swapchain.c +++ b/reactos/dll/directx/wine/d3d9/swapchain.c @@ -63,7 +63,7 @@ static ULONG WINAPI IDirect3DSwapChain9Impl_Release(LPDIRECT3DSWAPCHAIN9 iface) if (This->parentDevice) IDirect3DDevice9Ex_Release(This->parentDevice); if (!This->isImplicit) { wined3d_mutex_lock(); - IWineD3DSwapChain_Destroy(This->wineD3DSwapChain, D3D9CB_DestroyRenderTarget); + IWineD3DSwapChain_Destroy(This->wineD3DSwapChain); wined3d_mutex_unlock(); HeapFree(GetProcessHeap(), 0, This); diff --git a/reactos/dll/directx/wine/d3d9/texture.c b/reactos/dll/directx/wine/d3d9/texture.c index 7db70373833..9818c2698b9 100644 --- a/reactos/dll/directx/wine/d3d9/texture.c +++ b/reactos/dll/directx/wine/d3d9/texture.c @@ -49,6 +49,14 @@ static ULONG WINAPI IDirect3DTexture9Impl_AddRef(LPDIRECT3DTEXTURE9 iface) { TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IDirect3DDevice9Ex_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DTexture_AddRef(This->wineD3DTexture); + wined3d_mutex_unlock(); + } + return ref; } @@ -59,12 +67,10 @@ static ULONG WINAPI IDirect3DTexture9Impl_Release(LPDIRECT3DTEXTURE9 iface) { TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { - wined3d_mutex_lock(); - IWineD3DTexture_Destroy(This->wineD3DTexture, D3D9CB_DestroySurface); - wined3d_mutex_unlock(); - IDirect3DDevice9Ex_Release(This->parentDevice); - HeapFree(GetProcessHeap(), 0, This); + wined3d_mutex_lock(); + IWineD3DTexture_Release(This->wineD3DTexture); + wined3d_mutex_unlock(); } return ref; } @@ -350,43 +356,37 @@ static const IDirect3DTexture9Vtbl Direct3DTexture9_Vtbl = IDirect3DTexture9Impl_AddDirtyRect }; +static void STDMETHODCALLTYPE d3d9_texture_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} -/* IDirect3DDevice9 IDirect3DTexture9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateTexture(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height, UINT Levels, DWORD Usage, - D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, HANDLE* pSharedHandle) { - IDirect3DTexture9Impl *object; - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hrc = D3D_OK; +static const struct wined3d_parent_ops d3d9_texture_wined3d_parent_ops = +{ + d3d9_texture_wined3d_object_destroyed, +}; - TRACE("(%p) : W(%d) H(%d), Lvl(%d) d(%d), Fmt(%#x), Pool(%d)\n", This, Width, Height, Levels, Usage, Format, Pool); +HRESULT texture_init(IDirect3DTexture9Impl *texture, IDirect3DDevice9Impl *device, + UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTexture9Impl)); - - if (NULL == object) { - ERR("Allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n"); - return D3DERR_OUTOFVIDEOMEMORY; - } - - object->lpVtbl = &Direct3DTexture9_Vtbl; - object->ref = 1; + texture->lpVtbl = &Direct3DTexture9_Vtbl; + texture->ref = 1; wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateTexture(This->WineD3DDevice, Width, Height, Levels, Usage & WINED3DUSAGE_MASK, - wined3dformat_from_d3dformat(Format), Pool, &object->wineD3DTexture, (IUnknown *)object); + hr = IWineD3DDevice_CreateTexture(device->WineD3DDevice, width, height, levels, + usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, + &texture->wineD3DTexture, (IUnknown *)texture, &d3d9_texture_wined3d_parent_ops); wined3d_mutex_unlock(); - - if (FAILED(hrc)) + if (FAILED(hr)) { - /* free up object */ - WARN("(%p) call to IWineD3DDevice_CreateTexture failed\n", This); - HeapFree(GetProcessHeap(), 0, object); - } else { - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - *ppTexture= (LPDIRECT3DTEXTURE9) object; - TRACE("(%p) Created Texture %p, %p\n", This, object, object->wineD3DTexture); - } + WARN("Failed to create wined3d texture, hr %#x.\n", hr); + return hr; + } - return hrc; + texture->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(texture->parentDevice); + + return D3D_OK; } diff --git a/reactos/dll/directx/wine/d3d9/vertexbuffer.c b/reactos/dll/directx/wine/d3d9/vertexbuffer.c index 226e1139b81..c46f8b3f003 100644 --- a/reactos/dll/directx/wine/d3d9/vertexbuffer.c +++ b/reactos/dll/directx/wine/d3d9/vertexbuffer.c @@ -48,6 +48,14 @@ static ULONG WINAPI IDirect3DVertexBuffer9Impl_AddRef(LPDIRECT3DVERTEXBUFFER9 if TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IDirect3DDevice9Ex_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DBuffer_AddRef(This->wineD3DVertexBuffer); + wined3d_mutex_unlock(); + } + return ref; } @@ -58,12 +66,10 @@ static ULONG WINAPI IDirect3DVertexBuffer9Impl_Release(LPDIRECT3DVERTEXBUFFER9 i TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { + IDirect3DDevice9Ex_Release(This->parentDevice); wined3d_mutex_lock(); IWineD3DBuffer_Release(This->wineD3DVertexBuffer); wined3d_mutex_unlock(); - - IDirect3DDevice9Ex_Release(This->parentDevice); - HeapFree(GetProcessHeap(), 0, This); } return ref; } @@ -233,41 +239,38 @@ static const IDirect3DVertexBuffer9Vtbl Direct3DVertexBuffer9_Vtbl = IDirect3DVertexBuffer9Impl_GetDesc }; - -/* IDirect3DDevice9 IDirect3DVertexBuffer9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexBuffer(IDirect3DDevice9Ex *iface, UINT Size, DWORD Usage, - DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle) +static void STDMETHODCALLTYPE d3d9_vertexbuffer_wined3d_object_destroyed(void *parent) { - IDirect3DVertexBuffer9Impl *object; - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hrc = D3D_OK; + HeapFree(GetProcessHeap(), 0, parent); +} - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVertexBuffer9Impl)); - if (NULL == object) { - FIXME("Allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n"); - return D3DERR_OUTOFVIDEOMEMORY; - } +static const struct wined3d_parent_ops d3d9_vertexbuffer_wined3d_parent_ops = +{ + d3d9_vertexbuffer_wined3d_object_destroyed, +}; - object->lpVtbl = &Direct3DVertexBuffer9_Vtbl; - object->ref = 1; - object->fvf = FVF; +HRESULT vertexbuffer_init(IDirect3DVertexBuffer9Impl *buffer, IDirect3DDevice9Impl *device, + UINT size, UINT usage, DWORD fvf, D3DPOOL pool) +{ + HRESULT hr; + + buffer->lpVtbl = &Direct3DVertexBuffer9_Vtbl; + buffer->ref = 1; + buffer->fvf = fvf; wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage & WINED3DUSAGE_MASK, - 0 /* fvf for ddraw only */, (WINED3DPOOL) Pool, &(object->wineD3DVertexBuffer), (IUnknown *)object); + hr = IWineD3DDevice_CreateVertexBuffer(device->WineD3DDevice, size, + usage & WINED3DUSAGE_MASK, 0, (WINED3DPOOL)pool, &buffer->wineD3DVertexBuffer, + (IUnknown *)buffer, &d3d9_vertexbuffer_wined3d_parent_ops); wined3d_mutex_unlock(); - - if (hrc != D3D_OK) { - - /* free up object */ - WARN("(%p) call to IWineD3DDevice_CreateVertexBuffer failed\n", This); - HeapFree(GetProcessHeap(), 0, object); - } else { - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - TRACE("(%p) : Created vertex buffer %p\n", This, object); - *ppVertexBuffer = (LPDIRECT3DVERTEXBUFFER9) object; + if (FAILED(hr)) + { + WARN("Failed to create wined3d buffer, hr %#x.\n", hr); + return hr; } - return hrc; + + buffer->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(buffer->parentDevice); + + return D3D_OK; } diff --git a/reactos/dll/directx/wine/d3d9/vertexdeclaration.c b/reactos/dll/directx/wine/d3d9/vertexdeclaration.c index 4ae475194de..1234bffbe10 100644 --- a/reactos/dll/directx/wine/d3d9/vertexdeclaration.c +++ b/reactos/dll/directx/wine/d3d9/vertexdeclaration.c @@ -36,7 +36,7 @@ static D3DDECLTYPE_INFO const d3d_dtype_lookup[D3DDECLTYPE_UNUSED] = { {D3DDECLTYPE_FLOAT2, WINED3DFMT_R32G32_FLOAT, 2, sizeof(float)}, {D3DDECLTYPE_FLOAT3, WINED3DFMT_R32G32B32_FLOAT, 3, sizeof(float)}, {D3DDECLTYPE_FLOAT4, WINED3DFMT_R32G32B32A32_FLOAT, 4, sizeof(float)}, - {D3DDECLTYPE_D3DCOLOR, WINED3DFMT_A8R8G8B8, 4, sizeof(BYTE)}, + {D3DDECLTYPE_D3DCOLOR, WINED3DFMT_B8G8R8A8_UNORM, 4, sizeof(BYTE)}, {D3DDECLTYPE_UBYTE4, WINED3DFMT_R8G8B8A8_UINT, 4, sizeof(BYTE)}, {D3DDECLTYPE_SHORT2, WINED3DFMT_R16G16_SINT, 2, sizeof(short int)}, {D3DDECLTYPE_SHORT4, WINED3DFMT_R16G16B16A16_SINT, 4, sizeof(short int)}, @@ -217,6 +217,12 @@ static ULONG WINAPI IDirect3DVertexDeclaration9Impl_AddRef(LPDIRECT3DVERTEXDECLA if(ref == 1) { IDirect3DDevice9Ex_AddRef(This->parentDevice); + if (!This->convFVF) + { + wined3d_mutex_lock(); + IWineD3DVertexDeclaration_AddRef(This->wineD3DVertexDeclaration); + wined3d_mutex_unlock(); + } } return ref; @@ -233,9 +239,6 @@ void IDirect3DVertexDeclaration9Impl_Destroy(LPDIRECT3DVERTEXDECLARATION9 iface) wined3d_mutex_lock(); IWineD3DVertexDeclaration_Release(This->wineD3DVertexDeclaration); wined3d_mutex_unlock(); - - HeapFree(GetProcessHeap(), 0, This->elements); - HeapFree(GetProcessHeap(), 0, This); } static ULONG WINAPI IDirect3DVertexDeclaration9Impl_Release(LPDIRECT3DVERTEXDECLARATION9 iface) { @@ -245,12 +248,10 @@ static ULONG WINAPI IDirect3DVertexDeclaration9Impl_Release(LPDIRECT3DVERTEXDECL TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { - IDirect3DDevice9Ex *parentDevice = This->parentDevice; - + IDirect3DDevice9Ex_Release(This->parentDevice); if(!This->convFVF) { - IDirect3DVertexDeclaration9Impl_Release(iface); + IDirect3DVertexDeclaration9Impl_Destroy(iface); } - IDirect3DDevice9Ex_Release(parentDevice); } return ref; } @@ -304,6 +305,18 @@ static const IDirect3DVertexDeclaration9Vtbl Direct3DVertexDeclaration9_Vtbl = IDirect3DVertexDeclaration9Impl_GetDeclaration }; +static void STDMETHODCALLTYPE d3d9_vertexdeclaration_wined3d_object_destroyed(void *parent) +{ + IDirect3DVertexDeclaration9Impl *declaration = parent; + HeapFree(GetProcessHeap(), 0, declaration->elements); + HeapFree(GetProcessHeap(), 0, declaration); +} + +static const struct wined3d_parent_ops d3d9_vertexdeclaration_wined3d_parent_ops = +{ + d3d9_vertexdeclaration_wined3d_object_destroyed, +}; + static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9* d3d9_elements, WINED3DVERTEXELEMENT **wined3d_elements, UINT *element_count) { @@ -349,72 +362,51 @@ static HRESULT convert_to_wined3d_declaration(const D3DVERTEXELEMENT9* d3d9_elem return D3D_OK; } -/* IDirect3DDevice9 IDirect3DVertexDeclaration9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexDeclaration(IDirect3DDevice9Ex *iface, - const D3DVERTEXELEMENT9 *pVertexElements, IDirect3DVertexDeclaration9 **ppDecl) +HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declaration, + IDirect3DDevice9Impl *device, const D3DVERTEXELEMENT9 *elements) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - IDirect3DVertexDeclaration9Impl *object = NULL; - WINED3DVERTEXELEMENT* wined3d_elements; + WINED3DVERTEXELEMENT *wined3d_elements; UINT wined3d_element_count; UINT element_count; HRESULT hr; - TRACE("(%p) : Relay\n", iface); - if (NULL == ppDecl) { - WARN("(%p) : Caller passed NULL As ppDecl, returning D3DERR_INVALIDCALL\n",This); - return D3DERR_INVALIDCALL; - } - - hr = convert_to_wined3d_declaration(pVertexElements, &wined3d_elements, &wined3d_element_count); + hr = convert_to_wined3d_declaration(elements, &wined3d_elements, &wined3d_element_count); if (FAILED(hr)) { - WARN("(%p) : Error parsing vertex declaration\n", This); + WARN("Failed to create wined3d vertex declaration elements, hr %#x.\n", hr); return hr; } - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVertexDeclaration9Impl)); - if (NULL == object) { - HeapFree(GetProcessHeap(), 0, wined3d_elements); - FIXME("Allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n"); - return D3DERR_OUTOFVIDEOMEMORY; - } - - object->lpVtbl = &Direct3DVertexDeclaration9_Vtbl; - object->ref = 0; + declaration->lpVtbl = &Direct3DVertexDeclaration9_Vtbl; + declaration->ref = 1; element_count = wined3d_element_count + 1; - object->elements = HeapAlloc(GetProcessHeap(), 0, element_count * sizeof(D3DVERTEXELEMENT9)); - if (!object->elements) { + declaration->elements = HeapAlloc(GetProcessHeap(), 0, element_count * sizeof(*declaration->elements)); + if (!declaration->elements) + { HeapFree(GetProcessHeap(), 0, wined3d_elements); - HeapFree(GetProcessHeap(), 0, object); - ERR("Memory allocation failed\n"); + ERR("Failed to allocate vertex declaration elements memory.\n"); return D3DERR_OUTOFVIDEOMEMORY; } - CopyMemory(object->elements, pVertexElements, element_count * sizeof(D3DVERTEXELEMENT9)); - object->element_count = element_count; + memcpy(declaration->elements, elements, element_count * sizeof(*elements)); + declaration->element_count = element_count; wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateVertexDeclaration(This->WineD3DDevice, &object->wineD3DVertexDeclaration, - (IUnknown *)object, wined3d_elements, wined3d_element_count); + hr = IWineD3DDevice_CreateVertexDeclaration(device->WineD3DDevice, &declaration->wineD3DVertexDeclaration, + (IUnknown *)declaration, &d3d9_vertexdeclaration_wined3d_parent_ops, + wined3d_elements, wined3d_element_count); wined3d_mutex_unlock(); - HeapFree(GetProcessHeap(), 0, wined3d_elements); - - if (FAILED(hr)) { - - /* free up object */ - WARN("(%p) call to IWineD3DDevice_CreateVertexDeclaration failed\n", This); - HeapFree(GetProcessHeap(), 0, object->elements); - HeapFree(GetProcessHeap(), 0, object); - } else { - object->parentDevice = iface; - *ppDecl = (LPDIRECT3DVERTEXDECLARATION9) object; - IDirect3DVertexDeclaration9_AddRef(*ppDecl); - TRACE("(%p) : Created vertex declaration %p\n", This, object); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex declaration, hr %#x.\n", hr); + return hr; } - return hr; + + declaration->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(declaration->parentDevice); + + return D3D_OK; } HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexDeclaration9* pDecl) { diff --git a/reactos/dll/directx/wine/d3d9/vertexshader.c b/reactos/dll/directx/wine/d3d9/vertexshader.c index 8a5d5bc3e22..8b775dedfb0 100644 --- a/reactos/dll/directx/wine/d3d9/vertexshader.c +++ b/reactos/dll/directx/wine/d3d9/vertexshader.c @@ -46,6 +46,14 @@ static ULONG WINAPI IDirect3DVertexShader9Impl_AddRef(LPDIRECT3DVERTEXSHADER9 if TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IDirect3DDevice9Ex_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DVertexShader_AddRef(This->wineD3DVertexShader); + wined3d_mutex_unlock(); + } + return ref; } @@ -56,12 +64,10 @@ static ULONG WINAPI IDirect3DVertexShader9Impl_Release(LPDIRECT3DVERTEXSHADER9 i TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { + IDirect3DDevice9Ex_Release(This->parentDevice); wined3d_mutex_lock(); IWineD3DVertexShader_Release(This->wineD3DVertexShader); wined3d_mutex_unlock(); - - IDirect3DDevice9Ex_Release(This->parentDevice); - HeapFree(GetProcessHeap(), 0, This); } return ref; } @@ -111,43 +117,38 @@ static const IDirect3DVertexShader9Vtbl Direct3DVertexShader9_Vtbl = IDirect3DVertexShader9Impl_GetFunction }; +static void STDMETHODCALLTYPE d3d9_vertexshader_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} -/* IDirect3DDevice9 IDirect3DVertexShader9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateVertexShader(LPDIRECT3DDEVICE9EX iface, CONST DWORD* pFunction, IDirect3DVertexShader9** ppShader) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hrc = D3D_OK; - IDirect3DVertexShader9Impl *object; +static const struct wined3d_parent_ops d3d9_vertexshader_wined3d_parent_ops = +{ + d3d9_vertexshader_wined3d_object_destroyed, +}; - /* Setup a stub object for now */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - TRACE("(%p) : pFunction(%p), ppShader(%p)\n", This, pFunction, ppShader); - if (NULL == object) { - FIXME("Allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n"); - return D3DERR_OUTOFVIDEOMEMORY; - } +HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader, IDirect3DDevice9Impl *device, const DWORD *byte_code) +{ + HRESULT hr; - object->ref = 1; - object->lpVtbl = &Direct3DVertexShader9_Vtbl; + shader->ref = 1; + shader->lpVtbl = &Direct3DVertexShader9_Vtbl; wined3d_mutex_lock(); - hrc= IWineD3DDevice_CreateVertexShader(This->WineD3DDevice, pFunction, - NULL /* output signature */, &object->wineD3DVertexShader, (IUnknown *)object); + hr = IWineD3DDevice_CreateVertexShader(device->WineD3DDevice, byte_code, + NULL /* output signature */, &shader->wineD3DVertexShader, + (IUnknown *)shader, &d3d9_vertexshader_wined3d_parent_ops); wined3d_mutex_unlock(); - - if (FAILED(hrc)) { - - /* free up object */ - FIXME("Call to IWineD3DDevice_CreateVertexShader failed\n"); - HeapFree(GetProcessHeap(), 0, object); - }else{ - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - *ppShader = (IDirect3DVertexShader9 *)object; - TRACE("(%p) : Created vertex shader %p\n", This, object); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex shader, hr %#x.\n", hr); + return hr; } - TRACE("(%p) : returning %p\n", This, *ppShader); - return hrc; + shader->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(shader->parentDevice); + + return D3D_OK; } HRESULT WINAPI IDirect3DDevice9Impl_SetVertexShader(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexShader9* pShader) { diff --git a/reactos/dll/directx/wine/d3d9/volume.c b/reactos/dll/directx/wine/d3d9/volume.c index 9f1252a15fe..9dbb313695c 100644 --- a/reactos/dll/directx/wine/d3d9/volume.c +++ b/reactos/dll/directx/wine/d3d9/volume.c @@ -53,6 +53,14 @@ static ULONG WINAPI IDirect3DVolume9Impl_AddRef(LPDIRECT3DVOLUME9 iface) { /* No container, handle our own refcounting */ ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) : AddRef from %d\n", This, ref - 1); + + if (ref == 1) + { + wined3d_mutex_lock(); + IWineD3DVolume_AddRef(This->wineD3DVolume); + wined3d_mutex_unlock(); + } + return ref; } } @@ -75,8 +83,6 @@ static ULONG WINAPI IDirect3DVolume9Impl_Release(LPDIRECT3DVOLUME9 iface) { wined3d_mutex_lock(); IWineD3DVolume_Release(This->wineD3DVolume); wined3d_mutex_unlock(); - - HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -223,7 +229,7 @@ static HRESULT WINAPI IDirect3DVolume9Impl_UnlockBox(LPDIRECT3DVOLUME9 iface) { return hr; } -const IDirect3DVolume9Vtbl Direct3DVolume9_Vtbl = +static const IDirect3DVolume9Vtbl Direct3DVolume9_Vtbl = { /* IUnknown */ IDirect3DVolume9Impl_QueryInterface, @@ -240,12 +246,31 @@ const IDirect3DVolume9Vtbl Direct3DVolume9_Vtbl = IDirect3DVolume9Impl_UnlockBox }; -ULONG WINAPI D3D9CB_DestroyVolume(IWineD3DVolume *pVolume) { - IDirect3DVolume9Impl* volumeParent; - - IWineD3DVolume_GetParent(pVolume, (IUnknown **) &volumeParent); - /* GetParent's AddRef was forwarded to an object in destruction. - * Releasing it here again would cause an endless recursion. */ - volumeParent->forwardReference = NULL; - return IDirect3DVolume9_Release((IDirect3DVolume9*) volumeParent); +static void STDMETHODCALLTYPE volume_wined3d_object_destroyed(void *parent) +{ + HeapFree(GetProcessHeap(), 0, parent); +} + +static const struct wined3d_parent_ops d3d9_volume_wined3d_parent_ops = +{ + volume_wined3d_object_destroyed, +}; + +HRESULT volume_init(IDirect3DVolume9Impl *volume, IDirect3DDevice9Impl *device, UINT width, UINT height, + UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool) +{ + HRESULT hr; + + volume->lpVtbl = &Direct3DVolume9_Vtbl; + volume->ref = 1; + + hr = IWineD3DDevice_CreateVolume(device->WineD3DDevice, width, height, depth, usage & WINED3DUSAGE_MASK, + format, pool, &volume->wineD3DVolume, (IUnknown *)volume, &d3d9_volume_wined3d_parent_ops); + if (FAILED(hr)) + { + WARN("Failed to create wined3d volume, hr %#x.\n", hr); + return hr; + } + + return D3D_OK; } diff --git a/reactos/dll/directx/wine/d3d9/volumetexture.c b/reactos/dll/directx/wine/d3d9/volumetexture.c index 31b90bce62e..3adab632813 100644 --- a/reactos/dll/directx/wine/d3d9/volumetexture.c +++ b/reactos/dll/directx/wine/d3d9/volumetexture.c @@ -48,6 +48,14 @@ static ULONG WINAPI IDirect3DVolumeTexture9Impl_AddRef(LPDIRECT3DVOLUMETEXTURE9 TRACE("(%p) : AddRef from %d\n", This, ref - 1); + if (ref == 1) + { + IDirect3DDevice9Ex_AddRef(This->parentDevice); + wined3d_mutex_lock(); + IWineD3DVolumeTexture_AddRef(This->wineD3DVolumeTexture); + wined3d_mutex_unlock(); + } + return ref; } @@ -58,12 +66,10 @@ static ULONG WINAPI IDirect3DVolumeTexture9Impl_Release(LPDIRECT3DVOLUMETEXTURE9 TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { - wined3d_mutex_lock(); - IWineD3DVolumeTexture_Destroy(This->wineD3DVolumeTexture, D3D9CB_DestroyVolume); - wined3d_mutex_unlock(); - IDirect3DDevice9Ex_Release(This->parentDevice); - HeapFree(GetProcessHeap(), 0, This); + wined3d_mutex_lock(); + IWineD3DVolumeTexture_Release(This->wineD3DVolumeTexture); + wined3d_mutex_unlock(); } return ref; } @@ -403,47 +409,37 @@ static const IDirect3DVolumeTexture9Vtbl Direct3DVolumeTexture9_Vtbl = IDirect3DVolumeTexture9Impl_AddDirtyBox }; - -/* IDirect3DDevice9 IDirect3DVolumeTexture9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateVolumeTexture(IDirect3DDevice9Ex *iface, - UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, - D3DPOOL Pool, IDirect3DVolumeTexture9 **ppVolumeTexture, HANDLE *pSharedHandle) +static void STDMETHODCALLTYPE volumetexture_wined3d_object_destroyed(void *parent) { - IDirect3DVolumeTexture9Impl *object; - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - HRESULT hrc = D3D_OK; + HeapFree(GetProcessHeap(), 0, parent); +} - TRACE("(%p) Relay\n", This); +static const struct wined3d_parent_ops d3d9_volumetexture_wined3d_parent_ops = +{ + volumetexture_wined3d_object_destroyed, +}; - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVolumeTexture9Impl)); - if (NULL == object) { - ERR("(%p) allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n", This); - return D3DERR_OUTOFVIDEOMEMORY; - } +HRESULT volumetexture_init(IDirect3DVolumeTexture9Impl *texture, IDirect3DDevice9Impl *device, + UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool) +{ + HRESULT hr; - object->lpVtbl = &Direct3DVolumeTexture9_Vtbl; - object->ref = 1; + texture->lpVtbl = &Direct3DVolumeTexture9_Vtbl; + texture->ref = 1; wined3d_mutex_lock(); - - hrc = IWineD3DDevice_CreateVolumeTexture(This->WineD3DDevice, Width, Height, Depth, Levels, - Usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(Format), - Pool, &object->wineD3DVolumeTexture, (IUnknown *)object); - + hr = IWineD3DDevice_CreateVolumeTexture(device->WineD3DDevice, width, height, depth, levels, + usage & WINED3DUSAGE_MASK, wined3dformat_from_d3dformat(format), pool, + &texture->wineD3DVolumeTexture, (IUnknown *)texture, &d3d9_volumetexture_wined3d_parent_ops); wined3d_mutex_unlock(); - - if (hrc != D3D_OK) { - - /* free up object */ - WARN("(%p) call to IWineD3DDevice_CreateVolumeTexture failed\n", This); - HeapFree(GetProcessHeap(), 0, object); - } else { - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - *ppVolumeTexture = (LPDIRECT3DVOLUMETEXTURE9) object; - TRACE("(%p) : Created volume texture %p\n", This, object); + if (FAILED(hr)) + { + WARN("Failed to create wined3d volume texture, hr %#x.\n", hr); + return hr; } - TRACE("(%p) returning %p\n", This , *ppVolumeTexture); - return hrc; + + texture->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(texture->parentDevice); + + return D3D_OK; } diff --git a/reactos/dll/directx/wine/ddraw/ddraw.c b/reactos/dll/directx/wine/ddraw/ddraw.c index 0d1b6dda237..ff04a50a771 100644 --- a/reactos/dll/directx/wine/ddraw/ddraw.c +++ b/reactos/dll/directx/wine/ddraw/ddraw.c @@ -62,6 +62,13 @@ static const DDDEVICEIDENTIFIER2 deviceidentifier = 0 }; +static void STDMETHODCALLTYPE ddraw_null_wined3d_object_destroyed(void *parent) {} + +const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops = +{ + ddraw_null_wined3d_object_destroyed, +}; + /***************************************************************************** * IUnknown Methods *****************************************************************************/ @@ -574,11 +581,11 @@ IDirectDrawImpl_SetDisplayModeNoOverride(IDirectDraw7 *iface, Mode.RefreshRate = RefreshRate; switch(BPP) { - case 8: Mode.Format = WINED3DFMT_P8; break; - case 15: Mode.Format = WINED3DFMT_X1R5G5B5; break; - case 16: Mode.Format = WINED3DFMT_R5G6B5; break; - case 24: Mode.Format = WINED3DFMT_R8G8B8; break; - case 32: Mode.Format = WINED3DFMT_X8R8G8B8; break; + case 8: Mode.Format = WINED3DFMT_P8_UINT; break; + case 15: Mode.Format = WINED3DFMT_B5G5R5X1_UNORM; break; + case 16: Mode.Format = WINED3DFMT_B5G6R5_UNORM; break; + case 24: Mode.Format = WINED3DFMT_B8G8R8_UNORM; break; + case 32: Mode.Format = WINED3DFMT_B8G8R8X8_UNORM; break; } /* TODO: The possible return values from msdn suggest that @@ -1329,22 +1336,22 @@ IDirectDrawImpl_EnumDisplayModes(IDirectDraw7 *iface, WINED3DFORMAT checkFormatList[] = { - WINED3DFMT_R8G8B8, - WINED3DFMT_A8R8G8B8, - WINED3DFMT_X8R8G8B8, - WINED3DFMT_R5G6B5, - WINED3DFMT_X1R5G5B5, - WINED3DFMT_A1R5G5B5, - WINED3DFMT_A4R4G4B4, - WINED3DFMT_R3G3B2, - WINED3DFMT_A8R3G3B2, - WINED3DFMT_X4R4G4B4, + WINED3DFMT_B8G8R8_UNORM, + WINED3DFMT_B8G8R8A8_UNORM, + WINED3DFMT_B8G8R8X8_UNORM, + WINED3DFMT_B5G6R5_UNORM, + WINED3DFMT_B5G5R5X1_UNORM, + WINED3DFMT_B5G5R5A1_UNORM, + WINED3DFMT_B4G4R4A4_UNORM, + WINED3DFMT_B2G3R3_UNORM, + WINED3DFMT_B2G3R3A8_UNORM, + WINED3DFMT_B4G4R4X4_UNORM, WINED3DFMT_R10G10B10A2_UNORM, WINED3DFMT_R8G8B8A8_UNORM, - WINED3DFMT_X8B8G8R8, - WINED3DFMT_A2R10G10B10, - WINED3DFMT_A8P8, - WINED3DFMT_P8 + WINED3DFMT_R8G8B8X8_UNORM, + WINED3DFMT_B10G10R10A2_UNORM, + WINED3DFMT_P8_UINT_A8_UNORM, + WINED3DFMT_P8_UINT, }; TRACE("(%p)->(%p,%p,%p): Relay\n", This, DDSD, Context, cb); @@ -1655,11 +1662,9 @@ IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf, IDirectDrawSurfaceImpl *surfImpl = (IDirectDrawSurfaceImpl *)surf; IDirectDrawImpl *This = surfImpl->ddraw; IUnknown *Parent; - IParentImpl *parImpl = NULL; IWineD3DSurface *wineD3DSurface; IWineD3DSwapChain *swapchain; HRESULT hr; - void *tmp; IWineD3DClipper *clipper = NULL; WINED3DSURFACE_DESC Desc; @@ -1683,18 +1688,6 @@ IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf, swapchain = surfImpl->wineD3DSwapChain; surfImpl->wineD3DSwapChain = NULL; wineD3DSurface = surfImpl->WineD3DSurface; - IWineD3DSurface_GetParent(wineD3DSurface, &Parent); - IUnknown_Release(Parent); /* For the getParent */ - - /* Is the parent an IParent interface? */ - if(IUnknown_QueryInterface(Parent, &IID_IParent, &tmp) == S_OK) - { - /* It is a IParent interface! */ - IUnknown_Release(Parent); /* For the QueryInterface */ - parImpl = (IParentImpl *)Parent; - /* Release the reference the parent interface is holding */ - IWineD3DSurface_Release(wineD3DSurface); - } /* get the clipper */ IWineD3DSurface_GetClipper(wineD3DSurface, &clipper); @@ -1711,34 +1704,19 @@ IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf, Width = Desc.width; Height = Desc.height; - if(swapchain) { - /* If there's a swapchain, it owns the IParent interface. Create a new one for the - * new surface - */ - parImpl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*parImpl)); - parImpl->lpVtbl = &IParent_Vtbl; - parImpl->ref = 1; - - Parent = (IUnknown *) parImpl; - } + IWineD3DSurface_GetParent(wineD3DSurface, &Parent); /* Create the new surface */ hr = IWineD3DDevice_CreateSurface(This->wineD3DDevice, Width, Height, Format, - TRUE /* Lockable */, FALSE /* Discard */, surfImpl->mipmap_level, &surfImpl->WineD3DSurface, - Usage, Pool, MultiSampleType, MultiSampleQuality, This->ImplType, Parent); + TRUE /* Lockable */, FALSE /* Discard */, surfImpl->mipmap_level, &surfImpl->WineD3DSurface, Usage, Pool, + MultiSampleType, MultiSampleQuality, This->ImplType, Parent, &ddraw_null_wined3d_parent_ops); + IUnknown_Release(Parent); if(hr != D3D_OK) return hr; IWineD3DSurface_SetClipper(surfImpl->WineD3DSurface, clipper); - /* Update the IParent if it exists */ - if(parImpl) - { - parImpl->child = (IUnknown *) surfImpl->WineD3DSurface; - /* Add a reference for the IParent */ - IWineD3DSurface_AddRef(surfImpl->WineD3DSurface); - } /* TODO: Copy the surface content, except for render targets */ /* If there's a swapchain, it owns the wined3d surfaces. So Destroy @@ -1787,7 +1765,7 @@ IDirectDrawImpl_RecreateAllSurfaces(IDirectDrawImpl *This) /* Should happen almost never */ FIXME("(%p) Switching to non-opengl surfaces with d3d started. Is this a bug?\n", This); /* Shutdown d3d */ - IWineD3DDevice_Uninit3D(This->wineD3DDevice, D3D7CB_DestroyDepthStencilSurface, D3D7CB_DestroySwapChain); + IWineD3DDevice_Uninit3D(This->wineD3DDevice, D3D7CB_DestroySwapChain); } /* Contrary: D3D starting is handled by the caller, because it knows the render target */ @@ -1806,15 +1784,6 @@ ULONG WINAPI D3D7CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain) { return IUnknown_Release(swapChainParent); } -ULONG WINAPI D3D7CB_DestroyDepthStencilSurface(IWineD3DSurface *pSurface) { - IUnknown* surfaceParent; - TRACE("(%p) call back\n", pSurface); - - IWineD3DSurface_GetParent(pSurface, &surfaceParent); - IUnknown_Release(surfaceParent); - return IUnknown_Release(surfaceParent); -} - /***************************************************************************** * IDirectDrawImpl_CreateNewSurface * @@ -1841,8 +1810,6 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This, DWORD Usage = 0; WINED3DSURFTYPE ImplType = This->ImplType; WINED3DSURFACE_DESC Desc; - IUnknown *Parent; - IParentImpl *parImpl = NULL; WINED3DPOOL Pool = WINED3DPOOL_DEFAULT; if (TRACE_ON(ddraw)) @@ -1990,34 +1957,11 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This, /* A trace message for debugging */ TRACE("(%p) Created IDirectDrawSurface implementation structure at %p\n", This, *ppSurf); - if(pDDSD->ddsCaps.dwCaps & ( DDSCAPS_PRIMARYSURFACE | DDSCAPS_TEXTURE | DDSCAPS_3DDEVICE) ) - { - /* Render targets and textures need a IParent interface, - * because WineD3D will destroy them when the swapchain - * is released - */ - parImpl = HeapAlloc(GetProcessHeap(), 0, sizeof(IParentImpl)); - if(!parImpl) - { - ERR("Out of memory when allocating memory for a IParent implementation\n"); - return DDERR_OUTOFMEMORY; - } - parImpl->ref = 1; - parImpl->lpVtbl = &IParent_Vtbl; - Parent = (IUnknown *)parImpl; - TRACE("Using IParent interface %p as parent\n", parImpl); - } - else - { - /* Use the surface as parent */ - Parent = (IUnknown *)*ppSurf; - TRACE("Using Surface interface %p as parent\n", *ppSurf); - } - /* Now create the WineD3D Surface */ hr = IWineD3DDevice_CreateSurface(This->wineD3DDevice, pDDSD->dwWidth, pDDSD->dwHeight, Format, TRUE /* Lockable */, FALSE /* Discard */, level, &(*ppSurf)->WineD3DSurface, - Usage, Pool, WINED3DMULTISAMPLE_NONE, 0 /* MultiSampleQuality */, ImplType, Parent); + Usage, Pool, WINED3DMULTISAMPLE_NONE, 0 /* MultiSampleQuality */, ImplType, + (IUnknown *)*ppSurf, &ddraw_null_wined3d_parent_ops); if(hr != D3D_OK) { @@ -2025,16 +1969,6 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This, return hr; } - /* Set the child of the parent implementation if it exists */ - if(parImpl) - { - parImpl->child = (IUnknown *) (*ppSurf)->WineD3DSurface; - /* The IParent releases the WineD3DSurface, and - * the ddraw surface does that too. Hold a reference - */ - IWineD3DSurface_AddRef((*ppSurf)->WineD3DSurface); - } - /* Increase the surface counter, and attach the surface */ InterlockedIncrement(&This->surfaces); list_add_head(&This->surface_list, &(*ppSurf)->surface_list_entry); @@ -2407,23 +2341,23 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, switch(This->orig_bpp) { case 8: - Mode.Format = WINED3DFMT_P8; + Mode.Format = WINED3DFMT_P8_UINT; break; case 15: - Mode.Format = WINED3DFMT_X1R5G5B5; + Mode.Format = WINED3DFMT_B5G5R5X1_UNORM; break; case 16: - Mode.Format = WINED3DFMT_R5G6B5; + Mode.Format = WINED3DFMT_B5G6R5_UNORM; break; case 24: - Mode.Format = WINED3DFMT_R8G8B8; + Mode.Format = WINED3DFMT_B8G8R8_UNORM; break; case 32: - Mode.Format = WINED3DFMT_X8R8G8B8; + Mode.Format = WINED3DFMT_B8G8R8X8_UNORM; break; } Mode.Width = This->orig_width; @@ -2442,16 +2376,16 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, switch(desc2.u2.dwMipMapCount) /* Who had this glorious idea? */ { case 15: - PixelFormat_WineD3DtoDD(&desc2.u4.ddpfPixelFormat, WINED3DFMT_D15S1); + PixelFormat_WineD3DtoDD(&desc2.u4.ddpfPixelFormat, WINED3DFMT_S1_UINT_D15_UNORM); break; case 16: PixelFormat_WineD3DtoDD(&desc2.u4.ddpfPixelFormat, WINED3DFMT_D16_UNORM); break; case 24: - PixelFormat_WineD3DtoDD(&desc2.u4.ddpfPixelFormat, WINED3DFMT_D24X8); + PixelFormat_WineD3DtoDD(&desc2.u4.ddpfPixelFormat, WINED3DFMT_X8D24_UNORM); break; case 32: - PixelFormat_WineD3DtoDD(&desc2.u4.ddpfPixelFormat, WINED3DFMT_D32); + PixelFormat_WineD3DtoDD(&desc2.u4.ddpfPixelFormat, WINED3DFMT_D32_UNORM); break; default: ERR("Unknown Z buffer bit depth\n"); @@ -2686,13 +2620,15 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, */ if(desc2.ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP) { - hr = IWineD3DDevice_CreateCubeTexture(This->wineD3DDevice, DDSD->dwWidth /* Edgelength */, levels, - 0 /* usage */, Format, Pool, (IWineD3DCubeTexture **)&object->wineD3DTexture, (IUnknown *)object); + hr = IWineD3DDevice_CreateCubeTexture(This->wineD3DDevice, DDSD->dwWidth /* Edgelength */, + levels, 0 /* usage */, Format, Pool, (IWineD3DCubeTexture **)&object->wineD3DTexture, + (IUnknown *)object, &ddraw_null_wined3d_parent_ops); } else { hr = IWineD3DDevice_CreateTexture(This->wineD3DDevice, DDSD->dwWidth, DDSD->dwHeight, levels, - 0 /* usage */, Format, Pool, (IWineD3DTexture **)&object->wineD3DTexture, (IUnknown *)object); + 0 /* usage */, Format, Pool, (IWineD3DTexture **)&object->wineD3DTexture, + (IUnknown *)object, &ddraw_null_wined3d_parent_ops); } This->tex_root = NULL; } @@ -3032,9 +2968,7 @@ IDirectDrawImpl_AttachD3DDevice(IDirectDrawImpl *This, { ERR("Error allocating an array for the converted vertex decls\n"); This->declArraySize = 0; - hr = IWineD3DDevice_Uninit3D(This->wineD3DDevice, - D3D7CB_DestroyDepthStencilSurface, - D3D7CB_DestroySwapChain); + hr = IWineD3DDevice_Uninit3D(This->wineD3DDevice, D3D7CB_DestroySwapChain); return E_OUTOFMEMORY; } @@ -3316,7 +3250,8 @@ IDirectDrawImpl_FindDecl(IDirectDrawImpl *This, } TRACE("not found. Creating and inserting at position %d.\n", low); - hr = IWineD3DDevice_CreateVertexDeclarationFromFVF(This->wineD3DDevice, &pDecl, (IUnknown *)This, fvf); + hr = IWineD3DDevice_CreateVertexDeclarationFromFVF(This->wineD3DDevice, &pDecl, + (IUnknown *)This, &ddraw_null_wined3d_parent_ops, fvf); if (hr != S_OK) return NULL; if(This->declArraySize == This->numConvertedDecls) { @@ -3436,6 +3371,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParen /* Return the surface */ *surface = surf->WineD3DSurface; + IWineD3DSurface_AddRef(*surface); TRACE("Returning wineD3DSurface %p, it belongs to surface %p\n", *surface, surf); @@ -3472,6 +3408,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateRenderTarget(IWineD3DDevice /* TODO: Return failure if the dimensions do not match, but this shouldn't happen */ *surface = target->WineD3DSurface; + IWineD3DSurface_AddRef(*surface); target->isRenderTarget = TRUE; TRACE("Returning wineD3DSurface %p, it belongs to surface %p\n", *surface, d3d_surface); @@ -3484,7 +3421,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3 DWORD multisample_quality, BOOL discard, IWineD3DSurface **surface) { struct IDirectDrawImpl *This = ddraw_from_device_parent(iface); - /* Create a Depth Stencil surface to make WineD3D happy */ + IDirectDrawSurfaceImpl *ddraw_surface; DDSURFACEDESC2 ddsd; HRESULT hr; @@ -3512,8 +3449,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3 } This->depthstencil = TRUE; - hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)This, - &ddsd, (IDirectDrawSurface7 **)&This->DepthStencilBuffer, NULL); + hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)This, &ddsd, (IDirectDrawSurface7 **)&ddraw_surface, NULL); This->depthstencil = FALSE; if(FAILED(hr)) { @@ -3521,7 +3457,9 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3 return hr; } - *surface = This->DepthStencilBuffer->WineD3DSurface; + *surface = ddraw_surface->WineD3DSurface; + IWineD3DSurface_AddRef(*surface); + IDirectDrawSurface7_Release((IDirectDrawSurface7 *)ddraw_surface); return D3D_OK; } diff --git a/reactos/dll/directx/wine/ddraw/ddraw_private.h b/reactos/dll/directx/wine/ddraw/ddraw_private.h index cd05e16c2ed..33e17334384 100644 --- a/reactos/dll/directx/wine/ddraw/ddraw_private.h +++ b/reactos/dll/directx/wine/ddraw/ddraw_private.h @@ -39,6 +39,8 @@ #endif #include "wine/wined3d.h" +extern const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops DECLSPEC_HIDDEN; + /***************************************************************************** * IParent - a helper interface *****************************************************************************/ @@ -77,14 +79,12 @@ typedef struct IDirect3DVertexBufferImpl IDirect3DVertexBufferImpl; typedef struct IParentImpl IParentImpl; /* Callbacks for implicit object destruction */ -extern ULONG WINAPI D3D7CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain); - -extern ULONG WINAPI D3D7CB_DestroyDepthStencilSurface(IWineD3DSurface *pSurface); +extern ULONG WINAPI D3D7CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain) DECLSPEC_HIDDEN; /* Global critical section */ -extern CRITICAL_SECTION ddraw_cs; +extern CRITICAL_SECTION ddraw_cs DECLSPEC_HIDDEN; -extern DWORD force_refresh_rate; +extern DWORD force_refresh_rate DECLSPEC_HIDDEN; /***************************************************************************** * IDirectDraw implementation structure @@ -114,7 +114,6 @@ struct IDirectDrawImpl /* WineD3D linkage */ IWineD3D *wineD3D; IWineD3DDevice *wineD3DDevice; - IDirectDrawSurfaceImpl *DepthStencilBuffer; BOOL d3d_initialized; /* Misc ddraw fields */ @@ -166,11 +165,11 @@ struct IDirectDrawImpl }; /* Declare the VTables. They can be found ddraw.c */ -extern const IDirectDraw7Vtbl IDirectDraw7_Vtbl; -extern const IDirectDraw4Vtbl IDirectDraw4_Vtbl; -extern const IDirectDraw2Vtbl IDirectDraw2_Vtbl; -extern const IDirectDrawVtbl IDirectDraw1_Vtbl; -extern const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl; +extern const IDirectDraw7Vtbl IDirectDraw7_Vtbl DECLSPEC_HIDDEN; +extern const IDirectDraw4Vtbl IDirectDraw4_Vtbl DECLSPEC_HIDDEN; +extern const IDirectDraw2Vtbl IDirectDraw2_Vtbl DECLSPEC_HIDDEN; +extern const IDirectDrawVtbl IDirectDraw1_Vtbl DECLSPEC_HIDDEN; +extern const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl DECLSPEC_HIDDEN; /* Helper structures */ typedef struct EnumDisplayModesCBS @@ -188,22 +187,12 @@ typedef struct EnumSurfacesCBS } 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); -IWineD3DVertexDeclaration * -IDirectDrawImpl_FindDecl(IDirectDrawImpl *This, - DWORD fvf); +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; +void IDirectDrawImpl_Destroy(IDirectDrawImpl *This) DECLSPEC_HIDDEN; +HRESULT WINAPI IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf, + DDSURFACEDESC2 *desc, void *Context) DECLSPEC_HIDDEN; +IWineD3DVertexDeclaration *IDirectDrawImpl_FindDecl(IDirectDrawImpl *This, DWORD fvf) DECLSPEC_HIDDEN; static inline IDirectDrawImpl *ddraw_from_d3d1(IDirect3D *iface) { @@ -241,7 +230,7 @@ static inline IDirectDrawImpl *ddraw_from_ddraw4(IDirectDraw4 *iface) } /* The default surface type */ -extern WINED3DSURFTYPE DefaultSurfaceType; +extern WINED3DSURFTYPE DefaultSurfaceType DECLSPEC_HIDDEN; /***************************************************************************** * IDirectDrawSurface implementation structure @@ -304,14 +293,15 @@ struct IDirectDrawSurfaceImpl }; /* VTable declaration. It's located in surface.c / surface_thunks.c */ -extern const IDirectDrawSurface7Vtbl IDirectDrawSurface7_Vtbl; -extern const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl; -extern const IDirectDrawGammaControlVtbl IDirectDrawGammaControl_Vtbl; -extern const IDirect3DTexture2Vtbl IDirect3DTexture2_Vtbl; -extern const IDirect3DTextureVtbl IDirect3DTexture1_Vtbl; +extern const IDirectDrawSurface7Vtbl IDirectDrawSurface7_Vtbl DECLSPEC_HIDDEN; +extern const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl DECLSPEC_HIDDEN; +extern const IDirectDrawGammaControlVtbl IDirectDrawGammaControl_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3DTexture2Vtbl IDirect3DTexture2_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3DTextureVtbl IDirect3DTexture1_Vtbl DECLSPEC_HIDDEN; -HRESULT WINAPI IDirectDrawSurfaceImpl_AddAttachedSurface(IDirectDrawSurfaceImpl *This, IDirectDrawSurfaceImpl *Surf); -void IDirectDrawSurfaceImpl_Destroy(IDirectDrawSurfaceImpl *This); +HRESULT WINAPI IDirectDrawSurfaceImpl_AddAttachedSurface(IDirectDrawSurfaceImpl *This, + IDirectDrawSurfaceImpl *Surf) DECLSPEC_HIDDEN; +void IDirectDrawSurfaceImpl_Destroy(IDirectDrawSurfaceImpl *This) DECLSPEC_HIDDEN; static inline IDirectDrawSurfaceImpl *surface_from_texture1(IDirect3DTexture *iface) { @@ -346,7 +336,7 @@ struct IParentImpl }; -extern const IParentVtbl IParent_Vtbl; +extern const IParentVtbl IParent_Vtbl DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DDevice implementation @@ -409,19 +399,19 @@ struct IDirect3DDeviceImpl }; /* Vtables in various versions */ -extern const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUSetup_Vtbl; -extern const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUPreserve_Vtbl; -extern const IDirect3DDevice3Vtbl IDirect3DDevice3_Vtbl; -extern const IDirect3DDevice2Vtbl IDirect3DDevice2_Vtbl; -extern const IDirect3DDeviceVtbl IDirect3DDevice1_Vtbl; +extern const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUSetup_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUPreserve_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3DDevice3Vtbl IDirect3DDevice3_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3DDevice2Vtbl IDirect3DDevice2_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3DDeviceVtbl IDirect3DDevice1_Vtbl DECLSPEC_HIDDEN; /* The IID */ -extern const GUID IID_D3DDEVICE_WineD3D; +extern const GUID IID_D3DDEVICE_WineD3D DECLSPEC_HIDDEN; /* Helper functions */ -HRESULT IDirect3DImpl_GetCaps(IWineD3D *WineD3D, D3DDEVICEDESC *Desc123, D3DDEVICEDESC7 *Desc7); -DWORD IDirect3DDeviceImpl_CreateHandle(IDirect3DDeviceImpl *This); -WINED3DZBUFFERTYPE IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DDeviceImpl *This); +HRESULT IDirect3DImpl_GetCaps(IWineD3D *WineD3D, D3DDEVICEDESC *Desc123, D3DDEVICEDESC7 *Desc7) DECLSPEC_HIDDEN; +DWORD IDirect3DDeviceImpl_CreateHandle(IDirect3DDeviceImpl *This) DECLSPEC_HIDDEN; +WINED3DZBUFFERTYPE IDirect3DDeviceImpl_UpdateDepthStencil(IDirect3DDeviceImpl *This) DECLSPEC_HIDDEN; static inline IDirect3DDeviceImpl *device_from_device1(IDirect3DDevice *iface) { @@ -453,10 +443,10 @@ struct EnumTextureFormatsCBS /* No implementation structure as this is only another interface to DirectDraw */ /* the Vtables */ -extern const IDirect3DVtbl IDirect3D1_Vtbl; -extern const IDirect3D2Vtbl IDirect3D2_Vtbl; -extern const IDirect3D3Vtbl IDirect3D3_Vtbl; -extern const IDirect3D7Vtbl IDirect3D7_Vtbl; +extern const IDirect3DVtbl IDirect3D1_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3D2Vtbl IDirect3D2_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3D3Vtbl IDirect3D3_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3D7Vtbl IDirect3D7_Vtbl DECLSPEC_HIDDEN; /* Structure for EnumZBufferFormats */ struct EnumZBufferFormatsData @@ -478,9 +468,9 @@ struct IDirectDrawClipperImpl IDirectDrawImpl *ddraw_owner; }; -extern const IDirectDrawClipperVtbl IDirectDrawClipper_Vtbl; +extern const IDirectDrawClipperVtbl IDirectDrawClipper_Vtbl DECLSPEC_HIDDEN; -typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper; +typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper DECLSPEC_HIDDEN; /***************************************************************************** * IDirectDrawPalette implementation structure @@ -498,7 +488,7 @@ struct IDirectDrawPaletteImpl IDirectDrawImpl *ddraw_owner; IUnknown *ifaceToRelease; }; -extern const IDirectDrawPaletteVtbl IDirectDrawPalette_Vtbl; +extern const IDirectDrawPaletteVtbl IDirectDrawPalette_Vtbl DECLSPEC_HIDDEN; /****************************************************************************** * DirectDraw ClassFactory implementation - incomplete @@ -548,12 +538,12 @@ struct IDirect3DLightImpl }; /* Vtable */ -extern const IDirect3DLightVtbl IDirect3DLight_Vtbl; +extern const IDirect3DLightVtbl IDirect3DLight_Vtbl DECLSPEC_HIDDEN; /* Helper functions */ -void light_update(IDirect3DLightImpl* This); -void light_activate(IDirect3DLightImpl* This); -void light_desactivate(IDirect3DLightImpl* This); +void light_update(IDirect3DLightImpl *This) DECLSPEC_HIDDEN; +void light_activate(IDirect3DLightImpl *This) DECLSPEC_HIDDEN; +void light_desactivate(IDirect3DLightImpl *This) DECLSPEC_HIDDEN; /****************************************************************************** * IDirect3DMaterial implementation structure - Wraps to D3D7 @@ -576,12 +566,12 @@ struct IDirect3DMaterialImpl }; /* VTables in various versions */ -extern const IDirect3DMaterialVtbl IDirect3DMaterial_Vtbl; -extern const IDirect3DMaterial2Vtbl IDirect3DMaterial2_Vtbl; -extern const IDirect3DMaterial3Vtbl IDirect3DMaterial3_Vtbl; +extern const IDirect3DMaterialVtbl IDirect3DMaterial_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3DMaterial2Vtbl IDirect3DMaterial2_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3DMaterial3Vtbl IDirect3DMaterial3_Vtbl DECLSPEC_HIDDEN; /* Helper functions */ -void material_activate(IDirect3DMaterialImpl* This); +void material_activate(IDirect3DMaterialImpl* This) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DViewport - Wraps to D3D7 @@ -622,10 +612,10 @@ struct IDirect3DViewportImpl }; /* Vtable */ -extern const IDirect3DViewport3Vtbl IDirect3DViewport3_Vtbl; +extern const IDirect3DViewport3Vtbl IDirect3DViewport3_Vtbl DECLSPEC_HIDDEN; /* Helper functions */ -void viewport_activate(IDirect3DViewportImpl* This, BOOL ignore_lights); +void viewport_activate(IDirect3DViewportImpl* This, BOOL ignore_lights) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DExecuteBuffer - Wraps to D3D7 @@ -655,13 +645,11 @@ struct IDirect3DExecuteBufferImpl }; /* The VTable */ -extern const IDirect3DExecuteBufferVtbl IDirect3DExecuteBuffer_Vtbl; +extern const IDirect3DExecuteBufferVtbl IDirect3DExecuteBuffer_Vtbl DECLSPEC_HIDDEN; /* The execute function */ -void -IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, - IDirect3DDeviceImpl *Device, - IDirect3DViewportImpl *ViewportImpl); +void IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, + IDirect3DDeviceImpl *Device, IDirect3DViewportImpl *ViewportImpl) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DVertexBuffer @@ -684,8 +672,8 @@ struct IDirect3DVertexBufferImpl }; /* The Vtables */ -extern const IDirect3DVertexBuffer7Vtbl IDirect3DVertexBuffer7_Vtbl; -extern const IDirect3DVertexBufferVtbl IDirect3DVertexBuffer1_Vtbl; +extern const IDirect3DVertexBuffer7Vtbl IDirect3DVertexBuffer7_Vtbl DECLSPEC_HIDDEN; +extern const IDirect3DVertexBufferVtbl IDirect3DVertexBuffer1_Vtbl DECLSPEC_HIDDEN; static inline IDirect3DVertexBufferImpl *vb_from_vb1(IDirect3DVertexBuffer *iface) { @@ -703,23 +691,23 @@ static inline IDirect3DVertexBufferImpl *vb_from_vb1(IDirect3DVertexBuffer *ifac #define GET_TEXCOORD_SIZE_FROM_FVF(d3dvtVertexType, tex_num) \ (((((d3dvtVertexType) >> (16 + (2 * (tex_num)))) + 1) & 0x03) + 1) -void PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, WINED3DFORMAT WineD3DFormat); -WINED3DFORMAT PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat); -void DDRAW_dump_surface_desc(const DDSURFACEDESC2 *lpddsd); -void dump_D3DMATRIX(const D3DMATRIX *mat); -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); +void PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, WINED3DFORMAT WineD3DFormat) DECLSPEC_HIDDEN; +WINED3DFORMAT PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) DECLSPEC_HIDDEN; +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; /* This only needs to be here as long the processvertices functionality of * IDirect3DExecuteBuffer isn't in WineD3D */ -void multiply_matrix(LPD3DMATRIX dest, const D3DMATRIX *src1, const D3DMATRIX *src2); +void multiply_matrix(LPD3DMATRIX dest, const D3DMATRIX *src1, const D3DMATRIX *src2) DECLSPEC_HIDDEN; -void multiply_matrix_D3D_way(LPD3DMATRIX result, const D3DMATRIX *m1, const D3DMATRIX *m2); +void multiply_matrix_D3D_way(LPD3DMATRIX result, const D3DMATRIX *m1, const D3DMATRIX *m2) DECLSPEC_HIDDEN; /* Helper function in main.c */ -BOOL LoadWineD3D(void); +BOOL LoadWineD3D(void) DECLSPEC_HIDDEN; /* Used for generic dumping */ typedef struct @@ -759,4 +747,4 @@ typedef struct #endif -HRESULT hr_ddraw_from_wined3d(HRESULT hr); +HRESULT hr_ddraw_from_wined3d(HRESULT hr) DECLSPEC_HIDDEN; diff --git a/reactos/dll/directx/wine/ddraw/device.c b/reactos/dll/directx/wine/ddraw/device.c index 09bc3e64391..8cf8b30a5a0 100644 --- a/reactos/dll/directx/wine/ddraw/device.c +++ b/reactos/dll/directx/wine/ddraw/device.c @@ -316,7 +316,7 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface) EnterCriticalSection(&ddraw_cs); /* Free the index buffer. */ - IWineD3DDevice_SetIndices(This->wineD3DDevice, NULL, WINED3DFMT_UNKNOWN); + IWineD3DDevice_SetIndexBuffer(This->wineD3DDevice, NULL, WINED3DFMT_UNKNOWN); IWineD3DBuffer_GetParent(This->indexbuffer, (IUnknown **) &IndexBufferParent); IParent_Release(IndexBufferParent); /* Once for the getParent */ @@ -1147,18 +1147,18 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface, WINED3DFORMAT FormatList[] = { /* 32 bit */ - WINED3DFMT_A8R8G8B8, - WINED3DFMT_X8R8G8B8, + WINED3DFMT_B8G8R8A8_UNORM, + WINED3DFMT_B8G8R8X8_UNORM, /* 24 bit */ - WINED3DFMT_R8G8B8, + WINED3DFMT_B8G8R8_UNORM, /* 16 Bit */ - WINED3DFMT_A1R5G5B5, - WINED3DFMT_A4R4G4B4, - WINED3DFMT_R5G6B5, - WINED3DFMT_X1R5G5B5, + WINED3DFMT_B5G5R5A1_UNORM, + WINED3DFMT_B4G4R4A4_UNORM, + WINED3DFMT_B5G6R5_UNORM, + WINED3DFMT_B5G5R5X1_UNORM, /* 8 Bit */ - WINED3DFMT_R3G3B2, - WINED3DFMT_P8, + WINED3DFMT_B2G3R3_UNORM, + WINED3DFMT_P8_UINT, /* FOURCC codes */ WINED3DFMT_DXT1, WINED3DFMT_DXT3, @@ -1167,12 +1167,12 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface, WINED3DFORMAT BumpFormatList[] = { WINED3DFMT_R8G8_SNORM, - WINED3DFMT_L6V5U5, - WINED3DFMT_X8L8V8U8, + WINED3DFMT_R5G5_SNORM_L6_UNORM, + WINED3DFMT_R8G8_SNORM_L8X8_UNORM, WINED3DFMT_R8G8B8A8_SNORM, WINED3DFMT_R16G16_SNORM, - WINED3DFMT_W11V11U10, - WINED3DFMT_A2W10V10U10 + WINED3DFMT_R10G11B11_SNORM, + WINED3DFMT_R10G10B10_SNORM_A2_UNORM }; TRACE("(%p)->(%p,%p): Relay\n", This, Callback, Arg); @@ -1309,18 +1309,18 @@ IDirect3DDeviceImpl_2_EnumTextureFormats(IDirect3DDevice2 *iface, WINED3DFORMAT FormatList[] = { /* 32 bit */ - WINED3DFMT_A8R8G8B8, - WINED3DFMT_X8R8G8B8, + WINED3DFMT_B8G8R8A8_UNORM, + WINED3DFMT_B8G8R8X8_UNORM, /* 24 bit */ - WINED3DFMT_R8G8B8, + WINED3DFMT_B8G8R8_UNORM, /* 16 Bit */ - WINED3DFMT_A1R5G5B5, - WINED3DFMT_A4R4G4B4, - WINED3DFMT_R5G6B5, - WINED3DFMT_X1R5G5B5, + WINED3DFMT_B5G5R5A1_UNORM, + WINED3DFMT_B4G4R4A4_UNORM, + WINED3DFMT_B5G6R5_UNORM, + WINED3DFMT_B5G5R5X1_UNORM, /* 8 Bit */ - WINED3DFMT_R3G3B2, - WINED3DFMT_P8, + WINED3DFMT_B2G3R3_UNORM, + WINED3DFMT_P8_UINT, /* FOURCC codes - Not in this version*/ }; @@ -3603,9 +3603,8 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitive(IDirect3DDevice7 *iface, } IWineD3DDevice_SetPrimitiveType(This->wineD3DDevice, PrimitiveType); - hr = IWineD3DDevice_DrawIndexedPrimitiveUP(This->wineD3DDevice, 0 /* MinVertexIndex */, - VertexCount /* UINT NumVertexIndex */, IndexCount, Indices, WINED3DFMT_R16_UINT, - Vertices, get_flexible_vertex_size(VertexType)); + hr = IWineD3DDevice_DrawIndexedPrimitiveUP(This->wineD3DDevice, IndexCount, Indices, + WINED3DFMT_R16_UINT, Vertices, get_flexible_vertex_size(VertexType)); LeaveCriticalSection(&ddraw_cs); return hr; } @@ -3842,14 +3841,14 @@ IDirect3DDeviceImpl_7_DrawPrimitiveStrided(IDirect3DDevice7 *iface, if(VertexType & D3DFVF_DIFFUSE) { - WineD3DStrided.diffuse.format = WINED3DFMT_A8R8G8B8; + WineD3DStrided.diffuse.format = WINED3DFMT_B8G8R8A8_UNORM; WineD3DStrided.diffuse.lpData = D3DDrawPrimStrideData->diffuse.lpvData; WineD3DStrided.diffuse.dwStride = D3DDrawPrimStrideData->diffuse.dwStride; } if(VertexType & D3DFVF_SPECULAR) { - WineD3DStrided.specular.format = WINED3DFMT_A8R8G8B8; + WineD3DStrided.specular.format = WINED3DFMT_B8G8R8A8_UNORM; WineD3DStrided.specular.lpData = D3DDrawPrimStrideData->specular.lpvData; WineD3DStrided.specular.dwStride = D3DDrawPrimStrideData->specular.dwStride; } @@ -3983,14 +3982,14 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveStrided(IDirect3DDevice7 *iface, if(VertexType & D3DFVF_DIFFUSE) { - WineD3DStrided.diffuse.format = WINED3DFMT_A8R8G8B8; + WineD3DStrided.diffuse.format = WINED3DFMT_B8G8R8A8_UNORM; WineD3DStrided.diffuse.lpData = D3DDrawPrimStrideData->diffuse.lpvData; WineD3DStrided.diffuse.dwStride = D3DDrawPrimStrideData->diffuse.dwStride; } if(VertexType & D3DFVF_SPECULAR) { - WineD3DStrided.specular.format = WINED3DFMT_A8R8G8B8; + WineD3DStrided.specular.format = WINED3DFMT_B8G8R8A8_UNORM; WineD3DStrided.specular.lpData = D3DDrawPrimStrideData->specular.lpvData; WineD3DStrided.specular.dwStride = D3DDrawPrimStrideData->specular.dwStride; } @@ -4267,7 +4266,7 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface, /* Set the index stream */ IWineD3DDevice_SetBaseVertexIndex(This->wineD3DDevice, StartVertex); - hr = IWineD3DDevice_SetIndices(This->wineD3DDevice, This->indexbuffer, + hr = IWineD3DDevice_SetIndexBuffer(This->wineD3DDevice, This->indexbuffer, WINED3DFMT_R16_UINT); /* Set the vertex stream source */ @@ -4285,8 +4284,7 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface, IWineD3DDevice_SetPrimitiveType(This->wineD3DDevice, PrimitiveType); - hr = IWineD3DDevice_DrawIndexedPrimitive(This->wineD3DDevice, - 0 /* minIndex */, NumVertices, 0 /* StartIndex */, IndexCount); + hr = IWineD3DDevice_DrawIndexedPrimitive(This->wineD3DDevice, 0 /* StartIndex */, IndexCount); LeaveCriticalSection(&ddraw_cs); return hr; diff --git a/reactos/dll/directx/wine/ddraw/direct3d.c b/reactos/dll/directx/wine/ddraw/direct3d.c index 88d5f2f8507..d9d7041b6ba 100644 --- a/reactos/dll/directx/wine/ddraw/direct3d.c +++ b/reactos/dll/directx/wine/ddraw/direct3d.c @@ -824,7 +824,8 @@ IDirect3DImpl_7_CreateDevice(IDirect3D7 *iface, * takes the pointer and avoids the memcpy */ hr = IWineD3DDevice_CreateIndexBuffer(This->wineD3DDevice, 0x40000 /* Length. Don't know how long it should be */, - WINED3DUSAGE_DYNAMIC /* Usage */, WINED3DPOOL_DEFAULT, &object->indexbuffer, (IUnknown *)IndexBufferParent); + WINED3DUSAGE_DYNAMIC /* Usage */, WINED3DPOOL_DEFAULT, &object->indexbuffer, (IUnknown *)IndexBufferParent, + &ddraw_null_wined3d_parent_ops); if(FAILED(hr)) { @@ -1023,7 +1024,7 @@ IDirect3DImpl_7_CreateVertexBuffer(IDirect3D7 *iface, get_flexible_vertex_size(Desc->dwFVF) * Desc->dwNumVertices, Desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0, Desc->dwFVF, Desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3DPOOL_SYSTEMMEM : WINED3DPOOL_DEFAULT, - &object->wineD3DVertexBuffer, (IUnknown *)object); + &object->wineD3DVertexBuffer, (IUnknown *)object, &ddraw_null_wined3d_parent_ops); if(hr != D3D_OK) { ERR("(%p) IWineD3DDevice::CreateVertexBuffer failed with hr=%08x\n", This, hr); @@ -1111,12 +1112,12 @@ IDirect3DImpl_7_EnumZBufferFormats(IDirect3D7 *iface, /* Order matters. Specifically, BattleZone II (full version) expects the * 16-bit depth formats to be listed before the 24 and 32 ones. */ WINED3DFORMAT FormatList[] = { - WINED3DFMT_D15S1, + WINED3DFMT_S1_UINT_D15_UNORM, WINED3DFMT_D16_UNORM, - WINED3DFMT_D24X8, - WINED3DFMT_D24X4S4, - WINED3DFMT_D24S8, - WINED3DFMT_D32 + WINED3DFMT_X8D24_UNORM, + WINED3DFMT_S4X4_UINT_D24_UNORM, + WINED3DFMT_S8_UINT_D24_UNORM, + WINED3DFMT_D32_UNORM, }; TRACE("(%p)->(%s,%p,%p): Relay\n", iface, debugstr_guid(refiidDevice), Callback, Context); diff --git a/reactos/dll/directx/wine/ddraw/main.c b/reactos/dll/directx/wine/ddraw/main.c index d55cb11716e..240b4f17973 100644 --- a/reactos/dll/directx/wine/ddraw/main.c +++ b/reactos/dll/directx/wine/ddraw/main.c @@ -747,7 +747,6 @@ DestroyCallback(IDirectDrawSurface7 *surf, void *context) { IDirectDrawSurfaceImpl *Impl = (IDirectDrawSurfaceImpl *)surf; - IDirectDrawImpl *ddraw = context; ULONG ref; ref = IDirectDrawSurface7_Release(surf); /* For the EnumSurfaces */ @@ -759,9 +758,6 @@ DestroyCallback(IDirectDrawSurface7 *surf, */ if( (!Impl->is_complex_root) || (Impl->first_attached != Impl) ) return DDENUMRET_OK; - /* Skip our depth stencil surface, it will be released with the render target */ - if( Impl == ddraw->DepthStencilBuffer) - return DDENUMRET_OK; /* Destroy the surface */ while(ref) ref = IDirectDrawSurface7_Release(surf); diff --git a/reactos/dll/directx/wine/ddraw/surface.c b/reactos/dll/directx/wine/ddraw/surface.c index 6d92c0d837c..288e00e1461 100644 --- a/reactos/dll/directx/wine/ddraw/surface.c +++ b/reactos/dll/directx/wine/ddraw/surface.c @@ -159,6 +159,13 @@ IDirectDrawSurfaceImpl_AddRef(IDirectDrawSurface7 *iface) IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; ULONG refCount = InterlockedIncrement(&This->ref); + if (refCount == 1 && This->WineD3DSurface) + { + EnterCriticalSection(&ddraw_cs); + IWineD3DSurface_AddRef(This->WineD3DSurface); + LeaveCriticalSection(&ddraw_cs); + } + TRACE("(%p) : AddRef increasing from %d\n", This, refCount - 1); return refCount; } @@ -310,7 +317,7 @@ IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface) TRACE("(%p) Destroying the render target, uninitializing D3D\n", This); /* Unset any index buffer, just to be sure */ - IWineD3DDevice_SetIndices(ddraw->wineD3DDevice, NULL, WINED3DFMT_UNKNOWN); + IWineD3DDevice_SetIndexBuffer(ddraw->wineD3DDevice, NULL, WINED3DFMT_UNKNOWN); IWineD3DDevice_SetDepthStencilSurface(ddraw->wineD3DDevice, NULL); IWineD3DDevice_SetVertexDeclaration(ddraw->wineD3DDevice, NULL); for(i = 0; i < ddraw->numConvertedDecls; i++) @@ -320,7 +327,7 @@ IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface) HeapFree(GetProcessHeap(), 0, ddraw->decls); ddraw->numConvertedDecls = 0; - if(IWineD3DDevice_Uninit3D(ddraw->wineD3DDevice, D3D7CB_DestroyDepthStencilSurface, D3D7CB_DestroySwapChain) != D3D_OK) + if (FAILED(IWineD3DDevice_Uninit3D(ddraw->wineD3DDevice, D3D7CB_DestroySwapChain))) { /* Not good */ ERR("(%p) Failed to uninit 3D\n", This); @@ -358,43 +365,6 @@ IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface) */ TRACE("(%p) D3D unloaded\n", This); } - else if(This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | - DDSCAPS_3DDEVICE | - DDSCAPS_TEXTURE ) ) - { - /* It's a render target, but no swapchain was created. - * The IParent interfaces have to be released manually. - * The same applies for textures without an - * IWineD3DTexture object attached - */ - IParent *Parent; - - for(i = 0; i < MAX_COMPLEX_ATTACHED; i++) - { - if(This->complex_array[i]) - { - /* Only the topmost level can have more than 1 surfaces in the complex - * attachment array(Cube texture roots), for all others there is only - * one - */ - surf = This->complex_array[i]; - while(surf) - { - IWineD3DSurface_GetParent(surf->WineD3DSurface, - (IUnknown **) &Parent); - IParent_Release(Parent); /* For the getParent */ - IParent_Release(Parent); /* To release it */ - surf = surf->complex_array[0]; - } - } - } - - /* Now the top-level surface */ - IWineD3DSurface_GetParent(This->WineD3DSurface, - (IUnknown **) &Parent); - IParent_Release(Parent); /* For the getParent */ - IParent_Release(Parent); /* To release it */ - } /* The refcount test shows that the palette is detached when the surface is destroyed */ IDirectDrawSurface7_SetPalette((IDirectDrawSurface7 *)This, NULL); @@ -1069,7 +1039,17 @@ IDirectDrawSurfaceImpl_GetDC(IDirectDrawSurface7 *iface, hr = IWineD3DSurface_GetDC(This->WineD3DSurface, hdc); LeaveCriticalSection(&ddraw_cs); - return hr; + switch(hr) + { + /* Some, but not all errors set *hdc to NULL. E.g. DCALREADYCREATED does not + * touch *hdc + */ + case WINED3DERR_INVALIDCALL: + if(hdc) *hdc = NULL; + return DDERR_INVALIDPARAMS; + + default: return hr; + } } /***************************************************************************** diff --git a/reactos/dll/directx/wine/ddraw/utils.c b/reactos/dll/directx/wine/ddraw/utils.c index 17b4d34defa..0bac8f568b0 100644 --- a/reactos/dll/directx/wine/ddraw/utils.c +++ b/reactos/dll/directx/wine/ddraw/utils.c @@ -55,7 +55,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->dwSize = Size; switch(WineD3DFormat) { - case WINED3DFMT_R8G8B8: + case WINED3DFMT_B8G8R8_UNORM: DDPixelFormat->dwFlags = DDPF_RGB; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 24; @@ -65,7 +65,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; - case WINED3DFMT_A8R8G8B8: + case WINED3DFMT_B8G8R8A8_UNORM: DDPixelFormat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 32; @@ -75,7 +75,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0xff000000; break; - case WINED3DFMT_X8R8G8B8: + case WINED3DFMT_B8G8R8X8_UNORM: DDPixelFormat->dwFlags = DDPF_RGB; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 32; @@ -85,7 +85,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; - case WINED3DFMT_X8B8G8R8: + case WINED3DFMT_R8G8B8X8_UNORM: DDPixelFormat->dwFlags = DDPF_RGB; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 32; @@ -95,7 +95,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; - case WINED3DFMT_R5G6B5: + case WINED3DFMT_B5G6R5_UNORM: DDPixelFormat->dwFlags = DDPF_RGB; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 16; @@ -105,7 +105,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; - case WINED3DFMT_X1R5G5B5: + case WINED3DFMT_B5G5R5X1_UNORM: DDPixelFormat->dwFlags = DDPF_RGB; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 16; @@ -115,7 +115,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; - case WINED3DFMT_A1R5G5B5: + case WINED3DFMT_B5G5R5A1_UNORM: DDPixelFormat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 16; @@ -125,7 +125,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0x8000; break; - case WINED3DFMT_A4R4G4B4: + case WINED3DFMT_B4G4R4A4_UNORM: DDPixelFormat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 16; @@ -135,7 +135,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0xF000; break; - case WINED3DFMT_R3G3B2: + case WINED3DFMT_B2G3R3_UNORM: DDPixelFormat->dwFlags = DDPF_RGB; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 8; @@ -145,7 +145,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwLuminanceAlphaBitMask = 0x0; break; - case WINED3DFMT_P8: + case WINED3DFMT_P8_UINT: DDPixelFormat->dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 8; @@ -164,7 +164,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwLuminanceAlphaBitMask = 0x0; break; - case WINED3DFMT_A8R3G3B2: + case WINED3DFMT_B2G3R3A8_UNORM: DDPixelFormat->dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 16; @@ -174,7 +174,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0xF000; break; - case WINED3DFMT_X4R4G4B4: + case WINED3DFMT_B4G4R4X4_UNORM: DDPixelFormat->dwFlags = DDPF_RGB; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwRGBBitCount = 16; @@ -196,7 +196,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBZBitMask = 0x00000000; break; - case WINED3DFMT_D32: + case WINED3DFMT_D32_UNORM: DDPixelFormat->dwFlags = DDPF_ZBUFFER; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwZBufferBitDepth = 32; @@ -206,7 +206,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBZBitMask = 0x00000000; break; - case WINED3DFMT_D24X4S4: + case WINED3DFMT_S4X4_UINT_D24_UNORM: DDPixelFormat->dwFlags = DDPF_ZBUFFER | DDPF_STENCILBUFFER; DDPixelFormat->dwFourCC = 0; /* Should I set dwZBufferBitDepth to 32 here? */ @@ -217,7 +217,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; - case WINED3DFMT_D24S8: + case WINED3DFMT_S8_UINT_D24_UNORM: DDPixelFormat->dwFlags = DDPF_ZBUFFER | DDPF_STENCILBUFFER; DDPixelFormat->dwFourCC = 0; /* Should I set dwZBufferBitDepth to 32 here? */ @@ -228,7 +228,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; - case WINED3DFMT_D24X8: + case WINED3DFMT_X8D24_UNORM: DDPixelFormat->dwFlags = DDPF_ZBUFFER; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwZBufferBitDepth = 32; @@ -238,7 +238,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; - case WINED3DFMT_D15S1: + case WINED3DFMT_S1_UINT_D15_UNORM: DDPixelFormat->dwFlags = DDPF_ZBUFFER | DDPF_STENCILBUFFER; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwZBufferBitDepth = 16; @@ -274,7 +274,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, break; /* Luminance */ - case WINED3DFMT_L8: + case WINED3DFMT_L8_UNORM: DDPixelFormat->dwFlags = DDPF_LUMINANCE; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwLuminanceBitCount = 8; @@ -284,7 +284,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwLuminanceAlphaBitMask = 0x0; break; - case WINED3DFMT_A4L4: + case WINED3DFMT_L4A4_UNORM: DDPixelFormat->dwFlags = DDPF_ALPHAPIXELS | DDPF_LUMINANCE; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwLuminanceBitCount = 4; @@ -294,7 +294,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwLuminanceAlphaBitMask = 0xf0; break; - case WINED3DFMT_A8L8: + case WINED3DFMT_L8A8_UNORM: DDPixelFormat->dwFlags = DDPF_ALPHAPIXELS | DDPF_LUMINANCE; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwLuminanceBitCount = 16; @@ -315,7 +315,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwLuminanceAlphaBitMask = 0x00000000; break; - case WINED3DFMT_L6V5U5: + case WINED3DFMT_R5G5_SNORM_L6_UNORM: DDPixelFormat->dwFlags = DDPF_BUMPDUDV; DDPixelFormat->dwFourCC = 0; DDPixelFormat->u1.dwBumpBitCount = 16; @@ -325,6 +325,16 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u5.dwLuminanceAlphaBitMask = 0x00000000; break; + case WINED3DFMT_R8G8_SNORM_L8X8_UNORM: + DDPixelFormat->dwFlags = DDPF_BUMPDUDV; + DDPixelFormat->dwFourCC = 0; + DDPixelFormat->u1.dwBumpBitCount = 32; + DDPixelFormat->u2.dwBumpDuBitMask = 0x000000ff; + DDPixelFormat->u3.dwBumpDvBitMask = 0x0000ff00; + DDPixelFormat->u4.dwBumpLuminanceBitMask = 0x00ff0000; + DDPixelFormat->u5.dwLuminanceAlphaBitMask = 0x00000000; + break; + default: ERR("Can't translate this Pixelformat %d\n", WineD3DFormat); } @@ -357,12 +367,12 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) if(DDPixelFormat->dwFlags & DDPF_PALETTEINDEXED8) { - return WINED3DFMT_P8; + return WINED3DFMT_P8_UINT; } else if(DDPixelFormat->dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 | DDPF_PALETTEINDEXED4) ) { FIXME("DDPF_PALETTEINDEXED1 to DDPF_PALETTEINDEXED4 are not supported by WineD3D (yet). Returning WINED3DFMT_P8\n"); - return WINED3DFMT_P8; + return WINED3DFMT_P8_UINT; } else if(DDPixelFormat->dwFlags & DDPF_RGB) { @@ -370,7 +380,7 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) { case 8: /* This is the only format that can match here */ - return WINED3DFMT_R3G3B2; + return WINED3DFMT_B2G3R3_UNORM; case 16: /* Read the Color masks */ @@ -378,7 +388,7 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) (DDPixelFormat->u3.dwGBitMask == 0x07E0) && (DDPixelFormat->u4.dwBBitMask == 0x001F) ) { - return WINED3DFMT_R5G6B5; + return WINED3DFMT_B5G6R5_UNORM; } if( (DDPixelFormat->u2.dwRBitMask == 0x7C00) && @@ -387,9 +397,9 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) { if( (DDPixelFormat->dwFlags & DDPF_ALPHAPIXELS) && (DDPixelFormat->u5.dwRGBAlphaBitMask == 0x8000)) - return WINED3DFMT_A1R5G5B5; + return WINED3DFMT_B5G5R5A1_UNORM; else - return WINED3DFMT_X1R5G5B5; + return WINED3DFMT_B5G5R5X1_UNORM; } if( (DDPixelFormat->u2.dwRBitMask == 0x0F00) && @@ -398,9 +408,9 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) { if( (DDPixelFormat->dwFlags & DDPF_ALPHAPIXELS) && (DDPixelFormat->u5.dwRGBAlphaBitMask == 0xF000)) - return WINED3DFMT_A4R4G4B4; + return WINED3DFMT_B4G4R4A4_UNORM; else - return WINED3DFMT_X4R4G4B4; + return WINED3DFMT_B4G4R4X4_UNORM; } if( (DDPixelFormat->dwFlags & DDPF_ALPHAPIXELS) && @@ -409,13 +419,13 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) (DDPixelFormat->u3.dwGBitMask == 0x001C) && (DDPixelFormat->u4.dwBBitMask == 0x0003) ) { - return WINED3DFMT_A8R3G3B2; + return WINED3DFMT_B2G3R3A8_UNORM; } ERR("16 bit RGB Pixel format does not match\n"); return WINED3DFMT_UNKNOWN; case 24: - return WINED3DFMT_R8G8B8; + return WINED3DFMT_B8G8R8_UNORM; case 32: /* Read the Color masks */ @@ -425,9 +435,9 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) { if( (DDPixelFormat->dwFlags & DDPF_ALPHAPIXELS) && (DDPixelFormat->u5.dwRGBAlphaBitMask == 0xFF000000)) - return WINED3DFMT_A8R8G8B8; + return WINED3DFMT_B8G8R8A8_UNORM; else - return WINED3DFMT_X8R8G8B8; + return WINED3DFMT_B8G8R8X8_UNORM; } ERR("32 bit RGB pixel format does not match\n"); @@ -464,17 +474,17 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) { case 4: if(DDPixelFormat->u1.dwAlphaBitDepth == 4) - return WINED3DFMT_A4L4; + return WINED3DFMT_L4A4_UNORM; ERR("Unknown Alpha / Luminance bit depth combination\n"); return WINED3DFMT_UNKNOWN; case 6: ERR("A luminance Pixelformat shouldn't have 6 luminance bits. Returning D3DFMT_L6V5U5 for now!!\n"); - return WINED3DFMT_L6V5U5; + return WINED3DFMT_R5G5_SNORM_L6_UNORM; case 8: if(DDPixelFormat->u1.dwAlphaBitDepth == 8) - return WINED3DFMT_A8L8; + return WINED3DFMT_L8A8_UNORM; ERR("Unknown Alpha / Lumincase bit depth combination\n"); return WINED3DFMT_UNKNOWN; } @@ -486,10 +496,10 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) { case 6: ERR("A luminance Pixelformat shouldn't have 6 luminance bits. Returning D3DFMT_L6V5U5 for now!!\n"); - return WINED3DFMT_L6V5U5; + return WINED3DFMT_R5G5_SNORM_L6_UNORM; case 8: - return WINED3DFMT_L8; + return WINED3DFMT_L8_UNORM; default: ERR("Unknown luminance-only bit depth 0x%x\n", DDPixelFormat->u1.dwLuminanceBitCount); @@ -512,20 +522,20 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) FIXME("15 bit depth buffer not handled yet, assuming 16 bit\n"); case 16: if(DDPixelFormat->u2.dwStencilBitDepth == 1) - return WINED3DFMT_D15S1; + return WINED3DFMT_S1_UINT_D15_UNORM; FIXME("Don't know how to handle a 16 bit Z buffer with %d bit stencil buffer pixelformat\n", DDPixelFormat->u2.dwStencilBitDepth); return WINED3DFMT_UNKNOWN; case 24: FIXME("Don't know how to handle a 24 bit depth buffer with stencil bits\n"); - return WINED3DFMT_D24S8; + return WINED3DFMT_S8_UINT_D24_UNORM; case 32: if(DDPixelFormat->u2.dwStencilBitDepth == 8) - return WINED3DFMT_D24S8; + return WINED3DFMT_S8_UINT_D24_UNORM; else - return WINED3DFMT_D24X4S4; + return WINED3DFMT_S4X4_UINT_D24_UNORM; default: ERR("Unknown Z buffer depth %d\n", DDPixelFormat->u1.dwZBufferBitDepth); @@ -547,12 +557,12 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) FIXME("24 Bit depth buffer, treating like a 32 bit one\n"); case 32: if(DDPixelFormat->u3.dwZBitMask == 0x00FFFFFF) { - return WINED3DFMT_D24X8; + return WINED3DFMT_X8D24_UNORM; } else if(DDPixelFormat->u3.dwZBitMask == 0xFFFFFFFF) { - return WINED3DFMT_D32; + return WINED3DFMT_D32_UNORM; } FIXME("Unhandled 32 bit depth buffer bitmasks, returning WINED3DFMT_D24X8\n"); - return WINED3DFMT_D24X8; /* That's most likely to make games happy */ + return WINED3DFMT_X8D24_UNORM; /* That's most likely to make games happy */ default: ERR("Unsupported Z buffer depth %d\n", DDPixelFormat->u1.dwZBufferBitDepth); @@ -618,7 +628,14 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) (DDPixelFormat->u3.dwBumpDvBitMask == 0x000003e0) && (DDPixelFormat->u4.dwBumpLuminanceBitMask == 0x0000fc00) ) { - return WINED3DFMT_L6V5U5; + return WINED3DFMT_R5G5_SNORM_L6_UNORM; + } + else if ( (DDPixelFormat->u1.dwBumpBitCount == 32 ) && + (DDPixelFormat->u2.dwBumpDuBitMask == 0x000000ff) && + (DDPixelFormat->u3.dwBumpDvBitMask == 0x0000ff00) && + (DDPixelFormat->u4.dwBumpLuminanceBitMask == 0x00ff0000) ) + { + return WINED3DFMT_R8G8_SNORM_L8X8_UNORM; } } diff --git a/reactos/dll/directx/wine/wined3d/arb_program_shader.c b/reactos/dll/directx/wine/wined3d/arb_program_shader.c index a26950cd169..b541a6aeba1 100644 --- a/reactos/dll/directx/wine/wined3d/arb_program_shader.c +++ b/reactos/dll/directx/wine/wined3d/arb_program_shader.c @@ -125,7 +125,8 @@ struct arb_ps_np2fixup_info struct arb_ps_compile_args { struct ps_compile_args super; - DWORD bools; /* WORD is enough, use DWORD for alignment */ + WORD bools; + WORD clip; /* only a boolean, use a WORD for alignment */ unsigned char loop_ctrl[MAX_CONST_I][3]; }; @@ -276,10 +277,11 @@ static unsigned int shader_arb_load_constantsF(IWineD3DBaseShaderImpl *This, con GLuint target_type, unsigned int max_constants, const float *constants, char *dirty_consts) { local_constant* lconst; - DWORD i = 0, j; + DWORD i, j; unsigned int ret; - if (TRACE_ON(d3d_shader)) { + if (TRACE_ON(d3d_constants)) + { for(i = 0; i < max_constants; i++) { if(!dirty_consts[i]) continue; TRACE_(d3d_constants)("Loading constants %i: %f, %f, %f, %f\n", i, @@ -287,6 +289,9 @@ static unsigned int shader_arb_load_constantsF(IWineD3DBaseShaderImpl *This, con constants[i * 4 + 2], constants[i * 4 + 3]); } } + + i = 0; + /* In 1.X pixel shaders constants are implicitly clamped in the range [-1;1] */ if (target_type == GL_FRAGMENT_PROGRAM_ARB && This->baseShader.reg_maps.shader_version.major == 1) { @@ -3237,7 +3242,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct struct shader_arb_ctx_priv priv_ctx; BOOL dcl_tmp = args->super.srgb_correction, dcl_td = FALSE; BOOL want_nv_prog = FALSE; - struct arb_pshader_private *shader_priv = This->backend_priv; + struct arb_pshader_private *shader_priv = This->baseShader.backend_data; GLint errPos; DWORD map; @@ -3496,7 +3501,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct next_local += fixup->super.num_consts; } - if (shader_priv->clipplane_emulation != ~0U) + if (shader_priv->clipplane_emulation != ~0U && args->clip) { shader_addline(buffer, "KIL fragment.texcoord[%u];\n", shader_priv->clipplane_emulation); } @@ -3965,13 +3970,14 @@ static struct arb_ps_compiled_shader *find_arb_pshader(IWineD3DPixelShaderImpl * struct arb_pshader_private *shader_data; GLuint ret; - if(!shader->backend_priv) { + if (!shader->baseShader.backend_data) + { IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) shader->baseShader.device; const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; struct shader_arb_priv *priv = device->shader_priv; - shader->backend_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data)); - shader_data = shader->backend_priv; + shader->baseShader.backend_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data)); + shader_data = shader->baseShader.backend_data; shader_data->clamp_consts = shader->baseShader.reg_maps.shader_version.major == 1; if(shader->baseShader.reg_maps.shader_version.major < 3) shader_data->input_signature_idx = ~0; @@ -3986,7 +3992,7 @@ static struct arb_ps_compiled_shader *find_arb_pshader(IWineD3DPixelShaderImpl * else shader_data->clipplane_emulation = ~0U; } - shader_data = shader->backend_priv; + shader_data = shader->baseShader.backend_data; /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2), * so a linear search is more performant than a hashmap or a binary search @@ -4060,10 +4066,11 @@ static struct arb_vs_compiled_shader *find_arb_vshader(IWineD3DVertexShaderImpl GLuint ret; const struct wined3d_gl_info *gl_info = &((IWineD3DDeviceImpl *)shader->baseShader.device)->adapter->gl_info; - if(!shader->backend_priv) { - shader->backend_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data)); + if (!shader->baseShader.backend_data) + { + shader->baseShader.backend_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data)); } - shader_data = shader->backend_priv; + shader_data = shader->baseShader.backend_data; /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2), * so a linear search is more performant than a hashmap or a binary search @@ -4128,6 +4135,20 @@ static inline void find_arb_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWi if(stateblock->pixelShaderConstantB[i]) args->bools |= ( 1 << i); } + /* Only enable the clip plane emulation KIL if at least one clipplane is enabled. The KIL instruction + * is quite expensive because it forces the driver to disable early Z discards. It is cheaper to + * duplicate the shader than have a no-op KIL instruction in every shader + */ + if((!((IWineD3DDeviceImpl *) shader->baseShader.device)->vs_clipping) && use_vs(stateblock) && + stateblock->renderState[WINED3DRS_CLIPPING] && stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]) + { + args->clip = 1; + } + else + { + args->clip = 0; + } + /* Skip if unused or local, or supported natively */ int_skip = ~shader->baseShader.reg_maps.integer_constants | shader->baseShader.reg_maps.local_int_consts; if(int_skip == 0xffff || GL_SUPPORT(NV_FRAGMENT_PROGRAM_OPTION)) @@ -4166,7 +4187,7 @@ static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IW if(use_ps(stateblock)) { IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) stateblock->pixelShader; - struct arb_pshader_private *shader_priv = ps->backend_priv; + struct arb_pshader_private *shader_priv = ps->baseShader.backend_data; args->ps_signature = shader_priv->input_signature_idx; args->boolclip.clip_control[0] = shader_priv->clipplane_emulation + 1; @@ -4262,9 +4283,9 @@ static void shader_arb_select(const struct wined3d_context *context, BOOL usePS, /* Pixel Shader 1.x constants are clamped to [-1;1], Pixel Shader 2.0 constants are not. If switching between * a 1.x and newer shader, reload the first 8 constants */ - if(priv->last_ps_const_clamped != ((struct arb_pshader_private *) ps->backend_priv)->clamp_consts) + if(priv->last_ps_const_clamped != ((struct arb_pshader_private *)ps->baseShader.backend_data)->clamp_consts) { - priv->last_ps_const_clamped = ((struct arb_pshader_private *) ps->backend_priv)->clamp_consts; + priv->last_ps_const_clamped = ((struct arb_pshader_private *)ps->baseShader.backend_data)->clamp_consts; This->highest_dirty_ps_const = max(This->highest_dirty_ps_const, 8); for(i = 0; i < 8; i++) { @@ -4380,7 +4401,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) { if (shader_is_pshader_version(baseShader->baseShader.reg_maps.shader_version.type)) { IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *) iface; - struct arb_pshader_private *shader_data = This->backend_priv; + struct arb_pshader_private *shader_data = This->baseShader.backend_data; UINT i; if(!shader_data) return; /* This can happen if a shader was never compiled */ @@ -4395,10 +4416,10 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) { LEAVE_GL(); HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); HeapFree(GetProcessHeap(), 0, shader_data); - This->backend_priv = NULL; + This->baseShader.backend_data = NULL; } else { IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *) iface; - struct arb_vshader_private *shader_data = This->backend_priv; + struct arb_vshader_private *shader_data = This->baseShader.backend_data; UINT i; if(!shader_data) return; /* This can happen if a shader was never compiled */ @@ -4413,7 +4434,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) { LEAVE_GL(); HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); HeapFree(GetProcessHeap(), 0, shader_data); - This->backend_priv = NULL; + This->baseShader.backend_data = NULL; } } @@ -4423,7 +4444,7 @@ static int sig_tree_compare(const void *key, const struct wine_rb_entry *entry) return compare_sig(key, e->sig); } -struct wine_rb_functions sig_tree_functions = +static const struct wine_rb_functions sig_tree_functions = { wined3d_rb_alloc, wined3d_rb_realloc, diff --git a/reactos/dll/directx/wine/wined3d/baseshader.c b/reactos/dll/directx/wine/wined3d/baseshader.c index c983e80a35a..a6bea57dacc 100644 --- a/reactos/dll/directx/wine/wined3d/baseshader.c +++ b/reactos/dll/directx/wine/wined3d/baseshader.c @@ -206,11 +206,15 @@ int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ... return ret; } -void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDevice *device) +void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { shader->ref = 1; - shader->device = device; + shader->device = (IWineD3DDevice *)device; + shader->parent = parent; + shader->parent_ops = parent_ops; list_init(&shader->linked_programs); + list_add_head(&device->shaders, &shader->shader_list_entry); } /* Convert floating point offset relative diff --git a/reactos/dll/directx/wine/wined3d/basetexture.c b/reactos/dll/directx/wine/wined3d/basetexture.c index ab38b625aae..b38f66807f8 100644 --- a/reactos/dll/directx/wine/wined3d/basetexture.c +++ b/reactos/dll/directx/wine/wined3d/basetexture.c @@ -5,6 +5,7 @@ * Copyright 2002-2004 Raphael Junqueira * Copyright 2005 Oliver Stieber * Copyright 2007-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -29,11 +30,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture); HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc, - WINED3DPOOL pool, IUnknown *parent) + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { HRESULT hr; - hr = resource_init((IWineD3DResource *)texture, resource_type, device, size, usage, format_desc, pool, parent); + hr = resource_init((IWineD3DResource *)texture, resource_type, device, + size, usage, format_desc, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize resource, returning %#x\n", hr); @@ -43,8 +45,8 @@ HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DR texture->baseTexture.levels = levels; texture->baseTexture.filterType = (usage & WINED3DUSAGE_AUTOGENMIPMAP) ? WINED3DTEXF_LINEAR : WINED3DTEXF_NONE; texture->baseTexture.LOD = 0; - texture->baseTexture.dirty = TRUE; - texture->baseTexture.srgbDirty = TRUE; + texture->baseTexture.texture_rgb.dirty = TRUE; + texture->baseTexture.texture_srgb.dirty = TRUE; texture->baseTexture.is_srgb = FALSE; texture->baseTexture.pow2Matrix_identity = TRUE; @@ -68,28 +70,33 @@ void basetexture_cleanup(IWineD3DBaseTexture *iface) resource_cleanup((IWineD3DResource *)iface); } +/* A GL context is provided by the caller */ +static void gltexture_delete(struct gl_texture *tex) +{ + ENTER_GL(); + glDeleteTextures(1, &tex->name); + LEAVE_GL(); + tex->name = 0; +} + void basetexture_unload(IWineD3DBaseTexture *iface) { IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; - if(This->baseTexture.textureName) { + if(This->baseTexture.texture_rgb.name || + This->baseTexture.texture_srgb.name) { ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD); - ENTER_GL(); - glDeleteTextures(1, &This->baseTexture.textureName); - This->baseTexture.textureName = 0; - LEAVE_GL(); } - if(This->baseTexture.srgbTextureName) { - ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD); - ENTER_GL(); - glDeleteTextures(1, &This->baseTexture.srgbTextureName); - This->baseTexture.srgbTextureName = 0; - LEAVE_GL(); + if(This->baseTexture.texture_rgb.name) { + gltexture_delete(&This->baseTexture.texture_rgb); } - This->baseTexture.dirty = TRUE; - This->baseTexture.srgbDirty = TRUE; + if(This->baseTexture.texture_srgb.name) { + gltexture_delete(&This->baseTexture.texture_srgb); + } + This->baseTexture.texture_rgb.dirty = TRUE; + This->baseTexture.texture_srgb.dirty = TRUE; } DWORD basetexture_set_lod(IWineD3DBaseTexture *iface, DWORD LODNew) @@ -111,8 +118,8 @@ DWORD basetexture_set_lod(IWineD3DBaseTexture *iface, DWORD LODNew) if(This->baseTexture.LOD != LODNew) { This->baseTexture.LOD = LODNew; - This->baseTexture.states[WINED3DTEXSTA_MAXMIPLEVEL] = ~0U; - This->baseTexture.srgbstates[WINED3DTEXSTA_MAXMIPLEVEL] = ~0U; + This->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAXMIPLEVEL] = ~0U; + This->baseTexture.texture_srgb.states[WINED3DTEXSTA_MAXMIPLEVEL] = ~0U; if(This->baseTexture.bindCount) { IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_SAMPLER(This->baseTexture.sampler)); } @@ -156,7 +163,7 @@ HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DT */ ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD); ENTER_GL(); - glBindTexture(textureDimensions, This->baseTexture.textureName); + glBindTexture(textureDimensions, This->baseTexture.texture_rgb.name); checkGLcall("glBindTexture"); switch(FilterType) { case WINED3DTEXF_NONE: @@ -203,16 +210,16 @@ BOOL basetexture_set_dirty(IWineD3DBaseTexture *iface, BOOL dirty) { BOOL old; IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface; - old = This->baseTexture.dirty || This->baseTexture.srgbDirty; - This->baseTexture.dirty = dirty; - This->baseTexture.srgbDirty = dirty; + old = This->baseTexture.texture_rgb.dirty || This->baseTexture.texture_srgb.dirty; + This->baseTexture.texture_rgb.dirty = dirty; + This->baseTexture.texture_srgb.dirty = dirty; return old; } BOOL basetexture_get_dirty(IWineD3DBaseTexture *iface) { IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface; - return This->baseTexture.dirty || This->baseTexture.srgbDirty; + return This->baseTexture.texture_rgb.dirty || This->baseTexture.texture_srgb.dirty; } /* Context activation is done by the caller. */ @@ -222,49 +229,46 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac HRESULT hr = WINED3D_OK; UINT textureDimensions; BOOL isNewTexture = FALSE; - GLuint *texture; - DWORD *states; + struct gl_texture *gl_tex; TRACE("(%p) : About to bind texture\n", This); This->baseTexture.is_srgb = srgb; /* SRGB mode cache for PreLoad calls outside drawprim */ if(srgb) { - texture = &This->baseTexture.srgbTextureName; - states = This->baseTexture.srgbstates; + gl_tex = &This->baseTexture.texture_srgb; } else { - texture = &This->baseTexture.textureName; - states = This->baseTexture.states; + gl_tex = &This->baseTexture.texture_rgb; } textureDimensions = IWineD3DBaseTexture_GetTextureDimensions(iface); ENTER_GL(); /* Generate a texture name if we don't already have one */ - if (*texture == 0) { + if (gl_tex->name == 0) { *set_surface_desc = TRUE; - glGenTextures(1, texture); + glGenTextures(1, &gl_tex->name); checkGLcall("glGenTextures"); - TRACE("Generated texture %d\n", *texture); + TRACE("Generated texture %d\n", gl_tex->name); if (This->resource.pool == WINED3DPOOL_DEFAULT) { /* Tell opengl to try and keep this texture in video ram (well mostly) */ GLclampf tmp; tmp = 0.9f; - glPrioritizeTextures(1, texture, &tmp); + glPrioritizeTextures(1, &gl_tex->name, &tmp); } /* Initialise the state of the texture object to the openGL defaults, not the directx defaults */ - states[WINED3DTEXSTA_ADDRESSU] = WINED3DTADDRESS_WRAP; - states[WINED3DTEXSTA_ADDRESSV] = WINED3DTADDRESS_WRAP; - states[WINED3DTEXSTA_ADDRESSW] = WINED3DTADDRESS_WRAP; - states[WINED3DTEXSTA_BORDERCOLOR] = 0; - states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_LINEAR; - states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; /* GL_NEAREST_MIPMAP_LINEAR */ - states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_LINEAR; /* GL_NEAREST_MIPMAP_LINEAR */ - states[WINED3DTEXSTA_MAXMIPLEVEL] = 0; - states[WINED3DTEXSTA_MAXANISOTROPY] = 1; - states[WINED3DTEXSTA_SRGBTEXTURE] = 0; - states[WINED3DTEXSTA_ELEMENTINDEX] = 0; - states[WINED3DTEXSTA_DMAPOFFSET] = 0; - states[WINED3DTEXSTA_TSSADDRESSW] = WINED3DTADDRESS_WRAP; + gl_tex->states[WINED3DTEXSTA_ADDRESSU] = WINED3DTADDRESS_WRAP; + gl_tex->states[WINED3DTEXSTA_ADDRESSV] = WINED3DTADDRESS_WRAP; + gl_tex->states[WINED3DTEXSTA_ADDRESSW] = WINED3DTADDRESS_WRAP; + gl_tex->states[WINED3DTEXSTA_BORDERCOLOR] = 0; + gl_tex->states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_LINEAR; + gl_tex->states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; /* GL_NEAREST_MIPMAP_LINEAR */ + gl_tex->states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_LINEAR; /* GL_NEAREST_MIPMAP_LINEAR */ + gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] = 0; + gl_tex->states[WINED3DTEXSTA_MAXANISOTROPY] = 1; + gl_tex->states[WINED3DTEXSTA_SRGBTEXTURE] = 0; + gl_tex->states[WINED3DTEXSTA_ELEMENTINDEX] = 0; + gl_tex->states[WINED3DTEXSTA_DMAPOFFSET] = 0; + gl_tex->states[WINED3DTEXSTA_TSSADDRESSW] = WINED3DTADDRESS_WRAP; IWineD3DBaseTexture_SetDirty(iface, TRUE); isNewTexture = TRUE; @@ -272,7 +276,7 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac /* This means double binding the texture at creation, but keeps the code simpler all * in all, and the run-time path free from additional checks */ - glBindTexture(textureDimensions, *texture); + glBindTexture(textureDimensions, gl_tex->name); checkGLcall("glBindTexture"); glTexParameteri(textureDimensions, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); checkGLcall("glTexParameteri(textureDimensions, GL_GENERATE_MIPMAP_SGIS, GL_TRUE)"); @@ -282,8 +286,8 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac } /* Bind the texture */ - if (*texture != 0) { - glBindTexture(textureDimensions, *texture); + if (gl_tex->name != 0) { + glBindTexture(textureDimensions, gl_tex->name); checkGLcall("glBindTexture"); if (isNewTexture) { /* For a new texture we have to set the textures levels after binding the texture. @@ -346,40 +350,41 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface, const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1]) { IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface; - DWORD state, *states; + DWORD state; GLint textureDimensions = IWineD3DBaseTexture_GetTextureDimensions(iface); BOOL cond_np2 = IWineD3DBaseTexture_IsCondNP2(iface); DWORD aniso; + struct gl_texture *gl_tex; TRACE("iface %p, textureStates %p, samplerStates %p\n", iface, textureStates, samplerStates); if(This->baseTexture.is_srgb) { - states = This->baseTexture.srgbstates; + gl_tex = &This->baseTexture.texture_srgb; } else { - states = This->baseTexture.states; + gl_tex = &This->baseTexture.texture_rgb; } /* This function relies on the correct texture being bound and loaded. */ - if(samplerStates[WINED3DSAMP_ADDRESSU] != states[WINED3DTEXSTA_ADDRESSU]) { + if(samplerStates[WINED3DSAMP_ADDRESSU] != gl_tex->states[WINED3DTEXSTA_ADDRESSU]) { state = samplerStates[WINED3DSAMP_ADDRESSU]; apply_wrap(textureDimensions, state, GL_TEXTURE_WRAP_S, cond_np2); - states[WINED3DTEXSTA_ADDRESSU] = state; + gl_tex->states[WINED3DTEXSTA_ADDRESSU] = state; } - if(samplerStates[WINED3DSAMP_ADDRESSV] != states[WINED3DTEXSTA_ADDRESSV]) { + if(samplerStates[WINED3DSAMP_ADDRESSV] != gl_tex->states[WINED3DTEXSTA_ADDRESSV]) { state = samplerStates[WINED3DSAMP_ADDRESSV]; apply_wrap(textureDimensions, state, GL_TEXTURE_WRAP_T, cond_np2); - states[WINED3DTEXSTA_ADDRESSV] = state; + gl_tex->states[WINED3DTEXSTA_ADDRESSV] = state; } - if(samplerStates[WINED3DSAMP_ADDRESSW] != states[WINED3DTEXSTA_ADDRESSW]) { + if(samplerStates[WINED3DSAMP_ADDRESSW] != gl_tex->states[WINED3DTEXSTA_ADDRESSW]) { state = samplerStates[WINED3DSAMP_ADDRESSW]; apply_wrap(textureDimensions, state, GL_TEXTURE_WRAP_R, cond_np2); - states[WINED3DTEXSTA_ADDRESSW] = state; + gl_tex->states[WINED3DTEXSTA_ADDRESSW] = state; } - if(samplerStates[WINED3DSAMP_BORDERCOLOR] != states[WINED3DTEXSTA_BORDERCOLOR]) { + if(samplerStates[WINED3DSAMP_BORDERCOLOR] != gl_tex->states[WINED3DTEXSTA_BORDERCOLOR]) { float col[4]; state = samplerStates[WINED3DSAMP_BORDERCOLOR]; @@ -387,10 +392,10 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface, TRACE("Setting border color for %u to %x\n", textureDimensions, state); glTexParameterfv(textureDimensions, GL_TEXTURE_BORDER_COLOR, &col[0]); checkGLcall("glTexParameteri(..., GL_TEXTURE_BORDER_COLOR, ...)"); - states[WINED3DTEXSTA_BORDERCOLOR] = state; + gl_tex->states[WINED3DTEXSTA_BORDERCOLOR] = state; } - if(samplerStates[WINED3DSAMP_MAGFILTER] != states[WINED3DTEXSTA_MAGFILTER]) { + if(samplerStates[WINED3DSAMP_MAGFILTER] != gl_tex->states[WINED3DTEXSTA_MAGFILTER]) { GLint glValue; state = samplerStates[WINED3DSAMP_MAGFILTER]; if (state > WINED3DTEXF_ANISOTROPIC) { @@ -402,25 +407,25 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface, TRACE("ValueMAG=%d setting MAGFILTER to %x\n", state, glValue); glTexParameteri(textureDimensions, GL_TEXTURE_MAG_FILTER, glValue); - states[WINED3DTEXSTA_MAGFILTER] = state; + gl_tex->states[WINED3DTEXSTA_MAGFILTER] = state; } - if((samplerStates[WINED3DSAMP_MINFILTER] != states[WINED3DTEXSTA_MINFILTER] || - samplerStates[WINED3DSAMP_MIPFILTER] != states[WINED3DTEXSTA_MIPFILTER] || - samplerStates[WINED3DSAMP_MAXMIPLEVEL] != states[WINED3DTEXSTA_MAXMIPLEVEL])) { + if((samplerStates[WINED3DSAMP_MINFILTER] != gl_tex->states[WINED3DTEXSTA_MINFILTER] || + samplerStates[WINED3DSAMP_MIPFILTER] != gl_tex->states[WINED3DTEXSTA_MIPFILTER] || + samplerStates[WINED3DSAMP_MAXMIPLEVEL] != gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL])) { GLint glValue; - states[WINED3DTEXSTA_MIPFILTER] = samplerStates[WINED3DSAMP_MIPFILTER]; - states[WINED3DTEXSTA_MINFILTER] = samplerStates[WINED3DSAMP_MINFILTER]; - states[WINED3DTEXSTA_MAXMIPLEVEL] = samplerStates[WINED3DSAMP_MAXMIPLEVEL]; + gl_tex->states[WINED3DTEXSTA_MIPFILTER] = samplerStates[WINED3DSAMP_MIPFILTER]; + gl_tex->states[WINED3DTEXSTA_MINFILTER] = samplerStates[WINED3DSAMP_MINFILTER]; + gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] = samplerStates[WINED3DSAMP_MAXMIPLEVEL]; - if (states[WINED3DTEXSTA_MINFILTER] > WINED3DTEXF_ANISOTROPIC - || states[WINED3DTEXSTA_MIPFILTER] > WINED3DTEXF_ANISOTROPIC) + if (gl_tex->states[WINED3DTEXSTA_MINFILTER] > WINED3DTEXF_ANISOTROPIC + || gl_tex->states[WINED3DTEXSTA_MIPFILTER] > WINED3DTEXF_ANISOTROPIC) { FIXME("Unrecognized or unsupported D3DSAMP_MINFILTER value %d D3DSAMP_MIPFILTER value %d\n", - states[WINED3DTEXSTA_MINFILTER], - states[WINED3DTEXSTA_MIPFILTER]); + gl_tex->states[WINED3DTEXSTA_MINFILTER], + gl_tex->states[WINED3DTEXSTA_MIPFILTER]); } glValue = wined3d_gl_min_mip_filter(This->baseTexture.minMipLookup, min(max(samplerStates[WINED3DSAMP_MINFILTER], WINED3DTEXF_POINT), WINED3DTEXF_LINEAR), @@ -433,15 +438,15 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface, checkGLcall("glTexParameter GL_TEXTURE_MIN_FILTER, ..."); if(!cond_np2) { - if(states[WINED3DTEXSTA_MIPFILTER] == WINED3DTEXF_NONE) { + if(gl_tex->states[WINED3DTEXSTA_MIPFILTER] == WINED3DTEXF_NONE) { glValue = This->baseTexture.LOD; - } else if(states[WINED3DTEXSTA_MAXMIPLEVEL] >= This->baseTexture.levels) { + } else if(gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] >= This->baseTexture.levels) { glValue = This->baseTexture.levels - 1; - } else if(states[WINED3DTEXSTA_MAXMIPLEVEL] < This->baseTexture.LOD) { + } else if(gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] < This->baseTexture.LOD) { /* baseTexture.LOD is already clamped in the setter */ glValue = This->baseTexture.LOD; } else { - glValue = states[WINED3DTEXSTA_MAXMIPLEVEL]; + glValue = gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL]; } /* Note that D3DSAMP_MAXMIPLEVEL specifies the biggest mipmap(default 0), while * GL_TEXTURE_MAX_LEVEL specifies the smallest mimap used(default 1000). @@ -451,9 +456,9 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface, } } - if ((states[WINED3DSAMP_MAGFILTER] != WINED3DTEXF_ANISOTROPIC - && states[WINED3DSAMP_MINFILTER] != WINED3DTEXF_ANISOTROPIC - && states[WINED3DSAMP_MIPFILTER] != WINED3DTEXF_ANISOTROPIC) + if ((gl_tex->states[WINED3DTEXSTA_MAGFILTER] != WINED3DTEXF_ANISOTROPIC + && gl_tex->states[WINED3DTEXSTA_MINFILTER] != WINED3DTEXF_ANISOTROPIC + && gl_tex->states[WINED3DTEXSTA_MIPFILTER] != WINED3DTEXF_ANISOTROPIC) || cond_np2) { aniso = 1; @@ -463,7 +468,7 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface, aniso = samplerStates[WINED3DSAMP_MAXANISOTROPY]; } - if (states[WINED3DTEXSTA_MAXANISOTROPY] != aniso) + if (gl_tex->states[WINED3DTEXSTA_MAXANISOTROPY] != aniso) { if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) { @@ -474,6 +479,6 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface, { WARN("Anisotropic filtering not supported.\n"); } - states[WINED3DTEXSTA_MAXANISOTROPY] = aniso; + gl_tex->states[WINED3DTEXSTA_MAXANISOTROPY] = aniso; } } diff --git a/reactos/dll/directx/wine/wined3d/buffer.c b/reactos/dll/directx/wine/wined3d/buffer.c index 104f572106d..bbf95d763ad 100644 --- a/reactos/dll/directx/wine/wined3d/buffer.c +++ b/reactos/dll/directx/wine/wined3d/buffer.c @@ -223,11 +223,11 @@ static BOOL buffer_check_attribute(struct wined3d_buffer *This, const struct win else if (is_ffp_color) FIXME("test FLOAT16 fixed function processing colors\n"); *float16_used = TRUE; } - else if (check_d3dcolor && format == WINED3DFMT_A8R8G8B8) + else if (check_d3dcolor && format == WINED3DFMT_B8G8R8A8_UNORM) { ret = buffer_process_converted_attribute(This, CONV_D3DCOLOR, attrib, stride_this_run); - if (!is_ffp_color) FIXME("Test for non-color fixed function WINED3DFMT_A8R8G8B8 format\n"); + if (!is_ffp_color) FIXME("Test for non-color fixed function WINED3DFMT_B8G8R8A8_UNORM format\n"); } else if (is_ffp_position && format == WINED3DFMT_R32G32B32A32_FLOAT) { @@ -635,6 +635,7 @@ static ULONG STDMETHODCALLTYPE buffer_Release(IWineD3DBuffer *iface) { buffer_UnLoad(iface); resource_cleanup((IWineD3DResource *)iface); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); HeapFree(GetProcessHeap(), 0, This); } @@ -1035,7 +1036,7 @@ static HRESULT STDMETHODCALLTYPE buffer_GetDesc(IWineD3DBuffer *iface, WINED3DBU return WINED3D_OK; } -const struct IWineD3DBufferVtbl wined3d_buffer_vtbl = +static const struct IWineD3DBufferVtbl wined3d_buffer_vtbl = { /* IUnknown methods */ buffer_QueryInterface, @@ -1058,3 +1059,58 @@ const struct IWineD3DBufferVtbl wined3d_buffer_vtbl = buffer_Unmap, buffer_GetDesc, }; + +HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device, + UINT size, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, GLenum bind_hint, + const char *data, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) +{ + const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, &device->adapter->gl_info); + HRESULT hr; + + if (!size) + { + WARN("Size 0 requested, returning WINED3DERR_INVALIDCALL\n"); + return WINED3DERR_INVALIDCALL; + } + + buffer->vtbl = &wined3d_buffer_vtbl; + + hr = resource_init((IWineD3DResource *)buffer, WINED3DRTYPE_BUFFER, + device, size, usage, format_desc, pool, parent, parent_ops); + if (FAILED(hr)) + { + WARN("Failed to initialize resource, hr %#x\n", hr); + return hr; + } + buffer->buffer_type_hint = bind_hint; + + TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage, + debug_d3dformat(buffer->resource.format_desc->format), buffer->resource.allocatedMemory, buffer); + + if (data) + { + BYTE *ptr; + + hr = IWineD3DBuffer_Map((IWineD3DBuffer *)buffer, 0, size, &ptr, 0); + if (FAILED(hr)) + { + ERR("Failed to map buffer, hr %#x\n", hr); + buffer_UnLoad((IWineD3DBuffer *)buffer); + resource_cleanup((IWineD3DResource *)buffer); + return hr; + } + + memcpy(ptr, data, size); + + hr = IWineD3DBuffer_Unmap((IWineD3DBuffer *)buffer); + if (FAILED(hr)) + { + ERR("Failed to unmap buffer, hr %#x\n", hr); + buffer_UnLoad((IWineD3DBuffer *)buffer); + resource_cleanup((IWineD3DResource *)buffer); + return hr; + } + } + + return WINED3D_OK; +} diff --git a/reactos/dll/directx/wine/wined3d/context.c b/reactos/dll/directx/wine/wined3d/context.c index c4cd43659f5..c6d6df82c98 100644 --- a/reactos/dll/directx/wine/wined3d/context.c +++ b/reactos/dll/directx/wine/wined3d/context.c @@ -48,8 +48,8 @@ void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fb { if (!*fbo) { - GL_EXTCALL(glGenFramebuffersEXT(1, fbo)); - checkGLcall("glGenFramebuffersEXT()"); + gl_info->fbo_ops.glGenFramebuffers(1, fbo); + checkGLcall("glGenFramebuffers()"); TRACE("Created FBO %u.\n", *fbo); } f = *fbo; @@ -57,17 +57,17 @@ void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fb switch (target) { - case GL_READ_FRAMEBUFFER_EXT: + case GL_READ_FRAMEBUFFER: if (context->fbo_read_binding == f) return; context->fbo_read_binding = f; break; - case GL_DRAW_FRAMEBUFFER_EXT: + case GL_DRAW_FRAMEBUFFER: if (context->fbo_draw_binding == f) return; context->fbo_draw_binding = f; break; - case GL_FRAMEBUFFER_EXT: + case GL_FRAMEBUFFER: if (context->fbo_read_binding == f && context->fbo_draw_binding == f) return; context->fbo_read_binding = f; @@ -79,7 +79,7 @@ void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fb break; } - GL_EXTCALL(glBindFramebufferEXT(target, f)); + gl_info->fbo_ops.glBindFramebuffer(target, f); checkGLcall("glBindFramebuffer()"); } @@ -90,13 +90,13 @@ static void context_clean_fbo_attachments(const struct wined3d_gl_info *gl_info) for (i = 0; i < GL_LIMITS(buffers); ++i) { - GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i, GL_TEXTURE_2D, 0, 0)); + gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, 0, 0); checkGLcall("glFramebufferTexture2D()"); } - GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); + gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0); checkGLcall("glFramebufferTexture2D()"); - GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); + gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0); checkGLcall("glFramebufferTexture2D()"); } @@ -105,11 +105,11 @@ static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo) { const struct wined3d_gl_info *gl_info = context->gl_info; - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, fbo); + context_bind_fbo(context, GL_FRAMEBUFFER, fbo); context_clean_fbo_attachments(gl_info); - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL); + context_bind_fbo(context, GL_FRAMEBUFFER, NULL); - GL_EXTCALL(glDeleteFramebuffersEXT(1, fbo)); + gl_info->fbo_ops.glDeleteFramebuffers(1, fbo); checkGLcall("glDeleteFramebuffers()"); } @@ -125,17 +125,17 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOO /* Update base texture states array */ if (SUCCEEDED(IWineD3DSurface_GetContainer(surface, &IID_IWineD3DBaseTexture, (void **)&texture_impl))) { - if (texture_impl->baseTexture.states[WINED3DTEXSTA_MINFILTER] != WINED3DTEXF_POINT - || texture_impl->baseTexture.states[WINED3DTEXSTA_MIPFILTER] != WINED3DTEXF_NONE) + if (texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] != WINED3DTEXF_POINT + || texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] != WINED3DTEXF_NONE) { - texture_impl->baseTexture.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; - texture_impl->baseTexture.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; + texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; + texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; update_minfilter = TRUE; } - if (texture_impl->baseTexture.states[WINED3DTEXSTA_MAGFILTER] != WINED3DTEXF_POINT) + if (texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] != WINED3DTEXF_POINT) { - texture_impl->baseTexture.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; + texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; update_magfilter = TRUE; } @@ -194,16 +194,16 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context, { if (format_flags & WINED3DFMT_FLAG_DEPTH) { - GL_EXTCALL(glFramebufferRenderbufferEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, depth_stencil_impl->current_renderbuffer->id)); - checkGLcall("glFramebufferRenderbufferEXT()"); + gl_info->fbo_ops.glFramebufferRenderbuffer(fbo_target, GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, depth_stencil_impl->current_renderbuffer->id); + checkGLcall("glFramebufferRenderbuffer()"); } if (format_flags & WINED3DFMT_FLAG_STENCIL) { - GL_EXTCALL(glFramebufferRenderbufferEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, depth_stencil_impl->current_renderbuffer->id)); - checkGLcall("glFramebufferRenderbufferEXT()"); + gl_info->fbo_ops.glFramebufferRenderbuffer(fbo_target, GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, depth_stencil_impl->current_renderbuffer->id); + checkGLcall("glFramebufferRenderbuffer()"); } } else @@ -212,40 +212,40 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context, if (format_flags & WINED3DFMT_FLAG_DEPTH) { - GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, + gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_DEPTH_ATTACHMENT, depth_stencil_impl->texture_target, depth_stencil_impl->texture_name, - depth_stencil_impl->texture_level)); - checkGLcall("glFramebufferTexture2DEXT()"); + depth_stencil_impl->texture_level); + checkGLcall("glFramebufferTexture2D()"); } if (format_flags & WINED3DFMT_FLAG_STENCIL) { - GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT, + gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_STENCIL_ATTACHMENT, depth_stencil_impl->texture_target, depth_stencil_impl->texture_name, - depth_stencil_impl->texture_level)); - checkGLcall("glFramebufferTexture2DEXT()"); + depth_stencil_impl->texture_level); + checkGLcall("glFramebufferTexture2D()"); } } if (!(format_flags & WINED3DFMT_FLAG_DEPTH)) { - GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); - checkGLcall("glFramebufferTexture2DEXT()"); + gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0); + checkGLcall("glFramebufferTexture2D()"); } if (!(format_flags & WINED3DFMT_FLAG_STENCIL)) { - GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); - checkGLcall("glFramebufferTexture2DEXT()"); + gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0); + checkGLcall("glFramebufferTexture2D()"); } } else { - GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); - checkGLcall("glFramebufferTexture2DEXT()"); + gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0); + checkGLcall("glFramebufferTexture2D()"); - GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); - checkGLcall("glFramebufferTexture2DEXT()"); + gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0); + checkGLcall("glFramebufferTexture2D()"); } } @@ -262,12 +262,14 @@ void context_attach_surface_fbo(const struct wined3d_context *context, { context_apply_attachment_filter_states(surface, TRUE); - GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_COLOR_ATTACHMENT0_EXT + idx, surface_impl->texture_target, - surface_impl->texture_name, surface_impl->texture_level)); - checkGLcall("glFramebufferTexture2DEXT()"); - } else { - GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_COLOR_ATTACHMENT0_EXT + idx, GL_TEXTURE_2D, 0, 0)); - checkGLcall("glFramebufferTexture2DEXT()"); + gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, surface_impl->texture_target, + surface_impl->texture_name, surface_impl->texture_level); + checkGLcall("glFramebufferTexture2D()"); + } + else + { + gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, GL_TEXTURE_2D, 0, 0); + checkGLcall("glFramebufferTexture2D()"); } } @@ -277,8 +279,8 @@ static void context_check_fbo_status(struct wined3d_context *context) const struct wined3d_gl_info *gl_info = context->gl_info; GLenum status; - status = GL_EXTCALL(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)); - if (status == GL_FRAMEBUFFER_COMPLETE_EXT) + status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (status == GL_FRAMEBUFFER_COMPLETE) { TRACE("FBO complete\n"); } else { @@ -329,7 +331,7 @@ static void context_reuse_fbo_entry(struct wined3d_context *context, struct fbo_ IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice; const struct wined3d_gl_info *gl_info = context->gl_info; - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &entry->id); + context_bind_fbo(context, GL_FRAMEBUFFER, &entry->id); context_clean_fbo_attachments(gl_info); memcpy(entry->render_targets, device->render_targets, GL_LIMITS(buffers) * sizeof(*entry->render_targets)); @@ -394,7 +396,7 @@ static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_ const struct wined3d_gl_info *gl_info = context->gl_info; unsigned int i; - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &entry->id); + context_bind_fbo(context, GL_FRAMEBUFFER, &entry->id); if (!entry->attached) { @@ -402,7 +404,7 @@ static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_ for (i = 0; i < GL_LIMITS(buffers); ++i) { IWineD3DSurface *render_target = device->render_targets[i]; - context_attach_surface_fbo(context, GL_FRAMEBUFFER_EXT, i, render_target); + context_attach_surface_fbo(context, GL_FRAMEBUFFER, i, render_target); } /* Apply depth targets */ @@ -413,7 +415,7 @@ static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_ surface_set_compatible_renderbuffer(device->stencilBufferTarget, w, h); } - context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER_EXT, device->stencilBufferTarget, TRUE); + context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, device->stencilBufferTarget, TRUE); entry->attached = TRUE; } else { @@ -429,7 +431,7 @@ static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_ for (i = 0; i < GL_LIMITS(buffers); ++i) { if (device->render_targets[i]) - device->draw_buffers[i] = GL_COLOR_ATTACHMENT0_EXT + i; + device->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i; else device->draw_buffers[i] = GL_NONE; } @@ -444,7 +446,7 @@ static void context_apply_fbo_state(struct wined3d_context *context) context_apply_fbo_entry(context, context->current_fbo); } else { context->current_fbo = NULL; - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL); + context_bind_fbo(context, GL_FRAMEBUFFER, NULL); } context_check_fbo_status(context); @@ -757,17 +759,22 @@ BOOL context_set_current(struct wined3d_context *ctx) TRACE("Switching to D3D context %p, GL context %p, device context %p.\n", ctx, ctx->glCtx, ctx->hdc); if (!pwglMakeCurrent(ctx->hdc, ctx->glCtx)) { - ERR("Failed to make GL context %p current on device context %p.\n", ctx->glCtx, ctx->hdc); + DWORD err = GetLastError(); + ERR("Failed to make GL context %p current on device context %p, last error %#x.\n", + ctx->glCtx, ctx->hdc, err); + TlsSetValue(wined3d_context_tls_idx, NULL); return FALSE; } ctx->current = 1; } - else + else if(pwglGetCurrentContext()) { TRACE("Clearing current D3D context.\n"); if (!pwglMakeCurrent(NULL, NULL)) { - ERR("Failed to clear current GL context.\n"); + DWORD err = GetLastError(); + ERR("Failed to clear current GL context, last error %#x.\n", err); + TlsSetValue(wined3d_context_tls_idx, NULL); return FALSE; } } @@ -915,10 +922,10 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc, * Likely a lot of other new bugs will be exposed. For that reason request a depth stencil surface all the * time. It can cause a slight performance hit but fixes a lot of regressions. A fixme reminds of that this * issue needs to be fixed. */ - if (ds_format_desc->format != WINED3DFMT_D24S8) + if (ds_format_desc->format != WINED3DFMT_S8_UINT_D24_UNORM) { FIXME("Add OpenGL context recreation support to SetDepthStencilSurface\n"); - ds_format_desc = getFormatDescEntry(WINED3DFMT_D24S8, &This->adapter->gl_info); + ds_format_desc = getFormatDescEntry(WINED3DFMT_S8_UINT_D24_UNORM, &This->adapter->gl_info); } getDepthStencilBits(ds_format_desc, &depthBits, &stencilBits); @@ -1130,18 +1137,18 @@ struct wined3d_context *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceI if(wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER) { auxBuffers = TRUE; - if (color_format_desc->format == WINED3DFMT_X4R4G4B4) - color_format_desc = getFormatDescEntry(WINED3DFMT_A4R4G4B4, &This->adapter->gl_info); - else if (color_format_desc->format == WINED3DFMT_X8R8G8B8) - color_format_desc = getFormatDescEntry(WINED3DFMT_A8R8G8B8, &This->adapter->gl_info); + if (color_format_desc->format == WINED3DFMT_B4G4R4X4_UNORM) + color_format_desc = getFormatDescEntry(WINED3DFMT_B4G4R4A4_UNORM, &This->adapter->gl_info); + else if (color_format_desc->format == WINED3DFMT_B8G8R8X8_UNORM) + color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &This->adapter->gl_info); } /* DirectDraw supports 8bit paletted render targets and these are used by old games like Starcraft and C&C. * Most modern hardware doesn't support 8bit natively so we perform some form of 8bit -> 32bit conversion. * The conversion (ab)uses the alpha component for storing the palette index. For this reason we require * a format with 8bit alpha, so request A8R8G8B8. */ - if (color_format_desc->format == WINED3DFMT_P8) - color_format_desc = getFormatDescEntry(WINED3DFMT_A8R8G8B8, &This->adapter->gl_info); + if (color_format_desc->format == WINED3DFMT_P8_UINT) + color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &This->adapter->gl_info); /* Retrieve the depth stencil format from the present parameters. * The choice of the proper format can give a nice performance boost @@ -1360,7 +1367,11 @@ struct wined3d_context *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceI checkGLcall("glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE)"); } - if (GL_SUPPORT(EXT_PROVOKING_VERTEX)) + if (GL_SUPPORT(ARB_PROVOKING_VERTEX)) + { + GL_EXTCALL(glProvokingVertex(GL_FIRST_VERTEX_CONVENTION)); + } + else if (GL_SUPPORT(EXT_PROVOKING_VERTEX)) { GL_EXTCALL(glProvokingVertexEXT(GL_FIRST_VERTEX_CONVENTION_EXT)); } @@ -1958,7 +1969,7 @@ static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit checkGLcall("glDrawBuffer()"); } } else { - glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); + glDrawBuffer(GL_COLOR_ATTACHMENT0); checkGLcall("glDrawBuffer()"); } } @@ -2040,13 +2051,13 @@ struct wined3d_context *ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurfac { FIXME("Activating for CTXUSAGE_BLIT for an offscreen target with ORM_FBO. This should be avoided.\n"); ENTER_GL(); - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &context->dst_fbo); - context_attach_surface_fbo(context, GL_FRAMEBUFFER_EXT, 0, target); - context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER_EXT, NULL, FALSE); + context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo); + context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, target); + context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, NULL, FALSE); LEAVE_GL(); } else { ENTER_GL(); - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL); + context_bind_fbo(context, GL_FRAMEBUFFER, NULL); LEAVE_GL(); } context->draw_buffer_dirty = TRUE; diff --git a/reactos/dll/directx/wine/wined3d/cubetexture.c b/reactos/dll/directx/wine/wined3d/cubetexture.c index 4b6900a87f8..6e314cbb9e1 100644 --- a/reactos/dll/directx/wine/wined3d/cubetexture.c +++ b/reactos/dll/directx/wine/wined3d/cubetexture.c @@ -5,6 +5,7 @@ * Copyright 2002-2005 Raphael Junqueira * Copyright 2005 Oliver Stieber * Copyright 2007-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -55,7 +56,7 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3 srgb_mode = This->baseTexture.is_srgb; break; } - dirty = srgb_mode ? &This->baseTexture.srgbDirty : &This->baseTexture.dirty; + dirty = srgb_mode ? &This->baseTexture.texture_srgb.dirty : &This->baseTexture.texture_rgb.dirty; TRACE("(%p) : About to load texture: dirtified(%u).\n", This, *dirty); @@ -69,8 +70,8 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3 ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD); } - if (This->resource.format_desc->format == WINED3DFMT_P8 - || This->resource.format_desc->format == WINED3DFMT_A8P8) + if (This->resource.format_desc->format == WINED3DFMT_P8_UINT + || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) { for (i = 0; i < This->baseTexture.levels; ++i) { @@ -110,7 +111,7 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3 *dirty = FALSE; } -static void cubetexture_cleanup(IWineD3DCubeTextureImpl *This, D3DCB_DESTROYSURFACEFN surface_destroy_cb) +static void cubetexture_cleanup(IWineD3DCubeTextureImpl *This) { unsigned int i, j; @@ -130,128 +131,13 @@ static void cubetexture_cleanup(IWineD3DCubeTextureImpl *This, D3DCB_DESTROYSURF surface_set_texture_name(surface, 0, FALSE); surface_set_texture_target(surface, 0); IWineD3DSurface_SetContainer(surface, NULL); - surface_destroy_cb(surface); + IWineD3DSurface_Release(surface); } } } basetexture_cleanup((IWineD3DBaseTexture *)This); } -HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UINT levels, - IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent) -{ - const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info); - UINT pow2_edge_length; - unsigned int i, j; - UINT tmp_w; - HRESULT hr; - - /* TODO: It should only be possible to create textures for formats - * that are reported as supported. */ - if (WINED3DFMT_UNKNOWN >= format) - { - WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); - return WINED3DERR_INVALIDCALL; - } - - if (!GL_SUPPORT(ARB_TEXTURE_CUBE_MAP) && pool != WINED3DPOOL_SCRATCH) - { - WARN("(%p) : Tried to create not supported cube texture.\n", texture); - return WINED3DERR_INVALIDCALL; - } - - /* Calculate levels for mip mapping */ - if (usage & WINED3DUSAGE_AUTOGENMIPMAP) - { - if (!GL_SUPPORT(SGIS_GENERATE_MIPMAP)) - { - WARN("No mipmap generation support, returning D3DERR_INVALIDCALL.\n"); - return WINED3DERR_INVALIDCALL; - } - - if (levels > 1) - { - WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n"); - return WINED3DERR_INVALIDCALL; - } - - levels = 1; - } - else if (!levels) - { - levels = wined3d_log2i(edge_length) + 1; - TRACE("Calculated levels = %u.\n", levels); - } - - hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, - WINED3DRTYPE_CUBETEXTURE, device, 0, usage, format_desc, pool, parent); - if (FAILED(hr)) - { - WARN("Failed to initialize basetexture, returning %#x\n", hr); - return hr; - } - - /* Find the nearest pow2 match. */ - pow2_edge_length = 1; - while (pow2_edge_length < edge_length) pow2_edge_length <<= 1; - - if (GL_SUPPORT(ARB_TEXTURE_NON_POWER_OF_TWO) || (edge_length == pow2_edge_length)) - { - /* Precalculated scaling for 'faked' non power of two texture coords. */ - texture->baseTexture.pow2Matrix[0] = 1.0f; - texture->baseTexture.pow2Matrix[5] = 1.0f; - texture->baseTexture.pow2Matrix[10] = 1.0f; - texture->baseTexture.pow2Matrix[15] = 1.0f; - } - else - { - /* Precalculated scaling for 'faked' non power of two texture coords. */ - texture->baseTexture.pow2Matrix[0] = ((float)edge_length) / ((float)pow2_edge_length); - texture->baseTexture.pow2Matrix[5] = ((float)edge_length) / ((float)pow2_edge_length); - texture->baseTexture.pow2Matrix[10] = ((float)edge_length) / ((float)pow2_edge_length); - texture->baseTexture.pow2Matrix[15] = 1.0f; - texture->baseTexture.pow2Matrix_identity = FALSE; - } - - /* Generate all the surfaces. */ - tmp_w = edge_length; - for (i = 0; i < texture->baseTexture.levels; ++i) - { - /* Create the 6 faces. */ - for (j = 0; j < 6; ++j) - { - static const GLenum cube_targets[6] = - { - GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, - GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, - GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, - GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, - }; - - hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_w, - format, usage, pool, i /* Level */, j, &texture->surfaces[j][i]); - if (FAILED(hr)) - { - FIXME("(%p) Failed to create surface, hr %#x.\n", texture, hr); - texture->surfaces[j][i] = NULL; - cubetexture_cleanup(texture, D3DCB_DefaultDestroySurface); - return hr; - } - - IWineD3DSurface_SetContainer(texture->surfaces[j][i], (IWineD3DBase *)texture); - TRACE("Created surface level %u @ %p.\n", i, texture->surfaces[j][i]); - surface_set_texture_target(texture->surfaces[j][i], cube_targets[j]); - } - tmp_w = max(1, tmp_w >> 1); - } - texture->baseTexture.internal_preload = cubetexture_internal_preload; - - return WINED3D_OK; -} - #undef GLINFO_LOCATION /* ******************************************* @@ -288,8 +174,11 @@ static ULONG WINAPI IWineD3DCubeTextureImpl_Release(IWineD3DCubeTexture *iface) ULONG ref; TRACE("(%p) : Releasing from %d\n", This, This->resource.ref); ref = InterlockedDecrement(&This->resource.ref); - if (ref == 0) { - IWineD3DCubeTexture_Destroy(iface, D3DCB_DefaultDestroySurface); + if (!ref) + { + cubetexture_cleanup(This); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); + HeapFree(GetProcessHeap(), 0, This); } return ref; } @@ -404,9 +293,9 @@ static HRESULT WINAPI IWineD3DCubeTextureImpl_BindTexture(IWineD3DCubeTexture *i for (i = 0; i < This->baseTexture.levels; ++i) { for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z; ++j) { if(This->baseTexture.is_srgb) { - surface_set_texture_name(This->surfaces[j][i], This->baseTexture.srgbTextureName, TRUE); + surface_set_texture_name(This->surfaces[j][i], This->baseTexture.texture_srgb.name, TRUE); } else { - surface_set_texture_name(This->surfaces[j][i], This->baseTexture.textureName, FALSE); + surface_set_texture_name(This->surfaces[j][i], This->baseTexture.texture_rgb.name, FALSE); } } } @@ -432,14 +321,6 @@ static BOOL WINAPI IWineD3DCubeTextureImpl_IsCondNP2(IWineD3DCubeTexture *iface) /* ******************************************* IWineD3DCubeTexture IWineD3DCubeTexture parts follow ******************************************* */ -static void WINAPI IWineD3DCubeTextureImpl_Destroy(IWineD3DCubeTexture *iface, D3DCB_DESTROYSURFACEFN D3DCB_DestroySurface) { - IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface; - - cubetexture_cleanup(This, D3DCB_DestroySurface); - /* finally delete the object */ - HeapFree(GetProcessHeap(), 0, This); -} - static HRESULT WINAPI IWineD3DCubeTextureImpl_GetLevelDesc(IWineD3DCubeTexture *iface, UINT Level, WINED3DSURFACE_DESC* pDesc) { IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface; @@ -506,8 +387,8 @@ static HRESULT WINAPI IWineD3DCubeTextureImpl_UnlockRect(IWineD3DCubeTexture *if static HRESULT WINAPI IWineD3DCubeTextureImpl_AddDirtyRect(IWineD3DCubeTexture *iface, WINED3DCUBEMAP_FACES FaceType, CONST RECT* pDirtyRect) { HRESULT hr = WINED3DERR_INVALIDCALL; IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface; - This->baseTexture.dirty = TRUE; - This->baseTexture.srgbDirty = TRUE; + This->baseTexture.texture_rgb.dirty = TRUE; + This->baseTexture.texture_srgb.dirty = TRUE; TRACE("(%p) : dirtyfication of faceType(%d) Level (0)\n", This, FaceType); if (FaceType <= WINED3DCUBEMAP_FACE_NEGATIVE_Z) { surface_add_dirty_rect(This->surfaces[FaceType][0], pDirtyRect); @@ -518,8 +399,7 @@ static HRESULT WINAPI IWineD3DCubeTextureImpl_AddDirtyRect(IWineD3DCubeTexture return hr; } - -const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl = +static const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl = { /* IUnknown */ IWineD3DCubeTextureImpl_QueryInterface, @@ -549,10 +429,127 @@ const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl = IWineD3DCubeTextureImpl_GetTextureDimensions, IWineD3DCubeTextureImpl_IsCondNP2, /* IWineD3DCubeTexture */ - IWineD3DCubeTextureImpl_Destroy, IWineD3DCubeTextureImpl_GetLevelDesc, IWineD3DCubeTextureImpl_GetCubeMapSurface, IWineD3DCubeTextureImpl_LockRect, IWineD3DCubeTextureImpl_UnlockRect, IWineD3DCubeTextureImpl_AddDirtyRect }; + +HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UINT levels, + IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) +{ + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info); + UINT pow2_edge_length; + unsigned int i, j; + UINT tmp_w; + HRESULT hr; + + /* TODO: It should only be possible to create textures for formats + * that are reported as supported. */ + if (WINED3DFMT_UNKNOWN >= format) + { + WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); + return WINED3DERR_INVALIDCALL; + } + + if (!gl_info->supported[ARB_TEXTURE_CUBE_MAP] && pool != WINED3DPOOL_SCRATCH) + { + WARN("(%p) : Tried to create not supported cube texture.\n", texture); + return WINED3DERR_INVALIDCALL; + } + + /* Calculate levels for mip mapping */ + if (usage & WINED3DUSAGE_AUTOGENMIPMAP) + { + if (!gl_info->supported[SGIS_GENERATE_MIPMAP]) + { + WARN("No mipmap generation support, returning D3DERR_INVALIDCALL.\n"); + return WINED3DERR_INVALIDCALL; + } + + if (levels > 1) + { + WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n"); + return WINED3DERR_INVALIDCALL; + } + + levels = 1; + } + else if (!levels) + { + levels = wined3d_log2i(edge_length) + 1; + TRACE("Calculated levels = %u.\n", levels); + } + + texture->lpVtbl = &IWineD3DCubeTexture_Vtbl; + + hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_CUBETEXTURE, + device, 0, usage, format_desc, pool, parent, parent_ops); + if (FAILED(hr)) + { + WARN("Failed to initialize basetexture, returning %#x\n", hr); + return hr; + } + + /* Find the nearest pow2 match. */ + pow2_edge_length = 1; + while (pow2_edge_length < edge_length) pow2_edge_length <<= 1; + + if (gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO] || (edge_length == pow2_edge_length)) + { + /* Precalculated scaling for 'faked' non power of two texture coords. */ + texture->baseTexture.pow2Matrix[0] = 1.0f; + texture->baseTexture.pow2Matrix[5] = 1.0f; + texture->baseTexture.pow2Matrix[10] = 1.0f; + texture->baseTexture.pow2Matrix[15] = 1.0f; + } + else + { + /* Precalculated scaling for 'faked' non power of two texture coords. */ + texture->baseTexture.pow2Matrix[0] = ((float)edge_length) / ((float)pow2_edge_length); + texture->baseTexture.pow2Matrix[5] = ((float)edge_length) / ((float)pow2_edge_length); + texture->baseTexture.pow2Matrix[10] = ((float)edge_length) / ((float)pow2_edge_length); + texture->baseTexture.pow2Matrix[15] = 1.0f; + texture->baseTexture.pow2Matrix_identity = FALSE; + } + + /* Generate all the surfaces. */ + tmp_w = edge_length; + for (i = 0; i < texture->baseTexture.levels; ++i) + { + /* Create the 6 faces. */ + for (j = 0; j < 6; ++j) + { + static const GLenum cube_targets[6] = + { + GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, + GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, + GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, + GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, + }; + + hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_w, + format, usage, pool, i /* Level */, j, &texture->surfaces[j][i]); + if (FAILED(hr)) + { + FIXME("(%p) Failed to create surface, hr %#x.\n", texture, hr); + texture->surfaces[j][i] = NULL; + cubetexture_cleanup(texture); + return hr; + } + + IWineD3DSurface_SetContainer(texture->surfaces[j][i], (IWineD3DBase *)texture); + TRACE("Created surface level %u @ %p.\n", i, texture->surfaces[j][i]); + surface_set_texture_target(texture->surfaces[j][i], cube_targets[j]); + } + tmp_w = max(1, tmp_w >> 1); + } + texture->baseTexture.internal_preload = cubetexture_internal_preload; + + return WINED3D_OK; +} diff --git a/reactos/dll/directx/wine/wined3d/device.c b/reactos/dll/directx/wine/wined3d/device.c index 58e3b699d95..70656b7dfe8 100644 --- a/reactos/dll/directx/wine/wined3d/device.c +++ b/reactos/dll/directx/wine/wined3d/device.c @@ -9,6 +9,7 @@ * Copyright 2006-2008 Stefan Dösinger for CodeWeavers * Copyright 2006-2008 Henri Verbeet * Copyright 2007 Andrew Riedi + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -297,7 +298,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, stream_info->elements[idx].stream_idx = element->input_slot; stream_info->elements[idx].buffer_object = buffer_object; - if (!GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA) && element->format_desc->format == WINED3DFMT_A8R8G8B8) + if (!GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA) && element->format_desc->format == WINED3DFMT_B8G8R8A8_UNORM) { stream_info->swizzle_map |= 1 << idx; } @@ -359,7 +360,8 @@ void device_stream_info_from_strided(IWineD3DDeviceImpl *This, { if (!stream_info->elements[i].format_desc) continue; - if (!GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA) && stream_info->elements[i].format_desc->format == WINED3DFMT_A8R8G8B8) + if (!GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA) + && stream_info->elements[i].format_desc->format == WINED3DFMT_B8G8R8A8_UNORM) { stream_info->swizzle_map |= 1 << i; } @@ -441,11 +443,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetParent(IWineD3DDevice *iface, IUnkno return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_CreateBuffer(IWineD3DDevice *iface, - struct wined3d_buffer_desc *desc, const void *data, IUnknown *parent, IWineD3DBuffer **buffer) +static HRESULT WINAPI IWineD3DDeviceImpl_CreateBuffer(IWineD3DDevice *iface, struct wined3d_buffer_desc *desc, + const void *data, IUnknown *parent, const struct wined3d_parent_ops *parent_ops, IWineD3DBuffer **buffer) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(WINED3DFMT_UNKNOWN, &This->adapter->gl_info); struct wined3d_buffer *object; HRESULT hr; @@ -458,70 +459,37 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateBuffer(IWineD3DDevice *iface, return E_OUTOFMEMORY; } - object->vtbl = &wined3d_buffer_vtbl; - object->desc = *desc; - FIXME("Ignoring access flags (pool)\n"); - hr = resource_init((IWineD3DResource *)object, WINED3DRTYPE_BUFFER, This, desc->byte_width, - desc->usage, format_desc, WINED3DPOOL_MANAGED, parent); + hr = buffer_init(object, This, desc->byte_width, desc->usage, WINED3DFMT_UNKNOWN, + WINED3DPOOL_MANAGED, GL_ARRAY_BUFFER_ARB, data, parent, parent_ops); if (FAILED(hr)) { - WARN("Failed to initialize resource, returning %#x\n", hr); + WARN("Failed to initialize buffer, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); return hr; } - object->buffer_type_hint = GL_ARRAY_BUFFER_ARB; + object->desc = *desc; - TRACE("Created resource %p\n", object); - - TRACE("size %#x, usage=%#x, format %s, memory @ %p, iface @ %p\n", object->resource.size, object->resource.usage, - debug_d3dformat(object->resource.format_desc->format), object->resource.allocatedMemory, object); - - if (data) - { - BYTE *ptr; - - hr = IWineD3DBuffer_Map((IWineD3DBuffer *)object, 0, desc->byte_width, &ptr, 0); - if (FAILED(hr)) - { - ERR("Failed to map buffer, hr %#x\n", hr); - IWineD3DBuffer_Release((IWineD3DBuffer *)object); - return hr; - } - - memcpy(ptr, data, desc->byte_width); - - hr = IWineD3DBuffer_Unmap((IWineD3DBuffer *)object); - if (FAILED(hr)) - { - ERR("Failed to unmap buffer, hr %#x\n", hr); - IWineD3DBuffer_Release((IWineD3DBuffer *)object); - return hr; - } - } + TRACE("Created buffer %p.\n", object); *buffer = (IWineD3DBuffer *)object; return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *iface, UINT Size, DWORD Usage, - DWORD FVF, WINED3DPOOL Pool, IWineD3DBuffer **ppVertexBuffer, IUnknown *parent) +static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *iface, UINT Size, + DWORD Usage, DWORD FVF, WINED3DPOOL Pool, IWineD3DBuffer **ppVertexBuffer, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - /* Dummy format for now */ - const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(WINED3DFMT_VERTEXDATA, &This->adapter->gl_info); struct wined3d_buffer *object; int dxVersion = ( (IWineD3DImpl *) This->wineD3D)->dxVersion; HRESULT hr; BOOL conv; - if(Size == 0) { - WARN("Size 0 requested, returning WINED3DERR_INVALIDCALL\n"); - *ppVertexBuffer = NULL; - return WINED3DERR_INVALIDCALL; - } else if(Pool == WINED3DPOOL_SCRATCH) { + if (Pool == WINED3DPOOL_SCRATCH) + { /* The d3d9 testsuit shows that this is not allowed. It doesn't make much sense * anyway, SCRATCH vertex buffers aren't usable anywhere */ @@ -538,20 +506,17 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *ifac return WINED3DERR_OUTOFVIDEOMEMORY; } - object->vtbl = &wined3d_buffer_vtbl; - hr = resource_init((IWineD3DResource *)object, WINED3DRTYPE_BUFFER, This, Size, Usage, format_desc, Pool, parent); + hr = buffer_init(object, This, Size, Usage, WINED3DFMT_VERTEXDATA, + Pool, GL_ARRAY_BUFFER_ARB, NULL, parent, parent_ops); if (FAILED(hr)) { - WARN("Failed to initialize resource, returning %#x\n", hr); + WARN("Failed to initialize buffer, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); - *ppVertexBuffer = NULL; return hr; } - object->buffer_type_hint = GL_ARRAY_BUFFER_ARB; - TRACE("(%p) : Created resource %p\n", This, object); - - TRACE("(%p) : Size=%d, Usage=0x%08x, FVF=%x, Pool=%d - Memory@%p, Iface@%p\n", This, Size, Usage, FVF, Pool, object->resource.allocatedMemory, object); + TRACE("Created buffer %p.\n", object); + TRACE("FVF %#x, Pool %#x.\n", FVF, Pool); *ppVertexBuffer = (IWineD3DBuffer *)object; /* Observations show that drawStridedSlow is faster on dynamic VBs than converting + @@ -585,10 +550,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *ifac } static HRESULT WINAPI IWineD3DDeviceImpl_CreateIndexBuffer(IWineD3DDevice *iface, - UINT Length, DWORD Usage, WINED3DPOOL Pool, IWineD3DBuffer **ppIndexBuffer, IUnknown *parent) + UINT Length, DWORD Usage, WINED3DPOOL Pool, IWineD3DBuffer **ppIndexBuffer, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(WINED3DFMT_UNKNOWN, &This->adapter->gl_info); struct wined3d_buffer *object; HRESULT hr; @@ -603,25 +568,21 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateIndexBuffer(IWineD3DDevice *iface return WINED3DERR_OUTOFVIDEOMEMORY; } - object->vtbl = &wined3d_buffer_vtbl; - hr = resource_init((IWineD3DResource *)object, WINED3DRTYPE_BUFFER, This, Length, Usage, format_desc, Pool, parent); + hr = buffer_init(object, This, Length, Usage, WINED3DFMT_UNKNOWN, + Pool, GL_ELEMENT_ARRAY_BUFFER_ARB, NULL, parent, parent_ops); if (FAILED(hr)) { - WARN("Failed to initialize resource, returning %#x\n", hr); + WARN("Failed to initialize buffer, hr %#x\n", hr); HeapFree(GetProcessHeap(), 0, object); - *ppIndexBuffer = NULL; return hr; } - object->buffer_type_hint = GL_ELEMENT_ARRAY_BUFFER_ARB; - TRACE("(%p) : Created resource %p\n", This, object); + TRACE("Created buffer %p.\n", object); if(Pool != WINED3DPOOL_SYSTEMMEM && !(Usage & WINED3DUSAGE_DYNAMIC) && GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT)) { object->flags |= WINED3D_BUFFER_CREATEBO; } - TRACE("(%p) : Len=%d, Use=%x, Pool=%d - Memory@%p, Iface@%p\n", This, Length, Usage, - Pool, object, object->resource.allocatedMemory); *ppIndexBuffer = (IWineD3DBuffer *) object; return WINED3D_OK; @@ -900,7 +861,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface, static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UINT Width, UINT Height, WINED3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IWineD3DSurface **ppSurface, DWORD Usage, WINED3DPOOL Pool, WINED3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, - WINED3DSURFTYPE Impl, IUnknown *parent) + WINED3DSURFTYPE Impl, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DSurfaceImpl *object; @@ -923,7 +884,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UI } hr = surface_init(object, Impl, This->surface_alignment, Width, Height, Level, Lockable, - Discard, MultiSample, MultisampleQuality, This, Usage, Format, Pool, parent); + Discard, MultiSample, MultisampleQuality, This, Usage, Format, Pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize surface, returning %#x.\n", hr); @@ -963,8 +924,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateRendertargetView(IWineD3DDevice * } static HRESULT WINAPI IWineD3DDeviceImpl_CreateTexture(IWineD3DDevice *iface, - UINT Width, UINT Height, UINT Levels, DWORD Usage, WINED3DFORMAT Format, - WINED3DPOOL Pool, IWineD3DTexture **ppTexture, IUnknown *parent) + UINT Width, UINT Height, UINT Levels, DWORD Usage, WINED3DFORMAT Format, WINED3DPOOL Pool, + IWineD3DTexture **ppTexture, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DTextureImpl *object; @@ -982,9 +943,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateTexture(IWineD3DDevice *iface, return WINED3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &IWineD3DTexture_Vtbl; - - hr = texture_init(object, Width, Height, Levels, This, Usage, Format, Pool, parent); + hr = texture_init(object, Width, Height, Levels, This, Usage, Format, Pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize texture, returning %#x\n", hr); @@ -1001,8 +960,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateTexture(IWineD3DDevice *iface, } static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolumeTexture(IWineD3DDevice *iface, - UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, WINED3DFORMAT Format, - WINED3DPOOL Pool, IWineD3DVolumeTexture **ppVolumeTexture, IUnknown *parent) + UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, WINED3DFORMAT Format, WINED3DPOOL Pool, + IWineD3DVolumeTexture **ppVolumeTexture, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DVolumeTextureImpl *object; @@ -1019,8 +978,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolumeTexture(IWineD3DDevice *ifa return WINED3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &IWineD3DVolumeTexture_Vtbl; - hr = volumetexture_init(object, Width, Height, Depth, Levels, This, Usage, Format, Pool, parent); + hr = volumetexture_init(object, Width, Height, Depth, Levels, This, Usage, Format, Pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize volumetexture, returning %#x\n", hr); @@ -1035,19 +993,16 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolumeTexture(IWineD3DDevice *ifa return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface, - UINT Width, UINT Height, UINT Depth, DWORD Usage, WINED3DFORMAT Format, - WINED3DPOOL Pool, IWineD3DVolume **ppVolume, IUnknown *parent) +static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface, UINT Width, UINT Height, + UINT Depth, DWORD Usage, WINED3DFORMAT Format, WINED3DPOOL Pool, IWineD3DVolume **ppVolume, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - IWineD3DVolumeImpl *object; /** NOTE: impl ref allowed since this is a create function **/ - const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(Format, &GLINFO_LOCATION); + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DVolumeImpl *object; HRESULT hr; - if(!GL_SUPPORT(EXT_TEXTURE3D)) { - WARN("(%p) : Volume cannot be created - no volume texture support\n", This); - return WINED3DERR_INVALIDCALL; - } + TRACE("(%p) : W(%d) H(%d) D(%d), Usage(%d), Fmt(%u,%s), Pool(%s)\n", This, Width, Height, + Depth, Usage, Format, debug_d3dformat(Format), debug_d3dpool(Pool)); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if (!object) @@ -1057,42 +1012,23 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface, return WINED3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &IWineD3DVolume_Vtbl; - hr = resource_init((IWineD3DResource *)object, WINED3DRTYPE_VOLUME, This, - Width * Height * Depth * format_desc->byte_count, Usage, format_desc, Pool, parent); + hr = volume_init(object, This, Width, Height, Depth, Usage, Format, Pool, parent, parent_ops); if (FAILED(hr)) { - WARN("Failed to initialize resource, returning %#x\n", hr); + WARN("Failed to initialize volume, returning %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); - *ppVolume = NULL; return hr; } - TRACE("(%p) : Created resource %p\n", This, object); - + TRACE("(%p) : Created volume %p.\n", This, object); *ppVolume = (IWineD3DVolume *)object; - TRACE("(%p) : W(%d) H(%d) D(%d), Usage(%d), Fmt(%u,%s), Pool(%s)\n", This, Width, Height, - Depth, Usage, Format, debug_d3dformat(Format), debug_d3dpool(Pool)); - - object->currentDesc.Width = Width; - object->currentDesc.Height = Height; - object->currentDesc.Depth = Depth; - - /** Note: Volume textures cannot be dxtn, hence no need to check here **/ - object->lockable = TRUE; - object->locked = FALSE; - memset(&object->lockedBox, 0, sizeof(WINED3DBOX)); - object->dirty = TRUE; - - volume_add_dirty_box((IWineD3DVolume *)object, NULL); - return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface, - UINT EdgeLength, UINT Levels, DWORD Usage, WINED3DFORMAT Format, - WINED3DPOOL Pool, IWineD3DCubeTexture **ppCubeTexture, IUnknown *parent) +static HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface, UINT EdgeLength, UINT Levels, + DWORD Usage, WINED3DFORMAT Format, WINED3DPOOL Pool, IWineD3DCubeTexture **ppCubeTexture, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DCubeTextureImpl *object; /** NOTE: impl ref allowed since this is a create function **/ @@ -1106,8 +1042,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface return WINED3DERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &IWineD3DCubeTexture_Vtbl; - hr = cubetexture_init(object, EdgeLength, Levels, This, Usage, Format, Pool, parent); + hr = cubetexture_init(object, EdgeLength, Levels, This, Usage, Format, Pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize cubetexture, returning %#x\n", hr); @@ -1342,7 +1277,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSwapChain(IWineD3DDevice *iface, HDC hDc; IWineD3DSwapChainImpl *object; /** NOTE: impl ref allowed since this is a create function **/ HRESULT hr; - IUnknown *bufferParent; BOOL displaymode_set = FALSE; WINED3DDISPLAYMODE Mode; const struct GlPixelFormatDesc *format_desc; @@ -1603,26 +1537,14 @@ error: if (object->backBuffer) { UINT i; for(i = 0; i < object->presentParms.BackBufferCount; i++) { - if(object->backBuffer[i]) { - IWineD3DSurface_GetParent(object->backBuffer[i], &bufferParent); - IUnknown_Release(bufferParent); /* once for the get parent */ - if (IUnknown_Release(bufferParent) > 0) { - FIXME("(%p) Something's still holding the back buffer\n",This); - } - } + if (object->backBuffer[i]) IWineD3DSurface_Release(object->backBuffer[i]); } HeapFree(GetProcessHeap(), 0, object->backBuffer); object->backBuffer = NULL; } if(object->context && object->context[0]) DestroyContext(This, object->context[0]); - if(object->frontBuffer) { - IWineD3DSurface_GetParent(object->frontBuffer, &bufferParent); - IUnknown_Release(bufferParent); /* once for the get parent */ - if (IUnknown_Release(bufferParent) > 0) { - FIXME("(%p) Something's still holding the front buffer\n",This); - } - } + if (object->frontBuffer) IWineD3DSurface_Release(object->frontBuffer); HeapFree(GetProcessHeap(), 0, object); return hr; } @@ -1651,41 +1573,36 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetSwapChain(IWineD3DDevice *iface, U } } -/***** - * Vertex Declaration - *****/ -static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclaration(IWineD3DDevice* iface, IWineD3DVertexDeclaration** ppVertexDeclaration, - IUnknown *parent, const WINED3DVERTEXELEMENT *elements, UINT element_count) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; +static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclaration(IWineD3DDevice *iface, + IWineD3DVertexDeclaration **declaration, IUnknown *parent, const struct wined3d_parent_ops *parent_ops, + const WINED3DVERTEXELEMENT *elements, UINT element_count) +{ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DVertexDeclarationImpl *object = NULL; - HRESULT hr = WINED3D_OK; + HRESULT hr; - TRACE("(%p) : directXVersion %u, elements %p, element_count %d, ppDecl=%p\n", - This, ((IWineD3DImpl *)This->wineD3D)->dxVersion, elements, element_count, ppVertexDeclaration); + TRACE("iface %p, declaration %p, parent %p, elements %p, element_count %u.\n", + iface, declaration, parent, elements, element_count); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if(!object) { - ERR("Out of memory\n"); - *ppVertexDeclaration = NULL; - return WINED3DERR_OUTOFVIDEOMEMORY; + ERR("Failed to allocate vertex declaration memory.\n"); + return E_OUTOFMEMORY; } - object->lpVtbl = &IWineD3DVertexDeclaration_Vtbl; - object->wineD3DDevice = This; - object->parent = parent; - object->ref = 1; - - *ppVertexDeclaration = (IWineD3DVertexDeclaration *)object; - - hr = vertexdeclaration_init(object, elements, element_count); - - if(FAILED(hr)) { - IWineD3DVertexDeclaration_Release((IWineD3DVertexDeclaration *)object); - *ppVertexDeclaration = NULL; + hr = vertexdeclaration_init(object, This, elements, element_count, parent, parent_ops); + if (FAILED(hr)) + { + WARN("Failed to initialize vertex declaration, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; } - return hr; + TRACE("Created verrtex declaration %p.\n", object); + *declaration = (IWineD3DVertexDeclaration *)object; + + return WINED3D_OK; } static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the GL info, which has the type table */ @@ -1739,7 +1656,7 @@ static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the } if (has_blend && (num_blends > 0)) { if (((fvf & WINED3DFVF_XYZB5) == WINED3DFVF_XYZB2) && (fvf & WINED3DFVF_LASTBETA_D3DCOLOR)) - elements[idx].format = WINED3DFMT_A8R8G8B8; + elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM; else { switch(num_blends) { case 1: elements[idx].format = WINED3DFMT_R32_FLOAT; break; @@ -1759,7 +1676,7 @@ static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the (((fvf & WINED3DFVF_XYZB5) == WINED3DFVF_XYZB2) && (fvf & WINED3DFVF_LASTBETA_D3DCOLOR))) elements[idx].format = WINED3DFMT_R8G8B8A8_UINT; else if (fvf & WINED3DFVF_LASTBETA_D3DCOLOR) - elements[idx].format = WINED3DFMT_A8R8G8B8; + elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM; else elements[idx].format = WINED3DFMT_R32_FLOAT; elements[idx].usage = WINED3DDECLUSAGE_BLENDINDICES; @@ -1779,13 +1696,13 @@ static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the idx++; } if (has_diffuse) { - elements[idx].format = WINED3DFMT_A8R8G8B8; + elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM; elements[idx].usage = WINED3DDECLUSAGE_COLOR; elements[idx].usage_idx = 0; idx++; } if (has_specular) { - elements[idx].format = WINED3DFMT_A8R8G8B8; + elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM; elements[idx].usage = WINED3DDECLUSAGE_COLOR; elements[idx].usage_idx = 1; idx++; @@ -1825,96 +1742,83 @@ static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the return size; } -static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclarationFromFVF(IWineD3DDevice* iface, IWineD3DVertexDeclaration** ppVertexDeclaration, IUnknown *Parent, DWORD Fvf) { - WINED3DVERTEXELEMENT* elements = NULL; +static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclarationFromFVF(IWineD3DDevice *iface, + IWineD3DVertexDeclaration **declaration, IUnknown *parent, + const struct wined3d_parent_ops *parent_ops, DWORD fvf) +{ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; + WINED3DVERTEXELEMENT *elements; unsigned int size; DWORD hr; - size = ConvertFvfToDeclaration(This, Fvf, &elements); - if (size == ~0U) return WINED3DERR_OUTOFVIDEOMEMORY; + TRACE("iface %p, declaration %p, parent %p, fvf %#x.\n", iface, declaration, parent, fvf); - hr = IWineD3DDevice_CreateVertexDeclaration(iface, ppVertexDeclaration, Parent, elements, size); + size = ConvertFvfToDeclaration(This, fvf, &elements); + if (size == ~0U) return E_OUTOFMEMORY; + + hr = IWineD3DDevice_CreateVertexDeclaration(iface, declaration, parent, parent_ops, elements, size); HeapFree(GetProcessHeap(), 0, elements); - if (hr != S_OK) return hr; - - return WINED3D_OK; + return hr; } static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexShader(IWineD3DDevice *iface, const DWORD *pFunction, const struct wined3d_shader_signature *output_signature, - IWineD3DVertexShader **ppVertexShader, IUnknown *parent) + IWineD3DVertexShader **ppVertexShader, IUnknown *parent, + const struct wined3d_parent_ops *parent_ops) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - IWineD3DVertexShaderImpl *object; /* NOTE: impl usage is ok, this is a create */ - HRESULT hr = WINED3D_OK; - - if (!pFunction) return WINED3DERR_INVALIDCALL; + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DVertexShaderImpl *object; + HRESULT hr; object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if (!object) { - ERR("Out of memory\n"); - *ppVertexShader = NULL; - return WINED3DERR_OUTOFVIDEOMEMORY; + ERR("Failed to allocate shader memory.\n"); + return E_OUTOFMEMORY; } - object->lpVtbl = &IWineD3DVertexShader_Vtbl; - object->parent = parent; - shader_init(&object->baseShader, iface); - list_add_head(&This->shaders, &object->baseShader.shader_list_entry); - *ppVertexShader = (IWineD3DVertexShader *)object; - - TRACE("(%p) : Created vertex shader %p\n", This, *ppVertexShader); - - hr = IWineD3DVertexShader_SetFunction(*ppVertexShader, pFunction, output_signature); + hr = vertexshader_init(object, This, pFunction, output_signature, parent, parent_ops); if (FAILED(hr)) { - WARN("(%p) : Failed to set function, returning %#x\n", iface, hr); - IWineD3DVertexShader_Release(*ppVertexShader); - *ppVertexShader = NULL; + WARN("Failed to initialize vertex shader, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); return hr; } - return hr; + TRACE("Created vertex shader %p.\n", object); + *ppVertexShader = (IWineD3DVertexShader *)object; + + return WINED3D_OK; } static HRESULT WINAPI IWineD3DDeviceImpl_CreatePixelShader(IWineD3DDevice *iface, const DWORD *pFunction, const struct wined3d_shader_signature *output_signature, - IWineD3DPixelShader **ppPixelShader, IUnknown *parent) + IWineD3DPixelShader **ppPixelShader, IUnknown *parent, + const struct wined3d_parent_ops *parent_ops) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - IWineD3DPixelShaderImpl *object; /* NOTE: impl allowed, this is a create */ - HRESULT hr = WINED3D_OK; - - if (!pFunction) return WINED3DERR_INVALIDCALL; + IWineD3DPixelShaderImpl *object; + HRESULT hr; object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); if (!object) { - ERR("Out of memory\n"); - *ppPixelShader = NULL; - return WINED3DERR_OUTOFVIDEOMEMORY; + ERR("Failed to allocate shader memory.\n"); + return E_OUTOFMEMORY; } - object->lpVtbl = &IWineD3DPixelShader_Vtbl; - object->parent = parent; - shader_init(&object->baseShader, iface); - list_add_head(&This->shaders, &object->baseShader.shader_list_entry); - *ppPixelShader = (IWineD3DPixelShader *)object; - - TRACE("(%p) : Created pixel shader %p\n", This, *ppPixelShader); - - hr = IWineD3DPixelShader_SetFunction(*ppPixelShader, pFunction, output_signature); + hr = pixelshader_init(object, This, pFunction, output_signature, parent, parent_ops); if (FAILED(hr)) { - WARN("(%p) : Failed to set function, returning %#x\n", iface, hr); - IWineD3DPixelShader_Release(*ppPixelShader); - *ppPixelShader = NULL; + WARN("Failed to initialize pixel shader, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); return hr; } - return hr; + TRACE("Created pixel shader %p.\n", object); + *ppPixelShader = (IWineD3DPixelShader *)object; + + return WINED3D_OK; } static HRESULT WINAPI IWineD3DDeviceImpl_CreatePalette(IWineD3DDevice *iface, DWORD Flags, @@ -1981,8 +1885,9 @@ static void IWineD3DDeviceImpl_LoadLogo(IWineD3DDeviceImpl *This, const char *fi bm.bmHeight = 32; } - hr = IWineD3DDevice_CreateSurface((IWineD3DDevice *) This, bm.bmWidth, bm.bmHeight, WINED3DFMT_R5G6B5, TRUE, - FALSE, 0, &This->logo_surface, 0, WINED3DPOOL_DEFAULT, WINED3DMULTISAMPLE_NONE, 0, SURFACE_OPENGL, NULL); + hr = IWineD3DDevice_CreateSurface((IWineD3DDevice *)This, bm.bmWidth, bm.bmHeight, WINED3DFMT_B5G6R5_UNORM, TRUE, + FALSE, 0, &This->logo_surface, 0, WINED3DPOOL_DEFAULT, WINED3DMULTISAMPLE_NONE, 0, SURFACE_OPENGL, + NULL, &wined3d_null_parent_ops); if(FAILED(hr)) { ERR("Wine logo requested, but failed to create surface\n"); goto out; @@ -2286,8 +2191,12 @@ static HRESULT WINAPI device_unload_resource(IWineD3DResource *resource, void *c return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_DESTROYSURFACEFN D3DCB_DestroyDepthStencilSurface, D3DCB_DESTROYSWAPCHAINFN D3DCB_DestroySwapChain) { +static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, + D3DCB_DESTROYSWAPCHAINFN D3DCB_DestroySwapChain) +{ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; + const struct wined3d_context *context; + const struct wined3d_gl_info *gl_info; int sampler; UINT i; TRACE("(%p)\n", This); @@ -2297,7 +2206,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_D /* I don't think that the interface guarantees that the device is destroyed from the same thread * it was created. Thus make sure a context is active for the glDelete* calls */ - ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD); + context = ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD); + gl_info = context->gl_info; if(This->logo_surface) IWineD3DSurface_Release(This->logo_surface); @@ -2351,7 +2261,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_D } if (This->depth_blt_rb) { ENTER_GL(); - GL_EXTCALL(glDeleteRenderbuffersEXT(1, &This->depth_blt_rb)); + gl_info->fbo_ops.glDeleteRenderbuffers(1, &This->depth_blt_rb); LEAVE_GL(); This->depth_blt_rb = 0; This->depth_blt_rb_w = 0; @@ -2398,7 +2308,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_D This->render_targets[0] = NULL; if (This->auto_depth_stencil_buffer) { - if(D3DCB_DestroyDepthStencilSurface(This->auto_depth_stencil_buffer) > 0) { + if (IWineD3DSurface_Release(This->auto_depth_stencil_buffer) > 0) + { FIXME("(%p) Something's still holding the auto depth stencil buffer\n", This); } This->auto_depth_stencil_buffer = NULL; @@ -3154,8 +3065,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetMaterial(IWineD3DDevice *iface, WINE /***** * Get / Set Indices *****/ -static HRESULT WINAPI IWineD3DDeviceImpl_SetIndices(IWineD3DDevice *iface, IWineD3DBuffer* pIndexData, WINED3DFORMAT fmt) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; +static HRESULT WINAPI IWineD3DDeviceImpl_SetIndexBuffer(IWineD3DDevice *iface, + IWineD3DBuffer *pIndexData, WINED3DFORMAT fmt) +{ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DBuffer *oldIdxs; TRACE("(%p) : Setting to %p\n", This, pIndexData); @@ -3188,7 +3101,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetIndices(IWineD3DDevice *iface, IWine return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_GetIndices(IWineD3DDevice *iface, IWineD3DBuffer** ppIndexData) { +static HRESULT WINAPI IWineD3DDeviceImpl_GetIndexBuffer(IWineD3DDevice *iface, IWineD3DBuffer **ppIndexData) +{ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; *ppIndexData = This->stateBlock->pIndexData; @@ -5143,13 +5057,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitive(IWineD3DDevice *iface, UI IWineD3DDeviceImpl_MarkStateDirty(This, STATE_STREAMSRC); } /* Account for the loading offset due to index buffers. Instead of reloading all sources correct it with the startvertex parameter */ - drawPrimitive(iface, vertex_count, 0/* NumVertices */, StartVertex /* start_idx */, - 0 /* indxSize */, NULL /* indxData */, 0 /* minIndex */); + drawPrimitive(iface, vertex_count, StartVertex /* start_idx */, 0 /* indxSize */, NULL /* indxData */); return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitive(IWineD3DDevice *iface, - UINT minIndex, UINT NumVertices, UINT startIndex, UINT index_count) +static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitive(IWineD3DDevice *iface, UINT startIndex, UINT index_count) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; UINT idxStride = 2; @@ -5177,8 +5089,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitive(IWineD3DDevice *if } vbo = ((struct wined3d_buffer *) pIB)->buffer_object; - TRACE("(%p) : min %u, vertex count %u, startIdx %u, index count %u\n", - This, minIndex, NumVertices, startIndex, index_count); + TRACE("(%p) : startIndex %u, index count %u.\n", This, startIndex, index_count); if (This->stateBlock->IndexFmt == WINED3DFMT_R16_UINT) { idxStride = 2; @@ -5191,8 +5102,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitive(IWineD3DDevice *if IWineD3DDeviceImpl_MarkStateDirty(This, STATE_STREAMSRC); } - drawPrimitive(iface, index_count, NumVertices, startIndex, idxStride, - vbo ? NULL : ((struct wined3d_buffer *) pIB)->resource.allocatedMemory, minIndex); + drawPrimitive(iface, index_count, startIndex, idxStride, + vbo ? NULL : ((struct wined3d_buffer *)pIB)->resource.allocatedMemory); return WINED3D_OK; } @@ -5223,8 +5134,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitiveUP(IWineD3DDevice *iface, /* TODO: Only mark dirty if drawing from a different UP address */ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_STREAMSRC); - drawPrimitive(iface, vertex_count, 0 /* NumVertices */, 0 /* start_idx */, - 0 /* indxSize*/, NULL /* indxData */, 0 /* indxMin */); + drawPrimitive(iface, vertex_count, 0 /* start_idx */, 0 /* indxSize*/, NULL /* indxData */); /* MSDN specifies stream zero settings must be set to NULL */ This->stateBlock->streamStride[0] = 0; @@ -5236,8 +5146,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitiveUP(IWineD3DDevice *iface, return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitiveUP(IWineD3DDevice *iface, UINT MinVertexIndex, - UINT NumVertices, UINT index_count, const void *pIndexData, WINED3DFORMAT IndexDataFormat, +static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitiveUP(IWineD3DDevice *iface, + UINT index_count, const void *pIndexData, WINED3DFORMAT IndexDataFormat, const void *pVertexStreamZeroData, UINT VertexStreamZeroStride) { int idxStride; @@ -5245,9 +5155,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitiveUP(IWineD3DDevice * IWineD3DBuffer *vb; IWineD3DBuffer *ib; - TRACE("(%p) : MinVtxIdx %u, NumVIdx %u, index count %u, pidxdata %p, IdxFmt %u, pVtxdata %p, stride=%u\n", - This, MinVertexIndex, NumVertices, index_count, pIndexData, - IndexDataFormat, pVertexStreamZeroData, VertexStreamZeroStride); + TRACE("(%p) : index count %u, pidxdata %p, IdxFmt %u, pVtxdata %p, stride=%u.\n", + This, index_count, pIndexData, IndexDataFormat, pVertexStreamZeroData, VertexStreamZeroStride); if(!This->stateBlock->vertexDecl) { WARN("(%p) : Called without a valid vertex declaration set\n", This); @@ -5275,8 +5184,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitiveUP(IWineD3DDevice * IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VDECL); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_INDEXBUFFER); - drawPrimitive(iface, index_count, NumVertices, 0 /* start_idx */, - idxStride, pIndexData, MinVertexIndex); + drawPrimitive(iface, index_count, 0 /* start_idx */, idxStride, pIndexData); /* MSDN specifies stream zero settings and index buffer must be set to NULL */ This->stateBlock->streamSource[0] = NULL; @@ -5306,7 +5214,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawPrimitiveStrided(IWineD3DDevice *if IWineD3DDeviceImpl_MarkStateDirty(This, STATE_INDEXBUFFER); This->stateBlock->baseVertexIndex = 0; This->up_strided = DrawPrimStrideData; - drawPrimitive(iface, vertex_count, 0, 0, 0, NULL, 0); + drawPrimitive(iface, vertex_count, 0, 0, NULL); This->up_strided = NULL; return WINED3D_OK; } @@ -5327,7 +5235,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DrawIndexedPrimitiveStrided(IWineD3DDev This->stateBlock->streamIsUP = TRUE; This->stateBlock->baseVertexIndex = 0; This->up_strided = DrawPrimStrideData; - drawPrimitive(iface, vertex_count, 0 /* numindices */, 0 /* start_idx */, idxSize, pIndexData, 0 /* minindex */); + drawPrimitive(iface, 0 /* numindices */, 0 /* start_idx */, idxSize, pIndexData); This->up_strided = NULL; return WINED3D_OK; } @@ -5550,14 +5458,15 @@ static void dirtify_p8_texture_samplers(IWineD3DDeviceImpl *device) { int i; - for (i = 0; i < MAX_COMBINED_SAMPLERS; i++) { - IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl*)device->stateBlock->textures[i]; - if (texture && (texture->resource.format_desc->format == WINED3DFMT_P8 - || texture->resource.format_desc->format == WINED3DFMT_A8P8)) - { - IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(i)); - } + for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i) + { + IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl*)device->stateBlock->textures[i]; + if (texture && (texture->resource.format_desc->format == WINED3DFMT_P8_UINT + || texture->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)) + { + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(i)); } + } } static HRESULT WINAPI IWineD3DDeviceImpl_SetPaletteEntries(IWineD3DDevice *iface, UINT PaletteNumber, CONST PALETTEENTRY* pEntries) { @@ -6035,7 +5944,7 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface, context = ActivateContext(This, surface, CTXUSAGE_RESOURCELOAD); ENTER_GL(); - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL); + context_bind_fbo(context, GL_FRAMEBUFFER, NULL); buffer = surface_get_gl_buffer(surface, swapchain); glDrawBuffer(buffer); checkGLcall("glDrawBuffer()"); @@ -6044,9 +5953,9 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface, context = ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD); ENTER_GL(); - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &context->dst_fbo); - context_attach_surface_fbo(context, GL_FRAMEBUFFER_EXT, 0, surface); - context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER_EXT, NULL, FALSE); + context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo); + context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, surface); + context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, NULL, FALSE); } if (rect) { @@ -6087,8 +5996,9 @@ static inline DWORD argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) { unsigned int r, g, b, a; DWORD ret; - if(destfmt == WINED3DFMT_A8R8G8B8 || destfmt == WINED3DFMT_X8R8G8B8 || - destfmt == WINED3DFMT_R8G8B8) + if (destfmt == WINED3DFMT_B8G8R8A8_UNORM + || destfmt == WINED3DFMT_B8G8R8X8_UNORM + || destfmt == WINED3DFMT_B8G8R8_UNORM) return color; TRACE("Converting color %08x to format %s\n", color, debug_d3dformat(destfmt)); @@ -6100,7 +6010,7 @@ static inline DWORD argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) { switch(destfmt) { - case WINED3DFMT_R5G6B5: + case WINED3DFMT_B5G6R5_UNORM: if(r == 0xff && g == 0xff && b == 0xff) return 0xffff; r = (r * 32) / 256; g = (g * 64) / 256; @@ -6111,8 +6021,8 @@ static inline DWORD argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) { TRACE("Returning %08x\n", ret); return ret; - case WINED3DFMT_X1R5G5B5: - case WINED3DFMT_A1R5G5B5: + case WINED3DFMT_B5G5R5X1_UNORM: + case WINED3DFMT_B5G5R5A1_UNORM: a = (a * 2) / 256; r = (r * 32) / 256; g = (g * 32) / 256; @@ -6128,8 +6038,8 @@ static inline DWORD argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) { TRACE("Returning %08x\n", a); return a; - case WINED3DFMT_X4R4G4B4: - case WINED3DFMT_A4R4G4B4: + case WINED3DFMT_B4G4R4X4_UNORM: + case WINED3DFMT_B4G4R4A4_UNORM: a = (a * 16) / 256; r = (r * 16) / 256; g = (g * 16) / 256; @@ -6141,7 +6051,7 @@ static inline DWORD argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) { TRACE("Returning %08x\n", ret); return ret; - case WINED3DFMT_R3G3B2: + case WINED3DFMT_B2G3R3_UNORM: r = (r * 8) / 256; g = (g * 8) / 256; b = (b * 4) / 256; @@ -6151,7 +6061,7 @@ static inline DWORD argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) { TRACE("Returning %08x\n", ret); return ret; - case WINED3DFMT_X8B8G8R8: + case WINED3DFMT_R8G8B8X8_UNORM: case WINED3DFMT_R8G8B8A8_UNORM: ret = a << 24; ret |= b << 16; @@ -6160,7 +6070,7 @@ static inline DWORD argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) { TRACE("Returning %08x\n", ret); return ret; - case WINED3DFMT_A2R10G10B10: + case WINED3DFMT_B10G10R10A2_UNORM: a = (a * 4) / 256; r = (r * 1024) / 256; g = (g * 1024) / 256; @@ -6403,6 +6313,7 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; GLbitfield mask = GL_COLOR_BUFFER_BIT; /* TODO: Support blitting depth/stencil surfaces */ IWineD3DSwapChain *src_swapchain, *dst_swapchain; + const struct wined3d_gl_info *gl_info; struct wined3d_context *context; GLenum gl_filter; POINT offset = {0, 0}; @@ -6433,6 +6344,8 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED else if (dst_swapchain) context = ActivateContext(This, dst_surface, CTXUSAGE_RESOURCELOAD); else context = ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD); + gl_info = context->gl_info; + if (src_swapchain) { GLenum buffer = surface_get_gl_buffer(src_surface, src_swapchain); @@ -6456,17 +6369,17 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED } ENTER_GL(); - context_bind_fbo(context, GL_READ_FRAMEBUFFER_EXT, NULL); + context_bind_fbo(context, GL_READ_FRAMEBUFFER, NULL); glReadBuffer(buffer); checkGLcall("glReadBuffer()"); } else { TRACE("Source surface %p is offscreen\n", src_surface); ENTER_GL(); - context_bind_fbo(context, GL_READ_FRAMEBUFFER_EXT, &context->src_fbo); - context_attach_surface_fbo(context, GL_READ_FRAMEBUFFER_EXT, 0, src_surface); - glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); + context_bind_fbo(context, GL_READ_FRAMEBUFFER, &context->src_fbo); + context_attach_surface_fbo(context, GL_READ_FRAMEBUFFER, 0, src_surface); + glReadBuffer(GL_COLOR_ATTACHMENT0); checkGLcall("glReadBuffer()"); - context_attach_depth_stencil_fbo(context, GL_READ_FRAMEBUFFER_EXT, NULL, FALSE); + context_attach_depth_stencil_fbo(context, GL_READ_FRAMEBUFFER, NULL, FALSE); } LEAVE_GL(); @@ -6495,29 +6408,29 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED } ENTER_GL(); - context_bind_fbo(context, GL_DRAW_FRAMEBUFFER_EXT, NULL); + context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, NULL); glDrawBuffer(buffer); checkGLcall("glDrawBuffer()"); } else { TRACE("Destination surface %p is offscreen\n", dst_surface); ENTER_GL(); - context_bind_fbo(context, GL_DRAW_FRAMEBUFFER_EXT, &context->dst_fbo); - context_attach_surface_fbo(context, GL_DRAW_FRAMEBUFFER_EXT, 0, dst_surface); - glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); + context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, &context->dst_fbo); + context_attach_surface_fbo(context, GL_DRAW_FRAMEBUFFER, 0, dst_surface); + glDrawBuffer(GL_COLOR_ATTACHMENT0); checkGLcall("glDrawBuffer()"); - context_attach_depth_stencil_fbo(context, GL_DRAW_FRAMEBUFFER_EXT, NULL, FALSE); + context_attach_depth_stencil_fbo(context, GL_DRAW_FRAMEBUFFER, NULL, FALSE); } glDisable(GL_SCISSOR_TEST); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE)); if (flip) { - GL_EXTCALL(glBlitFramebufferEXT(src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2, - dst_rect->x1, dst_rect->y2, dst_rect->x2, dst_rect->y1, mask, gl_filter)); + gl_info->fbo_ops.glBlitFramebuffer(src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2, + dst_rect->x1, dst_rect->y2, dst_rect->x2, dst_rect->y1, mask, gl_filter); checkGLcall("glBlitFramebuffer()"); } else { - GL_EXTCALL(glBlitFramebufferEXT(src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2, - dst_rect->x1, dst_rect->y1, dst_rect->x2, dst_rect->y2, mask, gl_filter)); + gl_info->fbo_ops.glBlitFramebuffer(src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2, + dst_rect->x1, dst_rect->y1, dst_rect->x2, dst_rect->y2, mask, gl_filter); checkGLcall("glBlitFramebuffer()"); } @@ -6653,7 +6566,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i WINED3DLOCKED_RECT rect; /* MSDN: Cursor must be A8R8G8B8 */ - if (WINED3DFMT_A8R8G8B8 != pSur->resource.format_desc->format) + if (pSur->resource.format_desc->format != WINED3DFMT_B8G8R8A8_UNORM) { ERR("(%p) : surface(%p) has an invalid format\n", This, pCursorBitmap); return WINED3DERR_INVALIDCALL; @@ -6679,7 +6592,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i This->cursorHeight = pSur->currentDesc.Height; if (SUCCEEDED(IWineD3DSurface_LockRect(pCursorBitmap, &rect, NULL, WINED3DLOCK_READONLY))) { - const struct GlPixelFormatDesc *glDesc = getFormatDescEntry(WINED3DFMT_A8R8G8B8, &GLINFO_LOCATION); + const struct GlPixelFormatDesc *glDesc = + getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &GLINFO_LOCATION); char *mem, *bits = rect.pBits; GLint intfmt = glDesc->glInternal; GLint format = glDesc->glFormat; @@ -6961,10 +6875,13 @@ static BOOL is_display_mode_supported(IWineD3DDeviceImpl *This, const WINED3DPRE void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain_iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *) swapchain_iface; + const struct wined3d_context *context; + const struct wined3d_gl_info *gl_info; UINT i; IWineD3DBaseShaderImpl *shader; - ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD); + context = ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD); + gl_info = context->gl_info; IWineD3DDevice_EnumResources(iface, reset_unload_resources, NULL); LIST_FOR_EACH_ENTRY(shader, &This->shaders, IWineD3DBaseShaderImpl, baseShader.shader_list_entry) { @@ -6977,7 +6894,7 @@ void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain_ This->depth_blt_texture = 0; } if (This->depth_blt_rb) { - GL_EXTCALL(glDeleteRenderbuffersEXT(1, &This->depth_blt_rb)); + gl_info->fbo_ops.glDeleteRenderbuffers(1, &This->depth_blt_rb); This->depth_blt_rb = 0; This->depth_blt_rb_w = 0; This->depth_blt_rb_h = 0; @@ -7140,6 +7057,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE else IWineD3DDevice_SetDepthStencilSurface(iface, NULL); + TRACE("Resetting stateblock\n"); + IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->updateStateBlock); + IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->stateBlock); + delete_opengl_contexts(iface, (IWineD3DSwapChain *) swapchain); if(pPresentationParameters->Windowed) { @@ -7214,10 +7135,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE This->exStyle = exStyle; } - TRACE("Resetting stateblock\n"); - IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->updateStateBlock); - IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->stateBlock); - /* Note: No parent needed for initial internal stateblock */ hr = IWineD3DDevice_CreateStateBlock(iface, WINED3DSBT_INIT, (IWineD3DStateBlock **)&This->stateBlock, NULL); if (FAILED(hr)) ERR("Resetting the stateblock failed with error 0x%08x\n", hr); @@ -7483,8 +7400,8 @@ const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl = IWineD3DDeviceImpl_GetDepthStencilSurface, IWineD3DDeviceImpl_SetGammaRamp, IWineD3DDeviceImpl_GetGammaRamp, - IWineD3DDeviceImpl_SetIndices, - IWineD3DDeviceImpl_GetIndices, + IWineD3DDeviceImpl_SetIndexBuffer, + IWineD3DDeviceImpl_GetIndexBuffer, IWineD3DDeviceImpl_SetBaseVertexIndex, IWineD3DDeviceImpl_GetBaseVertexIndex, IWineD3DDeviceImpl_SetLight, diff --git a/reactos/dll/directx/wine/wined3d/directx.c b/reactos/dll/directx/wine/wined3d/directx.c index a7cb91eb3eb..1236863b2f9 100644 --- a/reactos/dll/directx/wine/wined3d/directx.c +++ b/reactos/dll/directx/wine/wined3d/directx.c @@ -6,6 +6,7 @@ * Copyright 2004 Christian Costa * Copyright 2005 Oliver Stieber * Copyright 2007-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -61,6 +62,7 @@ static const struct { {"GL_ARB_draw_buffers", ARB_DRAW_BUFFERS, 0 }, {"GL_ARB_fragment_program", ARB_FRAGMENT_PROGRAM, 0 }, {"GL_ARB_fragment_shader", ARB_FRAGMENT_SHADER, 0 }, + {"GL_ARB_framebuffer_object", ARB_FRAMEBUFFER_OBJECT, 0 }, {"GL_ARB_geometry_shader4", ARB_GEOMETRY_SHADER4, 0 }, {"GL_ARB_half_float_pixel", ARB_HALF_FLOAT_PIXEL, 0 }, {"GL_ARB_imaging", ARB_IMAGING, 0 }, @@ -70,6 +72,7 @@ static const struct { {"GL_ARB_pixel_buffer_object", ARB_PIXEL_BUFFER_OBJECT, 0 }, {"GL_ARB_point_parameters", ARB_POINT_PARAMETERS, 0 }, {"GL_ARB_point_sprite", ARB_POINT_SPRITE, 0 }, + {"GL_ARB_provoking_vertex", ARB_PROVOKING_VERTEX, 0 }, {"GL_ARB_texture_border_clamp", ARB_TEXTURE_BORDER_CLAMP, 0 }, {"GL_ARB_texture_compression", ARB_TEXTURE_COMPRESSION, 0 }, {"GL_ARB_texture_cube_map", ARB_TEXTURE_CUBE_MAP, 0 }, @@ -376,11 +379,9 @@ static ULONG WINAPI IWineD3DImpl_Release(IWineD3D *iface) { return ref; } -/* Set the shader type for this device, depending on the given capabilities, - * the device type, and the user preferences in wined3d_settings */ - -static void select_shader_mode(const struct wined3d_gl_info *gl_info, - WINED3DDEVTYPE DeviceType, int *ps_selected, int *vs_selected) +/* Set the shader type for this device, depending on the given capabilities + * and the user preferences in wined3d_settings. */ +static void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected, int *vs_selected) { if (wined3d_settings.vs_mode == VS_NONE) { *vs_selected = SHADER_NONE; @@ -789,7 +790,7 @@ struct driver_quirk const char *description; }; -struct driver_quirk quirk_table[] = +static const struct driver_quirk quirk_table[] = { { match_ati_r300_to_500, @@ -987,7 +988,8 @@ static GL_Vendors wined3d_guess_vendor(const char *gl_vendor, const char *gl_ren return VENDOR_INTEL; if (strstr(gl_vendor, "Mesa") - || strstr(gl_vendor, "Tungsten Graphics, Inc.")) + || strstr(gl_vendor, "DRI R300 Project") + || strstr(gl_vendor, "Tungsten Graphics, Inc")) return VENDOR_MESA; FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning VENDOR_WINE.\n", debugstr_a(gl_vendor)); @@ -1872,10 +1874,63 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_gl_info *gl_info) * shaders), but 8 texture stages (register combiners). */ gl_info->max_sampler_stages = max(gl_info->max_fragment_samplers, gl_info->max_texture_stages); - /* We can only use ORM_FBO when the hardware supports it. */ - if (wined3d_settings.offscreen_rendering_mode == ORM_FBO && !gl_info->supported[EXT_FRAMEBUFFER_OBJECT]) { - WARN_(d3d_caps)("GL_EXT_framebuffer_object not supported, falling back to backbuffer offscreen rendering mode.\n"); - wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER; + if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT]) + { + gl_info->fbo_ops.glIsRenderbuffer = gl_info->glIsRenderbuffer; + gl_info->fbo_ops.glBindRenderbuffer = gl_info->glBindRenderbuffer; + gl_info->fbo_ops.glDeleteRenderbuffers = gl_info->glDeleteRenderbuffers; + gl_info->fbo_ops.glGenRenderbuffers = gl_info->glGenRenderbuffers; + gl_info->fbo_ops.glRenderbufferStorage = gl_info->glRenderbufferStorage; + gl_info->fbo_ops.glRenderbufferStorageMultisample = gl_info->glRenderbufferStorageMultisample; + gl_info->fbo_ops.glGetRenderbufferParameteriv = gl_info->glGetRenderbufferParameteriv; + gl_info->fbo_ops.glIsFramebuffer = gl_info->glIsFramebuffer; + gl_info->fbo_ops.glBindFramebuffer = gl_info->glBindFramebuffer; + gl_info->fbo_ops.glDeleteFramebuffers = gl_info->glDeleteFramebuffers; + gl_info->fbo_ops.glGenFramebuffers = gl_info->glGenFramebuffers; + gl_info->fbo_ops.glCheckFramebufferStatus = gl_info->glCheckFramebufferStatus; + gl_info->fbo_ops.glFramebufferTexture1D = gl_info->glFramebufferTexture1D; + gl_info->fbo_ops.glFramebufferTexture2D = gl_info->glFramebufferTexture2D; + gl_info->fbo_ops.glFramebufferTexture3D = gl_info->glFramebufferTexture3D; + gl_info->fbo_ops.glFramebufferRenderbuffer = gl_info->glFramebufferRenderbuffer; + gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv = gl_info->glGetFramebufferAttachmentParameteriv; + gl_info->fbo_ops.glBlitFramebuffer = gl_info->glBlitFramebuffer; + gl_info->fbo_ops.glGenerateMipmap = gl_info->glGenerateMipmap; + } + else + { + if (gl_info->supported[EXT_FRAMEBUFFER_OBJECT]) + { + gl_info->fbo_ops.glIsRenderbuffer = gl_info->glIsRenderbufferEXT; + gl_info->fbo_ops.glBindRenderbuffer = gl_info->glBindRenderbufferEXT; + gl_info->fbo_ops.glDeleteRenderbuffers = gl_info->glDeleteRenderbuffersEXT; + gl_info->fbo_ops.glGenRenderbuffers = gl_info->glGenRenderbuffersEXT; + gl_info->fbo_ops.glRenderbufferStorage = gl_info->glRenderbufferStorageEXT; + gl_info->fbo_ops.glGetRenderbufferParameteriv = gl_info->glGetRenderbufferParameterivEXT; + gl_info->fbo_ops.glIsFramebuffer = gl_info->glIsFramebufferEXT; + gl_info->fbo_ops.glBindFramebuffer = gl_info->glBindFramebufferEXT; + gl_info->fbo_ops.glDeleteFramebuffers = gl_info->glDeleteFramebuffersEXT; + gl_info->fbo_ops.glGenFramebuffers = gl_info->glGenFramebuffersEXT; + gl_info->fbo_ops.glCheckFramebufferStatus = gl_info->glCheckFramebufferStatusEXT; + gl_info->fbo_ops.glFramebufferTexture1D = gl_info->glFramebufferTexture1DEXT; + gl_info->fbo_ops.glFramebufferTexture2D = gl_info->glFramebufferTexture2DEXT; + gl_info->fbo_ops.glFramebufferTexture3D = gl_info->glFramebufferTexture3DEXT; + gl_info->fbo_ops.glFramebufferRenderbuffer = gl_info->glFramebufferRenderbufferEXT; + gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv = gl_info->glGetFramebufferAttachmentParameterivEXT; + gl_info->fbo_ops.glGenerateMipmap = gl_info->glGenerateMipmapEXT; + } + else if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) + { + WARN_(d3d_caps)("Framebuffer objects not supported, falling back to backbuffer offscreen rendering mode.\n"); + wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER; + } + if (gl_info->supported[EXT_FRAMEBUFFER_BLIT]) + { + gl_info->fbo_ops.glBlitFramebuffer = gl_info->glBlitFramebufferEXT; + } + if (gl_info->supported[EXT_FRAMEBUFFER_MULTISAMPLE]) + { + gl_info->fbo_ops.glRenderbufferStorageMultisample = gl_info->glRenderbufferStorageMultisampleEXT; + } } /* MRTs are currently only supported when FBOs are used. */ @@ -2021,15 +2076,15 @@ static UINT WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Ad if (mode.dmBitsPerPel == 32 || mode.dmBitsPerPel == 16) ++i; break; - case WINED3DFMT_X8R8G8B8: + case WINED3DFMT_B8G8R8X8_UNORM: if (mode.dmBitsPerPel == 32) ++i; break; - case WINED3DFMT_R5G6B5: + case WINED3DFMT_B5G6R5_UNORM: if (mode.dmBitsPerPel == 16) ++i; break; - case WINED3DFMT_P8: + case WINED3DFMT_P8_UINT: if (mode.dmBitsPerPel == 8) ++i; break; @@ -2081,13 +2136,13 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte if (DevModeW.dmBitsPerPel == 32 || DevModeW.dmBitsPerPel == 16) i++; break; - case WINED3DFMT_X8R8G8B8: + case WINED3DFMT_B8G8R8X8_UNORM: if (DevModeW.dmBitsPerPel == 32) i++; break; - case WINED3DFMT_R5G6B5: + case WINED3DFMT_B5G6R5_UNORM: if (DevModeW.dmBitsPerPel == 16) i++; break; - case WINED3DFMT_P8: + case WINED3DFMT_P8_UINT: if (DevModeW.dmBitsPerPel == 8) i++; break; default: @@ -2312,7 +2367,7 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const struct wined3 return FALSE; } - if ((format_desc->format == WINED3DFMT_D16_LOCKABLE) || (format_desc->format == WINED3DFMT_D32F_LOCKABLE)) + if ((format_desc->format == WINED3DFMT_D16_LOCKABLE) || (format_desc->format == WINED3DFMT_D32_FLOAT)) lockable = TRUE; /* On some modern cards like the Geforce8/9 GLX doesn't offer some dephthstencil formats which D3D9 reports. @@ -2495,10 +2550,10 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter * At the moment we assume that fullscreen and windowed have the same capabilities */ /* There are only 4 display formats */ - if(!((DisplayFormat == WINED3DFMT_R5G6B5) || - (DisplayFormat == WINED3DFMT_X1R5G5B5) || - (DisplayFormat == WINED3DFMT_X8R8G8B8) || - (DisplayFormat == WINED3DFMT_A2R10G10B10))) + if (!(DisplayFormat == WINED3DFMT_B5G6R5_UNORM + || DisplayFormat == WINED3DFMT_B5G5R5X1_UNORM + || DisplayFormat == WINED3DFMT_B8G8R8X8_UNORM + || DisplayFormat == WINED3DFMT_B10G10R10A2_UNORM)) { TRACE_(d3d_caps)("Format %s unsupported as display format\n", debug_d3dformat(DisplayFormat)); return WINED3DERR_NOTAVAILABLE; @@ -2518,25 +2573,32 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter } /* In FULLSCREEN mode R5G6B5 can only be mixed with backbuffer format R5G6B5 */ - if( (DisplayFormat == WINED3DFMT_R5G6B5) && (BackBufferFormat != WINED3DFMT_R5G6B5) ) { + if (DisplayFormat == WINED3DFMT_B5G6R5_UNORM && BackBufferFormat != WINED3DFMT_B5G6R5_UNORM) + { TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat)); return WINED3DERR_NOTAVAILABLE; } /* In FULLSCREEN mode X1R5G5B5 can only be mixed with backbuffer format *1R5G5B5 */ - if( (DisplayFormat == WINED3DFMT_X1R5G5B5) && !((BackBufferFormat == WINED3DFMT_X1R5G5B5) || (BackBufferFormat == WINED3DFMT_A1R5G5B5)) ) { + if (DisplayFormat == WINED3DFMT_B5G5R5X1_UNORM + && !(BackBufferFormat == WINED3DFMT_B5G5R5X1_UNORM || BackBufferFormat == WINED3DFMT_B5G5R5A1_UNORM)) + { TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat)); return WINED3DERR_NOTAVAILABLE; } /* In FULLSCREEN mode X8R8G8B8 can only be mixed with backbuffer format *8R8G8B8 */ - if( (DisplayFormat == WINED3DFMT_X8R8G8B8) && !((BackBufferFormat == WINED3DFMT_X8R8G8B8) || (BackBufferFormat == WINED3DFMT_A8R8G8B8)) ) { + if (DisplayFormat == WINED3DFMT_B8G8R8X8_UNORM + && !(BackBufferFormat == WINED3DFMT_B8G8R8X8_UNORM || BackBufferFormat == WINED3DFMT_B8G8R8A8_UNORM)) + { TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat)); return WINED3DERR_NOTAVAILABLE; } /* A2R10G10B10 is only allowed in fullscreen mode and it can only be mixed with backbuffer format A2R10G10B10 */ - if( (DisplayFormat == WINED3DFMT_A2R10G10B10) && ((BackBufferFormat != WINED3DFMT_A2R10G10B10) || Windowed)) { + if (DisplayFormat == WINED3DFMT_B10G10R10A2_UNORM + && (BackBufferFormat != WINED3DFMT_B10G10R10A2_UNORM || Windowed)) + { TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat)); return WINED3DERR_NOTAVAILABLE; } @@ -2560,8 +2622,8 @@ static BOOL CheckBumpMapCapability(struct WineD3DAdapter *adapter, { case WINED3DFMT_R8G8_SNORM: case WINED3DFMT_R16G16_SNORM: - case WINED3DFMT_L6V5U5: - case WINED3DFMT_X8L8V8U8: + case WINED3DFMT_R5G5_SNORM_L6_UNORM: + case WINED3DFMT_R8G8_SNORM_L8X8_UNORM: case WINED3DFMT_R8G8B8A8_SNORM: /* Ask the fixed function pipeline implementation if it can deal * with the conversion. If we've got a GL extension giving native @@ -2685,11 +2747,11 @@ static BOOL CheckSrgbReadCapability(struct WineD3DAdapter *adapter, const struct switch (format_desc->format) { - case WINED3DFMT_A8R8G8B8: - case WINED3DFMT_X8R8G8B8: - case WINED3DFMT_A4R4G4B4: - case WINED3DFMT_L8: - case WINED3DFMT_A8L8: + case WINED3DFMT_B8G8R8A8_UNORM: + case WINED3DFMT_B8G8R8X8_UNORM: + case WINED3DFMT_B4G4R4A4_UNORM: + case WINED3DFMT_L8_UNORM: + case WINED3DFMT_L8A8_UNORM: case WINED3DFMT_DXT1: case WINED3DFMT_DXT2: case WINED3DFMT_DXT3: @@ -2711,11 +2773,11 @@ static BOOL CheckSrgbWriteCapability(struct WineD3DAdapter *adapter, /* Only offer SRGB writing on X8R8G8B8/A8R8G8B8 when we use ARB or GLSL shaders as we are * doing the color fixup in shaders. * Note Windows drivers (at least on the Geforce 8800) also offer this on R5G6B5. */ - if ((format_desc->format == WINED3DFMT_X8R8G8B8) || (format_desc->format == WINED3DFMT_A8R8G8B8)) + if ((format_desc->format == WINED3DFMT_B8G8R8X8_UNORM) || (format_desc->format == WINED3DFMT_B8G8R8A8_UNORM)) { int vs_selected_mode; int ps_selected_mode; - select_shader_mode(&adapter->gl_info, DeviceType, &ps_selected_mode, &vs_selected_mode); + select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode); if((ps_selected_mode == SHADER_ARB) || (ps_selected_mode == SHADER_GLSL)) { TRACE_(d3d_caps)("[OK]\n"); @@ -2764,48 +2826,48 @@ static BOOL CheckTextureCapability(struct WineD3DAdapter *adapter, /***** * supported: RGB(A) formats */ - case WINED3DFMT_R8G8B8: /* Enable for dx7, blacklisted for 8 and 9 above */ - case WINED3DFMT_A8R8G8B8: - case WINED3DFMT_X8R8G8B8: - case WINED3DFMT_R5G6B5: - case WINED3DFMT_X1R5G5B5: - case WINED3DFMT_A1R5G5B5: - case WINED3DFMT_A4R4G4B4: + case WINED3DFMT_B8G8R8_UNORM: /* Enable for dx7, blacklisted for 8 and 9 above */ + case WINED3DFMT_B8G8R8A8_UNORM: + case WINED3DFMT_B8G8R8X8_UNORM: + case WINED3DFMT_B5G6R5_UNORM: + case WINED3DFMT_B5G5R5X1_UNORM: + case WINED3DFMT_B5G5R5A1_UNORM: + case WINED3DFMT_B4G4R4A4_UNORM: case WINED3DFMT_A8_UNORM: - case WINED3DFMT_X4R4G4B4: + case WINED3DFMT_B4G4R4X4_UNORM: case WINED3DFMT_R8G8B8A8_UNORM: - case WINED3DFMT_X8B8G8R8: - case WINED3DFMT_A2R10G10B10: + case WINED3DFMT_R8G8B8X8_UNORM: + case WINED3DFMT_B10G10R10A2_UNORM: case WINED3DFMT_R10G10B10A2_UNORM: case WINED3DFMT_R16G16_UNORM: TRACE_(d3d_caps)("[OK]\n"); return TRUE; - case WINED3DFMT_R3G3B2: + case WINED3DFMT_B2G3R3_UNORM: TRACE_(d3d_caps)("[FAILED] - Not supported on Windows\n"); return FALSE; /***** * supported: Palettized */ - case WINED3DFMT_P8: + case WINED3DFMT_P8_UINT: TRACE_(d3d_caps)("[OK]\n"); return TRUE; - /* No Windows driver offers A8P8, so don't offer it either */ - case WINED3DFMT_A8P8: + /* No Windows driver offers WINED3DFMT_P8_UINT_A8_UNORM, so don't offer it either */ + case WINED3DFMT_P8_UINT_A8_UNORM: return FALSE; /***** * Supported: (Alpha)-Luminance */ - case WINED3DFMT_L8: - case WINED3DFMT_A8L8: - case WINED3DFMT_L16: + case WINED3DFMT_L8_UNORM: + case WINED3DFMT_L8A8_UNORM: + case WINED3DFMT_L16_UNORM: TRACE_(d3d_caps)("[OK]\n"); return TRUE; /* Not supported on Windows, thus disabled */ - case WINED3DFMT_A4L4: + case WINED3DFMT_L4A4_UNORM: TRACE_(d3d_caps)("[FAILED] - not supported on windows\n"); return FALSE; @@ -2814,13 +2876,13 @@ static BOOL CheckTextureCapability(struct WineD3DAdapter *adapter, */ case WINED3DFMT_D16_LOCKABLE: case WINED3DFMT_D16_UNORM: - case WINED3DFMT_D15S1: - case WINED3DFMT_D24X8: - case WINED3DFMT_D24X4S4: - case WINED3DFMT_D24S8: - case WINED3DFMT_D24FS8: - case WINED3DFMT_D32: - case WINED3DFMT_D32F_LOCKABLE: + case WINED3DFMT_S1_UINT_D15_UNORM: + case WINED3DFMT_X8D24_UNORM: + case WINED3DFMT_S4X4_UINT_D24_UNORM: + case WINED3DFMT_S8_UINT_D24_UNORM: + case WINED3DFMT_S8_UINT_D24_FLOAT: + case WINED3DFMT_D32_UNORM: + case WINED3DFMT_D32_FLOAT: return TRUE; /***** @@ -2828,8 +2890,8 @@ static BOOL CheckTextureCapability(struct WineD3DAdapter *adapter, * GL_NV_texture_shader). Emulated by shaders */ case WINED3DFMT_R8G8_SNORM: - case WINED3DFMT_X8L8V8U8: - case WINED3DFMT_L6V5U5: + case WINED3DFMT_R8G8_SNORM_L8X8_UNORM: + case WINED3DFMT_R5G5_SNORM_L6_UNORM: case WINED3DFMT_R8G8B8A8_SNORM: case WINED3DFMT_R16G16_SNORM: /* Ask the shader backend if it can deal with the conversion. If @@ -2864,15 +2926,15 @@ static BOOL CheckTextureCapability(struct WineD3DAdapter *adapter, case WINED3DFMT_R16_UINT: case WINED3DFMT_R32_UINT: case WINED3DFMT_R16G16B16A16_SNORM: - case WINED3DFMT_A2W10V10U10: - case WINED3DFMT_W11V11U10: + case WINED3DFMT_R10G10B10_SNORM_A2_UNORM: + case WINED3DFMT_R10G11B11_SNORM: TRACE_(d3d_caps)("[FAILED]\n"); /* Enable when implemented */ return FALSE; /***** - * WINED3DFMT_CxV8U8: Not supported right now + * WINED3DFMT_R8G8_SNORM_Cx: Not supported right now */ - case WINED3DFMT_CxV8U8: + case WINED3DFMT_R8G8_SNORM_Cx: TRACE_(d3d_caps)("[FAILED]\n"); /* Enable when implemented */ return FALSE; @@ -2891,7 +2953,7 @@ static BOOL CheckTextureCapability(struct WineD3DAdapter *adapter, /* Not supported */ case WINED3DFMT_R16G16B16A16_UNORM: - case WINED3DFMT_A8R3G3B2: + case WINED3DFMT_B2G3R3A8_UNORM: TRACE_(d3d_caps)("[FAILED]\n"); /* Enable when implemented */ return FALSE; @@ -2989,24 +3051,24 @@ static BOOL CheckSurfaceCapability(struct WineD3DAdapter *adapter, const struct if(SurfaceType == SURFACE_GDI) { switch(check_format_desc->format) { - case WINED3DFMT_R8G8B8: - case WINED3DFMT_A8R8G8B8: - case WINED3DFMT_X8R8G8B8: - case WINED3DFMT_R5G6B5: - case WINED3DFMT_X1R5G5B5: - case WINED3DFMT_A1R5G5B5: - case WINED3DFMT_A4R4G4B4: - case WINED3DFMT_R3G3B2: + case WINED3DFMT_B8G8R8_UNORM: + case WINED3DFMT_B8G8R8A8_UNORM: + case WINED3DFMT_B8G8R8X8_UNORM: + case WINED3DFMT_B5G6R5_UNORM: + case WINED3DFMT_B5G5R5X1_UNORM: + case WINED3DFMT_B5G5R5A1_UNORM: + case WINED3DFMT_B4G4R4A4_UNORM: + case WINED3DFMT_B2G3R3_UNORM: case WINED3DFMT_A8_UNORM: - case WINED3DFMT_A8R3G3B2: - case WINED3DFMT_X4R4G4B4: + case WINED3DFMT_B2G3R3A8_UNORM: + case WINED3DFMT_B4G4R4X4_UNORM: case WINED3DFMT_R10G10B10A2_UNORM: case WINED3DFMT_R8G8B8A8_UNORM: - case WINED3DFMT_X8B8G8R8: + case WINED3DFMT_R8G8B8X8_UNORM: case WINED3DFMT_R16G16_UNORM: - case WINED3DFMT_A2R10G10B10: + case WINED3DFMT_B10G10R10A2_UNORM: case WINED3DFMT_R16G16B16A16_UNORM: - case WINED3DFMT_P8: + case WINED3DFMT_P8_UINT: TRACE_(d3d_caps)("[OK]\n"); return TRUE; default: @@ -3496,12 +3558,12 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt * except of R32F. */ switch(CheckFormat) { - case WINED3DFMT_P8: - case WINED3DFMT_A4L4: + case WINED3DFMT_P8_UINT: + case WINED3DFMT_L4A4_UNORM: case WINED3DFMT_R32_FLOAT: case WINED3DFMT_R16_FLOAT: - case WINED3DFMT_X8L8V8U8: - case WINED3DFMT_L6V5U5: + case WINED3DFMT_R8G8_SNORM_L8X8_UNORM: + case WINED3DFMT_R5G5_SNORM_L6_UNORM: case WINED3DFMT_R16G16_UNORM: TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n"); return WINED3DERR_NOTAVAILABLE; @@ -3576,7 +3638,7 @@ static const shader_backend_t *select_shader_backend(struct WineD3DAdapter *adap int vs_selected_mode; int ps_selected_mode; - select_shader_mode(&adapter->gl_info, DeviceType, &ps_selected_mode, &vs_selected_mode); + select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode); if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) { ret = &glsl_shader_backend; } else if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) { @@ -3594,7 +3656,7 @@ static const struct fragment_pipeline *select_fragment_implementation(struct Win int vs_selected_mode; int ps_selected_mode; - select_shader_mode(&adapter->gl_info, DeviceType, &ps_selected_mode, &vs_selected_mode); + select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode); if((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL) && GL_SUPPORT(ARB_FRAGMENT_PROGRAM)) { return &arbfp_fragment_pipeline; } else if(ps_selected_mode == SHADER_ATI) { @@ -3614,7 +3676,7 @@ static const struct blit_shader *select_blit_implementation(struct WineD3DAdapte int vs_selected_mode; int ps_selected_mode; - select_shader_mode(&adapter->gl_info, DeviceType, &ps_selected_mode, &vs_selected_mode); + select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode); if((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL) && GL_SUPPORT(ARB_FRAGMENT_PROGRAM)) { return &arbfp_blit; } else { @@ -3644,7 +3706,7 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, return WINED3DERR_INVALIDCALL; } - select_shader_mode(&adapter->gl_info, DeviceType, &ps_selected_mode, &vs_selected_mode); + select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode); /* This function should *not* be modifying GL caps * TODO: move the functionality where it belongs */ @@ -4262,8 +4324,7 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter, object->adapterNo = Adapter; object->devType = DeviceType; - select_shader_mode(&adapter->gl_info, DeviceType, - &object->ps_selected_mode, &object->vs_selected_mode); + select_shader_mode(&adapter->gl_info, &object->ps_selected_mode, &object->vs_selected_mode); object->shader_backend = select_shader_backend(adapter, DeviceType); memset(&shader_caps, 0, sizeof(shader_caps)); @@ -4316,16 +4377,6 @@ static HRESULT WINAPI IWineD3DImpl_GetParent(IWineD3D *iface, IUnknown **pParent return WINED3D_OK; } -ULONG WINAPI D3DCB_DefaultDestroySurface(IWineD3DSurface *pSurface) { - IUnknown* surfaceParent; - TRACE("(%p) call back\n", pSurface); - - /* Now, release the parent, which will take care of cleaning up the surface for us */ - IWineD3DSurface_GetParent(pSurface, &surfaceParent); - IUnknown_Release(surfaceParent); - return IUnknown_Release(surfaceParent); -} - ULONG WINAPI D3DCB_DefaultDestroyVolume(IWineD3DVolume *pVolume) { IUnknown* volumeParent; TRACE("(%p) call back\n", pVolume); @@ -4771,7 +4822,7 @@ BOOL InitAdapters(IWineD3DImpl *This) WineD3D_ReleaseFakeGLContext(&fake_gl_ctx); - select_shader_mode(&adapter->gl_info, WINED3DDEVTYPE_HAL, &ps_selected_mode, &vs_selected_mode); + select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode); select_shader_max_constants(ps_selected_mode, vs_selected_mode, &adapter->gl_info); fillGLAttribFuncs(&adapter->gl_info); adapter->opengl = TRUE; @@ -4830,3 +4881,10 @@ const IWineD3DVtbl IWineD3D_Vtbl = IWineD3DImpl_GetDeviceCaps, IWineD3DImpl_CreateDevice }; + +static void STDMETHODCALLTYPE wined3d_null_wined3d_object_destroyed(void *parent) {} + +const struct wined3d_parent_ops wined3d_null_parent_ops = +{ + wined3d_null_wined3d_object_destroyed, +}; diff --git a/reactos/dll/directx/wine/wined3d/drawprim.c b/reactos/dll/directx/wine/wined3d/drawprim.c index 5a2c7e7aac4..e2e907fcd04 100644 --- a/reactos/dll/directx/wine/wined3d/drawprim.c +++ b/reactos/dll/directx/wine/wined3d/drawprim.c @@ -7,6 +7,7 @@ * Copyright 2005 Oliver Stieber * Copyright 2006, 2008 Henri Verbeet * Copyright 2007-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -34,26 +35,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_draw); /* GL locking is done by the caller */ static void drawStridedFast(IWineD3DDevice *iface, GLenum primitive_type, - UINT min_vertex_idx, UINT max_vertex_idx, UINT count, UINT idx_size, - const void *idx_data, UINT start_idx) + UINT count, UINT idx_size, const void *idx_data, UINT start_idx) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; if (idx_size) { - TRACE("(%p) : glElements(%x, %d, %d, ...)\n", This, primitive_type, count, min_vertex_idx); + TRACE("(%p) : glElements(%x, %d, ...)\n", This, primitive_type, count); -#if 1 glDrawElements(primitive_type, count, idx_size == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (const char *)idx_data + (idx_size * start_idx)); checkGLcall("glDrawElements"); -#else - glDrawRangeElements(primitive_type, min_vertex_idx, max_vertex_idx, count, - idx_size == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, - (const char *)idx_data + (idx_size * start_idx)); - checkGLcall("glDrawRangeElements"); -#endif } else { @@ -72,7 +65,7 @@ static void drawStridedFast(IWineD3DDevice *iface, GLenum primitive_type, /* GL locking is done by the caller */ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context *context, const struct wined3d_stream_info *si, UINT NumVertexes, GLenum glPrimType, - const void *idxData, UINT idxSize, UINT minIndex, UINT startIdx) + const void *idxData, UINT idxSize, UINT startIdx) { unsigned int textureNo = 0; const WORD *pIdxBufS = NULL; @@ -129,18 +122,19 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context glNormal3f(0, 0, 0); } + num_untracked_materials = context->num_untracked_materials; if (si->use_map & (1 << WINED3D_FFP_DIFFUSE)) { element = &si->elements[WINED3D_FFP_DIFFUSE]; diffuse = element->data + streamOffset[element->stream_idx]; + + if (num_untracked_materials && element->format_desc->format != WINED3DFMT_B8G8R8A8_UNORM) + FIXME("Implement diffuse color tracking from %s\n", debug_d3dformat(element->format_desc->format)); } else { glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } - num_untracked_materials = context->num_untracked_materials; - if (num_untracked_materials && element->format_desc->format != WINED3DFMT_A8R8G8B8) - FIXME("Implement diffuse color tracking from %s\n", debug_d3dformat(element->format_desc->format)); if (si->use_map & (1 << WINED3D_FFP_SPECULAR)) { @@ -155,7 +149,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context { if (GL_SUPPORT(EXT_FOG_COORD)) { - if (element->format_desc->format == WINED3DFMT_A8R8G8B8) specular_fog = TRUE; + if (element->format_desc->format == WINED3DFMT_B8G8R8A8_UNORM) specular_fog = TRUE; else FIXME("Implement fog coordinates from %s\n", debug_d3dformat(element->format_desc->format)); } else @@ -338,7 +332,7 @@ static inline void send_attribute(IWineD3DDeviceImpl *This, WINED3DFORMAT format case WINED3DFMT_R8G8B8A8_UINT: GL_EXTCALL(glVertexAttrib4ubvARB(index, ptr)); break; - case WINED3DFMT_A8R8G8B8: + case WINED3DFMT_B8G8R8A8_UNORM: if (GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA)) { const DWORD *src = ptr; @@ -422,7 +416,7 @@ static inline void send_attribute(IWineD3DDeviceImpl *This, WINED3DFORMAT format /* GL locking is done by the caller */ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream_info *si, UINT numberOfVertices, - GLenum glPrimitiveType, const void *idxData, UINT idxSize, UINT minIndex, UINT startIdx) + GLenum glPrimitiveType, const void *idxData, UINT idxSize, UINT startIdx) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; long SkipnStrides = startIdx + This->stateBlock->loadBaseVertexIndex; @@ -484,7 +478,7 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream /* GL locking is done by the caller */ static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wined3d_stream_info *si, - UINT numberOfVertices, GLenum glPrimitiveType, const void *idxData, UINT idxSize, UINT minIndex, + UINT numberOfVertices, GLenum glPrimitiveType, const void *idxData, UINT idxSize, UINT startIdx) { UINT numInstances = 0, i; @@ -504,7 +498,7 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wine return; } - TRACE("(%p) : glElements(%x, %d, %d, ...)\n", This, glPrimitiveType, numberOfVertices, minIndex); + TRACE("(%p) : glElements(%x, %d, ...)\n", This, glPrimitiveType, numberOfVertices); /* First, figure out how many instances we have to draw */ for(i = 0; i < MAX_STREAMS; i++) { @@ -575,8 +569,7 @@ static inline void remove_vbos(IWineD3DDeviceImpl *This, struct wined3d_stream_i } /* Routine common to the draw primitive and draw indexed primitive routines */ -void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertices, - UINT StartIdx, UINT idxSize, const void *idxData, UINT minIndex) +void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT idxSize, const void *idxData) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; @@ -627,8 +620,6 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertice const struct wined3d_stream_info *stream_info = &This->strided_streams; struct wined3d_stream_info stridedlcl; - if (!numberOfVertices) numberOfVertices = index_count; - if (!use_vs(This->stateBlock)) { if (!This->strided_streams.position_transformed && context->num_untracked_materials @@ -676,18 +667,17 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertice } else { TRACE("Using immediate mode with vertex shaders for half float emulation\n"); } - drawStridedSlowVs(iface, stream_info, index_count, glPrimType, idxData, idxSize, minIndex, StartIdx); + drawStridedSlowVs(iface, stream_info, index_count, glPrimType, idxData, idxSize, StartIdx); } else { drawStridedSlow(iface, context, stream_info, index_count, - glPrimType, idxData, idxSize, minIndex, StartIdx); + glPrimType, idxData, idxSize, StartIdx); } } else if(This->instancedDraw) { /* Instancing emulation with mixing immediate mode and arrays */ drawStridedInstanced(iface, &This->strided_streams, index_count, - glPrimType, idxData, idxSize, minIndex, StartIdx); + glPrimType, idxData, idxSize, StartIdx); } else { - drawStridedFast(iface, glPrimType, minIndex, minIndex + numberOfVertices - 1, - index_count, idxSize, idxData, StartIdx); + drawStridedFast(iface, glPrimType, index_count, idxSize, idxData, StartIdx); } } diff --git a/reactos/dll/directx/wine/wined3d/glsl_shader.c b/reactos/dll/directx/wine/wined3d/glsl_shader.c index b6fac0cb0ee..cf61117d4f7 100644 --- a/reactos/dll/directx/wine/wined3d/glsl_shader.c +++ b/reactos/dll/directx/wine/wined3d/glsl_shader.c @@ -187,14 +187,14 @@ static void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLhandleA static const char * const spam[] = { "Vertex shader was successfully compiled to run on hardware.\n", /* fglrx */ - "Fragment shader was successfully compiled to run on hardware.\n", /* fglrx */ + "Fragment shader was successfully compiled to run on hardware.\n", /* fglrx, with \n */ + "Fragment shader was successfully compiled to run on hardware.", /* fglrx, no \n */ "Fragment shader(s) linked, vertex shader(s) linked. \n ", /* fglrx, with \n */ "Fragment shader(s) linked, vertex shader(s) linked.", /* fglrx, no \n */ "Vertex shader(s) linked, no fragment shader(s) defined. \n ", /* fglrx, with \n */ "Vertex shader(s) linked, no fragment shader(s) defined.", /* fglrx, no \n */ - "Fragment shader was successfully compiled to run on hardware.\n" - "Fragment shader(s) linked, no vertex shader(s) defined.", /* fglrx, no \n */ "Fragment shader(s) linked, no vertex shader(s) defined. \n ", /* fglrx, with \n */ + "Fragment shader(s) linked, no vertex shader(s) defined.", /* fglrx, no \n */ }; if (!TRACE_ON(d3d_shader) && !FIXME_ON(d3d_shader)) return; @@ -3880,10 +3880,16 @@ static GLhandleARB find_glsl_pshader(const struct wined3d_context *context, struct ps_np2fixup_info *np2fixup = NULL; GLhandleARB ret; - if(!shader->backend_priv) { - shader->backend_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data)); + if (!shader->baseShader.backend_data) + { + shader->baseShader.backend_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data)); + if (!shader->baseShader.backend_data) + { + ERR("Failed to allocate backend data.\n"); + return 0; + } } - shader_data = shader->backend_priv; + shader_data = shader->baseShader.backend_data; /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2), * so a linear search is more performant than a hashmap or a binary search @@ -3949,10 +3955,16 @@ static GLhandleARB find_glsl_vshader(const struct wined3d_context *context, struct glsl_vshader_private *shader_data; GLhandleARB ret; - if(!shader->backend_priv) { - shader->backend_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data)); + if (!shader->baseShader.backend_data) + { + shader->baseShader.backend_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data)); + if (!shader->baseShader.backend_data) + { + ERR("Failed to allocate backend data.\n"); + return 0; + } } - shader_data = shader->backend_priv; + shader_data = shader->baseShader.backend_data; /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2), * so a linear search is more performant than a hashmap or a binary search @@ -4351,11 +4363,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { if(pshader) { struct glsl_pshader_private *shader_data; ps = (IWineD3DPixelShaderImpl *) This; - shader_data = ps->backend_priv; + shader_data = ps->baseShader.backend_data; if(!shader_data || shader_data->num_gl_shaders == 0) { HeapFree(GetProcessHeap(), 0, shader_data); - ps->backend_priv = NULL; + ps->baseShader.backend_data = NULL; return; } @@ -4371,11 +4383,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { } else { struct glsl_vshader_private *shader_data; vs = (IWineD3DVertexShaderImpl *) This; - shader_data = vs->backend_priv; + shader_data = vs->baseShader.backend_data; if(!shader_data || shader_data->num_gl_shaders == 0) { HeapFree(GetProcessHeap(), 0, shader_data); - vs->backend_priv = NULL; + vs->baseShader.backend_data = NULL; return; } @@ -4411,7 +4423,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { if(pshader) { UINT i; - struct glsl_pshader_private *shader_data = ps->backend_priv; + struct glsl_pshader_private *shader_data = ps->baseShader.backend_data; ENTER_GL(); for(i = 0; i < shader_data->num_gl_shaders; i++) { @@ -4422,10 +4434,10 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { LEAVE_GL(); HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); HeapFree(GetProcessHeap(), 0, shader_data); - ps->backend_priv = NULL; + ps->baseShader.backend_data = NULL; } else { UINT i; - struct glsl_vshader_private *shader_data = vs->backend_priv; + struct glsl_vshader_private *shader_data = vs->baseShader.backend_data; ENTER_GL(); for(i = 0; i < shader_data->num_gl_shaders; i++) { @@ -4436,7 +4448,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { LEAVE_GL(); HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); HeapFree(GetProcessHeap(), 0, shader_data); - vs->backend_priv = NULL; + vs->baseShader.backend_data = NULL; } } diff --git a/reactos/dll/directx/wine/wined3d/pixelshader.c b/reactos/dll/directx/wine/wined3d/pixelshader.c index 6ac145c1ae2..00f04e927b5 100644 --- a/reactos/dll/directx/wine/wined3d/pixelshader.c +++ b/reactos/dll/directx/wine/wined3d/pixelshader.c @@ -7,6 +7,7 @@ * Copyright 2005 Oliver Stieber * Copyright 2006 Ivan Gyurdiev * Copyright 2007-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -71,6 +72,7 @@ static ULONG WINAPI IWineD3DPixelShaderImpl_Release(IWineD3DPixelShader *iface) if (!refcount) { shader_cleanup((IWineD3DBaseShader *)iface); + This->baseShader.parent_ops->wined3d_object_destroyed(This->baseShader.parent); HeapFree(GetProcessHeap(), 0, This); } @@ -84,7 +86,7 @@ static ULONG WINAPI IWineD3DPixelShaderImpl_Release(IWineD3DPixelShader *iface) static HRESULT WINAPI IWineD3DPixelShaderImpl_GetParent(IWineD3DPixelShader *iface, IUnknown** parent){ IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface; - *parent = This->parent; + *parent = This->baseShader.parent; IUnknown_AddRef(*parent); TRACE("(%p) : returning %p\n", This, *parent); return WINED3D_OK; @@ -208,50 +210,51 @@ static void pshader_set_limits(IWineD3DPixelShaderImpl *This) } } -static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *iface, - const DWORD *pFunction, const struct wined3d_shader_signature *output_signature) +static HRESULT pixelshader_set_function(IWineD3DPixelShaderImpl *shader, + const DWORD *byte_code, const struct wined3d_shader_signature *output_signature) { - IWineD3DPixelShaderImpl *This =(IWineD3DPixelShaderImpl *)iface; + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; unsigned int i, highest_reg_used = 0, num_regs_used = 0; - shader_reg_maps *reg_maps = &This->baseShader.reg_maps; + shader_reg_maps *reg_maps = &shader->baseShader.reg_maps; const struct wined3d_shader_frontend *fe; HRESULT hr; - TRACE("(%p) : pFunction %p\n", iface, pFunction); + TRACE("shader %p, byte_code %p, output_signature %p.\n", shader, byte_code, output_signature); - fe = shader_select_frontend(*pFunction); + fe = shader_select_frontend(*byte_code); if (!fe) { FIXME("Unable to find frontend for shader.\n"); return WINED3DERR_INVALIDCALL; } - This->baseShader.frontend = fe; - This->baseShader.frontend_data = fe->shader_init(pFunction, output_signature); - if (!This->baseShader.frontend_data) + shader->baseShader.frontend = fe; + shader->baseShader.frontend_data = fe->shader_init(byte_code, output_signature); + if (!shader->baseShader.frontend_data) { FIXME("Failed to initialize frontend.\n"); return WINED3DERR_INVALIDCALL; } /* First pass: trace shader */ - if (TRACE_ON(d3d_shader)) shader_trace_init(fe, This->baseShader.frontend_data, pFunction); + if (TRACE_ON(d3d_shader)) shader_trace_init(fe, shader->baseShader.frontend_data, byte_code); /* Initialize immediate constant lists */ - list_init(&This->baseShader.constantsF); - list_init(&This->baseShader.constantsB); - list_init(&This->baseShader.constantsI); + list_init(&shader->baseShader.constantsF); + list_init(&shader->baseShader.constantsB); + list_init(&shader->baseShader.constantsI); /* Second pass: figure out which registers are used, what the semantics are, etc.. */ - hr = shader_get_registers_used((IWineD3DBaseShader *)This, fe, - reg_maps, NULL, This->input_signature, NULL, - pFunction, GL_LIMITS(pshader_constantsF)); + hr = shader_get_registers_used((IWineD3DBaseShader *)shader, fe, + reg_maps, NULL, shader->input_signature, NULL, + byte_code, gl_info->max_pshader_constantsF); if (FAILED(hr)) return hr; - pshader_set_limits(This); + pshader_set_limits(shader); for (i = 0; i < MAX_REG_INPUT; ++i) { - if (This->input_reg_used[i]) + if (shader->input_reg_used[i]) { ++num_regs_used; highest_reg_used = i; @@ -260,10 +263,10 @@ static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *i /* Don't do any register mapping magic if it is not needed, or if we can't * achieve anything anyway */ - if (highest_reg_used < (GL_LIMITS(glsl_varyings) / 4) - || num_regs_used > (GL_LIMITS(glsl_varyings) / 4)) + if (highest_reg_used < (gl_info->max_glsl_varyings / 4) + || num_regs_used > (gl_info->max_glsl_varyings / 4)) { - if (num_regs_used > (GL_LIMITS(glsl_varyings) / 4)) + if (num_regs_used > (gl_info->max_glsl_varyings / 4)) { /* This happens with relative addressing. The input mapper function * warns about this if the higher registers are declared too, so @@ -273,28 +276,28 @@ static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *i for (i = 0; i < MAX_REG_INPUT; ++i) { - This->input_reg_map[i] = i; + shader->input_reg_map[i] = i; } - This->declared_in_count = highest_reg_used + 1; + shader->declared_in_count = highest_reg_used + 1; } else { - This->declared_in_count = 0; + shader->declared_in_count = 0; for (i = 0; i < MAX_REG_INPUT; ++i) { - if (This->input_reg_used[i]) This->input_reg_map[i] = This->declared_in_count++; - else This->input_reg_map[i] = ~0U; + if (shader->input_reg_used[i]) shader->input_reg_map[i] = shader->declared_in_count++; + else shader->input_reg_map[i] = ~0U; } } - This->baseShader.load_local_constsF = FALSE; + shader->baseShader.load_local_constsF = FALSE; - TRACE("(%p) : Copying the function\n", This); + TRACE("(%p) : Copying byte code.\n", shader); - This->baseShader.function = HeapAlloc(GetProcessHeap(), 0, This->baseShader.functionLength); - if (!This->baseShader.function) return E_OUTOFMEMORY; - memcpy(This->baseShader.function, pFunction, This->baseShader.functionLength); + shader->baseShader.function = HeapAlloc(GetProcessHeap(), 0, shader->baseShader.functionLength); + if (!shader->baseShader.function) return E_OUTOFMEMORY; + memcpy(shader->baseShader.function, byte_code, shader->baseShader.functionLength); return WINED3D_OK; } @@ -343,7 +346,7 @@ void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, IWineD3DBaseT } } -const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl = +static const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl = { /*** IUnknown methods ***/ IWineD3DPixelShaderImpl_QueryInterface, @@ -352,10 +355,9 @@ const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl = /*** IWineD3DBase methods ***/ IWineD3DPixelShaderImpl_GetParent, /*** IWineD3DBaseShader methods ***/ - IWineD3DPixelShaderImpl_SetFunction, - /*** IWineD3DPixelShader methods ***/ IWineD3DPixelShaderImpl_GetDevice, IWineD3DPixelShaderImpl_GetFunction + /*** IWineD3DPixelShader methods ***/ }; void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, struct ps_compile_args *args) { @@ -421,3 +423,25 @@ void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImp } } } + +HRESULT pixelshader_init(IWineD3DPixelShaderImpl *shader, IWineD3DDeviceImpl *device, + const DWORD *byte_code, const struct wined3d_shader_signature *output_signature, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) +{ + HRESULT hr; + + if (!byte_code) return WINED3DERR_INVALIDCALL; + + shader->lpVtbl = &IWineD3DPixelShader_Vtbl; + shader_init(&shader->baseShader, device, parent, parent_ops); + + hr = pixelshader_set_function(shader, byte_code, output_signature); + if (FAILED(hr)) + { + WARN("Failed to set function, hr %#x.\n", hr); + shader_cleanup((IWineD3DBaseShader *)shader); + return hr; + } + + return WINED3D_OK; +} diff --git a/reactos/dll/directx/wine/wined3d/resource.c b/reactos/dll/directx/wine/wined3d/resource.c index 89ea7f3794d..17f336d4966 100644 --- a/reactos/dll/directx/wine/wined3d/resource.c +++ b/reactos/dll/directx/wine/wined3d/resource.c @@ -5,6 +5,7 @@ * Copyright 2003-2004 Raphael Junqueira * Copyright 2004 Christian Costa * Copyright 2005 Oliver Stieber + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -28,7 +29,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc, - WINED3DPOOL pool, IUnknown *parent) + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { struct IWineD3DResourceClass *resource = &((IWineD3DResourceImpl *)iface)->resource; @@ -41,6 +42,7 @@ HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type resource->usage = usage; resource->size = size; resource->priority = 0; + resource->parent_ops = parent_ops; list_init(&resource->privateData); if (size) diff --git a/reactos/dll/directx/wine/wined3d/state.c b/reactos/dll/directx/wine/wined3d/state.c index 2df21addfcf..944d8f70d88 100644 --- a/reactos/dll/directx/wine/wined3d/state.c +++ b/reactos/dll/directx/wine/wined3d/state.c @@ -8,6 +8,7 @@ * Copyright 2005 Oliver Stieber * Copyright 2006 Henri Verbeet * Copyright 2006-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -1842,6 +1843,14 @@ static void state_ckeyblend(DWORD state, IWineD3DStateBlockImpl *stateblock, str } } +static void state_swvp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) +{ + if (stateblock->renderState[WINED3DRS_SOFTWAREVERTEXPROCESSING]) + { + FIXME("Software vertex processing not implemented.\n"); + } +} + /* Set texture operations up - The following avoids lots of ifdefs in this routine!*/ #if defined (GL_VERSION_1_3) # define useext(A) A @@ -4059,7 +4068,7 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock, case WINED3DFMT_R8G8B8A8_UINT: GL_EXTCALL(glVertexAttrib4NubvARB(i, ptr)); break; - case WINED3DFMT_A8R8G8B8: + case WINED3DFMT_B8G8R8A8_UNORM: if (GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA)) { const DWORD *src = (const DWORD *)ptr; @@ -4964,6 +4973,7 @@ const struct StateEntryTemplate misc_state_template[] = { { STATE_RENDER(WINED3DRS_WRAP15), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_EXTENTS), { STATE_RENDER(WINED3DRS_EXTENTS), state_extents }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_COLORKEYBLENDENABLE), { STATE_RENDER(WINED3DRS_COLORKEYBLENDENABLE), state_ckeyblend }, WINED3D_GL_EXT_NONE }, + { STATE_RENDER(WINED3DRS_SOFTWAREVERTEXPROCESSING), { STATE_RENDER(WINED3DRS_SOFTWAREVERTEXPROCESSING), state_swvp }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_PATCHEDGESTYLE), { STATE_RENDER(WINED3DRS_PATCHEDGESTYLE), state_patchedgestyle}, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_PATCHSEGMENTS), { STATE_RENDER(WINED3DRS_PATCHSEGMENTS), state_patchsegments }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3DRS_POSITIONDEGREE), { STATE_RENDER(WINED3DRS_POSITIONDEGREE), state_positiondegree}, WINED3D_GL_EXT_NONE }, diff --git a/reactos/dll/directx/wine/wined3d/stateblock.c b/reactos/dll/directx/wine/wined3d/stateblock.c index 239b777cef6..feb980862c1 100644 --- a/reactos/dll/directx/wine/wined3d/stateblock.c +++ b/reactos/dll/directx/wine/wined3d/stateblock.c @@ -842,8 +842,9 @@ should really perform a delta so that only the changes get updated*/ This->wineD3DDevice->updateStateBlock->gl_primitive_type = This->gl_primitive_type; } - if (This->changed.indices) { - IWineD3DDevice_SetIndices(pDevice, This->pIndexData, This->IndexFmt); + if (This->changed.indices) + { + IWineD3DDevice_SetIndexBuffer(pDevice, This->pIndexData, This->IndexFmt); IWineD3DDevice_SetBaseVertexIndex(pDevice, This->baseVertexIndex); } @@ -1025,7 +1026,7 @@ should really perform a delta so that only the changes get updated*/ IWineD3DDevice_SetTransform(pDevice, i, &This->transforms[i]); } This->wineD3DDevice->updateStateBlock->gl_primitive_type = This->gl_primitive_type; - IWineD3DDevice_SetIndices(pDevice, This->pIndexData, This->IndexFmt); + IWineD3DDevice_SetIndexBuffer(pDevice, This->pIndexData, This->IndexFmt); IWineD3DDevice_SetBaseVertexIndex(pDevice, This->baseVertexIndex); IWineD3DDevice_SetVertexDeclaration(pDevice, This->vertexDecl); IWineD3DDevice_SetMaterial(pDevice, &This->material); diff --git a/reactos/dll/directx/wine/wined3d/surface.c b/reactos/dll/directx/wine/wined3d/surface.c index cce613c6657..9d69c96cbb8 100644 --- a/reactos/dll/directx/wine/wined3d/surface.c +++ b/reactos/dll/directx/wine/wined3d/surface.c @@ -10,6 +10,7 @@ * Copyright 2006-2008 Stefan Dösinger for CodeWeavers * Copyright 2007-2008 Henri Verbeet * Copyright 2006-2008 Roderick Colenbrander + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -69,7 +70,7 @@ static void surface_cleanup(IWineD3DSurfaceImpl *This) LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &This->renderbuffers, renderbuffer_entry_t, entry) { - GL_EXTCALL(glDeleteRenderbuffersEXT(1, &entry->id)); + gl_info->fbo_ops.glDeleteRenderbuffers(1, &entry->id); HeapFree(GetProcessHeap(), 0, entry); } @@ -122,7 +123,7 @@ UINT surface_calculate_size(const struct GlPixelFormatDesc *format_desc, UINT al HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment, UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type, UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, - WINED3DPOOL pool, IUnknown *parent) + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, &GLINFO_LOCATION); @@ -159,7 +160,7 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, } hr = resource_init((IWineD3DResource *)surface, WINED3DRTYPE_SURFACE, - device, resource_size, usage, format_desc, pool, parent); + device, resource_size, usage, format_desc, pool, parent, parent_ops); if (FAILED(hr)) { WARN("Failed to initialize resource, returning %#x.\n", hr); @@ -333,7 +334,7 @@ static BOOL primary_render_target_is_p8(IWineD3DDeviceImpl *device) if (device->render_targets && device->render_targets[0]) { IWineD3DSurfaceImpl* render_target = (IWineD3DSurfaceImpl*)device->render_targets[0]; if ((render_target->resource.usage & WINED3DUSAGE_RENDERTARGET) - && (render_target->resource.format_desc->format == WINED3DFMT_P8)) + && (render_target->resource.format_desc->format == WINED3DFMT_P8_UINT)) return TRUE; } return FALSE; @@ -350,7 +351,7 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) { const struct GlPixelFormatDesc *format_desc = This->resource.format_desc; /* Only support read back of converted P8 surfaces */ - if (This->Flags & SFLAG_CONVERTED && format_desc->format != WINED3DFMT_P8) + if (This->Flags & SFLAG_CONVERTED && format_desc->format != WINED3DFMT_P8_UINT) { FIXME("Read back converted textures unsupported, format=%s\n", debug_d3dformat(format_desc->format)); return; @@ -389,7 +390,7 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) { int dst_pitch = 0; /* In case of P8 the index is stored in the alpha component if the primary render target uses P8 */ - if (format_desc->format == WINED3DFMT_P8 && primary_render_target_is_p8(This->resource.wineD3DDevice)) + if (format_desc->format == WINED3DFMT_P8_UINT && primary_render_target_is_p8(This->resource.wineD3DDevice)) { format = GL_ALPHA; type = GL_UNSIGNED_BYTE; @@ -609,6 +610,7 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal, /* GL locking is done by the caller */ void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int width, unsigned int height) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; + const struct wined3d_gl_info *gl_info = &This->resource.wineD3DDevice->adapter->gl_info; renderbuffer_entry_t *entry; GLuint renderbuffer = 0; unsigned int src_width, src_height; @@ -620,7 +622,9 @@ void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int wi if (width > src_width || height > src_height) return; /* Remove any renderbuffer set if the sizes match */ - if (width == src_width && height == src_height) { + if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT] + || (width == src_width && height == src_height)) + { This->current_renderbuffer = NULL; return; } @@ -635,10 +639,10 @@ void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int wi } if (!renderbuffer) { - GL_EXTCALL(glGenRenderbuffersEXT(1, &renderbuffer)); - GL_EXTCALL(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderbuffer)); - GL_EXTCALL(glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, - This->resource.format_desc->glInternal, width, height)); + gl_info->fbo_ops.glGenRenderbuffers(1, &renderbuffer); + gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); + gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, + This->resource.format_desc->glInternal, width, height); entry = HeapAlloc(GetProcessHeap(), 0, sizeof(renderbuffer_entry_t)); entry->width = width; @@ -727,6 +731,7 @@ static ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface) if (!ref) { surface_cleanup(This); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); TRACE("(%p) Released.\n", This); HeapFree(GetProcessHeap(), 0, This); @@ -759,8 +764,8 @@ void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb) ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD); } - if (This->resource.format_desc->format == WINED3DFMT_P8 - || This->resource.format_desc->format == WINED3DFMT_A8P8) + if (This->resource.format_desc->format == WINED3DFMT_P8_UINT + || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) { if(palette9_changed(This)) { TRACE("Reloading surface because the d3d8/9 palette was changed\n"); @@ -812,6 +817,8 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) { IWineD3DBaseTexture *texture = NULL; IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; + const struct wined3d_context *context; + const struct wined3d_gl_info *gl_info; renderbuffer_entry_t *entry, *entry2; TRACE("(%p)\n", iface); @@ -842,7 +849,8 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) { IWineD3DSurface_ModifyLocation(iface, SFLAG_INSRGBTEX, FALSE); This->Flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED); - ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD); + context = ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD); + gl_info = context->gl_info; /* Destroy PBOs, but load them into real sysmem before */ if(This->Flags & SFLAG_PBO) { @@ -855,7 +863,7 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) { */ LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &This->renderbuffers, renderbuffer_entry_t, entry) { ENTER_GL(); - GL_EXTCALL(glDeleteRenderbuffersEXT(1, &entry->id)); + gl_info->fbo_ops.glDeleteRenderbuffers(1, &entry->id); LEAVE_GL(); list_remove(&entry->entry); HeapFree(GetProcessHeap(), 0, entry); @@ -952,7 +960,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, CONST RECT *rect, v switch(This->resource.format_desc->format) { - case WINED3DFMT_P8: + case WINED3DFMT_P8_UINT: { if(primary_render_target_is_p8(myDevice)) { /* In case of P8 render targets the index is stored in the alpha component */ @@ -1058,7 +1066,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, CONST RECT *rect, v row = HeapAlloc(GetProcessHeap(), 0, len); if(!row) { ERR("Out of memory\n"); - if (This->resource.format_desc->format == WINED3DFMT_P8) HeapFree(GetProcessHeap(), 0, mem); + if (This->resource.format_desc->format == WINED3DFMT_P8_UINT) HeapFree(GetProcessHeap(), 0, mem); LEAVE_GL(); return; } @@ -1088,7 +1096,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, CONST RECT *rect, v * the same color but we have no choice. * In case of P8 render targets, the index is stored in the alpha component so no conversion is needed. */ - if ((This->resource.format_desc->format == WINED3DFMT_P8) && !primary_render_target_is_p8(myDevice)) + if (This->resource.format_desc->format == WINED3DFMT_P8_UINT && !primary_render_target_is_p8(myDevice)) { const PALETTEENTRY *pal = NULL; DWORD width = pitch / 3; @@ -1589,20 +1597,12 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD if (This->Flags & SFLAG_LOCKED) return WINED3DERR_INVALIDCALL; - /* According to Direct3D9 docs, only these formats are supported */ - if (((IWineD3DImpl *)This->resource.wineD3DDevice->wineD3D)->dxVersion > 7) { - if (This->resource.format_desc->format != WINED3DFMT_R5G6B5 - && This->resource.format_desc->format != WINED3DFMT_X1R5G5B5 - && This->resource.format_desc->format != WINED3DFMT_R8G8B8 - && This->resource.format_desc->format != WINED3DFMT_X8R8G8B8) - return WINED3DERR_INVALIDCALL; - } - memset(&lock, 0, sizeof(lock)); /* To be sure */ /* Create a DIB section if there isn't a hdc yet */ if(!This->hDC) { - IWineD3DBaseSurfaceImpl_CreateDIBSection(iface); + hr = IWineD3DBaseSurfaceImpl_CreateDIBSection(iface); + if(FAILED(hr)) return WINED3DERR_INVALIDCALL; if(This->Flags & SFLAG_CLIENT) { surface_internal_preload(iface, SRGB_RGB); } @@ -1629,8 +1629,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD return hr; } - if (This->resource.format_desc->format == WINED3DFMT_P8 - || This->resource.format_desc->format == WINED3DFMT_A8P8) + if (This->resource.format_desc->format == WINED3DFMT_P8_UINT + || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) { /* GetDC on palettized formats is unsupported in D3D9, and the method is missing in D3D8, so this should only be used for DX <=7 surfaces (with non-device palettes) */ @@ -1722,7 +1722,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ /* Ok, now look if we have to do any conversion */ switch(This->resource.format_desc->format) { - case WINED3DFMT_P8: + case WINED3DFMT_P8_UINT: /* **************** Paletted Texture **************** */ @@ -1757,7 +1757,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ break; - case WINED3DFMT_R3G3B2: + case WINED3DFMT_B2G3R3_UNORM: /* ********************** GL_UNSIGNED_BYTE_3_3_2 ********************** */ @@ -1768,7 +1768,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ } break; - case WINED3DFMT_R5G6B5: + case WINED3DFMT_B5G6R5_UNORM: if (colorkey_active) { *convert = CONVERT_CK_565; *format = GL_RGBA; @@ -1777,7 +1777,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ } break; - case WINED3DFMT_X1R5G5B5: + case WINED3DFMT_B5G5R5X1_UNORM: if (colorkey_active) { *convert = CONVERT_CK_5551; *format = GL_BGRA; @@ -1786,7 +1786,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ } break; - case WINED3DFMT_R8G8B8: + case WINED3DFMT_B8G8R8_UNORM: if (colorkey_active) { *convert = CONVERT_CK_RGB24; *format = GL_RGBA; @@ -1796,7 +1796,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ } break; - case WINED3DFMT_X8R8G8B8: + case WINED3DFMT_B8G8R8X8_UNORM: if (colorkey_active) { *convert = CONVERT_RGB32_888; *format = GL_RGBA; @@ -1813,7 +1813,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ *target_bpp = 3; break; - case WINED3DFMT_L6V5U5: + case WINED3DFMT_R5G5_SNORM_L6_UNORM: *convert = CONVERT_L6V5U5; if(GL_SUPPORT(NV_TEXTURE_SHADER)) { *target_bpp = 3; @@ -1826,7 +1826,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ } break; - case WINED3DFMT_X8L8V8U8: + case WINED3DFMT_R8G8_SNORM_L8X8_UNORM: *convert = CONVERT_X8L8V8U8; *target_bpp = 4; if(GL_SUPPORT(NV_TEXTURE_SHADER)) { @@ -1858,8 +1858,8 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ *target_bpp = 6; break; - case WINED3DFMT_A4L4: - /* A4L4 exists as an internal gl format, but for some reason there is not + case WINED3DFMT_L4A4_UNORM: + /* WINED3DFMT_L4A4_UNORM exists as an internal gl format, but for some reason there is not * format+type combination to load it. Thus convert it to A8L8, then load it * with A4L4 internal, but A8L8 format+type */ @@ -1890,22 +1890,24 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ *target_bpp = 12; break; - case WINED3DFMT_D15S1: - if (GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL)) + case WINED3DFMT_S1_UINT_D15_UNORM: + if (GL_SUPPORT(ARB_FRAMEBUFFER_OBJECT) + || GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL)) { *convert = CONVERT_D15S1; *target_bpp = 4; } break; - case WINED3DFMT_D24X4S4: - if (GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL)) + case WINED3DFMT_S4X4_UINT_D24_UNORM: + if (GL_SUPPORT(ARB_FRAMEBUFFER_OBJECT) + || GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL)) { *convert = CONVERT_D24X4S4; } break; - case WINED3DFMT_D24FS8: + case WINED3DFMT_S8_UINT_D24_FLOAT: if (GL_SUPPORT(ARB_DEPTH_BUFFER_FLOAT)) { *convert = CONVERT_D24FS8; @@ -2505,8 +2507,8 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve BOOL palette9_changed(IWineD3DSurfaceImpl *This) { IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; - if (This->palette || (This->resource.format_desc->format != WINED3DFMT_P8 - && This->resource.format_desc->format != WINED3DFMT_A8P8)) + if (This->palette || (This->resource.format_desc->format != WINED3DFMT_P8_UINT + && This->resource.format_desc->format != WINED3DFMT_P8_UINT_A8_UNORM)) { /* If a ddraw-style palette is attached assume no d3d9 palette change. * Also the palette isn't interesting if the surface format isn't P8 or A8P8 @@ -3096,6 +3098,11 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D checkGLcall("glCopyTexSubImage2D"); LEAVE_GL(); + + /* The texture is now most up to date - If the surface is a render target and has a drawable, this + * path is never entered + */ + IWineD3DSurface_ModifyLocation((IWineD3DSurface *) This, SFLAG_INTEXTURE, TRUE); } /* Uses the hardware to stretch and flip the image */ @@ -3343,6 +3350,11 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine } LEAVE_GL(); + + /* The texture is now most up to date - If the surface is a render target and has a drawable, this + * path is never entered + */ + IWineD3DSurface_ModifyLocation((IWineD3DSurface *) This, SFLAG_INTEXTURE, TRUE); } /* Not called from the VTable */ @@ -3565,7 +3577,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const /* When blitting from a render target a texture, the texture isn't required to have a palette. * In this case grab the palette from the render target. */ - if ((This->resource.format_desc->format == WINED3DFMT_P8) && (This->palette == NULL)) + if (This->resource.format_desc->format == WINED3DFMT_P8_UINT && !This->palette) { paletteOverride = TRUE; TRACE("Source surface (%p) lacks palette, overriding palette with palette %p of destination surface (%p)\n", Src, This->palette, This); @@ -3587,7 +3599,8 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const * FBO support, so it doesn't really make sense to try and make it work with different offscreen rendering * backends. */ - if (wined3d_settings.offscreen_rendering_mode == ORM_FBO && GL_SUPPORT(EXT_FRAMEBUFFER_BLIT) + if (wined3d_settings.offscreen_rendering_mode == ORM_FBO + && myDevice->adapter->gl_info.fbo_ops.glBlitFramebuffer && surface_can_stretch_rect(Src, This)) { stretch_rect_fbo((IWineD3DDevice *)myDevice, SrcSurface, &srect, @@ -3612,10 +3625,6 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const } else { This->Flags &= ~SFLAG_INSYSMEM; } - /* The texture is now most up to date - If the surface is a render target and has a drawable, this - * path is never entered - */ - IWineD3DSurface_ModifyLocation((IWineD3DSurface *) This, SFLAG_INTEXTURE, TRUE); return WINED3D_OK; } else if(Src) { @@ -3644,14 +3653,15 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const * surface is not required to have a palette. Our rendering / conversion * code further down the road retrieves the palette from the surface, so * it must have a palette set. */ - if ((Src->resource.format_desc->format == WINED3DFMT_P8) && (Src->palette == NULL)) + if (Src->resource.format_desc->format == WINED3DFMT_P8_UINT && !Src->palette) { paletteOverride = TRUE; TRACE("Source surface (%p) lacks palette, overriding palette with palette %p of destination surface (%p)\n", Src, This->palette, This); Src->palette = This->palette; } - if (wined3d_settings.offscreen_rendering_mode == ORM_FBO && GL_SUPPORT(EXT_FRAMEBUFFER_BLIT) + if (wined3d_settings.offscreen_rendering_mode == ORM_FBO + && myDevice->adapter->gl_info.fbo_ops.glBlitFramebuffer && !(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE)) && surface_can_stretch_rect(Src, This)) { @@ -3843,7 +3853,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const /* The color as given in the Blt function is in the format of the frame-buffer... * 'clear' expect it in ARGB format => we need to do some conversion :-) */ - if (This->resource.format_desc->format == WINED3DFMT_P8) + if (This->resource.format_desc->format == WINED3DFMT_P8_UINT) { DWORD alpha; @@ -3859,7 +3869,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const color = alpha; } } - else if (This->resource.format_desc->format == WINED3DFMT_R5G6B5) + else if (This->resource.format_desc->format == WINED3DFMT_B5G6R5_UNORM) { if (DDBltFx->u5.dwFillColor == 0xFFFF) { color = 0xFFFFFFFF; @@ -3870,12 +3880,12 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const ((DDBltFx->u5.dwFillColor & 0x001F) << 3)); } } - else if ((This->resource.format_desc->format == WINED3DFMT_R8G8B8) - || (This->resource.format_desc->format == WINED3DFMT_X8R8G8B8)) + else if (This->resource.format_desc->format == WINED3DFMT_B8G8R8_UNORM + || This->resource.format_desc->format == WINED3DFMT_B8G8R8X8_UNORM) { color = 0xFF000000 | DDBltFx->u5.dwFillColor; } - else if (This->resource.format_desc->format == WINED3DFMT_A8R8G8B8) + else if (This->resource.format_desc->format == WINED3DFMT_B8G8R8A8_UNORM) { color = DDBltFx->u5.dwFillColor; } @@ -3908,14 +3918,14 @@ static HRESULT IWineD3DSurfaceImpl_BltZ(IWineD3DSurfaceImpl *This, const RECT *D case WINED3DFMT_D16_UNORM: depth = (float) DDBltFx->u5.dwFillDepth / (float) 0x0000ffff; break; - case WINED3DFMT_D15S1: + case WINED3DFMT_S1_UINT_D15_UNORM: depth = (float) DDBltFx->u5.dwFillDepth / (float) 0x0000fffe; break; - case WINED3DFMT_D24S8: - case WINED3DFMT_D24X8: + case WINED3DFMT_S8_UINT_D24_UNORM: + case WINED3DFMT_X8D24_UNORM: depth = (float) DDBltFx->u5.dwFillDepth / (float) 0x00ffffff; break; - case WINED3DFMT_D32: + case WINED3DFMT_D32_UNORM: depth = (float) DDBltFx->u5.dwFillDepth / (float) 0xffffffff; break; default: @@ -4048,8 +4058,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface) if (!pal) return WINED3D_OK; - if (This->resource.format_desc->format == WINED3DFMT_P8 - || This->resource.format_desc->format == WINED3DFMT_A8P8) + if (This->resource.format_desc->format == WINED3DFMT_P8_UINT + || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) { int bpp; GLenum format, internal, type; @@ -4161,9 +4171,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) { is used in combination with texture uploads (RTL_READTEX/RTL_TEXTEX). The reason is that EXT_PALETTED_TEXTURE doesn't work in combination with ARB_TEXTURE_RECTANGLE. */ - if(This->Flags & SFLAG_NONPOW2 && GL_SUPPORT(ARB_TEXTURE_RECTANGLE) - && !((This->resource.format_desc->format == WINED3DFMT_P8) && GL_SUPPORT(EXT_PALETTED_TEXTURE) - && (wined3d_settings.rendertargetlock_mode == RTL_READTEX))) + if (This->Flags & SFLAG_NONPOW2 && GL_SUPPORT(ARB_TEXTURE_RECTANGLE) + && !(This->resource.format_desc->format == WINED3DFMT_P8_UINT && GL_SUPPORT(EXT_PALETTED_TEXTURE) + && wined3d_settings.rendertargetlock_mode == RTL_READTEX)) { This->texture_target = GL_TEXTURE_RECTANGLE_ARB; This->pow2Width = This->currentDesc.Width; @@ -4348,6 +4358,7 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; + const struct wined3d_gl_info *gl_info = context->gl_info; TRACE("(%p) New location %#x\n", This, location); @@ -4379,7 +4390,7 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co /* Note that we use depth_blt here as well, rather than glCopyTexImage2D * directly on the FBO texture. That's because we need to flip. */ - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL); + context_bind_fbo(context, GL_FRAMEBUFFER, NULL); if (This->texture_target == GL_TEXTURE_RECTANGLE_ARB) { glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding); @@ -4401,30 +4412,32 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co /* Setup the destination */ if (!device->depth_blt_rb) { - GL_EXTCALL(glGenRenderbuffersEXT(1, &device->depth_blt_rb)); + gl_info->fbo_ops.glGenRenderbuffers(1, &device->depth_blt_rb); checkGLcall("glGenRenderbuffersEXT"); } if (device->depth_blt_rb_w != This->currentDesc.Width || device->depth_blt_rb_h != This->currentDesc.Height) { - GL_EXTCALL(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, device->depth_blt_rb)); + gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, device->depth_blt_rb); checkGLcall("glBindRenderbufferEXT"); - GL_EXTCALL(glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, This->currentDesc.Width, This->currentDesc.Height)); + gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, + This->currentDesc.Width, This->currentDesc.Height); checkGLcall("glRenderbufferStorageEXT"); device->depth_blt_rb_w = This->currentDesc.Width; device->depth_blt_rb_h = This->currentDesc.Height; } - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &context->dst_fbo); - GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, device->depth_blt_rb)); + context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo); + gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, device->depth_blt_rb); checkGLcall("glFramebufferRenderbufferEXT"); - context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER_EXT, iface, FALSE); + context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, iface, FALSE); /* Do the actual blit */ surface_depth_blt(This, device->depth_blt_texture, This->currentDesc.Width, This->currentDesc.Height, bind_target); checkGLcall("depth_blt"); - if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &context->current_fbo->id); - else context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL); + if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id); + else context_bind_fbo(context, GL_FRAMEBUFFER, NULL); LEAVE_GL(); } else { @@ -4436,12 +4449,12 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co ENTER_GL(); - context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL); + context_bind_fbo(context, GL_FRAMEBUFFER, NULL); surface_depth_blt(This, This->texture_name, This->currentDesc.Width, This->currentDesc.Height, This->texture_target); checkGLcall("depth_blt"); - if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &context->current_fbo->id); + if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id); LEAVE_GL(); } else { @@ -4689,9 +4702,9 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT */ if(SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface*)This, &IID_IWineD3DBaseTexture, (void **) &texture))) { - ((IWineD3DBaseTextureImpl *) texture)->baseTexture.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; - ((IWineD3DBaseTextureImpl *) texture)->baseTexture.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; - ((IWineD3DBaseTextureImpl *) texture)->baseTexture.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; + ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; + ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; + ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; IWineD3DBaseTexture_Release(texture); } } @@ -4838,12 +4851,18 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, rect); } } else { - if((This->Flags & SFLAG_LOCATIONS) == SFLAG_INSRGBTEX) { + if((This->Flags & (SFLAG_INSRGBTEX | SFLAG_INSYSMEM)) == SFLAG_INSRGBTEX) { /* Performance warning ... */ FIXME("%p: Downloading srgb texture to reload it as rgb\n", This); IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, rect); } } + if(!(This->Flags & SFLAG_INSYSMEM)) { + /* Should not happen */ + ERR("Trying to load a texture from sysmem, but SFLAG_INSYSMEM is not set\n"); + /* Lets hope we get it from somewhere... */ + IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, rect); + } if (!device->isInDraw) ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD); surface_bind_and_dirtify(This, srgb); @@ -4881,7 +4900,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D This->Flags |= SFLAG_CONVERTED; } - else if ((This->resource.format_desc->format == WINED3DFMT_P8) + else if (This->resource.format_desc->format == WINED3DFMT_P8_UINT && (GL_SUPPORT(EXT_PALETTED_TEXTURE) || GL_SUPPORT(ARB_FRAGMENT_PROGRAM))) { d3dfmt_p8_upload_palette(iface, convert); diff --git a/reactos/dll/directx/wine/wined3d/surface_base.c b/reactos/dll/directx/wine/wined3d/surface_base.c index 5c00b2b8c3e..ca715f50eab 100644 --- a/reactos/dll/directx/wine/wined3d/surface_base.c +++ b/reactos/dll/directx/wine/wined3d/surface_base.c @@ -10,6 +10,7 @@ * Copyright 2006-2008 Stefan Dösinger for CodeWeavers * Copyright 2007 Henri Verbeet * Copyright 2006-2007 Roderick Colenbrander + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -542,6 +543,12 @@ HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) { DWORD *masks; UINT usage; + if(!(format_desc->Flags & WINED3DFMT_FLAG_GETDC)) + { + WARN("Cannot use GetDC on a %s surface\n", debug_d3dformat(format_desc->format)); + return WINED3DERR_INVALIDCALL; + } + switch (format_desc->byte_count) { case 2: @@ -592,22 +599,22 @@ HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) { masks = (DWORD *)b_info->bmiColors; switch (This->resource.format_desc->format) { - case WINED3DFMT_R8G8B8: + case WINED3DFMT_B8G8R8_UNORM: usage = DIB_RGB_COLORS; b_info->bmiHeader.biCompression = BI_RGB; break; - case WINED3DFMT_X1R5G5B5: - case WINED3DFMT_A1R5G5B5: - case WINED3DFMT_A4R4G4B4: - case WINED3DFMT_X4R4G4B4: - case WINED3DFMT_R3G3B2: - case WINED3DFMT_A8R3G3B2: + case WINED3DFMT_B5G5R5X1_UNORM: + case WINED3DFMT_B5G5R5A1_UNORM: + case WINED3DFMT_B4G4R4A4_UNORM: + case WINED3DFMT_B4G4R4X4_UNORM: + case WINED3DFMT_B2G3R3_UNORM: + case WINED3DFMT_B2G3R3A8_UNORM: case WINED3DFMT_R10G10B10A2_UNORM: case WINED3DFMT_R8G8B8A8_UNORM: - case WINED3DFMT_X8B8G8R8: - case WINED3DFMT_A2R10G10B10: - case WINED3DFMT_R5G6B5: + case WINED3DFMT_R8G8B8X8_UNORM: + case WINED3DFMT_B10G10R10A2_UNORM: + case WINED3DFMT_B5G6R5_UNORM: case WINED3DFMT_R16G16B16A16_UNORM: usage = 0; b_info->bmiHeader.biCompression = BI_BITFIELDS; @@ -750,9 +757,9 @@ struct d3dfmt_convertor_desc { static const struct d3dfmt_convertor_desc convertors[] = { - {WINED3DFMT_R32_FLOAT, WINED3DFMT_R16_FLOAT, convert_r32_float_r16_float}, - {WINED3DFMT_R5G6B5, WINED3DFMT_X8R8G8B8, convert_r5g6b5_x8r8g8b8}, - {WINED3DFMT_A8R8G8B8, WINED3DFMT_X8R8G8B8, convert_a8r8g8b8_x8r8g8b8}, + {WINED3DFMT_R32_FLOAT, WINED3DFMT_R16_FLOAT, convert_r32_float_r16_float}, + {WINED3DFMT_B5G6R5_UNORM, WINED3DFMT_B8G8R8X8_UNORM, convert_r5g6b5_x8r8g8b8}, + {WINED3DFMT_B8G8R8A8_UNORM, WINED3DFMT_B8G8R8X8_UNORM, convert_a8r8g8b8_x8r8g8b8}, }; static inline const struct d3dfmt_convertor_desc *find_convertor(WINED3DFORMAT from, WINED3DFORMAT to) @@ -793,7 +800,8 @@ static IWineD3DSurfaceImpl *surface_convert_format(IWineD3DSurfaceImpl *source, IWineD3DDevice_CreateSurface((IWineD3DDevice *)source->resource.wineD3DDevice, source->currentDesc.Width, source->currentDesc.Height, to_fmt, TRUE /* lockable */, TRUE /* discard */, 0 /* level */, &ret, 0 /* usage */, WINED3DPOOL_SCRATCH, WINED3DMULTISAMPLE_NONE /* TODO: Multisampled conversion */, - 0 /* MultiSampleQuality */, IWineD3DSurface_GetImplType((IWineD3DSurface *) source), NULL /* parent */); + 0 /* MultiSampleQuality */, IWineD3DSurface_GetImplType((IWineD3DSurface *) source), + NULL /* parent */, &wined3d_null_parent_ops); if(!ret) { ERR("Failed to create a destination surface for conversion\n"); return NULL; diff --git a/reactos/dll/directx/wine/wined3d/surface_gdi.c b/reactos/dll/directx/wine/wined3d/surface_gdi.c index 02467829e83..7867008d6c1 100644 --- a/reactos/dll/directx/wine/wined3d/surface_gdi.c +++ b/reactos/dll/directx/wine/wined3d/surface_gdi.c @@ -313,7 +313,7 @@ const char* filename) } fprintf(f, "P6\n%d %d\n255\n", This->pow2Width, This->pow2Height); - if (This->resource.format_desc->format == WINED3DFMT_P8) + if (This->resource.format_desc->format == WINED3DFMT_P8_UINT) { unsigned char table[256][3]; int i; @@ -384,6 +384,12 @@ static HRESULT WINAPI IWineGDISurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD TRACE("(%p)->(%p)\n",This,pHDC); + if(!(This->Flags & SFLAG_DIBSECTION)) + { + WARN("DC not supported on this surface\n"); + return WINED3DERR_INVALIDCALL; + } + if(This->Flags & SFLAG_USERPTR) { ERR("Not supported on surfaces with an application-provided surfaces\n"); return WINEDDERR_NODC; @@ -412,8 +418,8 @@ static HRESULT WINAPI IWineGDISurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD return hr; } - if (This->resource.format_desc->format == WINED3DFMT_P8 - || This->resource.format_desc->format == WINED3DFMT_A8P8) + if (This->resource.format_desc->format == WINED3DFMT_P8_UINT + || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) { unsigned int n; const PALETTEENTRY *pal = NULL; @@ -525,26 +531,29 @@ static HRESULT WINAPI IWineGDISurfaceImpl_PrivateSetup(IWineD3DSurface *iface) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; + HRESULT hr; if(This->resource.usage & WINED3DUSAGE_OVERLAY) { ERR("(%p) Overlays not yet supported by GDI surfaces\n", This); return WINED3DERR_INVALIDCALL; } + /* Sysmem textures have memory already allocated - * release it, this avoids an unnecessary memcpy */ - HeapFree(GetProcessHeap(), 0, This->resource.heapMemory); - This->resource.allocatedMemory = NULL; - This->resource.heapMemory = NULL; + hr = IWineD3DBaseSurfaceImpl_CreateDIBSection(iface); + if(SUCCEEDED(hr)) + { + HeapFree(GetProcessHeap(), 0, This->resource.heapMemory); + This->resource.heapMemory = NULL; + This->resource.allocatedMemory = This->dib.bitmap_data; + } /* We don't mind the nonpow2 stuff in GDI */ This->pow2Width = This->currentDesc.Width; This->pow2Height = This->currentDesc.Height; - IWineD3DBaseSurfaceImpl_CreateDIBSection(iface); - This->resource.allocatedMemory = This->dib.bitmap_data; - return WINED3D_OK; } diff --git a/reactos/dll/directx/wine/wined3d/swapchain.c b/reactos/dll/directx/wine/wined3d/swapchain.c index d8d3733f56d..3b31d153765 100644 --- a/reactos/dll/directx/wine/wined3d/swapchain.c +++ b/reactos/dll/directx/wine/wined3d/swapchain.c @@ -36,7 +36,8 @@ WINE_DECLARE_DEBUG_CHANNEL(fps); #define GLINFO_LOCATION This->wineD3DDevice->adapter->gl_info /*IWineD3DSwapChain parts follow: */ -static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface, D3DCB_DESTROYSURFACEFN D3DCB_DestroyRenderTarget) { +static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface) +{ IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface; WINED3DDISPLAYMODE mode; unsigned int i; @@ -50,9 +51,9 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface, D3DCB if (This->frontBuffer) { IWineD3DSurface_SetContainer(This->frontBuffer, 0); - if (D3DCB_DestroyRenderTarget(This->frontBuffer)) + if (IWineD3DSurface_Release(This->frontBuffer)) { - FIXME("(%p) Something's still holding the front buffer (%p).\n", + WARN("(%p) Something's still holding the front buffer (%p).\n", This, This->frontBuffer); } This->frontBuffer = NULL; @@ -65,8 +66,8 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface, D3DCB while (i--) { IWineD3DSurface_SetContainer(This->backBuffer[i], 0); - if (D3DCB_DestroyRenderTarget(This->backBuffer[i])) - FIXME("(%p) Something's still holding back buffer %u (%p).\n", + if (IWineD3DSurface_Release(This->backBuffer[i])) + WARN("(%p) Something's still holding back buffer %u (%p).\n", This, i, This->backBuffer[i]); } HeapFree(GetProcessHeap(), 0, This->backBuffer); @@ -119,7 +120,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO cursor.resource.ref = 1; cursor.resource.wineD3DDevice = This->wineD3DDevice; cursor.resource.pool = WINED3DPOOL_SCRATCH; - cursor.resource.format_desc = getFormatDescEntry(WINED3DFMT_A8R8G8B8, &This->wineD3DDevice->adapter->gl_info); + cursor.resource.format_desc = + getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &This->wineD3DDevice->adapter->gl_info); cursor.resource.resourceType = WINED3DRTYPE_SURFACE; cursor.texture_name = This->wineD3DDevice->cursorTexture; cursor.texture_target = GL_TEXTURE_2D; diff --git a/reactos/dll/directx/wine/wined3d/swapchain_base.c b/reactos/dll/directx/wine/wined3d/swapchain_base.c index 7272c9575fe..31b9d07ad41 100644 --- a/reactos/dll/directx/wine/wined3d/swapchain_base.c +++ b/reactos/dll/directx/wine/wined3d/swapchain_base.c @@ -59,7 +59,7 @@ ULONG WINAPI IWineD3DBaseSwapChainImpl_Release(IWineD3DSwapChain *iface) { refCount = InterlockedDecrement(&This->ref); TRACE("(%p) : ReleaseRef to %d\n", This, refCount); if (refCount == 0) { - IWineD3DSwapChain_Destroy(iface, D3DCB_DefaultDestroySurface); + IWineD3DSwapChain_Destroy(iface); } return refCount; } diff --git a/reactos/dll/directx/wine/wined3d/swapchain_gdi.c b/reactos/dll/directx/wine/wined3d/swapchain_gdi.c index 596820157ee..f4909bc4166 100644 --- a/reactos/dll/directx/wine/wined3d/swapchain_gdi.c +++ b/reactos/dll/directx/wine/wined3d/swapchain_gdi.c @@ -27,7 +27,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); WINE_DECLARE_DEBUG_CHANNEL(fps); -static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface, D3DCB_DESTROYSURFACEFN D3DCB_DestroyRenderback) { +static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface) +{ IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface; WINED3DDISPLAYMODE mode; @@ -38,8 +39,9 @@ static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface, D3DCB /* release the ref to the front and back buffer parents */ if(This->frontBuffer) { IWineD3DSurface_SetContainer(This->frontBuffer, 0); - if(D3DCB_DestroyRenderback(This->frontBuffer) > 0) { - FIXME("(%p) Something's still holding the front buffer\n",This); + if (IWineD3DSurface_Release(This->frontBuffer) > 0) + { + WARN("(%p) Something's still holding the front buffer\n",This); } } @@ -47,8 +49,9 @@ static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface, D3DCB UINT i; for(i = 0; i < This->presentParms.BackBufferCount; i++) { IWineD3DSurface_SetContainer(This->backBuffer[i], 0); - if(D3DCB_DestroyRenderback(This->backBuffer[i]) > 0) { - FIXME("(%p) Something's still holding the back buffer\n",This); + if (IWineD3DSurface_Release(This->backBuffer[i]) > 0) + { + WARN("(%p) Something's still holding the back buffer\n",This); } } HeapFree(GetProcessHeap(), 0, This->backBuffer); diff --git a/reactos/dll/directx/wine/wined3d/texture.c b/reactos/dll/directx/wine/wined3d/texture.c index dd8f32ed7dc..36d83166e56 100644 --- a/reactos/dll/directx/wine/wined3d/texture.c +++ b/reactos/dll/directx/wine/wined3d/texture.c @@ -5,6 +5,7 @@ * Copyright 2002-2005 Raphael Junqueira * Copyright 2005 Oliver Stieber * Copyright 2007-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -57,7 +58,7 @@ static void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRG srgb_mode = This->baseTexture.is_srgb; break; } - dirty = srgb_mode ? &This->baseTexture.srgbDirty : &This->baseTexture.dirty; + dirty = srgb_mode ? &This->baseTexture.texture_srgb.dirty : &This->baseTexture.texture_rgb.dirty; if (!device->isInDraw) { @@ -66,8 +67,8 @@ static void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRG ActivateContext(device, NULL, CTXUSAGE_RESOURCELOAD); } - if (This->resource.format_desc->format == WINED3DFMT_P8 - || This->resource.format_desc->format == WINED3DFMT_A8P8) + if (This->resource.format_desc->format == WINED3DFMT_P8_UINT + || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM) { for (i = 0; i < This->baseTexture.levels; ++i) { @@ -100,7 +101,7 @@ static void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRG *dirty = FALSE; } -static void texture_cleanup(IWineD3DTextureImpl *This, D3DCB_DESTROYSURFACEFN surface_destroy_cb) +static void texture_cleanup(IWineD3DTextureImpl *This) { unsigned int i; @@ -116,7 +117,7 @@ static void texture_cleanup(IWineD3DTextureImpl *This, D3DCB_DESTROYSURFACEFN su surface_set_texture_name(This->surfaces[i], 0, FALSE); surface_set_texture_target(This->surfaces[i], 0); IWineD3DSurface_SetContainer(This->surfaces[i], 0); - surface_destroy_cb(This->surfaces[i]); + IWineD3DSurface_Release(This->surfaces[i]); } } @@ -124,164 +125,6 @@ static void texture_cleanup(IWineD3DTextureImpl *This, D3DCB_DESTROYSURFACEFN su basetexture_cleanup((IWineD3DBaseTexture *)This); } -HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT levels, - IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent) -{ - const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info); - UINT pow2_width, pow2_height; - UINT tmp_w, tmp_h; - unsigned int i; - HRESULT hr; - - /* TODO: It should only be possible to create textures for formats - * that are reported as supported. */ - if (WINED3DFMT_UNKNOWN >= format) - { - WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); - return WINED3DERR_INVALIDCALL; - } - - /* Non-power2 support. */ - if (GL_SUPPORT(ARB_TEXTURE_NON_POWER_OF_TWO)) - { - pow2_width = width; - pow2_height = height; - } - else - { - /* Find the nearest pow2 match. */ - pow2_width = pow2_height = 1; - while (pow2_width < width) pow2_width <<= 1; - while (pow2_height < height) pow2_height <<= 1; - - if (pow2_width != width || pow2_height != height) - { - if (levels > 1) - { - WARN("Attempted to create a mipmapped np2 texture without unconditional np2 support.\n"); - return WINED3DERR_INVALIDCALL; - } - levels = 1; - } - } - - /* Calculate levels for mip mapping. */ - if (usage & WINED3DUSAGE_AUTOGENMIPMAP) - { - if (!GL_SUPPORT(SGIS_GENERATE_MIPMAP)) - { - WARN("No mipmap generation support, returning WINED3DERR_INVALIDCALL.\n"); - return WINED3DERR_INVALIDCALL; - } - - if (levels > 1) - { - WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning WINED3DERR_INVALIDCALL.\n"); - return WINED3DERR_INVALIDCALL; - } - - levels = 1; - } - else if (!levels) - { - levels = wined3d_log2i(max(width, height)) + 1; - TRACE("Calculated levels = %u.\n", levels); - } - - hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, - WINED3DRTYPE_TEXTURE, device, 0, usage, format_desc, pool, parent); - if (FAILED(hr)) - { - WARN("Failed to initialize basetexture, returning %#x.\n", hr); - return hr; - } - - /* Precalculated scaling for 'faked' non power of two texture coords. - * Second also don't use ARB_TEXTURE_RECTANGLE in case the surface format is P8 and EXT_PALETTED_TEXTURE - * is used in combination with texture uploads (RTL_READTEX). The reason is that EXT_PALETTED_TEXTURE - * doesn't work in combination with ARB_TEXTURE_RECTANGLE. */ - if (GL_SUPPORT(WINE_NORMALIZED_TEXRECT) && (width != pow2_width || height != pow2_height)) - { - texture->baseTexture.pow2Matrix[0] = 1.0f; - texture->baseTexture.pow2Matrix[5] = 1.0f; - texture->baseTexture.pow2Matrix[10] = 1.0f; - texture->baseTexture.pow2Matrix[15] = 1.0f; - texture->target = GL_TEXTURE_2D; - texture->cond_np2 = TRUE; - texture->baseTexture.minMipLookup = minMipLookup_noFilter; - } - else if (GL_SUPPORT(ARB_TEXTURE_RECTANGLE) && (width != pow2_width || height != pow2_height) - && !((format_desc->format == WINED3DFMT_P8) && GL_SUPPORT(EXT_PALETTED_TEXTURE) - && (wined3d_settings.rendertargetlock_mode == RTL_READTEX))) - { - if ((width != 1) || (height != 1)) texture->baseTexture.pow2Matrix_identity = FALSE; - - texture->baseTexture.pow2Matrix[0] = (float)width; - texture->baseTexture.pow2Matrix[5] = (float)height; - texture->baseTexture.pow2Matrix[10] = 1.0f; - texture->baseTexture.pow2Matrix[15] = 1.0f; - texture->target = GL_TEXTURE_RECTANGLE_ARB; - texture->cond_np2 = TRUE; - - if(texture->resource.format_desc->Flags & WINED3DFMT_FLAG_FILTERING) - { - texture->baseTexture.minMipLookup = minMipLookup_noMip; - } - else - { - texture->baseTexture.minMipLookup = minMipLookup_noFilter; - } - } - else - { - if ((width != pow2_width) || (height != pow2_height)) - { - texture->baseTexture.pow2Matrix_identity = FALSE; - texture->baseTexture.pow2Matrix[0] = (((float)width) / ((float)pow2_width)); - texture->baseTexture.pow2Matrix[5] = (((float)height) / ((float)pow2_height)); - } - else - { - texture->baseTexture.pow2Matrix[0] = 1.0f; - texture->baseTexture.pow2Matrix[5] = 1.0f; - } - - texture->baseTexture.pow2Matrix[10] = 1.0f; - texture->baseTexture.pow2Matrix[15] = 1.0f; - texture->target = GL_TEXTURE_2D; - texture->cond_np2 = FALSE; - } - TRACE("xf(%f) yf(%f)\n", texture->baseTexture.pow2Matrix[0], texture->baseTexture.pow2Matrix[5]); - - /* Generate all the surfaces. */ - tmp_w = width; - tmp_h = height; - for (i = 0; i < texture->baseTexture.levels; ++i) - { - /* Use the callback to create the texture surface. */ - hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_h, format_desc->format, - usage, pool, i, WINED3DCUBEMAP_FACE_POSITIVE_X, &texture->surfaces[i]); - if (FAILED(hr) || ((IWineD3DSurfaceImpl *)texture->surfaces[i])->Flags & SFLAG_OVERSIZE) - { - FIXME("Failed to create surface %p, hr %#x\n", texture, hr); - texture->surfaces[i] = NULL; - texture_cleanup(texture, D3DCB_DefaultDestroySurface); - return hr; - } - - IWineD3DSurface_SetContainer(texture->surfaces[i], (IWineD3DBase *)texture); - TRACE("Created surface level %u @ %p.\n", i, texture->surfaces[i]); - surface_set_texture_target(texture->surfaces[i], texture->target); - /* Calculate the next mipmap level. */ - tmp_w = max(1, tmp_w >> 1); - tmp_h = max(1, tmp_h >> 1); - } - texture->baseTexture.internal_preload = texture_internal_preload; - - return WINED3D_OK; -} - #undef GLINFO_LOCATION /* ******************************************* @@ -318,8 +161,11 @@ static ULONG WINAPI IWineD3DTextureImpl_Release(IWineD3DTexture *iface) { ULONG ref; TRACE("(%p) : Releasing from %d\n", This, This->resource.ref); ref = InterlockedDecrement(&This->resource.ref); - if (ref == 0) { - IWineD3DTexture_Destroy(iface, D3DCB_DefaultDestroySurface); + if (!ref) + { + texture_cleanup(This); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); + HeapFree(GetProcessHeap(), 0, This); } return ref; } @@ -429,12 +275,16 @@ static HRESULT WINAPI IWineD3DTextureImpl_BindTexture(IWineD3DTexture *iface, BO hr = basetexture_bind((IWineD3DBaseTexture *)iface, srgb, &set_gl_texture_desc); if (set_gl_texture_desc && SUCCEEDED(hr)) { UINT i; + struct gl_texture *gl_tex; + + if(This->baseTexture.is_srgb) { + gl_tex = &This->baseTexture.texture_srgb; + } else { + gl_tex = &This->baseTexture.texture_rgb; + } + for (i = 0; i < This->baseTexture.levels; ++i) { - if(This->baseTexture.is_srgb) { - surface_set_texture_name(This->surfaces[i], This->baseTexture.srgbTextureName, TRUE); - } else { - surface_set_texture_name(This->surfaces[i], This->baseTexture.textureName, FALSE); - } + surface_set_texture_name(This->surfaces[i], gl_tex->name, This->baseTexture.is_srgb); } /* Conditinal non power of two textures use a different clamping default. If we're using the GL_WINE_normalized_texrect * partial driver emulation, we're dealing with a GL_TEXTURE_2D texture which has the address mode set to repeat - something @@ -452,11 +302,11 @@ static HRESULT WINAPI IWineD3DTextureImpl_BindTexture(IWineD3DTexture *iface, BO glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_MAG_FILTER, GL_NEAREST); checkGLcall("glTexParameteri(dimension, GL_TEXTURE_MAG_FILTER, GL_NEAREST)"); LEAVE_GL(); - This->baseTexture.states[WINED3DTEXSTA_ADDRESSU] = WINED3DTADDRESS_CLAMP; - This->baseTexture.states[WINED3DTEXSTA_ADDRESSV] = WINED3DTADDRESS_CLAMP; - This->baseTexture.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; - This->baseTexture.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; - This->baseTexture.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; + gl_tex->states[WINED3DTEXSTA_ADDRESSU] = WINED3DTADDRESS_CLAMP; + gl_tex->states[WINED3DTEXSTA_ADDRESSV] = WINED3DTADDRESS_CLAMP; + gl_tex->states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; + gl_tex->states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; + gl_tex->states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; } } @@ -480,14 +330,6 @@ static BOOL WINAPI IWineD3DTextureImpl_IsCondNP2(IWineD3DTexture *iface) { /* ******************************************* IWineD3DTexture IWineD3DTexture parts follow ******************************************* */ -static void WINAPI IWineD3DTextureImpl_Destroy(IWineD3DTexture *iface, D3DCB_DESTROYSURFACEFN D3DCB_DestroySurface) { - IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; - - texture_cleanup(This, D3DCB_DestroySurface); - /* free the object */ - HeapFree(GetProcessHeap(), 0, This); -} - static HRESULT WINAPI IWineD3DTextureImpl_GetLevelDesc(IWineD3DTexture *iface, UINT Level, WINED3DSURFACE_DESC* pDesc) { IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; @@ -550,15 +392,15 @@ static HRESULT WINAPI IWineD3DTextureImpl_UnlockRect(IWineD3DTexture *iface, UIN static HRESULT WINAPI IWineD3DTextureImpl_AddDirtyRect(IWineD3DTexture *iface, CONST RECT* pDirtyRect) { IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface; - This->baseTexture.dirty = TRUE; - This->baseTexture.srgbDirty = TRUE; + This->baseTexture.texture_rgb.dirty = TRUE; + This->baseTexture.texture_srgb.dirty = TRUE; TRACE("(%p) : dirtyfication of surface Level (0)\n", This); surface_add_dirty_rect(This->surfaces[0], pDirtyRect); return WINED3D_OK; } -const IWineD3DTextureVtbl IWineD3DTexture_Vtbl = +static const IWineD3DTextureVtbl IWineD3DTexture_Vtbl = { /* IUnknown */ IWineD3DTextureImpl_QueryInterface, @@ -588,10 +430,170 @@ const IWineD3DTextureVtbl IWineD3DTexture_Vtbl = IWineD3DTextureImpl_GetTextureDimensions, IWineD3DTextureImpl_IsCondNP2, /* IWineD3DTexture */ - IWineD3DTextureImpl_Destroy, IWineD3DTextureImpl_GetLevelDesc, IWineD3DTextureImpl_GetSurfaceLevel, IWineD3DTextureImpl_LockRect, IWineD3DTextureImpl_UnlockRect, IWineD3DTextureImpl_AddDirtyRect }; + +HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT levels, + IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) +{ + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info); + UINT pow2_width, pow2_height; + UINT tmp_w, tmp_h; + unsigned int i; + HRESULT hr; + + /* TODO: It should only be possible to create textures for formats + * that are reported as supported. */ + if (WINED3DFMT_UNKNOWN >= format) + { + WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); + return WINED3DERR_INVALIDCALL; + } + + /* Non-power2 support. */ + if (gl_info->supported[ARB_TEXTURE_NON_POWER_OF_TWO]) + { + pow2_width = width; + pow2_height = height; + } + else + { + /* Find the nearest pow2 match. */ + pow2_width = pow2_height = 1; + while (pow2_width < width) pow2_width <<= 1; + while (pow2_height < height) pow2_height <<= 1; + + if (pow2_width != width || pow2_height != height) + { + if (levels > 1) + { + WARN("Attempted to create a mipmapped np2 texture without unconditional np2 support.\n"); + return WINED3DERR_INVALIDCALL; + } + levels = 1; + } + } + + /* Calculate levels for mip mapping. */ + if (usage & WINED3DUSAGE_AUTOGENMIPMAP) + { + if (!gl_info->supported[SGIS_GENERATE_MIPMAP]) + { + WARN("No mipmap generation support, returning WINED3DERR_INVALIDCALL.\n"); + return WINED3DERR_INVALIDCALL; + } + + if (levels > 1) + { + WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning WINED3DERR_INVALIDCALL.\n"); + return WINED3DERR_INVALIDCALL; + } + + levels = 1; + } + else if (!levels) + { + levels = wined3d_log2i(max(width, height)) + 1; + TRACE("Calculated levels = %u.\n", levels); + } + + texture->lpVtbl = &IWineD3DTexture_Vtbl; + + hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_TEXTURE, + device, 0, usage, format_desc, pool, parent, parent_ops); + if (FAILED(hr)) + { + WARN("Failed to initialize basetexture, returning %#x.\n", hr); + return hr; + } + + /* Precalculated scaling for 'faked' non power of two texture coords. + * Second also don't use ARB_TEXTURE_RECTANGLE in case the surface format is P8 and EXT_PALETTED_TEXTURE + * is used in combination with texture uploads (RTL_READTEX). The reason is that EXT_PALETTED_TEXTURE + * doesn't work in combination with ARB_TEXTURE_RECTANGLE. */ + if (gl_info->supported[WINE_NORMALIZED_TEXRECT] && (width != pow2_width || height != pow2_height)) + { + texture->baseTexture.pow2Matrix[0] = 1.0f; + texture->baseTexture.pow2Matrix[5] = 1.0f; + texture->baseTexture.pow2Matrix[10] = 1.0f; + texture->baseTexture.pow2Matrix[15] = 1.0f; + texture->target = GL_TEXTURE_2D; + texture->cond_np2 = TRUE; + texture->baseTexture.minMipLookup = minMipLookup_noFilter; + } + else if (gl_info->supported[ARB_TEXTURE_RECTANGLE] && (width != pow2_width || height != pow2_height) + && !(format_desc->format == WINED3DFMT_P8_UINT && gl_info->supported[EXT_PALETTED_TEXTURE] + && wined3d_settings.rendertargetlock_mode == RTL_READTEX)) + { + if ((width != 1) || (height != 1)) texture->baseTexture.pow2Matrix_identity = FALSE; + + texture->baseTexture.pow2Matrix[0] = (float)width; + texture->baseTexture.pow2Matrix[5] = (float)height; + texture->baseTexture.pow2Matrix[10] = 1.0f; + texture->baseTexture.pow2Matrix[15] = 1.0f; + texture->target = GL_TEXTURE_RECTANGLE_ARB; + texture->cond_np2 = TRUE; + + if(texture->resource.format_desc->Flags & WINED3DFMT_FLAG_FILTERING) + { + texture->baseTexture.minMipLookup = minMipLookup_noMip; + } + else + { + texture->baseTexture.minMipLookup = minMipLookup_noFilter; + } + } + else + { + if ((width != pow2_width) || (height != pow2_height)) + { + texture->baseTexture.pow2Matrix_identity = FALSE; + texture->baseTexture.pow2Matrix[0] = (((float)width) / ((float)pow2_width)); + texture->baseTexture.pow2Matrix[5] = (((float)height) / ((float)pow2_height)); + } + else + { + texture->baseTexture.pow2Matrix[0] = 1.0f; + texture->baseTexture.pow2Matrix[5] = 1.0f; + } + + texture->baseTexture.pow2Matrix[10] = 1.0f; + texture->baseTexture.pow2Matrix[15] = 1.0f; + texture->target = GL_TEXTURE_2D; + texture->cond_np2 = FALSE; + } + TRACE("xf(%f) yf(%f)\n", texture->baseTexture.pow2Matrix[0], texture->baseTexture.pow2Matrix[5]); + + /* Generate all the surfaces. */ + tmp_w = width; + tmp_h = height; + for (i = 0; i < texture->baseTexture.levels; ++i) + { + /* Use the callback to create the texture surface. */ + hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_h, format_desc->format, + usage, pool, i, WINED3DCUBEMAP_FACE_POSITIVE_X, &texture->surfaces[i]); + if (FAILED(hr) || ((IWineD3DSurfaceImpl *)texture->surfaces[i])->Flags & SFLAG_OVERSIZE) + { + FIXME("Failed to create surface %p, hr %#x\n", texture, hr); + texture->surfaces[i] = NULL; + texture_cleanup(texture); + return hr; + } + + IWineD3DSurface_SetContainer(texture->surfaces[i], (IWineD3DBase *)texture); + TRACE("Created surface level %u @ %p.\n", i, texture->surfaces[i]); + surface_set_texture_target(texture->surfaces[i], texture->target); + /* Calculate the next mipmap level. */ + tmp_w = max(1, tmp_w >> 1); + tmp_h = max(1, tmp_h >> 1); + } + texture->baseTexture.internal_preload = texture_internal_preload; + + return WINED3D_OK; +} diff --git a/reactos/dll/directx/wine/wined3d/utils.c b/reactos/dll/directx/wine/wined3d/utils.c index 3c25ebeb3e0..573be8fdae4 100644 --- a/reactos/dll/directx/wine/wined3d/utils.c +++ b/reactos/dll/directx/wine/wined3d/utils.c @@ -7,6 +7,7 @@ * Copyright 2005 Oliver Stieber * Copyright 2006-2008 Henri Verbeet * Copyright 2007-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -49,89 +50,88 @@ struct StaticPixelFormatDesc */ static const struct StaticPixelFormatDesc formats[] = { - /* WINED3DFORMAT alphamask redmask greenmask bluemask bpp depth stencil isFourcc */ - {WINED3DFMT_UNKNOWN, 0x0, 0x0, 0x0, 0x0, 0, 0, 0, FALSE}, - /* FourCC formats, kept here to have WINED3DFMT_R8G8B8(=20) at position 20 */ - {WINED3DFMT_UYVY, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, TRUE }, - {WINED3DFMT_YUY2, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, TRUE }, - {WINED3DFMT_YV12, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, - {WINED3DFMT_DXT1, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, - {WINED3DFMT_DXT2, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, - {WINED3DFMT_DXT3, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, - {WINED3DFMT_DXT4, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, - {WINED3DFMT_DXT5, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, - {WINED3DFMT_MULTI2_ARGB8, 0x0, 0x0, 0x0, 0x0, 1/*?*/, 0, 0, TRUE }, - {WINED3DFMT_G8R8_G8B8, 0x0, 0x0, 0x0, 0x0, 1/*?*/, 0, 0, TRUE }, - {WINED3DFMT_R8G8_B8G8, 0x0, 0x0, 0x0, 0x0, 1/*?*/, 0, 0, TRUE }, + /* WINED3DFORMAT alphamask redmask greenmask bluemask bpp depth stencil isFourcc */ + {WINED3DFMT_UNKNOWN, 0x0, 0x0, 0x0, 0x0, 0, 0, 0, FALSE}, + /* FourCC formats */ + {WINED3DFMT_UYVY, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, TRUE }, + {WINED3DFMT_YUY2, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, TRUE }, + {WINED3DFMT_YV12, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, + {WINED3DFMT_DXT1, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, + {WINED3DFMT_DXT2, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, + {WINED3DFMT_DXT3, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, + {WINED3DFMT_DXT4, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, + {WINED3DFMT_DXT5, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, + {WINED3DFMT_MULTI2_ARGB8, 0x0, 0x0, 0x0, 0x0, 1/*?*/, 0, 0, TRUE }, + {WINED3DFMT_G8R8_G8B8, 0x0, 0x0, 0x0, 0x0, 1/*?*/, 0, 0, TRUE }, + {WINED3DFMT_R8G8_B8G8, 0x0, 0x0, 0x0, 0x0, 1/*?*/, 0, 0, TRUE }, /* IEEE formats */ - {WINED3DFMT_R32_FLOAT, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, - {WINED3DFMT_R32G32_FLOAT, 0x0, 0x0, 0x0, 0x0, 8, 0, 0, FALSE}, - {WINED3DFMT_R32G32B32_FLOAT, 0x0, 0x0, 0x0, 0x0, 12, 0, 0, FALSE}, - {WINED3DFMT_R32G32B32A32_FLOAT, 0x1, 0x0, 0x0, 0x0, 16, 0, 0, FALSE}, + {WINED3DFMT_R32_FLOAT, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, + {WINED3DFMT_R32G32_FLOAT, 0x0, 0x0, 0x0, 0x0, 8, 0, 0, FALSE}, + {WINED3DFMT_R32G32B32_FLOAT, 0x0, 0x0, 0x0, 0x0, 12, 0, 0, FALSE}, + {WINED3DFMT_R32G32B32A32_FLOAT, 0x1, 0x0, 0x0, 0x0, 16, 0, 0, FALSE}, /* Hmm? */ - {WINED3DFMT_CxV8U8, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, + {WINED3DFMT_R8G8_SNORM_Cx, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, /* Float */ - {WINED3DFMT_R16_FLOAT, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, - {WINED3DFMT_R16G16_FLOAT, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, - {WINED3DFMT_R16G16_SINT, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, - {WINED3DFMT_R16G16B16A16_FLOAT, 0x1, 0x0, 0x0, 0x0, 8, 0, 0, FALSE}, - {WINED3DFMT_R16G16B16A16_SINT, 0x1, 0x0, 0x0, 0x0, 8, 0, 0, FALSE}, + {WINED3DFMT_R16_FLOAT, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, + {WINED3DFMT_R16G16_FLOAT, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, + {WINED3DFMT_R16G16_SINT, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, + {WINED3DFMT_R16G16B16A16_FLOAT, 0x1, 0x0, 0x0, 0x0, 8, 0, 0, FALSE}, + {WINED3DFMT_R16G16B16A16_SINT, 0x1, 0x0, 0x0, 0x0, 8, 0, 0, FALSE}, /* Palettized formats */ - {WINED3DFMT_A8P8, 0x0000ff00, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, - {WINED3DFMT_P8, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, FALSE}, + {WINED3DFMT_P8_UINT_A8_UNORM, 0x0000ff00, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, + {WINED3DFMT_P8_UINT, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, FALSE}, /* Standard ARGB formats. */ - {WINED3DFMT_R8G8B8, 0x0, 0x00ff0000, 0x0000ff00, 0x000000ff, 3, 0, 0, FALSE}, - {WINED3DFMT_A8R8G8B8, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff, 4, 0, 0, FALSE}, - {WINED3DFMT_X8R8G8B8, 0x0, 0x00ff0000, 0x0000ff00, 0x000000ff, 4, 0, 0, FALSE}, - {WINED3DFMT_R5G6B5, 0x0, 0x0000f800, 0x000007e0, 0x0000001f, 2, 0, 0, FALSE}, - {WINED3DFMT_X1R5G5B5, 0x0, 0x00007c00, 0x000003e0, 0x0000001f, 2, 0, 0, FALSE}, - {WINED3DFMT_A1R5G5B5, 0x00008000, 0x00007c00, 0x000003e0, 0x0000001f, 2, 0, 0, FALSE}, - {WINED3DFMT_A4R4G4B4, 0x0000f000, 0x00000f00, 0x000000f0, 0x0000000f, 2, 0, 0, FALSE}, - {WINED3DFMT_R3G3B2, 0x0, 0x000000e0, 0x0000001c, 0x00000003, 1, 0, 0, FALSE}, - {WINED3DFMT_A8_UNORM, 0x000000ff, 0x0, 0x0, 0x0, 1, 0, 0, FALSE}, - {WINED3DFMT_A8R3G3B2, 0x0000ff00, 0x000000e0, 0x0000001c, 0x00000003, 2, 0, 0, FALSE}, - {WINED3DFMT_X4R4G4B4, 0x0, 0x00000f00, 0x000000f0, 0x0000000f, 2, 0, 0, FALSE}, - {WINED3DFMT_R10G10B10A2_UNORM, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, - {WINED3DFMT_R10G10B10A2_UINT, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, - {WINED3DFMT_R10G10B10A2_SNORM, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, - {WINED3DFMT_R8G8B8A8_UNORM, 0xff000000, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE}, - {WINED3DFMT_R8G8B8A8_UINT, 0xff000000, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE}, - {WINED3DFMT_X8B8G8R8, 0x0, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE}, - {WINED3DFMT_R16G16_UNORM, 0x0, 0x0000ffff, 0xffff0000, 0x0, 4, 0, 0, FALSE}, - {WINED3DFMT_A2R10G10B10, 0xc0000000, 0x3ff00000, 0x000ffc00, 0x000003ff, 4, 0, 0, FALSE}, - {WINED3DFMT_R16G16B16A16_UNORM, 0x1, 0x0000ffff, 0xffff0000, 0x0, 8, 0, 0, FALSE}, + {WINED3DFMT_B8G8R8_UNORM, 0x0, 0x00ff0000, 0x0000ff00, 0x000000ff, 3, 0, 0, FALSE}, + {WINED3DFMT_B8G8R8A8_UNORM, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff, 4, 0, 0, FALSE}, + {WINED3DFMT_B8G8R8X8_UNORM, 0x0, 0x00ff0000, 0x0000ff00, 0x000000ff, 4, 0, 0, FALSE}, + {WINED3DFMT_B5G6R5_UNORM, 0x0, 0x0000f800, 0x000007e0, 0x0000001f, 2, 0, 0, FALSE}, + {WINED3DFMT_B5G5R5X1_UNORM, 0x0, 0x00007c00, 0x000003e0, 0x0000001f, 2, 0, 0, FALSE}, + {WINED3DFMT_B5G5R5A1_UNORM, 0x00008000, 0x00007c00, 0x000003e0, 0x0000001f, 2, 0, 0, FALSE}, + {WINED3DFMT_B4G4R4A4_UNORM, 0x0000f000, 0x00000f00, 0x000000f0, 0x0000000f, 2, 0, 0, FALSE}, + {WINED3DFMT_B2G3R3_UNORM, 0x0, 0x000000e0, 0x0000001c, 0x00000003, 1, 0, 0, FALSE}, + {WINED3DFMT_A8_UNORM, 0x000000ff, 0x0, 0x0, 0x0, 1, 0, 0, FALSE}, + {WINED3DFMT_B2G3R3A8_UNORM, 0x0000ff00, 0x000000e0, 0x0000001c, 0x00000003, 2, 0, 0, FALSE}, + {WINED3DFMT_B4G4R4X4_UNORM, 0x0, 0x00000f00, 0x000000f0, 0x0000000f, 2, 0, 0, FALSE}, + {WINED3DFMT_R10G10B10A2_UNORM, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, + {WINED3DFMT_R10G10B10A2_UINT, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, + {WINED3DFMT_R10G10B10A2_SNORM, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, + {WINED3DFMT_R8G8B8A8_UNORM, 0xff000000, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE}, + {WINED3DFMT_R8G8B8A8_UINT, 0xff000000, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE}, + {WINED3DFMT_R8G8B8X8_UNORM, 0x0, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE}, + {WINED3DFMT_R16G16_UNORM, 0x0, 0x0000ffff, 0xffff0000, 0x0, 4, 0, 0, FALSE}, + {WINED3DFMT_B10G10R10A2_UNORM, 0xc0000000, 0x3ff00000, 0x000ffc00, 0x000003ff, 4, 0, 0, FALSE}, + {WINED3DFMT_R16G16B16A16_UNORM, 0x1, 0x0000ffff, 0xffff0000, 0x0, 8, 0, 0, FALSE}, /* Luminance */ - {WINED3DFMT_L8, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, FALSE}, - {WINED3DFMT_A8L8, 0x0000ff00, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, - {WINED3DFMT_A4L4, 0x000000f0, 0x0, 0x0, 0x0, 1, 0, 0, FALSE}, + {WINED3DFMT_L8_UNORM, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, FALSE}, + {WINED3DFMT_L8A8_UNORM, 0x0000ff00, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, + {WINED3DFMT_L4A4_UNORM, 0x000000f0, 0x0, 0x0, 0x0, 1, 0, 0, FALSE}, + {WINED3DFMT_L16_UNORM, 0x0, 0x0, 0x0, 0x0, 2, 16, 0, FALSE}, /* Bump mapping stuff */ - {WINED3DFMT_R8G8_SNORM, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, - {WINED3DFMT_L6V5U5, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, - {WINED3DFMT_X8L8V8U8, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, - {WINED3DFMT_R8G8B8A8_SNORM, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, - {WINED3DFMT_R16G16_SNORM, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, - {WINED3DFMT_W11V11U10, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, - {WINED3DFMT_A2W10V10U10, 0xb0000000, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, + {WINED3DFMT_R8G8_SNORM, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, + {WINED3DFMT_R5G5_SNORM_L6_UNORM, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, + {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, + {WINED3DFMT_R8G8B8A8_SNORM, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, + {WINED3DFMT_R16G16_SNORM, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, + {WINED3DFMT_R10G11B11_SNORM, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, + {WINED3DFMT_R10G10B10_SNORM_A2_UNORM,0xb0000000,0x0, 0x0, 0x0, 4, 0, 0, FALSE}, /* Depth stencil formats */ - {WINED3DFMT_D16_LOCKABLE, 0x0, 0x0, 0x0, 0x0, 2, 16, 0, FALSE}, - {WINED3DFMT_D32, 0x0, 0x0, 0x0, 0x0, 4, 32, 0, FALSE}, - {WINED3DFMT_D15S1, 0x0, 0x0, 0x0, 0x0, 2, 15, 1, FALSE}, - {WINED3DFMT_D24S8, 0x0, 0x0, 0x0, 0x0, 4, 24, 8, FALSE}, - {WINED3DFMT_D24X8, 0x0, 0x0, 0x0, 0x0, 4, 24, 0, FALSE}, - {WINED3DFMT_D24X4S4, 0x0, 0x0, 0x0, 0x0, 4, 24, 4, FALSE}, - {WINED3DFMT_D16_UNORM, 0x0, 0x0, 0x0, 0x0, 2, 16, 0, FALSE}, - {WINED3DFMT_L16, 0x0, 0x0, 0x0, 0x0, 2, 16, 0, FALSE}, - {WINED3DFMT_D32F_LOCKABLE, 0x0, 0x0, 0x0, 0x0, 4, 32, 0, FALSE}, - {WINED3DFMT_D24FS8, 0x0, 0x0, 0x0, 0x0, 4, 24, 8, FALSE}, - /* Is this a vertex buffer? */ - {WINED3DFMT_VERTEXDATA, 0x0, 0x0, 0x0, 0x0, 0, 0, 0, FALSE}, - {WINED3DFMT_R16_UINT, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, - {WINED3DFMT_R32_UINT, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, - {WINED3DFMT_R16G16B16A16_SNORM, 0x0, 0x0, 0x0, 0x0, 8, 0, 0, FALSE}, + {WINED3DFMT_D16_LOCKABLE, 0x0, 0x0, 0x0, 0x0, 2, 16, 0, FALSE}, + {WINED3DFMT_D32_UNORM, 0x0, 0x0, 0x0, 0x0, 4, 32, 0, FALSE}, + {WINED3DFMT_S1_UINT_D15_UNORM, 0x0, 0x0, 0x0, 0x0, 2, 15, 1, FALSE}, + {WINED3DFMT_S8_UINT_D24_UNORM, 0x0, 0x0, 0x0, 0x0, 4, 24, 8, FALSE}, + {WINED3DFMT_X8D24_UNORM, 0x0, 0x0, 0x0, 0x0, 4, 24, 0, FALSE}, + {WINED3DFMT_S4X4_UINT_D24_UNORM, 0x0, 0x0, 0x0, 0x0, 4, 24, 4, FALSE}, + {WINED3DFMT_D16_UNORM, 0x0, 0x0, 0x0, 0x0, 2, 16, 0, FALSE}, + {WINED3DFMT_D32_FLOAT, 0x0, 0x0, 0x0, 0x0, 4, 32, 0, FALSE}, + {WINED3DFMT_S8_UINT_D24_FLOAT, 0x0, 0x0, 0x0, 0x0, 4, 24, 8, FALSE}, + {WINED3DFMT_VERTEXDATA, 0x0, 0x0, 0x0, 0x0, 0, 0, 0, FALSE}, + {WINED3DFMT_R16_UINT, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, FALSE}, + {WINED3DFMT_R32_UINT, 0x0, 0x0, 0x0, 0x0, 4, 0, 0, FALSE}, + {WINED3DFMT_R16G16B16A16_SNORM, 0x0, 0x0, 0x0, 0x0, 8, 0, 0, FALSE}, /* Vendor-specific formats */ - {WINED3DFMT_ATI2N, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, - {WINED3DFMT_NVHU, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, TRUE }, - {WINED3DFMT_NVHS, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, TRUE }, + {WINED3DFMT_ATI2N, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, TRUE }, + {WINED3DFMT_NVHU, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, TRUE }, + {WINED3DFMT_NVHS, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, TRUE }, }; struct wined3d_format_compression_info @@ -169,7 +169,7 @@ static const struct wined3d_format_vertex_info format_vertex_info[] = {WINED3DFMT_R32G32_FLOAT, WINED3D_FFP_EMIT_FLOAT2, 2, GL_FLOAT, 2, GL_FALSE, sizeof(float)}, {WINED3DFMT_R32G32B32_FLOAT, WINED3D_FFP_EMIT_FLOAT3, 3, GL_FLOAT, 3, GL_FALSE, sizeof(float)}, {WINED3DFMT_R32G32B32A32_FLOAT, WINED3D_FFP_EMIT_FLOAT4, 4, GL_FLOAT, 4, GL_FALSE, sizeof(float)}, - {WINED3DFMT_A8R8G8B8, WINED3D_FFP_EMIT_D3DCOLOR, 4, GL_UNSIGNED_BYTE, 4, GL_TRUE, sizeof(BYTE)}, + {WINED3DFMT_B8G8R8A8_UNORM, WINED3D_FFP_EMIT_D3DCOLOR, 4, GL_UNSIGNED_BYTE, 4, GL_TRUE, sizeof(BYTE)}, {WINED3DFMT_R8G8B8A8_UINT, WINED3D_FFP_EMIT_UBYTE4, 4, GL_UNSIGNED_BYTE, 4, GL_FALSE, sizeof(BYTE)}, {WINED3DFMT_R16G16_SINT, WINED3D_FFP_EMIT_SHORT2, 2, GL_SHORT, 2, GL_FALSE, sizeof(short int)}, {WINED3DFMT_R16G16B16A16_SINT, WINED3D_FFP_EMIT_SHORT4, 4, GL_SHORT, 4, GL_FALSE, sizeof(short int)}, @@ -198,8 +198,8 @@ typedef struct { * table. */ static const GlPixelFormatDescTemplate gl_formats_template[] = { - /* WINED3DFORMAT internal srgbInternal rtInternal - format type + /* WINED3DFORMAT internal srgbInternal rtInternal + format type flags extension */ /* FourCC formats */ @@ -209,276 +209,295 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = { * Macs, so probably the endianess differs. This could be tested as soon as we have a Windows and MacOS on a big * endian machine */ - {WINED3DFMT_UYVY, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, + {WINED3DFMT_UYVY, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_UYVY, GL_RGB, GL_RGB, 0, - GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_APPLE, + {WINED3DFMT_UYVY, GL_RGB, GL_RGB, 0, + GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_APPLE, WINED3DFMT_FLAG_FILTERING, APPLE_YCBCR_422}, - {WINED3DFMT_YUY2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, + {WINED3DFMT_YUY2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_YUY2, GL_RGB, GL_RGB, 0, - GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_REV_APPLE, + {WINED3DFMT_YUY2, GL_RGB, GL_RGB, 0, + GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_REV_APPLE, WINED3DFMT_FLAG_FILTERING, APPLE_YCBCR_422}, - {WINED3DFMT_YV12, GL_ALPHA, GL_ALPHA, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, + {WINED3DFMT_YV12, GL_ALPHA, GL_ALPHA, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_DXT1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, + {WINED3DFMT_DXT1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, EXT_TEXTURE_COMPRESSION_S3TC}, - {WINED3DFMT_DXT2, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, + {WINED3DFMT_DXT2, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, EXT_TEXTURE_COMPRESSION_S3TC}, - {WINED3DFMT_DXT3, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, + {WINED3DFMT_DXT3, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, EXT_TEXTURE_COMPRESSION_S3TC}, - {WINED3DFMT_DXT4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, + {WINED3DFMT_DXT4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, EXT_TEXTURE_COMPRESSION_S3TC}, - {WINED3DFMT_DXT5, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, - GL_RGBA, GL_UNSIGNED_BYTE, + {WINED3DFMT_DXT5, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0, + GL_RGBA, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, EXT_TEXTURE_COMPRESSION_S3TC}, /* IEEE formats */ - {WINED3DFMT_R32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0, - GL_RED, GL_FLOAT, + {WINED3DFMT_R32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0, + GL_RED, GL_FLOAT, WINED3DFMT_FLAG_RENDERTARGET, ARB_TEXTURE_FLOAT}, - {WINED3DFMT_R32_FLOAT, GL_R32F, GL_R32F, 0, - GL_RED, GL_FLOAT, + {WINED3DFMT_R32_FLOAT, GL_R32F, GL_R32F, 0, + GL_RED, GL_FLOAT, WINED3DFMT_FLAG_RENDERTARGET, ARB_TEXTURE_RG}, - {WINED3DFMT_R32G32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0, - GL_RGB, GL_FLOAT, + {WINED3DFMT_R32G32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0, + GL_RGB, GL_FLOAT, WINED3DFMT_FLAG_RENDERTARGET, ARB_TEXTURE_FLOAT}, - {WINED3DFMT_R32G32_FLOAT, GL_RG32F, GL_RG32F, 0, - GL_RG, GL_FLOAT, + {WINED3DFMT_R32G32_FLOAT, GL_RG32F, GL_RG32F, 0, + GL_RG, GL_FLOAT, WINED3DFMT_FLAG_RENDERTARGET, ARB_TEXTURE_RG}, - {WINED3DFMT_R32G32B32A32_FLOAT, GL_RGBA32F_ARB, GL_RGBA32F_ARB, 0, - GL_RGBA, GL_FLOAT, + {WINED3DFMT_R32G32B32A32_FLOAT, GL_RGBA32F_ARB, GL_RGBA32F_ARB, 0, + GL_RGBA, GL_FLOAT, WINED3DFMT_FLAG_RENDERTARGET, ARB_TEXTURE_FLOAT}, /* Float */ - {WINED3DFMT_R16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0, - GL_RED, GL_HALF_FLOAT_ARB, + {WINED3DFMT_R16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0, + GL_RED, GL_HALF_FLOAT_ARB, WINED3DFMT_FLAG_RENDERTARGET, ARB_TEXTURE_FLOAT}, - {WINED3DFMT_R16_FLOAT, GL_R16F, GL_R16F, 0, - GL_RED, GL_HALF_FLOAT_ARB, + {WINED3DFMT_R16_FLOAT, GL_R16F, GL_R16F, 0, + GL_RED, GL_HALF_FLOAT_ARB, WINED3DFMT_FLAG_RENDERTARGET, ARB_TEXTURE_RG}, - {WINED3DFMT_R16G16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0, - GL_RGB, GL_HALF_FLOAT_ARB, + {WINED3DFMT_R16G16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0, + GL_RGB, GL_HALF_FLOAT_ARB, WINED3DFMT_FLAG_RENDERTARGET, ARB_TEXTURE_FLOAT}, - {WINED3DFMT_R16G16_FLOAT, GL_RG16F, GL_RG16F, 0, - GL_RG, GL_HALF_FLOAT_ARB, + {WINED3DFMT_R16G16_FLOAT, GL_RG16F, GL_RG16F, 0, + GL_RG, GL_HALF_FLOAT_ARB, WINED3DFMT_FLAG_RENDERTARGET, ARB_TEXTURE_RG}, - {WINED3DFMT_R16G16B16A16_FLOAT, GL_RGBA16F_ARB, GL_RGBA16F_ARB, 0, - GL_RGBA, GL_HALF_FLOAT_ARB, + {WINED3DFMT_R16G16B16A16_FLOAT, GL_RGBA16F_ARB, GL_RGBA16F_ARB, 0, + GL_RGBA, GL_HALF_FLOAT_ARB, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_RENDERTARGET, ARB_TEXTURE_FLOAT}, /* Palettized formats */ - {WINED3DFMT_P8, GL_RGBA, GL_RGBA, 0, - GL_RGBA, GL_UNSIGNED_BYTE, - 0, + {WINED3DFMT_P8_UINT, GL_RGBA, GL_RGBA, 0, + GL_RGBA, GL_UNSIGNED_BYTE, + WINED3DFMT_FLAG_GETDC, ARB_FRAGMENT_PROGRAM}, - {WINED3DFMT_P8, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX8_EXT, 0, - GL_COLOR_INDEX, GL_UNSIGNED_BYTE, - 0, + {WINED3DFMT_P8_UINT, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX8_EXT, 0, + GL_COLOR_INDEX, GL_UNSIGNED_BYTE, + WINED3DFMT_FLAG_GETDC, EXT_PALETTED_TEXTURE}, /* Standard ARGB formats */ - {WINED3DFMT_R8G8B8, GL_RGB8, GL_RGB8, 0, - GL_BGR, GL_UNSIGNED_BYTE, - WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET, + {WINED3DFMT_B8G8R8_UNORM, GL_RGB8, GL_RGB8, 0, + GL_BGR, GL_UNSIGNED_BYTE, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET | + WINED3DFMT_FLAG_GETDC, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_A8R8G8B8, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, - WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET, + {WINED3DFMT_B8G8R8A8_UNORM, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0, + GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET | + WINED3DFMT_FLAG_GETDC, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_X8R8G8B8, GL_RGB8, GL_SRGB8_EXT, 0, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, - WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET, + {WINED3DFMT_B8G8R8X8_UNORM, GL_RGB8, GL_SRGB8_EXT, 0, + GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET | + WINED3DFMT_FLAG_GETDC, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R5G6B5, GL_RGB5, GL_RGB5, GL_RGB8, - GL_RGB, GL_UNSIGNED_SHORT_5_6_5, - WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET, + {WINED3DFMT_B5G6R5_UNORM, GL_RGB5, GL_RGB5, GL_RGB8, + GL_RGB, GL_UNSIGNED_SHORT_5_6_5, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET | + WINED3DFMT_FLAG_GETDC, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_X1R5G5B5, GL_RGB5, GL_RGB5_A1, 0, - GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, - WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, + {WINED3DFMT_B5G5R5X1_UNORM, GL_RGB5, GL_RGB5_A1, 0, + GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | + WINED3DFMT_FLAG_GETDC, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_A1R5G5B5, GL_RGB5_A1, GL_RGB5_A1, 0, - GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, - WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, + {WINED3DFMT_B5G5R5A1_UNORM, GL_RGB5_A1, GL_RGB5_A1, 0, + GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | + WINED3DFMT_FLAG_GETDC, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_A4R4G4B4, GL_RGBA4, GL_SRGB8_ALPHA8_EXT, 0, - GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, - WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, + {WINED3DFMT_B4G4R4A4_UNORM, GL_RGBA4, GL_SRGB8_ALPHA8_EXT, 0, + GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | + WINED3DFMT_FLAG_GETDC, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R3G3B2, GL_R3_G3_B2, GL_R3_G3_B2, 0, - GL_RGB, GL_UNSIGNED_BYTE_3_3_2, + {WINED3DFMT_B2G3R3_UNORM, GL_R3_G3_B2, GL_R3_G3_B2, 0, + GL_RGB, GL_UNSIGNED_BYTE_3_3_2, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_A8_UNORM, GL_ALPHA8, GL_ALPHA8, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, + {WINED3DFMT_A8_UNORM, GL_ALPHA8, GL_ALPHA8, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_X4R4G4B4, GL_RGB4, GL_RGB4, 0, - GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, + {WINED3DFMT_B4G4R4X4_UNORM, GL_RGB4, GL_RGB4, 0, + GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_GETDC, + WINED3D_GL_EXT_NONE}, + {WINED3DFMT_R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0, + GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0, - GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, + {WINED3DFMT_R8G8B8A8_UNORM, GL_RGBA8, GL_RGBA8, 0, + GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_GETDC, + WINED3D_GL_EXT_NONE}, + {WINED3DFMT_R8G8B8X8_UNORM, GL_RGB8, GL_RGB8, 0, + GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_GETDC, + WINED3D_GL_EXT_NONE}, + {WINED3DFMT_R16G16_UNORM, GL_RGB16_EXT, GL_RGB16_EXT, GL_RGBA16_EXT, + GL_RGB, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R8G8B8A8_UNORM, GL_RGBA8, GL_RGBA8, 0, - GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, + {WINED3DFMT_B10G10R10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0, + GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_X8B8G8R8, GL_RGB8, GL_RGB8, 0, - GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, - WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, - WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R16G16_UNORM, GL_RGB16_EXT, GL_RGB16_EXT, GL_RGBA16_EXT, - GL_RGB, GL_UNSIGNED_SHORT, - WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, - WINED3D_GL_EXT_NONE}, - {WINED3DFMT_A2R10G10B10, GL_RGB10_A2, GL_RGB10_A2, 0, - GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, - WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, - WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16_EXT, GL_RGBA16_EXT, 0, - GL_RGBA, GL_UNSIGNED_SHORT, + {WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16_EXT, GL_RGBA16_EXT, 0, + GL_RGBA, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET, WINED3D_GL_EXT_NONE}, /* Luminance */ - {WINED3DFMT_L8, GL_LUMINANCE8, GL_SLUMINANCE8_EXT, 0, - GL_LUMINANCE, GL_UNSIGNED_BYTE, + {WINED3DFMT_L8_UNORM, GL_LUMINANCE8, GL_SLUMINANCE8_EXT, 0, + GL_LUMINANCE, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_A8L8, GL_LUMINANCE8_ALPHA8, GL_SLUMINANCE8_ALPHA8_EXT, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, + {WINED3DFMT_L8A8_UNORM, GL_LUMINANCE8_ALPHA8, GL_SLUMINANCE8_ALPHA8_EXT, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_A4L4, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE4_ALPHA4, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, + {WINED3DFMT_L4A4_UNORM, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE4_ALPHA4, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, WINED3D_GL_EXT_NONE}, /* Bump mapping stuff */ - {WINED3DFMT_R8G8_SNORM, GL_RGB8, GL_RGB8, 0, - GL_BGR, GL_UNSIGNED_BYTE, + {WINED3DFMT_R8G8_SNORM, GL_RGB8, GL_RGB8, 0, + GL_BGR, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R8G8_SNORM, GL_DSDT8_NV, GL_DSDT8_NV, 0, - GL_DSDT_NV, GL_BYTE, + {WINED3DFMT_R8G8_SNORM, GL_DSDT8_NV, GL_DSDT8_NV, 0, + GL_DSDT_NV, GL_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, NV_TEXTURE_SHADER}, - {WINED3DFMT_L6V5U5, GL_RGB5, GL_RGB5, 0, - GL_RGB, GL_UNSIGNED_SHORT_5_6_5, + {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_RGB5, GL_RGB5, 0, + GL_RGB, GL_UNSIGNED_SHORT_5_6_5, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_L6V5U5, GL_DSDT8_MAG8_NV, GL_DSDT8_MAG8_NV, 0, - GL_DSDT_MAG_NV, GL_BYTE, + {WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_DSDT8_MAG8_NV, GL_DSDT8_MAG8_NV, 0, + GL_DSDT_MAG_NV, GL_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, NV_TEXTURE_SHADER}, - {WINED3DFMT_X8L8V8U8, GL_RGB8, GL_RGB8, 0, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, + {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_RGB8, GL_RGB8, 0, + GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_X8L8V8U8, GL_DSDT8_MAG8_INTENSITY8_NV, GL_DSDT8_MAG8_INTENSITY8_NV, 0, - GL_DSDT_MAG_VIB_NV, GL_UNSIGNED_INT_8_8_S8_S8_REV_NV, + {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_DSDT8_MAG8_INTENSITY8_NV, GL_DSDT8_MAG8_INTENSITY8_NV, 0, + GL_DSDT_MAG_VIB_NV, GL_UNSIGNED_INT_8_8_S8_S8_REV_NV, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, NV_TEXTURE_SHADER}, - {WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8, GL_RGBA8, 0, - GL_BGRA, GL_UNSIGNED_BYTE, + {WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8, GL_RGBA8, 0, + GL_BGRA, GL_UNSIGNED_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R8G8B8A8_SNORM, GL_SIGNED_RGBA8_NV, GL_SIGNED_RGBA8_NV, 0, - GL_RGBA, GL_BYTE, + {WINED3DFMT_R8G8B8A8_SNORM, GL_SIGNED_RGBA8_NV, GL_SIGNED_RGBA8_NV, 0, + GL_RGBA, GL_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, NV_TEXTURE_SHADER}, - {WINED3DFMT_R16G16_SNORM, GL_RGB16_EXT, GL_RGB16_EXT, 0, - GL_BGR, GL_UNSIGNED_SHORT, + {WINED3DFMT_R16G16_SNORM, GL_RGB16_EXT, GL_RGB16_EXT, 0, + GL_BGR, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R16G16_SNORM, GL_SIGNED_HILO16_NV, GL_SIGNED_HILO16_NV, 0, - GL_HILO_NV, GL_SHORT, + {WINED3DFMT_R16G16_SNORM, GL_SIGNED_HILO16_NV, GL_SIGNED_HILO16_NV, 0, + GL_HILO_NV, GL_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, NV_TEXTURE_SHADER}, /* Depth stencil formats */ - {WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, + {WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_DEPTH, ARB_DEPTH_TEXTURE}, - {WINED3DFMT_D32, GL_DEPTH_COMPONENT32_ARB, GL_DEPTH_COMPONENT32_ARB, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, + {WINED3DFMT_D32_UNORM, GL_DEPTH_COMPONENT32_ARB, GL_DEPTH_COMPONENT32_ARB, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, WINED3DFMT_FLAG_DEPTH, ARB_DEPTH_TEXTURE}, - {WINED3DFMT_D15S1, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, + {WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_DEPTH, ARB_DEPTH_TEXTURE}, - {WINED3DFMT_D15S1, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0, - GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, + {WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0, + GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL, EXT_PACKED_DEPTH_STENCIL}, - {WINED3DFMT_D24S8, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, + {WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0, + GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, + WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL, + ARB_FRAMEBUFFER_OBJECT}, + {WINED3DFMT_S8_UINT_D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH, ARB_DEPTH_TEXTURE}, - {WINED3DFMT_D24S8, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0, - GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, + {WINED3DFMT_S8_UINT_D24_UNORM, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0, + GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL, EXT_PACKED_DEPTH_STENCIL}, - {WINED3DFMT_D24X8, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, + {WINED3DFMT_S8_UINT_D24_UNORM, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0, + GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL, + ARB_FRAMEBUFFER_OBJECT}, + {WINED3DFMT_X8D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH, ARB_DEPTH_TEXTURE}, - {WINED3DFMT_D24X4S4, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, + {WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, WINED3DFMT_FLAG_DEPTH, ARB_DEPTH_TEXTURE}, - {WINED3DFMT_D24X4S4, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0, - GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, + {WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0, + GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL, EXT_PACKED_DEPTH_STENCIL}, - {WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, + {WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0, + GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, + WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL, + ARB_FRAMEBUFFER_OBJECT}, + {WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH, ARB_DEPTH_TEXTURE}, - {WINED3DFMT_L16, GL_LUMINANCE16_EXT, GL_LUMINANCE16_EXT, 0, - GL_LUMINANCE, GL_UNSIGNED_SHORT, + {WINED3DFMT_L16_UNORM, GL_LUMINANCE16_EXT, GL_LUMINANCE16_EXT, 0, + GL_LUMINANCE, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_D32F_LOCKABLE, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, 0, - GL_DEPTH_COMPONENT, GL_FLOAT, + {WINED3DFMT_D32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, 0, + GL_DEPTH_COMPONENT, GL_FLOAT, WINED3DFMT_FLAG_DEPTH, ARB_DEPTH_BUFFER_FLOAT}, - {WINED3DFMT_D24FS8, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0, - GL_DEPTH_STENCIL_EXT, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, + {WINED3DFMT_S8_UINT_D24_FLOAT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0, + GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL, ARB_DEPTH_BUFFER_FLOAT}, /* Vendor-specific formats */ - {WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, + {WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, ATI_TEXTURE_COMPRESSION_3DC}, - {WINED3DFMT_ATI2N, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, 0, - GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, + {WINED3DFMT_ATI2N, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, 0, + GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, EXT_TEXTURE_COMPRESSION_RGTC}, }; @@ -580,12 +599,12 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct GlPix glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0)); + gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); - status = GL_EXTCALL(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)); + status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER); checkGLcall("Framebuffer format check"); - if (status == GL_FRAMEBUFFER_COMPLETE_EXT) + if (status == GL_FRAMEBUFFER_COMPLETE) { TRACE("Format %s is supported as FBO color attachment\n", debug_d3dformat(format_desc->format)); format_desc->Flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE; @@ -614,19 +633,19 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct GlPix while(glGetError()); - GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, 0, 0)); + gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); glTexImage2D(GL_TEXTURE_2D, 0, format_desc->rtInternal, 16, 16, 0, format_desc->glFormat, format_desc->glType, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0)); + gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); - status = GL_EXTCALL(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)); + status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER); checkGLcall("Framebuffer format check"); - if (status == GL_FRAMEBUFFER_COMPLETE_EXT) + if (status == GL_FRAMEBUFFER_COMPLETE) { TRACE("Format %s rtInternal format is supported as FBO color attachment\n", debug_d3dformat(format_desc->format)); @@ -640,38 +659,36 @@ static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct GlPix } } - if (status == GL_FRAMEBUFFER_COMPLETE_EXT && format_desc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) + if (status == GL_FRAMEBUFFER_COMPLETE && format_desc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) { GLuint rb; - if (GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL)) + if (GL_SUPPORT(ARB_FRAMEBUFFER_OBJECT) + || GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL)) { - GL_EXTCALL(glGenRenderbuffersEXT(1, &rb)); - GL_EXTCALL(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rb)); - GL_EXTCALL(glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, 16, 16)); - GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, rb)); - GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, rb)); + gl_info->fbo_ops.glGenRenderbuffers(1, &rb); + gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, rb); + gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 16, 16); + gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rb); + gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rb); checkGLcall("RB attachment"); } glEnable(GL_BLEND); glClear(GL_COLOR_BUFFER_BIT); - if (glGetError() == GL_INVALID_FRAMEBUFFER_OPERATION_EXT) + if (glGetError() == GL_INVALID_FRAMEBUFFER_OPERATION) { while(glGetError()); TRACE("Format doesn't support post-pixelshader blending.\n"); format_desc->Flags &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING; } - if (GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL)) + if (GL_SUPPORT(ARB_FRAMEBUFFER_OBJECT) + || GL_SUPPORT(EXT_PACKED_DEPTH_STENCIL)) { - GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, 0)); - GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, 0)); - GL_EXTCALL(glDeleteRenderbuffersEXT(1, &rb)); + gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); + gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); + gl_info->fbo_ops.glDeleteRenderbuffers(1, &rb); checkGLcall("RB cleanup"); } } @@ -691,8 +708,8 @@ static void init_format_fbo_compat_info(struct wined3d_gl_info *gl_info) { ENTER_GL(); - GL_EXTCALL(glGenFramebuffersEXT(1, &fbo)); - GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo)); + gl_info->fbo_ops.glGenFramebuffers(1, &fbo); + gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo); LEAVE_GL(); } @@ -732,7 +749,7 @@ static void init_format_fbo_compat_info(struct wined3d_gl_info *gl_info) { ENTER_GL(); - GL_EXTCALL(glDeleteFramebuffersEXT(1, &fbo)); + gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo); LEAVE_GL(); } @@ -823,10 +840,10 @@ static BOOL check_filter(const struct wined3d_gl_info *gl_info, GLenum internal) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glEnable(GL_TEXTURE_2D); - GL_EXTCALL(glGenFramebuffersEXT(1, &fbo)); - GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo)); - GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, buffer, 0)); - glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); + gl_info->fbo_ops.glGenFramebuffers(1, &fbo); + gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo); + gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, buffer, 0); + glDrawBuffer(GL_COLOR_ATTACHMENT0); glViewport(0, 0, 16, 1); glDisable(GL_LIGHTING); @@ -866,8 +883,8 @@ static BOOL check_filter(const struct wined3d_gl_info *gl_info, GLenum internal) ret = TRUE; } - GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)); - GL_EXTCALL(glDeleteFramebuffersEXT(1, &fbo)); + gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0); + gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo); glDeleteTextures(1, &tex); glDeleteTextures(1, &buffer); @@ -997,10 +1014,10 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info) /* If GL_NV_texture_shader is not supported, those formats are converted, incompatibly * with each other */ - idx = getFmtIdx(WINED3DFMT_L6V5U5); + idx = getFmtIdx(WINED3DFMT_R5G5_SNORM_L6_UNORM); gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Z, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE); - idx = getFmtIdx(WINED3DFMT_X8L8V8U8); + idx = getFmtIdx(WINED3DFMT_R8G8_SNORM_L8X8_UNORM); gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc( 1, CHANNEL_SOURCE_X, 1, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_Z, 0, CHANNEL_SOURCE_W); idx = getFmtIdx(WINED3DFMT_R8G8B8A8_SNORM); @@ -1044,7 +1061,7 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info) if (GL_SUPPORT(EXT_VERTEX_ARRAY_BGRA)) { - idx = getFmtIdx(WINED3DFMT_A8R8G8B8); + idx = getFmtIdx(WINED3DFMT_B8G8R8A8_UNORM); gl_info->gl_formats[idx].gl_vtx_format = GL_BGRA; } @@ -1145,27 +1162,23 @@ const char* debug_d3dformat(WINED3DFORMAT fmt) { switch (fmt) { #define FMT_TO_STR(fmt) case fmt: return #fmt FMT_TO_STR(WINED3DFMT_UNKNOWN); - FMT_TO_STR(WINED3DFMT_R8G8B8); - FMT_TO_STR(WINED3DFMT_A8R8G8B8); - FMT_TO_STR(WINED3DFMT_X8R8G8B8); - FMT_TO_STR(WINED3DFMT_R5G6B5); - FMT_TO_STR(WINED3DFMT_X1R5G5B5); - FMT_TO_STR(WINED3DFMT_A1R5G5B5); - FMT_TO_STR(WINED3DFMT_A4R4G4B4); - FMT_TO_STR(WINED3DFMT_R3G3B2); - FMT_TO_STR(WINED3DFMT_A8R3G3B2); - FMT_TO_STR(WINED3DFMT_X4R4G4B4); - FMT_TO_STR(WINED3DFMT_X8B8G8R8); - FMT_TO_STR(WINED3DFMT_A2R10G10B10); - FMT_TO_STR(WINED3DFMT_A8P8); - FMT_TO_STR(WINED3DFMT_P8); - FMT_TO_STR(WINED3DFMT_L8); - FMT_TO_STR(WINED3DFMT_A8L8); - FMT_TO_STR(WINED3DFMT_A4L4); - FMT_TO_STR(WINED3DFMT_L6V5U5); - FMT_TO_STR(WINED3DFMT_X8L8V8U8); - FMT_TO_STR(WINED3DFMT_W11V11U10); - FMT_TO_STR(WINED3DFMT_A2W10V10U10); + FMT_TO_STR(WINED3DFMT_B8G8R8_UNORM); + FMT_TO_STR(WINED3DFMT_B5G5R5X1_UNORM); + FMT_TO_STR(WINED3DFMT_B4G4R4A4_UNORM); + FMT_TO_STR(WINED3DFMT_B2G3R3_UNORM); + FMT_TO_STR(WINED3DFMT_B2G3R3A8_UNORM); + FMT_TO_STR(WINED3DFMT_B4G4R4X4_UNORM); + FMT_TO_STR(WINED3DFMT_R8G8B8X8_UNORM); + FMT_TO_STR(WINED3DFMT_B10G10R10A2_UNORM); + FMT_TO_STR(WINED3DFMT_P8_UINT_A8_UNORM); + FMT_TO_STR(WINED3DFMT_P8_UINT); + FMT_TO_STR(WINED3DFMT_L8_UNORM); + FMT_TO_STR(WINED3DFMT_L8A8_UNORM); + FMT_TO_STR(WINED3DFMT_L4A4_UNORM); + FMT_TO_STR(WINED3DFMT_R5G5_SNORM_L6_UNORM); + FMT_TO_STR(WINED3DFMT_R8G8_SNORM_L8X8_UNORM); + FMT_TO_STR(WINED3DFMT_R10G11B11_SNORM); + FMT_TO_STR(WINED3DFMT_R10G10B10_SNORM_A2_UNORM); FMT_TO_STR(WINED3DFMT_UYVY); FMT_TO_STR(WINED3DFMT_YUY2); FMT_TO_STR(WINED3DFMT_YV12); @@ -1178,16 +1191,15 @@ const char* debug_d3dformat(WINED3DFORMAT fmt) { FMT_TO_STR(WINED3DFMT_G8R8_G8B8); FMT_TO_STR(WINED3DFMT_R8G8_B8G8); FMT_TO_STR(WINED3DFMT_D16_LOCKABLE); - FMT_TO_STR(WINED3DFMT_D32); - FMT_TO_STR(WINED3DFMT_D15S1); - FMT_TO_STR(WINED3DFMT_D24S8); - FMT_TO_STR(WINED3DFMT_D24X8); - FMT_TO_STR(WINED3DFMT_D24X4S4); - FMT_TO_STR(WINED3DFMT_L16); - FMT_TO_STR(WINED3DFMT_D32F_LOCKABLE); - FMT_TO_STR(WINED3DFMT_D24FS8); + FMT_TO_STR(WINED3DFMT_D32_UNORM); + FMT_TO_STR(WINED3DFMT_S1_UINT_D15_UNORM); + FMT_TO_STR(WINED3DFMT_S8_UINT_D24_UNORM); + FMT_TO_STR(WINED3DFMT_X8D24_UNORM); + FMT_TO_STR(WINED3DFMT_S4X4_UINT_D24_UNORM); + FMT_TO_STR(WINED3DFMT_L16_UNORM); + FMT_TO_STR(WINED3DFMT_S8_UINT_D24_FLOAT); FMT_TO_STR(WINED3DFMT_VERTEXDATA); - FMT_TO_STR(WINED3DFMT_CxV8U8); + FMT_TO_STR(WINED3DFMT_R8G8_SNORM_Cx); FMT_TO_STR(WINED3DFMT_ATI2N); FMT_TO_STR(WINED3DFMT_NVHU); FMT_TO_STR(WINED3DFMT_NVHS); @@ -1755,15 +1767,16 @@ const char* debug_d3dpool(WINED3DPOOL Pool) { const char *debug_fbostatus(GLenum status) { switch(status) { #define FBOSTATUS_TO_STR(u) case u: return #u - FBOSTATUS_TO_STR(GL_FRAMEBUFFER_COMPLETE_EXT); - FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT); - FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT); + FBOSTATUS_TO_STR(GL_FRAMEBUFFER_COMPLETE); + FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT); + FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT); FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT); FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT); - FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT); - FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT); - FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT); - FBOSTATUS_TO_STR(GL_FRAMEBUFFER_UNSUPPORTED_EXT); + FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER); + FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER); + FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE); + FBOSTATUS_TO_STR(GL_FRAMEBUFFER_UNSUPPORTED); + FBOSTATUS_TO_STR(GL_FRAMEBUFFER_UNDEFINED); #undef FBOSTATUS_TO_STR default: FIXME("Unrecognied FBO status 0x%08x\n", status); @@ -1781,7 +1794,7 @@ const char *debug_glerror(GLenum error) { GLERROR_TO_STR(GL_STACK_OVERFLOW); GLERROR_TO_STR(GL_STACK_UNDERFLOW); GLERROR_TO_STR(GL_OUT_OF_MEMORY); - GLERROR_TO_STR(GL_INVALID_FRAMEBUFFER_OPERATION_EXT); + GLERROR_TO_STR(GL_INVALID_FRAMEBUFFER_OPERATION); #undef GLERROR_TO_STR default: FIXME("Unrecognied GL error 0x%08x\n", error); @@ -2034,19 +2047,19 @@ BOOL getColorBits(const struct GlPixelFormatDesc *format_desc, TRACE("fmt: %s\n", debug_d3dformat(format_desc->format)); switch(format_desc->format) { - case WINED3DFMT_X8R8G8B8: - case WINED3DFMT_R8G8B8: - case WINED3DFMT_A8R8G8B8: + case WINED3DFMT_B8G8R8X8_UNORM: + case WINED3DFMT_B8G8R8_UNORM: + case WINED3DFMT_B8G8R8A8_UNORM: case WINED3DFMT_R8G8B8A8_UNORM: - case WINED3DFMT_A2R10G10B10: - case WINED3DFMT_X1R5G5B5: - case WINED3DFMT_A1R5G5B5: - case WINED3DFMT_R5G6B5: - case WINED3DFMT_X4R4G4B4: - case WINED3DFMT_A4R4G4B4: - case WINED3DFMT_R3G3B2: - case WINED3DFMT_A8P8: - case WINED3DFMT_P8: + case WINED3DFMT_B10G10R10A2_UNORM: + case WINED3DFMT_B5G5R5X1_UNORM: + case WINED3DFMT_B5G5R5A1_UNORM: + case WINED3DFMT_B5G6R5_UNORM: + case WINED3DFMT_B4G4R4X4_UNORM: + case WINED3DFMT_B4G4R4A4_UNORM: + case WINED3DFMT_B2G3R3_UNORM: + case WINED3DFMT_P8_UINT_A8_UNORM: + case WINED3DFMT_P8_UINT: break; default: ERR("Unsupported format: %s\n", debug_d3dformat(format_desc->format)); @@ -2072,13 +2085,13 @@ BOOL getDepthStencilBits(const struct GlPixelFormatDesc *format_desc, short *dep { case WINED3DFMT_D16_LOCKABLE: case WINED3DFMT_D16_UNORM: - case WINED3DFMT_D15S1: - case WINED3DFMT_D24X8: - case WINED3DFMT_D24X4S4: - case WINED3DFMT_D24S8: - case WINED3DFMT_D24FS8: - case WINED3DFMT_D32: - case WINED3DFMT_D32F_LOCKABLE: + case WINED3DFMT_S1_UINT_D15_UNORM: + case WINED3DFMT_X8D24_UNORM: + case WINED3DFMT_S4X4_UINT_D24_UNORM: + case WINED3DFMT_S8_UINT_D24_UNORM: + case WINED3DFMT_S8_UINT_D24_FLOAT: + case WINED3DFMT_D32_UNORM: + case WINED3DFMT_D32_FLOAT: break; default: FIXME("Unsupported stencil format: %s\n", debug_d3dformat(format_desc->format)); @@ -2096,11 +2109,11 @@ BOOL getDepthStencilBits(const struct GlPixelFormatDesc *format_desc, short *dep /* DirectDraw stuff */ WINED3DFORMAT pixelformat_for_depth(DWORD depth) { switch(depth) { - case 8: return WINED3DFMT_P8; - case 15: return WINED3DFMT_X1R5G5B5; - case 16: return WINED3DFMT_R5G6B5; - case 24: return WINED3DFMT_X8R8G8B8; /* Robots needs 24bit to be X8R8G8B8 */ - case 32: return WINED3DFMT_X8R8G8B8; /* EVE online and the Fur demo need 32bit AdapterDisplayMode to return X8R8G8B8 */ + case 8: return WINED3DFMT_P8_UINT; + case 15: return WINED3DFMT_B5G5R5X1_UNORM; + case 16: return WINED3DFMT_B5G6R5_UNORM; + case 24: return WINED3DFMT_B8G8R8X8_UNORM; /* Robots needs 24bit to be WINED3DFMT_B8G8R8X8_UNORM */ + case 32: return WINED3DFMT_B8G8R8X8_UNORM; /* EVE online and the Fur demo need 32bit AdapterDisplayMode to return WINED3DFMT_B8G8R8X8_UNORM */ default: return WINED3DFMT_UNKNOWN; } } @@ -2531,9 +2544,11 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting } else { settings->sRGB_write = 0; } - if(device->vs_clipping || !use_vs(stateblock)) { + if(device->vs_clipping || !use_vs(stateblock) || !stateblock->renderState[WINED3DRS_CLIPPING] || + !stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]) { /* No need to emulate clipplanes if GL supports native vertex shader clipping or if - * the fixed function vertex pipeline is used(which always supports clipplanes) + * the fixed function vertex pipeline is used(which always supports clipplanes), or + * if no clipplane is enabled */ settings->emul_clipplanes = 0; } else { diff --git a/reactos/dll/directx/wine/wined3d/vertexdeclaration.c b/reactos/dll/directx/wine/wined3d/vertexdeclaration.c index 2c2b7634783..db595be82ad 100644 --- a/reactos/dll/directx/wine/wined3d/vertexdeclaration.c +++ b/reactos/dll/directx/wine/wined3d/vertexdeclaration.c @@ -5,6 +5,7 @@ * Copyright 2004 Jason Edmeades * Copyright 2004 Christian Costa * Copyright 2005 Oliver Stieber + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -74,6 +75,7 @@ static ULONG WINAPI IWineD3DVertexDeclarationImpl_Release(IWineD3DVertexDeclarat } HeapFree(GetProcessHeap(), 0, This->elements); + This->parent_ops->wined3d_object_destroyed(This->parent); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -129,7 +131,7 @@ static BOOL declaration_element_valid_ffp(const WINED3DVERTEXELEMENT *element) case WINED3DFMT_R32G32_FLOAT: case WINED3DFMT_R32G32B32_FLOAT: case WINED3DFMT_R32G32B32A32_FLOAT: - case WINED3DFMT_A8R8G8B8: + case WINED3DFMT_B8G8R8A8_UNORM: case WINED3DFMT_R8G8B8A8_UINT: case WINED3DFMT_R16G16_SINT: case WINED3DFMT_R16G16B16A16_SINT: @@ -173,7 +175,7 @@ static BOOL declaration_element_valid_ffp(const WINED3DVERTEXELEMENT *element) { case WINED3DFMT_R32G32B32_FLOAT: case WINED3DFMT_R32G32B32A32_FLOAT: - case WINED3DFMT_A8R8G8B8: + case WINED3DFMT_B8G8R8A8_UNORM: case WINED3DFMT_R8G8B8A8_UINT: case WINED3DFMT_R16G16B16A16_SINT: case WINED3DFMT_R8G8B8A8_UNORM: @@ -190,86 +192,7 @@ static BOOL declaration_element_valid_ffp(const WINED3DVERTEXELEMENT *element) } } -HRESULT vertexdeclaration_init(IWineD3DVertexDeclarationImpl *This, - const WINED3DVERTEXELEMENT *elements, UINT element_count) -{ - HRESULT hr = WINED3D_OK; - unsigned int i; - char isPreLoaded[MAX_STREAMS]; - - TRACE("(%p) : d3d version %d\n", This, ((IWineD3DImpl *)This->wineD3DDevice->wineD3D)->dxVersion); - memset(isPreLoaded, 0, sizeof(isPreLoaded)); - - if (TRACE_ON(d3d_decl)) { - for (i = 0; i < element_count; ++i) { - dump_wined3dvertexelement(elements+i); - } - } - - This->element_count = element_count; - This->elements = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->elements) * element_count); - if (!This->elements) - { - ERR("Memory allocation failed\n"); - return WINED3DERR_OUTOFVIDEOMEMORY; - } - - /* Do some static analysis on the elements to make reading the declaration more comfortable - * for the drawing code - */ - This->num_streams = 0; - This->position_transformed = FALSE; - for (i = 0; i < element_count; ++i) { - struct wined3d_vertex_declaration_element *e = &This->elements[i]; - - e->format_desc = getFormatDescEntry(elements[i].format, &This->wineD3DDevice->adapter->gl_info); - e->ffp_valid = declaration_element_valid_ffp(&elements[i]); - e->input_slot = elements[i].input_slot; - e->offset = elements[i].offset; - e->output_slot = elements[i].output_slot; - e->method = elements[i].method; - e->usage = elements[i].usage; - e->usage_idx = elements[i].usage_idx; - - if (e->usage == WINED3DDECLUSAGE_POSITIONT) This->position_transformed = TRUE; - - /* Find the Streams used in the declaration. The vertex buffers have to be loaded - * when drawing, but filter tesselation pseudo streams - */ - if (e->input_slot >= MAX_STREAMS) continue; - - if (!e->format_desc->gl_vtx_format) - { - FIXME("The application tries to use an unsupported format (%s), returning E_FAIL\n", - debug_d3dformat(elements[i].format)); - /* The caller will release the vdecl, which will free This->elements */ - return E_FAIL; - } - - if (e->offset & 0x3) - { - WARN("Declaration element %u is not 4 byte aligned(%u), returning E_FAIL\n", i, e->offset); - return E_FAIL; - } - - if (!isPreLoaded[e->input_slot]) - { - This->streams[This->num_streams] = e->input_slot; - This->num_streams++; - isPreLoaded[e->input_slot] = 1; - } - - if (elements[i].format == WINED3DFMT_R16G16_FLOAT || elements[i].format == WINED3DFMT_R16G16B16A16_FLOAT) - { - if (!GL_SUPPORT(ARB_HALF_FLOAT_VERTEX)) This->half_float_conv_needed = TRUE; - } - } - - TRACE("Returning\n"); - return hr; -} - -const IWineD3DVertexDeclarationVtbl IWineD3DVertexDeclaration_Vtbl = +static const IWineD3DVertexDeclarationVtbl IWineD3DVertexDeclaration_Vtbl = { /* IUnknown */ IWineD3DVertexDeclarationImpl_QueryInterface, @@ -279,3 +202,84 @@ const IWineD3DVertexDeclarationVtbl IWineD3DVertexDeclaration_Vtbl = IWineD3DVertexDeclarationImpl_GetParent, IWineD3DVertexDeclarationImpl_GetDevice, }; + +HRESULT vertexdeclaration_init(IWineD3DVertexDeclarationImpl *declaration, IWineD3DDeviceImpl *device, + const WINED3DVERTEXELEMENT *elements, UINT element_count, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) +{ + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + WORD preloaded = 0; /* MAX_STREAMS, 16 */ + unsigned int i; + + if (TRACE_ON(d3d_decl)) + { + for (i = 0; i < element_count; ++i) + { + dump_wined3dvertexelement(elements + i); + } + } + + declaration->lpVtbl = &IWineD3DVertexDeclaration_Vtbl; + declaration->ref = 1; + declaration->parent = parent; + declaration->parent_ops = parent_ops; + declaration->wineD3DDevice = device; + declaration->elements = HeapAlloc(GetProcessHeap(), 0, sizeof(*declaration->elements) * element_count); + if (!declaration->elements) + { + ERR("Failed to allocate elements memory.\n"); + return E_OUTOFMEMORY; + } + declaration->element_count = element_count; + + /* Do some static analysis on the elements to make reading the + * declaration more comfortable for the drawing code. */ + for (i = 0; i < element_count; ++i) + { + struct wined3d_vertex_declaration_element *e = &declaration->elements[i]; + + e->format_desc = getFormatDescEntry(elements[i].format, gl_info); + e->ffp_valid = declaration_element_valid_ffp(&elements[i]); + e->input_slot = elements[i].input_slot; + e->offset = elements[i].offset; + e->output_slot = elements[i].output_slot; + e->method = elements[i].method; + e->usage = elements[i].usage; + e->usage_idx = elements[i].usage_idx; + + if (e->usage == WINED3DDECLUSAGE_POSITIONT) declaration->position_transformed = TRUE; + + /* Find the streams used in the declaration. The vertex buffers have + * to be loaded when drawing, but filter tesselation pseudo streams. */ + if (e->input_slot >= MAX_STREAMS) continue; + + if (!e->format_desc->gl_vtx_format) + { + FIXME("The application tries to use an unsupported format (%s), returning E_FAIL.\n", + debug_d3dformat(elements[i].format)); + HeapFree(GetProcessHeap(), 0, declaration->elements); + return E_FAIL; + } + + if (e->offset & 0x3) + { + WARN("Declaration element %u is not 4 byte aligned(%u), returning E_FAIL.\n", i, e->offset); + HeapFree(GetProcessHeap(), 0, declaration->elements); + return E_FAIL; + } + + if (!(preloaded & (1 << e->input_slot))) + { + declaration->streams[declaration->num_streams] = e->input_slot; + ++declaration->num_streams; + preloaded |= 1 << e->input_slot; + } + + if (elements[i].format == WINED3DFMT_R16G16_FLOAT || elements[i].format == WINED3DFMT_R16G16B16A16_FLOAT) + { + if (!gl_info->supported[ARB_HALF_FLOAT_VERTEX]) declaration->half_float_conv_needed = TRUE; + } + } + + return WINED3D_OK; +} diff --git a/reactos/dll/directx/wine/wined3d/vertexshader.c b/reactos/dll/directx/wine/wined3d/vertexshader.c index d24ecd6364a..f55f1fb09a6 100644 --- a/reactos/dll/directx/wine/wined3d/vertexshader.c +++ b/reactos/dll/directx/wine/wined3d/vertexshader.c @@ -7,6 +7,7 @@ * Copyright 2005 Oliver Stieber * Copyright 2006 Ivan Gyurdiev * Copyright 2007-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -174,6 +175,7 @@ static ULONG WINAPI IWineD3DVertexShaderImpl_Release(IWineD3DVertexShader *iface if (!refcount) { shader_cleanup((IWineD3DBaseShader *)iface); + This->baseShader.parent_ops->wined3d_object_destroyed(This->baseShader.parent); HeapFree(GetProcessHeap(), 0, This); } @@ -187,7 +189,7 @@ static ULONG WINAPI IWineD3DVertexShaderImpl_Release(IWineD3DVertexShader *iface static HRESULT WINAPI IWineD3DVertexShaderImpl_GetParent(IWineD3DVertexShader *iface, IUnknown** parent){ IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface; - *parent = This->parent; + *parent = This->baseShader.parent; IUnknown_AddRef(*parent); TRACE("(%p) : returning %p\n", This, *parent); return WINED3D_OK; @@ -222,50 +224,46 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_GetFunction(IWineD3DVertexShader* return WINED3D_OK; } -/* Note that for vertex shaders CompileShader isn't called until the - * shader is first used. The reason for this is that we need the vertex - * declaration the shader will be used with in order to determine if - * the data in a register is of type D3DCOLOR, and needs swizzling. */ -static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader *iface, - const DWORD *pFunction, const struct wined3d_shader_signature *output_signature) +static HRESULT vertexshader_set_function(IWineD3DVertexShaderImpl *shader, + const DWORD *byte_code, const struct wined3d_shader_signature *output_signature) { - IWineD3DVertexShaderImpl *This =(IWineD3DVertexShaderImpl *)iface; - IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *) This->baseShader.device; + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; const struct wined3d_shader_frontend *fe; unsigned int i; HRESULT hr; - shader_reg_maps *reg_maps = &This->baseShader.reg_maps; + shader_reg_maps *reg_maps = &shader->baseShader.reg_maps; - TRACE("(%p) : pFunction %p\n", iface, pFunction); + TRACE("shader %p, byte_code %p, output_signature %p.\n", shader, byte_code, output_signature); - fe = shader_select_frontend(*pFunction); + fe = shader_select_frontend(*byte_code); if (!fe) { FIXME("Unable to find frontend for shader.\n"); return WINED3DERR_INVALIDCALL; } - This->baseShader.frontend = fe; - This->baseShader.frontend_data = fe->shader_init(pFunction, output_signature); - if (!This->baseShader.frontend_data) + shader->baseShader.frontend = fe; + shader->baseShader.frontend_data = fe->shader_init(byte_code, output_signature); + if (!shader->baseShader.frontend_data) { FIXME("Failed to initialize frontend.\n"); return WINED3DERR_INVALIDCALL; } /* First pass: trace shader */ - if (TRACE_ON(d3d_shader)) shader_trace_init(fe, This->baseShader.frontend_data, pFunction); + if (TRACE_ON(d3d_shader)) shader_trace_init(fe, shader->baseShader.frontend_data, byte_code); /* Initialize immediate constant lists */ - list_init(&This->baseShader.constantsF); - list_init(&This->baseShader.constantsB); - list_init(&This->baseShader.constantsI); + list_init(&shader->baseShader.constantsF); + list_init(&shader->baseShader.constantsB); + list_init(&shader->baseShader.constantsI); /* Second pass: figure out registers used, semantics, etc.. */ - This->min_rel_offset = GL_LIMITS(vshader_constantsF); - This->max_rel_offset = 0; - hr = shader_get_registers_used((IWineD3DBaseShader*) This, fe, - reg_maps, This->attributes, NULL, This->output_signature, - pFunction, GL_LIMITS(vshader_constantsF)); + shader->min_rel_offset = gl_info->max_vshader_constantsF; + shader->max_rel_offset = 0; + hr = shader_get_registers_used((IWineD3DBaseShader *)shader, fe, + reg_maps, shader->attributes, NULL, shader->output_signature, + byte_code, gl_info->max_vshader_constantsF); if (hr != WINED3D_OK) return hr; if (output_signature) @@ -274,34 +272,42 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader { struct wined3d_shader_signature_element *e = &output_signature->elements[i]; reg_maps->output_registers |= 1 << e->register_idx; - This->output_signature[e->register_idx] = *e; + shader->output_signature[e->register_idx] = *e; } } - vshader_set_limits(This); + vshader_set_limits(shader); - if (deviceImpl->vs_selected_mode == SHADER_ARB - && ((GLINFO_LOCATION).quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT) - && This->min_rel_offset <= This->max_rel_offset) + if (device->vs_selected_mode == SHADER_ARB + && (gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT) + && shader->min_rel_offset <= shader->max_rel_offset) { - if(This->max_rel_offset - This->min_rel_offset > 127) { + if (shader->max_rel_offset - shader->min_rel_offset > 127) + { FIXME("The difference between the minimum and maximum relative offset is > 127\n"); FIXME("Which this OpenGL implementation does not support. Try using GLSL\n"); - FIXME("Min: %d, Max: %d\n", This->min_rel_offset, This->max_rel_offset); - } else if(This->max_rel_offset - This->min_rel_offset > 63) { - This->rel_offset = This->min_rel_offset + 63; - } else if(This->max_rel_offset > 63) { - This->rel_offset = This->min_rel_offset; - } else { - This->rel_offset = 0; + FIXME("Min: %d, Max: %d\n", shader->min_rel_offset, shader->max_rel_offset); + } + else if (shader->max_rel_offset - shader->min_rel_offset > 63) + { + shader->rel_offset = shader->min_rel_offset + 63; + } + else if (shader->max_rel_offset > 63) + { + shader->rel_offset = shader->min_rel_offset; + } + else + { + shader->rel_offset = 0; } } - This->baseShader.load_local_constsF = This->baseShader.reg_maps.usesrelconstF && !list_empty(&This->baseShader.constantsF); + shader->baseShader.load_local_constsF = shader->baseShader.reg_maps.usesrelconstF + && !list_empty(&shader->baseShader.constantsF); /* copy the function ... because it will certainly be released by application */ - This->baseShader.function = HeapAlloc(GetProcessHeap(), 0, This->baseShader.functionLength); - if (!This->baseShader.function) return E_OUTOFMEMORY; - memcpy(This->baseShader.function, pFunction, This->baseShader.functionLength); + shader->baseShader.function = HeapAlloc(GetProcessHeap(), 0, shader->baseShader.functionLength); + if (!shader->baseShader.function) return E_OUTOFMEMORY; + memcpy(shader->baseShader.function, byte_code, shader->baseShader.functionLength); return WINED3D_OK; } @@ -332,7 +338,7 @@ static HRESULT WINAPI IWIneD3DVertexShaderImpl_SetLocalConstantsF(IWineD3DVertex return WINED3D_OK; } -const IWineD3DVertexShaderVtbl IWineD3DVertexShader_Vtbl = +static const IWineD3DVertexShaderVtbl IWineD3DVertexShader_Vtbl = { /*** IUnknown methods ***/ IWineD3DVertexShaderImpl_QueryInterface, @@ -341,10 +347,9 @@ const IWineD3DVertexShaderVtbl IWineD3DVertexShader_Vtbl = /*** IWineD3DBase methods ***/ IWineD3DVertexShaderImpl_GetParent, /*** IWineD3DBaseShader methods ***/ - IWineD3DVertexShaderImpl_SetFunction, - /*** IWineD3DVertexShader methods ***/ IWineD3DVertexShaderImpl_GetDevice, IWineD3DVertexShaderImpl_GetFunction, + /*** IWineD3DVertexShader methods ***/ IWIneD3DVertexShaderImpl_SetLocalConstantsF }; @@ -352,3 +357,25 @@ void find_vs_compile_args(IWineD3DVertexShaderImpl *shader, IWineD3DStateBlockIm args->fog_src = stateblock->renderState[WINED3DRS_FOGTABLEMODE] == WINED3DFOG_NONE ? VS_FOG_COORD : VS_FOG_Z; args->swizzle_map = ((IWineD3DDeviceImpl *)shader->baseShader.device)->strided_streams.swizzle_map; } + +HRESULT vertexshader_init(IWineD3DVertexShaderImpl *shader, IWineD3DDeviceImpl *device, + const DWORD *byte_code, const struct wined3d_shader_signature *output_signature, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) +{ + HRESULT hr; + + if (!byte_code) return WINED3DERR_INVALIDCALL; + + shader->lpVtbl = &IWineD3DVertexShader_Vtbl; + shader_init(&shader->baseShader, device, parent, parent_ops); + + hr = vertexshader_set_function(shader, byte_code, output_signature); + if (FAILED(hr)) + { + WARN("Failed to set function, hr %#x.\n", hr); + shader_cleanup((IWineD3DBaseShader *)shader); + return hr; + } + + return WINED3D_OK; +} diff --git a/reactos/dll/directx/wine/wined3d/volume.c b/reactos/dll/directx/wine/wined3d/volume.c index 85e8f3ab831..b428e3296db 100644 --- a/reactos/dll/directx/wine/wined3d/volume.c +++ b/reactos/dll/directx/wine/wined3d/volume.c @@ -4,6 +4,7 @@ * Copyright 2002-2005 Jason Edmeades * Copyright 2002-2005 Raphael Junqueira * Copyright 2005 Oliver Stieber + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -122,6 +123,7 @@ static ULONG WINAPI IWineD3DVolumeImpl_Release(IWineD3DVolume *iface) { ref = InterlockedDecrement(&This->resource.ref); if (ref == 0) { resource_cleanup((IWineD3DResource *)iface); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -264,7 +266,8 @@ static HRESULT WINAPI IWineD3DVolumeImpl_LockBox(IWineD3DVolume *iface, WINED3DL if (containerType == WINED3DRTYPE_VOLUMETEXTURE) { IWineD3DBaseTextureImpl* pTexture = (IWineD3DBaseTextureImpl*) cont; - pTexture->baseTexture.dirty = TRUE; + pTexture->baseTexture.texture_rgb.dirty = TRUE; + pTexture->baseTexture.texture_srgb.dirty = TRUE; } else { FIXME("Set dirty on container type %d\n", containerType); } @@ -346,7 +349,7 @@ static HRESULT WINAPI IWineD3DVolumeImpl_LoadTexture(IWineD3DVolume *iface, int } -const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl = +static const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl = { /* IUnknown */ IWineD3DVolumeImpl_QueryInterface, @@ -372,3 +375,40 @@ const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl = IWineD3DVolumeImpl_LoadTexture, IWineD3DVolumeImpl_SetContainer }; + +HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT width, + UINT height, UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) +{ + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info); + HRESULT hr; + + if (!gl_info->supported[EXT_TEXTURE3D]) + { + WARN("Volume cannot be created - no volume texture support.\n"); + return WINED3DERR_INVALIDCALL; + } + + volume->lpVtbl = &IWineD3DVolume_Vtbl; + + hr = resource_init((IWineD3DResource *)volume, WINED3DRTYPE_VOLUME, device, + width * height * depth * format_desc->byte_count, usage, format_desc, pool, parent, parent_ops); + if (FAILED(hr)) + { + WARN("Failed to initialize resource, returning %#x.\n", hr); + return hr; + } + + volume->currentDesc.Width = width; + volume->currentDesc.Height = height; + volume->currentDesc.Depth = depth; + volume->lockable = TRUE; + volume->locked = FALSE; + memset(&volume->lockedBox, 0, sizeof(volume->lockedBox)); + volume->dirty = TRUE; + + volume_add_dirty_box((IWineD3DVolume *)volume, NULL); + + return WINED3D_OK; +} diff --git a/reactos/dll/directx/wine/wined3d/volumetexture.c b/reactos/dll/directx/wine/wined3d/volumetexture.c index 134ff74398c..446b94a1817 100644 --- a/reactos/dll/directx/wine/wined3d/volumetexture.c +++ b/reactos/dll/directx/wine/wined3d/volumetexture.c @@ -4,6 +4,7 @@ * Copyright 2002-2005 Jason Edmeades * Copyright 2002-2005 Raphael Junqueira * Copyright 2005 Oliver Stieber + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -52,7 +53,7 @@ static void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINE /* If the texture is marked dirty or the srgb sampler setting has changed * since the last load then reload the volumes. */ - if (This->baseTexture.dirty) + if (This->baseTexture.texture_rgb.dirty) { for (i = 0; i < This->baseTexture.levels; ++i) { @@ -73,10 +74,10 @@ static void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINE } /* No longer dirty */ - This->baseTexture.dirty = FALSE; + This->baseTexture.texture_rgb.dirty = FALSE; } -static void volumetexture_cleanup(IWineD3DVolumeTextureImpl *This, D3DCB_DESTROYVOLUMEFN volume_destroy_cb) +static void volumetexture_cleanup(IWineD3DVolumeTextureImpl *This) { unsigned int i; @@ -90,103 +91,12 @@ static void volumetexture_cleanup(IWineD3DVolumeTextureImpl *This, D3DCB_DESTROY { /* Cleanup the container. */ IWineD3DVolume_SetContainer(volume, NULL); - volume_destroy_cb(volume); + IWineD3DVolume_Release(volume); } } basetexture_cleanup((IWineD3DBaseTexture *)This); } -HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT height, UINT depth, UINT levels, - IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent) -{ - const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info); - UINT tmp_w, tmp_h, tmp_d; - unsigned int i; - HRESULT hr; - - /* TODO: It should only be possible to create textures for formats - * that are reported as supported. */ - if (WINED3DFMT_UNKNOWN >= format) - { - WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); - return WINED3DERR_INVALIDCALL; - } - - if (!GL_SUPPORT(EXT_TEXTURE3D)) - { - WARN("(%p) : Texture cannot be created - no volume texture support.\n", texture); - return WINED3DERR_INVALIDCALL; - } - - /* Calculate levels for mip mapping. */ - if (usage & WINED3DUSAGE_AUTOGENMIPMAP) - { - if (!GL_SUPPORT(SGIS_GENERATE_MIPMAP)) - { - WARN("No mipmap generation support, returning D3DERR_INVALIDCALL.\n"); - return WINED3DERR_INVALIDCALL; - } - - if (levels > 1) - { - WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n"); - return WINED3DERR_INVALIDCALL; - } - - levels = 1; - } - else if (!levels) - { - levels = wined3d_log2i(max(max(width, height), depth)) + 1; - TRACE("Calculated levels = %u.\n", levels); - } - - hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, - WINED3DRTYPE_VOLUMETEXTURE, device, 0, usage, format_desc, pool, parent); - if (FAILED(hr)) - { - WARN("Failed to initialize basetexture, returning %#x.\n", hr); - return hr; - } - - /* Is NP2 support for volumes needed? */ - texture->baseTexture.pow2Matrix[0] = 1.0f; - texture->baseTexture.pow2Matrix[5] = 1.0f; - texture->baseTexture.pow2Matrix[10] = 1.0f; - texture->baseTexture.pow2Matrix[15] = 1.0f; - - /* Generate all the surfaces. */ - tmp_w = width; - tmp_h = height; - tmp_d = depth; - - for (i = 0; i < texture->baseTexture.levels; ++i) - { - /* Create the volume. */ - hr = IWineD3DDeviceParent_CreateVolume(device->device_parent, parent, - tmp_w, tmp_h, tmp_d, format, pool, usage, &texture->volumes[i]); - if (FAILED(hr)) - { - ERR("Creating a volume for the volume texture failed, hr %#x.\n", hr); - texture->volumes[i] = NULL; - volumetexture_cleanup(texture, D3DCB_DefaultDestroyVolume); - return hr; - } - - /* Set its container to this texture. */ - IWineD3DVolume_SetContainer(texture->volumes[i], (IWineD3DBase *)texture); - - /* Calculate the next mipmap level. */ - tmp_w = max(1, tmp_w >> 1); - tmp_h = max(1, tmp_h >> 1); - tmp_d = max(1, tmp_d >> 1); - } - texture->baseTexture.internal_preload = volumetexture_internal_preload; - - return WINED3D_OK; -} - #undef GLINFO_LOCATION /* ******************************************* @@ -223,8 +133,11 @@ static ULONG WINAPI IWineD3DVolumeTextureImpl_Release(IWineD3DVolumeTexture *ifa ULONG ref; TRACE("(%p) : Releasing from %d\n", This, This->resource.ref); ref = InterlockedDecrement(&This->resource.ref); - if (ref == 0) { - IWineD3DVolumeTexture_Destroy(iface, D3DCB_DefaultDestroyVolume); + if (!ref) + { + volumetexture_cleanup(This); + This->resource.parent_ops->wined3d_object_destroyed(This->resource.parent); + HeapFree(GetProcessHeap(), 0, This); } return ref; } @@ -344,14 +257,6 @@ static BOOL WINAPI IWineD3DVolumeTextureImpl_IsCondNP2(IWineD3DVolumeTexture *if /* ******************************************* IWineD3DVolumeTexture IWineD3DVolumeTexture parts follow ******************************************* */ -static void WINAPI IWineD3DVolumeTextureImpl_Destroy(IWineD3DVolumeTexture *iface, D3DCB_DESTROYVOLUMEFN D3DCB_DestroyVolume) { - IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface; - - volumetexture_cleanup(This, D3DCB_DestroyVolume); - - HeapFree(GetProcessHeap(), 0, This); -} - static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetLevelDesc(IWineD3DVolumeTexture *iface, UINT Level,WINED3DVOLUME_DESC *pDesc) { IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface; if (Level < This->baseTexture.levels) { @@ -407,14 +312,15 @@ static HRESULT WINAPI IWineD3DVolumeTextureImpl_UnlockBox(IWineD3DVolumeTexture static HRESULT WINAPI IWineD3DVolumeTextureImpl_AddDirtyBox(IWineD3DVolumeTexture *iface, CONST WINED3DBOX* pDirtyBox) { IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface; - This->baseTexture.dirty = TRUE; + This->baseTexture.texture_rgb.dirty = TRUE; + This->baseTexture.texture_srgb.dirty = TRUE; TRACE("(%p) : dirtyfication of volume Level (0)\n", This); volume_add_dirty_box(This->volumes[0], pDirtyBox); return WINED3D_OK; } -const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl = +static const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl = { /* IUnknown */ IWineD3DVolumeTextureImpl_QueryInterface, @@ -445,10 +351,103 @@ const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl = IWineD3DVolumeTextureImpl_GetTextureDimensions, IWineD3DVolumeTextureImpl_IsCondNP2, /* volume texture */ - IWineD3DVolumeTextureImpl_Destroy, IWineD3DVolumeTextureImpl_GetLevelDesc, IWineD3DVolumeTextureImpl_GetVolumeLevel, IWineD3DVolumeTextureImpl_LockBox, IWineD3DVolumeTextureImpl_UnlockBox, IWineD3DVolumeTextureImpl_AddDirtyBox }; + +HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT height, + UINT depth, UINT levels, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) +{ + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info); + UINT tmp_w, tmp_h, tmp_d; + unsigned int i; + HRESULT hr; + + /* TODO: It should only be possible to create textures for formats + * that are reported as supported. */ + if (WINED3DFMT_UNKNOWN >= format) + { + WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); + return WINED3DERR_INVALIDCALL; + } + + if (!gl_info->supported[EXT_TEXTURE3D]) + { + WARN("(%p) : Texture cannot be created - no volume texture support.\n", texture); + return WINED3DERR_INVALIDCALL; + } + + /* Calculate levels for mip mapping. */ + if (usage & WINED3DUSAGE_AUTOGENMIPMAP) + { + if (!gl_info->supported[SGIS_GENERATE_MIPMAP]) + { + WARN("No mipmap generation support, returning D3DERR_INVALIDCALL.\n"); + return WINED3DERR_INVALIDCALL; + } + + if (levels > 1) + { + WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n"); + return WINED3DERR_INVALIDCALL; + } + + levels = 1; + } + else if (!levels) + { + levels = wined3d_log2i(max(max(width, height), depth)) + 1; + TRACE("Calculated levels = %u.\n", levels); + } + + texture->lpVtbl = &IWineD3DVolumeTexture_Vtbl; + + hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_VOLUMETEXTURE, + device, 0, usage, format_desc, pool, parent, parent_ops); + if (FAILED(hr)) + { + WARN("Failed to initialize basetexture, returning %#x.\n", hr); + return hr; + } + + /* Is NP2 support for volumes needed? */ + texture->baseTexture.pow2Matrix[0] = 1.0f; + texture->baseTexture.pow2Matrix[5] = 1.0f; + texture->baseTexture.pow2Matrix[10] = 1.0f; + texture->baseTexture.pow2Matrix[15] = 1.0f; + + /* Generate all the surfaces. */ + tmp_w = width; + tmp_h = height; + tmp_d = depth; + + for (i = 0; i < texture->baseTexture.levels; ++i) + { + /* Create the volume. */ + hr = IWineD3DDeviceParent_CreateVolume(device->device_parent, parent, + tmp_w, tmp_h, tmp_d, format, pool, usage, &texture->volumes[i]); + if (FAILED(hr)) + { + ERR("Creating a volume for the volume texture failed, hr %#x.\n", hr); + texture->volumes[i] = NULL; + volumetexture_cleanup(texture); + return hr; + } + + /* Set its container to this texture. */ + IWineD3DVolume_SetContainer(texture->volumes[i], (IWineD3DBase *)texture); + + /* Calculate the next mipmap level. */ + tmp_w = max(1, tmp_w >> 1); + tmp_h = max(1, tmp_h >> 1); + tmp_d = max(1, tmp_d >> 1); + } + texture->baseTexture.internal_preload = volumetexture_internal_preload; + + return WINED3D_OK; +} diff --git a/reactos/dll/directx/wine/wined3d/wined3d_gl.h b/reactos/dll/directx/wine/wined3d/wined3d_gl.h index 9c85d576029..1030931da16 100644 --- a/reactos/dll/directx/wine/wined3d/wined3d_gl.h +++ b/reactos/dll/directx/wine/wined3d/wined3d_gl.h @@ -802,343 +802,361 @@ typedef void GLvoid; #define GL_SAMPLE_COVERAGE_INVERT 0x80AB #define GL_MULTISAMPLE_BIT 0x20000000 -void (WINE_GLAPI *glAccum) (GLenum op, GLfloat value); -void (WINE_GLAPI *glAlphaFunc) (GLenum func, GLclampf ref); -GLboolean (WINE_GLAPI *glAreTexturesResident) (GLsizei n, const GLuint* textures, GLboolean* residences); -void (WINE_GLAPI *glArrayElement) (GLint i); -void (WINE_GLAPI *glBegin) (GLenum mode); -void (WINE_GLAPI *glBindTexture) (GLenum target, GLuint texture); -void (WINE_GLAPI *glBitmap) (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte* bitmap); -void (WINE_GLAPI *glBlendFunc) (GLenum sfactor, GLenum dfactor); -void (WINE_GLAPI *glCallList) (GLuint list); -void (WINE_GLAPI *glCallLists) (GLsizei n, GLenum type, const GLvoid* lists); -void (WINE_GLAPI *glClear) (GLbitfield mask); -void (WINE_GLAPI *glClearAccum) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -void (WINE_GLAPI *glClearColor) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -void (WINE_GLAPI *glClearDepth) (GLclampd depth); -void (WINE_GLAPI *glClearIndex) (GLfloat c); -void (WINE_GLAPI *glClearStencil) (GLint s); -void (WINE_GLAPI *glClipPlane) (GLenum plane, const GLdouble* equation); -void (WINE_GLAPI *glColor3b) (GLbyte red, GLbyte green, GLbyte blue); -void (WINE_GLAPI *glColor3bv) (const GLbyte* v); -void (WINE_GLAPI *glColor3d) (GLdouble red, GLdouble green, GLdouble blue); -void (WINE_GLAPI *glColor3dv) (const GLdouble* v); -void (WINE_GLAPI *glColor3f) (GLfloat red, GLfloat green, GLfloat blue); -void (WINE_GLAPI *glColor3fv) (const GLfloat* v); -void (WINE_GLAPI *glColor3i) (GLint red, GLint green, GLint blue); -void (WINE_GLAPI *glColor3iv) (const GLint* v); -void (WINE_GLAPI *glColor3s) (GLshort red, GLshort green, GLshort blue); -void (WINE_GLAPI *glColor3sv) (const GLshort* v); -void (WINE_GLAPI *glColor3ub) (GLubyte red, GLubyte green, GLubyte blue); -void (WINE_GLAPI *glColor3ubv) (const GLubyte* v); -void (WINE_GLAPI *glColor3ui) (GLuint red, GLuint green, GLuint blue); -void (WINE_GLAPI *glColor3uiv) (const GLuint* v); -void (WINE_GLAPI *glColor3us) (GLushort red, GLushort green, GLushort blue); -void (WINE_GLAPI *glColor3usv) (const GLushort* v); -void (WINE_GLAPI *glColor4b) (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -void (WINE_GLAPI *glColor4bv) (const GLbyte* v); -void (WINE_GLAPI *glColor4d) (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -void (WINE_GLAPI *glColor4dv) (const GLdouble* v); -void (WINE_GLAPI *glColor4f) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -void (WINE_GLAPI *glColor4fv) (const GLfloat* v); -void (WINE_GLAPI *glColor4i) (GLint red, GLint green, GLint blue, GLint alpha); -void (WINE_GLAPI *glColor4iv) (const GLint* v); -void (WINE_GLAPI *glColor4s) (GLshort red, GLshort green, GLshort blue, GLshort alpha); -void (WINE_GLAPI *glColor4sv) (const GLshort* v); -void (WINE_GLAPI *glColor4ub) (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -void (WINE_GLAPI *glColor4ubv) (const GLubyte* v); -void (WINE_GLAPI *glColor4ui) (GLuint red, GLuint green, GLuint blue, GLuint alpha); -void (WINE_GLAPI *glColor4uiv) (const GLuint* v); -void (WINE_GLAPI *glColor4us) (GLushort red, GLushort green, GLushort blue, GLushort alpha); -void (WINE_GLAPI *glColor4usv) (const GLushort* v); -void (WINE_GLAPI *glColorMask) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -void (WINE_GLAPI *glColorMaterial) (GLenum face, GLenum mode); -void (WINE_GLAPI *glColorPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer); -void (WINE_GLAPI *glCopyPixels) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -void (WINE_GLAPI *glCopyTexImage1D) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -void (WINE_GLAPI *glCopyTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -void (WINE_GLAPI *glCopyTexSubImage1D) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -void (WINE_GLAPI *glCopyTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -void (WINE_GLAPI *glCullFace) (GLenum mode); -void (WINE_GLAPI *glDeleteLists) (GLuint list, GLsizei range); -void (WINE_GLAPI *glDeleteTextures) (GLsizei n, const GLuint* textures); -void (WINE_GLAPI *glDepthFunc) (GLenum func); -void (WINE_GLAPI *glDepthMask) (GLboolean flag); -void (WINE_GLAPI *glDepthRange) (GLclampd nearParam, GLclampd farParam); -void (WINE_GLAPI *glDisable) (GLenum cap); -void (WINE_GLAPI *glDisableWINE) (GLenum cap); -void (WINE_GLAPI *glDisableClientState) (GLenum array); -void (WINE_GLAPI *glDrawArrays) (GLenum mode, GLint first, GLsizei count); -void (WINE_GLAPI *glDrawBuffer) (GLenum mode); -void (WINE_GLAPI *glDrawElements) (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices); -void (WINE_GLAPI *glDrawPixels) (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels); -void (WINE_GLAPI *glEdgeFlag) (GLboolean flag); -void (WINE_GLAPI *glEdgeFlagPointer) (GLsizei stride, const GLvoid* pointer); -void (WINE_GLAPI *glEdgeFlagv) (const GLboolean* flag); -void (WINE_GLAPI *glEnable) (GLenum cap); -void (WINE_GLAPI *glEnableWINE) (GLenum cap); -void (WINE_GLAPI *glEnableClientState) (GLenum array); -void (WINE_GLAPI *glEnd) (); -void (WINE_GLAPI *glEndList) (); -void (WINE_GLAPI *glEvalCoord1d) (GLdouble u); -void (WINE_GLAPI *glEvalCoord1dv) (const GLdouble* u); -void (WINE_GLAPI *glEvalCoord1f) (GLfloat u); -void (WINE_GLAPI *glEvalCoord1fv) (const GLfloat* u); -void (WINE_GLAPI *glEvalCoord2d) (GLdouble u, GLdouble v); -void (WINE_GLAPI *glEvalCoord2dv) (const GLdouble* u); -void (WINE_GLAPI *glEvalCoord2f) (GLfloat u, GLfloat v); -void (WINE_GLAPI *glEvalCoord2fv) (const GLfloat* u); -void (WINE_GLAPI *glEvalMesh1) (GLenum mode, GLint i1, GLint i2); -void (WINE_GLAPI *glEvalMesh2) (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -void (WINE_GLAPI *glEvalPoint1) (GLint i); -void (WINE_GLAPI *glEvalPoint2) (GLint i, GLint j); -void (WINE_GLAPI *glFeedbackBuffer) (GLsizei size, GLenum type, GLfloat* buffer); -void (WINE_GLAPI *glFogf) (GLenum pname, GLfloat param); -void (WINE_GLAPI *glFogfv) (GLenum pname, const GLfloat* params); -void (WINE_GLAPI *glFogi) (GLenum pname, GLint param); -void (WINE_GLAPI *glFogiv) (GLenum pname, const GLint* params); -void (WINE_GLAPI *glFrontFace) (GLenum mode); -void (WINE_GLAPI *glFrustum) (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLuint (WINE_GLAPI *glGenLists) (GLsizei range); -void (WINE_GLAPI *glGenTextures) (GLsizei n, GLuint* textures); -void (WINE_GLAPI *glGetBooleanv) (GLenum pname, GLboolean* params); -void (WINE_GLAPI *glGetClipPlane) (GLenum plane, GLdouble* equation); -void (WINE_GLAPI *glGetDoublev) (GLenum pname, GLdouble* params); -GLenum (WINE_GLAPI *glGetError) (); -void (WINE_GLAPI *glGetFloatv) (GLenum pname, GLfloat* params); -void (WINE_GLAPI *glGetIntegerv) (GLenum pname, GLint* params); -void (WINE_GLAPI *glGetLightfv) (GLenum light, GLenum pname, GLfloat* params); -void (WINE_GLAPI *glGetLightiv) (GLenum light, GLenum pname, GLint* params); -void (WINE_GLAPI *glGetMapdv) (GLenum target, GLenum query, GLdouble* v); -void (WINE_GLAPI *glGetMapfv) (GLenum target, GLenum query, GLfloat* v); -void (WINE_GLAPI *glGetMapiv) (GLenum target, GLenum query, GLint* v); -void (WINE_GLAPI *glGetMaterialfv) (GLenum face, GLenum pname, GLfloat* params); -void (WINE_GLAPI *glGetMaterialiv) (GLenum face, GLenum pname, GLint* params); -void (WINE_GLAPI *glGetPixelMapfv) (GLenum map, GLfloat* values); -void (WINE_GLAPI *glGetPixelMapuiv) (GLenum map, GLuint* values); -void (WINE_GLAPI *glGetPixelMapusv) (GLenum map, GLushort* values); -void (WINE_GLAPI *glGetPointerv) (GLenum pname, GLvoid** params); -void (WINE_GLAPI *glGetPolygonStipple) (GLubyte* mask); -const GLubyte * (WINE_GLAPI *glGetString) (GLenum name); -void (WINE_GLAPI *glGetTexEnvfv) (GLenum target, GLenum pname, GLfloat* params); -void (WINE_GLAPI *glGetTexEnviv) (GLenum target, GLenum pname, GLint* params); -void (WINE_GLAPI *glGetTexGendv) (GLenum coord, GLenum pname, GLdouble* params); -void (WINE_GLAPI *glGetTexGenfv) (GLenum coord, GLenum pname, GLfloat* params); -void (WINE_GLAPI *glGetTexGeniv) (GLenum coord, GLenum pname, GLint* params); -void (WINE_GLAPI *glGetTexImage) (GLenum target, GLint level, GLenum format, GLenum type, GLvoid* pixels); -void (WINE_GLAPI *glGetTexLevelParameterfv) (GLenum target, GLint level, GLenum pname, GLfloat* params); -void (WINE_GLAPI *glGetTexLevelParameteriv) (GLenum target, GLint level, GLenum pname, GLint* params); -void (WINE_GLAPI *glGetTexParameterfv) (GLenum target, GLenum pname, GLfloat* params); -void (WINE_GLAPI *glGetTexParameteriv) (GLenum target, GLenum pname, GLint* params); -void (WINE_GLAPI *glHint) (GLenum target, GLenum mode); -void (WINE_GLAPI *glIndexMask) (GLuint mask); -void (WINE_GLAPI *glIndexPointer) (GLenum type, GLsizei stride, const GLvoid* pointer); -void (WINE_GLAPI *glIndexd) (GLdouble c); -void (WINE_GLAPI *glIndexdv) (const GLdouble* c); -void (WINE_GLAPI *glIndexf) (GLfloat c); -void (WINE_GLAPI *glIndexfv) (const GLfloat* c); -void (WINE_GLAPI *glIndexi) (GLint c); -void (WINE_GLAPI *glIndexiv) (const GLint* c); -void (WINE_GLAPI *glIndexs) (GLshort c); -void (WINE_GLAPI *glIndexsv) (const GLshort* c); -void (WINE_GLAPI *glIndexub) (GLubyte c); -void (WINE_GLAPI *glIndexubv) (const GLubyte* c); -void (WINE_GLAPI *glInitNames) (); -void (WINE_GLAPI *glInterleavedArrays) (GLenum format, GLsizei stride, const GLvoid* pointer); -GLboolean (WINE_GLAPI *glIsEnabled) (GLenum cap); -GLboolean (WINE_GLAPI *glIsList) (GLuint list); -GLboolean (WINE_GLAPI *glIsTexture) (GLuint texture); -void (WINE_GLAPI *glLightModelf) (GLenum pname, GLfloat param); -void (WINE_GLAPI *glLightModelfv) (GLenum pname, const GLfloat* params); -void (WINE_GLAPI *glLightModeli) (GLenum pname, GLint param); -void (WINE_GLAPI *glLightModeliv) (GLenum pname, const GLint* params); -void (WINE_GLAPI *glLightf) (GLenum light, GLenum pname, GLfloat param); -void (WINE_GLAPI *glLightfv) (GLenum light, GLenum pname, const GLfloat* params); -void (WINE_GLAPI *glLighti) (GLenum light, GLenum pname, GLint param); -void (WINE_GLAPI *glLightiv) (GLenum light, GLenum pname, const GLint* params); -void (WINE_GLAPI *glLineStipple) (GLint factor, GLushort pattern); -void (WINE_GLAPI *glLineWidth) (GLfloat width); -void (WINE_GLAPI *glListBase) (GLuint base); -void (WINE_GLAPI *glLoadIdentity) (); -void (WINE_GLAPI *glLoadMatrixd) (const GLdouble* m); -void (WINE_GLAPI *glLoadMatrixf) (const GLfloat* m); -void (WINE_GLAPI *glLoadName) (GLuint name); -void (WINE_GLAPI *glLogicOp) (GLenum opcode); -void (WINE_GLAPI *glMap1d) (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points); -void (WINE_GLAPI *glMap1f) (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points); -void (WINE_GLAPI *glMap2d) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points); -void (WINE_GLAPI *glMap2f) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points); -void (WINE_GLAPI *glMapGrid1d) (GLint un, GLdouble u1, GLdouble u2); -void (WINE_GLAPI *glMapGrid1f) (GLint un, GLfloat u1, GLfloat u2); -void (WINE_GLAPI *glMapGrid2d) (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -void (WINE_GLAPI *glMapGrid2f) (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -void (WINE_GLAPI *glMaterialf) (GLenum face, GLenum pname, GLfloat param); -void (WINE_GLAPI *glMaterialfv) (GLenum face, GLenum pname, const GLfloat* params); -void (WINE_GLAPI *glMateriali) (GLenum face, GLenum pname, GLint param); -void (WINE_GLAPI *glMaterialiv) (GLenum face, GLenum pname, const GLint* params); -void (WINE_GLAPI *glMatrixMode) (GLenum mode); -void (WINE_GLAPI *glMultMatrixd) (const GLdouble* m); -void (WINE_GLAPI *glMultMatrixf) (const GLfloat* m); -void (WINE_GLAPI *glNewList) (GLuint list, GLenum mode); -void (WINE_GLAPI *glNormal3b) (GLbyte nx, GLbyte ny, GLbyte nz); -void (WINE_GLAPI *glNormal3bv) (const GLbyte* v); -void (WINE_GLAPI *glNormal3d) (GLdouble nx, GLdouble ny, GLdouble nz); -void (WINE_GLAPI *glNormal3dv) (const GLdouble* v); -void (WINE_GLAPI *glNormal3f) (GLfloat nx, GLfloat ny, GLfloat nz); -void (WINE_GLAPI *glNormal3fv) (const GLfloat* v); -void (WINE_GLAPI *glNormal3i) (GLint nx, GLint ny, GLint nz); -void (WINE_GLAPI *glNormal3iv) (const GLint* v); -void (WINE_GLAPI *glNormal3s) (GLshort nx, GLshort ny, GLshort nz); -void (WINE_GLAPI *glNormal3sv) (const GLshort* v); -void (WINE_GLAPI *glNormalPointer) (GLenum type, GLsizei stride, const GLvoid* pointer); -void (WINE_GLAPI *glOrtho) (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -void (WINE_GLAPI *glPassThrough) (GLfloat token); -void (WINE_GLAPI *glPixelMapfv) (GLenum map, GLint mapsize, const GLfloat* values); -void (WINE_GLAPI *glPixelMapuiv) (GLenum map, GLint mapsize, const GLuint* values); -void (WINE_GLAPI *glPixelMapusv) (GLenum map, GLint mapsize, const GLushort* values); -void (WINE_GLAPI *glPixelStoref) (GLenum pname, GLfloat param); -void (WINE_GLAPI *glPixelStorei) (GLenum pname, GLint param); -void (WINE_GLAPI *glPixelTransferf) (GLenum pname, GLfloat param); -void (WINE_GLAPI *glPixelTransferi) (GLenum pname, GLint param); -void (WINE_GLAPI *glPixelZoom) (GLfloat xfactor, GLfloat yfactor); -void (WINE_GLAPI *glPointSize) (GLfloat size); -void (WINE_GLAPI *glPolygonMode) (GLenum face, GLenum mode); -void (WINE_GLAPI *glPolygonOffset) (GLfloat factor, GLfloat units); -void (WINE_GLAPI *glPolygonStipple) (const GLubyte* mask); -void (WINE_GLAPI *glPopAttrib) (); -void (WINE_GLAPI *glPopClientAttrib) (); -void (WINE_GLAPI *glPopMatrix) (); -void (WINE_GLAPI *glPopName) (); -void (WINE_GLAPI *glPrioritizeTextures) (GLsizei n, const GLuint* textures, const GLclampf* priorities); -void (WINE_GLAPI *glPushAttrib) (GLbitfield mask); -void (WINE_GLAPI *glPushClientAttrib) (GLbitfield mask); -void (WINE_GLAPI *glPushMatrix) (); -void (WINE_GLAPI *glPushName) (GLuint name); -void (WINE_GLAPI *glRasterPos2d) (GLdouble x, GLdouble y); -void (WINE_GLAPI *glRasterPos2dv) (const GLdouble* v); -void (WINE_GLAPI *glRasterPos2f) (GLfloat x, GLfloat y); -void (WINE_GLAPI *glRasterPos2fv) (const GLfloat* v); -void (WINE_GLAPI *glRasterPos2i) (GLint x, GLint y); -void (WINE_GLAPI *glRasterPos2iv) (const GLint* v); -void (WINE_GLAPI *glRasterPos2s) (GLshort x, GLshort y); -void (WINE_GLAPI *glRasterPos2sv) (const GLshort* v); -void (WINE_GLAPI *glRasterPos3d) (GLdouble x, GLdouble y, GLdouble z); -void (WINE_GLAPI *glRasterPos3dv) (const GLdouble* v); -void (WINE_GLAPI *glRasterPos3f) (GLfloat x, GLfloat y, GLfloat z); -void (WINE_GLAPI *glRasterPos3fv) (const GLfloat* v); -void (WINE_GLAPI *glRasterPos3i) (GLint x, GLint y, GLint z); -void (WINE_GLAPI *glRasterPos3iv) (const GLint* v); -void (WINE_GLAPI *glRasterPos3s) (GLshort x, GLshort y, GLshort z); -void (WINE_GLAPI *glRasterPos3sv) (const GLshort* v); -void (WINE_GLAPI *glRasterPos4d) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -void (WINE_GLAPI *glRasterPos4dv) (const GLdouble* v); -void (WINE_GLAPI *glRasterPos4f) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -void (WINE_GLAPI *glRasterPos4fv) (const GLfloat* v); -void (WINE_GLAPI *glRasterPos4i) (GLint x, GLint y, GLint z, GLint w); -void (WINE_GLAPI *glRasterPos4iv) (const GLint* v); -void (WINE_GLAPI *glRasterPos4s) (GLshort x, GLshort y, GLshort z, GLshort w); -void (WINE_GLAPI *glRasterPos4sv) (const GLshort* v); -void (WINE_GLAPI *glReadBuffer) (GLenum mode); -void (WINE_GLAPI *glReadPixels) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); -void (WINE_GLAPI *glRectd) (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -void (WINE_GLAPI *glRectdv) (const GLdouble* v1, const GLdouble* v2); -void (WINE_GLAPI *glRectf) (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -void (WINE_GLAPI *glRectfv) (const GLfloat* v1, const GLfloat* v2); -void (WINE_GLAPI *glRecti) (GLint x1, GLint y1, GLint x2, GLint y2); -void (WINE_GLAPI *glRectiv) (const GLint* v1, const GLint* v2); -void (WINE_GLAPI *glRects) (GLshort x1, GLshort y1, GLshort x2, GLshort y2); -void (WINE_GLAPI *glRectsv) (const GLshort* v1, const GLshort* v2); -GLint (WINE_GLAPI *glRenderMode) (GLenum mode); -void (WINE_GLAPI *glRotated) (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -void (WINE_GLAPI *glRotatef) (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -void (WINE_GLAPI *glScaled) (GLdouble x, GLdouble y, GLdouble z); -void (WINE_GLAPI *glScalef) (GLfloat x, GLfloat y, GLfloat z); -void (WINE_GLAPI *glScissor) (GLint x, GLint y, GLsizei width, GLsizei height); -void (WINE_GLAPI *glSelectBuffer) (GLsizei size, GLuint* buffer); -void (WINE_GLAPI *glShadeModel) (GLenum mode); -void (WINE_GLAPI *glStencilFunc) (GLenum func, GLint ref, GLuint mask); -void (WINE_GLAPI *glStencilMask) (GLuint mask); -void (WINE_GLAPI *glStencilOp) (GLenum fail, GLenum zfail, GLenum zpass); -void (WINE_GLAPI *glTexCoord1d) (GLdouble s); -void (WINE_GLAPI *glTexCoord1dv) (const GLdouble* v); -void (WINE_GLAPI *glTexCoord1f) (GLfloat s); -void (WINE_GLAPI *glTexCoord1fv) (const GLfloat* v); -void (WINE_GLAPI *glTexCoord1i) (GLint s); -void (WINE_GLAPI *glTexCoord1iv) (const GLint* v); -void (WINE_GLAPI *glTexCoord1s) (GLshort s); -void (WINE_GLAPI *glTexCoord1sv) (const GLshort* v); -void (WINE_GLAPI *glTexCoord2d) (GLdouble s, GLdouble t); -void (WINE_GLAPI *glTexCoord2dv) (const GLdouble* v); -void (WINE_GLAPI *glTexCoord2f) (GLfloat s, GLfloat t); -void (WINE_GLAPI *glTexCoord2fv) (const GLfloat* v); -void (WINE_GLAPI *glTexCoord2i) (GLint s, GLint t); -void (WINE_GLAPI *glTexCoord2iv) (const GLint* v); -void (WINE_GLAPI *glTexCoord2s) (GLshort s, GLshort t); -void (WINE_GLAPI *glTexCoord2sv) (const GLshort* v); -void (WINE_GLAPI *glTexCoord3d) (GLdouble s, GLdouble t, GLdouble r); -void (WINE_GLAPI *glTexCoord3dv) (const GLdouble* v); -void (WINE_GLAPI *glTexCoord3f) (GLfloat s, GLfloat t, GLfloat r); -void (WINE_GLAPI *glTexCoord3fv) (const GLfloat* v); -void (WINE_GLAPI *glTexCoord3i) (GLint s, GLint t, GLint r); -void (WINE_GLAPI *glTexCoord3iv) (const GLint* v); -void (WINE_GLAPI *glTexCoord3s) (GLshort s, GLshort t, GLshort r); -void (WINE_GLAPI *glTexCoord3sv) (const GLshort* v); -void (WINE_GLAPI *glTexCoord4d) (GLdouble s, GLdouble t, GLdouble r, GLdouble q); -void (WINE_GLAPI *glTexCoord4dv) (const GLdouble* v); -void (WINE_GLAPI *glTexCoord4f) (GLfloat s, GLfloat t, GLfloat r, GLfloat q); -void (WINE_GLAPI *glTexCoord4fv) (const GLfloat* v); -void (WINE_GLAPI *glTexCoord4i) (GLint s, GLint t, GLint r, GLint q); -void (WINE_GLAPI *glTexCoord4iv) (const GLint* v); -void (WINE_GLAPI *glTexCoord4s) (GLshort s, GLshort t, GLshort r, GLshort q); -void (WINE_GLAPI *glTexCoord4sv) (const GLshort* v); -void (WINE_GLAPI *glTexCoordPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer); -void (WINE_GLAPI *glTexEnvf) (GLenum target, GLenum pname, GLfloat param); -void (WINE_GLAPI *glTexEnvfv) (GLenum target, GLenum pname, const GLfloat* params); -void (WINE_GLAPI *glTexEnvi) (GLenum target, GLenum pname, GLint param); -void (WINE_GLAPI *glTexEnviv) (GLenum target, GLenum pname, const GLint* params); -void (WINE_GLAPI *glTexGend) (GLenum coord, GLenum pname, GLdouble param); -void (WINE_GLAPI *glTexGendv) (GLenum coord, GLenum pname, const GLdouble* params); -void (WINE_GLAPI *glTexGenf) (GLenum coord, GLenum pname, GLfloat param); -void (WINE_GLAPI *glTexGenfv) (GLenum coord, GLenum pname, const GLfloat* params); -void (WINE_GLAPI *glTexGeni) (GLenum coord, GLenum pname, GLint param); -void (WINE_GLAPI *glTexGeniv) (GLenum coord, GLenum pname, const GLint* params); -void (WINE_GLAPI *glTexImage1D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid* pixels); -void (WINE_GLAPI *glTexImage2D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels); -void (WINE_GLAPI *glTexParameterf) (GLenum target, GLenum pname, GLfloat param); -void (WINE_GLAPI *glTexParameterfv) (GLenum target, GLenum pname, const GLfloat* params); -void (WINE_GLAPI *glTexParameteri) (GLenum target, GLenum pname, GLint param); -void (WINE_GLAPI *glTexParameteriv) (GLenum target, GLenum pname, const GLint* params); -void (WINE_GLAPI *glTexSubImage1D) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid* pixels); -void (WINE_GLAPI *glTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels); -void (WINE_GLAPI *glTranslated) (GLdouble x, GLdouble y, GLdouble z); -void (WINE_GLAPI *glTranslatef) (GLfloat x, GLfloat y, GLfloat z); -void (WINE_GLAPI *glVertex2d) (GLdouble x, GLdouble y); -void (WINE_GLAPI *glVertex2dv) (const GLdouble* v); -void (WINE_GLAPI *glVertex2f) (GLfloat x, GLfloat y); -void (WINE_GLAPI *glVertex2fv) (const GLfloat* v); -void (WINE_GLAPI *glVertex2i) (GLint x, GLint y); -void (WINE_GLAPI *glVertex2iv) (const GLint* v); -void (WINE_GLAPI *glVertex2s) (GLshort x, GLshort y); -void (WINE_GLAPI *glVertex2sv) (const GLshort* v); -void (WINE_GLAPI *glVertex3d) (GLdouble x, GLdouble y, GLdouble z); -void (WINE_GLAPI *glVertex3dv) (const GLdouble* v); -void (WINE_GLAPI *glVertex3f) (GLfloat x, GLfloat y, GLfloat z); -void (WINE_GLAPI *glVertex3fv) (const GLfloat* v); -void (WINE_GLAPI *glVertex3i) (GLint x, GLint y, GLint z); -void (WINE_GLAPI *glVertex3iv) (const GLint* v); -void (WINE_GLAPI *glVertex3s) (GLshort x, GLshort y, GLshort z); -void (WINE_GLAPI *glVertex3sv) (const GLshort* v); -void (WINE_GLAPI *glVertex4d) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -void (WINE_GLAPI *glVertex4dv) (const GLdouble* v); -void (WINE_GLAPI *glVertex4f) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -void (WINE_GLAPI *glVertex4fv) (const GLfloat* v); -void (WINE_GLAPI *glVertex4i) (GLint x, GLint y, GLint z, GLint w); -void (WINE_GLAPI *glVertex4iv) (const GLint* v); -void (WINE_GLAPI *glVertex4s) (GLshort x, GLshort y, GLshort z, GLshort w); -void (WINE_GLAPI *glVertex4sv) (const GLshort* v); -void (WINE_GLAPI *glVertexPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer); -void (WINE_GLAPI *glViewport) (GLint x, GLint y, GLsizei width, GLsizei height); -void (WINE_GLAPI *glPointParameterfv) (GLenum pname, const GLfloat *params); +void (WINE_GLAPI *glAccum)(GLenum op, GLfloat value) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glAlphaFunc)(GLenum func, GLclampf ref) DECLSPEC_HIDDEN; +GLboolean (WINE_GLAPI *glAreTexturesResident)(GLsizei n, const GLuint *textures, GLboolean *residences) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glArrayElement)(GLint i) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glBegin)(GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glBindTexture)(GLenum target, GLuint texture) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glBitmap)(GLsizei width, GLsizei height, GLfloat xorig, + GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glBlendFunc)(GLenum sfactor, GLenum dfactor) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glCallList)(GLuint list) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glCallLists)(GLsizei n, GLenum type, const GLvoid *lists) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glClear)(GLbitfield mask) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glClearAccum)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glClearDepth)(GLclampd depth) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glClearIndex)(GLfloat c) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glClearStencil)(GLint s) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glClipPlane)(GLenum plane, const GLdouble *equation) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3b)(GLbyte red, GLbyte green, GLbyte blue) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3bv)(const GLbyte *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3d)(GLdouble red, GLdouble green, GLdouble blue) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3f)(GLfloat red, GLfloat green, GLfloat blue) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3i)(GLint red, GLint green, GLint blue) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3s)(GLshort red, GLshort green, GLshort blue) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3ub)(GLubyte red, GLubyte green, GLubyte blue) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3ubv)(const GLubyte *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3ui)(GLuint red, GLuint green, GLuint blue) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3uiv)(const GLuint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3us)(GLushort red, GLushort green, GLushort blue) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor3usv)(const GLushort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4b)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4bv)(const GLbyte *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4d)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4i)(GLint red, GLint green, GLint blue, GLint alpha) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4s)(GLshort red, GLshort green, GLshort blue, GLshort alpha) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4ubv)(const GLubyte *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4ui)(GLuint red, GLuint green, GLuint blue, GLuint alpha) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4uiv)(const GLuint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4us)(GLushort red, GLushort green, GLushort blue, GLushort alpha) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColor4usv)(const GLushort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColorMaterial)(GLenum face, GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glCopyPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glCopyTexImage1D)(GLenum target, GLint level, + GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glCopyTexImage2D)(GLenum target, GLint level, + GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glCopyTexSubImage1D)(GLenum target, GLint level, + GLint xoffset, GLint x, GLint y, GLsizei width) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glCopyTexSubImage2D)(GLenum target, GLint level, + GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glCullFace)(GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDeleteLists)(GLuint list, GLsizei range) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDeleteTextures)(GLsizei n, const GLuint *textures) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDepthFunc)(GLenum func) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDepthMask)(GLboolean flag) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDepthRange)(GLclampd nearParam, GLclampd farParam) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDisable)(GLenum cap) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDisableWINE)(GLenum cap) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDisableClientState)(GLenum array) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDrawArrays)(GLenum mode, GLint first, GLsizei count) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDrawBuffer)(GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glDrawPixels)(GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *pixels) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEdgeFlag)(GLboolean flag) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEdgeFlagPointer)(GLsizei stride, const GLvoid *pointer) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEdgeFlagv)(const GLboolean *flag) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEnable)(GLenum cap) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEnableWINE)(GLenum cap) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEnableClientState)(GLenum array) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEnd)(void) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEndList)(void) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalCoord1d)(GLdouble u) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalCoord1dv)(const GLdouble *u) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalCoord1f)(GLfloat u) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalCoord1fv)(const GLfloat *u) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalCoord2d)(GLdouble u, GLdouble v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalCoord2dv)(const GLdouble *u) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalCoord2f)(GLfloat u, GLfloat v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalCoord2fv)(const GLfloat *u) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalMesh1)(GLenum mode, GLint i1, GLint i2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalMesh2)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalPoint1)(GLint i) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glEvalPoint2)(GLint i, GLint j) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glFeedbackBuffer)(GLsizei size, GLenum type, GLfloat *buffer) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glFogf)(GLenum pname, GLfloat param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glFogfv)(GLenum pname, const GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glFogi)(GLenum pname, GLint param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glFogiv)(GLenum pname, const GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glFrontFace)(GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glFrustum)(GLdouble left, GLdouble right, GLdouble bottom, + GLdouble top, GLdouble zNear, GLdouble zFar) DECLSPEC_HIDDEN; +GLuint (WINE_GLAPI *glGenLists)(GLsizei range) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGenTextures)(GLsizei n, GLuint *textures) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetBooleanv)(GLenum pname, GLboolean *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetClipPlane)(GLenum plane, GLdouble *equation) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetDoublev)(GLenum pname, GLdouble *params) DECLSPEC_HIDDEN; +GLenum (WINE_GLAPI *glGetError)(void) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetFloatv)(GLenum pname, GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetIntegerv)(GLenum pname, GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetLightfv)(GLenum light, GLenum pname, GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetLightiv)(GLenum light, GLenum pname, GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetMapdv)(GLenum target, GLenum query, GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetMapfv)(GLenum target, GLenum query, GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetMapiv)(GLenum target, GLenum query, GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetMaterialfv)(GLenum face, GLenum pname, GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetMaterialiv)(GLenum face, GLenum pname, GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetPixelMapfv)(GLenum map, GLfloat *values) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetPixelMapuiv)(GLenum map, GLuint *values) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetPixelMapusv)(GLenum map, GLushort *values) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetPointerv)(GLenum pname, GLvoid **params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetPolygonStipple)(GLubyte *mask) DECLSPEC_HIDDEN; +const GLubyte * (WINE_GLAPI *glGetString)(GLenum name) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetTexEnvfv)(GLenum target, GLenum pname, GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetTexEnviv)(GLenum target, GLenum pname, GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetTexGendv)(GLenum coord, GLenum pname, GLdouble *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetTexGenfv)(GLenum coord, GLenum pname, GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetTexGeniv)(GLenum coord, GLenum pname, GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetTexImage)(GLenum target, GLint level, GLenum format, + GLenum type, GLvoid *pixels) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetTexLevelParameterfv)(GLenum target, GLint level, GLenum pname, GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetTexLevelParameteriv)(GLenum target, GLint level, GLenum pname, GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glGetTexParameteriv)(GLenum target, GLenum pname, GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glHint)(GLenum target, GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexMask)(GLuint mask) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexPointer)(GLenum type, GLsizei stride, const GLvoid *pointer) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexd)(GLdouble c) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexdv)(const GLdouble *c) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexf)(GLfloat c) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexfv)(const GLfloat *c) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexi)(GLint c) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexiv)(const GLint *c) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexs)(GLshort c) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexsv)(const GLshort *c) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexub)(GLubyte c) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glIndexubv)(const GLubyte *c) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glInitNames)(void) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glInterleavedArrays)(GLenum format, GLsizei stride, const GLvoid *pointer) DECLSPEC_HIDDEN; +GLboolean (WINE_GLAPI *glIsEnabled)(GLenum cap) DECLSPEC_HIDDEN; +GLboolean (WINE_GLAPI *glIsList)(GLuint list) DECLSPEC_HIDDEN; +GLboolean (WINE_GLAPI *glIsTexture)(GLuint texture) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLightModelf)(GLenum pname, GLfloat param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLightModelfv)(GLenum pname, const GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLightModeli)(GLenum pname, GLint param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLightModeliv)(GLenum pname, const GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLightf)(GLenum light, GLenum pname, GLfloat param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLightfv)(GLenum light, GLenum pname, const GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLighti)(GLenum light, GLenum pname, GLint param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLightiv)(GLenum light, GLenum pname, const GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLineStipple)(GLint factor, GLushort pattern) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLineWidth)(GLfloat width) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glListBase)(GLuint base) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLoadIdentity)(void) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLoadMatrixd)(const GLdouble *m) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLoadMatrixf)(const GLfloat *m) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLoadName)(GLuint name) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glLogicOp)(GLenum opcode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMap1d)(GLenum target, GLdouble u1, GLdouble u2, + GLint stride, GLint order, const GLdouble *points) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMap1f)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, + GLint order, const GLfloat *points) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMap2d)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, + GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMap2f)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, + GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMapGrid1d)(GLint un, GLdouble u1, GLdouble u2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMapGrid1f)(GLint un, GLfloat u1, GLfloat u2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMapGrid2d)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMapGrid2f)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMaterialf)(GLenum face, GLenum pname, GLfloat param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMaterialfv)(GLenum face, GLenum pname, const GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMateriali)(GLenum face, GLenum pname, GLint param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMaterialiv)(GLenum face, GLenum pname, const GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMatrixMode)(GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMultMatrixd)(const GLdouble *m) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glMultMatrixf)(const GLfloat *m) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNewList)(GLuint list, GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNormal3b)(GLbyte nx, GLbyte ny, GLbyte nz) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNormal3bv)(const GLbyte *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNormal3d)(GLdouble nx, GLdouble ny, GLdouble nz) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNormal3dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNormal3f)(GLfloat nx, GLfloat ny, GLfloat nz) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNormal3fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNormal3i)(GLint nx, GLint ny, GLint nz) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNormal3iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNormal3s)(GLshort nx, GLshort ny, GLshort nz) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNormal3sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glNormalPointer)(GLenum type, GLsizei stride, const GLvoid *pointer) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glOrtho)(GLdouble left, GLdouble right, GLdouble bottom, + GLdouble top, GLdouble zNear, GLdouble zFar) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPassThrough)(GLfloat token) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPixelMapfv)(GLenum map, GLint mapsize, const GLfloat *values) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPixelMapuiv)(GLenum map, GLint mapsize, const GLuint *values) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPixelMapusv)(GLenum map, GLint mapsize, const GLushort *values) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPixelStoref)(GLenum pname, GLfloat param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPixelStorei)(GLenum pname, GLint param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPixelTransferf)(GLenum pname, GLfloat param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPixelTransferi)(GLenum pname, GLint param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPixelZoom)(GLfloat xfactor, GLfloat yfactor) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPointSize)(GLfloat size) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPolygonMode)(GLenum face, GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPolygonOffset)(GLfloat factor, GLfloat units) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPolygonStipple)(const GLubyte *mask) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPopAttrib)(void) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPopClientAttrib)(void) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPopMatrix)(void) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPopName)(void) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPrioritizeTextures)(GLsizei n, const GLuint *textures, const GLclampf *priorities) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPushAttrib)(GLbitfield mask) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPushClientAttrib)(GLbitfield mask) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPushMatrix)(void) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPushName)(GLuint name) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos2d)(GLdouble x, GLdouble y) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos2dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos2f)(GLfloat x, GLfloat y) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos2fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos2i)(GLint x, GLint y) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos2iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos2s)(GLshort x, GLshort y) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos2sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos3d)(GLdouble x, GLdouble y, GLdouble z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos3dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos3f)(GLfloat x, GLfloat y, GLfloat z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos3fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos3i)(GLint x, GLint y, GLint z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos3iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos3s)(GLshort x, GLshort y, GLshort z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos3sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos4dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos4fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos4i)(GLint x, GLint y, GLint z, GLint w) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos4iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos4s)(GLshort x, GLshort y, GLshort z, GLshort w) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRasterPos4sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glReadBuffer)(GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, + GLenum format, GLenum type, GLvoid *pixels) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRectd)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRectdv)(const GLdouble *v1, const GLdouble *v2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRectf)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRectfv)(const GLfloat *v1, const GLfloat *v2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRecti)(GLint x1, GLint y1, GLint x2, GLint y2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRectiv)(const GLint *v1, const GLint *v2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRects)(GLshort x1, GLshort y1, GLshort x2, GLshort y2) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRectsv)(const GLshort *v1, const GLshort *v2) DECLSPEC_HIDDEN; +GLint (WINE_GLAPI *glRenderMode)(GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRotated)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glRotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glScaled)(GLdouble x, GLdouble y, GLdouble z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glScalef)(GLfloat x, GLfloat y, GLfloat z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glScissor)(GLint x, GLint y, GLsizei width, GLsizei height) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glSelectBuffer)(GLsizei size, GLuint *buffer) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glShadeModel)(GLenum mode) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glStencilFunc)(GLenum func, GLint ref, GLuint mask) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glStencilMask)(GLuint mask) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glStencilOp)(GLenum fail, GLenum zfail, GLenum zpass) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord1d)(GLdouble s) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord1dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord1f)(GLfloat s) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord1fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord1i)(GLint s) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord1iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord1s)(GLshort s) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord1sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord2d)(GLdouble s, GLdouble t) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord2dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord2f)(GLfloat s, GLfloat t) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord2fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord2i)(GLint s, GLint t) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord2iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord2s)(GLshort s, GLshort t) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord2sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord3d)(GLdouble s, GLdouble t, GLdouble r) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord3dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord3f)(GLfloat s, GLfloat t, GLfloat r) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord3fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord3i)(GLint s, GLint t, GLint r) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord3iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord3s)(GLshort s, GLshort t, GLshort r) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord3sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord4d)(GLdouble s, GLdouble t, GLdouble r, GLdouble q) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord4dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord4f)(GLfloat s, GLfloat t, GLfloat r, GLfloat q) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord4fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord4i)(GLint s, GLint t, GLint r, GLint q) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord4iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord4s)(GLshort s, GLshort t, GLshort r, GLshort q) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoord4sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexEnvf)(GLenum target, GLenum pname, GLfloat param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexEnvfv)(GLenum target, GLenum pname, const GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexEnvi)(GLenum target, GLenum pname, GLint param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexEnviv)(GLenum target, GLenum pname, const GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexGend)(GLenum coord, GLenum pname, GLdouble param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexGendv)(GLenum coord, GLenum pname, const GLdouble *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexGenf)(GLenum coord, GLenum pname, GLfloat param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexGenfv)(GLenum coord, GLenum pname, const GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexGeni)(GLenum coord, GLenum pname, GLint param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexGeniv)(GLenum coord, GLenum pname, const GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexImage1D)(GLenum target, GLint level, GLint internalformat, GLsizei width, + GLint border, GLenum format, GLenum type, const GLvoid *pixels) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, + GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexParameterf)(GLenum target, GLenum pname, GLfloat param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexParameterfv)(GLenum target, GLenum pname, const GLfloat *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexParameteri)(GLenum target, GLenum pname, GLint param) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexParameteriv)(GLenum target, GLenum pname, const GLint *params) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexSubImage1D)(GLenum target, GLint level, GLint xoffset, + GLsizei width, GLenum format, GLenum type, const GLvoid *pixels) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTranslated)(GLdouble x, GLdouble y, GLdouble z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glTranslatef)(GLfloat x, GLfloat y, GLfloat z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex2d)(GLdouble x, GLdouble y) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex2dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex2f)(GLfloat x, GLfloat y) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex2fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex2i)(GLint x, GLint y) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex2iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex2s)(GLshort x, GLshort y) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex2sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex3d)(GLdouble x, GLdouble y, GLdouble z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex3dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex3f)(GLfloat x, GLfloat y, GLfloat z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex3fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex3i)(GLint x, GLint y, GLint z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex3iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex3s)(GLshort x, GLshort y, GLshort z) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex3sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex4dv)(const GLdouble *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex4fv)(const GLfloat *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex4i)(GLint x, GLint y, GLint z, GLint w) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex4iv)(const GLint *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex4s)(GLshort x, GLshort y, GLshort z, GLshort w) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertex4sv)(const GLshort *v) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glViewport)(GLint x, GLint y, GLsizei width, GLsizei height) DECLSPEC_HIDDEN; +void (WINE_GLAPI *glPointParameterfv)(GLenum pname, const GLfloat *params) DECLSPEC_HIDDEN; /* glFinish and glFlush are always loaded from opengl32.dll, thus they always have * __stdcall calling convention. @@ -1146,17 +1164,17 @@ void (WINE_GLAPI *glPointParameterfv) (GLenum pname, const GLfloat *params); * They are wgl functions and must not be called inside the gl lock, give them a * name that makes this clear */ -void (__stdcall *wglFinish) (); -void (__stdcall *wglFlush) (); +void (__stdcall *wglFinish)(void) DECLSPEC_HIDDEN; +void (__stdcall *wglFlush)(void) DECLSPEC_HIDDEN; /* WGL functions */ -HGLRC (WINAPI *pwglCreateContext)(HDC); -BOOL (WINAPI *pwglDeleteContext)(HGLRC); -HGLRC (WINAPI *pwglGetCurrentContext)(void); -HDC (WINAPI *pwglGetCurrentDC)(void); -PROC (WINAPI *pwglGetProcAddress)(LPCSTR); -BOOL (WINAPI *pwglMakeCurrent)(HDC,HGLRC); -BOOL (WINAPI *pwglShareLists)(HGLRC,HGLRC); +HGLRC (WINAPI *pwglCreateContext)(HDC) DECLSPEC_HIDDEN; +BOOL (WINAPI *pwglDeleteContext)(HGLRC) DECLSPEC_HIDDEN; +HGLRC (WINAPI *pwglGetCurrentContext)(void) DECLSPEC_HIDDEN; +HDC (WINAPI *pwglGetCurrentDC)(void) DECLSPEC_HIDDEN; +PROC (WINAPI *pwglGetProcAddress)(LPCSTR) DECLSPEC_HIDDEN; +BOOL (WINAPI *pwglMakeCurrent)(HDC, HGLRC) DECLSPEC_HIDDEN; +BOOL (WINAPI *pwglShareLists)(HGLRC, HGLRC) DECLSPEC_HIDDEN; #define GL_FUNCS_GEN \ USE_GL_FUNC(glAccum) \ @@ -1567,6 +1585,114 @@ typedef void (WINE_GLAPI *PGLFNCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); #endif typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +/* GL_ARB_framebuffer_object */ +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 +#define GL_FRAMEBUFFER 0x8d40 +#define GL_READ_FRAMEBUFFER 0x8ca8 +#define GL_DRAW_FRAMEBUFFER 0x8ca9 +#define GL_RENDERBUFFER 0x8d41 +#define GL_STENCIL_INDEX1 0x8d46 +#define GL_STENCIL_INDEX4 0x8d47 +#define GL_STENCIL_INDEX8 0x8d48 +#define GL_STENCIL_INDEX16 0x8d49 +#define GL_RENDERBUFFER_WIDTH 0x8d42 +#define GL_RENDERBUFFER_HEIGHT 0x8d43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8d44 +#define GL_RENDERBUFFER_RED_SIZE 0x8d50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8d51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8d52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8d53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8d54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8d55 +#define GL_RENDERBUFFER_SAMPLES 0x8cab +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8cd0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8cd1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8cd2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8cd3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8cd4 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_SRGB 0x8c40 +#define GL_UNSIGNED_NORMALIZED 0x8c17 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_INDEX 0x8222 +#define GL_COLOR_ATTACHMENT0 0x8ce0 +#define GL_COLOR_ATTACHMENT1 0x8ce1 +#define GL_COLOR_ATTACHMENT2 0x8ce2 +#define GL_COLOR_ATTACHMENT3 0x8ce3 +#define GL_COLOR_ATTACHMENT4 0x8ce4 +#define GL_COLOR_ATTACHMENT5 0x8ce5 +#define GL_COLOR_ATTACHMENT6 0x8ce6 +#define GL_COLOR_ATTACHMENT7 0x8ce7 +#define GL_COLOR_ATTACHMENT8 0x8ce8 +#define GL_COLOR_ATTACHMENT9 0x8ce9 +#define GL_COLOR_ATTACHMENT10 0x8cea +#define GL_COLOR_ATTACHMENT11 0x8ceb +#define GL_COLOR_ATTACHMENT12 0x8cec +#define GL_COLOR_ATTACHMENT13 0x8ced +#define GL_COLOR_ATTACHMENT14 0x8cee +#define GL_COLOR_ATTACHMENT15 0x8cef +#define GL_DEPTH_ATTACHMENT 0x8d00 +#define GL_STENCIL_ATTACHMENT 0x8d20 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821a +#define GL_MAX_SAMPLES 0x8d57 +#define GL_FRAMEBUFFER_COMPLETE 0x8cd5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8cd6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8cd7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8cdb +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8cdc +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8cdd +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8d56 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_FRAMEBUFFER_BINDING 0x8ca6 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8ca6 +#define GL_READ_FRAMEBUFFER_BINDING 0x8caa +#define GL_RENDERBUFFER_BINDING 0x8ca7 +#define GL_MAX_COLOR_ATTACHMENTS 0x8cdf +#define GL_MAX_RENDERBUFFER_SIZE 0x84e8 +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_DEPTH_STENCIL 0x84f9 +#define GL_UNSIGNED_INT_24_8 0x84fa +#define GL_DEPTH24_STENCIL8 0x88f0 +#define GL_TEXTURE_STENCIL_SIZE 0x88f1 +#endif +typedef GLboolean (WINE_GLAPI * PGLFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); +typedef void (WINE_GLAPI * PGLFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); +typedef void (WINE_GLAPI * PGLFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers); +typedef void (WINE_GLAPI * PGLFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers); +typedef void (WINE_GLAPI * PGLFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, + GLsizei width, GLsizei height); +typedef void (WINE_GLAPI * PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, + GLenum internalformat, GLsizei width, GLsizei height); +typedef void (WINE_GLAPI * PGLFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); +typedef GLboolean (WINE_GLAPI * PGLFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); +typedef void (WINE_GLAPI * PGLFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); +typedef void (WINE_GLAPI * PGLFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers); +typedef void (WINE_GLAPI * PGLFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers); +typedef GLenum (WINE_GLAPI * PGLFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); +typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, + GLenum textarget, GLuint texture, GLint level); +typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, + GLenum textarget, GLuint texture, GLint level); +typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, + GLenum textarget, GLuint texture, GLint level, GLint layer); +typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, + GLuint texture, GLint level, GLint layer); +typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, + GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (WINE_GLAPI * PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, + GLenum pname, GLint *params); +typedef void (WINE_GLAPI * PGLFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, + GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (WINE_GLAPI * PGLFNGLGENERATEMIPMAPPROC)(GLenum target); + /* GL_ARB_geometry_shader4 */ #ifndef GL_ARB_geometry_shader4 #define GL_GEOMETRY_SHADER_ARB 0x8dd9 @@ -1758,6 +1884,17 @@ typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, #endif typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); + +/* GL_ARB_provoking_vertex */ +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 +#define GL_FIRST_VERTEX_CONVENTION 0x8e4d +#define GL_LAST_VERTEX_CONVENTION 0x8e4e +#define GL_PROVOKING_VERTEX 0x8e4f +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8e4c +#endif +typedef void (WINE_GLAPI * PGLFNGLPROVOKINGVERTEXPROC)(GLenum mode); + /* GL_ARB_vertex_blend */ #ifndef GL_ARB_vertex_blend #define GL_ARB_vertex_blend 1 @@ -1968,7 +2105,7 @@ typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const #define GL_FIRST_VERTEX_CONVENTION_EXT 0x8e4d #define GL_LAST_VERTEX_CONVENTION_EXT 0x8e4e #define GL_PROVOKING_VERTEX_EXT 0x8e4f -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTIONS_EXT 0x8e4c +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8e4c #endif typedef void (WINE_GLAPI * PGLFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode); @@ -3031,8 +3168,8 @@ typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target typedef GLuint (WINE_GLAPI *PGLFNGENFRAGMENTSHADERSATI) (GLuint range); typedef void (WINE_GLAPI *PGLFNBINDFRAGMENTSHADERATI) (GLuint id); typedef void (WINE_GLAPI *PGLFNDELETEFRAGMENTSHADERATI) (GLuint id); -typedef void (WINE_GLAPI *PGLFNBEGINFRAGMENTSHADERATI) (); -typedef void (WINE_GLAPI *PGLFNENDFRAGMENTSHADERATI) (); +typedef void (WINE_GLAPI *PGLFNBEGINFRAGMENTSHADERATI) (void); +typedef void (WINE_GLAPI *PGLFNENDFRAGMENTSHADERATI) (void); typedef void (WINE_GLAPI *PGLFNPASSTEXCOORDATI) (GLuint dst, GLuint coord, GLenum swizzle); typedef void (WINE_GLAPI *PGLFNSAMPLEMAPATI) (GLuint dst, GLuint interp, GLenum swizzle); typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP1ATI) (GLenum op, GLuint dst, GLuint dstMask, @@ -3416,12 +3553,14 @@ typedef enum _GL_SupportedExt { ARB_DRAW_BUFFERS, ARB_FRAGMENT_PROGRAM, ARB_FRAGMENT_SHADER, + ARB_FRAMEBUFFER_OBJECT, ARB_GEOMETRY_SHADER4, ARB_IMAGING, ARB_MULTISAMPLE, ARB_MULTITEXTURE, ARB_OCCLUSION_QUERY, ARB_POINT_PARAMETERS, + ARB_PROVOKING_VERTEX, ARB_PIXEL_BUFFER_OBJECT, ARB_POINT_SPRITE, ARB_TEXTURE_COMPRESSION, @@ -3533,6 +3672,27 @@ typedef enum _GL_SupportedExt { USE_GL_FUNC(PGLFNCLAMPCOLORARBPROC, glClampColorARB, ARB_COLOR_BUFFER_FLOAT, NULL )\ /* GL_ARB_draw_buffers */ \ USE_GL_FUNC(PGLFNDRAWBUFFERSARBPROC, glDrawBuffersARB, ARB_DRAW_BUFFERS, NULL )\ + /* GL_ARB_framebuffer_object */ \ + USE_GL_FUNC(PGLFNGLISRENDERBUFFERPROC, glIsRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVPROC, glGetRenderbufferParameteriv, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLISFRAMEBUFFERPROC, glIsFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DPROC, glFramebufferTexture1D, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DPROC, glFramebufferTexture3D, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, glGetFramebufferAttachmentParameteriv, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ + USE_GL_FUNC(PGLFNGLGENERATEMIPMAPPROC, glGenerateMipmap, ARB_FRAMEBUFFER_OBJECT, NULL )\ /* GL_ARB_geometry_shader4 */ \ USE_GL_FUNC(PGLFNPROGRAMPARAMETERIARBPROC, glProgramParameteriARB, ARB_GEOMETRY_SHADER4, NULL ) \ USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREARBPROC, glFramebufferTextureARB, ARB_GEOMETRY_SHADER4, NULL ) \ @@ -3566,6 +3726,8 @@ typedef enum _GL_SupportedExt { /* GL_ARB_point_parameters */ \ USE_GL_FUNC(PGLFNGLPOINTPARAMETERFARBPROC, glPointParameterfARB, ARB_POINT_PARAMETERS, NULL )\ USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVARBPROC, glPointParameterfvARB, ARB_POINT_PARAMETERS, NULL )\ + /* GL_ARB_provoking_vertex */ \ + USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXPROC, glProvokingVertex, ARB_PROVOKING_VERTEX, NULL)\ /* GL_ARB_texture_compression */ \ USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE2DPROC, glCompressedTexImage2DARB, ARB_TEXTURE_COMPRESSION,NULL )\ USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC, glCompressedTexImage3DARB, ARB_TEXTURE_COMPRESSION,NULL )\ @@ -3949,6 +4111,29 @@ typedef BOOL (WINAPI * WINED3D_PFNWGLSETPIXELFORMATWINE) (HDC hdc, int iPixelFor * Structures ****************************************************/ +struct wined3d_fbo_ops +{ + PGLFNGLISRENDERBUFFERPROC glIsRenderbuffer; + PGLFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; + PGLFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; + PGLFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; + PGLFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; + PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; + PGLFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv; + PGLFNGLISFRAMEBUFFERPROC glIsFramebuffer; + PGLFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; + PGLFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; + PGLFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; + PGLFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; + PGLFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D; + PGLFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; + PGLFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; + PGLFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; + PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv; + PGLFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; + PGLFNGLGENERATEMIPMAPPROC glGenerateMipmap; +}; + #define USE_GL_FUNC(type, pfn, ext, replace) type pfn; struct wined3d_gl_info @@ -3997,6 +4182,7 @@ struct wined3d_gl_info BOOL supported[WINED3D_GL_EXT_COUNT]; + struct wined3d_fbo_ops fbo_ops; /* GL function pointers */ GL_EXT_FUNCS_GEN /* WGL function pointers */ diff --git a/reactos/dll/directx/wine/wined3d/wined3d_main.c b/reactos/dll/directx/wine/wined3d/wined3d_main.c index bdb544a200f..5f19c26ab73 100644 --- a/reactos/dll/directx/wine/wined3d/wined3d_main.c +++ b/reactos/dll/directx/wine/wined3d/wined3d_main.c @@ -5,6 +5,7 @@ * Copyright 2002-2003 Raphael Junqueira * Copyright 2004 Jason Edmeades * Copyright 2007-2008 Stefan Dösinger for CodeWeavers + * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -32,7 +33,7 @@ int num_lock = 0; void (*CDECL wine_tsx11_lock_ptr)(void) = NULL; void (*CDECL wine_tsx11_unlock_ptr)(void) = NULL; -CRITICAL_SECTION wined3d_cs; +static CRITICAL_SECTION wined3d_cs; static CRITICAL_SECTION_DEBUG wined3d_cs_debug = { 0, 0, &wined3d_cs, @@ -40,7 +41,7 @@ static CRITICAL_SECTION_DEBUG wined3d_cs_debug = &wined3d_cs_debug.ProcessLocksList}, 0, 0, {(DWORD_PTR)(__FILE__ ": wined3d_cs")} }; -CRITICAL_SECTION wined3d_cs = {&wined3d_cs_debug, -1, 0, 0, 0, 0}; +static CRITICAL_SECTION wined3d_cs = {&wined3d_cs_debug, -1, 0, 0, 0, 0}; /* When updating default value here, make sure to update winecfg as well, * where appropriate. */ @@ -293,8 +294,11 @@ static BOOL wined3d_init(HINSTANCE hInstDLL) } if ( !get_config_key( hkey, appkey, "WineLogo", buffer, size) ) { - wined3d_settings.logo = HeapAlloc(GetProcessHeap(), 0, strlen(buffer) + 1); - if(wined3d_settings.logo) strcpy(wined3d_settings.logo, buffer); + size_t len = strlen(buffer) + 1; + + wined3d_settings.logo = HeapAlloc(GetProcessHeap(), 0, len); + if (!wined3d_settings.logo) ERR("Failed to allocate logo path memory.\n"); + else memcpy(wined3d_settings.logo, buffer, len); } if ( !get_config_key( hkey, appkey, "Multisampling", buffer, size) ) { diff --git a/reactos/dll/directx/wine/wined3d/wined3d_private.h b/reactos/dll/directx/wine/wined3d/wined3d_private.h index fefc54019c1..24066c9562e 100644 --- a/reactos/dll/directx/wine/wined3d/wined3d_private.h +++ b/reactos/dll/directx/wine/wined3d/wined3d_private.h @@ -133,9 +133,9 @@ static inline enum yuv_fixup get_yuv_fixup(struct color_fixup_desc fixup) return yuv_fixup; } -void *wined3d_rb_alloc(size_t size); -void *wined3d_rb_realloc(void *ptr, size_t size); -void wined3d_rb_free(void *ptr); +void *wined3d_rb_alloc(size_t size) DECLSPEC_HIDDEN; +void *wined3d_rb_realloc(void *ptr, size_t size) DECLSPEC_HIDDEN; +void wined3d_rb_free(void *ptr) DECLSPEC_HIDDEN; /* Device caps */ #define MAX_PALETTES 65536 @@ -155,32 +155,32 @@ void wined3d_rb_free(void *ptr); #define NUM_SAVEDVERTEXSTATES_T 2 #define NUM_SAVEDVERTEXSTATES_S 1 -extern const DWORD SavedPixelStates_R[NUM_SAVEDPIXELSTATES_R]; -extern const DWORD SavedPixelStates_T[NUM_SAVEDPIXELSTATES_T]; -extern const DWORD SavedPixelStates_S[NUM_SAVEDPIXELSTATES_S]; -extern const DWORD SavedVertexStates_R[NUM_SAVEDVERTEXSTATES_R]; -extern const DWORD SavedVertexStates_T[NUM_SAVEDVERTEXSTATES_T]; -extern const DWORD SavedVertexStates_S[NUM_SAVEDVERTEXSTATES_S]; +extern const DWORD SavedPixelStates_R[NUM_SAVEDPIXELSTATES_R] DECLSPEC_HIDDEN; +extern const DWORD SavedPixelStates_T[NUM_SAVEDPIXELSTATES_T] DECLSPEC_HIDDEN; +extern const DWORD SavedPixelStates_S[NUM_SAVEDPIXELSTATES_S] DECLSPEC_HIDDEN; +extern const DWORD SavedVertexStates_R[NUM_SAVEDVERTEXSTATES_R] DECLSPEC_HIDDEN; +extern const DWORD SavedVertexStates_T[NUM_SAVEDVERTEXSTATES_T] DECLSPEC_HIDDEN; +extern const DWORD SavedVertexStates_S[NUM_SAVEDVERTEXSTATES_S] DECLSPEC_HIDDEN; typedef enum _WINELOOKUP { WINELOOKUP_WARPPARAM = 0, MAX_LOOKUPS = 1 } WINELOOKUP; -extern const int minLookup[MAX_LOOKUPS]; -extern const int maxLookup[MAX_LOOKUPS]; -extern DWORD *stateLookup[MAX_LOOKUPS]; +extern const int minLookup[MAX_LOOKUPS] DECLSPEC_HIDDEN; +extern const int maxLookup[MAX_LOOKUPS] DECLSPEC_HIDDEN; +extern DWORD *stateLookup[MAX_LOOKUPS] DECLSPEC_HIDDEN; struct min_lookup { GLenum mip[WINED3DTEXF_LINEAR + 1]; }; -const struct min_lookup minMipLookup[WINED3DTEXF_LINEAR + 1]; -const struct min_lookup minMipLookup_noFilter[WINED3DTEXF_LINEAR + 1]; -const struct min_lookup minMipLookup_noMip[WINED3DTEXF_LINEAR + 1]; -const GLenum magLookup[WINED3DTEXF_LINEAR + 1]; -const GLenum magLookup_noFilter[WINED3DTEXF_LINEAR + 1]; +const struct min_lookup minMipLookup[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; +const struct min_lookup minMipLookup_noFilter[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; +const struct min_lookup minMipLookup_noMip[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; +const GLenum magLookup[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; +const GLenum magLookup_noFilter[WINED3DTEXF_LINEAR + 1] DECLSPEC_HIDDEN; static inline GLenum wined3d_gl_mag_filter(const GLenum mag_lookup[], WINED3DTEXTUREFILTERTYPE mag_filter) { @@ -294,7 +294,7 @@ typedef struct wined3d_settings_s { int allow_multisampling; } wined3d_settings_t; -extern wined3d_settings_t wined3d_settings; +extern wined3d_settings_t wined3d_settings DECLSPEC_HIDDEN; typedef enum _WINED3DSAMPLER_TEXTURE_TYPE { @@ -747,8 +747,8 @@ struct wined3d_shader_frontend BOOL (*shader_is_end)(void *data, const DWORD **ptr); }; -extern const struct wined3d_shader_frontend sm1_shader_frontend; -extern const struct wined3d_shader_frontend sm4_shader_frontend; +extern const struct wined3d_shader_frontend sm1_shader_frontend DECLSPEC_HIDDEN; +extern const struct wined3d_shader_frontend sm4_shader_frontend DECLSPEC_HIDDEN; typedef void (*SHADER_HANDLER)(const struct wined3d_shader_instruction *); @@ -842,17 +842,17 @@ typedef struct { void (*shader_add_instruction_modifiers)(const struct wined3d_shader_instruction *ins); } shader_backend_t; -extern const shader_backend_t glsl_shader_backend; -extern const shader_backend_t arb_program_shader_backend; -extern const shader_backend_t none_shader_backend; +extern const shader_backend_t glsl_shader_backend DECLSPEC_HIDDEN; +extern const shader_backend_t arb_program_shader_backend DECLSPEC_HIDDEN; +extern const shader_backend_t none_shader_backend DECLSPEC_HIDDEN; /* X11 locking */ -extern void (* CDECL wine_tsx11_lock_ptr)(void); -extern void (* CDECL wine_tsx11_unlock_ptr)(void); +extern void (* CDECL wine_tsx11_lock_ptr)(void) DECLSPEC_HIDDEN; +extern void (* CDECL wine_tsx11_unlock_ptr)(void) DECLSPEC_HIDDEN; /* As GLX relies on X, this is needed */ -extern int num_lock; +extern int num_lock DECLSPEC_HIDDEN; #if 0 #define ENTER_GL() ++num_lock; if (num_lock > 1) FIXME("Recursive use of GL lock to: %d\n", num_lock); wine_tsx11_lock_ptr() @@ -961,7 +961,7 @@ typedef struct IWineD3DPaletteImpl IWineD3DPaletteImpl; typedef struct IWineD3DDeviceImpl IWineD3DDeviceImpl; /* Global variables */ -extern const float identity[16]; +extern const float identity[16] DECLSPEC_HIDDEN; /***************************************************************************** * Compilable extra diagnostics @@ -1067,18 +1067,18 @@ struct wined3d_stream_info */ /* Routine common to the draw primitive and draw indexed primitive routines */ -void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT numberOfVertices, - UINT start_idx, UINT idxBytes, const void *idxData, UINT minIndex); -DWORD get_flexible_vertex_size(DWORD d3dvtVertexType); +void drawPrimitive(IWineD3DDevice *iface, UINT index_count, + UINT start_idx, UINT idxBytes, const void *idxData) DECLSPEC_HIDDEN; +DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN; typedef void (WINE_GLAPI *glAttribFunc)(const void *data); typedef void (WINE_GLAPI *glMultiTexCoordFunc)(GLenum unit, const void *data); -extern glAttribFunc position_funcs[WINED3D_FFP_EMIT_COUNT]; -extern glAttribFunc diffuse_funcs[WINED3D_FFP_EMIT_COUNT]; -extern glAttribFunc specular_func_3ubv; -extern glAttribFunc specular_funcs[WINED3D_FFP_EMIT_COUNT]; -extern glAttribFunc normal_funcs[WINED3D_FFP_EMIT_COUNT]; -extern glMultiTexCoordFunc multi_texcoord_funcs[WINED3D_FFP_EMIT_COUNT]; +extern glAttribFunc position_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC_HIDDEN; +extern glAttribFunc diffuse_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC_HIDDEN; +extern glAttribFunc specular_func_3ubv DECLSPEC_HIDDEN; +extern glAttribFunc specular_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC_HIDDEN; +extern glAttribFunc normal_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC_HIDDEN; +extern glMultiTexCoordFunc multi_texcoord_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC_HIDDEN; #define eps 1e-8 @@ -1270,18 +1270,18 @@ struct fragment_pipeline BOOL ffp_proj_control; }; -extern const struct StateEntryTemplate misc_state_template[]; -extern const struct StateEntryTemplate ffp_vertexstate_template[]; -extern const struct fragment_pipeline ffp_fragment_pipeline; -extern const struct fragment_pipeline atifs_fragment_pipeline; -extern const struct fragment_pipeline arbfp_fragment_pipeline; -extern const struct fragment_pipeline nvts_fragment_pipeline; -extern const struct fragment_pipeline nvrc_fragment_pipeline; +extern const struct StateEntryTemplate misc_state_template[] DECLSPEC_HIDDEN; +extern const struct StateEntryTemplate ffp_vertexstate_template[] DECLSPEC_HIDDEN; +extern const struct fragment_pipeline ffp_fragment_pipeline DECLSPEC_HIDDEN; +extern const struct fragment_pipeline atifs_fragment_pipeline DECLSPEC_HIDDEN; +extern const struct fragment_pipeline arbfp_fragment_pipeline DECLSPEC_HIDDEN; +extern const struct fragment_pipeline nvts_fragment_pipeline DECLSPEC_HIDDEN; +extern const struct fragment_pipeline nvrc_fragment_pipeline DECLSPEC_HIDDEN; /* "Base" state table */ HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_multistate_funcs, const struct wined3d_gl_info *gl_info, const struct StateEntryTemplate *vertex, - const struct fragment_pipeline *fragment, const struct StateEntryTemplate *misc); + const struct fragment_pipeline *fragment, const struct StateEntryTemplate *misc) DECLSPEC_HIDDEN; /* Shaders for color conversions in blits */ struct blit_shader @@ -1294,8 +1294,8 @@ struct blit_shader BOOL (*color_fixup_supported)(struct color_fixup_desc fixup); }; -extern const struct blit_shader ffp_blit; -extern const struct blit_shader arbfp_blit; +extern const struct blit_shader ffp_blit DECLSPEC_HIDDEN; +extern const struct blit_shader arbfp_blit DECLSPEC_HIDDEN; typedef enum ContextUsage { CTXUSAGE_RESOURCELOAD = 1, /* Only loads textures: No State is applied */ @@ -1304,27 +1304,31 @@ typedef enum ContextUsage { CTXUSAGE_CLEAR = 4, /* Drawable and states are set up for clearing */ } ContextUsage; -struct wined3d_context *ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, enum ContextUsage usage); +struct wined3d_context *ActivateContext(IWineD3DDeviceImpl *This, + IWineD3DSurface *target, enum ContextUsage usage) DECLSPEC_HIDDEN; struct wined3d_context *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win, - BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms); -void DestroyContext(IWineD3DDeviceImpl *This, struct wined3d_context *context); -void context_alloc_event_query(struct wined3d_context *context, struct wined3d_event_query *query); -void context_alloc_occlusion_query(struct wined3d_context *context, struct wined3d_occlusion_query *query); -void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource, WINED3DRESOURCETYPE type); -void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fbo); + BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms) DECLSPEC_HIDDEN; +void DestroyContext(IWineD3DDeviceImpl *This, struct wined3d_context *context) DECLSPEC_HIDDEN; +void context_alloc_event_query(struct wined3d_context *context, + struct wined3d_event_query *query) DECLSPEC_HIDDEN; +void context_alloc_occlusion_query(struct wined3d_context *context, + struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN; +void context_resource_released(IWineD3DDevice *iface, + IWineD3DResource *resource, WINED3DRESOURCETYPE type) DECLSPEC_HIDDEN; +void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fbo) DECLSPEC_HIDDEN; void context_attach_depth_stencil_fbo(struct wined3d_context *context, - GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer); + GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer) DECLSPEC_HIDDEN; void context_attach_surface_fbo(const struct wined3d_context *context, - GLenum fbo_target, DWORD idx, IWineD3DSurface *surface); -void context_free_event_query(struct wined3d_event_query *query); -void context_free_occlusion_query(struct wined3d_occlusion_query *query); -struct wined3d_context *context_get_current(void); -DWORD context_get_tls_idx(void); -BOOL context_set_current(struct wined3d_context *ctx); -void context_set_tls_idx(DWORD idx); + GLenum fbo_target, DWORD idx, IWineD3DSurface *surface) DECLSPEC_HIDDEN; +void context_free_event_query(struct wined3d_event_query *query) DECLSPEC_HIDDEN; +void context_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN; +struct wined3d_context *context_get_current(void) DECLSPEC_HIDDEN; +DWORD context_get_tls_idx(void) DECLSPEC_HIDDEN; +BOOL context_set_current(struct wined3d_context *ctx) DECLSPEC_HIDDEN; +void context_set_tls_idx(DWORD idx) DECLSPEC_HIDDEN; -void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain); -HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain); +void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain) DECLSPEC_HIDDEN; +HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain) DECLSPEC_HIDDEN; /* Macros for doing basic GPU detection based on opengl capabilities */ #define WINE_D3D6_CAPABLE(gl_info) (gl_info->supported[ARB_MULTITEXTURE]) @@ -1333,9 +1337,7 @@ HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain * #define WINE_D3D9_CAPABLE(gl_info) WINE_D3D8_CAPABLE(gl_info) && (gl_info->supported[ARB_FRAGMENT_PROGRAM] && gl_info->supported[ARB_VERTEX_SHADER]) /* Default callbacks for implicit object destruction */ -extern ULONG WINAPI D3DCB_DefaultDestroySurface(IWineD3DSurface *pSurface); - -extern ULONG WINAPI D3DCB_DefaultDestroyVolume(IWineD3DVolume *pSurface); +extern ULONG WINAPI D3DCB_DefaultDestroyVolume(IWineD3DVolume *pSurface) DECLSPEC_HIDDEN; /***************************************************************************** * Internal representation of a light @@ -1359,7 +1361,7 @@ struct PLIGHTINFOEL { }; /* The default light parameters */ -extern const WINED3DLIGHT WINED3D_default_light; +extern const WINED3DLIGHT WINED3D_default_light DECLSPEC_HIDDEN; typedef struct WineD3D_PixelFormat { @@ -1391,10 +1393,10 @@ struct WineD3DAdapter unsigned int UsedTextureRam; }; -extern BOOL initPixelFormats(struct wined3d_gl_info *gl_info); -BOOL initPixelFormatsNoGL(struct wined3d_gl_info *gl_info); -extern long WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, long glram); -extern void add_gl_compat_wrappers(struct wined3d_gl_info *gl_info); +extern BOOL initPixelFormats(struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; +BOOL initPixelFormatsNoGL(struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; +extern long WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, long glram) DECLSPEC_HIDDEN; +extern void add_gl_compat_wrappers(struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; /***************************************************************************** * High order patch management @@ -1410,7 +1412,7 @@ struct WineD3DRectPatch struct list entry; }; -HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This, struct WineD3DRectPatch *patch); +HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This, struct WineD3DRectPatch *patch) DECLSPEC_HIDDEN; enum projection_types { @@ -1462,12 +1464,14 @@ struct ffp_frag_desc struct ffp_frag_settings settings; }; -extern const struct wine_rb_functions wined3d_ffp_frag_program_rb_functions; +extern const struct wine_rb_functions wined3d_ffp_frag_program_rb_functions DECLSPEC_HIDDEN; +extern const struct wined3d_parent_ops wined3d_null_parent_ops DECLSPEC_HIDDEN; -void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_settings *settings, BOOL ignore_textype); +void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_settings *settings, + BOOL ignore_textype) DECLSPEC_HIDDEN; const struct ffp_frag_desc *find_ffp_frag_shader(const struct wine_rb_tree *fragment_shaders, - const struct ffp_frag_settings *settings); -void add_ffp_frag_shader(struct wine_rb_tree *shaders, struct ffp_frag_desc *desc); + const struct ffp_frag_settings *settings) DECLSPEC_HIDDEN; +void add_ffp_frag_shader(struct wine_rb_tree *shaders, struct ffp_frag_desc *desc) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3D implementation structure @@ -1486,12 +1490,12 @@ typedef struct IWineD3DImpl struct WineD3DAdapter adapters[1]; } IWineD3DImpl; -extern const IWineD3DVtbl IWineD3D_Vtbl; +extern const IWineD3DVtbl IWineD3D_Vtbl DECLSPEC_HIDDEN; -BOOL InitAdapters(IWineD3DImpl *This); +BOOL InitAdapters(IWineD3DImpl *This) DECLSPEC_HIDDEN; /* A helper function that dumps a resource list */ -void dumpResources(struct list *list); +void dumpResources(struct list *list) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DDevice implementation structure @@ -1638,19 +1642,18 @@ struct IWineD3DDeviceImpl struct WineD3DRectPatch *currentPatch; }; -extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl; +extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl DECLSPEC_HIDDEN; -void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource); -void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource); +void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN; +void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN; void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, - BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup); + BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup) DECLSPEC_HIDDEN; void device_stream_info_from_strided(IWineD3DDeviceImpl *This, - const struct WineDirect3DVertexStridedData *strided, struct wined3d_stream_info *stream_info); -HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count, - CONST WINED3DRECT* pRects, DWORD Flags, WINED3DCOLOR Color, - float Z, DWORD Stencil); -void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This); -void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state); + const struct WineDirect3DVertexStridedData *strided, struct wined3d_stream_info *stream_info) DECLSPEC_HIDDEN; +HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count, + const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) DECLSPEC_HIDDEN; +void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) DECLSPEC_HIDDEN; +void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state) DECLSPEC_HIDDEN; static inline BOOL isStateDirty(struct wined3d_context *context, DWORD state) { DWORD idx = state >> 5; @@ -1696,7 +1699,7 @@ typedef struct IWineD3DResourceClass BYTE *heapMemory; /* Pointer to the HeapAlloced block of memory */ struct list privateData; struct list resource_list_entry; - + const struct wined3d_parent_ops *parent_ops; } IWineD3DResourceClass; typedef struct IWineD3DResourceImpl @@ -1706,20 +1709,20 @@ typedef struct IWineD3DResourceImpl IWineD3DResourceClass resource; } IWineD3DResourceImpl; -void resource_cleanup(IWineD3DResource *iface); -HRESULT resource_free_private_data(IWineD3DResource *iface, REFGUID guid); -HRESULT resource_get_device(IWineD3DResource *iface, IWineD3DDevice **device); -HRESULT resource_get_parent(IWineD3DResource *iface, IUnknown **parent); -DWORD resource_get_priority(IWineD3DResource *iface); +void resource_cleanup(IWineD3DResource *iface) DECLSPEC_HIDDEN; +HRESULT resource_free_private_data(IWineD3DResource *iface, REFGUID guid) DECLSPEC_HIDDEN; +HRESULT resource_get_device(IWineD3DResource *iface, IWineD3DDevice **device) DECLSPEC_HIDDEN; +HRESULT resource_get_parent(IWineD3DResource *iface, IUnknown **parent) DECLSPEC_HIDDEN; +DWORD resource_get_priority(IWineD3DResource *iface) DECLSPEC_HIDDEN; HRESULT resource_get_private_data(IWineD3DResource *iface, REFGUID guid, - void *data, DWORD *data_size); + void *data, DWORD *data_size) DECLSPEC_HIDDEN; HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc, - WINED3DPOOL pool, IUnknown *parent); -WINED3DRESOURCETYPE resource_get_type(IWineD3DResource *iface); -DWORD resource_set_priority(IWineD3DResource *iface, DWORD new_priority); + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; +WINED3DRESOURCETYPE resource_get_type(IWineD3DResource *iface) DECLSPEC_HIDDEN; +DWORD resource_set_priority(IWineD3DResource *iface, DWORD new_priority) DECLSPEC_HIDDEN; HRESULT resource_set_private_data(IWineD3DResource *iface, REFGUID guid, - const void *data, DWORD data_size, DWORD flags); + const void *data, DWORD data_size, DWORD flags) DECLSPEC_HIDDEN; /* Tests show that the start address of resources is 32 byte aligned */ #define RESOURCE_ALIGNMENT 32 @@ -1753,16 +1756,20 @@ enum WINED3DSRGB SRGB_BOTH = 3, /* Loads both textures */ }; +struct gl_texture +{ + DWORD states[MAX_WINETEXTURESTATES]; + BOOL dirty; + GLuint name; +}; + /***************************************************************************** * IWineD3DBaseTexture implementation structure (extends IWineD3DResourceImpl) */ typedef struct IWineD3DBaseTextureClass { - DWORD states[MAX_WINETEXTURESTATES]; - DWORD srgbstates[MAX_WINETEXTURESTATES]; + struct gl_texture texture_rgb, texture_srgb; UINT levels; - BOOL dirty, srgbDirty; - UINT textureName, srgbTextureName; float pow2Matrix[16]; UINT LOD; WINED3DTEXTUREFILTERTYPE filterType; @@ -1775,7 +1782,7 @@ typedef struct IWineD3DBaseTextureClass void (*internal_preload)(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb); } IWineD3DBaseTextureClass; -void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb); +void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN; typedef struct IWineD3DBaseTextureImpl { @@ -1788,21 +1795,22 @@ typedef struct IWineD3DBaseTextureImpl void basetexture_apply_state_changes(IWineD3DBaseTexture *iface, const DWORD texture_states[WINED3D_HIGHEST_TEXTURE_STATE + 1], - const DWORD sampler_states[WINED3D_HIGHEST_SAMPLER_STATE + 1]); -HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surface_desc); -void basetexture_cleanup(IWineD3DBaseTexture *iface); -void basetexture_generate_mipmaps(IWineD3DBaseTexture *iface); -WINED3DTEXTUREFILTERTYPE basetexture_get_autogen_filter_type(IWineD3DBaseTexture *iface); -BOOL basetexture_get_dirty(IWineD3DBaseTexture *iface); -DWORD basetexture_get_level_count(IWineD3DBaseTexture *iface); -DWORD basetexture_get_lod(IWineD3DBaseTexture *iface); + const DWORD sampler_states[WINED3D_HIGHEST_SAMPLER_STATE + 1]) DECLSPEC_HIDDEN; +HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surface_desc) DECLSPEC_HIDDEN; +void basetexture_cleanup(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN; +void basetexture_generate_mipmaps(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN; +WINED3DTEXTUREFILTERTYPE basetexture_get_autogen_filter_type(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN; +BOOL basetexture_get_dirty(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN; +DWORD basetexture_get_level_count(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN; +DWORD basetexture_get_lod(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN; HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc, - WINED3DPOOL pool, IUnknown *parent); -HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DTEXTUREFILTERTYPE filter_type); -BOOL basetexture_set_dirty(IWineD3DBaseTexture *iface, BOOL dirty); -DWORD basetexture_set_lod(IWineD3DBaseTexture *iface, DWORD new_lod); -void basetexture_unload(IWineD3DBaseTexture *iface); + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; +HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, + WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN; +BOOL basetexture_set_dirty(IWineD3DBaseTexture *iface, BOOL dirty) DECLSPEC_HIDDEN; +DWORD basetexture_set_lod(IWineD3DBaseTexture *iface, DWORD new_lod) DECLSPEC_HIDDEN; +void basetexture_unload(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DTexture implementation structure (extends IWineD3DBaseTextureImpl) @@ -1821,10 +1829,9 @@ typedef struct IWineD3DTextureImpl } IWineD3DTextureImpl; -extern const IWineD3DTextureVtbl IWineD3DTexture_Vtbl; - HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT levels, - IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent); + IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DCubeTexture implementation structure (extends IWineD3DBaseTextureImpl) @@ -1840,10 +1847,9 @@ typedef struct IWineD3DCubeTextureImpl IWineD3DSurface *surfaces[6][MAX_MIP_LEVELS]; } IWineD3DCubeTextureImpl; -extern const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl; - HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UINT levels, - IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent); + IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; typedef struct _WINED3DVOLUMET_DESC { @@ -1871,9 +1877,10 @@ typedef struct IWineD3DVolumeImpl BOOL dirty; } IWineD3DVolumeImpl; -extern const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl; - -void volume_add_dirty_box(IWineD3DVolume *iface, const WINED3DBOX *dirty_box); +void volume_add_dirty_box(IWineD3DVolume *iface, const WINED3DBOX *dirty_box) DECLSPEC_HIDDEN; +HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT width, + UINT height, UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DVolumeTexture implementation structure (extends IWineD3DBaseTextureImpl) @@ -1889,10 +1896,9 @@ typedef struct IWineD3DVolumeTextureImpl IWineD3DVolume *volumes[MAX_MIP_LEVELS]; } IWineD3DVolumeTextureImpl; -extern const IWineD3DVolumeTextureVtbl IWineD3DVolumeTexture_Vtbl; - -HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT height, UINT depth, UINT levels, - IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent); +HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT height, + UINT depth, UINT levels, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; typedef struct _WINED3DSURFACET_DESC { @@ -2008,62 +2014,70 @@ struct IWineD3DSurfaceImpl struct list overlay_entry; }; -extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl; -extern const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl; +extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl DECLSPEC_HIDDEN; +extern const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl DECLSPEC_HIDDEN; -UINT surface_calculate_size(const struct GlPixelFormatDesc *format_desc, UINT alignment, UINT width, UINT height); -void surface_gdi_cleanup(IWineD3DSurfaceImpl *This); +UINT surface_calculate_size(const struct GlPixelFormatDesc *format_desc, + UINT alignment, UINT width, UINT height) DECLSPEC_HIDDEN; +void surface_gdi_cleanup(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN; HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment, UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type, UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format, - WINED3DPOOL pool, IUnknown *parent); + WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; /* Predeclare the shared Surface functions */ -HRESULT WINAPI IWineD3DBaseSurfaceImpl_QueryInterface(IWineD3DSurface *iface, REFIID riid, LPVOID *ppobj); -ULONG WINAPI IWineD3DBaseSurfaceImpl_AddRef(IWineD3DSurface *iface); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetParent(IWineD3DSurface *iface, IUnknown **pParent); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetDevice(IWineD3DSurface *iface, IWineD3DDevice** ppDevice); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPrivateData(IWineD3DSurface *iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPrivateData(IWineD3DSurface *iface, REFGUID refguid, void* pData, DWORD* pSizeOfData); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_FreePrivateData(IWineD3DSurface *iface, REFGUID refguid); -DWORD WINAPI IWineD3DBaseSurfaceImpl_SetPriority(IWineD3DSurface *iface, DWORD PriorityNew); -DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPriority(IWineD3DSurface *iface); -WINED3DRESOURCETYPE WINAPI IWineD3DBaseSurfaceImpl_GetType(IWineD3DSurface *iface); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetContainer(IWineD3DSurface* iface, REFIID riid, void** ppContainer); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetDesc(IWineD3DSurface *iface, WINED3DSURFACE_DESC *pDesc); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetBltStatus(IWineD3DSurface *iface, DWORD Flags); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetFlipStatus(IWineD3DSurface *iface, DWORD Flags); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_IsLost(IWineD3DSurface *iface); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_Restore(IWineD3DSurface *iface); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPalette(IWineD3DSurface *iface, IWineD3DPalette **Pal); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPalette(IWineD3DSurface *iface, IWineD3DPalette *Pal); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetColorKey(IWineD3DSurface *iface, DWORD Flags, const WINEDDCOLORKEY *CKey); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWineD3DBase *container); -DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_RealizePalette(IWineD3DSurface *iface); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetOverlayPosition(IWineD3DSurface *iface, LONG X, LONG Y); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetOverlayPosition(IWineD3DSurface *iface, LONG *X, LONG *Y); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_UpdateOverlayZOrder(IWineD3DSurface *iface, DWORD Flags, IWineD3DSurface *Ref); +HRESULT WINAPI IWineD3DBaseSurfaceImpl_QueryInterface(IWineD3DSurface *iface, + REFIID riid, LPVOID *ppobj) DECLSPEC_HIDDEN; +ULONG WINAPI IWineD3DBaseSurfaceImpl_AddRef(IWineD3DSurface *iface) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetParent(IWineD3DSurface *iface, IUnknown **pParent) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetDevice(IWineD3DSurface *iface, IWineD3DDevice** ppDevice) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPrivateData(IWineD3DSurface *iface, + REFGUID refguid, const void *pData, DWORD SizeOfData, DWORD Flags) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPrivateData(IWineD3DSurface *iface, + REFGUID refguid, void *pData, DWORD *pSizeOfData) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_FreePrivateData(IWineD3DSurface *iface, REFGUID refguid) DECLSPEC_HIDDEN; +DWORD WINAPI IWineD3DBaseSurfaceImpl_SetPriority(IWineD3DSurface *iface, DWORD PriorityNew) DECLSPEC_HIDDEN; +DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPriority(IWineD3DSurface *iface) DECLSPEC_HIDDEN; +WINED3DRESOURCETYPE WINAPI IWineD3DBaseSurfaceImpl_GetType(IWineD3DSurface *iface) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetContainer(IWineD3DSurface* iface, + REFIID riid, void **ppContainer) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetDesc(IWineD3DSurface *iface, WINED3DSURFACE_DESC *pDesc) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetBltStatus(IWineD3DSurface *iface, DWORD Flags) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetFlipStatus(IWineD3DSurface *iface, DWORD Flags) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_IsLost(IWineD3DSurface *iface) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_Restore(IWineD3DSurface *iface) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPalette(IWineD3DSurface *iface, IWineD3DPalette **Pal) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPalette(IWineD3DSurface *iface, IWineD3DPalette *Pal) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetColorKey(IWineD3DSurface *iface, + DWORD Flags, const WINEDDCOLORKEY *CKey) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWineD3DBase *container) DECLSPEC_HIDDEN; +DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_RealizePalette(IWineD3DSurface *iface) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetOverlayPosition(IWineD3DSurface *iface, LONG X, LONG Y) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetOverlayPosition(IWineD3DSurface *iface, LONG *X, LONG *Y) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_UpdateOverlayZOrder(IWineD3DSurface *iface, + DWORD Flags, IWineD3DSurface *Ref) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_UpdateOverlay(IWineD3DSurface *iface, const RECT *SrcRect, - IWineD3DSurface *DstSurface, const RECT *DstRect, DWORD Flags, const WINEDDOVERLAYFX *FX); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetClipper(IWineD3DSurface *iface, IWineD3DClipper *clipper); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetClipper(IWineD3DSurface *iface, IWineD3DClipper **clipper); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format); -HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface); + IWineD3DSurface *DstSurface, const RECT *DstRect, DWORD Flags, const WINEDDOVERLAYFX *FX) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetClipper(IWineD3DSurface *iface, IWineD3DClipper *clipper) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetClipper(IWineD3DSurface *iface, IWineD3DClipper **clipper) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format) DECLSPEC_HIDDEN; +HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *DestRect, IWineD3DSurface *SrcSurface, - const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter); + const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dstx, DWORD dsty, - IWineD3DSurface *Source, const RECT *rsrc, DWORD trans); -HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags); -void WINAPI IWineD3DBaseSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb); -const void *WINAPI IWineD3DBaseSurfaceImpl_GetData(IWineD3DSurface *iface); + IWineD3DSurface *Source, const RECT *rsrc, DWORD trans) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DLOCKED_RECT *pLockedRect, + const RECT *pRect, DWORD Flags) DECLSPEC_HIDDEN; +void WINAPI IWineD3DBaseSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) DECLSPEC_HIDDEN; +const void *WINAPI IWineD3DBaseSurfaceImpl_GetData(IWineD3DSurface *iface) DECLSPEC_HIDDEN; -void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height); -void get_drawable_size_backbuffer(struct wined3d_context *context, UINT *width, UINT *height); -void get_drawable_size_pbuffer(struct wined3d_context *context, UINT *width, UINT *height); -void get_drawable_size_fbo(struct wined3d_context *context, UINT *width, UINT *height); +void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN; +void get_drawable_size_backbuffer(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN; +void get_drawable_size_pbuffer(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN; +void get_drawable_size_fbo(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN; -void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back); +void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) DECLSPEC_HIDDEN; /* Surface flags: */ #define SFLAG_OVERSIZE 0x00000001 /* Surface is bigger than gl size, blts only */ @@ -2119,7 +2133,7 @@ void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back); SFLAG_DS_OFFSCREEN) #define SFLAG_DS_DISCARDED SFLAG_DS_LOCATIONS -BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4]); +BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4]) DECLSPEC_HIDDEN; typedef enum { NO_CONVERSION, @@ -2149,9 +2163,10 @@ typedef enum { CONVERT_D24FS8, } CONVERT_TYPES; -HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, GLenum *format, GLenum *internal, GLenum *type, CONVERT_TYPES *convert, int *target_bpp, BOOL srgb_mode); +HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, GLenum *format, + GLenum *internal, GLenum *type, CONVERT_TYPES *convert, int *target_bpp, BOOL srgb_mode) DECLSPEC_HIDDEN; -BOOL palette9_changed(IWineD3DSurfaceImpl *This); +BOOL palette9_changed(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DVertexDeclaration implementation structure @@ -2176,6 +2191,7 @@ typedef struct IWineD3DVertexDeclarationImpl { LONG ref; IUnknown *parent; + const struct wined3d_parent_ops *parent_ops; IWineD3DDeviceImpl *wineD3DDevice; struct wined3d_vertex_declaration_element *elements; @@ -2187,10 +2203,9 @@ typedef struct IWineD3DVertexDeclarationImpl { BOOL half_float_conv_needed; } IWineD3DVertexDeclarationImpl; -extern const IWineD3DVertexDeclarationVtbl IWineD3DVertexDeclaration_Vtbl; - -HRESULT vertexdeclaration_init(IWineD3DVertexDeclarationImpl *This, - const WINED3DVERTEXELEMENT *elements, UINT element_count); +HRESULT vertexdeclaration_init(IWineD3DVertexDeclarationImpl *declaration, IWineD3DDeviceImpl *device, + const WINED3DVERTEXELEMENT *elements, UINT element_count, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DStateBlock implementation structure @@ -2336,16 +2351,10 @@ struct IWineD3DStateBlockImpl unsigned int num_contained_sampler_states; }; -extern void stateblock_savedstates_set( - IWineD3DStateBlock* iface, - SAVEDSTATES* states, - BOOL value); +extern void stateblock_savedstates_set(IWineD3DStateBlock *iface, SAVEDSTATES *states, BOOL value) DECLSPEC_HIDDEN; +extern void stateblock_copy(IWineD3DStateBlock *destination, IWineD3DStateBlock *source) DECLSPEC_HIDDEN; -extern void stateblock_copy( - IWineD3DStateBlock* destination, - IWineD3DStateBlock* source); - -extern const IWineD3DStateBlockVtbl IWineD3DStateBlock_Vtbl; +extern const IWineD3DStateBlockVtbl IWineD3DStateBlock_Vtbl DECLSPEC_HIDDEN; /* Direct3D terminology with little modifications. We do not have an issued state * because only the driver knows about it, but we have a created state because d3d @@ -2379,9 +2388,9 @@ typedef struct IWineD3DQueryImpl void *extendedData; } IWineD3DQueryImpl; -extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl; -extern const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl; -extern const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl; +extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl DECLSPEC_HIDDEN; +extern const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl DECLSPEC_HIDDEN; +extern const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl DECLSPEC_HIDDEN; /* IWineD3DBuffer */ @@ -2429,9 +2438,11 @@ struct wined3d_buffer UINT *conversion_shift; /* NULL if no shifted conversion */ }; -extern const IWineD3DBufferVtbl wined3d_buffer_vtbl; -const BYTE *buffer_get_memory(IWineD3DBuffer *iface, UINT offset, GLuint *buffer_object); -BYTE *buffer_get_sysmem(struct wined3d_buffer *This); +const BYTE *buffer_get_memory(IWineD3DBuffer *iface, UINT offset, GLuint *buffer_object) DECLSPEC_HIDDEN; +BYTE *buffer_get_sysmem(struct wined3d_buffer *This) DECLSPEC_HIDDEN; +HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device, + UINT size, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, GLenum bind_hint, + const char *data, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; /* IWineD3DRendertargetView */ struct wined3d_rendertarget_view @@ -2443,7 +2454,7 @@ struct wined3d_rendertarget_view IUnknown *parent; }; -extern const IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl; +extern const IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DSwapChainImpl implementation structure (extends IUnknown) @@ -2475,24 +2486,33 @@ typedef struct IWineD3DSwapChainImpl HWND win_handle; } IWineD3DSwapChainImpl; -extern const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl; -const IWineD3DSwapChainVtbl IWineGDISwapChain_Vtbl; -void x11_copy_to_screen(IWineD3DSwapChainImpl *This, const RECT *rc); +extern const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl DECLSPEC_HIDDEN; +const IWineD3DSwapChainVtbl IWineGDISwapChain_Vtbl DECLSPEC_HIDDEN; +void x11_copy_to_screen(IWineD3DSwapChainImpl *This, const RECT *rc) DECLSPEC_HIDDEN; -HRESULT WINAPI IWineD3DBaseSwapChainImpl_QueryInterface(IWineD3DSwapChain *iface, REFIID riid, LPVOID *ppobj); -ULONG WINAPI IWineD3DBaseSwapChainImpl_AddRef(IWineD3DSwapChain *iface); -ULONG WINAPI IWineD3DBaseSwapChainImpl_Release(IWineD3DSwapChain *iface); -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetParent(IWineD3DSwapChain *iface, IUnknown ** ppParent); -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *iface, IWineD3DSurface *pDestSurface); -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface, UINT iBackBuffer, WINED3DBACKBUFFER_TYPE Type, IWineD3DSurface **ppBackBuffer); -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetRasterStatus(IWineD3DSwapChain *iface, WINED3DRASTER_STATUS *pRasterStatus); -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDisplayMode(IWineD3DSwapChain *iface, WINED3DDISPLAYMODE*pMode); -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDevice(IWineD3DSwapChain *iface, IWineD3DDevice**ppDevice); -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetPresentParameters(IWineD3DSwapChain *iface, WINED3DPRESENT_PARAMETERS *pPresentationParameters); -HRESULT WINAPI IWineD3DBaseSwapChainImpl_SetGammaRamp(IWineD3DSwapChain *iface, DWORD Flags, CONST WINED3DGAMMARAMP *pRamp); -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetGammaRamp(IWineD3DSwapChain *iface, WINED3DGAMMARAMP *pRamp); +HRESULT WINAPI IWineD3DBaseSwapChainImpl_QueryInterface(IWineD3DSwapChain *iface, + REFIID riid, LPVOID *ppobj) DECLSPEC_HIDDEN; +ULONG WINAPI IWineD3DBaseSwapChainImpl_AddRef(IWineD3DSwapChain *iface) DECLSPEC_HIDDEN; +ULONG WINAPI IWineD3DBaseSwapChainImpl_Release(IWineD3DSwapChain *iface) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetParent(IWineD3DSwapChain *iface, IUnknown **ppParent) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *iface, + IWineD3DSurface *pDestSurface) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface, UINT iBackBuffer, + WINED3DBACKBUFFER_TYPE Type, IWineD3DSurface **ppBackBuffer) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetRasterStatus(IWineD3DSwapChain *iface, + WINED3DRASTER_STATUS *pRasterStatus) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDisplayMode(IWineD3DSwapChain *iface, + WINED3DDISPLAYMODE *pMode) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDevice(IWineD3DSwapChain *iface, + IWineD3DDevice **ppDevice) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetPresentParameters(IWineD3DSwapChain *iface, + WINED3DPRESENT_PARAMETERS *pPresentationParameters) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSwapChainImpl_SetGammaRamp(IWineD3DSwapChain *iface, + DWORD Flags, const WINED3DGAMMARAMP *pRamp) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetGammaRamp(IWineD3DSwapChain *iface, + WINED3DGAMMARAMP *pRamp) DECLSPEC_HIDDEN; -struct wined3d_context *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface); +struct wined3d_context *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *iface) DECLSPEC_HIDDEN; #define DEFAULT_REFRESH_RATE 0 @@ -2501,59 +2521,72 @@ struct wined3d_context *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwa */ /* Trace routines */ -const char* debug_d3dformat(WINED3DFORMAT fmt); -const char* debug_d3ddevicetype(WINED3DDEVTYPE devtype); -const char* debug_d3dresourcetype(WINED3DRESOURCETYPE res); -const char* debug_d3dusage(DWORD usage); -const char* debug_d3dusagequery(DWORD usagequery); -const char* debug_d3ddeclmethod(WINED3DDECLMETHOD method); -const char* debug_d3ddeclusage(BYTE usage); -const char* debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType); -const char* debug_d3drenderstate(DWORD state); -const char* debug_d3dsamplerstate(DWORD state); -const char* debug_d3dtexturefiltertype(WINED3DTEXTUREFILTERTYPE filter_type); -const char* debug_d3dtexturestate(DWORD state); -const char* debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype); -const char* debug_d3dpool(WINED3DPOOL pool); -const char *debug_fbostatus(GLenum status); -const char *debug_glerror(GLenum error); -const char *debug_d3dbasis(WINED3DBASISTYPE basis); -const char *debug_d3ddegree(WINED3DDEGREETYPE order); -const char* debug_d3dtop(WINED3DTEXTUREOP d3dtop); -void dump_color_fixup_desc(struct color_fixup_desc fixup); -const char *debug_surflocation(DWORD flag); +const char *debug_d3dformat(WINED3DFORMAT fmt) DECLSPEC_HIDDEN; +const char *debug_d3ddevicetype(WINED3DDEVTYPE devtype) DECLSPEC_HIDDEN; +const char *debug_d3dresourcetype(WINED3DRESOURCETYPE res) DECLSPEC_HIDDEN; +const char *debug_d3dusage(DWORD usage) DECLSPEC_HIDDEN; +const char *debug_d3dusagequery(DWORD usagequery) DECLSPEC_HIDDEN; +const char *debug_d3ddeclmethod(WINED3DDECLMETHOD method) DECLSPEC_HIDDEN; +const char *debug_d3ddeclusage(BYTE usage) DECLSPEC_HIDDEN; +const char *debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType) DECLSPEC_HIDDEN; +const char *debug_d3drenderstate(DWORD state) DECLSPEC_HIDDEN; +const char *debug_d3dsamplerstate(DWORD state) DECLSPEC_HIDDEN; +const char *debug_d3dtexturefiltertype(WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN; +const char *debug_d3dtexturestate(DWORD state) DECLSPEC_HIDDEN; +const char *debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype) DECLSPEC_HIDDEN; +const char *debug_d3dpool(WINED3DPOOL pool) DECLSPEC_HIDDEN; +const char *debug_fbostatus(GLenum status) DECLSPEC_HIDDEN; +const char *debug_glerror(GLenum error) DECLSPEC_HIDDEN; +const char *debug_d3dbasis(WINED3DBASISTYPE basis) DECLSPEC_HIDDEN; +const char *debug_d3ddegree(WINED3DDEGREETYPE order) DECLSPEC_HIDDEN; +const char *debug_d3dtop(WINED3DTEXTUREOP d3dtop) DECLSPEC_HIDDEN; +void dump_color_fixup_desc(struct color_fixup_desc fixup) DECLSPEC_HIDDEN; +const char *debug_surflocation(DWORD flag) DECLSPEC_HIDDEN; /* Routines for GL <-> D3D values */ -GLenum StencilOp(DWORD op); -GLenum CompareFunc(DWORD func); -BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3); -void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst); -void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, BOOL transformed, DWORD coordtype, BOOL ffp_can_disable_proj); -void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context); -void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context); -void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context); -void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context); -void state_fogcolor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context); -void state_fogdensity(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context); -void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context); -void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context); +GLenum StencilOp(DWORD op) DECLSPEC_HIDDEN; +GLenum CompareFunc(DWORD func) DECLSPEC_HIDDEN; +BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP op, + DWORD arg1, DWORD arg2, DWORD arg3) DECLSPEC_HIDDEN; +void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, + DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst) DECLSPEC_HIDDEN; +void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, + BOOL transformed, DWORD coordtype, BOOL ffp_can_disable_proj) DECLSPEC_HIDDEN; +void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, + struct wined3d_context *context) DECLSPEC_HIDDEN; +void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, + struct wined3d_context *context) DECLSPEC_HIDDEN; +void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, + struct wined3d_context *context) DECLSPEC_HIDDEN; +void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, + struct wined3d_context *context) DECLSPEC_HIDDEN; +void state_fogcolor(DWORD state, IWineD3DStateBlockImpl *stateblock, + struct wined3d_context *context) DECLSPEC_HIDDEN; +void state_fogdensity(DWORD state, IWineD3DStateBlockImpl *stateblock, + struct wined3d_context *context) DECLSPEC_HIDDEN; +void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock, + struct wined3d_context *context) DECLSPEC_HIDDEN; +void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock, + struct wined3d_context *context) DECLSPEC_HIDDEN; -void surface_add_dirty_rect(IWineD3DSurface *iface, const RECT *dirty_rect); -GLenum surface_get_gl_buffer(IWineD3DSurface *iface, IWineD3DSwapChain *swapchain); -void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *context, DWORD location); -void surface_modify_ds_location(IWineD3DSurface *iface, DWORD location); -void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int width, unsigned int height); -void surface_set_texture_name(IWineD3DSurface *iface, GLuint name, BOOL srgb_name); -void surface_set_texture_target(IWineD3DSurface *iface, GLenum target); +void surface_add_dirty_rect(IWineD3DSurface *iface, const RECT *dirty_rect) DECLSPEC_HIDDEN; +GLenum surface_get_gl_buffer(IWineD3DSurface *iface, IWineD3DSwapChain *swapchain) DECLSPEC_HIDDEN; +void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; +void surface_modify_ds_location(IWineD3DSurface *iface, DWORD location) DECLSPEC_HIDDEN; +void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, + unsigned int width, unsigned int height) DECLSPEC_HIDDEN; +void surface_set_texture_name(IWineD3DSurface *iface, GLuint name, BOOL srgb_name) DECLSPEC_HIDDEN; +void surface_set_texture_target(IWineD3DSurface *iface, GLenum target) DECLSPEC_HIDDEN; BOOL getColorBits(const struct GlPixelFormatDesc *format_desc, - short *redSize, short *greenSize, short *blueSize, short *alphaSize, short *totalSize); -BOOL getDepthStencilBits(const struct GlPixelFormatDesc *format_desc, short *depthSize, short *stencilSize); + short *redSize, short *greenSize, short *blueSize, short *alphaSize, short *totalSize) DECLSPEC_HIDDEN; +BOOL getDepthStencilBits(const struct GlPixelFormatDesc *format_desc, + short *depthSize, short *stencilSize) DECLSPEC_HIDDEN; /* Math utils */ -void multiply_matrix(WINED3DMATRIX *dest, const WINED3DMATRIX *src1, const WINED3DMATRIX *src2); -UINT wined3d_log2i(UINT32 x); -unsigned int count_bits(unsigned int mask); +void multiply_matrix(WINED3DMATRIX *dest, const WINED3DMATRIX *src1, const WINED3DMATRIX *src2) DECLSPEC_HIDDEN; +UINT wined3d_log2i(UINT32 x) DECLSPEC_HIDDEN; +unsigned int count_bits(unsigned int mask) DECLSPEC_HIDDEN; typedef struct local_constant { struct list entry; @@ -2589,16 +2622,14 @@ typedef struct SHADER_PARSE_STATE { #endif /* Base Shader utility functions. */ -int shader_addline(struct wined3d_shader_buffer *buffer, const char *fmt, ...) PRINTF_ATTR(2,3); -int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *fmt, va_list args); +int shader_addline(struct wined3d_shader_buffer *buffer, const char *fmt, ...) PRINTF_ATTR(2,3) DECLSPEC_HIDDEN; +int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *fmt, va_list args) DECLSPEC_HIDDEN; /* Vertex shader utility functions */ -extern BOOL vshader_get_input( - IWineD3DVertexShader* iface, - BYTE usage_req, BYTE usage_idx_req, - unsigned int* regnum); +extern BOOL vshader_get_input(IWineD3DVertexShader *iface, + BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum) DECLSPEC_HIDDEN; -extern HRESULT allocate_shader_constants(IWineD3DStateBlockImpl* object); +extern HRESULT allocate_shader_constants(IWineD3DStateBlockImpl* object) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DBaseShader implementation structure @@ -2614,6 +2645,10 @@ typedef struct IWineD3DBaseShaderClass BOOL load_local_constsF; const struct wined3d_shader_frontend *frontend; void *frontend_data; + void *backend_data; + + IUnknown *parent; + const struct wined3d_parent_ops *parent_ops; /* Programs this shader is linked with */ struct list linked_programs; @@ -2638,25 +2673,27 @@ typedef struct IWineD3DBaseShaderImpl { IWineD3DBaseShaderClass baseShader; } IWineD3DBaseShaderImpl; -void shader_buffer_clear(struct wined3d_shader_buffer *buffer); -BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer); -void shader_buffer_free(struct wined3d_shader_buffer *buffer); -void shader_cleanup(IWineD3DBaseShader *iface); +void shader_buffer_clear(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN; +BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN; +void shader_buffer_free(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN; +void shader_cleanup(IWineD3DBaseShader *iface) DECLSPEC_HIDDEN; void shader_dump_src_param(const struct wined3d_shader_src_param *param, - const struct wined3d_shader_version *shader_version); + const struct wined3d_shader_version *shader_version) DECLSPEC_HIDDEN; void shader_dump_dst_param(const struct wined3d_shader_dst_param *param, - const struct wined3d_shader_version *shader_version); -unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max); + const struct wined3d_shader_version *shader_version) DECLSPEC_HIDDEN; +unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max) DECLSPEC_HIDDEN; void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer, - const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx); + const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx) DECLSPEC_HIDDEN; HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe, struct shader_reg_maps *reg_maps, struct wined3d_shader_attribute *attributes, struct wined3d_shader_signature_element *input_signature, - struct wined3d_shader_signature_element *output_signature, const DWORD *byte_code, DWORD constf_size); -void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDevice *device); -BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage); -const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token); -void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *pFunction); + struct wined3d_shader_signature_element *output_signature, + const DWORD *byte_code, DWORD constf_size) DECLSPEC_HIDDEN; +void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; +BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage) DECLSPEC_HIDDEN; +const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token) DECLSPEC_HIDDEN; +void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *pFunction) DECLSPEC_HIDDEN; static inline BOOL shader_is_pshader_version(enum wined3d_shader_type type) { @@ -2730,26 +2767,19 @@ typedef struct IWineD3DVertexShaderImpl { /* IWineD3DBaseShader */ IWineD3DBaseShaderClass baseShader; - /* IWineD3DVertexShaderImpl */ - IUnknown *parent; - - DWORD usage; - - /* The GL shader */ - void *backend_priv; - /* Vertex shader input and output semantics */ struct wined3d_shader_attribute attributes[MAX_ATTRIBS]; struct wined3d_shader_signature_element output_signature[MAX_REG_OUTPUT]; UINT min_rel_offset, max_rel_offset; UINT rel_offset; - - UINT recompile_count; } IWineD3DVertexShaderImpl; -extern const IWineD3DVertexShaderVtbl IWineD3DVertexShader_Vtbl; -void find_vs_compile_args(IWineD3DVertexShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, struct vs_compile_args *args); +void find_vs_compile_args(IWineD3DVertexShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, + struct vs_compile_args *args) DECLSPEC_HIDDEN; +HRESULT vertexshader_init(IWineD3DVertexShaderImpl *shader, IWineD3DDeviceImpl *device, + const DWORD *byte_code, const struct wined3d_shader_signature *output_signature, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DPixelShader implementation structure @@ -2779,18 +2809,12 @@ typedef struct IWineD3DPixelShaderImpl { /* IWineD3DBaseShader */ IWineD3DBaseShaderClass baseShader; - /* IWineD3DPixelShaderImpl */ - IUnknown *parent; - /* Pixel shader input semantics */ struct wined3d_shader_signature_element input_signature[MAX_REG_INPUT]; DWORD input_reg_map[MAX_REG_INPUT]; BOOL input_reg_used[MAX_REG_INPUT]; unsigned int declared_in_count; - /* The GL shader */ - void *backend_priv; - /* Some information about the shader behavior */ char vpos_uniform; @@ -2799,9 +2823,13 @@ typedef struct IWineD3DPixelShaderImpl { } IWineD3DPixelShaderImpl; -extern const IWineD3DPixelShaderVtbl IWineD3DPixelShader_Vtbl; -void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, IWineD3DBaseTexture * const *textures); -void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, struct ps_compile_args *args); +HRESULT pixelshader_init(IWineD3DPixelShaderImpl *shader, IWineD3DDeviceImpl *device, + const DWORD *byte_code, const struct wined3d_shader_signature *output_signature, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; +void pixelshader_update_samplers(struct shader_reg_maps *reg_maps, + IWineD3DBaseTexture * const *textures) DECLSPEC_HIDDEN; +void find_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, + struct ps_compile_args *args) DECLSPEC_HIDDEN; /* sRGB correction constants */ static const float srgb_cmp = 0.0031308f; @@ -2831,11 +2859,11 @@ struct IWineD3DPaletteImpl { DWORD Flags; }; -extern const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl; -DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags); +extern const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl DECLSPEC_HIDDEN; +DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags) DECLSPEC_HIDDEN; /* DirectDraw utility functions */ -extern WINED3DFORMAT pixelformat_for_depth(DWORD depth); +extern WINED3DFORMAT pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN; /***************************************************************************** * Pixel format management @@ -2850,6 +2878,7 @@ extern WINED3DFORMAT pixelformat_for_depth(DWORD depth); #define WINED3DFMT_FLAG_FOURCC 0x20 #define WINED3DFMT_FLAG_FBO_ATTACHABLE 0x40 #define WINED3DFMT_FLAG_COMPRESSED 0x80 +#define WINED3DFMT_FLAG_GETDC 0x100 struct GlPixelFormatDesc { @@ -2883,7 +2912,8 @@ struct GlPixelFormatDesc struct color_fixup_desc color_fixup; }; -const struct GlPixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt, const struct wined3d_gl_info *gl_info); +const struct GlPixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt, + const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; static inline BOOL use_vs(IWineD3DStateBlockImpl *stateblock) { @@ -2902,8 +2932,9 @@ static inline BOOL use_ps(IWineD3DStateBlockImpl *stateblock) && stateblock->wineD3DDevice->ps_selected_mode != SHADER_NONE); } -void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED3DRECT *src_rect, - IWineD3DSurface *dst_surface, WINED3DRECT *dst_rect, const WINED3DTEXTUREFILTERTYPE filter, BOOL flip); +void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, + WINED3DRECT *src_rect, IWineD3DSurface *dst_surface, WINED3DRECT *dst_rect, + const WINED3DTEXTUREFILTERTYPE filter, BOOL flip) DECLSPEC_HIDDEN; /* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */ #define WINED3D_OPENGL_WINDOW_CLASS_NAME "WineD3D_OpenGL" diff --git a/reactos/include/reactos/wine/wined3d.idl b/reactos/include/reactos/wine/wined3d.idl index ec204332fa1..049ac90b0e8 100644 --- a/reactos/include/reactos/wine/wined3d.idl +++ b/reactos/include/reactos/wine/wined3d.idl @@ -132,39 +132,33 @@ typedef enum _WINED3DDEGREETYPE typedef enum _WINED3DFORMAT { WINED3DFMT_UNKNOWN, - WINED3DFMT_R8G8B8, - WINED3DFMT_A8R8G8B8, - WINED3DFMT_X8R8G8B8, - WINED3DFMT_R5G6B5, - WINED3DFMT_X1R5G5B5, - WINED3DFMT_A1R5G5B5, - WINED3DFMT_A4R4G4B4, - WINED3DFMT_R3G3B2, - WINED3DFMT_A8R3G3B2, - WINED3DFMT_X4R4G4B4, - WINED3DFMT_X8B8G8R8, - WINED3DFMT_A2R10G10B10, - WINED3DFMT_A8P8, - WINED3DFMT_P8, - WINED3DFMT_L8, - WINED3DFMT_A8L8, - WINED3DFMT_A4L4, - WINED3DFMT_L6V5U5, - WINED3DFMT_X8L8V8U8, - WINED3DFMT_W11V11U10, - WINED3DFMT_A2W10V10U10, + WINED3DFMT_B8G8R8_UNORM, + WINED3DFMT_B5G5R5X1_UNORM, + WINED3DFMT_B4G4R4A4_UNORM, + WINED3DFMT_B2G3R3_UNORM, + WINED3DFMT_B2G3R3A8_UNORM, + WINED3DFMT_B4G4R4X4_UNORM, + WINED3DFMT_R8G8B8X8_UNORM, + WINED3DFMT_B10G10R10A2_UNORM, + WINED3DFMT_P8_UINT_A8_UNORM, + WINED3DFMT_P8_UINT, + WINED3DFMT_L8_UNORM, + WINED3DFMT_L8A8_UNORM, + WINED3DFMT_L4A4_UNORM, + WINED3DFMT_R5G5_SNORM_L6_UNORM, + WINED3DFMT_R8G8_SNORM_L8X8_UNORM, + WINED3DFMT_R10G11B11_SNORM, + WINED3DFMT_R10G10B10_SNORM_A2_UNORM, WINED3DFMT_D16_LOCKABLE, - WINED3DFMT_D32, - WINED3DFMT_D15S1, - WINED3DFMT_D24S8, - WINED3DFMT_D24X8, - WINED3DFMT_D24X4S4, - WINED3DFMT_L16, - WINED3DFMT_D32F_LOCKABLE, - WINED3DFMT_D24FS8, + WINED3DFMT_D32_UNORM, + WINED3DFMT_S1_UINT_D15_UNORM, + WINED3DFMT_S8_UINT_D24_UNORM, + WINED3DFMT_X8D24_UNORM, + WINED3DFMT_S4X4_UINT_D24_UNORM, + WINED3DFMT_L16_UNORM, + WINED3DFMT_S8_UINT_D24_FLOAT, WINED3DFMT_VERTEXDATA, - WINED3DFMT_CxV8U8, - /* DXGI formats */ + WINED3DFMT_R8G8_SNORM_Cx, WINED3DFMT_R32G32B32A32_TYPELESS, WINED3DFMT_R32G32B32A32_FLOAT, WINED3DFMT_R32G32B32A32_UINT, @@ -2143,6 +2137,11 @@ struct wined3d_shader_signature char *string_data; }; +struct wined3d_parent_ops +{ + void (*wined3d_object_destroyed)(void *parent); +}; + interface IWineD3DResource; interface IWineD3DSurface; interface IWineD3DVolume; @@ -2210,8 +2209,6 @@ interface IWineD3DDeviceParent : IUnknown [out] IWineD3DSwapChain **swapchain ); } -typedef ULONG (*D3DCB_DESTROYSURFACEFN)(IWineD3DSurface *pSurface); -typedef ULONG (*D3DCB_DESTROYVOLUMEFN)(IWineD3DVolume *pVolume); typedef ULONG (*D3DCB_DESTROYSWAPCHAINFN)(IWineD3DSwapChain *pSwapChain); typedef HRESULT (*D3DCB_ENUMRESOURCES)(IWineD3DResource *resource, void *pData); @@ -2618,9 +2615,6 @@ interface IWineD3DBaseTexture : IWineD3DResource ] interface IWineD3DTexture : IWineD3DBaseTexture { - void Destroy( - [in] D3DCB_DESTROYSURFACEFN destroy_surface_callback - ); HRESULT GetLevelDesc( [in] UINT level, [out] WINED3DSURFACE_DESC *desc @@ -2650,9 +2644,6 @@ interface IWineD3DTexture : IWineD3DBaseTexture ] interface IWineD3DCubeTexture : IWineD3DBaseTexture { - void Destroy( - [in] D3DCB_DESTROYSURFACEFN destroy_surface_callback - ); HRESULT GetLevelDesc( [in] UINT level, [out] WINED3DSURFACE_DESC *desc @@ -2686,9 +2677,6 @@ interface IWineD3DCubeTexture : IWineD3DBaseTexture ] interface IWineD3DVolumeTexture : IWineD3DBaseTexture { - void Destroy( - [in] D3DCB_DESTROYVOLUMEFN destroy_volume_callback - ); HRESULT GetLevelDesc( [in] UINT level, [out] WINED3DVOLUME_DESC *desc @@ -2773,7 +2761,6 @@ interface IWineD3DQuery : IWineD3DBase interface IWineD3DSwapChain : IWineD3DBase { void Destroy( - [in] D3DCB_DESTROYSURFACEFN destroy_surface_callback ); HRESULT GetDevice( [out] IWineD3DDevice **device @@ -2841,9 +2828,12 @@ interface IWineD3DBuffer : IWineD3DResource ] interface IWineD3DBaseShader : IWineD3DBase { - HRESULT SetFunction( - [in] const DWORD *function, - [in] const struct wined3d_shader_signature *output_signature + HRESULT GetDevice( + [out] IWineD3DDevice **device + ); + HRESULT GetFunction( + [out] void *data, + [in, out] UINT *data_size ); } @@ -2854,13 +2844,6 @@ interface IWineD3DBaseShader : IWineD3DBase ] interface IWineD3DVertexShader : IWineD3DBaseShader { - HRESULT GetDevice( - [out] IWineD3DDevice **device - ); - HRESULT GetFunction( - [out] void *data, - [in, out] UINT *data_size - ); HRESULT SetLocalConstantsF( [in] UINT start_idx, [in] const float *src_data, @@ -2875,13 +2858,6 @@ interface IWineD3DVertexShader : IWineD3DBaseShader ] interface IWineD3DPixelShader : IWineD3DBaseShader { - HRESULT GetDevice( - [out] IWineD3DDevice **device - ); - HRESULT GetFunction( - [out] void *data, - [in, out] UINT *data_size - ); } [ @@ -2895,6 +2871,7 @@ interface IWineD3DDevice : IWineD3DBase [in] struct wined3d_buffer_desc *desc, [in] const void *data, [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops, [out] IWineD3DBuffer **buffer ); HRESULT CreateVertexBuffer( @@ -2903,14 +2880,16 @@ interface IWineD3DDevice : IWineD3DBase [in] DWORD fvf, [in] WINED3DPOOL pool, [out] IWineD3DBuffer **vertex_buffer, - [in] IUnknown *parent + [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops ); HRESULT CreateIndexBuffer( [in] UINT length, [in] DWORD usage, [in] WINED3DPOOL pool, [out] IWineD3DBuffer **index_buffer, - [in] IUnknown *parent + [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops ); HRESULT CreateStateBlock( [in] WINED3DSTATEBLOCKTYPE type, @@ -2930,7 +2909,8 @@ interface IWineD3DDevice : IWineD3DBase [in] WINED3DMULTISAMPLE_TYPE multisample_type, [in] DWORD multisample_quality, [in] WINED3DSURFTYPE surface_type, - [in] IUnknown *parent + [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops ); HRESULT CreateRendertargetView( [in] IWineD3DResource *resource, @@ -2945,7 +2925,8 @@ interface IWineD3DDevice : IWineD3DBase [in] WINED3DFORMAT format, [in] WINED3DPOOL pool, [out] IWineD3DTexture **texture, - [in] IUnknown *parent + [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops ); HRESULT CreateVolumeTexture( [in] UINT width, @@ -2956,7 +2937,8 @@ interface IWineD3DDevice : IWineD3DBase [in] WINED3DFORMAT format, [in] WINED3DPOOL pool, [out] IWineD3DVolumeTexture **texture, - [in] IUnknown *parent + [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops ); HRESULT CreateVolume( [in] UINT width, @@ -2966,7 +2948,8 @@ interface IWineD3DDevice : IWineD3DBase [in] WINED3DFORMAT format, [in] WINED3DPOOL pool, [out] IWineD3DVolume **volume, - [in] IUnknown *parent + [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops ); HRESULT CreateCubeTexture( [in] UINT edge_length, @@ -2975,7 +2958,8 @@ interface IWineD3DDevice : IWineD3DBase [in] WINED3DFORMAT format, [in] WINED3DPOOL pool, [out] IWineD3DCubeTexture **texture, - [in] IUnknown *parent + [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops ); HRESULT CreateQuery( [in] WINED3DQUERYTYPE type, @@ -2991,25 +2975,29 @@ interface IWineD3DDevice : IWineD3DBase HRESULT CreateVertexDeclaration( [out] IWineD3DVertexDeclaration **declaration, [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops, [in] const WINED3DVERTEXELEMENT *elements, [in] UINT element_count ); HRESULT CreateVertexDeclarationFromFVF( [out] IWineD3DVertexDeclaration **declaration, [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops, [in] DWORD fvf ); HRESULT CreateVertexShader( [in] const DWORD *function, [in] const struct wined3d_shader_signature *output_signature, [out] IWineD3DVertexShader **shader, - [in] IUnknown *parent + [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops ); HRESULT CreatePixelShader( [in] const DWORD *function, [in] const struct wined3d_shader_signature *output_signature, [out] IWineD3DPixelShader **shader, - [in] IUnknown *parent + [in] IUnknown *parent, + [in] const struct wined3d_parent_ops *parent_ops ); HRESULT CreatePalette( [in] DWORD flags, @@ -3024,7 +3012,6 @@ interface IWineD3DDevice : IWineD3DBase [in] WINED3DPRESENT_PARAMETERS *present_parameters ); HRESULT Uninit3D( - [in] D3DCB_DESTROYSURFACEFN destroy_surface_callback, [in] D3DCB_DESTROYSWAPCHAINFN destroy_swapchain_callback ); HRESULT UninitGDI( @@ -3125,11 +3112,11 @@ interface IWineD3DDevice : IWineD3DBase [in] UINT swapchain_idx, [out] WINED3DGAMMARAMP *ramp ); - HRESULT SetIndices( + HRESULT SetIndexBuffer( [in] IWineD3DBuffer *index_buffer, [in] WINED3DFORMAT format ); - HRESULT GetIndices( + HRESULT GetIndexBuffer( [out] IWineD3DBuffer **index_buffer ); HRESULT SetBaseVertexIndex( @@ -3398,8 +3385,6 @@ interface IWineD3DDevice : IWineD3DBase [in] UINT vertex_count ); HRESULT DrawIndexedPrimitive( - [in] UINT min_vertex_idx, - [in] UINT vertex_count, [in] UINT start_idx, [in] UINT index_count ); @@ -3409,8 +3394,6 @@ interface IWineD3DDevice : IWineD3DBase [in] UINT stream_stride ); HRESULT DrawIndexedPrimitiveUP( - [in] UINT min_vertex_idx, - [in] UINT vertex_count, [in] UINT index_count, [in] const void *index_data, [in] WINED3DFORMAT index_data_format,