Stefan Dösinger : wined3d: Break the lighting state out of the vertex decl.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 3 05:37:32 CST 2007


Module: wine
Branch: master
Commit: a0ff9826ad8b6be47f6e3614a72754a93f80e8fb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a0ff9826ad8b6be47f6e3614a72754a93f80e8fb

Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date:   Tue Jan  2 22:49:17 2007 +0100

wined3d: Break the lighting state out of the vertex decl.

---

 dlls/wined3d/state.c |   37 ++++++++++++++++++-------------------
 1 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index ee56be2..e8a594e 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -71,15 +71,23 @@ static void state_fillmode(DWORD state,
     }
 }
 
-#if 0
-/* if 0ed because it will be revived later */
 static void state_lighting(DWORD state, IWineD3DStateBlockImpl *stateblock) {
+    BOOL normals;
 
-    /* TODO: Lighting is only enabled if Vertex normals are passed by the application,
-     * so merge the lighting render state with the vertex declaration once it is available
+    /* Lighting is only enabled if Vertex normals are passed by the application,
+     * but lighting does not affect the stream sources, so it is not grouped for performance reasons.
+     * This state reads the decoded vertex decl, so if it is dirty don't do anything. The
+     * vertex declaration appplying function calls this function for updating
      */
 
-    if (stateblock->renderState[WINED3DRS_LIGHTING]) {
+	if(isStateDirty(stateblock->wineD3DDevice, STATE_VDECL)) {
+		return;
+	}
+
+    normals = stateblock->wineD3DDevice->strided_streams.u.s.normal.lpData != NULL ||
+              stateblock->wineD3DDevice->strided_streams.u.s.normal.VBO != 0;
+
+    if (stateblock->renderState[WINED3DRS_LIGHTING] && normals) {
         glEnable(GL_LIGHTING);
         checkGLcall("glEnable GL_LIGHTING");
     } else {
@@ -87,7 +95,6 @@ static void state_lighting(DWORD state,
         checkGLcall("glDisable GL_LIGHTING");
     }
 }
-#endif
 
 static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock) {
     switch ((WINED3DZBUFFERTYPE) stateblock->renderState[WINED3DRS_ZENABLE]) {
@@ -1895,7 +1902,7 @@ static const GLfloat invymat[16] = {
 
 static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock) {
     BOOL useVertexShaderFunction = FALSE, updateFog = FALSE;
-    BOOL transformed, lit;
+    BOOL transformed;
     /* Some stuff is in the device until we have per context tracking */
     IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
     BOOL wasrhw = device->last_was_rhw;
@@ -1951,22 +1958,14 @@ static void vertexdeclaration(DWORD stat
     transformed = ((device->strided_streams.u.s.position.lpData != NULL ||
                     device->strided_streams.u.s.position.VBO != 0) &&
                     device->strided_streams.u.s.position_transformed) ? TRUE : FALSE;
-    lit = device->strided_streams.u.s.normal.lpData == NULL &&
-          device->strided_streams.u.s.normal.VBO == 0;
 
     if(transformed != device->last_was_rhw && !useVertexShaderFunction) {
         updateFog = TRUE;
     }
 
-    /* TODO: The vertex declaration changes lighting, but lighting doesn't affect the vertex declaration and the
-     * stream sources. This can be handled nicer
-     */
-    if(stateblock->renderState[WINED3DRS_LIGHTING] && !lit) {
-        glEnable(GL_LIGHTING);
-        checkGLcall("glEnable(GL_LIGHTING)");
-    } else {
-        glDisable(GL_LIGHTING);
-        checkGLcall("glDisable(GL_LIGHTING");
+    /* Reapply lighting if it is not sheduled for reapplication already */
+    if(!isStateDirty(device, STATE_RENDER(WINED3DRS_LIGHTING))) {
+        state_lighting(STATE_RENDER(WINED3DRS_LIGHTING), stateblock);
     }
 
     if (!useVertexShaderFunction && transformed) {
@@ -2175,7 +2174,7 @@ const struct StateEntry StateTable[] =
     { /*134, WINED3DRS_WRAP6                        */      STATE_RENDER(WINED3DRS_WRAP0),                      state_wrap          },
     { /*135, WINED3DRS_WRAP7                        */      STATE_RENDER(WINED3DRS_WRAP0),                      state_wrap          },
     { /*136, WINED3DRS_CLIPPING                     */      STATE_RENDER(WINED3DRS_CLIPPING),                   state_clipping      },
-    { /*137, WINED3DRS_LIGHTING                     */      STATE_VDECL,                                        vertexdeclaration   },
+    { /*137, WINED3DRS_LIGHTING                     */      STATE_RENDER(WINED3DRS_LIGHTING),                   state_lighting      },
     { /*138, WINED3DRS_EXTENTS                      */      STATE_RENDER(WINED3DRS_EXTENTS),                    state_extents       },
     { /*139, WINED3DRS_AMBIENT                      */      STATE_RENDER(WINED3DRS_AMBIENT),                    state_ambient       },
     { /*140, WINED3DRS_FOGVERTEXMODE                */      STATE_RENDER(WINED3DRS_FOGENABLE),                  state_fog           },




More information about the wine-cvs mailing list