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