summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/PixelShaderManager.cpp
diff options
context:
space:
mode:
authorTony Wasserka <neobrainx@gmail.com>2014-03-14 22:57:40 +0100
committerTony Wasserka <neobrainx@gmail.com>2014-03-14 22:57:40 +0100
commita9a8c730748b8c8a2e83feb4c38626361cf9daa1 (patch)
treeb847e06006198ac3d5b5dbb701ff4b1ab4e2de00 /Source/Core/VideoCommon/PixelShaderManager.cpp
parent450bde27bb2d7a47335c9800d3a29e012c9d67e9 (diff)
parent0f81cbd6be009ac14f036a05db8f4e516ea626d0 (diff)
Merge pull request #68 from neobrain/tev_fixes_new
Change pixel processing to use integer arithmetic.
Diffstat (limited to 'Source/Core/VideoCommon/PixelShaderManager.cpp')
-rw-r--r--Source/Core/VideoCommon/PixelShaderManager.cpp136
1 files changed, 68 insertions, 68 deletions
diff --git a/Source/Core/VideoCommon/PixelShaderManager.cpp b/Source/Core/VideoCommon/PixelShaderManager.cpp
index 9ed7ff2a76..7cbb155be2 100644
--- a/Source/Core/VideoCommon/PixelShaderManager.cpp
+++ b/Source/Core/VideoCommon/PixelShaderManager.cpp
@@ -84,15 +84,16 @@ void PixelShaderManager::SetConstants()
// they always seems to be larger than 256 so my theory is :
// they are the coefficients from the center to the border of the screen
// so to simplify I use the hi coefficient as K in the shader taking 256 as the scale
- constants.fog[2][0] = ScreenSpaceCenter;
- constants.fog[2][1] = (float)Renderer::EFBToScaledX((int)(2.0f * xfregs.viewport.wd));
- constants.fog[2][2] = bpmem.fogRange.K[4].HI / 256.0f;
+ // TODO: Shouldn't this be EFBToScaledXf?
+ constants.fogf[0][0] = ScreenSpaceCenter;
+ constants.fogf[0][1] = (float)Renderer::EFBToScaledX((int)(2.0f * xfregs.viewport.wd));
+ constants.fogf[0][2] = bpmem.fogRange.K[4].HI / 256.0f;
}
else
{
- constants.fog[2][0] = 0;
- constants.fog[2][1] = 1;
- constants.fog[2][2] = 1;
+ constants.fogf[0][0] = 0;
+ constants.fogf[0][1] = 1;
+ constants.fogf[0][2] = 1;
}
dirty = true;
@@ -103,6 +104,7 @@ void PixelShaderManager::SetConstants()
{
if (nLightsChanged[0] >= 0)
{
+ // TODO: Outdated comment
// lights don't have a 1 to 1 mapping, the color component needs to be converted to 4 floats
int istart = nLightsChanged[0] / 0x10;
int iend = (nLightsChanged[1] + 15) / 0x10;
@@ -111,10 +113,10 @@ void PixelShaderManager::SetConstants()
for (int i = istart; i < iend; ++i)
{
u32 color = *(const u32*)(xfmemptr + 3);
- constants.plights[5*i][0] = ((color >> 24) & 0xFF) / 255.0f;
- constants.plights[5*i][1] = ((color >> 16) & 0xFF) / 255.0f;
- constants.plights[5*i][2] = ((color >> 8) & 0xFF) / 255.0f;
- constants.plights[5*i][3] = ((color) & 0xFF) / 255.0f;
+ constants.plight_colors[i][0] = (color >> 24) & 0xFF;
+ constants.plight_colors[i][1] = (color >> 16) & 0xFF;
+ constants.plight_colors[i][2] = (color >> 8) & 0xFF;
+ constants.plight_colors[i][3] = (color) & 0xFF;
xfmemptr += 4;
for (int j = 0; j < 4; ++j, xfmemptr += 3)
@@ -124,11 +126,11 @@ void PixelShaderManager::SetConstants()
fabs(xfmemptr[1]) < 0.00001f &&
fabs(xfmemptr[2]) < 0.00001f)
// dist attenuation, make sure not equal to 0!!!
- constants.plights[5*i+j+1][0] = 0.00001f;
+ constants.plights[4*i+j][0] = 0.00001f;
else
- constants.plights[5*i+j+1][0] = xfmemptr[0];
- constants.plights[5*i+j+1][1] = xfmemptr[1];
- constants.plights[5*i+j+1][2] = xfmemptr[2];
+ constants.plights[4*i+j][0] = xfmemptr[0];
+ constants.plights[4*i+j][1] = xfmemptr[1];
+ constants.plights[4*i+j][2] = xfmemptr[2];
}
}
dirty = true;
@@ -139,8 +141,8 @@ void PixelShaderManager::SetConstants()
if (s_bViewPortChanged)
{
- constants.zbias[1][0] = xfregs.viewport.farZ / 16777216.0f;
- constants.zbias[1][1] = xfregs.viewport.zRange / 16777216.0f;
+ constants.zbias[1][0] = xfregs.viewport.farZ;
+ constants.zbias[1][1] = xfregs.viewport.zRange;
dirty = true;
s_bViewPortChanged = false;
}
@@ -152,26 +154,26 @@ void PixelShaderManager::SetConstants()
// TODO: Conversion should be checked in the context of tev_fixes..
void PixelShaderManager::SetColorChanged(int type, int num)
{
- float4* c = type ? constants.kcolors : constants.colors;
- c[num][0] = bpmem.tevregs[num].low.a / 255.0f;
- c[num][3] = bpmem.tevregs[num].low.b / 255.0f;
- c[num][2] = bpmem.tevregs[num].high.a / 255.0f;
- c[num][1] = bpmem.tevregs[num].high.b / 255.0f;
+ int4* c = type ? constants.kcolors : constants.colors;
+ c[num][0] = bpmem.tevregs[num].low.a;
+ c[num][3] = bpmem.tevregs[num].low.b;
+ c[num][2] = bpmem.tevregs[num].high.a;
+ c[num][1] = bpmem.tevregs[num].high.b;
dirty = true;
- PRIM_LOG("pixel %scolor%d: %f %f %f %f\n", type?"k":"", num, c[num][0], c[num][1], c[num][2], c[num][3]);
+ PRIM_LOG("pixel %scolor%d: %d %d %d %d\n", type?"k":"", num, c[num][0], c[num][1], c[num][2], c[num][3]);
}
void PixelShaderManager::SetAlpha()
{
- constants.alpha[0] = bpmem.alpha_test.ref0 / 255.0f;
- constants.alpha[1] = bpmem.alpha_test.ref1 / 255.0f;
+ constants.alpha[0] = bpmem.alpha_test.ref0;
+ constants.alpha[1] = bpmem.alpha_test.ref1;
dirty = true;
}
void PixelShaderManager::SetDestAlpha()
{
- constants.alpha[3] = bpmem.dstalpha.alpha / 255.0f;
+ constants.alpha[3] = bpmem.dstalpha.alpha;
dirty = true;
}
@@ -188,7 +190,7 @@ void PixelShaderManager::SetTexDims(int texmapid, u32 width, u32 height, u32 wra
void PixelShaderManager::SetZTextureBias()
{
- constants.zbias[1][3] = bpmem.ztex1.bias/16777215.0f;
+ constants.zbias[1][3] = bpmem.ztex1.bias;
dirty = true;
}
@@ -200,37 +202,35 @@ void PixelShaderManager::SetViewportChanged()
void PixelShaderManager::SetIndTexScaleChanged(bool high)
{
- constants.indtexscale[high][0] = bpmem.texscale[high].getScaleS(0);
- constants.indtexscale[high][1] = bpmem.texscale[high].getScaleT(0);
- constants.indtexscale[high][2] = bpmem.texscale[high].getScaleS(1);
- constants.indtexscale[high][3] = bpmem.texscale[high].getScaleT(1);
+ constants.indtexscale[high][0] = bpmem.texscale[high].ss0;
+ constants.indtexscale[high][1] = bpmem.texscale[high].ts0;
+ constants.indtexscale[high][2] = bpmem.texscale[high].ss1;
+ constants.indtexscale[high][3] = bpmem.texscale[high].ts1;
dirty = true;
}
void PixelShaderManager::SetIndMatrixChanged(int matrixidx)
{
int scale = ((u32)bpmem.indmtx[matrixidx].col0.s0 << 0) |
- ((u32)bpmem.indmtx[matrixidx].col1.s1 << 2) |
- ((u32)bpmem.indmtx[matrixidx].col2.s2 << 4);
- float fscale = powf(2.0f, (float)(scale - 17)) / 1024.0f;
+ ((u32)bpmem.indmtx[matrixidx].col1.s1 << 2) |
+ ((u32)bpmem.indmtx[matrixidx].col2.s2 << 4);
// xyz - static matrix
- // TODO w - dynamic matrix scale / 256...... somehow / 4 works better
- // rev 2972 - now using / 256.... verify that this works
- constants.indtexmtx[2*matrixidx][0] = bpmem.indmtx[matrixidx].col0.ma * fscale;
- constants.indtexmtx[2*matrixidx][1] = bpmem.indmtx[matrixidx].col1.mc * fscale;
- constants.indtexmtx[2*matrixidx][2] = bpmem.indmtx[matrixidx].col2.me * fscale;
- constants.indtexmtx[2*matrixidx][3] = fscale * 4.0f;
- constants.indtexmtx[2*matrixidx+1][0] = bpmem.indmtx[matrixidx].col0.mb * fscale;
- constants.indtexmtx[2*matrixidx+1][1] = bpmem.indmtx[matrixidx].col1.md * fscale;
- constants.indtexmtx[2*matrixidx+1][2] = bpmem.indmtx[matrixidx].col2.mf * fscale;
- constants.indtexmtx[2*matrixidx+1][3] = fscale * 4.0f;
+ // w - dynamic matrix scale / 128
+ constants.indtexmtx[2*matrixidx ][0] = bpmem.indmtx[matrixidx].col0.ma;
+ constants.indtexmtx[2*matrixidx ][1] = bpmem.indmtx[matrixidx].col1.mc;
+ constants.indtexmtx[2*matrixidx ][2] = bpmem.indmtx[matrixidx].col2.me;
+ constants.indtexmtx[2*matrixidx ][3] = 17 - scale;
+ constants.indtexmtx[2*matrixidx+1][0] = bpmem.indmtx[matrixidx].col0.mb;
+ constants.indtexmtx[2*matrixidx+1][1] = bpmem.indmtx[matrixidx].col1.md;
+ constants.indtexmtx[2*matrixidx+1][2] = bpmem.indmtx[matrixidx].col2.mf;
+ constants.indtexmtx[2*matrixidx+1][3] = 17 - scale;
dirty = true;
- PRIM_LOG("indmtx%d: scale=%f, mat=(%f %f %f; %f %f %f)\n",
- matrixidx, 1024.0f*fscale,
- bpmem.indmtx[matrixidx].col0.ma * fscale, bpmem.indmtx[matrixidx].col1.mc * fscale, bpmem.indmtx[matrixidx].col2.me * fscale,
- bpmem.indmtx[matrixidx].col0.mb * fscale, bpmem.indmtx[matrixidx].col1.md * fscale, bpmem.indmtx[matrixidx].col2.mf * fscale);
+ PRIM_LOG("indmtx%d: scale=%d, mat=(%d %d %d; %d %d %d)\n",
+ matrixidx, scale,
+ bpmem.indmtx[matrixidx].col0.ma, bpmem.indmtx[matrixidx].col1.mc, bpmem.indmtx[matrixidx].col2.me,
+ bpmem.indmtx[matrixidx].col0.mb, bpmem.indmtx[matrixidx].col1.md, bpmem.indmtx[matrixidx].col2.mf);
}
@@ -242,18 +242,18 @@ void PixelShaderManager::SetZTextureTypeChanged()
constants.zbias[0][0] = 0;
constants.zbias[0][1] = 0;
constants.zbias[0][2] = 0;
- constants.zbias[0][3] = 255.0f/16777215.0f;
+ constants.zbias[0][3] = 1;
break;
case TEV_ZTEX_TYPE_U16:
- constants.zbias[0][0] = 255.0f/16777215.0f;
+ constants.zbias[0][0] = 1;
constants.zbias[0][1] = 0;
constants.zbias[0][2] = 0;
- constants.zbias[0][3] = 65280.0f/16777215.0f;
+ constants.zbias[0][3] = 256;
break;
case TEV_ZTEX_TYPE_U24:
- constants.zbias[0][0] = 16711680.0f/16777215.0f;
- constants.zbias[0][1] = 65280.0f/16777215.0f;
- constants.zbias[0][2] = 255.0f/16777215.0f;
+ constants.zbias[0][0] = 65536;
+ constants.zbias[0][1] = 256;
+ constants.zbias[0][2] = 1;
constants.zbias[0][3] = 0;
break;
default:
@@ -272,9 +272,9 @@ void PixelShaderManager::SetTexCoordChanged(u8 texmapid)
void PixelShaderManager::SetFogColorChanged()
{
- constants.fog[0][0] = bpmem.fog.color.r / 255.0f;
- constants.fog[0][1] = bpmem.fog.color.g / 255.0f;
- constants.fog[0][2] = bpmem.fog.color.b / 255.0f;
+ constants.fogcolor[0] = bpmem.fog.color.r;
+ constants.fogcolor[1] = bpmem.fog.color.g;
+ constants.fogcolor[2] = bpmem.fog.color.b;
dirty = true;
}
@@ -282,17 +282,17 @@ void PixelShaderManager::SetFogParamChanged()
{
if (!g_ActiveConfig.bDisableFog)
{
- constants.fog[1][0] = bpmem.fog.a.GetA();
- constants.fog[1][1] = (float)bpmem.fog.b_magnitude / 0xFFFFFF;
- constants.fog[1][2] = bpmem.fog.c_proj_fsel.GetC();
- constants.fog[1][3] = (float)(1 << bpmem.fog.b_shift);
+ constants.fogf[1][0] = bpmem.fog.a.GetA();
+ constants.fogi[1] = bpmem.fog.b_magnitude;
+ constants.fogf[1][2] = bpmem.fog.c_proj_fsel.GetC();
+ constants.fogi[3] = bpmem.fog.b_shift;
}
else
{
- constants.fog[1][0] = 0;
- constants.fog[1][1] = 1;
- constants.fog[1][2] = 0;
- constants.fog[1][3] = 1;
+ constants.fogf[1][0] = 0.f;
+ constants.fogi[1] = 1;
+ constants.fogf[1][2] = 0.f;
+ constants.fogi[3] = 1;
}
dirty = true;
}
@@ -326,10 +326,10 @@ void PixelShaderManager::SetMaterialColorChanged(int index, u32 color)
{
if (g_ActiveConfig.bEnablePixelLighting && g_ActiveConfig.backend_info.bSupportsPixelLighting)
{
- constants.pmaterials[index][0] = ((color >> 24) & 0xFF) / 255.0f;
- constants.pmaterials[index][1] = ((color >> 16) & 0xFF) / 255.0f;
- constants.pmaterials[index][2] = ((color >> 8) & 0xFF) / 255.0f;
- constants.pmaterials[index][3] = ( color & 0xFF) / 255.0f;
+ constants.pmaterials[index][0] = (color >> 24) & 0xFF;
+ constants.pmaterials[index][1] = (color >> 16) & 0xFF;
+ constants.pmaterials[index][2] = (color >> 8) & 0xFF;
+ constants.pmaterials[index][3] = (color) & 0xFF;
dirty = true;
}
}