summaryrefslogtreecommitdiff
path: root/indra/newview/llviewershadermgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llviewershadermgr.cpp')
-rw-r--r--indra/newview/llviewershadermgr.cpp196
1 files changed, 190 insertions, 6 deletions
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 7ef13c3a35..23387d8613 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -137,6 +137,10 @@ LLGLSLShader gGlowProgram;
LLGLSLShader gGlowExtractProgram;
LLGLSLShader gPostScreenSpaceReflectionProgram;
+LLGLSLShader gBloomExtractProgram;
+LLGLSLShader gBloomBlurProgram;
+LLGLSLShader gBloomCombineProgram;
+
// Deferred rendering shaders
LLGLSLShader gDeferredImpostorProgram;
LLGLSLShader gDeferredDiffuseProgram;
@@ -196,8 +200,13 @@ LLGLSLShader gDeferredCoFProgram;
LLGLSLShader gDeferredDoFCombineProgram;
LLGLSLShader gDeferredPostTonemapProgram;
LLGLSLShader gNoPostTonemapProgram;
+LLGLSLShader gDeferredPostTonemapGammaCorrectProgram;
+LLGLSLShader gNoPostTonemapGammaCorrectProgram;
+LLGLSLShader gDeferredPostTonemapLegacyGammaCorrectProgram;
+LLGLSLShader gNoPostTonemapLegacyGammaCorrectProgram;
LLGLSLShader gDeferredPostGammaCorrectProgram;
LLGLSLShader gLegacyPostGammaCorrectProgram;
+LLGLSLShader gHDRGammaCorrectProgram;
LLGLSLShader gExposureProgram;
LLGLSLShader gExposureProgramNoFade;
LLGLSLShader gLuminanceProgram;
@@ -206,6 +215,7 @@ LLGLSLShader gSMAAEdgeDetectProgram[4];
LLGLSLShader gSMAABlendWeightsProgram[4];
LLGLSLShader gSMAANeighborhoodBlendProgram[4];
LLGLSLShader gCASProgram;
+LLGLSLShader gCASLegacyGammaProgram;
LLGLSLShader gDeferredPostNoDoFProgram;
LLGLSLShader gDeferredPostNoDoFNoiseProgram;
LLGLSLShader gDeferredWLSkyProgram;
@@ -443,8 +453,14 @@ void LLViewerShaderMgr::finalizeShaderList()
mShaderList.push_back(&gHUDPBRAlphaProgram);
mShaderList.push_back(&gDeferredPostTonemapProgram);
mShaderList.push_back(&gNoPostTonemapProgram);
+ mShaderList.push_back(&gDeferredPostTonemapGammaCorrectProgram);
+ mShaderList.push_back(&gNoPostTonemapGammaCorrectProgram);
+ mShaderList.push_back(&gDeferredPostTonemapLegacyGammaCorrectProgram);
+ mShaderList.push_back(&gNoPostTonemapLegacyGammaCorrectProgram);
+ mShaderList.push_back(&gCASLegacyGammaProgram);
mShaderList.push_back(&gDeferredPostGammaCorrectProgram); // for gamma
mShaderList.push_back(&gLegacyPostGammaCorrectProgram);
+ mShaderList.push_back(&gHDRGammaCorrectProgram);
mShaderList.push_back(&gDeferredDiffuseProgram);
mShaderList.push_back(&gDeferredBumpProgram);
mShaderList.push_back(&gDeferredPBROpaqueProgram);
@@ -545,7 +561,11 @@ void LLViewerShaderMgr::setShaders()
gSavedSettings.setString("RenderShaderCacheVersion", current_cache_version.asString());
}
- initShaderCache(shader_cache_enabled, old_cache_version, current_cache_version);
+ initShaderCache(
+ shader_cache_enabled,
+ old_cache_version,
+ current_cache_version,
+ LLAppViewer::instance()->isSecondInstance());
}
static LLCachedControl<U32> max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16);
@@ -703,7 +723,10 @@ void LLViewerShaderMgr::setShaders()
loaded = loaded && loadShadersDeferred();
llassert(loaded);
- persistShaderCacheMetadata();
+ if (!LLAppViewer::instance()->isSecondInstance())
+ {
+ persistShaderCacheMetadata();
+ }
if (gViewerWindow)
{
@@ -802,9 +825,12 @@ std::string LLViewerShaderMgr::loadBasicShaders()
if (shadow_detail >= 1)
{
- attribs["SUN_SHADOW"] = "1";
+ if(shadow_detail < 3)
+ {
+ attribs["SUN_SHADOW"] = "1";
+ }
- if (shadow_detail >= 2)
+ if (shadow_detail > 1)
{
attribs["SPOT_SHADOW"] = "1";
}
@@ -864,7 +890,7 @@ std::string LLViewerShaderMgr::loadBasicShaders()
std::vector<S32> index_channels;
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mShaderLevel[SHADER_WINDLIGHT] ) );
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsHelpersF.glsl", mShaderLevel[SHADER_WINDLIGHT] ) );
- index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/gammaF.glsl", mShaderLevel[SHADER_WINDLIGHT]) );
+ //index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/gammaF.glsl", mShaderLevel[SHADER_WINDLIGHT]) );
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsFuncs.glsl", mShaderLevel[SHADER_WINDLIGHT] ) );
index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsF.glsl", mShaderLevel[SHADER_WINDLIGHT] ) );
index_channels.push_back(-1); shaders.push_back( make_pair( "environment/waterFogF.glsl", mShaderLevel[SHADER_WATER] ) );
@@ -902,8 +928,9 @@ bool LLViewerShaderMgr::loadShadersWater()
bool success = true;
bool terrainWaterSuccess = true;
+ S32 shadow_detail = gSavedSettings.getS32("RenderShadowDetail");
bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1 &&
- gSavedSettings.getS32("RenderShadowDetail") > 0;
+ shadow_detail > 0 && shadow_detail < 3;
if (mShaderLevel[SHADER_WATER] == 0)
{
@@ -1003,6 +1030,52 @@ bool LLViewerShaderMgr::loadShadersEffects()
if (success)
{
+ gBloomExtractProgram.mName = "Bloom Extract Shader";
+ gBloomExtractProgram.mShaderFiles.clear();
+ gBloomExtractProgram.mShaderFiles.push_back(make_pair("effects/bloomExtractV.glsl", GL_VERTEX_SHADER));
+ gBloomExtractProgram.mShaderFiles.push_back(make_pair("effects/bloomExtractF.glsl", GL_FRAGMENT_SHADER));
+ gBloomExtractProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT];
+
+ success = gBloomExtractProgram.createShader();
+ if (!success)
+ {
+ LL_WARNS() << "gBloomExtractProgram creation ERROR" << LL_ENDL;
+ //LLPipeline::sRenderGlow = false;
+ }
+ }
+
+ if (success)
+ {
+ gBloomBlurProgram.mName = "Bloom Blur Shader";
+ gBloomBlurProgram.mShaderFiles.clear();
+ gBloomBlurProgram.mShaderFiles.push_back(make_pair("effects/bloomBlurV.glsl", GL_VERTEX_SHADER));
+ gBloomBlurProgram.mShaderFiles.push_back(make_pair("effects/bloomBlurF.glsl", GL_FRAGMENT_SHADER));
+ gBloomBlurProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT];
+
+ success = gBloomBlurProgram.createShader();
+ if(!success)
+ {
+ LL_WARNS() << "gBloomBlurProgram creation ERROR" << LL_ENDL;
+ }
+ }
+
+ if (success)
+ {
+ gBloomCombineProgram.mName = "Bloom Combine Shader";
+ gBloomCombineProgram.mShaderFiles.clear();
+ gBloomCombineProgram.mShaderFiles.push_back(make_pair("effects/bloomCombineV.glsl", GL_VERTEX_SHADER));
+ gBloomCombineProgram.mShaderFiles.push_back(make_pair("effects/bloomCombineF.glsl", GL_FRAGMENT_SHADER));
+ gBloomCombineProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT];
+
+ success = gBloomCombineProgram.createShader();
+ if(!success)
+ {
+ LL_WARNS() << "gBloomCombineProgram creation ERROR" << LL_ENDL;
+ }
+ }
+
+ if (success)
+ {
gGlowProgram.mName = "Glow Shader (Post)";
gGlowProgram.mShaderFiles.clear();
gGlowProgram.mShaderFiles.push_back(make_pair("effects/glowV.glsl", GL_VERTEX_SHADER));
@@ -1107,8 +1180,14 @@ bool LLViewerShaderMgr::loadShadersDeferred()
gLuminanceProgram.unload();
gDeferredPostGammaCorrectProgram.unload();
gLegacyPostGammaCorrectProgram.unload();
+ gHDRGammaCorrectProgram.unload();
gDeferredPostTonemapProgram.unload();
gNoPostTonemapProgram.unload();
+ gDeferredPostTonemapGammaCorrectProgram.unload();
+ gNoPostTonemapGammaCorrectProgram.unload();
+ gDeferredPostTonemapLegacyGammaCorrectProgram.unload();
+ gNoPostTonemapLegacyGammaCorrectProgram.unload();
+
for (auto i = 0; i < 4; ++i)
{
gFXAAProgram[i].unload();
@@ -1117,6 +1196,7 @@ bool LLViewerShaderMgr::loadShadersDeferred()
gSMAANeighborhoodBlendProgram[i].unload();
}
gCASProgram.unload();
+ gCASLegacyGammaProgram.unload();
gEnvironmentMapProgram.unload();
gDeferredWLSkyProgram.unload();
gDeferredWLCloudProgram.unload();
@@ -2450,6 +2530,21 @@ bool LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
+ gHDRGammaCorrectProgram.mName = "HDR Gamma Correction Post Process";
+ gHDRGammaCorrectProgram.mFeatures.hasSrgb = true;
+ gHDRGammaCorrectProgram.mFeatures.isDeferred = true;
+ gHDRGammaCorrectProgram.mShaderFiles.clear();
+ gHDRGammaCorrectProgram.clearPermutations();
+ //gHDRGammaCorrectProgram.addPermutation("HDR_GAMMA", "1");
+ gHDRGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gHDRGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/MPHDRDisplayGammaF.glsl", GL_FRAGMENT_SHADER));
+ gHDRGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ success = gHDRGammaCorrectProgram.createShader();
+ llassert(success);
+ }
+
+ if (success)
+ {
gDeferredPostTonemapProgram.mName = "Deferred Tonemap Post Process";
gDeferredPostTonemapProgram.mFeatures.hasSrgb = true;
gDeferredPostTonemapProgram.mFeatures.isDeferred = true;
@@ -2479,6 +2574,74 @@ bool LLViewerShaderMgr::loadShadersDeferred()
llassert(success);
}
+ if (success)
+ {
+ gDeferredPostTonemapGammaCorrectProgram.mName = "Deferred Tonemap Gamma Post Process";
+ gDeferredPostTonemapGammaCorrectProgram.mFeatures.hasSrgb = true;
+ gDeferredPostTonemapGammaCorrectProgram.mFeatures.isDeferred = true;
+ gDeferredPostTonemapGammaCorrectProgram.mFeatures.hasTonemap = true;
+ gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.clear();
+ gDeferredPostTonemapGammaCorrectProgram.clearPermutations();
+ gDeferredPostTonemapGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
+ gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
+ gDeferredPostTonemapGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ success = gDeferredPostTonemapGammaCorrectProgram.createShader();
+ llassert(success);
+ }
+
+ if (success)
+ {
+ gNoPostTonemapGammaCorrectProgram.mName = "No Post Tonemap Gamma Post Process";
+ gNoPostTonemapGammaCorrectProgram.mFeatures.hasSrgb = true;
+ gNoPostTonemapGammaCorrectProgram.mFeatures.isDeferred = true;
+ gNoPostTonemapGammaCorrectProgram.mFeatures.hasTonemap = true;
+ gNoPostTonemapGammaCorrectProgram.mShaderFiles.clear();
+ gNoPostTonemapGammaCorrectProgram.clearPermutations();
+ gNoPostTonemapGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
+ gNoPostTonemapGammaCorrectProgram.addPermutation("NO_POST", "1");
+ gNoPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gNoPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
+ gNoPostTonemapGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ success = gNoPostTonemapGammaCorrectProgram.createShader();
+ llassert(success);
+ }
+
+ if (success)
+ {
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mName = "Deferred Tonemap Legacy Gamma Post Process";
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mFeatures.hasSrgb = true;
+ gDeferredPostTonemapProgram.mFeatures.isDeferred = true;
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mFeatures.hasTonemap = true;
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.clear();
+ gDeferredPostTonemapLegacyGammaCorrectProgram.clearPermutations();
+ gDeferredPostTonemapLegacyGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
+ gDeferredPostTonemapLegacyGammaCorrectProgram.addPermutation("LEGACY_GAMMA", "1");
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
+ gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ success = gDeferredPostTonemapLegacyGammaCorrectProgram.createShader();
+ llassert(success);
+ }
+
+ if (success)
+ {
+ gNoPostTonemapLegacyGammaCorrectProgram.mName = "No Post Tonemap Legacy Gamma Post Process";
+ gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.hasSrgb = true;
+ gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.isDeferred = true;
+ gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.hasTonemap = true;
+ gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.clear();
+ gNoPostTonemapLegacyGammaCorrectProgram.clearPermutations();
+ gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("NO_POST", "1");
+ gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
+ gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("LEGACY_GAMMA", "1");
+ gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
+ gNoPostTonemapLegacyGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ success = gNoPostTonemapLegacyGammaCorrectProgram.createShader();
+ llassert(success);
+ }
+
if (success && gGLManager.mGLVersion > 3.9f)
{
std::vector<std::pair<std::string, std::string>> quality_levels = { {"12", "Low"},
@@ -2662,6 +2825,27 @@ bool LLViewerShaderMgr::loadShadersDeferred()
}
}
+ if (success && gGLManager.mGLVersion > 4.05f)
+ {
+ gCASLegacyGammaProgram.mName = "Contrast Adaptive Sharpening Legacy Gamma Shader";
+ gCASLegacyGammaProgram.mFeatures.hasSrgb = true;
+ gCASLegacyGammaProgram.mShaderFiles.clear();
+ gCASLegacyGammaProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
+ gCASLegacyGammaProgram.mShaderFiles.push_back(make_pair("deferred/CASF.glsl", GL_FRAGMENT_SHADER));
+ gCASLegacyGammaProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
+ gCASLegacyGammaProgram.clearPermutations();
+ gCASLegacyGammaProgram.addPermutation("GAMMA_CORRECT", "1");
+ gCASLegacyGammaProgram.addPermutation("LEGACY_GAMMA", "1");
+ success = gCASLegacyGammaProgram.createShader();
+ // llassert(success);
+ if (!success)
+ {
+ LL_WARNS() << "Failed to create shader '" << gCASProgram.mName << "', disabling!" << LL_ENDL;
+ // continue as if this shader never happened
+ success = true;
+ }
+ }
+
if (success)
{
gDeferredPostProgram.mName = "Deferred Post Shader";