H. Verbeet : d3d8: Save the d3d8 vertex declaration.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Mar 8 07:17:04 CST 2007


Module: wine
Branch: master
Commit: 138826b8ccba20918f11139ed7863ddd1df309a6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=138826b8ccba20918f11139ed7863ddd1df309a6

Author: H. Verbeet <hverbeet at gmail.com>
Date:   Thu Mar  8 01:15:46 2007 +0100

d3d8: Save the d3d8 vertex declaration.

---

 dlls/d3d8/d3d8_private.h      |    5 ++++-
 dlls/d3d8/device.c            |   14 +++++++++++++-
 dlls/d3d8/vertexdeclaration.c |    5 ++++-
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h
index af67706..6ec3f18 100644
--- a/dlls/d3d8/d3d8_private.h
+++ b/dlls/d3d8/d3d8_private.h
@@ -515,6 +515,9 @@ typedef struct {
     const IDirect3DVertexDeclaration8Vtbl *lpVtbl;
     LONG ref_count;
 
+    DWORD *elements;
+    DWORD elements_size; /* Size of elements, in bytes */
+
     IWineD3DVertexDeclaration *wined3d_vertex_declaration;
 } IDirect3DVertexDeclaration8Impl;
 
@@ -619,7 +622,7 @@ typedef struct IDirect3DPixelShader8Impl {
  * to see how not defined it here
  */
 void load_local_constants(const DWORD *d3d8_elements, IWineD3DVertexShader *wined3d_vertex_shader);
-size_t convert_to_wined3d_declaration(const DWORD *d3d8_elements, WINED3DVERTEXELEMENT **wined3d_elements);
+size_t convert_to_wined3d_declaration(const DWORD *d3d8_elements, DWORD *d3d8_elements_size, WINED3DVERTEXELEMENT **wined3d_elements);
 
 /* Callbacks */
 extern HRESULT WINAPI D3D8CB_CreateSurface(IUnknown *device, IUnknown *pSuperior, UINT Width, UINT Height,
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 95a1331..22ba77c 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -1214,13 +1214,25 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexDeclaration(IDirect3DDevi
     object->ref_count = 1;
     object->lpVtbl = &Direct3DVertexDeclaration8_Vtbl;
 
-    wined3d_element_count = convert_to_wined3d_declaration(declaration, &wined3d_elements);
+    wined3d_element_count = convert_to_wined3d_declaration(declaration, &object->elements_size, &wined3d_elements);
+    object->elements = HeapAlloc(GetProcessHeap(), 0, object->elements_size);
+    if (!object->elements) {
+        ERR("Memory allocation failed\n");
+        HeapFree(GetProcessHeap(), 0, wined3d_elements);
+        HeapFree(GetProcessHeap(), 0, object);
+        *decl_ptr = NULL;
+        return D3DERR_OUTOFVIDEOMEMORY;
+    }
+
+    CopyMemory(object->elements, declaration, object->elements_size);
+
     hr = IWineD3DDevice_CreateVertexDeclaration(This->WineD3DDevice, &object->wined3d_vertex_declaration,
             (IUnknown *)object, wined3d_elements, wined3d_element_count);
     HeapFree(GetProcessHeap(), 0, wined3d_elements);
 
     if (FAILED(hr)) {
         ERR("(%p) : IWineD3DDevice_CreateVertexDeclaration call failed\n", This);
+        HeapFree(GetProcessHeap(), 0, object->elements);
         HeapFree(GetProcessHeap(), 0, object);
     } else {
         *decl_ptr = (IDirect3DVertexDeclaration8 *)object;
diff --git a/dlls/d3d8/vertexdeclaration.c b/dlls/d3d8/vertexdeclaration.c
index afe9ff1..f2e5d57 100644
--- a/dlls/d3d8/vertexdeclaration.c
+++ b/dlls/d3d8/vertexdeclaration.c
@@ -62,6 +62,7 @@ static ULONG WINAPI IDirect3DVertexDeclaration8Impl_Release(IDirect3DVertexDecla
 
     if (!ref_count) {
         IWineD3DVertexDeclaration_Release(This->wined3d_vertex_declaration);
+        HeapFree(GetProcessHeap(), 0, This->elements);
         HeapFree(GetProcessHeap(), 0, This);
     }
 
@@ -271,7 +272,7 @@ static const wined3d_usage_t wined3d_usage_lookup[] = {
 };
 
 /* TODO: find out where rhw (or positionT) is for declaration8 */
-size_t convert_to_wined3d_declaration(const DWORD *d3d8_elements, WINED3DVERTEXELEMENT **wined3d_elements)
+size_t convert_to_wined3d_declaration(const DWORD *d3d8_elements, DWORD *d3d8_elements_size, WINED3DVERTEXELEMENT **wined3d_elements)
 {
     const DWORD *token = d3d8_elements;
     WINED3DVERTEXELEMENT *element;
@@ -326,6 +327,8 @@ size_t convert_to_wined3d_declaration(const DWORD *d3d8_elements, WINED3DVERTEXE
     element->Stream = 0xFF;
     element->Type = WINED3DDECLTYPE_UNUSED;
 
+    *d3d8_elements_size = (++token - d3d8_elements) * sizeof(DWORD);
+
     return element_count;
 }
 




More information about the wine-cvs mailing list