Skip to content

Commit 0dda1b0

Browse files
author
Rye
authored
Merge pull request #3260 from secondlife/rye/extra-glcompat
Fix crashes from shader load failures under RenderMaxOpenGLVersion 3.1/3.2/3.3
2 parents ae9174f + d17fd56 commit 0dda1b0

File tree

4 files changed

+77
-15
lines changed

4 files changed

+77
-15
lines changed

indra/llrender/llshadermgr.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,8 @@ GLuint LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_lev
580580
}
581581
else
582582
{
583-
if (type == GL_GEOMETRY_SHADER)
583+
// OpenGL 3.2 had GLSL version 1.50. anything after that the version numbers match.
584+
if (type == GL_GEOMETRY_SHADER || minor_version >= 50)
584585
{
585586
//set version to 1.50
586587
shader_code_text[shader_code_count++] = strdup("#version 150\n");

indra/newview/llfloaterpreferencesgraphicsadvanced.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,24 @@ LLFloaterPreferenceGraphicsAdvanced::~LLFloaterPreferenceGraphicsAdvanced()
6363

6464
bool LLFloaterPreferenceGraphicsAdvanced::postBuild()
6565
{
66-
// Don't do this on Mac as their braindead GL versioning
67-
// sets this when 8x and 16x are indeed available
66+
// Disable FSAA combo when shaders are not loaded
6867
//
69-
#if !LL_DARWIN
70-
if (gGLManager.mIsIntel || gGLManager.mGLVersion < 3.f)
71-
{ //remove FSAA settings above "4x"
68+
{
7269
LLComboBox* combo = getChild<LLComboBox>("fsaa");
73-
combo->remove("8x");
74-
combo->remove("16x");
70+
if (!gFXAAProgram[0].isComplete())
71+
combo->remove("FXAA");
72+
73+
if (!gSMAAEdgeDetectProgram[0].isComplete())
74+
combo->remove("SMAA");
75+
76+
if (!gFXAAProgram[0].isComplete() && !gSMAAEdgeDetectProgram[0].isComplete())
77+
{
78+
combo->setEnabled(false);
79+
getChild<LLComboBox>("fsaa quality")->setEnabled(false);
80+
}
7581
}
7682

83+
#if !LL_DARWIN
7784
LLCheckBoxCtrl *use_HiDPI = getChild<LLCheckBoxCtrl>("use HiDPI");
7885
use_HiDPI->setVisible(false);
7986
#endif

indra/newview/llviewershadermgr.cpp

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2512,6 +2512,7 @@ bool LLViewerShaderMgr::loadShadersDeferred()
25122512
{"28", "High"},
25132513
{"39", "Ultra"} };
25142514
int i = 0;
2515+
bool failed = false;
25152516
for (const auto& quality_pair : quality_levels)
25162517
{
25172518
if (success)
@@ -2535,19 +2536,36 @@ bool LLViewerShaderMgr::loadShadersDeferred()
25352536

25362537
gFXAAProgram[i].mShaderLevel = mShaderLevel[SHADER_DEFERRED];
25372538
success = gFXAAProgram[i].createShader();
2538-
llassert(success);
2539+
// llassert(success);
2540+
if (!success)
2541+
{
2542+
LL_WARNS() << "Failed to create shader '" << gFXAAProgram[i].mName << "', disabling!" << LL_ENDL;
2543+
// continue as if this shader never happened
2544+
failed = true;
2545+
success = true;
2546+
break;
2547+
}
25392548
}
25402549
++i;
25412550
}
2551+
2552+
if (failed)
2553+
{
2554+
for (auto i = 0; i < 4; ++i)
2555+
{
2556+
gFXAAProgram[i].unload();
2557+
}
2558+
}
25422559
}
25432560

25442561
if (gGLManager.mGLVersion > 3.15f && success)
25452562
{
25462563
std::vector<std::pair<std::string, std::string>> quality_levels = { {"SMAA_PRESET_LOW", "Low"},
25472564
{"SMAA_PRESET_MEDIUM", "Medium"},
25482565
{"SMAA_PRESET_HIGH", "High"},
2549-
{"SMAA_PRESET_ULTRA", "Ultra"} };
2566+
{"SMAA_PRESET_ULTRA", "Ultra"} };
25502567
int i = 0;
2568+
bool failed = false;
25512569
for (const auto& smaa_pair : quality_levels)
25522570
{
25532571
std::map<std::string, std::string> defines;
@@ -2576,6 +2594,15 @@ bool LLViewerShaderMgr::loadShadersDeferred()
25762594
gSMAAEdgeDetectProgram[i].mShaderFiles.push_back(make_pair("deferred/SMAA.glsl", GL_VERTEX_SHADER_ARB));
25772595
gSMAAEdgeDetectProgram[i].mShaderLevel = mShaderLevel[SHADER_DEFERRED];
25782596
success = gSMAAEdgeDetectProgram[i].createShader();
2597+
// llassert(success);
2598+
if (!success)
2599+
{
2600+
LL_WARNS() << "Failed to create shader '" << gSMAAEdgeDetectProgram[i].mName << "', disabling!" << LL_ENDL;
2601+
// continue as if this shader never happened
2602+
failed = true;
2603+
success = true;
2604+
break;
2605+
}
25792606
}
25802607

25812608
if (success)
@@ -2593,6 +2620,15 @@ bool LLViewerShaderMgr::loadShadersDeferred()
25932620
gSMAABlendWeightsProgram[i].mShaderFiles.push_back(make_pair("deferred/SMAA.glsl", GL_VERTEX_SHADER_ARB));
25942621
gSMAABlendWeightsProgram[i].mShaderLevel = mShaderLevel[SHADER_DEFERRED];
25952622
success = gSMAABlendWeightsProgram[i].createShader();
2623+
// llassert(success);
2624+
if (!success)
2625+
{
2626+
LL_WARNS() << "Failed to create shader '" << gSMAABlendWeightsProgram[i].mName << "', disabling!" << LL_ENDL;
2627+
// continue as if this shader never happened
2628+
failed = true;
2629+
success = true;
2630+
break;
2631+
}
25962632
}
25972633

