[2/10] WineD3D: Pass the user pointer strided structure via the device implementation

Stefan Dösinger stefandoesinger at gmx.at
Tue Jan 2 14:13:28 CST 2007


The vertexdeclaration state will need it, and it can't access the  
parameters passed to drawPrimitive().

It is argueable if this belongs to the device or the stateblock.  
WineD3D unsets it after drawing, so it is not really a permanent  
state, it doesn't have a setter or a getter, so I put it into the  
device.
-------------- next part --------------
From b74aa634f3aefb4c3ec437c9e8a1db7158edfe77 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Stefan_D=C3=B6singer?= <stefan at imac.local>
Date: Tue, 2 Jan 2007 19:08:39 +0100
Subject: [PATCH] WineD3D: Pass the user pointer strided information via the device implementation

---
 dlls/wined3d/device.c          |   12 +++++++-----
 dlls/wined3d/drawprim.c        |    7 +++----
 dlls/wined3d/wined3d_private.h |    4 ++--
 3 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index d5a1f1e..29279a0 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4699,7 +4699,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl
     if(StartVertex - This->stateBlock->baseVertexIndex < 0) ERR("Drawing negative\n");
     /* Account for the loading offset due to index buffers. Instead of reloading all sources correct it with the startvertex parameter */
     drawPrimitive(iface, PrimitiveType, PrimitiveCount, StartVertex - This->stateBlock->baseVertexIndex, 0/* NumVertices */, -1 /* indxStart */,
-                  0 /* indxSize */, NULL /* indxData */, 0 /* minIndex */, NULL);
+                  0 /* indxSize */, NULL /* indxData */, 0 /* minIndex */);
     return WINED3D_OK;
 }
 
@@ -4728,7 +4728,7 @@ static HRESULT  WINAPI  IWineD3DDeviceIm
     }
 
     drawPrimitive(iface, PrimitiveType, primCount, 0, NumVertices, startIndex,
-                   idxStride, ((IWineD3DIndexBufferImpl *) pIB)->resource.allocatedMemory, minIndex, NULL);
+                   idxStride, ((IWineD3DIndexBufferImpl *) pIB)->resource.allocatedMemory, minIndex);
 
     return WINED3D_OK;
 }
@@ -4753,7 +4753,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl
     This->stateBlock->streamIsUP = TRUE;
 
     drawPrimitive(iface, PrimitiveType, PrimitiveCount, -This->stateBlock->baseVertexIndex /* start vertex */, 0  /* NumVertices */,
-                  0 /* indxStart*/, 0 /* indxSize*/, NULL /* indxData */, 0 /* indxMin */, NULL);
+                  0 /* indxStart*/, 0 /* indxSize*/, NULL /* indxData */, 0 /* indxMin */);
 
     /* MSDN specifies stream zero settings must be set to NULL */
     This->stateBlock->streamStride[0] = 0;
@@ -4800,7 +4800,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl
     /* Set to 0 as per msdn. Do it now due to the stream source loading during drawPrimitive */
     This->stateBlock->baseVertexIndex = 0;
 
-    drawPrimitive(iface, PrimitiveType, PrimitiveCount, 0 /* vertexStart */, NumVertices, 0 /* indxStart */, idxStride, pIndexData, MinVertexIndex, NULL);
+    drawPrimitive(iface, PrimitiveType, PrimitiveCount, 0 /* vertexStart */, NumVertices, 0 /* indxStart */, idxStride, pIndexData, MinVertexIndex);
 
     /* MSDN specifies stream zero settings and index buffer must be set to NULL */
     This->stateBlock->streamSource[0] = NULL;
@@ -4819,7 +4819,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl
      */
     IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VDECL);
     This->stateBlock->baseVertexIndex = 0;
-    drawPrimitive(iface, PrimitiveType, PrimitiveCount, 0, 0, 0, 0, NULL, 0, DrawPrimStrideData);
+    This->up_strided = DrawPrimStrideData;
+    drawPrimitive(iface, PrimitiveType, PrimitiveCount, 0, 0, 0, 0, NULL, 0);
+    This->up_strided = NULL;
     return WINED3D_OK;
 }
  /* Yet another way to update a texture, some apps use this to load default textures instead of using surface/texture lock/unlock */
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 4e39ae1..23c2d88 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -1936,8 +1936,7 @@ void drawPrimitive(IWineD3DDevice *iface
                    long  StartIdx,
                    short idxSize,
                    const void *idxData,
-                   int   minIndex,
-                   WineDirect3DVertexStridedData *DrawPrimStrideData) {
+                   int   minIndex) {
 
     IWineD3DDeviceImpl           *This = (IWineD3DDeviceImpl *)iface;
     BOOL                          useVertexShaderFunction = FALSE;
@@ -1991,12 +1990,12 @@ void drawPrimitive(IWineD3DDevice *iface
     }
     This->depth_copy_state = WINED3D_DCS_INITIAL;
 
-    if(DrawPrimStrideData) {
+    if(This->up_strided) {
 
         /* Note: this is a ddraw fixed-function code path */
 
         TRACE("================ Strided Input ===================\n");
-		memcpy(&This->strided_streams, DrawPrimStrideData, sizeof(This->strided_streams));
+		memcpy(&This->strided_streams, This->up_strided, sizeof(This->strided_streams));
         drawPrimitiveTraceDataLocations(&This->strided_streams);
         fixup = FALSE;
     }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 37f4664..9ca13c1 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -382,8 +382,7 @@ void drawPrimitive(IWineD3DDevice *iface
                     long  StartIdx,
                     short idxBytes,
                     const void *idxData,
-                    int   minIndex,
-                    WineDirect3DVertexStridedData *DrawPrimStrideData);
+                    int   minIndex);
 
 void primitiveConvertToStridedData(IWineD3DDevice *iface, WineDirect3DVertexStridedData *strided, BOOL *fixup);
 
@@ -669,6 +668,7 @@ #define                         NEEDS_DI
 
     /* Stream source management */
     WineDirect3DVertexStridedData strided_streams;
+    WineDirect3DVertexStridedData *up_strided;
 
 } IWineD3DDeviceImpl;
 
-- 
1.4.2.4



More information about the wine-patches mailing list