Stefan Dösinger : wined3d: Move decoding the vertex declaration to the vertexshader state handler.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jan 3 05:37:29 CST 2007
Module: wine
Branch: master
Commit: 438c17284138776edbbe9196364ae620bbf01adb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=438c17284138776edbbe9196364ae620bbf01adb
Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date: Tue Jan 2 21:31:08 2007 +0100
wined3d: Move decoding the vertex declaration to the vertexshader state handler.
---
dlls/wined3d/drawprim.c | 41 +----------------------------------
dlls/wined3d/state.c | 45 ++++++++++++++++++++++++++++++++++++++-
dlls/wined3d/wined3d_private.h | 1 +
3 files changed, 46 insertions(+), 41 deletions(-)
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 5dfc15b..6bd2854 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -1943,7 +1943,7 @@ void drawPrimitive(IWineD3DDevice *iface
BOOL usePixelShaderFunction = FALSE;
IWineD3DSwapChainImpl *swapchain;
int i;
- BOOL fixup = FALSE;
+ BOOL fixup;
DWORD dirtyState, idx;
BYTE shift;
@@ -1980,6 +1980,7 @@ void drawPrimitive(IWineD3DDevice *iface
StateTable[dirtyState].apply(dirtyState, This->stateBlock);
}
This->numDirtyEntries = 0; /* This makes the whole list clean */
+ fixup = This->streamFixedUp;
if (TRACE_ON(d3d_draw) && wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
check_fbo_status(iface);
@@ -1990,44 +1991,6 @@ void drawPrimitive(IWineD3DDevice *iface
}
This->depth_copy_state = WINED3D_DCS_INITIAL;
- if(This->up_strided) {
-
- /* Note: this is a ddraw fixed-function code path */
-
- TRACE("================ Strided Input ===================\n");
- memcpy(&This->strided_streams, This->up_strided, sizeof(This->strided_streams));
- drawPrimitiveTraceDataLocations(&This->strided_streams);
- fixup = FALSE;
- }
-
- else if (This->stateBlock->vertexDecl || This->stateBlock->vertexShader) {
-
- /* Note: This is a fixed function or shader codepath.
- * This means it must handle both types of strided data.
- * Shaders must go through here to zero the strided data, even if they
- * don't set any declaration at all */
-
- TRACE("================ Vertex Declaration ===================\n");
- memset(&This->strided_streams, 0, sizeof(This->strided_streams));
-
- if (This->stateBlock->vertexDecl != NULL ||
- ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->vertexDeclaration != NULL)
-
- primitiveDeclarationConvertToStridedData(iface, useVertexShaderFunction,
- &This->strided_streams, &fixup);
-
- } else {
-
- /* Note: This codepath is not reachable from d3d9 (see fvf->decl9 conversion)
- * It is reachable through d3d8, but only for fixed-function.
- * It will not work properly for shaders. */
-
- TRACE("================ FVF ===================\n");
- memset(&This->strided_streams, 0, sizeof(This->strided_streams));
- primitiveConvertToStridedData(iface, &This->strided_streams, &fixup);
- drawPrimitiveTraceDataLocations(&This->strided_streams);
- }
-
/* Setup transform matrices and sort out */
primitiveInitState(iface, &This->strided_streams, useVertexShaderFunction, &lighting_changed, &lighting_original);
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index a8419a7..f68546b 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -1857,8 +1857,49 @@ static void transform_worldex(DWORD stat
WARN("World matrix 1 - 255 not supported yet\n");
}
-static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateBlock) {
- TRACE("To be filled later\n");
+static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock) {
+ BOOL useVertexShaderFunction = FALSE;
+ stateblock->wineD3DDevice->streamFixedUp = FALSE;
+
+ /* Shaders can be implemented using ARB_PROGRAM, GLSL, or software -
+ * here simply check whether a shader was set, or the user disabled shaders
+ */
+ if (stateblock->wineD3DDevice->vs_selected_mode != SHADER_NONE && stateblock->vertexShader &&
+ ((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->baseShader.function != NULL)
+ useVertexShaderFunction = TRUE;
+
+ if(stateblock->wineD3DDevice->up_strided) {
+
+ /* Note: this is a ddraw fixed-function code path */
+ TRACE("================ Strided Input ===================\n");
+ memcpy(&stateblock->wineD3DDevice->strided_streams, stateblock->wineD3DDevice->up_strided, sizeof(stateblock->wineD3DDevice->strided_streams));
+ stateblock->wineD3DDevice->streamFixedUp = FALSE;
+ }
+ else if (stateblock->vertexDecl || stateblock->vertexShader) {
+ /* Note: This is a fixed function or shader codepath.
+ * This means it must handle both types of strided data.
+ * Shaders must go through here to zero the strided data, even if they
+ * don't set any declaration at all
+ */
+ TRACE("================ Vertex Declaration ===================\n");
+ memset(&stateblock->wineD3DDevice->strided_streams, 0, sizeof(stateblock->wineD3DDevice->strided_streams));
+
+ if (stateblock->vertexDecl != NULL ||
+ ((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->vertexDeclaration != NULL) {
+
+ primitiveDeclarationConvertToStridedData((IWineD3DDevice *) stateblock->wineD3DDevice, useVertexShaderFunction,
+ &stateblock->wineD3DDevice->strided_streams, &stateblock->wineD3DDevice->streamFixedUp);
+ }
+ } else {
+ /* Note: This codepath is not reachable from d3d9 (see fvf->decl9 conversion)
+ * It is reachable through d3d8, but only for fixed-function.
+ * It will not work properly for shaders.
+ */
+ TRACE("================ FVF ===================\n");
+ memset(&stateblock->wineD3DDevice->strided_streams, 0, sizeof(stateblock->wineD3DDevice->strided_streams));
+ primitiveConvertToStridedData((IWineD3DDevice *) stateblock->wineD3DDevice, &stateblock->wineD3DDevice->strided_streams,
+ &stateblock->wineD3DDevice->streamFixedUp);
+ }
}
const struct StateEntry StateTable[] =
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 9ca13c1..15958f3 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -669,6 +669,7 @@ typedef struct IWineD3DDeviceImpl
/* Stream source management */
WineDirect3DVertexStridedData strided_streams;
WineDirect3DVertexStridedData *up_strided;
+ BOOL streamFixedUp;
} IWineD3DDeviceImpl;
More information about the wine-cvs
mailing list