[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