diff --git a/Source/Core/Common/Src/LinearDiskCache.cpp b/Source/Core/Common/Src/LinearDiskCache.cpp index fbad27f670..96d47a3b26 100644 --- a/Source/Core/Common/Src/LinearDiskCache.cpp +++ b/Source/Core/Common/Src/LinearDiskCache.cpp @@ -22,7 +22,7 @@ static const char ID[4] = {'D', 'C', 'A', 'C'}; // Update this to the current SVN revision every time you change shader generation code. // We don't automatically get this from SVN_REV because that would mean regenerating the // shader cache for every revision, graphics-related or not, which is simply annoying. -const int version = 5597; +const int version = 5653; LinearDiskCache::LinearDiskCache() : file_(NULL), num_entries_(0) { diff --git a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp index afacb65e97..a2a096d0dd 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp @@ -270,37 +270,44 @@ const char *GenerateVertexShaderCode(u32 components, bool D3D) else // from color WRITE(p, "lacc.w = "I_MATERIALS".C%d.w;\n", j); } - - if (color.enablelighting && alpha.enablelighting && (color.GetFullLightMask() != alpha.GetFullLightMask() || color.lightparams != alpha.lightparams)) { - - // both have lighting, except not using the same lights - int mask = 0; // holds already computed lights - - if (color.lightparams == alpha.lightparams && (color.GetFullLightMask() & alpha.GetFullLightMask())) { - // if lights are shared, compute those first - mask = color.GetFullLightMask() & alpha.GetFullLightMask(); - for (int i = 0; i < 8; ++i) { - if (mask & (1<GetVertexStride(); g_nativeVertexFmt->SetupVertexPointers(); + if(bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate) + { + D3D::SetRenderState(D3DRS_STENCILENABLE, TRUE ); + D3D::SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS ); + D3D::SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE ); + D3D::SetRenderState(D3DRS_STENCILREF, 1); + } + Draw(stride); if (bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate) { - DWORD write = 0; - if (!PixelShaderCache::SetShader(true)) - { - DEBUGGER_PAUSE_LOG_AT(NEXT_ERROR,true,{printf("Fail to set pixel shader\n");}); - goto shader_fail; - } + + D3D::SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL ); + D3D::SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_DECR ); - // update alpha only D3D::ChangeRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA); D3D::ChangeRenderState(D3DRS_ALPHABLENDENABLE, false); - - Draw(stride); - + D3D::ChangeRenderState(D3DRS_ZWRITEENABLE, false); + D3D::drawClearQuad((bpmem.dstalpha.hex & 0xff)<<24,0.0f,PixelShaderCache::GetClearProgram(),VertexShaderCache::GetClearVertexShader()); + D3D::RefreshRenderState(D3DRS_ZWRITEENABLE); D3D::RefreshRenderState(D3DRS_COLORWRITEENABLE); D3D::RefreshRenderState(D3DRS_ALPHABLENDENABLE); + D3D::SetRenderState(D3DRS_STENCILENABLE, false ); } DEBUGGER_PAUSE_AT(NEXT_FLUSH,true);