summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/PixelShaderManager.cpp
diff options
context:
space:
mode:
authorSonicadvance1 <sonicadvance1@gmail.com>2011-06-20 05:48:12 +0000
committerSonicadvance1 <sonicadvance1@gmail.com>2011-06-20 05:48:12 +0000
commit693f276a68d7aae5977cc6704a095a573355e75a (patch)
tree315ba84dc74a566d57f48913c100370ec62a6ce2 /Source/Core/VideoCommon/Src/PixelShaderManager.cpp
parentbc416a552e8a80521cbb93aa674fcdc29b2cd400 (diff)
Small update for disabled Fog for older hardware that fails to divide by zero in shaders
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7612 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon/Src/PixelShaderManager.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/PixelShaderManager.cpp60
1 files changed, 31 insertions, 29 deletions
diff --git a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp
index dad361591a..c8b8be412e 100644
--- a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp
+++ b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp
@@ -85,43 +85,43 @@ void PixelShaderManager::Shutdown()
void PixelShaderManager::SetConstants()
{
- for (int i = 0; i < 2; ++i)
+ for (int i = 0; i < 2; ++i)
{
- if (s_nColorsChanged[i])
+ if (s_nColorsChanged[i])
{
int baseind = i ? C_KCOLORS : C_COLORS;
- for (int j = 0; j < 4; ++j)
+ for (int j = 0; j < 4; ++j)
{
- if (s_nColorsChanged[i] & (1 << j))
+ if (s_nColorsChanged[i] & (1 << j))
SetPSConstant4fv(baseind+j, &lastRGBAfull[i][j][0]);
}
s_nColorsChanged[i] = 0;
}
}
- if (s_nTexDimsChanged)
+ if (s_nTexDimsChanged)
{
- for (int i = 0; i < 8; ++i)
+ for (int i = 0; i < 8; ++i)
{
- if (s_nTexDimsChanged & (1<<i))
- SetPSTextureDims(i);
+ if (s_nTexDimsChanged & (1<<i))
+ SetPSTextureDims(i);
}
s_nTexDimsChanged = 0;
}
- if (s_bAlphaChanged)
+ if (s_bAlphaChanged)
{
SetPSConstant4f(C_ALPHA, (lastAlpha&0xff)/255.0f, ((lastAlpha>>8)&0xff)/255.0f, 0, ((lastAlpha>>16)&0xff)/255.0f);
s_bAlphaChanged = false;
}
- if (s_bZTextureTypeChanged)
- {
+ if (s_bZTextureTypeChanged)
+ {
float ftemp[4];
- switch (bpmem.ztex2.type)
+ switch (bpmem.ztex2.type)
{
case 0:
- // 8 bits
+ // 8 bits
ftemp[0] = 0; ftemp[1] = 0; ftemp[2] = 0; ftemp[3] = 255.0f/16777215.0f;
break;
case 1:
@@ -137,7 +137,7 @@ void PixelShaderManager::SetConstants()
s_bZTextureTypeChanged = false;
}
- if (s_bZBiasChanged || s_bDepthRangeChanged)
+ if (s_bZBiasChanged || s_bDepthRangeChanged)
{
// reversed gxsetviewport(xorig, yorig, width, height, nearz, farz)
// [0] = width/2
@@ -153,14 +153,14 @@ void PixelShaderManager::SetConstants()
}
// indirect incoming texture scales
- if (s_nIndTexScaleChanged)
+ if (s_nIndTexScaleChanged)
{
// set as two sets of vec4s, each containing S and T of two ind stages.
float f[8];
-
- if (s_nIndTexScaleChanged & 0x03)
+
+ if (s_nIndTexScaleChanged & 0x03)
{
- for (u32 i = 0; i < 2; ++i)
+ for (u32 i = 0; i < 2; ++i)
{
f[2 * i] = bpmem.texscale[0].getScaleS(i & 1);
f[2 * i + 1] = bpmem.texscale[0].getScaleT(i & 1);
@@ -174,18 +174,18 @@ void PixelShaderManager::SetConstants()
f[2 * i] = bpmem.texscale[1].getScaleS(i & 1);
f[2 * i + 1] = bpmem.texscale[1].getScaleT(i & 1);
PRIM_LOG("tex indscale%d: %f %f\n", i, f[2 * i], f[2 * i + 1]);
- }
+ }
SetPSConstant4fv(C_INDTEXSCALE+1, &f[4]);
}
-
+
s_nIndTexScaleChanged = 0;
}
- if (s_nIndTexMtxChanged)
+ if (s_nIndTexMtxChanged)
{
- for (int i = 0; i < 3; ++i)
+ for (int i = 0; i < 3; ++i)
{
- if (s_nIndTexMtxChanged & (1 << i))
+ if (s_nIndTexMtxChanged & (1 << i))
{
int scale = ((u32)bpmem.indmtx[i].col0.s0 << 0) |
((u32)bpmem.indmtx[i].col1.s1 << 2) |
@@ -215,13 +215,13 @@ void PixelShaderManager::SetConstants()
s_nIndTexMtxChanged = 0;
}
- if (s_bFogColorChanged)
+ if (s_bFogColorChanged)
{
SetPSConstant4f(C_FOG, bpmem.fog.color.r / 255.0f, bpmem.fog.color.g / 255.0f, bpmem.fog.color.b / 255.0f, 0);
s_bFogColorChanged = false;
}
- if (s_bFogParamChanged)
+ if (s_bFogParamChanged)
{
if(!g_ActiveConfig.bDisableFog)
{
@@ -232,9 +232,8 @@ void PixelShaderManager::SetConstants()
SetPSConstant4f(C_FOG + 1, bpmem.fog.a.GetA(), b, bpmem.fog.c_proj_fsel.GetC(), b_shf);
}
else
- {
SetPSConstant4f(C_FOG + 1, 0.0, 1.0, 0.0, 1.0);
- }
+
s_bFogParamChanged = false;
}
@@ -253,7 +252,10 @@ void PixelShaderManager::SetConstants()
// they are the coeficients from the center to th e border of the screen
// so to simplify i use the hi coeficient as K in the shader taking 256 as the scale
SetPSConstant4f(C_FOG + 2, ScreenSpaceCenter, (float)Renderer::EFBToScaledX((int)(2.0f * xfregs.viewport.wd)), bpmem.fogRange.K[4].HI / 256.0f,0.0f);
- }
+ }
+ else
+ SetPSConstant4f(C_FOG + 2, 0.0f, 1.0f, 1.0f, 0.0f); // Need to update these values for older hardware that fails to divide by zero in shaders.
+
s_bFogRangeAdjustChanged = false;
}
@@ -377,7 +379,7 @@ void PixelShaderManager::SetTexDims(int texmapid, u32 width, u32 height, u32 wra
if (lastTexDims[texmapid] != wh)
{
lastTexDims[texmapid] = wh;
- s_nTexDimsChanged |= 1 << texmapid;
+ s_nTexDimsChanged |= 1 << texmapid;
}
}