summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon
diff options
context:
space:
mode:
authorRodolfo Osvaldo Bogado <rodolfoosvaldobogado@gmail.com>2010-06-12 12:36:33 +0000
committerRodolfo Osvaldo Bogado <rodolfoosvaldobogado@gmail.com>2010-06-12 12:36:33 +0000
commitce3c2700e7fd4226905b2ed652aded96d44eebd2 (patch)
tree551eda54f77493bd865723fbe196cbcf755ed0c1 /Source/Core/VideoCommon
parent7efbc879e544cba7f205b3eeaeff050f46fd9607 (diff)
This commit is separate in two parts:
Fix: fix for lighting equations , that must improve lighting in a lot of games ( test smg :) ) experimental speedup: implemented alpha pass using stencil buffer instead of a duplicate shader. i recommend to test this well as i dono if will work the same way in all the systems. i my system it gives a nice 2-5 fps improvement. if it brings problems in any system or game will revert asap. enjoy git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5653 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon')
-rw-r--r--Source/Core/VideoCommon/Src/VertexShaderGen.cpp55
1 files changed, 31 insertions, 24 deletions
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<<i))
- p = GenerateLightShader(p, i, color, "lacc", 3);
- }
- }
-
+
+ if(color.enablelighting && alpha.enablelighting)
+ {
+ // both have lighting, test if they use the same ligths
+ int mask = 0;
+ if(color.lightparams == alpha.lightparams)
+ {
+ mask = color.GetFullLightMask() & alpha.GetFullLightMask();
+ if(mask)
+ {
+ for (int i = 0; i < 8; ++i)
+ {
+ if (mask & (1<<i))
+ p = GenerateLightShader(p, i, color, "lacc", 3);
+ }
+ }
+ }
// no shared lights
- for (int i = 0; i < 8; ++i) {
+ for (int i = 0; i < 8; ++i)
+ {
if (!(mask&(1<<i)) && (color.GetFullLightMask() & (1<<i)) )
p = GenerateLightShader(p, i, color, "lacc", 1);
if (!(mask&(1<<i)) && (alpha.GetFullLightMask() & (1<<i)) )
p = GenerateLightShader(p, i, alpha, "lacc", 2);
}
- }
- else if (color.enablelighting || alpha.enablelighting) {
- // either one is enabled
- int coloralpha = (int)color.enablelighting|((int)alpha.enablelighting<<1);
- for (int i = 0; i < 8; ++i) {
- if (color.GetFullLightMask() & (1<<i) )
- p = GenerateLightShader(p, i, color.enablelighting?color:alpha, "lacc", coloralpha);
+ }
+ else if (color.enablelighting || alpha.enablelighting)
+ {
+ //ligths are disabled in one channel so proccess only te active
+ LitChannel workingchannel = color.enablelighting ? color : alpha;
+ int coloralpha = color.enablelighting ? 1 : 2;
+ for (int i = 0; i < 8; ++i)
+ {
+ if (workingchannel.GetFullLightMask() & (1<<i))
+ p = GenerateLightShader(p, i, workingchannel, "lacc", coloralpha);
+
}
- }
+ }
if (color.enablelighting != alpha.enablelighting) {
if (color.enablelighting)