Stefan Dösinger : wined3d: Put the decoded strided data structure into the device.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jan 2 06:45:57 CST 2007


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

Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date:   Tue Jan  2 00:21:26 2007 +0100

wined3d: Put the decoded strided data structure into the device.

---

 dlls/wined3d/drawprim.c        |   35 ++++++++++++-----------------------
 dlls/wined3d/wined3d_private.h |    3 +++
 2 files changed, 15 insertions(+), 23 deletions(-)

diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 7e897f1..63e1cae 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -1947,7 +1947,6 @@ void drawPrimitive(IWineD3DDevice *iface
     IWineD3DDeviceImpl           *This = (IWineD3DDeviceImpl *)iface;
     BOOL                          useVertexShaderFunction = FALSE;
     BOOL                          usePixelShaderFunction = FALSE;
-    WineDirect3DVertexStridedData *dataLocations;
     IWineD3DSwapChainImpl         *swapchain;
     int                           i;
     BOOL                          fixup = FALSE;
@@ -2002,8 +2001,8 @@ void drawPrimitive(IWineD3DDevice *iface
         /* Note: this is a ddraw fixed-function code path */
 
         TRACE("================ Strided Input ===================\n");
-        dataLocations = DrawPrimStrideData;
-        drawPrimitiveTraceDataLocations(dataLocations);
+		memcpy(&This->strided_streams, DrawPrimStrideData, sizeof(This->strided_streams));
+        drawPrimitiveTraceDataLocations(&This->strided_streams);
         fixup = FALSE;
     }
 
@@ -2015,17 +2014,13 @@ void drawPrimitive(IWineD3DDevice *iface
          * don't set any declaration at all */
 
         TRACE("================ Vertex Declaration  ===================\n");
-        dataLocations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*dataLocations));
-        if(!dataLocations) {
-            ERR("Out of memory!\n");
-            return;
-        }
+        memset(&This->strided_streams, 0, sizeof(This->strided_streams));
 
         if (This->stateBlock->vertexDecl != NULL ||
-            ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->vertexDeclaration != NULL)            
+            ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->vertexDeclaration != NULL)
 
-            primitiveDeclarationConvertToStridedData(iface, useVertexShaderFunction, 
-                dataLocations, StartVertexIndex, &fixup);
+            primitiveDeclarationConvertToStridedData(iface, useVertexShaderFunction,
+                &This->strided_streams, StartVertexIndex, &fixup);
 
     } else {
 
@@ -2034,20 +2029,16 @@ void drawPrimitive(IWineD3DDevice *iface
          * It will not work properly for shaders. */
 
         TRACE("================ FVF ===================\n");
-        dataLocations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*dataLocations));
-        if(!dataLocations) {
-            ERR("Out of memory!\n");
-            return;
-        }
-        primitiveConvertToStridedData(iface, dataLocations, StartVertexIndex, &fixup);
-        drawPrimitiveTraceDataLocations(dataLocations);
+        memset(&This->strided_streams, 0, sizeof(This->strided_streams));
+        primitiveConvertToStridedData(iface, &This->strided_streams, StartVertexIndex, &fixup);
+        drawPrimitiveTraceDataLocations(&This->strided_streams);
     }
 
     /* Setup transform matrices and sort out */
-    primitiveInitState(iface, dataLocations, useVertexShaderFunction, &lighting_changed, &lighting_original);
+    primitiveInitState(iface, &This->strided_streams, useVertexShaderFunction, &lighting_changed, &lighting_original);
 
     /* Now initialize the materials state */
-    init_materials(iface, (dataLocations->u.s.diffuse.lpData != NULL || dataLocations->u.s.diffuse.VBO != 0));
+    init_materials(iface, (This->strided_streams.u.s.diffuse.lpData != NULL || This->strided_streams.u.s.diffuse.VBO != 0));
 
     {
         GLenum glPrimType;
@@ -2058,12 +2049,10 @@ void drawPrimitive(IWineD3DDevice *iface
             numberOfVertices = calculatedNumberOfindices;
 
         drawPrimitiveDrawStrided(iface, useVertexShaderFunction, usePixelShaderFunction,
-            dataLocations, numberOfVertices, calculatedNumberOfindices, glPrimType,
+            &This->strided_streams, numberOfVertices, calculatedNumberOfindices, glPrimType,
             idxData, idxSize, minIndex, StartIdx, fixup);
     }
 
-    if(!DrawPrimStrideData) HeapFree(GetProcessHeap(), 0, dataLocations);
-
     /* If vertex shaders or no normals, restore previous lighting state */
     if (lighting_changed) {
         if (lighting_original) glEnable(GL_LIGHTING);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index dce5e08..74655d2 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -659,6 +659,9 @@ typedef struct IWineD3DDeviceImpl
     DWORD                     texUnitMap[MAX_SAMPLERS];
     BOOL                      oneToOneTexUnitMap;
 
+    /* Stream source management */
+    WineDirect3DVertexStridedData strided_streams;
+
 } IWineD3DDeviceImpl;
 
 extern const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl;




More information about the wine-cvs mailing list