H. Verbeet : d3d8:
Store the d3d8 vertex declaration in the d3d8 vertex shader.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Feb 14 09:25:44 CST 2007
Module: wine
Branch: master
Commit: 5ad6766c85d4978ad535e5ec4c066f6bec5d7e9e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5ad6766c85d4978ad535e5ec4c066f6bec5d7e9e
Author: H. Verbeet <hverbeet at gmail.com>
Date: Tue Feb 13 23:12:24 2007 +0100
d3d8: Store the d3d8 vertex declaration in the d3d8 vertex shader.
---
dlls/d3d8/d3d8_private.h | 1 +
dlls/d3d8/device.c | 38 ++++++++++++++++++++++++++++++++++++++
dlls/d3d8/vertexshader.c | 1 +
3 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h
index 0af3c56..d35f351 100644
--- a/dlls/d3d8/d3d8_private.h
+++ b/dlls/d3d8/d3d8_private.h
@@ -586,6 +586,7 @@ struct IDirect3DVertexShader8Impl {
LONG ref;
shader_handle *handle;
+ IDirect3DVertexDeclaration8 *vertex_declaration;
IWineD3DVertexShader *wineD3DVertexShader;
};
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 18b79ce..d82919c 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -1162,6 +1162,35 @@ static HRESULT WINAPI IDirect3DDevice8Impl_ProcessVertices(LPDIRECT3DDEVICE8 ifa
return IWineD3DDevice_ProcessVertices(This->WineD3DDevice,SrcStartIndex, DestIndex, VertexCount, ((IDirect3DVertexBuffer8Impl *)pDestBuffer)->wineD3DVertexBuffer, NULL, Flags);
}
+static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexDeclaration(IDirect3DDevice8 *iface, CONST DWORD *declaration, IDirect3DVertexDeclaration8 **decl_ptr) {
+ IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
+ IDirect3DVertexDeclaration8Impl *object;
+ 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;
+
+ hr = IWineD3DDevice_CreateVertexDeclaration(This->WineD3DDevice, declaration, &object->wined3d_vertex_declaration, (IUnknown *)object);
+ if (FAILED(hr)) {
+ ERR("(%p) : IWineD3DDevice_CreateVertexDeclaration call failed\n", This);
+ 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;
@@ -1178,6 +1207,15 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(LPDIRECT3DDEVICE8
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;
+ }
+
/* Usage is missing ..*/
hrc = IWineD3DDevice_CreateVertexShader(This->WineD3DDevice, pDeclaration, pFunction, &object->wineD3DVertexShader, (IUnknown *)object);
diff --git a/dlls/d3d8/vertexshader.c b/dlls/d3d8/vertexshader.c
index 2f22e31..89555bd 100644
--- a/dlls/d3d8/vertexshader.c
+++ b/dlls/d3d8/vertexshader.c
@@ -56,6 +56,7 @@ static ULONG WINAPI IDirect3DVertexShader8Impl_Release(IDirect3DVertexShader8 *i
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0) {
+ IDirect3DVertexDeclaration8_Release(This->vertex_declaration);
IWineD3DVertexShader_Release(This->wineD3DVertexShader);
HeapFree(GetProcessHeap(), 0, This);
}
More information about the wine-cvs
mailing list