- Implement SetStreamSource
- Ensure wined3d objects maintain a reference count of at least that
of the d3dx version.
diff --git a/dlls/d3d8/d3d8_main.c b/dlls/d3d8/d3d8_main.c
index 6b7f653..8c49d0f 100644
--- a/dlls/d3d8/d3d8_main.c
+++ b/dlls/d3d8/d3d8_main.c
@@ -56,7 +56,7 @@
object->lpVtbl = &Direct3D8_Vtbl;
object->direct3d8 = object;
object->ref = 1;
- object->WineD3D = WineDirect3DCreate(SDKVersion, 8);
+ object->WineD3D = WineDirect3DCreate(SDKVersion, 8, (IUnknown *)object);
TRACE("SDKVersion = %x, Created Direct3D object @ %p, WineObj @ %p\n", SDKVersion, object, object->WineD3D);
diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c
index 6e2b6fb..ed70421 100644
--- a/dlls/d3d8/directx.c
+++ b/dlls/d3d8/directx.c
@@ -583,7 +583,7 @@
localParameters.Flags = &pPresentationParameters->Flags;
localParameters.FullScreen_RefreshRateInHz = &pPresentationParameters->FullScreen_RefreshRateInHz;
localParameters.PresentationInterval = &pPresentationParameters->FullScreen_PresentationInterval; /* Renamed in dx9 */
- IWineD3D_CreateDevice(This->WineD3D, Adapter, DeviceType, hFocusWindow, BehaviourFlags, &localParameters, &object->WineD3DDevice);
+ IWineD3D_CreateDevice(This->WineD3D, Adapter, DeviceType, hFocusWindow, BehaviourFlags, &localParameters, &object->WineD3DDevice, (IUnknown *)object);
/** use StateBlock Factory here, for creating the startup stateBlock */
object->StateBlock = NULL;
diff --git a/dlls/d3d9/d3d9_main.c b/dlls/d3d9/d3d9_main.c
index 7edb9bd..a80424a 100644
--- a/dlls/d3d9/d3d9_main.c
+++ b/dlls/d3d9/d3d9_main.c
@@ -43,7 +43,7 @@
object->lpVtbl = &Direct3D9_Vtbl;
object->ref = 1;
- object->WineD3D = WineDirect3DCreate(SDKVersion, 9);
+ object->WineD3D = WineDirect3DCreate(SDKVersion, 9, (IUnknown *)object);
TRACE("SDKVersion = %x, Created Direct3D object @ %p, WineObj @ %p\n", SDKVersion, object, object->WineD3D);
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index 487972a..a1bc220 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -606,35 +606,20 @@
}
HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSource(LPDIRECT3DDEVICE9 iface, UINT StreamNumber, IDirect3DVertexBuffer9* pStreamData, UINT OffsetInBytes, UINT Stride) {
- IDirect3DVertexBuffer9 *oldSrc;
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
-
- oldSrc = This->StateBlock->stream_source[StreamNumber];
- TRACE("(%p) : StreamNo: %d, OldStream (%p), NewStream (%p), NewStride %d\n", This, StreamNumber, oldSrc, pStreamData, Stride);
-
- This->UpdateStateBlock->Changed.stream_source[StreamNumber] = TRUE;
- This->UpdateStateBlock->Set.stream_source[StreamNumber] = TRUE;
- This->UpdateStateBlock->stream_stride[StreamNumber] = Stride;
- This->UpdateStateBlock->stream_source[StreamNumber] = pStreamData;
-
- /* Handle recording of state blocks */
- if (This->isRecordingState) {
- TRACE("Recording... not performing anything\n");
- return D3D_OK;
- }
-
- if (oldSrc != NULL) IDirect3DVertexBuffer9Impl_Release(oldSrc);
- if (pStreamData != NULL) IDirect3DVertexBuffer9Impl_AddRef(pStreamData);
- return D3D_OK;
+ return IWineD3DDevice_SetStreamSource(This->WineD3DDevice, StreamNumber,
+ pStreamData==NULL ? NULL:((IDirect3DVertexBuffer9Impl *)pStreamData)->wineD3DVertexBuffer,
+ OffsetInBytes, Stride);
}
HRESULT WINAPI IDirect3DDevice9Impl_GetStreamSource(LPDIRECT3DDEVICE9 iface, UINT StreamNumber, IDirect3DVertexBuffer9** pStream, UINT* OffsetInBytes, UINT* pStride) {
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
- TRACE("(%p) : StreamNo: %d, Stream (%p), Stride %d\n", This, StreamNumber, This->StateBlock->stream_source[StreamNumber], This->StateBlock->stream_stride[StreamNumber]);
- *pStream = This->StateBlock->stream_source[StreamNumber];
- *pStride = This->StateBlock->stream_stride[StreamNumber];
- IDirect3DVertexBuffer9Impl_AddRef((LPDIRECT3DVERTEXBUFFER9) *pStream);
- return D3D_OK;
+ IWineD3DVertexBuffer *retStream = NULL;
+ HRESULT rc = D3D_OK;
+
+ rc = IWineD3DDevice_GetStreamSource(This->WineD3DDevice, StreamNumber, (IWineD3DVertexBuffer **)&retStream, OffsetInBytes, pStride);
+ if (rc == D3D_OK && NULL != *pStream) IWineD3DVertexBuffer_GetParent(retStream, (IUnknown **)pStream);
+ return rc;
}
HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSourceFreq(LPDIRECT3DDEVICE9 iface, UINT StreamNumber, UINT Divider) {
diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index 126e965..0935f94 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -191,7 +191,7 @@
localParameters.Flags = &pPresentationParameters->Flags;
localParameters.FullScreen_RefreshRateInHz = &pPresentationParameters->FullScreen_RefreshRateInHz;
localParameters.PresentationInterval = &pPresentationParameters->PresentationInterval;
- IWineD3D_CreateDevice(This->WineD3D, Adapter, DeviceType, hFocusWindow, BehaviourFlags, &localParameters, &object->WineD3DDevice);
+ IWineD3D_CreateDevice(This->WineD3D, Adapter, DeviceType, hFocusWindow, BehaviourFlags, &localParameters, &object->WineD3DDevice, (IUnknown *)object);
FIXME("(%p) : incomplete stub\n", This);
return D3D_OK;
diff --git a/dlls/d3d9/vertexbuffer.c b/dlls/d3d9/vertexbuffer.c
index 908c537..dff7926 100644
--- a/dlls/d3d9/vertexbuffer.c
+++ b/dlls/d3d9/vertexbuffer.c
@@ -147,7 +147,7 @@
object->lpVtbl = &Direct3DVertexBuffer9_Vtbl;
object->ref = 1;
object->device = This;
- IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage, FVF, Pool, &(object->wineD3DVertexBuffer), pSharedHandle);
+ IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage, FVF, Pool, &(object->wineD3DVertexBuffer), pSharedHandle, (IUnknown *)object);
*ppVertexBuffer = (LPDIRECT3DVERTEXBUFFER9) object;
return D3D_OK;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 3ebeb9d..df8d565 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -34,8 +34,16 @@
/**********************************************************
* IWineD3DDevice implementation follows
**********************************************************/
+HRESULT WINAPI IWineD3DDeviceImpl_GetParent(IWineD3DDevice *iface, IUnknown **pParent) {
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ *pParent = This->parent;
+ IUnknown_AddRef(This->parent);
+ return D3D_OK;
+}
+
HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexBuffer(IWineD3DDevice *iface, UINT Size, DWORD Usage,
- DWORD FVF, D3DPOOL Pool, IWineD3DVertexBuffer** ppVertexBuffer, HANDLE *sharedHandle) {
+ DWORD FVF, D3DPOOL Pool, IWineD3DVertexBuffer** ppVertexBuffer, HANDLE *sharedHandle,
+ IUnknown *parent) {
IWineD3DVertexBufferImpl *object;
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
@@ -44,6 +52,8 @@
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DVertexBufferImpl));
object->lpVtbl = &IWineD3DVertexBuffer_Vtbl;
object->resource.wineD3DDevice= iface;
+ IWineD3DDevice_AddRef(iface);
+ object->resource.parent = parent;
object->resource.resourceType = D3DRTYPE_VERTEXBUFFER;
object->resource.ref = 1;
object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Size);
@@ -58,7 +68,7 @@
return D3D_OK;
}
-HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface, D3DSTATEBLOCKTYPE Type, IWineD3DStateBlock** ppStateBlock) {
+HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface, D3DSTATEBLOCKTYPE Type, IWineD3DStateBlock** ppStateBlock, IUnknown *parent) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DStateBlockImpl *object;
@@ -67,6 +77,8 @@
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DStateBlockImpl));
object->lpVtbl = &IWineD3DStateBlock_Vtbl;
object->wineD3DDevice = iface;
+ IWineD3DDevice_AddRef(iface);
+ object->parent = parent;
object->ref = 1;
object->blockType = Type;
*ppStateBlock = (IWineD3DStateBlock *)object;
@@ -109,6 +121,46 @@
return D3D_OK;
}
+/*****
+ * Get / Set Stream Source
+ *****/
+HRESULT WINAPI IWineD3DDeviceImpl_SetStreamSource(IWineD3DDevice *iface, UINT StreamNumber,IWineD3DVertexBuffer* pStreamData, UINT OffsetInBytes, UINT Stride) {
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ IWineD3DVertexBuffer *oldSrc;
+
+ oldSrc = This->stateBlock->stream_source[StreamNumber];
+ TRACE("(%p) : StreamNo: %d, OldStream (%p), NewStream (%p), NewStride %d\n", This, StreamNumber, oldSrc, pStreamData, Stride);
+
+ This->updateStateBlock->changed.stream_source[StreamNumber] = TRUE;
+ This->updateStateBlock->set.stream_source[StreamNumber] = TRUE;
+ This->updateStateBlock->stream_stride[StreamNumber] = Stride;
+ This->updateStateBlock->stream_source[StreamNumber] = pStreamData;
+ This->updateStateBlock->stream_offset[StreamNumber] = OffsetInBytes;
+
+ /* Handle recording of state blocks */
+ if (This->isRecordingState) {
+ TRACE("Recording... not performing anything\n");
+ return D3D_OK;
+ }
+
+ /* Not recording... */
+ if (oldSrc != NULL) IWineD3DVertexBuffer_Release(oldSrc);
+ if (pStreamData != NULL) IWineD3DVertexBuffer_AddRef(pStreamData);
+
+ return D3D_OK;
+}
+
+HRESULT WINAPI IWineD3DDeviceImpl_GetStreamSource(IWineD3DDevice *iface, UINT StreamNumber,IWineD3DVertexBuffer** pStream, UINT *pOffset, UINT* pStride) {
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+
+ TRACE("(%p) : StreamNo: %d, Stream (%p), Stride %d\n", This, StreamNumber, This->stateBlock->stream_source[StreamNumber], This->stateBlock->stream_stride[StreamNumber]);
+ *pStream = This->stateBlock->stream_source[StreamNumber];
+ *pStride = This->stateBlock->stream_stride[StreamNumber];
+ *pOffset = This->stateBlock->stream_offset[StreamNumber];
+ IWineD3DVertexBuffer_AddRef(*pStream); /* We have created a new reference to the VB */
+ return D3D_OK;
+}
+
/**********************************************************
* IUnknown parts follows
**********************************************************/
@@ -130,6 +182,7 @@
TRACE("(%p) : Releasing from %ld\n", This, This->ref);
ref = InterlockedDecrement(&This->ref);
if (ref == 0) {
+ IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->stateBlock);
IWineD3D_Release(This->WineD3D);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -145,8 +198,11 @@
IWineD3DDeviceImpl_QueryInterface,
IWineD3DDeviceImpl_AddRef,
IWineD3DDeviceImpl_Release,
+ IWineD3DDeviceImpl_GetParent,
IWineD3DDeviceImpl_CreateVertexBuffer,
IWineD3DDeviceImpl_CreateStateBlock,
IWineD3DDeviceImpl_SetFVF,
- IWineD3DDeviceImpl_GetFVF
+ IWineD3DDeviceImpl_GetFVF,
+ IWineD3DDeviceImpl_SetStreamSource,
+ IWineD3DDeviceImpl_GetStreamSource
};
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 2b11579..546e39b 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1310,7 +1310,7 @@
and fields being inserted in the middle, a new structure is used in place */
HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow,
DWORD BehaviourFlags, WINED3DPRESENT_PARAMETERS* pPresentationParameters,
- IWineD3DDevice** ppReturnedDeviceInterface) {
+ IWineD3DDevice** ppReturnedDeviceInterface, IUnknown *parent) {
HWND whichHWND;
HDC hDc;
@@ -1337,6 +1337,7 @@
object->ref = 1;
object->WineD3D = iface;
IWineD3D_AddRef(object->WineD3D);
+ object->parent = parent;
TRACE("(%p)->(Adptr:%d, DevType: %x, FocusHwnd: %p, BehFlags: %lx, PresParms: %p, RetDevInt: %p)\n", This, Adapter, DeviceType,
hFocusWindow, BehaviourFlags, pPresentationParameters, ppReturnedDeviceInterface);
@@ -1468,7 +1469,8 @@
/* Creating the startup stateBlock - Note Special Case: 0 => Don't fill in yet! */
IWineD3DDevice_CreateStateBlock((IWineD3DDevice *)object,
(D3DSTATEBLOCKTYPE) 0,
- (IWineD3DStateBlock **)&object->stateBlock);
+ (IWineD3DStateBlock **)&object->stateBlock,
+ NULL); /* Note: No parent needed for initial internal stateblock */
object->updateStateBlock = object->stateBlock;
/* Setup surfaces for the backbuffer, frontbuffer and depthstencil buffer */
@@ -1581,6 +1583,13 @@
return D3D_OK;
}
+HRESULT WINAPI IWineD3DImpl_GetParent(IWineD3D *iface, IUnknown **pParent) {
+ IWineD3DImpl *This = (IWineD3DImpl *)iface;
+ IUnknown_AddRef(This->parent);
+ *pParent = This->parent;
+ return D3D_OK;
+}
+
/**********************************************************
* IUnknown parts follows
**********************************************************/
@@ -1614,6 +1623,7 @@
IWineD3DImpl_QueryInterface,
IWineD3DImpl_AddRef,
IWineD3DImpl_Release,
+ IWineD3DImpl_GetParent,
IWineD3DImpl_GetAdapterCount,
IWineD3DImpl_RegisterSoftwareDevice,
IWineD3DImpl_GetAdapterMonitor,
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 3bca025..e52d9f8 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -45,6 +45,7 @@
TRACE("(%p) : Releasing from %ld\n", This, This->resource.ref);
ref = InterlockedDecrement(&This->resource.ref);
if (ref == 0) {
+ IWineD3DDevice_Release(This->resource.wineD3DDevice);
HeapFree(GetProcessHeap(), 0, This);
}
return ref;
@@ -97,11 +98,20 @@
return This->resource.resourceType;
}
+HRESULT WINAPI IWineD3DResourceImpl_GetParent(IWineD3DResource *iface, IUnknown **pParent) {
+ IWineD3DResourceImpl *This = (IWineD3DResourceImpl *)iface;
+ IUnknown_AddRef(This->resource.parent);
+ *pParent = This->resource.parent;
+ return D3D_OK;
+}
+
+
IWineD3DResourceVtbl IWineD3DResource_Vtbl =
{
IWineD3DResourceImpl_QueryInterface,
IWineD3DResourceImpl_AddRef,
IWineD3DResourceImpl_Release,
+ IWineD3DResourceImpl_GetParent,
IWineD3DResourceImpl_GetDevice,
IWineD3DResourceImpl_SetPrivateData,
IWineD3DResourceImpl_GetPrivateData,
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 754e1f8..d483b0d 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -24,6 +24,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
+HRESULT WINAPI IWineD3DStateBlockImpl_GetParent(IWineD3DStateBlock *iface, IUnknown **pParent) {
+ IWineD3DStateBlockImpl *This = (IWineD3DStateBlockImpl *)iface;
+ IUnknown_AddRef(This->parent);
+ *pParent = This->parent;
+ return D3D_OK;
+}
+
HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStateBlock* iface) {
IWineD3DStateBlockImpl *This = (IWineD3DStateBlockImpl *)iface;
@@ -56,7 +63,10 @@
ULONG ref;
TRACE("(%p) : Releasing from %ld\n", This, This->ref);
ref = InterlockedDecrement(&This->ref);
- if (ref == 0) HeapFree(GetProcessHeap(), 0, This);
+ if (ref == 0) {
+ IWineD3DDevice_Release(This->wineD3DDevice);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
return ref;
}
@@ -69,5 +79,6 @@
IWineD3DStateBlockImpl_QueryInterface,
IWineD3DStateBlockImpl_AddRef,
IWineD3DStateBlockImpl_Release,
+ IWineD3DStateBlockImpl_GetParent,
IWineD3DStateBlockImpl_InitStartupStateBlock
};
diff --git a/dlls/wined3d/vertexbuffer.c b/dlls/wined3d/vertexbuffer.c
index c8439b5..579e3e7 100644
--- a/dlls/wined3d/vertexbuffer.c
+++ b/dlls/wined3d/vertexbuffer.c
@@ -38,6 +38,7 @@
ULONG WINAPI IWineD3DVertexBufferImpl_AddRef(IWineD3DVertexBuffer *iface) {
IWineD3DVertexBufferImpl *This = (IWineD3DVertexBufferImpl *)iface;
TRACE("(%p) : AddRef increasing from %ld\n", This, This->resource.ref);
+ IUnknown_AddRef(This->resource.parent);
return InterlockedIncrement(&This->resource.ref);
}
@@ -48,7 +49,10 @@
ref = InterlockedDecrement(&This->resource.ref);
if (ref == 0) {
if (NULL != This->allocatedMemory) HeapFree(GetProcessHeap(), 0, This->allocatedMemory);
+ IWineD3DDevice_Release(This->resource.wineD3DDevice);
HeapFree(GetProcessHeap(), 0, This);
+ } else {
+ IUnknown_Release(This->resource.parent); /* Released the reference to the d3dx VB */
}
return ref;
}
@@ -88,6 +92,9 @@
return IWineD3DResource_GetType((IWineD3DResource *)iface);
}
+HRESULT WINAPI IWineD3DVertexBufferImpl_GetParent(IWineD3DVertexBuffer *iface, IUnknown **pParent) {
+ return IWineD3DResource_GetParent((IWineD3DResource *)iface, pParent);
+}
/* ******************************************************
IWineD3DVertexBuffer IWineD3DVertexBuffer parts follow
@@ -122,6 +129,7 @@
IWineD3DVertexBufferImpl_QueryInterface,
IWineD3DVertexBufferImpl_AddRef,
IWineD3DVertexBufferImpl_Release,
+ IWineD3DVertexBufferImpl_GetParent,
IWineD3DVertexBufferImpl_GetDevice,
IWineD3DVertexBufferImpl_SetPrivateData,
IWineD3DVertexBufferImpl_GetPrivateData,
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 617158d..aee3c8d 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -32,11 +32,12 @@
int vs_mode = VS_HW; /* Hardware by default */
int ps_mode = PS_NONE; /* Disabled by default */
-IWineD3D* WINAPI WineDirect3DCreate(UINT SDKVersion, UINT dxVersion) {
+IWineD3D* WINAPI WineDirect3DCreate(UINT SDKVersion, UINT dxVersion, IUnknown *parent) {
IWineD3DImpl* object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DImpl));
object->lpVtbl = &IWineD3D_Vtbl;
object->dxVersion = dxVersion;
object->ref = 1;
+ object->parent = parent;
TRACE("Created WineD3D object @ %p for d3d%d support\n", object, dxVersion);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 977a510..b6da14a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -26,6 +26,7 @@
#include <stdarg.h>
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
+#define COBJMACROS
#include "windef.h"
#include "winbase.h"
#include "winreg.h"
@@ -98,6 +99,7 @@
DWORD ref; /* Note: Ref counting not required */
/* WineD3D Information */
+ IUnknown *parent;
UINT dxVersion;
/* GL Information */
@@ -117,6 +119,7 @@
DWORD ref; /* Note: Ref counting not required */
/* WineD3D Information */
+ IUnknown *parent; /* TODO - to be a new interface eventually */
IWineD3D *WineD3D;
/* X and GL Information */
@@ -159,6 +162,7 @@
DWORD ref; /* Note: Ref counting not required */
/* WineD3DResource Information */
+ IUnknown *parent;
IWineD3DDevice *wineD3DDevice;
D3DRESOURCETYPE resourceType;
@@ -200,6 +204,7 @@
/* to resolve everything we need, so doing it manually for now */
typedef struct SAVEDSTATES {
BOOL fvf;
+ BOOL stream_source[MAX_STREAMS];
} SAVEDSTATES;
struct IWineD3DStateBlockImpl
@@ -209,6 +214,7 @@
DWORD ref; /* Note: Ref counting not required */
/* IWineD3DStateBlock information */
+ IUnknown *parent;
IWineD3DDevice *wineD3DDevice;
D3DSTATEBLOCKTYPE blockType;
@@ -219,6 +225,10 @@
/* Drawing - Vertex Shader or FVF related */
DWORD fvf;
+ /* Stream Source */
+ UINT stream_stride[MAX_STREAMS];
+ UINT stream_offset[MAX_STREAMS];
+ IWineD3DVertexBuffer *stream_source[MAX_STREAMS];
};
extern IWineD3DStateBlockVtbl IWineD3DStateBlock_Vtbl;