Stefan Dösinger : wined3d: Determine used streams at vdecl creation.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Aug 8 08:59:19 CDT 2007
Module: wine
Branch: master
Commit: 06e51c21e1fce91079a7d6bd3e2621d687522ba3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=06e51c21e1fce91079a7d6bd3e2621d687522ba3
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri Aug 3 19:53:25 2007 +0200
wined3d: Determine used streams at vdecl creation.
---
dlls/wined3d/drawprim.c | 13 +++----------
dlls/wined3d/vertexdeclaration.c | 23 ++++++++++++++++++++++-
dlls/wined3d/wined3d_private.h | 3 +++
3 files changed, 28 insertions(+), 11 deletions(-)
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index dc9e761..98cc4ec 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -156,10 +156,8 @@ void primitiveDeclarationConvertToStridedData(
WINED3DVERTEXELEMENT *element;
DWORD stride;
int reg;
- char isPreLoaded[MAX_STREAMS];
- DWORD preLoadStreams[MAX_STREAMS], numPreloadStreams = 0;
-
- memset(isPreLoaded, 0, sizeof(isPreLoaded));
+ DWORD numPreloadStreams = This->stateBlock->streamIsUP ? 0 : vertexDeclaration->num_streams;
+ DWORD *streams = vertexDeclaration->streams;
/* Check for transformed vertices, disable vertex shader if present */
strided->u.s.position_transformed = FALSE;
@@ -191,11 +189,6 @@ void primitiveDeclarationConvertToStridedData(
data = (BYTE *)This->stateBlock->streamSource[element->Stream];
} else {
TRACE("Stream isn't up %d, %p\n", element->Stream, This->stateBlock->streamSource[element->Stream]);
- if(!isPreLoaded[element->Stream]) {
- preLoadStreams[numPreloadStreams] = element->Stream;
- numPreloadStreams++;
- isPreLoaded[element->Stream] = 1;
- }
data = IWineD3DVertexBufferImpl_GetMemory(This->stateBlock->streamSource[element->Stream], 0, &streamVBO);
if(fixup) {
if( streamVBO != 0) *fixup = TRUE;
@@ -242,7 +235,7 @@ void primitiveDeclarationConvertToStridedData(
* once in there.
*/
for(i=0; i < numPreloadStreams; i++) {
- IWineD3DVertexBuffer_PreLoad(This->stateBlock->streamSource[preLoadStreams[i]]);
+ IWineD3DVertexBuffer_PreLoad(This->stateBlock->streamSource[streams[i]]);
}
}
diff --git a/dlls/wined3d/vertexdeclaration.c b/dlls/wined3d/vertexdeclaration.c
index be5d542..2bbca7d 100644
--- a/dlls/wined3d/vertexdeclaration.c
+++ b/dlls/wined3d/vertexdeclaration.c
@@ -120,11 +120,13 @@ static HRESULT WINAPI IWineD3DVertexDeclarationImpl_SetDeclaration(IWineD3DVerte
const WINED3DVERTEXELEMENT *elements, size_t element_count) {
IWineD3DVertexDeclarationImpl *This = (IWineD3DVertexDeclarationImpl *)iface;
HRESULT hr = WINED3D_OK;
+ int i;
+ char isPreLoaded[MAX_STREAMS];
TRACE("(%p) : d3d version %d\n", This, ((IWineD3DImpl *)This->wineD3DDevice->wineD3D)->dxVersion);
+ memset(isPreLoaded, 0, sizeof(isPreLoaded));
if (TRACE_ON(d3d_decl)) {
- int i;
for (i = 0; i < element_count; ++i) {
dump_wined3dvertexelement(elements+i);
}
@@ -139,6 +141,25 @@ static HRESULT WINAPI IWineD3DVertexDeclarationImpl_SetDeclaration(IWineD3DVerte
CopyMemory(This->pDeclarationWine, elements, sizeof(WINED3DVERTEXELEMENT) * element_count);
}
+ /* Do some static analysis on the elements to make reading the declaration more comfortable
+ * for the drawing code
+ *
+ * First, find the Streams used in the declaration. The vertex buffers have to be loaded
+ * when drawing.
+ */
+ This->num_streams = 0;
+ for (i = 0; i < element_count; ++i) {
+
+ /* Filter tesselation pseudo streams*/
+ if(This->pDeclarationWine[i].Stream >= MAX_STREAMS) continue;
+
+ if(!isPreLoaded[This->pDeclarationWine[i].Stream]) {
+ This->streams[This->num_streams] = This->pDeclarationWine[i].Stream;
+ This->num_streams++;
+ isPreLoaded[This->pDeclarationWine[i].Stream] = 1;
+ }
+ }
+
TRACE("Returning\n");
return hr;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 548c337..240dca5 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1225,6 +1225,9 @@ typedef struct IWineD3DVertexDeclarationImpl {
WINED3DVERTEXELEMENT *pDeclarationWine;
UINT declarationWNumElements;
+
+ DWORD streams[MAX_STREAMS];
+ UINT num_streams;
} IWineD3DVertexDeclarationImpl;
extern const IWineD3DVertexDeclarationVtbl IWineD3DVertexDeclaration_Vtbl;
More information about the wine-cvs
mailing list