[10/10] WineD3D: With FVFs only one stream is used

Stefan Dösinger stefan at codeweavers.com
Mon Feb 19 08:26:31 CST 2007


-------------- next part --------------
From 53839ceb8621d67ef5766b54c5f8c7446b36c32c Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Mon, 19 Feb 2007 00:56:14 +0100
Subject: [PATCH] WineD3D: With FVFs only one stream is used

Using multiple streams with the fvf path seems to be a leftover from
d3d8 times when a fvf was a shader handle and shaders could contain
vertex declarations reading from multiple streams. Nowadays in wined3d
the shader case of d3d8 is handled in the vertex declaration path
---
 dlls/wined3d/drawprim.c |   83 +++++++++++++---------------------------------
 1 files changed, 24 insertions(+), 59 deletions(-)

diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 7cf6877..9162c01 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -365,74 +365,39 @@ void primitiveConvertFVFtoOffset(DWORD thisFVF, DWORD stride, BYTE *data, WineDi
 }
 
 void primitiveConvertToStridedData(IWineD3DDevice *iface, WineDirect3DVertexStridedData *strided, BOOL *fixup) {
-
-    short         LoopThroughTo = 0;
-    short         nStream;
+    IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
     GLint         streamVBO = 0;
-    DWORD preLoadStreams[MAX_STREAMS], numPreloadStreams = 0;
-
-    IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
-
-    /* OK, Now to setup the data locations
-       For the non-created vertex shaders, the VertexShader var holds the real
-          FVF and only stream 0 matters
-       For the created vertex shaders, there is an FVF per stream              */
-    if (!This->stateBlock->streamIsUP && !(This->stateBlock->vertexShader == NULL)) {
-        LoopThroughTo = MAX_STREAMS;
+    DWORD  stride  = This->stateBlock->streamStride[0];
+    BYTE  *data    = NULL;
+    DWORD  thisFVF = 0;
+
+    /* Retrieve appropriate FVF */
+    thisFVF = This->stateBlock->fvf;
+    /* Handle memory passed directly as well as vertex buffers */
+    if (This->stateBlock->streamIsUP) {
+        streamVBO = 0;
+        data    = (BYTE *)This->stateBlock->streamSource[0];
     } else {
-        LoopThroughTo = 1;
+        /* The for loop should iterate through here only once per stream, so we don't need magic to prevent double loading
+         * buffers
+         */
+        data = IWineD3DVertexBufferImpl_GetMemory(This->stateBlock->streamSource[0], 0, &streamVBO);
+        if(fixup) {
+            if(streamVBO != 0 ) *fixup = TRUE;
+        }
     }
+    VTRACE(("FVF for stream 0 is %lx\n", thisFVF));
 
-    /* Work through stream by stream */
-    for (nStream=0; nStream<LoopThroughTo; ++nStream) {
-        DWORD  stride  = This->stateBlock->streamStride[nStream];
-        BYTE  *data    = NULL;
-        DWORD  thisFVF = 0;
-
-        /* Skip empty streams */
-        if (This->stateBlock->streamSource[nStream] == NULL) continue;
-
-        /* Retrieve appropriate FVF */
-        if (LoopThroughTo == 1) { /* Use FVF, not vertex shader */
-            thisFVF = This->stateBlock->fvf;
-            /* Handle memory passed directly as well as vertex buffers */
-            if (This->stateBlock->streamIsUP) {
-                streamVBO = 0;
-                data    = (BYTE *)This->stateBlock->streamSource[nStream];
-            } else {
-                /* The for loop should iterate through here only once per stream, so we don't need magic to prevent double loading
-                 * buffers
-                 */
-                preLoadStreams[numPreloadStreams] = nStream;
-                numPreloadStreams++;
-                /* GetMemory binds the VBO */
-                data = IWineD3DVertexBufferImpl_GetMemory(This->stateBlock->streamSource[nStream], 0, &streamVBO);
-                if(fixup) {
-                    if(streamVBO != 0 ) *fixup = TRUE;
-                }
-            }
-        } else {
-#if 0 /* TODO: Vertex shader support */
-            thisFVF = This->stateBlock->vertexShaderDecl->fvf[nStream];
-            data    = IWineD3DVertexBufferImpl_GetMemory(This->stateBlock->streamSource[nStream], 0);
-#endif
-        }
-        VTRACE(("FVF for stream %d is %lx\n", nStream, thisFVF));
-        if (thisFVF == 0) continue;
+    /* Now convert the stream into pointers */
+    primitiveConvertFVFtoOffset(thisFVF, stride, data, strided, streamVBO, 0);
 
-        /* Now convert the stream into pointers */
-        primitiveConvertFVFtoOffset(thisFVF, stride, data, strided, streamVBO, nStream);
-    }
-    /* Now call PreLoad on all the vertex buffers. In the very rare case
+    /* Now call PreLoad on the vertex buffer. In the very rare case
      * that the buffers stopps converting PreLoad will dirtify the VDECL again.
      * The vertex buffer can now use the strided structure in the device instead of finding its
      * own again.
-     *
-     * NULL streams won't be recorded in the array, UP streams won't be either. A stream is only
-     * once in there.
      */
-    for(nStream=0; nStream < numPreloadStreams; nStream++) {
-            IWineD3DVertexBuffer_PreLoad(This->stateBlock->streamSource[preLoadStreams[nStream]]);
+    if(!This->stateBlock->streamIsUP) {
+        IWineD3DVertexBuffer_PreLoad(This->stateBlock->streamSource[0]);
     }
 }
 
-- 
1.4.4.3



More information about the wine-patches mailing list