From 98bc83be7c1b24fdbebcd0b6e01cf4b936478a95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Tue, 14 Aug 2007 02:31:10 +0200 Subject: [PATCH] wined3d: Fall back to drawStridedSlow if fog coords are used. --- dlls/wined3d/drawprim.c | 19 ++++++++++++++----- dlls/wined3d/state.c | 31 +++++++++++++++++++++---------- dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index 0d4f1e27146..3a47912aa08 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -1050,13 +1050,22 @@ void drawPrimitive(IWineD3DDevice *iface, if (numberOfVertices == 0 ) numberOfVertices = calculatedNumberOfindices; - if(!This->strided_streams.u.s.position_transformed && !use_vs(This)) { - if(This->activeContext->num_untracked_materials && - This->stateBlock->renderState[WINED3DRS_LIGHTING]) { - IWineD3DVertexBufferImpl *vb; - + if(!use_vs(This)) { + if(!This->strided_streams.u.s.position_transformed && This->activeContext->num_untracked_materials && + This->stateBlock->renderState[WINED3DRS_LIGHTING]) { FIXME("Using software emulation because not all material properties could be tracked\n"); emulation = TRUE; + } + else if(This->activeContext->fog_coord && This->stateBlock->renderState[WINED3DRS_FOGENABLE]) { + /* Either write a pipeline replacement shader or convert the specular alpha from unsigned byte + * to a float in the vertex buffer + */ + FIXME("Using software emulation because manual fog coordinates are provided\n"); + emulation = TRUE; + } + + if(emulation) { + IWineD3DVertexBufferImpl *vb; strided = &stridedlcl; memcpy(&stridedlcl, &This->strided_streams, sizeof(stridedlcl)); diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index fb060c5104a..20a7fa56e3f 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -803,9 +803,10 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo fogend = 0.0; } - if(GL_SUPPORT(EXT_FOG_COORD)) { + if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) { glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT"); + context->fog_coord = FALSE; } context->last_was_foggy_shader = TRUE; } @@ -843,9 +844,10 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo default: FIXME("Unexpected WINED3DRS_FOGVERTEXMODE %d\n", stateblock->renderState[WINED3DRS_FOGVERTEXMODE]); } - if(GL_SUPPORT(EXT_FOG_COORD)) { + if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) { glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT"); + context->fog_coord = FALSE; } } /* DX 7 sdk: "If both render states(vertex and table fog) are set to valid modes, @@ -862,9 +864,10 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo if(!context->last_was_rhw) { glFogi(GL_FOG_MODE, GL_EXP); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); - if(GL_SUPPORT(EXT_FOG_COORD)) { + if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) { glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT"); + context->fog_coord = FALSE; } break; } @@ -873,9 +876,10 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo if(!context->last_was_rhw) { glFogi(GL_FOG_MODE, GL_EXP2); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2"); - if(GL_SUPPORT(EXT_FOG_COORD)) { + if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) { glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT"); + context->fog_coord = FALSE; } break; } @@ -884,9 +888,10 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo if(!context->last_was_rhw) { glFogi(GL_FOG_MODE, GL_LINEAR); checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR"); - if(GL_SUPPORT(EXT_FOG_COORD)) { + if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) { glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT"); + context->fog_coord = FALSE; } break; } @@ -897,8 +902,11 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo * Same happens with Vertexfog on transformed vertices */ if(GL_SUPPORT(EXT_FOG_COORD)) { - glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT); - checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT)\n"); + if(context->fog_coord == FALSE) { + glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT); + checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT)\n"); + context->fog_coord = TRUE; + } glFogi(GL_FOG_MODE, GL_LINEAR); checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR)"); fogstart = 0xff; @@ -920,27 +928,30 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo case WINED3DFOG_EXP: glFogi(GL_FOG_MODE, GL_EXP); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); - if(GL_SUPPORT(EXT_FOG_COORD)) { + if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) { glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT"); + context->fog_coord = FALSE; } break; case WINED3DFOG_EXP2: glFogi(GL_FOG_MODE, GL_EXP2); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2"); - if(GL_SUPPORT(EXT_FOG_COORD)) { + if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) { glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT"); + context->fog_coord = FALSE; } break; case WINED3DFOG_LINEAR: glFogi(GL_FOG_MODE, GL_LINEAR); checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR"); - if(GL_SUPPORT(EXT_FOG_COORD)) { + if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) { glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT"); + context->fog_coord = FALSE; } break; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 29bd24d42c5..73d13cca698 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -518,6 +518,7 @@ struct WineD3DContext { GLenum untracked_materials[2]; BOOL last_was_blit, last_was_ckey; char texShaderBumpMap; + BOOL fog_coord; /* The actual opengl context */ HGLRC glCtx;