From: kgv Date: Wed, 14 Feb 2018 17:18:39 +0000 (+0300) Subject: 0029508: Visualization, TKOpenGl - visual artifacts on Adreno 305/308 X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=b359a731067c9c765a5d8fd8ca69d2090b439401;p=occt-copy.git 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. --- 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