]> OCCT Git - occt-copy.git/commitdiff
0029508: Visualization, TKOpenGl - visual artifacts on Adreno 305/308
authorkgv <kgv@opencascade.com>
Wed, 14 Feb 2018 17:18:39 +0000 (20:18 +0300)
committerkgv <kgv@opencascade.com>
Sat, 17 Mar 2018 12:30:09 +0000 (15:30 +0300)
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

index 27d96f9f3846552be609723e19cdc5d1685b1ef7..f57e4a9b66ca2abfde99ae58daa65888cd59dacc 100644 (file)
@@ -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