diff options
| author | skidau <skidau@gmail.com> | 2013-03-27 13:19:23 +1100 |
|---|---|---|
| committer | skidau <skidau@gmail.com> | 2013-03-27 13:19:23 +1100 |
| commit | 7784fa4c67cc8d2545f45694d83805e7e89cd583 (patch) | |
| tree | 7724133aabe971ec417d1dea0977a525bb8debfb /Source/Core/VideoCommon/Src/PixelShaderManager.cpp | |
| parent | d33c19b0cd2bae982c8d35e86a9d3551f9e5c72f (diff) | |
| parent | 5cea0d9defeaa23e7af94adf7615a44fb2c9c173 (diff) | |
Merge branch 'master' into wii-network
# By Ryan Houdek (185) and others
# Via degasus (12) and others
* master: (625 commits)
Revert "Don't open/close file for every file operation." as it was crashing PokePark in Windows builds.
Array overrun fixed in VertexShaderCache for the DX11 plugin.
Fixed DSPTool build.
Windows build fix
Go back to assuming every HID device is a wiimote on Windows. Fixed issue 6117. Unfixed issue 6031.
VideoSoftware: Improve fog range adjustment by using less magic and more comments.
revert RasterFont for VideoSoftware
ogl: fix virtual xfb
Windows build fix from web interface...
Adjusted the audio loop criteria, using >= on the Wii and == on GC. This fixes the audio static that occurred in Wii games after hours of play.
Forced the exception check only for ARAM DMA transfers. Removed the Eternal Darkness boot hack and replaced it with an exception check.
VideoSoftware: Implement fog range adjustment, fixing issue 6147.
implement 4xSSAA for OGL
move ogl-only settings into backend
Fix description of disable fog, and move it to enhancements tab.
Reverted rd76ca5783743 as it was made obsolete by r1d550f4496e4.
Removed the tracking of the FIFO Writes as it was made obsolete by r1d550f4496e4.
Forced the external exception check to occur sooner by changing the downcount.
Mark the Direct3D9 backend deprecated.
Prefer D3D11 and OpenGL over D3D9 by default.
...
Conflicts:
CMakeLists.txt
Source/Core/Common/Common.vcxproj.filters
Source/Core/Common/Src/CommonPaths.h
Source/Core/Core/Core.vcxproj.filters
Source/Core/Core/Src/Core.cpp
Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_FileIO.cpp
Source/VSProps/Dolphin.Win32.props
Source/VSProps/Dolphin.x64.props
Diffstat (limited to 'Source/Core/VideoCommon/Src/PixelShaderManager.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/Src/PixelShaderManager.cpp | 225 |
1 files changed, 114 insertions, 111 deletions
diff --git a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp index eaaf99fbc8..ad84f6876e 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp +++ b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp @@ -85,61 +85,63 @@ void PixelShaderManager::Shutdown() void PixelShaderManager::SetConstants() { - for (int i = 0; i < 2; ++i) + if (g_ActiveConfig.backend_info.APIType == API_OPENGL && !g_ActiveConfig.backend_info.bSupportsGLSLUBO) + Dirty(); + 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) + int baseind = i ? C_KCOLORS : C_COLORS; + for (int j = 0; j < 4; ++j) { - if (s_nColorsChanged[i] & (1 << j)) - SetPSConstant4fv(baseind+j, &lastRGBAfull[i][j][0]); - } - s_nColorsChanged[i] = 0; - } - } - - if (s_nTexDimsChanged) + if (s_nColorsChanged[i] & (1 << j)) + SetPSConstant4fv(baseind+j, &lastRGBAfull[i][j][0]); + } + s_nColorsChanged[i] = 0; + } + } + + if (s_nTexDimsChanged) { - for (int i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { - if (s_nTexDimsChanged & (1<<i)) + if (s_nTexDimsChanged & (1<<i)) SetPSTextureDims(i); - } - s_nTexDimsChanged = 0; - } + } + 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) { - float ftemp[4]; - switch (bpmem.ztex2.type) + float ftemp[4]; + switch (bpmem.ztex2.type) { - case 0: - // 8 bits - ftemp[0] = 0; ftemp[1] = 0; ftemp[2] = 0; ftemp[3] = 255.0f/16777215.0f; - break; - case 1: - // 16 bits - ftemp[0] = 255.0f/16777215.0f; ftemp[1] = 0; ftemp[2] = 0; ftemp[3] = 65280.0f/16777215.0f; - break; - case 2: - // 24 bits + case 0: + // 8 bits + ftemp[0] = 0; ftemp[1] = 0; ftemp[2] = 0; ftemp[3] = 255.0f/16777215.0f; + break; + case 1: + // 16 bits + ftemp[0] = 255.0f/16777215.0f; ftemp[1] = 0; ftemp[2] = 0; ftemp[3] = 65280.0f/16777215.0f; + break; + case 2: + // 24 bits ftemp[0] = 16711680.0f/16777215.0f; ftemp[1] = 65280.0f/16777215.0f; ftemp[2] = 255.0f/16777215.0f; ftemp[3] = 0; - break; - } + break; + } SetPSConstant4fv(C_ZBIAS, ftemp); s_bZTextureTypeChanged = false; } if (s_bZBiasChanged || s_bDepthRangeChanged) { - // reversed gxsetviewport(xorig, yorig, width, height, nearz, farz) + // reversed gxsetviewport(xorig, yorig, width, height, nearz, farz) // [0] = width/2 // [1] = height/2 // [2] = 16777215 * (farz - nearz) @@ -150,78 +152,78 @@ void PixelShaderManager::SetConstants() //ERROR_LOG("pixel=%x,%x, bias=%x\n", bpmem.zcontrol.pixel_format, bpmem.ztex2.type, lastZBias); SetPSConstant4f(C_ZBIAS+1, xfregs.viewport.farZ / 16777216.0f, xfregs.viewport.zRange / 16777216.0f, 0, (float)(lastZBias)/16777215.0f); s_bZBiasChanged = s_bDepthRangeChanged = false; - } + } - // indirect incoming texture scales - if (s_nIndTexScaleChanged) + // indirect incoming texture scales + if (s_nIndTexScaleChanged) { // set as two sets of vec4s, each containing S and T of two ind stages. - float f[8]; + 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); - PRIM_LOG("tex indscale%d: %f %f\n", i, f[2 * i], f[2 * i + 1]); - } + f[2 * i] = bpmem.texscale[0].getScaleS(i & 1); + f[2 * i + 1] = bpmem.texscale[0].getScaleT(i & 1); + PRIM_LOG("tex indscale%d: %f %f\n", i, f[2 * i], f[2 * i + 1]); + } SetPSConstant4fv(C_INDTEXSCALE, f); - } - - if (s_nIndTexScaleChanged & 0x0c) { - for (u32 i = 2; i < 4; ++i) { - 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]); - } + } + + if (s_nIndTexScaleChanged & 0x0c) { + for (u32 i = 2; i < 4; ++i) { + 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; - } + 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) | - ((u32)bpmem.indmtx[i].col2.s2 << 4); - float fscale = powf(2.0f, (float)(scale - 17)) / 1024.0f; - - // xyz - static matrix - // TODO w - dynamic matrix scale / 256...... somehow / 4 works better - // rev 2972 - now using / 256.... verify that this works + int scale = ((u32)bpmem.indmtx[i].col0.s0 << 0) | + ((u32)bpmem.indmtx[i].col1.s1 << 2) | + ((u32)bpmem.indmtx[i].col2.s2 << 4); + float fscale = powf(2.0f, (float)(scale - 17)) / 1024.0f; + + // xyz - static matrix + // TODO w - dynamic matrix scale / 256...... somehow / 4 works better + // rev 2972 - now using / 256.... verify that this works SetPSConstant4f(C_INDTEXMTX + 2 * i, - bpmem.indmtx[i].col0.ma * fscale, + bpmem.indmtx[i].col0.ma * fscale, bpmem.indmtx[i].col1.mc * fscale, bpmem.indmtx[i].col2.me * fscale, fscale * 4.0f); - SetPSConstant4f(C_INDTEXMTX + 2 * i + 1, - bpmem.indmtx[i].col0.mb * fscale, + SetPSConstant4f(C_INDTEXMTX + 2 * i + 1, + bpmem.indmtx[i].col0.mb * fscale, bpmem.indmtx[i].col1.md * fscale, bpmem.indmtx[i].col2.mf * fscale, fscale * 4.0f); - PRIM_LOG("indmtx%d: scale=%f, mat=(%f %f %f; %f %f %f)\n", - i, 1024.0f*fscale, - bpmem.indmtx[i].col0.ma * fscale, bpmem.indmtx[i].col1.mc * fscale, bpmem.indmtx[i].col2.me * fscale, - bpmem.indmtx[i].col0.mb * fscale, bpmem.indmtx[i].col1.md * fscale, bpmem.indmtx[i].col2.mf * fscale); - } - } - s_nIndTexMtxChanged = 0; - } + PRIM_LOG("indmtx%d: scale=%f, mat=(%f %f %f; %f %f %f)\n", + i, 1024.0f*fscale, + bpmem.indmtx[i].col0.ma * fscale, bpmem.indmtx[i].col1.mc * fscale, bpmem.indmtx[i].col2.me * fscale, + bpmem.indmtx[i].col0.mb * fscale, bpmem.indmtx[i].col1.md * fscale, bpmem.indmtx[i].col2.mf * fscale); + } + } + 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) { @@ -234,8 +236,8 @@ void PixelShaderManager::SetConstants() else SetPSConstant4f(C_FOG + 1, 0.0, 1.0, 0.0, 1.0); - s_bFogParamChanged = false; - } + s_bFogParamChanged = false; + } if (s_bFogRangeAdjustChanged) { @@ -339,11 +341,11 @@ void PixelShaderManager::SetConstants() void PixelShaderManager::SetPSTextureDims(int texid) { - // texdims.xy are reciprocals of the real texture dimensions - // texdims.zw are the scaled dimensions - float fdims[4]; + // texdims.xy are reciprocals of the real texture dimensions + // texdims.zw are the scaled dimensions + float fdims[4]; - TCoordInfo& tc = bpmem.texcoords[texid]; + TCoordInfo& tc = bpmem.texcoords[texid]; fdims[0] = 1.0f / (float)(lastTexDims[texid] & 0xffff); fdims[1] = 1.0f / (float)((lastTexDims[texid] >> 16) & 0xfff); fdims[2] = (float)(tc.s.scale_minus_1 + 1); @@ -357,7 +359,7 @@ void PixelShaderManager::SetPSTextureDims(int texid) // and update it when the shader constant is set, only. void PixelShaderManager::SetColorChanged(int type, int num, bool high) { - float *pf = &lastRGBAfull[type][num][0]; + float *pf = &lastRGBAfull[type][num][0]; if (!high) { int r = bpmem.tevregs[num].low.a; int a = bpmem.tevregs[num].low.b; @@ -369,60 +371,61 @@ void PixelShaderManager::SetColorChanged(int type, int num, bool high) pf[1] = (float)g * (1.0f / 255.0f); pf[2] = (float)b * (1.0f / 255.0f); } - s_nColorsChanged[type] |= 1 << num; - PRIM_LOG("pixel %scolor%d: %f %f %f %f\n", type?"k":"", num, pf[0], pf[1], pf[2], pf[3]); + s_nColorsChanged[type] |= 1 << num; + PRIM_LOG("pixel %scolor%d: %f %f %f %f\n", type?"k":"", num, pf[0], pf[1], pf[2], pf[3]); } void PixelShaderManager::SetAlpha(const AlphaTest& alpha) { - if ((alpha.hex & 0xffff) != lastAlpha) + if ((alpha.hex & 0xffff) != lastAlpha) { - lastAlpha = (lastAlpha & ~0xffff) | (alpha.hex & 0xffff); - s_bAlphaChanged = true; - } + lastAlpha = (lastAlpha & ~0xffff) | (alpha.hex & 0xffff); + s_bAlphaChanged = true; + } } void PixelShaderManager::SetDestAlpha(const ConstantAlpha& alpha) { - if (alpha.alpha != (lastAlpha >> 16)) + if (alpha.alpha != (lastAlpha >> 16)) { - lastAlpha = (lastAlpha & ~0xff0000) | ((alpha.hex & 0xff) << 16); - s_bAlphaChanged = true; - } + lastAlpha = (lastAlpha & ~0xff0000) | ((alpha.hex & 0xff) << 16); + s_bAlphaChanged = true; + } } void PixelShaderManager::SetTexDims(int texmapid, u32 width, u32 height, u32 wraps, u32 wrapt) { - u32 wh = width | (height << 16) | (wraps << 28) | (wrapt << 30); - if (lastTexDims[texmapid] != wh) + u32 wh = width | (height << 16) | (wraps << 28) | (wrapt << 30); + if (lastTexDims[texmapid] != wh) { - lastTexDims[texmapid] = wh; + lastTexDims[texmapid] = wh; s_nTexDimsChanged |= 1 << texmapid; - } + } } void PixelShaderManager::SetZTextureBias(u32 bias) { - if (lastZBias != bias) + if (lastZBias != bias) { - s_bZBiasChanged = true; - lastZBias = bias; - } + s_bZBiasChanged = true; + lastZBias = bias; + } } void PixelShaderManager::SetViewportChanged() { s_bDepthRangeChanged = true; + s_bFogRangeAdjustChanged = true; // TODO: Shouldn't be necessary with an accurate fog range adjust implementation } void PixelShaderManager::SetIndTexScaleChanged(u8 stagemask) { - s_nIndTexScaleChanged |= stagemask; + s_nIndTexScaleChanged |= stagemask; } void PixelShaderManager::SetIndMatrixChanged(int matrixidx) { - s_nIndTexMtxChanged |= 1 << matrixidx; + s_nIndTexMtxChanged |= 1 << matrixidx; } void PixelShaderManager::SetZTextureTypeChanged() @@ -432,22 +435,22 @@ void PixelShaderManager::SetZTextureTypeChanged() void PixelShaderManager::SetTexCoordChanged(u8 texmapid) { - s_nTexDimsChanged |= 1 << texmapid; + s_nTexDimsChanged |= 1 << texmapid; } void PixelShaderManager::SetFogColorChanged() { - s_bFogColorChanged = true; + s_bFogColorChanged = true; } void PixelShaderManager::SetFogParamChanged() { - s_bFogParamChanged = true; + s_bFogParamChanged = true; } void PixelShaderManager::SetFogRangeAdjustChanged() { - s_bFogRangeAdjustChanged = true; + s_bFogRangeAdjustChanged = true; } void PixelShaderManager::SetColorMatrix(const float* pmatrix) |
