summaryrefslogtreecommitdiff
path: root/indra/newview/llviewershadermgr.cpp
diff options
context:
space:
mode:
authorGeenz <geenz@geenzo.com>2013-04-15 19:40:12 -0400
committerGeenz <geenz@geenzo.com>2013-04-15 19:40:12 -0400
commitc72c3691ecf83875d4ee3e0784b3e76cb4b4633a (patch)
tree7959f729f94b8fcd85bb3b32a7b5bb271c746b47 /indra/newview/llviewershadermgr.cpp
parent39544a3b06e3221602444eb81c7df8c1030c6bb5 (diff)
parentfafa21315f043ab51e3373e825c85646685778a6 (diff)
Merged Graham's stuff amongst others.
Diffstat (limited to 'indra/newview/llviewershadermgr.cpp')
-rw-r--r--indra/newview/llviewershadermgr.cpp57
1 files changed, 52 insertions, 5 deletions
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 45e5d4869a..eb43141c9b 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -175,6 +175,9 @@ LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
LLGLSLShader gDeferredSkinnedDiffuseProgram;
LLGLSLShader gDeferredSkinnedBumpProgram;
LLGLSLShader gDeferredSkinnedAlphaProgram;
+#if LL_DARWIN
+LLGLSLShader gDeferredSkinnedAlphaProgramMac;
+#endif
LLGLSLShader gDeferredBumpProgram;
LLGLSLShader gDeferredTerrainProgram;
LLGLSLShader gDeferredTreeProgram;
@@ -276,6 +279,9 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
mShaderList.push_back(&gDeferredSoftenProgram);
mShaderList.push_back(&gDeferredAlphaProgram);
mShaderList.push_back(&gDeferredSkinnedAlphaProgram);
+#if LL_DARWIN
+ mShaderList.push_back(&gDeferredSkinnedAlphaProgramMac);
+#endif
mShaderList.push_back(&gDeferredFullbrightProgram);
mShaderList.push_back(&gDeferredEmissiveProgram);
mShaderList.push_back(&gDeferredAvatarEyesProgram);
@@ -783,9 +789,6 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
// Load basic dependency shaders first
// All of these have to load for any shaders to function
-#if LL_DARWIN // Mac can't currently handle all 8 lights,
- S32 sum_lights_class = 2;
-#else
S32 sum_lights_class = 3;
// class one cards will get the lower sum lights
@@ -796,14 +799,21 @@ BOOL LLViewerShaderMgr::loadBasicShaders()
{
sum_lights_class = 2;
}
-#endif
// If we have sun and moon only checked, then only sum those lights.
if (gPipeline.getLightingDetail() == 0)
{
sum_lights_class = 1;
}
-
+
+#if LL_DARWIN
+ // Work around driver crashes on older Macs when using deferred rendering
+ // NORSPEC-59
+ //
+ if (gGLManager.mIsMobileGF)
+ sum_lights_class = 3;
+#endif
+
// Use the feature table to mask out the max light level to use. Also make sure it's at least 1.
S32 max_light_class = gSavedSettings.getS32("RenderShaderLightingMaxLevel");
sum_lights_class = llclamp(sum_lights_class, 1, max_light_class);
@@ -1078,6 +1088,9 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredSkinnedDiffuseProgram.unload();
gDeferredSkinnedBumpProgram.unload();
gDeferredSkinnedAlphaProgram.unload();
+#if LL_DARWIN
+ gDeferredSkinnedAlphaProgramMac.unload();
+#endif
gDeferredBumpProgram.unload();
gDeferredImpostorProgram.unload();
gDeferredTerrainProgram.unload();
@@ -1211,6 +1224,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredSkinnedAlphaProgram.addPermutation("INDEX_MODE", "2");
gDeferredSkinnedAlphaProgram.addPermutation("HAS_SKIN", "1");
gDeferredSkinnedAlphaProgram.addPermutation("IS_AVATAR_SKIN", "0");
+ gDeferredSkinnedAlphaProgram.addPermutation("MAC_GEFORCE_HACK","0");
+
success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);
// Hack to include uniforms for lighting without linking in lighting file
@@ -1218,6 +1233,36 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true;
}
+#if LL_DARWIN
+ if (success)
+ {
+ gDeferredSkinnedAlphaProgramMac.mName = "Deferred Skinned Alpha Shader";
+ gDeferredSkinnedAlphaProgramMac.mFeatures.atmosphericHelpers = true;
+ gDeferredSkinnedAlphaProgramMac.mFeatures.hasObjectSkinning = true;
+ gDeferredSkinnedAlphaProgramMac.mFeatures.calculatesAtmospherics = true;
+ gDeferredSkinnedAlphaProgramMac.mFeatures.hasGamma = true;
+ gDeferredSkinnedAlphaProgramMac.mFeatures.hasAtmospherics = true;
+ gDeferredSkinnedAlphaProgramMac.mFeatures.calculatesLighting = false;
+ gDeferredSkinnedAlphaProgramMac.mFeatures.hasLighting = false;
+ gDeferredSkinnedAlphaProgramMac.mFeatures.isAlphaLighting = true;
+ gDeferredSkinnedAlphaProgramMac.mFeatures.disableTextureIndex = true;
+ gDeferredSkinnedAlphaProgramMac.mShaderFiles.clear();
+ gDeferredSkinnedAlphaProgramMac.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));
+ gDeferredSkinnedAlphaProgramMac.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
+ gDeferredSkinnedAlphaProgramMac.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+ gDeferredSkinnedAlphaProgramMac.addPermutation("INDEX_MODE", "2");
+ gDeferredSkinnedAlphaProgramMac.addPermutation("HAS_SKIN", "1");
+ gDeferredSkinnedAlphaProgramMac.addPermutation("IS_AVATAR_SKIN", "0");
+ gDeferredSkinnedAlphaProgramMac.addPermutation("MAC_GEFORCE_HACK","1");
+
+ success = gDeferredSkinnedAlphaProgramMac.createShader(NULL, NULL);
+
+ // Hack to include uniforms for lighting without linking in lighting file
+ gDeferredSkinnedAlphaProgramMac.mFeatures.calculatesLighting = true;
+ gDeferredSkinnedAlphaProgramMac.mFeatures.hasLighting = true;
+ }
+#endif
+
if (success)
{
gDeferredBumpProgram.mName = "Deferred Bump Shader";
@@ -1390,6 +1435,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAlphaProgram.addPermutation("INDEX_MODE", "1");
gDeferredAlphaProgram.addPermutation("HAS_SKIN", "0");
gDeferredAlphaProgram.addPermutation("IS_AVATAR_SKIN", "0");
+ gDeferredAlphaProgram.addPermutation("MAC_GEFORCE_HACK","0");
success = gDeferredAlphaProgram.createShader(NULL, NULL);
// Hack
@@ -1563,6 +1609,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarAlphaProgram.addPermutation("INDEX_MODE", "3");
gDeferredAvatarAlphaProgram.addPermutation("HAS_SKIN", "0");
gDeferredAvatarAlphaProgram.addPermutation("IS_AVATAR_SKIN", "1");
+ gDeferredAvatarAlphaProgram.addPermutation("MAC_GEFORCE_HACK","0");
success = gDeferredAvatarAlphaProgram.createShader(NULL, &mAvatarUniforms);