crypt32: Fixed day/month mismatch in time encoding routines.
[wine] / dlls / d3d8 / device.c
1 /*
2  * IDirect3DDevice8 implementation
3  *
4  * Copyright 2002-2004 Jason Edmeades
5  * Copyright 2004 Christian Costa
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #include "config.h"
23
24 #include <math.h>
25 #include <stdarg.h>
26
27 #define NONAMELESSUNION
28 #define NONAMELESSSTRUCT
29 #include "windef.h"
30 #include "winbase.h"
31 #include "winuser.h"
32 #include "wingdi.h"
33 #include "wine/debug.h"
34
35 #include "d3d8_private.h"
36
37 WINE_DEFAULT_DEBUG_CHANNEL(d3d8);
38
39 /* IDirect3D IUnknown parts follow: */
40 HRESULT WINAPI IDirect3DDevice8Impl_QueryInterface(LPDIRECT3DDEVICE8 iface,REFIID riid,LPVOID *ppobj)
41 {
42     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
43
44     if (IsEqualGUID(riid, &IID_IUnknown)
45         || IsEqualGUID(riid, &IID_IDirect3DDevice8)) {
46         IUnknown_AddRef(iface);
47         *ppobj = This;
48         return D3D_OK;
49     }
50
51     WARN("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppobj);
52     return E_NOINTERFACE;
53 }
54
55 ULONG WINAPI IDirect3DDevice8Impl_AddRef(LPDIRECT3DDEVICE8 iface) {
56     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
57     ULONG ref = InterlockedIncrement(&This->ref);
58
59     TRACE("(%p) : AddRef from %ld\n", This, ref - 1);
60
61     return ref;
62 }
63
64 ULONG WINAPI IDirect3DDevice8Impl_Release(LPDIRECT3DDEVICE8 iface) {
65     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
66     ULONG ref = InterlockedDecrement(&This->ref);
67
68     TRACE("(%p) : ReleaseRef to %ld\n", This, ref);
69
70     if (ref == 0) {
71         TRACE("Releasing wined3d device %p\n", This->WineD3DDevice);
72         /* Activate this when it's implemented in wined3d(d3d7 merge)
73         IWineD3DDevice_Uninit3D(This->WineD3DDevice);
74         */
75         IWineD3DDevice_Release(This->WineD3DDevice);
76         HeapFree(GetProcessHeap(), 0, This);
77     }
78     return ref;
79 }
80
81 /* IDirect3DDevice Interface follow: */
82 HRESULT WINAPI IDirect3DDevice8Impl_TestCooperativeLevel(LPDIRECT3DDEVICE8 iface) {
83     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
84
85     TRACE("(%p) : Relay\n", This);
86     return IWineD3DDevice_TestCooperativeLevel(This->WineD3DDevice);
87 }
88
89 UINT WINAPI  IDirect3DDevice8Impl_GetAvailableTextureMem(LPDIRECT3DDEVICE8 iface) {
90     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
91
92     TRACE("(%p) Relay\n", This);
93     return IWineD3DDevice_GetAvailableTextureMem(This->WineD3DDevice);
94 }
95
96 HRESULT WINAPI IDirect3DDevice8Impl_ResourceManagerDiscardBytes(LPDIRECT3DDEVICE8 iface, DWORD Bytes) {
97     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
98
99     TRACE("(%p) : Relay bytes(%ld)\n", This, Bytes);
100     return IWineD3DDevice_EvictManagedResources(This->WineD3DDevice);
101 }
102
103 HRESULT WINAPI IDirect3DDevice8Impl_GetDirect3D(LPDIRECT3DDEVICE8 iface, IDirect3D8** ppD3D8) {
104     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
105     HRESULT hr = D3D_OK;
106     IWineD3D* pWineD3D;
107
108     TRACE("(%p) Relay\n", This);
109
110     if (NULL == ppD3D8) {
111         return D3DERR_INVALIDCALL;
112     }
113     hr = IWineD3DDevice_GetDirect3D(This->WineD3DDevice, &pWineD3D);
114     if (hr == D3D_OK && pWineD3D != NULL)
115     {
116         IWineD3DResource_GetParent((IWineD3DResource *)pWineD3D,(IUnknown **)ppD3D8);
117         IWineD3DResource_Release((IWineD3DResource *)pWineD3D);
118     } else {
119         FIXME("Call to IWineD3DDevice_GetDirect3D failed\n");
120         *ppD3D8 = NULL;
121     }
122     TRACE("(%p) returning %p\b",This , *ppD3D8);
123     return hr;
124 }
125
126 HRESULT WINAPI IDirect3DDevice8Impl_GetDeviceCaps(LPDIRECT3DDEVICE8 iface, D3DCAPS8* pCaps) {
127     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
128     HRESULT hrc = D3D_OK;
129     WINED3DCAPS *pWineCaps;
130
131     TRACE("(%p) : Relay pCaps %p\n", This, pCaps);
132     if(NULL == pCaps){
133         return D3DERR_INVALIDCALL;
134     }
135     pWineCaps = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINED3DCAPS));
136     if(pWineCaps == NULL){
137         return D3DERR_INVALIDCALL; /* well this is what MSDN says to return */
138     }
139
140     D3D8CAPSTOWINECAPS(pCaps, pWineCaps)
141     hrc = IWineD3DDevice_GetDeviceCaps(This->WineD3DDevice, pWineCaps);
142     HeapFree(GetProcessHeap(), 0, pWineCaps);
143     TRACE("Returning %p %p\n", This, pCaps);
144     return hrc;
145 }
146
147 HRESULT WINAPI IDirect3DDevice8Impl_GetDisplayMode(LPDIRECT3DDEVICE8 iface, D3DDISPLAYMODE* pMode) {
148     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
149     TRACE("(%p) Relay\n", This);
150     return IWineD3DDevice_GetDisplayMode(This->WineD3DDevice, 0, (WINED3DDISPLAYMODE *) pMode);
151 }
152
153 HRESULT WINAPI IDirect3DDevice8Impl_GetCreationParameters(LPDIRECT3DDEVICE8 iface, D3DDEVICE_CREATION_PARAMETERS *pParameters) {
154     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
155     TRACE("(%p) Relay\n", This);
156     return IWineD3DDevice_GetCreationParameters(This->WineD3DDevice, (WINED3DDEVICE_CREATION_PARAMETERS *) pParameters);
157 }
158
159 HRESULT WINAPI IDirect3DDevice8Impl_SetCursorProperties(LPDIRECT3DDEVICE8 iface, UINT XHotSpot, UINT YHotSpot, IDirect3DSurface8* pCursorBitmap) {
160     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
161     IDirect3DSurface8Impl *pSurface = (IDirect3DSurface8Impl*)pCursorBitmap;
162     TRACE("(%p) Relay\n", This);
163     return IWineD3DDevice_SetCursorProperties(This->WineD3DDevice,XHotSpot,YHotSpot,(IWineD3DSurface*)pSurface->wineD3DSurface);
164 }
165
166 void WINAPI IDirect3DDevice8Impl_SetCursorPosition(LPDIRECT3DDEVICE8 iface, UINT XScreenSpace, UINT YScreenSpace, DWORD Flags) {
167     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
168     TRACE("(%p) Relay\n", This);
169     return IWineD3DDevice_SetCursorPosition(This->WineD3DDevice, XScreenSpace, YScreenSpace, Flags);
170 }
171
172 BOOL WINAPI IDirect3DDevice8Impl_ShowCursor(LPDIRECT3DDEVICE8 iface, BOOL bShow) {
173     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
174     TRACE("(%p) Relay\n", This);
175
176     return IWineD3DDevice_ShowCursor(This->WineD3DDevice, bShow);
177 }
178
179 HRESULT WINAPI IDirect3DDevice8Impl_CreateAdditionalSwapChain(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain8** pSwapChain) {
180     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
181     IDirect3DSwapChain8Impl* object;
182     HRESULT hrc = D3D_OK;
183     WINED3DPRESENT_PARAMETERS localParameters;
184
185     TRACE("(%p) Relay\n", This);
186
187     object = HeapAlloc(GetProcessHeap(),  HEAP_ZERO_MEMORY, sizeof(*object));
188     if (NULL == object) {
189         FIXME("Allocation of memory failed\n");
190         *pSwapChain = NULL;
191         return D3DERR_OUTOFVIDEOMEMORY;
192     }
193     object->ref = 1;
194     object->lpVtbl = &Direct3DSwapChain8_Vtbl;
195
196     /* Allocate an associated WineD3DDevice object */
197     localParameters.BackBufferWidth                = &pPresentationParameters->BackBufferWidth;
198     localParameters.BackBufferHeight               = &pPresentationParameters->BackBufferHeight;
199     localParameters.BackBufferFormat               = (WINED3DFORMAT *)&pPresentationParameters->BackBufferFormat;
200     localParameters.BackBufferCount                = &pPresentationParameters->BackBufferCount;
201     localParameters.MultiSampleType                = (WINED3DMULTISAMPLE_TYPE *) &pPresentationParameters->MultiSampleType;
202     localParameters.MultiSampleQuality             = NULL; /* d3d9 only */
203     localParameters.SwapEffect                     = (WINED3DSWAPEFFECT *) &pPresentationParameters->SwapEffect;
204     localParameters.hDeviceWindow                  = &pPresentationParameters->hDeviceWindow;
205     localParameters.Windowed                       = &pPresentationParameters->Windowed;
206     localParameters.EnableAutoDepthStencil         = &pPresentationParameters->EnableAutoDepthStencil;
207     localParameters.AutoDepthStencilFormat         = (WINED3DFORMAT *)&pPresentationParameters->AutoDepthStencilFormat;
208     localParameters.Flags                          = &pPresentationParameters->Flags;
209     localParameters.FullScreen_RefreshRateInHz     = &pPresentationParameters->FullScreen_RefreshRateInHz;
210     localParameters.PresentationInterval           = &pPresentationParameters->FullScreen_PresentationInterval;
211
212
213     hrc = IWineD3DDevice_CreateAdditionalSwapChain(This->WineD3DDevice, &localParameters, &object->wineD3DSwapChain, (IUnknown*)object, D3D8CB_CreateRenderTarget, D3D8CB_CreateDepthStencilSurface);
214     if (hrc != D3D_OK) {
215         FIXME("(%p) call to IWineD3DDevice_CreateAdditionalSwapChain failed\n", This);
216         HeapFree(GetProcessHeap(), 0 , object);
217         *pSwapChain = NULL;
218     }else{
219         *pSwapChain = (IDirect3DSwapChain8 *)object;
220     }
221     TRACE("(%p) returning %p\n", This, *pSwapChain);
222     return hrc;
223 }
224
225 HRESULT WINAPI IDirect3DDevice8Impl_Reset(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
226     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
227     WINED3DPRESENT_PARAMETERS localParameters;
228     TRACE("(%p) Relay pPresentationParameters(%p)\n", This, pPresentationParameters);
229 /* FINDME: FIXME: */
230     localParameters.BackBufferWidth                = &pPresentationParameters->BackBufferWidth;
231     localParameters.BackBufferHeight               = &pPresentationParameters->BackBufferHeight;
232     localParameters.BackBufferFormat               = (WINED3DFORMAT *)&pPresentationParameters->BackBufferFormat;
233     localParameters.BackBufferCount                = &pPresentationParameters->BackBufferCount;
234     localParameters.MultiSampleType                = (WINED3DMULTISAMPLE_TYPE *) &pPresentationParameters->MultiSampleType;
235     localParameters.MultiSampleQuality             = NULL; /* D3d9 only */
236     localParameters.SwapEffect                     = (WINED3DSWAPEFFECT *) &pPresentationParameters->SwapEffect;
237     localParameters.hDeviceWindow                  = &pPresentationParameters->hDeviceWindow;
238     localParameters.Windowed                       = &pPresentationParameters->Windowed;
239     localParameters.EnableAutoDepthStencil         = &pPresentationParameters->EnableAutoDepthStencil;
240     localParameters.AutoDepthStencilFormat         = (WINED3DFORMAT *)&pPresentationParameters->AutoDepthStencilFormat;
241     localParameters.Flags                          = &pPresentationParameters->Flags;
242     localParameters.FullScreen_RefreshRateInHz     = &pPresentationParameters->FullScreen_RefreshRateInHz;
243     localParameters.PresentationInterval           = &pPresentationParameters->FullScreen_PresentationInterval;
244     return IWineD3DDevice_Reset(This->WineD3DDevice, &localParameters);
245 }
246
247 HRESULT WINAPI IDirect3DDevice8Impl_Present(LPDIRECT3DDEVICE8 iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) {
248     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
249     TRACE("(%p) Relay\n", This);
250     return IWineD3DDevice_Present(This->WineD3DDevice, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
251 }
252
253 HRESULT WINAPI IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8** ppBackBuffer) {
254     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
255     IWineD3DSurface *retSurface = NULL;
256     HRESULT rc = D3D_OK;
257
258     TRACE("(%p) Relay\n", This);
259
260     rc = IWineD3DDevice_GetBackBuffer(This->WineD3DDevice, 0, BackBuffer, (WINED3DBACKBUFFER_TYPE) Type, (IWineD3DSurface **)&retSurface);
261     if (rc == D3D_OK && NULL != retSurface && NULL != ppBackBuffer) {
262         IWineD3DSurface_GetParent(retSurface, (IUnknown **)ppBackBuffer);
263         IWineD3DSurface_Release(retSurface);
264     }
265     return rc;
266 }
267
268 HRESULT WINAPI IDirect3DDevice8Impl_GetRasterStatus(LPDIRECT3DDEVICE8 iface, D3DRASTER_STATUS* pRasterStatus) {
269     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
270     TRACE("(%p) Relay\n", This);
271
272     return IWineD3DDevice_GetRasterStatus(This->WineD3DDevice, 0, (WINED3DRASTER_STATUS *) pRasterStatus);
273 }
274
275 void WINAPI IDirect3DDevice8Impl_SetGammaRamp(LPDIRECT3DDEVICE8 iface, DWORD Flags, CONST D3DGAMMARAMP* pRamp) {
276     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
277     TRACE("(%p) Relay\n", This);
278
279     return IWineD3DDevice_SetGammaRamp(This->WineD3DDevice, 0, Flags, (WINED3DGAMMARAMP *) pRamp);
280 }
281
282 void WINAPI IDirect3DDevice8Impl_GetGammaRamp(LPDIRECT3DDEVICE8 iface, D3DGAMMARAMP* pRamp) {
283     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
284     TRACE("(%p) Relay\n", This);
285
286     return IWineD3DDevice_GetGammaRamp(This->WineD3DDevice, 0, (WINED3DGAMMARAMP *) pRamp);
287 }
288
289 HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, UINT Levels, DWORD Usage,
290                                                     D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture8 **ppTexture) {
291     IDirect3DTexture8Impl *object;
292     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
293     HRESULT hrc = D3D_OK;
294
295     TRACE("(%p) : W(%d) H(%d), Lvl(%d) d(%ld), Fmt(%u), Pool(%d)\n", This, Width, Height, Levels, Usage, Format,  Pool);
296
297     /* Allocate the storage for the device */
298     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTexture8Impl));
299
300     if (NULL == object) {
301         FIXME("Allocation of memory failed\n");
302 /*        *ppTexture = NULL; */
303         return D3DERR_OUTOFVIDEOMEMORY;
304     }
305
306     object->lpVtbl = &Direct3DTexture8_Vtbl;
307     object->ref = 1;
308     hrc = IWineD3DDevice_CreateTexture(This->WineD3DDevice, Width, Height, Levels, Usage,
309                                  (WINED3DFORMAT)Format, (WINED3DPOOL) Pool, &object->wineD3DTexture, NULL, (IUnknown *)object, D3D8CB_CreateSurface);
310
311     if (FAILED(hrc)) {
312         /* free up object */ 
313         FIXME("(%p) call to IWineD3DDevice_CreateTexture failed\n", This);
314         HeapFree(GetProcessHeap(), 0, object);
315 /*      *ppTexture = NULL; */
316    } else {
317         *ppTexture = (LPDIRECT3DTEXTURE8) object;
318    }
319
320    TRACE("(%p) Created Texture %p, %p\n",This,object,object->wineD3DTexture);
321    return hrc;
322 }
323
324 HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 iface, 
325                                                           UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, 
326                                                           D3DFORMAT Format, D3DPOOL Pool, IDirect3DVolumeTexture8** ppVolumeTexture) {
327
328     IDirect3DVolumeTexture8Impl *object;
329     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
330     HRESULT hrc = D3D_OK;
331
332     TRACE("(%p) Relay\n", This);
333
334     /* Allocate the storage for the device */
335     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVolumeTexture8Impl));
336     if (NULL == object) {
337         FIXME("(%p) allocation of memory failed\n", This);
338         *ppVolumeTexture = NULL;
339         return D3DERR_OUTOFVIDEOMEMORY;
340     }
341
342     object->lpVtbl = &Direct3DVolumeTexture8_Vtbl;
343     object->ref = 1;
344     hrc = IWineD3DDevice_CreateVolumeTexture(This->WineD3DDevice, Width, Height, Depth, Levels, Usage,
345                                  (WINED3DFORMAT)Format, (WINED3DPOOL) Pool, &object->wineD3DVolumeTexture, NULL,
346                                  (IUnknown *)object, D3D8CB_CreateVolume);
347
348     if (hrc != D3D_OK) {
349
350         /* free up object */
351         FIXME("(%p) call to IWineD3DDevice_CreateVolumeTexture failed\n", This);
352         HeapFree(GetProcessHeap(), 0, object);
353         *ppVolumeTexture = NULL;
354     } else {
355         *ppVolumeTexture = (LPDIRECT3DVOLUMETEXTURE8) object;
356     }
357     TRACE("(%p)  returning %p\n", This , *ppVolumeTexture);
358     return hrc;
359 }
360
361 HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface, UINT EdgeLength, UINT Levels, DWORD Usage, 
362                                                         D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture8** ppCubeTexture) {
363
364     IDirect3DCubeTexture8Impl *object;
365     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
366     HRESULT hr = D3D_OK;
367
368     TRACE("(%p) : ELen(%d) Lvl(%d) Usage(%ld) fmt(%u), Pool(%d)\n" , This, EdgeLength, Levels, Usage, Format, Pool);
369
370     /* Allocate the storage for the device */
371     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
372
373     if (NULL == object) {
374         FIXME("(%p) allocation of CubeTexture failed\n", This);
375         *ppCubeTexture = NULL;
376         return D3DERR_OUTOFVIDEOMEMORY;
377     }
378
379     object->lpVtbl = &Direct3DCubeTexture8_Vtbl;
380     object->ref = 1;
381     hr = IWineD3DDevice_CreateCubeTexture(This->WineD3DDevice, EdgeLength, Levels, Usage,
382                                  (WINED3DFORMAT)Format, (WINED3DPOOL) Pool, &object->wineD3DCubeTexture, NULL, (IUnknown*)object,
383                                  D3D8CB_CreateSurface);
384
385     if (hr != D3D_OK){
386
387         /* free up object */
388         FIXME("(%p) call to IWineD3DDevice_CreateCubeTexture failed\n", This);
389         HeapFree(GetProcessHeap(), 0, object);
390         *ppCubeTexture = NULL;
391     } else {
392         *ppCubeTexture = (LPDIRECT3DCUBETEXTURE8) object;
393     }
394
395     TRACE("(%p) returning %p\n",This, *ppCubeTexture);
396     return hr;
397 }
398
399 HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8 iface, UINT Size, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer8** ppVertexBuffer) {
400     IDirect3DVertexBuffer8Impl *object;
401     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
402     HRESULT hrc = D3D_OK;
403
404     TRACE("(%p) Relay\n", This);
405     /* Allocate the storage for the device */
406     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVertexBuffer8Impl));
407     if (NULL == object) {
408         FIXME("Allocation of memory failed\n");
409         *ppVertexBuffer = NULL;
410         return D3DERR_OUTOFVIDEOMEMORY;
411     }
412
413     object->lpVtbl = &Direct3DVertexBuffer8_Vtbl;
414     object->ref = 1;
415     hrc = IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage, FVF, (WINED3DPOOL) Pool, &(object->wineD3DVertexBuffer), NULL, (IUnknown *)object);
416
417     if (D3D_OK != hrc) {
418
419         /* free up object */
420         FIXME("(%p) call to IWineD3DDevice_CreateVertexBuffer failed\n", This);
421         HeapFree(GetProcessHeap(), 0, object);
422         *ppVertexBuffer = NULL;
423     } else {
424         IUnknown_AddRef(iface);
425         object->parentDevice = iface;
426         *ppVertexBuffer = (LPDIRECT3DVERTEXBUFFER8) object;
427     }
428     return hrc;
429 }
430
431 HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 iface, UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer8** ppIndexBuffer) {
432     IDirect3DIndexBuffer8Impl *object;
433     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
434     HRESULT hrc = D3D_OK;
435
436     TRACE("(%p) Relay\n", This);
437     /* Allocate the storage for the device */
438     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
439     if (NULL == object) {
440         FIXME("Allocation of memory failed\n");
441         *ppIndexBuffer = NULL;
442         return D3DERR_OUTOFVIDEOMEMORY;
443     }
444
445     object->lpVtbl = &Direct3DIndexBuffer8_Vtbl;
446     object->ref = 1;
447     TRACE("Calling wined3d create index buffer\n");
448     hrc = IWineD3DDevice_CreateIndexBuffer(This->WineD3DDevice, Length, Usage, Format, (WINED3DPOOL) Pool, &object->wineD3DIndexBuffer, NULL, (IUnknown *)object);
449
450     if (D3D_OK != hrc) {
451
452         /* free up object */
453         FIXME("(%p) call to IWineD3DDevice_CreateIndexBuffer failed\n", This);
454         HeapFree(GetProcessHeap(), 0, object);
455         *ppIndexBuffer = NULL;
456     } else {
457         *ppIndexBuffer = (LPDIRECT3DINDEXBUFFER8)object;
458     }
459     return hrc;
460 }
461
462 HRESULT WINAPI IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface8 **ppSurface,D3DRESOURCETYPE Type, UINT Usage,D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality)  {
463     HRESULT hrc;
464     IDirect3DSurface8Impl *object;
465     IDirect3DDevice8Impl  *This = (IDirect3DDevice8Impl *)iface;
466     TRACE("(%p) Relay\n", This);
467     if(MultisampleQuality < 0) { 
468         FIXME("MultisampleQuality out of range %ld, substituting 0\n", MultisampleQuality);
469         /*FIXME: Find out what windows does with a MultisampleQuality < 0 */
470         MultisampleQuality=0;
471     }
472
473     if(MultisampleQuality > 0){
474         FIXME("MultisampleQuality set to %ld, substituting 0\n" , MultisampleQuality);
475         /*
476         MultisampleQuality
477         [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.
478         */
479         MultisampleQuality=0;
480     }
481     /*FIXME: Check MAX bounds of MultisampleQuality*/
482
483     /* Allocate the storage for the device */
484     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl));
485     if (NULL == object) {
486         FIXME("Allocation of memory failed\n");
487         *ppSurface = NULL;
488         return D3DERR_OUTOFVIDEOMEMORY;
489     }
490
491     object->lpVtbl = &Direct3DSurface8_Vtbl;
492     object->ref = 1;
493
494     TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p\n", This, Width, Height, Format, *ppSurface);
495
496     hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, Format, Lockable, Discard, Level,  &object->wineD3DSurface, Type, Usage, (WINED3DPOOL) Pool,MultiSample,MultisampleQuality, NULL,(IUnknown *)object);
497     if (hrc != D3D_OK || NULL == object->wineD3DSurface) {
498        /* free up object */
499         FIXME("(%p) call to IWineD3DDevice_CreateSurface failed\n", This);
500         HeapFree(GetProcessHeap(), 0, object);
501         *ppSurface = NULL;
502     } else {
503         *ppSurface = (LPDIRECT3DSURFACE8) object;
504     }
505     return hrc;
506 }
507
508 HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface) {
509     TRACE("Relay\n");
510
511     return IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, Lockable, FALSE /* Discard */, 0 /* Level */ , ppSurface, D3DRTYPE_SURFACE, D3DUSAGE_RENDERTARGET, D3DPOOL_DEFAULT, MultiSample, 0);
512 }
513
514 HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, IDirect3DSurface8** ppSurface) {
515     TRACE("Relay\n");
516     /* TODO: Verify that Discard is false */
517     return IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, FALSE, 0 /* Level */
518                                                ,ppSurface, D3DRTYPE_SURFACE, D3DUSAGE_DEPTHSTENCIL,
519                                                 D3DPOOL_DEFAULT, MultiSample, 0);
520 }
521
522 HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, IDirect3DSurface8** ppSurface) {
523     TRACE("Relay\n");
524
525     return IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Loackable */ , FALSE /*Discard*/ , 0 /* Level */ , ppSurface, D3DRTYPE_SURFACE, 0 /* Usage (undefined/none) */ , D3DPOOL_SCRATCH, D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */);
526 }
527
528 HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8 *pSourceSurface, CONST RECT *pSourceRects, UINT cRects, IDirect3DSurface8 *pDestinationSurface, CONST POINT *pDestPoints) {
529     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
530
531     TRACE("(%p) Relay\n" , This);
532
533     return IWineD3DDevice_CopyRects(This->WineD3DDevice, pSourceSurface == NULL ? NULL : ((IDirect3DSurface8Impl *)pSourceSurface)->wineD3DSurface,
534             pSourceRects, cRects, pDestinationSurface == NULL ? NULL : ((IDirect3DSurface8Impl *)pDestinationSurface)->wineD3DSurface, pDestPoints);
535 }
536
537 HRESULT WINAPI IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface, IDirect3DBaseTexture8* pSourceTexture, IDirect3DBaseTexture8* pDestinationTexture) {
538     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
539     TRACE("(%p) Relay\n" , This);
540
541     return IWineD3DDevice_UpdateTexture(This->WineD3DDevice,  ((IDirect3DBaseTexture8Impl *)pSourceTexture)->wineD3DBaseTexture, ((IDirect3DBaseTexture8Impl *)pDestinationTexture)->wineD3DBaseTexture);
542 }
543
544 HRESULT WINAPI IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pDestSurface) {
545     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
546     IDirect3DSurface8Impl *destSurface = (IDirect3DSurface8Impl *)pDestSurface;
547
548     TRACE("(%p) Relay\n" , This);
549
550     if (pDestSurface == NULL) {
551         WARN("(%p) : Caller passed NULL as pDestSurface returning D3DERR_INVALIDCALL\n", This);
552         return D3DERR_INVALIDCALL;
553     }
554
555     return IWineD3DDevice_GetFrontBufferData(This->WineD3DDevice, 0, destSurface->wineD3DSurface);
556 }
557
558 HRESULT WINAPI IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pRenderTarget, IDirect3DSurface8* pNewZStencil) {
559     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
560     IDirect3DSurface8Impl *pSurface = (IDirect3DSurface8Impl *)pRenderTarget;
561     IDirect3DSurface8Impl *pZSurface = (IDirect3DSurface8Impl *)pNewZStencil;
562     TRACE("(%p) Relay\n" , This);
563
564     IWineD3DDevice_SetDepthStencilSurface(This->WineD3DDevice, NULL == pZSurface ? NULL : (IWineD3DSurface *)pZSurface->wineD3DSurface);
565
566     return IWineD3DDevice_SetRenderTarget(This->WineD3DDevice, 0, (IWineD3DSurface *)pSurface->wineD3DSurface);
567 }
568
569 HRESULT  WINAPI  IDirect3DDevice8Impl_GetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppRenderTarget) {
570     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
571     HRESULT hr = D3D_OK;
572     IWineD3DSurface *pRenderTarget;
573
574     TRACE("(%p) Relay\n" , This);
575
576     if (ppRenderTarget == NULL) {
577         return D3DERR_INVALIDCALL;
578     }
579     hr = IWineD3DDevice_GetRenderTarget(This->WineD3DDevice, 0, &pRenderTarget);
580
581     if (hr == D3D_OK && pRenderTarget != NULL) {
582         IWineD3DResource_GetParent((IWineD3DResource *)pRenderTarget,(IUnknown**)ppRenderTarget);
583         IWineD3DResource_Release((IWineD3DResource *)pRenderTarget);
584     } else {
585         FIXME("Call to IWineD3DDevice_GetRenderTarget failed\n");
586         *ppRenderTarget = NULL;
587     }
588
589     return hr;
590 }
591
592 HRESULT  WINAPI  IDirect3DDevice8Impl_GetDepthStencilSurface(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppZStencilSurface) {
593     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
594     HRESULT hr = D3D_OK;
595     IWineD3DSurface *pZStencilSurface;
596
597     TRACE("(%p) Relay\n" , This);
598     if(ppZStencilSurface == NULL){
599         return D3DERR_INVALIDCALL;
600     }
601
602     hr=IWineD3DDevice_GetDepthStencilSurface(This->WineD3DDevice,&pZStencilSurface);
603     if(hr == D3D_OK && pZStencilSurface != NULL){
604         IWineD3DResource_GetParent((IWineD3DResource *)pZStencilSurface,(IUnknown**)ppZStencilSurface);
605         IWineD3DResource_Release((IWineD3DResource *)pZStencilSurface);
606     }else{
607         FIXME("Call to IWineD3DDevice_GetRenderTarget failed\n");
608         *ppZStencilSurface = NULL;
609     }
610
611     return D3D_OK;
612 }
613
614 HRESULT WINAPI IDirect3DDevice8Impl_BeginScene(LPDIRECT3DDEVICE8 iface) {
615     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
616     return IWineD3DDevice_BeginScene(This->WineD3DDevice);
617 }
618
619 HRESULT WINAPI IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) {
620     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
621     TRACE("(%p) Relay\n" , This);
622
623     return IWineD3DDevice_EndScene(This->WineD3DDevice);
624 }
625
626 HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count, CONST D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil) {
627     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
628     TRACE("(%p) Relay\n" , This);
629
630     return IWineD3DDevice_Clear(This->WineD3DDevice, Count, pRects, Flags, Color, Z, Stencil);
631 }
632
633 HRESULT WINAPI IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX* lpMatrix) {
634     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
635     TRACE("(%p) Relay\n" , This);
636
637     return IWineD3DDevice_SetTransform(This->WineD3DDevice, State, lpMatrix);
638 }
639
640 HRESULT WINAPI IDirect3DDevice8Impl_GetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE State,D3DMATRIX* pMatrix) {
641     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
642     TRACE("(%p) Relay\n" , This);
643
644     return IWineD3DDevice_GetTransform(This->WineD3DDevice, State, pMatrix);
645 }
646
647 HRESULT WINAPI IDirect3DDevice8Impl_MultiplyTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX* pMatrix) {
648     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
649     TRACE("(%p) Relay\n" , This);
650
651     return IWineD3DDevice_MultiplyTransform(This->WineD3DDevice, State, pMatrix);
652 }
653
654 HRESULT WINAPI IDirect3DDevice8Impl_SetViewport(LPDIRECT3DDEVICE8 iface, CONST D3DVIEWPORT8* pViewport) {
655     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
656     TRACE("(%p) Relay\n" , This);
657
658     return IWineD3DDevice_SetViewport(This->WineD3DDevice, (const WINED3DVIEWPORT *)pViewport);
659 }
660
661 HRESULT WINAPI IDirect3DDevice8Impl_GetViewport(LPDIRECT3DDEVICE8 iface, D3DVIEWPORT8* pViewport) {
662     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
663     TRACE("(%p) Relay\n" , This);
664
665     return IWineD3DDevice_GetViewport(This->WineD3DDevice, (WINED3DVIEWPORT *)pViewport);
666 }
667
668 HRESULT WINAPI IDirect3DDevice8Impl_SetMaterial(LPDIRECT3DDEVICE8 iface, CONST D3DMATERIAL8* pMaterial) {
669     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
670     TRACE("(%p) Relay\n" , This);
671 /* FIXME: Verify that D3DMATERIAL8 ~= WINED3DMATERIAL */
672     return IWineD3DDevice_SetMaterial(This->WineD3DDevice, (const WINED3DMATERIAL *)pMaterial);
673 }
674
675 HRESULT WINAPI IDirect3DDevice8Impl_GetMaterial(LPDIRECT3DDEVICE8 iface, D3DMATERIAL8* pMaterial) {
676     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
677     TRACE("(%p) Relay\n" , This);
678 /* FIXME: Verify that D3DMATERIAL8 ~= WINED3DMATERIAL */
679     return IWineD3DDevice_GetMaterial(This->WineD3DDevice, (WINED3DMATERIAL *)pMaterial);
680 }
681
682 HRESULT WINAPI IDirect3DDevice8Impl_SetLight(LPDIRECT3DDEVICE8 iface, DWORD Index, CONST D3DLIGHT8* pLight) {
683     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
684     TRACE("(%p) Relay\n" , This);
685 /* FIXME: Verify that D3DLIGHT8 ~= WINED3DLIGHT */
686     return IWineD3DDevice_SetLight(This->WineD3DDevice, Index, (const WINED3DLIGHT *)pLight);
687 }
688
689 HRESULT WINAPI IDirect3DDevice8Impl_GetLight(LPDIRECT3DDEVICE8 iface, DWORD Index,D3DLIGHT8* pLight) {
690     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
691     TRACE("(%p) Relay\n" , This);
692 /* FIXME: Verify that D3DLIGHT8 ~= WINED3DLIGHT */
693     return IWineD3DDevice_GetLight(This->WineD3DDevice, Index, (WINED3DLIGHT *)pLight);
694 }
695
696 HRESULT WINAPI IDirect3DDevice8Impl_LightEnable(LPDIRECT3DDEVICE8 iface, DWORD Index,BOOL Enable) {
697     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
698     TRACE("(%p) Relay\n" , This);
699
700     return IWineD3DDevice_SetLightEnable(This->WineD3DDevice, Index, Enable);
701 }
702
703 HRESULT WINAPI IDirect3DDevice8Impl_GetLightEnable(LPDIRECT3DDEVICE8 iface, DWORD Index,BOOL* pEnable) {
704     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
705     TRACE("(%p) Relay\n" , This);
706
707     return IWineD3DDevice_GetLightEnable(This->WineD3DDevice, Index, pEnable);
708 }
709
710 HRESULT WINAPI IDirect3DDevice8Impl_SetClipPlane(LPDIRECT3DDEVICE8 iface, DWORD Index,CONST float* pPlane) {
711     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
712     TRACE("(%p) Relay\n" , This);
713
714     return IWineD3DDevice_SetClipPlane(This->WineD3DDevice, Index, pPlane);
715 }
716
717 HRESULT WINAPI IDirect3DDevice8Impl_GetClipPlane(LPDIRECT3DDEVICE8 iface, DWORD Index,float* pPlane) {
718     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
719     TRACE("(%p) Relay\n" , This);
720
721     return IWineD3DDevice_GetClipPlane(This->WineD3DDevice, Index, pPlane);
722 }
723
724 HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State,DWORD Value) {
725     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
726     TRACE("(%p) Relay\n" , This);
727
728     return IWineD3DDevice_SetRenderState(This->WineD3DDevice, State, Value);
729 }
730
731 HRESULT WINAPI IDirect3DDevice8Impl_GetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State,DWORD* pValue) {
732     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
733     TRACE("(%p) Relay\n" , This);
734
735     return IWineD3DDevice_GetRenderState(This->WineD3DDevice, State, pValue);
736 }
737
738 HRESULT WINAPI IDirect3DDevice8Impl_BeginStateBlock(LPDIRECT3DDEVICE8 iface) {
739   IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
740
741   TRACE("(%p)\n", This);
742
743   return IWineD3DDevice_BeginStateBlock(This->WineD3DDevice);
744 }
745
746 HRESULT WINAPI IDirect3DDevice8Impl_EndStateBlock(LPDIRECT3DDEVICE8 iface, DWORD* pToken) {
747     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
748     HRESULT hr;
749     IWineD3DStateBlock* wineD3DStateBlock;
750     IDirect3DStateBlock8Impl* object;
751
752     TRACE("(%p) Relay\n", This);
753
754     /* Tell wineD3D to endstatablock before anything else (in case we run out
755      * of memory later and cause locking problems)
756      */
757     hr = IWineD3DDevice_EndStateBlock(This->WineD3DDevice , &wineD3DStateBlock);
758     if (hr != D3D_OK) {
759        FIXME("IWineD3DDevice_EndStateBlock returned an error\n");
760        return hr;
761     }
762
763     /* allocate a new IDirectD3DStateBlock */
764     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY ,sizeof(IDirect3DStateBlock8Impl));
765     object->ref = 1;
766     object->lpVtbl = &Direct3DStateBlock8_Vtbl;
767
768     object->wineD3DStateBlock = wineD3DStateBlock;
769
770     *pToken = (DWORD)object;
771     TRACE("(%p)Returning %p %p\n", This, object, wineD3DStateBlock);
772
773     return hr;
774 }
775
776 HRESULT WINAPI IDirect3DDevice8Impl_ApplyStateBlock(LPDIRECT3DDEVICE8 iface, DWORD Token) {
777     IDirect3DStateBlock8Impl *pSB  = (IDirect3DStateBlock8Impl*) Token;
778     IDirect3DDevice8Impl     *This = (IDirect3DDevice8Impl *)iface;
779
780     TRACE("(%p) %p Relay\n", This, pSB);
781
782     return  IWineD3DStateBlock_Apply(pSB->wineD3DStateBlock);
783 }
784
785 HRESULT WINAPI IDirect3DDevice8Impl_CaptureStateBlock(LPDIRECT3DDEVICE8 iface, DWORD Token) {
786     IDirect3DStateBlock8Impl* pSB = (IDirect3DStateBlock8Impl *)Token;
787     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
788
789     TRACE("(%p) %p Relay\n", This, pSB);
790
791     return IWineD3DStateBlock_Capture(pSB->wineD3DStateBlock);
792 }
793
794 HRESULT WINAPI IDirect3DDevice8Impl_DeleteStateBlock(LPDIRECT3DDEVICE8 iface, DWORD Token) {
795     IDirect3DStateBlock8Impl* pSB = (IDirect3DStateBlock8Impl *)Token;
796     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
797
798     TRACE("(%p) Relay\n", This);
799
800     while(IUnknown_Release((IUnknown *)pSB));
801
802     return D3D_OK;
803 }
804
805 HRESULT WINAPI IDirect3DDevice8Impl_CreateStateBlock(LPDIRECT3DDEVICE8 iface, D3DSTATEBLOCKTYPE Type, DWORD* pToken) {
806    IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
807    IDirect3DStateBlock8Impl *object;
808    HRESULT hrc = D3D_OK;
809
810    TRACE("(%p) Relay\n", This);
811
812    object  = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlock8Impl));
813    if (NULL == object) {
814       FIXME("(%p)  Failed to allocate %d bytes\n", This, sizeof(IDirect3DStateBlock8Impl));
815       *pToken = 0;
816       return E_OUTOFMEMORY;
817    }
818    object->lpVtbl = &Direct3DStateBlock8_Vtbl;
819    object->ref = 1;
820
821    hrc = IWineD3DDevice_CreateStateBlock(This->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)Type, &object->wineD3DStateBlock, (IUnknown *)object);
822    if(D3D_OK != hrc){
823        FIXME("(%p) Call to IWineD3DDevice_CreateStateBlock failed.\n", This);
824        HeapFree(GetProcessHeap(), 0, object);
825        *pToken = 0;
826    } else {
827        *pToken = (DWORD)object;
828    }
829    TRACE("(%p) returning token (ptr to stateblock) of %p\n", This, object);
830
831    return hrc;
832 }
833
834 HRESULT WINAPI IDirect3DDevice8Impl_SetClipStatus(LPDIRECT3DDEVICE8 iface, CONST D3DCLIPSTATUS8* pClipStatus) {
835     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
836     TRACE("(%p) Relay\n" , This);
837 /* FIXME: Verify that D3DCLIPSTATUS8 ~= WINED3DCLIPSTATUS */
838     return IWineD3DDevice_SetClipStatus(This->WineD3DDevice, (const WINED3DCLIPSTATUS *)pClipStatus);
839 }
840
841 HRESULT WINAPI IDirect3DDevice8Impl_GetClipStatus(LPDIRECT3DDEVICE8 iface, D3DCLIPSTATUS8* pClipStatus) {
842     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
843     TRACE("(%p) Relay\n" , This);
844
845     return IWineD3DDevice_GetClipStatus(This->WineD3DDevice, (WINED3DCLIPSTATUS *)pClipStatus);
846 }
847
848 HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage,IDirect3DBaseTexture8** ppTexture) {
849     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
850     IWineD3DBaseTexture *retTexture = NULL;
851     HRESULT rc = D3D_OK;
852
853     TRACE("(%p) Relay\n" , This);
854
855     if(ppTexture == NULL){
856         return D3DERR_INVALIDCALL;
857     }
858
859     rc = IWineD3DDevice_GetTexture(This->WineD3DDevice, Stage, (IWineD3DBaseTexture **)&retTexture);
860     if (rc == D3D_OK && NULL != retTexture) {
861         IWineD3DBaseTexture_GetParent(retTexture, (IUnknown **)ppTexture);
862         IWineD3DBaseTexture_Release(retTexture);
863     } else {
864         FIXME("Call to get texture  (%ld) failed (%p)\n", Stage, retTexture);
865         *ppTexture = NULL;
866     }
867
868     return rc;
869 }
870
871 HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage, IDirect3DBaseTexture8* pTexture) {
872     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
873     TRACE("(%p) Relay %ld %p\n" , This, Stage, pTexture);
874
875     return IWineD3DDevice_SetTexture(This->WineD3DDevice, Stage,
876                                      pTexture==NULL ? NULL : ((IDirect3DBaseTexture8Impl *)pTexture)->wineD3DBaseTexture);
877 }
878
879 HRESULT  WINAPI  IDirect3DDevice8Impl_GetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD* pValue) {
880     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
881     TRACE("(%p) Relay\n" , This);
882
883     switch(Type) {
884     case D3DTSS_ADDRESSU:
885         Type = WINED3DSAMP_ADDRESSU;
886         break;
887     case D3DTSS_ADDRESSV:
888         Type = WINED3DSAMP_ADDRESSV;
889         break;
890     case D3DTSS_ADDRESSW:
891         Type = WINED3DSAMP_ADDRESSW;
892         break;
893     case D3DTSS_BORDERCOLOR:
894         Type = WINED3DSAMP_BORDERCOLOR;
895         break;
896     case D3DTSS_MAGFILTER:
897         Type = WINED3DSAMP_MAGFILTER;
898         break;
899     case D3DTSS_MAXANISOTROPY:
900         Type = WINED3DSAMP_MAXANISOTROPY;
901         break;
902     case D3DTSS_MAXMIPLEVEL:
903         Type = WINED3DSAMP_MAXMIPLEVEL;
904         break;
905     case D3DTSS_MINFILTER:
906         Type = WINED3DSAMP_MINFILTER;
907         break;
908     case D3DTSS_MIPFILTER:
909         Type = WINED3DSAMP_MIPFILTER;
910         break;
911     case D3DTSS_MIPMAPLODBIAS:
912         Type = WINED3DSAMP_MIPMAPLODBIAS;
913         break;
914     default:
915         return IWineD3DDevice_GetTextureStageState(This->WineD3DDevice, Stage, Type, pValue);
916     }
917
918     return IWineD3DDevice_GetSamplerState(This->WineD3DDevice, Stage, Type, pValue);
919 }
920
921 HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) {
922     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
923     TRACE("(%p) Relay\n" , This);
924
925     switch(Type) {
926     case D3DTSS_ADDRESSU:
927         Type = WINED3DSAMP_ADDRESSU;
928         break;
929     case D3DTSS_ADDRESSV:
930         Type = WINED3DSAMP_ADDRESSV;
931         break;
932     case D3DTSS_ADDRESSW:
933         Type = WINED3DSAMP_ADDRESSW;
934         break;
935     case D3DTSS_BORDERCOLOR:
936         Type = WINED3DSAMP_BORDERCOLOR;
937         break;
938     case D3DTSS_MAGFILTER:
939         Type = WINED3DSAMP_MAGFILTER;
940         break;
941     case D3DTSS_MAXANISOTROPY:
942         Type = WINED3DSAMP_MAXANISOTROPY;
943         break;
944     case D3DTSS_MAXMIPLEVEL:
945         Type = WINED3DSAMP_MAXMIPLEVEL;
946         break;
947     case D3DTSS_MINFILTER:
948         Type = WINED3DSAMP_MINFILTER;
949         break;
950     case D3DTSS_MIPFILTER:
951         Type = WINED3DSAMP_MIPFILTER;
952         break;
953     case D3DTSS_MIPMAPLODBIAS:
954         Type = WINED3DSAMP_MIPMAPLODBIAS;
955         break;
956     default:
957         return IWineD3DDevice_SetTextureStageState(This->WineD3DDevice, Stage, Type, Value);
958     }
959
960     return IWineD3DDevice_SetSamplerState(This->WineD3DDevice, Stage, Type, Value);
961 }
962
963 HRESULT WINAPI IDirect3DDevice8Impl_ValidateDevice(LPDIRECT3DDEVICE8 iface, DWORD* pNumPasses) {
964     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
965     TRACE("(%p) Relay\n" , This);
966
967     return IWineD3DDevice_ValidateDevice(This->WineD3DDevice, pNumPasses);
968 }
969
970 HRESULT WINAPI IDirect3DDevice8Impl_GetInfo(LPDIRECT3DDEVICE8 iface, DWORD DevInfoID, void* pDevInfoStruct, DWORD DevInfoStructSize) {
971     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
972     FIXME("(%p) : stub\n", This);
973     return D3D_OK;
974 }
975
976 HRESULT WINAPI IDirect3DDevice8Impl_SetPaletteEntries(LPDIRECT3DDEVICE8 iface, UINT PaletteNumber, CONST PALETTEENTRY* pEntries) {
977     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
978     TRACE("(%p) Relay\n" , This);
979
980     return IWineD3DDevice_SetPaletteEntries(This->WineD3DDevice, PaletteNumber, pEntries);
981 }
982
983 HRESULT WINAPI IDirect3DDevice8Impl_GetPaletteEntries(LPDIRECT3DDEVICE8 iface, UINT PaletteNumber, PALETTEENTRY* pEntries) {
984     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
985     TRACE("(%p) Relay\n" , This);
986
987     return IWineD3DDevice_GetPaletteEntries(This->WineD3DDevice, PaletteNumber, pEntries);
988 }
989
990 HRESULT WINAPI IDirect3DDevice8Impl_SetCurrentTexturePalette(LPDIRECT3DDEVICE8 iface, UINT PaletteNumber) {
991     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
992     TRACE("(%p) Relay\n" , This);
993
994     return IWineD3DDevice_SetCurrentTexturePalette(This->WineD3DDevice, PaletteNumber);
995 }
996
997 HRESULT  WINAPI  IDirect3DDevice8Impl_GetCurrentTexturePalette(LPDIRECT3DDEVICE8 iface, UINT *PaletteNumber) {
998     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
999     TRACE("(%p) Relay\n" , This);
1000
1001     return IWineD3DDevice_GetCurrentTexturePalette(This->WineD3DDevice, PaletteNumber);
1002 }
1003
1004 HRESULT WINAPI IDirect3DDevice8Impl_DrawPrimitive(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount) {
1005     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; 
1006     TRACE("(%p) Relay\n" , This);
1007
1008     return IWineD3DDevice_DrawPrimitive(This->WineD3DDevice, PrimitiveType, StartVertex, PrimitiveCount);
1009 }
1010
1011 HRESULT WINAPI IDirect3DDevice8Impl_DrawIndexedPrimitive(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType,
1012                                                            UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount) {
1013     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1014     TRACE("(%p) Relay\n" , This);
1015
1016     return IWineD3DDevice_DrawIndexedPrimitive(This->WineD3DDevice, PrimitiveType, This->baseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
1017 }
1018
1019 HRESULT WINAPI IDirect3DDevice8Impl_DrawPrimitiveUP(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType,UINT PrimitiveCount,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride) {
1020     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1021     TRACE("(%p) Relay\n" , This);
1022
1023     return IWineD3DDevice_DrawPrimitiveUP(This->WineD3DDevice, PrimitiveType, PrimitiveCount, pVertexStreamZeroData, VertexStreamZeroStride);
1024 }
1025
1026 HRESULT WINAPI IDirect3DDevice8Impl_DrawIndexedPrimitiveUP(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType,UINT MinVertexIndex,
1027                                                              UINT NumVertexIndices,UINT PrimitiveCount,CONST void* pIndexData,
1028                                                              D3DFORMAT IndexDataFormat,CONST void* pVertexStreamZeroData,
1029                                                              UINT VertexStreamZeroStride) {
1030     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1031     TRACE("(%p) Relay\n" , This);
1032
1033     return IWineD3DDevice_DrawIndexedPrimitiveUP(This->WineD3DDevice, PrimitiveType, MinVertexIndex, NumVertexIndices, PrimitiveCount,
1034                                                  pIndexData, IndexDataFormat, pVertexStreamZeroData, VertexStreamZeroStride);
1035 }
1036
1037 HRESULT WINAPI IDirect3DDevice8Impl_ProcessVertices(LPDIRECT3DDEVICE8 iface, UINT SrcStartIndex,UINT DestIndex,UINT VertexCount,IDirect3DVertexBuffer8* pDestBuffer,DWORD Flags) {
1038     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1039     TRACE("(%p) Relay\n" , This);
1040
1041     return IWineD3DDevice_ProcessVertices(This->WineD3DDevice,SrcStartIndex, DestIndex, VertexCount, ((IDirect3DVertexBuffer8Impl *)pDestBuffer)->wineD3DVertexBuffer, NULL, Flags);
1042 }
1043
1044 HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(LPDIRECT3DDEVICE8 iface, CONST DWORD* pDeclaration, CONST DWORD* pFunction, DWORD* ppShader, DWORD Usage) {
1045     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1046     HRESULT hrc = D3D_OK;
1047     IDirect3DVertexShader8Impl *object;
1048
1049     /* Setup a stub object for now */
1050     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1051     TRACE("(%p) : pFunction(%p), ppShader(%p)\n", This, pFunction, ppShader);
1052     if (NULL == object) {
1053         FIXME("Allocation of memory failed\n");
1054         *ppShader = 0;
1055         return D3DERR_OUTOFVIDEOMEMORY;
1056     }
1057
1058     object->ref = 1;
1059     object->lpVtbl = &Direct3DVertexShader8_Vtbl;
1060     /* Usage is missing ..*/
1061     hrc = IWineD3DDevice_CreateVertexShader(This->WineD3DDevice, pDeclaration, pFunction, &object->wineD3DVertexShader, (IUnknown *)object);
1062
1063     if (FAILED(hrc)) {
1064         /* free up object */
1065         FIXME("Call to IWineD3DDevice_CreateVertexShader failed\n");
1066         HeapFree(GetProcessHeap(), 0, object);
1067         *ppShader = 0;
1068     } else {
1069         /* TODO: Store the VS declarations locally so that they can be derefferenced with a value higher than VS_HIGHESTFIXEDFXF */
1070         DWORD i = 0;
1071         while(This->vShaders[i] != NULL && i < MAX_SHADERS) ++i;
1072         if (MAX_SHADERS == i) {
1073             FIXME("(%p) : Number of shaders exceeds the maximum number of possible shaders\n", This);
1074             hrc = E_OUTOFMEMORY;
1075         } else {
1076             IUnknown_AddRef(iface);
1077             object->parentDevice = iface;
1078             This->vShaders[i] = object;
1079             *ppShader = i + VS_HIGHESTFIXEDFXF + 1;
1080         }
1081     }
1082     TRACE("(%p) : returning %p\n", This, object);
1083
1084     return hrc;
1085 }
1086
1087 HRESULT WINAPI IDirect3DDevice8Impl_SetVertexShader(LPDIRECT3DDEVICE8 iface, DWORD pShader) {
1088     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1089     HRESULT hrc = D3D_OK;
1090
1091     TRACE("(%p) : Relay\n", This);
1092     if (VS_HIGHESTFIXEDFXF >= pShader) {
1093         TRACE("Setting FVF, %d %ld\n", VS_HIGHESTFIXEDFXF, pShader);
1094         IWineD3DDevice_SetFVF(This->WineD3DDevice, pShader);
1095
1096         /* Call SetVertexShader with a NULL shader to set the vertexshader in the stateblock to NULL. */
1097         IWineD3DDevice_SetVertexShader(This->WineD3DDevice, NULL);
1098     } else {
1099         TRACE("Setting shader\n");
1100         if (MAX_SHADERS <= pShader - (VS_HIGHESTFIXEDFXF + 1)) {
1101             FIXME("(%p) : Number of shaders exceeds the maximum number of possible shaders\n", This);
1102             hrc = D3DERR_INVALIDCALL;
1103         } else {
1104             IDirect3DVertexShader8Impl *shader = This->vShaders[pShader - (VS_HIGHESTFIXEDFXF + 1)];
1105             hrc =  IWineD3DDevice_SetVertexShader(This->WineD3DDevice, 0 == shader ? NULL : shader->wineD3DVertexShader);
1106         }
1107     }
1108     TRACE("(%p) : returning hr(%lu)\n", This, hrc);
1109
1110     return hrc;
1111 }
1112
1113 HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShader(LPDIRECT3DDEVICE8 iface, DWORD* ppShader) {
1114     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1115     IWineD3DVertexShader *pShader;
1116     HRESULT hrc = D3D_OK;
1117
1118     TRACE("(%p) : Relay  device@%p\n", This, This->WineD3DDevice);
1119     hrc = IWineD3DDevice_GetVertexShader(This->WineD3DDevice, &pShader);
1120     if (D3D_OK == hrc) {
1121         if(0 != pShader) {
1122             DWORD i = 0;
1123             hrc = IWineD3DVertexShader_GetParent(pShader, (IUnknown **)ppShader);
1124             IWineD3DVertexShader_Release(pShader);
1125             while(This->vShaders[i] != (IDirect3DVertexShader8Impl *)ppShader && i < MAX_SHADERS) ++i;
1126             if (i < MAX_SHADERS) {
1127                 *ppShader = i + VS_HIGHESTFIXEDFXF + 1;
1128             } else {
1129                 WARN("(%p) : Couldn't find math for shader %p in d3d7 shadres list\n", This, (IDirect3DVertexShader8Impl *)ppShader);
1130                 *ppShader = 0;
1131             }
1132         } else {
1133             WARN("(%p) : The shader has been set to NULL\n", This);
1134
1135             /* TODO: Find out what should be returned, e.g. the FVF */
1136             *ppShader = 0;
1137             hrc = D3DERR_INVALIDCALL;
1138         }
1139     } else {
1140         WARN("(%p) : Call to IWineD3DDevice_GetVertexShader failed %lu (device %p)\n", This, hrc, This->WineD3DDevice);
1141     }
1142     TRACE("(%p) : returning %p\n", This, (IDirect3DVertexShader8 *)*ppShader);
1143
1144     return hrc;
1145 }
1146
1147 HRESULT  WINAPI  IDirect3DDevice8Impl_DeleteVertexShader(LPDIRECT3DDEVICE8 iface, DWORD pShader) {
1148     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1149     HRESULT hrc = D3D_OK;
1150     TRACE("(%p) Relay\n", This);
1151     if (pShader <= VS_HIGHESTFIXEDFXF) {
1152         WARN("(%p) : Caller passed a shader below the value of VS_HIGHESTFIXEDFXF\n", This);
1153         hrc = D3DERR_INVALIDCALL;
1154     } else if (MAX_SHADERS <= pShader - (VS_HIGHESTFIXEDFXF + 1)) {
1155         FIXME("(%p) : Caller passed a shader greater than the maximum number of shaders\n", This);
1156         hrc = D3DERR_INVALIDCALL;
1157     } else {
1158         IDirect3DVertexShader8Impl *shader = This->vShaders[pShader - (VS_HIGHESTFIXEDFXF + 1)];
1159         while(IUnknown_Release((IUnknown *)shader));
1160         This->vShaders[pShader - (VS_HIGHESTFIXEDFXF + 1)] = NULL;
1161         hrc = D3D_OK;
1162     }
1163
1164     return hrc;
1165 }
1166
1167 HRESULT WINAPI IDirect3DDevice8Impl_SetVertexShaderConstant(LPDIRECT3DDEVICE8 iface, DWORD Register, CONST void* pConstantData, DWORD ConstantCount) {
1168     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1169     TRACE("(%p) : Relay\n", This);
1170
1171     return IWineD3DDevice_SetVertexShaderConstantF(This->WineD3DDevice, Register, (CONST float *)pConstantData, ConstantCount);
1172 }
1173
1174 HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderConstant(LPDIRECT3DDEVICE8 iface, DWORD Register, void* pConstantData, DWORD ConstantCount) {
1175     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1176     TRACE("(%p) : Relay\n", This);
1177
1178     return IWineD3DDevice_GetVertexShaderConstantF(This->WineD3DDevice, Register, (float *)pConstantData, ConstantCount);
1179 }
1180
1181 HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderDeclaration(LPDIRECT3DDEVICE8 iface, DWORD pVertexShader, void* pData, DWORD* pSizeOfData) {
1182     IDirect3DVertexShader8Impl *This = (IDirect3DVertexShader8Impl *)pVertexShader;
1183
1184     TRACE("(%p) : Relay\n", This);
1185 /*    return IWineD3DVertexShader_GetDeclaration(This->wineD3DVertexShader, pData, (UINT *)pSizeOfData); */
1186     return D3DERR_INVALIDCALL;
1187 }
1188 HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderFunction(LPDIRECT3DDEVICE8 iface, DWORD pVertexShader, void* pData, DWORD* pSizeOfData) {
1189     IDirect3DVertexShader8Impl *This = (IDirect3DVertexShader8Impl *)pVertexShader;
1190
1191     TRACE("(%p) : Relay\n", This);
1192     return IWineD3DVertexShader_GetFunction(This->wineD3DVertexShader, pData, (UINT *)pSizeOfData);
1193 }
1194
1195 HRESULT WINAPI IDirect3DDevice8Impl_SetIndices(LPDIRECT3DDEVICE8 iface, IDirect3DIndexBuffer8* pIndexData, UINT baseVertexIndex) {
1196     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1197     TRACE("(%p) Relay\n", This);
1198 /* FIXME: store base vertex index properly */
1199     This->baseVertexIndex = baseVertexIndex;
1200     return IWineD3DDevice_SetIndices(This->WineD3DDevice,
1201                                      NULL == pIndexData ? NULL : ((IDirect3DIndexBuffer8Impl *)pIndexData)->wineD3DIndexBuffer,
1202                                      0);
1203 }
1204
1205 HRESULT WINAPI IDirect3DDevice8Impl_GetIndices(LPDIRECT3DDEVICE8 iface, IDirect3DIndexBuffer8** ppIndexData,UINT* pBaseVertexIndex) {
1206     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1207     IWineD3DIndexBuffer *retIndexData = NULL;
1208     HRESULT rc = D3D_OK;
1209     UINT tmp;
1210
1211     TRACE("(%p) Relay\n", This);
1212
1213     if(ppIndexData == NULL){
1214         return D3DERR_INVALIDCALL;
1215     }
1216
1217     rc = IWineD3DDevice_GetIndices(This->WineD3DDevice, &retIndexData, &tmp);
1218     if (D3D_OK == rc && NULL != retIndexData) {
1219         IWineD3DVertexBuffer_GetParent(retIndexData, (IUnknown **)ppIndexData);
1220         IWineD3DVertexBuffer_Release(retIndexData);
1221     } else {
1222         if(rc != D3D_OK)  FIXME("Call to GetIndices failed\n");
1223         *ppIndexData = NULL;
1224     }
1225 /* FIXME: store base vertex index properly */
1226     *pBaseVertexIndex = This->baseVertexIndex;
1227     return rc;
1228 }
1229 HRESULT WINAPI IDirect3DDevice8Impl_CreatePixelShader(LPDIRECT3DDEVICE8 iface, CONST DWORD* pFunction, DWORD* ppShader) {
1230     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1231     IDirect3DPixelShader8Impl *object;
1232     HRESULT hrc = D3D_OK;
1233
1234     if (NULL == ppShader) {
1235         TRACE("(%p) Invalid call\n", This);
1236         return D3DERR_INVALIDCALL;
1237     }
1238     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
1239
1240     if (NULL == object) {
1241         return E_OUTOFMEMORY;
1242     } else {
1243
1244         object->ref    = 1;
1245         object->lpVtbl = &Direct3DPixelShader8_Vtbl;
1246         hrc = IWineD3DDevice_CreatePixelShader(This->WineD3DDevice, pFunction, &object->wineD3DPixelShader , (IUnknown *)object);
1247         if (D3D_OK != hrc) {
1248             FIXME("(%p) call to IWineD3DDevice_CreatePixelShader failed\n", This);
1249             HeapFree(GetProcessHeap(), 0 , object);
1250             *ppShader = 0;
1251         } else {
1252             *ppShader = (DWORD)object;
1253         }
1254
1255     }
1256
1257     TRACE("(%p) : returning %p\n", This, (void *)*ppShader);
1258     return hrc;
1259 }
1260
1261 HRESULT WINAPI IDirect3DDevice8Impl_SetPixelShader(LPDIRECT3DDEVICE8 iface, DWORD pShader) {
1262     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1263     IDirect3DPixelShader8Impl *shader = (IDirect3DPixelShader8Impl *)pShader;
1264     TRACE("(%p) Relay\n", This);
1265
1266     return IWineD3DDevice_SetPixelShader(This->WineD3DDevice, shader == NULL ? NULL :shader->wineD3DPixelShader);
1267 }
1268
1269 HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShader(LPDIRECT3DDEVICE8 iface, DWORD* ppShader) {
1270     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1271     IWineD3DPixelShader *object;
1272
1273     HRESULT hrc = D3D_OK;
1274     TRACE("(%p) Relay\n", This);
1275     if (NULL == ppShader) {
1276         TRACE("(%p) Invalid call\n", This);
1277         return D3DERR_INVALIDCALL;
1278     }
1279
1280     hrc = IWineD3DDevice_GetPixelShader(This->WineD3DDevice, &object);
1281     if (D3D_OK == hrc && NULL != object) {
1282        hrc = IWineD3DPixelShader_GetParent(object, (IUnknown **)ppShader);
1283        IWineD3DPixelShader_Release(object);
1284     } else {
1285         *ppShader = (DWORD)NULL;
1286     }
1287
1288     TRACE("(%p) : returning %p\n", This, (void *)*ppShader);
1289     return hrc;
1290 }
1291
1292 HRESULT WINAPI IDirect3DDevice8Impl_DeletePixelShader(LPDIRECT3DDEVICE8 iface, DWORD pShader) {
1293     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1294     IDirect3DPixelShader8Impl *shader = (IDirect3DPixelShader8Impl *)pShader;
1295     TRACE("(%p) Relay\n", This);
1296
1297     if (NULL != shader) {
1298         while(IUnknown_Release((IUnknown *)shader));
1299     }
1300
1301     return D3D_OK;
1302 }
1303
1304 HRESULT  WINAPI  IDirect3DDevice8Impl_SetPixelShaderConstant(LPDIRECT3DDEVICE8 iface, DWORD Register, CONST void* pConstantData, DWORD ConstantCount) {
1305     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1306     TRACE("(%p) Relay\n", This);
1307
1308     return IWineD3DDevice_SetPixelShaderConstantF(This->WineD3DDevice, Register, (CONST float *)pConstantData, ConstantCount);
1309 }
1310
1311 HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShaderConstant(LPDIRECT3DDEVICE8 iface, DWORD Register, void* pConstantData, DWORD ConstantCount) {
1312     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1313     TRACE("(%p) Relay\n", This);
1314
1315     return IWineD3DDevice_GetPixelShaderConstantF(This->WineD3DDevice, Register, (float *)pConstantData, ConstantCount);
1316 }
1317
1318 HRESULT WINAPI IDirect3DDevice8Impl_GetPixelShaderFunction(LPDIRECT3DDEVICE8 iface, DWORD pPixelShader, void* pData, DWORD* pSizeOfData) {
1319     IDirect3DPixelShader8Impl *This = (IDirect3DPixelShader8Impl *)pPixelShader;
1320
1321     TRACE("(%p) : Relay\n", This);
1322     return IWineD3DPixelShader_GetFunction(This->wineD3DPixelShader, pData, (UINT *)pSizeOfData);
1323 }
1324
1325 HRESULT WINAPI IDirect3DDevice8Impl_DrawRectPatch(LPDIRECT3DDEVICE8 iface, UINT Handle,CONST float* pNumSegs,CONST D3DRECTPATCH_INFO* pRectPatchInfo) {
1326     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1327     TRACE("(%p) Relay\n", This);
1328
1329     return IWineD3DDevice_DrawRectPatch(This->WineD3DDevice, Handle, pNumSegs, (WINED3DRECTPATCH_INFO *)pRectPatchInfo);
1330 }
1331
1332 HRESULT WINAPI IDirect3DDevice8Impl_DrawTriPatch(LPDIRECT3DDEVICE8 iface, UINT Handle,CONST float* pNumSegs,CONST D3DTRIPATCH_INFO* pTriPatchInfo) {
1333     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1334     TRACE("(%p) Relay\n", This);
1335
1336     return IWineD3DDevice_DrawTriPatch(This->WineD3DDevice, Handle, pNumSegs, (WINED3DTRIPATCH_INFO *)pTriPatchInfo);
1337 }
1338
1339 HRESULT WINAPI IDirect3DDevice8Impl_DeletePatch(LPDIRECT3DDEVICE8 iface, UINT Handle) {
1340     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1341     TRACE("(%p) Relay\n", This);
1342
1343     return IWineD3DDevice_DeletePatch(This->WineD3DDevice, Handle);
1344 }
1345
1346 HRESULT WINAPI IDirect3DDevice8Impl_SetStreamSource(LPDIRECT3DDEVICE8 iface, UINT StreamNumber,IDirect3DVertexBuffer8* pStreamData,UINT Stride) {
1347     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1348     TRACE("(%p) Relay\n" , This);
1349
1350     return IWineD3DDevice_SetStreamSource(This->WineD3DDevice, StreamNumber,
1351                                           NULL == pStreamData ? NULL : ((IDirect3DVertexBuffer8Impl *)pStreamData)->wineD3DVertexBuffer,
1352                                           0/* Offset in bytes */, Stride);
1353 }
1354
1355 HRESULT WINAPI IDirect3DDevice8Impl_GetStreamSource(LPDIRECT3DDEVICE8 iface, UINT StreamNumber,IDirect3DVertexBuffer8** pStream,UINT* pStride) {
1356     IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
1357     IWineD3DVertexBuffer *retStream = NULL;
1358     HRESULT rc = D3D_OK;
1359
1360     TRACE("(%p) Relay\n" , This);
1361
1362     if(pStream == NULL){
1363         return D3DERR_INVALIDCALL;
1364     }
1365
1366     rc = IWineD3DDevice_GetStreamSource(This->WineD3DDevice, StreamNumber, (IWineD3DVertexBuffer **)&retStream, 0 /* Offset in bytes */, pStride);
1367     if (rc == D3D_OK  && NULL != retStream) {
1368         IWineD3DVertexBuffer_GetParent(retStream, (IUnknown **)pStream);
1369         IWineD3DVertexBuffer_Release(retStream);
1370     }else{
1371          FIXME("Call to GetStreamSource failed %p\n",  pStride);
1372         *pStream = NULL;
1373     }
1374
1375     return rc;
1376 }
1377
1378
1379 const IDirect3DDevice8Vtbl Direct3DDevice8_Vtbl =
1380 {
1381     IDirect3DDevice8Impl_QueryInterface,
1382     IDirect3DDevice8Impl_AddRef,
1383     IDirect3DDevice8Impl_Release,
1384     IDirect3DDevice8Impl_TestCooperativeLevel,
1385     IDirect3DDevice8Impl_GetAvailableTextureMem,
1386     IDirect3DDevice8Impl_ResourceManagerDiscardBytes,
1387     IDirect3DDevice8Impl_GetDirect3D,
1388     IDirect3DDevice8Impl_GetDeviceCaps,
1389     IDirect3DDevice8Impl_GetDisplayMode,
1390     IDirect3DDevice8Impl_GetCreationParameters,
1391     IDirect3DDevice8Impl_SetCursorProperties,
1392     IDirect3DDevice8Impl_SetCursorPosition,
1393     IDirect3DDevice8Impl_ShowCursor,
1394     IDirect3DDevice8Impl_CreateAdditionalSwapChain,
1395     IDirect3DDevice8Impl_Reset,
1396     IDirect3DDevice8Impl_Present,
1397     IDirect3DDevice8Impl_GetBackBuffer,
1398     IDirect3DDevice8Impl_GetRasterStatus,
1399     IDirect3DDevice8Impl_SetGammaRamp,
1400     IDirect3DDevice8Impl_GetGammaRamp,
1401     IDirect3DDevice8Impl_CreateTexture,
1402     IDirect3DDevice8Impl_CreateVolumeTexture,
1403     IDirect3DDevice8Impl_CreateCubeTexture,
1404     IDirect3DDevice8Impl_CreateVertexBuffer,
1405     IDirect3DDevice8Impl_CreateIndexBuffer,
1406     IDirect3DDevice8Impl_CreateRenderTarget,
1407     IDirect3DDevice8Impl_CreateDepthStencilSurface,
1408     IDirect3DDevice8Impl_CreateImageSurface,
1409     IDirect3DDevice8Impl_CopyRects,
1410     IDirect3DDevice8Impl_UpdateTexture,
1411     IDirect3DDevice8Impl_GetFrontBuffer,
1412     IDirect3DDevice8Impl_SetRenderTarget,
1413     IDirect3DDevice8Impl_GetRenderTarget,
1414     IDirect3DDevice8Impl_GetDepthStencilSurface,
1415     IDirect3DDevice8Impl_BeginScene,
1416     IDirect3DDevice8Impl_EndScene,
1417     IDirect3DDevice8Impl_Clear,
1418     IDirect3DDevice8Impl_SetTransform,
1419     IDirect3DDevice8Impl_GetTransform,
1420     IDirect3DDevice8Impl_MultiplyTransform,
1421     IDirect3DDevice8Impl_SetViewport,
1422     IDirect3DDevice8Impl_GetViewport,
1423     IDirect3DDevice8Impl_SetMaterial,
1424     IDirect3DDevice8Impl_GetMaterial,
1425     IDirect3DDevice8Impl_SetLight,
1426     IDirect3DDevice8Impl_GetLight,
1427     IDirect3DDevice8Impl_LightEnable,
1428     IDirect3DDevice8Impl_GetLightEnable,
1429     IDirect3DDevice8Impl_SetClipPlane,
1430     IDirect3DDevice8Impl_GetClipPlane,
1431     IDirect3DDevice8Impl_SetRenderState,
1432     IDirect3DDevice8Impl_GetRenderState,
1433     IDirect3DDevice8Impl_BeginStateBlock,
1434     IDirect3DDevice8Impl_EndStateBlock,
1435     IDirect3DDevice8Impl_ApplyStateBlock,
1436     IDirect3DDevice8Impl_CaptureStateBlock,
1437     IDirect3DDevice8Impl_DeleteStateBlock,
1438     IDirect3DDevice8Impl_CreateStateBlock,
1439     IDirect3DDevice8Impl_SetClipStatus,
1440     IDirect3DDevice8Impl_GetClipStatus,
1441     IDirect3DDevice8Impl_GetTexture,
1442     IDirect3DDevice8Impl_SetTexture,
1443     IDirect3DDevice8Impl_GetTextureStageState,
1444     IDirect3DDevice8Impl_SetTextureStageState,
1445     IDirect3DDevice8Impl_ValidateDevice,
1446     IDirect3DDevice8Impl_GetInfo,
1447     IDirect3DDevice8Impl_SetPaletteEntries,
1448     IDirect3DDevice8Impl_GetPaletteEntries,
1449     IDirect3DDevice8Impl_SetCurrentTexturePalette,
1450     IDirect3DDevice8Impl_GetCurrentTexturePalette,
1451     IDirect3DDevice8Impl_DrawPrimitive,
1452     IDirect3DDevice8Impl_DrawIndexedPrimitive,
1453     IDirect3DDevice8Impl_DrawPrimitiveUP,
1454     IDirect3DDevice8Impl_DrawIndexedPrimitiveUP,
1455     IDirect3DDevice8Impl_ProcessVertices,
1456     IDirect3DDevice8Impl_CreateVertexShader,
1457     IDirect3DDevice8Impl_SetVertexShader,
1458     IDirect3DDevice8Impl_GetVertexShader,
1459     IDirect3DDevice8Impl_DeleteVertexShader,
1460     IDirect3DDevice8Impl_SetVertexShaderConstant,
1461     IDirect3DDevice8Impl_GetVertexShaderConstant,
1462     IDirect3DDevice8Impl_GetVertexShaderDeclaration,
1463     IDirect3DDevice8Impl_GetVertexShaderFunction,
1464     IDirect3DDevice8Impl_SetStreamSource,
1465     IDirect3DDevice8Impl_GetStreamSource,
1466     IDirect3DDevice8Impl_SetIndices,
1467     IDirect3DDevice8Impl_GetIndices,
1468     IDirect3DDevice8Impl_CreatePixelShader,
1469     IDirect3DDevice8Impl_SetPixelShader,
1470     IDirect3DDevice8Impl_GetPixelShader,
1471     IDirect3DDevice8Impl_DeletePixelShader,
1472     IDirect3DDevice8Impl_SetPixelShaderConstant,
1473     IDirect3DDevice8Impl_GetPixelShaderConstant,
1474     IDirect3DDevice8Impl_GetPixelShaderFunction,
1475     IDirect3DDevice8Impl_DrawRectPatch,
1476     IDirect3DDevice8Impl_DrawTriPatch,
1477     IDirect3DDevice8Impl_DeletePatch
1478 };
1479
1480 /* Internal function called back during the CreateDevice to create a render target  */
1481 HRESULT WINAPI D3D8CB_CreateSurface(IUnknown *device, UINT Width, UINT Height, 
1482                                          WINED3DFORMAT Format, DWORD Usage, WINED3DPOOL Pool, UINT Level,
1483                                          IWineD3DSurface **ppSurface, HANDLE *pSharedHandle) {
1484
1485     HRESULT res = D3D_OK;
1486     IDirect3DSurface8Impl *d3dSurface = NULL;
1487     BOOL Lockable = TRUE;
1488
1489     if((WINED3DPOOL_DEFAULT == Pool && WINED3DUSAGE_DYNAMIC != Usage))
1490         Lockable = FALSE;
1491
1492     TRACE("relay\n");
1493     res = IDirect3DDevice8Impl_CreateSurface((IDirect3DDevice8 *)device, Width, Height, (D3DFORMAT)Format, Lockable, FALSE/*Discard*/, Level,  (IDirect3DSurface8 **)&d3dSurface, D3DRTYPE_SURFACE, Usage, Pool, D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */);
1494
1495     if (res == D3D_OK) {
1496         *ppSurface = d3dSurface->wineD3DSurface;
1497     } else {
1498         FIXME("(%p) IDirect3DDevice8_CreateSurface failed\n", device);
1499     }
1500     return res;
1501 }