From b359a731067c9c765a5d8fd8ca69d2090b439401 Mon Sep 17 00:00:00 2001 From: kgv Date: Wed, 14 Feb 2018 20:18:39 +0300 Subject: [PATCH] 0029508: Visualization, TKOpenGl - visual artifacts on Adreno 305/308 OpenGl_ShaderManager now: - prefers GLSL ES 100 over GLSL ES 300 on devices reporting OpenGL ES 3.0; - prefers GLSL ES 300 on devices reporting OpenGL ES 3.1+. to workaround known buggy implementations of OpenGL ES 3.0 drivers. --- src/OpenGl/OpenGl_ShaderManager.cxx | 39 ++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/OpenGl/OpenGl_ShaderManager.cxx b/src/OpenGl/OpenGl_ShaderManager.cxx index 27d96f9f38..f57e4a9b66 100644 --- a/src/OpenGl/OpenGl_ShaderManager.cxx +++ b/src/OpenGl/OpenGl_ShaderManager.cxx @@ -1185,8 +1185,10 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFont() aProgramSrc->SetHeader ("#version 150"); } #else - if (myContext->IsGlGreaterEqual (3, 0)) + if (myContext->IsGlGreaterEqual (3, 1)) { + // prefer "100 es" on OpenGL ES 3.0 devices + // and "300 es" on newer devices (3.1+) aProgramSrc->SetHeader ("#version 300 es"); } #endif @@ -1520,6 +1522,12 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad { aProgramSrc->SetNbFragmentOutputs (2); aProgramSrc->SetWeightOitOutput (true); + #if defined(GL_ES_VERSION_2_0) + if (myContext->IsGlGreaterEqual (3, 0)) + { + aProgramSrc->SetHeader ("#version 300 es"); + } + #endif } TCollection_AsciiString aSrcVertEndMain; @@ -1529,6 +1537,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad #if defined(GL_ES_VERSION_2_0) if (myContext->IsGlGreaterEqual (3, 0)) { + aProgramSrc->SetHeader ("#version 300 es"); hasGlslBitOps = true; } #else @@ -1599,8 +1608,10 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFlat (Handle(OpenGl_Shad aProgramSrc->SetHeader ("#version 150"); } #else - if (myContext->IsGlGreaterEqual (3, 0)) + if (myContext->IsGlGreaterEqual (3, 1)) { + // prefer "100 es" on OpenGL ES 3.0 devices + // and "300 es" on newer devices (3.1+) aProgramSrc->SetHeader ("#version 300 es"); } #endif @@ -1829,6 +1840,12 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S { aProgramSrc->SetNbFragmentOutputs (2); aProgramSrc->SetWeightOitOutput (true); + #if defined(GL_ES_VERSION_2_0) + if (myContext->IsGlGreaterEqual (3, 0)) + { + aProgramSrc->SetHeader ("#version 300 es"); + } + #endif } Standard_Integer aNbLights = 0; @@ -1873,8 +1890,10 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S aProgramSrc->SetHeader ("#version 150"); } #else - if (myContext->IsGlGreaterEqual (3, 0)) + if (myContext->IsGlGreaterEqual (3, 1)) { + // prefer "100 es" on OpenGL ES 3.0 devices + // and "300 es" on newer devices (3.1+) aProgramSrc->SetHeader ("#version 300 es"); } #endif @@ -2033,13 +2052,19 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha aProgramSrc->SetHeader ("#version 150"); } #else - if (myContext->IsGlGreaterEqual (3, 0)) + if (myContext->IsGlGreaterEqual (3, 1)) { + // prefer "100 es" on OpenGL ES 3.0 devices + // and "300 es" on newer devices (3.1+) aProgramSrc->SetHeader ("#version 300 es"); } else if (isFlatNormal) { - if (myContext->oesStdDerivatives) + if (myContext->IsGlGreaterEqual (3, 0)) + { + aProgramSrc->SetHeader ("#version 300 es"); + } + else if (myContext->oesStdDerivatives) { aProgramSrc->SetHeader ("#extension GL_OES_standard_derivatives : enable"); } @@ -2269,8 +2294,10 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramStereo (Handle(OpenGl_Sh aProgramSrc->SetHeader ("#version 150"); } #else - if (myContext->IsGlGreaterEqual (3, 0)) + if (myContext->IsGlGreaterEqual (3, 1)) { + // prefer "100 es" on OpenGL ES 3.0 devices + // and "300 es" on newer devices (3.1+) aProgramSrc->SetHeader ("#version 300 es"); } #endif -- 2.39.5