25982634
if (success)
@@ -2610,9 +2646,28 @@ bool LLViewerShaderMgr::loadShadersDeferred()
26102646
gSMAANeighborhoodBlendProgram[i].mShaderFiles.push_back(make_pair("deferred/SMAA.glsl", GL_VERTEX_SHADER_ARB));
26112647
gSMAANeighborhoodBlendProgram[i].mShaderLevel = mShaderLevel[SHADER_DEFERRED];
26122648
success = gSMAANeighborhoodBlendProgram[i].createShader();
2649+
// llassert(success);
2650+
if (!success)
2651+
{
2652+
LL_WARNS() << "Failed to create shader '" << gSMAANeighborhoodBlendProgram[i].mName << "', disabling!" << LL_ENDL;
2653+
// continue as if this shader never happened
2654+
failed = true;
2655+
success = true;
2656+
break;
2657+
}
26132658
}
26142659
++i;
26152660
}
2661+
2662+
if (failed)
2663+
{
2664+
for (auto i = 0; i < 4; ++i)
2665+
{
2666+
gSMAAEdgeDetectProgram[i].unload();
2667+
gSMAABlendWeightsProgram[i].unload();
2668+
gSMAANeighborhoodBlendProgram[i].unload();
2669+
}
2670+
}
26162671
}
26172672

26182673
if (success && gGLManager.mGLVersion > 4.05f)

indra/newview/pipeline.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7396,8 +7396,7 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
73967396
{
73977397
{
73987398
llassert(!gCubeSnapshot);
7399-
bool multisample = RenderFSAAType == 1 && mFXAAMap.isComplete();
7400-
LLGLSLShader* shader = &gGlowCombineProgram;
7399+
bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete();
74017400

74027401
// Present everything.
74037402
if (multisample)
@@ -7410,7 +7409,7 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
74107409
mFXAAMap.bindTarget();
74117410
mFXAAMap.clear(GL_COLOR_BUFFER_BIT);
74127411

7413-
shader = &gGlowCombineFXAAProgram;
7412+
LLGLSLShader* shader = &gGlowCombineFXAAProgram;
74147413
shader->bind();
74157414

74167415
S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
@@ -7481,7 +7480,7 @@ void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
74817480
void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
74827481
{
74837482
llassert(!gCubeSnapshot);
7484-
bool multisample = RenderFSAAType == 2 && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete();
7483+
bool multisample = RenderFSAAType == 2 && gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete();
74857484

74867485
// Present everything.
74877486
if (multisample)
@@ -7599,7 +7598,7 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
75997598
void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)
76007599
{
76017600
llassert(!gCubeSnapshot);
7602-
bool multisample = RenderFSAAType == 2 && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete();
7601+
bool multisample = RenderFSAAType == 2 && gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete();
76037602

76047603
// Present everything.
76057604
if (multisample)

0 commit comments

Comments
 (0)