0032145: Coding Rules - move GL functions loading to OpenGl_GlFunctions.cxx
[occt.git] / src / OpenGl / OpenGl_Context.cxx
index 79e87cc..0fdb775 100644 (file)
@@ -1418,17 +1418,11 @@ void OpenGl_Context::init (const Standard_Boolean theIsCoreProfile)
   myMaxMsaaSamples = 0;
   myMaxDrawBuffers = 1;
   myMaxColorAttachments = 1;
+  myDefaultVao = 0;
   ReadGlVersion (myGlVerMajor, myGlVerMinor);
   myVendor = (const char* )::glGetString (GL_VENDOR);
   myVendor.LowerCase();
-
-  // standard formats
   mySupportedFormats->Clear();
-  mySupportedFormats->Add (Image_Format_Gray);
-  mySupportedFormats->Add (Image_Format_Alpha);
-  mySupportedFormats->Add (Image_Format_RGB);
-  mySupportedFormats->Add (Image_Format_RGB32);
-  mySupportedFormats->Add (Image_Format_RGBA);
 
   if (caps->contextMajorVersionUpper != -1)
   {
@@ -1514,552 +1508,30 @@ void OpenGl_Context::init (const Standard_Boolean theIsCoreProfile)
   }
 #endif
 
-  core11     = NULL;
-  if (!isCoreProfile)
-  {
-    core11 = (OpenGl_GlCore11* )(&(*myFuncs));
-  }
-  core11fwd  = (OpenGl_GlCore11Fwd* )(&(*myFuncs));
-  core15     = NULL;
-  core15fwd  = NULL;
-  core20     = NULL;
-  core20fwd  = NULL;
-  core30     = NULL;
-  core30fwd  = NULL;
-  core32     = NULL;
-  core32back = NULL;
-  core33     = NULL;
-  core33back = NULL;
-  core41     = NULL;
-  core41back = NULL;
-  core42     = NULL;
-  core42back = NULL;
-  core43     = NULL;
-  core43back = NULL;
-  core44     = NULL;
-  core44back = NULL;
-  core45     = NULL;
-  core45back = NULL;
-  arbTBO     = NULL;
-  arbTboRGB32 = Standard_False;
-  arbIns     = NULL;
-  arbDbg     = NULL;
-  arbFBO     = NULL;
-  arbFBOBlit = NULL;
-  extGS      = NULL;
-  myDefaultVao = 0;
-
-  //! Make record shorter to retrieve function pointer using variable with same name
-  const char* aLastFailedProc = NULL;
-  #define FindProcShort(theFunc) FindProcVerbose(aLastFailedProc, #theFunc, myFuncs->theFunc)
-
-#if defined(GL_ES_VERSION_2_0)
-
-  hasTexRGBA8 = IsGlGreaterEqual (3, 0)
-             || CheckExtension ("GL_OES_rgb8_rgba8");
-  hasTexSRGB  = IsGlGreaterEqual (3, 0);
-  hasFboSRGB  = IsGlGreaterEqual (3, 0);
-  hasFboRenderMipmap = IsGlGreaterEqual (3, 0)
-                    || CheckExtension ("GL_OES_fbo_render_mipmap");
-  hasSRGBControl = CheckExtension ("GL_EXT_sRGB_write_control");
-  hasPackRowLength   = IsGlGreaterEqual (3, 0);
-  hasUnpackRowLength = IsGlGreaterEqual (3, 0); // || CheckExtension ("GL_EXT_unpack_subimage");
-  // NPOT textures has limited support within OpenGL ES 2.0
-  // which are relaxed by OpenGL ES 3.0 or some extensions
-  //arbNPTW     = IsGlGreaterEqual (3, 0)
-  //           || CheckExtension ("GL_OES_texture_npot")
-  //           || CheckExtension ("GL_NV_texture_npot_2D_mipmap");
-  arbNPTW     = Standard_True;
-  arbTexRG    = IsGlGreaterEqual (3, 0)
-             || CheckExtension ("GL_EXT_texture_rg");
-  extBgra     = CheckExtension ("GL_EXT_texture_format_BGRA8888");
-  extAnis = CheckExtension ("GL_EXT_texture_filter_anisotropic");
-  extPDS  = IsGlGreaterEqual (3, 0)
-         || CheckExtension ("GL_OES_packed_depth_stencil");
-#ifdef __EMSCRIPTEN__
-  if (!extPDS
-    && checkEnableWebGlExtension (*this, "GL_WEBGL_depth_texture"))
-  {
-    extPDS = true; // WebGL 1.0 extension (in WebGL 2.0 core)
-  }
-#endif
-
-  if (extBgra)
-  {
-    // no BGR on OpenGL ES - only BGRA as extension
-    mySupportedFormats->Add (Image_Format_BGR32);
-    mySupportedFormats->Add (Image_Format_BGRA);
-  }
-
-  core11fwd = (OpenGl_GlCore11Fwd* )(&(*myFuncs));
-  if (IsGlGreaterEqual (2, 0))
-  {
-    // enable compatible functions
-    core20    = (OpenGl_GlCore20*    )(&(*myFuncs));
-    core20fwd = (OpenGl_GlCore20Fwd* )(&(*myFuncs));
-    core15fwd = (OpenGl_GlCore15Fwd* )(&(*myFuncs));
-    arbFBO    = (OpenGl_ArbFBO*      )(&(*myFuncs));
-  }
-  if (IsGlGreaterEqual (3, 0)
-   && FindProcShort (glBlitFramebuffer))
-  {
-    arbFBOBlit = (OpenGl_ArbFBOBlit* )(&(*myFuncs));
-  }
-  if (IsGlGreaterEqual (3, 0)
-   && FindProcShort (glGenSamplers)
-   && FindProcShort (glDeleteSamplers)
-   && FindProcShort (glIsSampler)
-   && FindProcShort (glBindSampler)
-   && FindProcShort (glSamplerParameteri)
-   && FindProcShort (glSamplerParameteriv)
-   && FindProcShort (glSamplerParameterf)
-   && FindProcShort (glSamplerParameterfv)
-   && FindProcShort (glGetSamplerParameteriv)
-   && FindProcShort (glGetSamplerParameterfv))
-   //&& FindProcShort (glSamplerParameterIiv) // only on Desktop or with extensions GL_OES_texture_border_clamp/GL_EXT_texture_border_clamp
-   //&& FindProcShort (glSamplerParameterIuiv)
-   //&& FindProcShort (glGetSamplerParameterIiv)
-   //&& FindProcShort (glGetSamplerParameterIuiv))
-  {
-    arbSamplerObject = (OpenGl_ArbSamplerObject* )(&(*myFuncs));
-  }
-  extFragDepth = !IsGlGreaterEqual(3, 0)
-               && CheckExtension ("GL_EXT_frag_depth");
-  if (IsGlGreaterEqual (3, 1)
-   && FindProcShort (glTexStorage2DMultisample))
-  {
-    // MSAA RenderBuffers have been defined in OpenGL ES 3.0,
-    // but MSAA Textures - only in OpenGL ES 3.1+
-    ::glGetIntegerv (GL_MAX_SAMPLES, &myMaxMsaaSamples);
-  }
-
-  hasUintIndex = IsGlGreaterEqual (3, 0)
-              || CheckExtension ("GL_OES_element_index_uint");
-  hasHighp     = CheckExtension ("GL_OES_fragment_precision_high");
-  GLint aRange[2] = {0, 0};
-  GLint aPrec     = 0;
-  ::glGetShaderPrecisionFormat (GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, aRange, &aPrec);
-  if (aPrec != 0)
-  {
-    hasHighp = Standard_True;
-  }
-
-  arbTexFloat = (IsGlGreaterEqual (3, 0)
-              && FindProcShort (glTexImage3D))
-              || CheckExtension ("GL_OES_texture_float");
-  hasTexFloatLinear = arbTexFloat
-                   && CheckExtension ("GL_OES_texture_float_linear");
-
-  const bool hasTexBuffer32  = IsGlGreaterEqual (3, 2) && FindProcShort (glTexBuffer);
-  const bool hasExtTexBuffer = CheckExtension ("GL_EXT_texture_buffer") && FindProc ("glTexBufferEXT", myFuncs->glTexBuffer);
-  if (hasTexBuffer32 || hasExtTexBuffer)
-  {
-    arbTBO = reinterpret_cast<OpenGl_ArbTBO*> (myFuncs.get());
-  }
-
-  bool hasInstanced = IsGlGreaterEqual (3, 0)
-       && FindProcShort (glVertexAttribDivisor)
-       && FindProcShort (glDrawArraysInstanced)
-       && FindProcShort (glDrawElementsInstanced);
-  if (!hasInstanced)
-  {
-    hasInstanced = CheckExtension ("GL_ANGLE_instanced_arrays")
-       && FindProc ("glVertexAttribDivisorANGLE",   myFuncs->glVertexAttribDivisor)
-       && FindProc ("glDrawArraysInstancedANGLE",   myFuncs->glDrawArraysInstanced)
-       && FindProc ("glDrawElementsInstancedANGLE", myFuncs->glDrawElementsInstanced);
-  }
-  if (hasInstanced)
-  {
-    arbIns = (OpenGl_ArbIns* )(&(*myFuncs));
-  }
-
-  const bool hasVAO = IsGlGreaterEqual (3, 0)
-       && FindProcShort (glBindVertexArray)
-       && FindProcShort (glDeleteVertexArrays)
-       && FindProcShort (glGenVertexArrays)
-       && FindProcShort (glIsVertexArray);
-#ifndef __EMSCRIPTEN__ // latest Emscripten does not pretend having / simulating mapping buffer functions
-  const bool hasMapBufferRange = IsGlGreaterEqual (3, 0)
-       && FindProcShort (glMapBufferRange)
-       && FindProcShort (glUnmapBuffer)
-       && FindProcShort (glGetBufferPointerv)
-       && FindProcShort (glFlushMappedBufferRange);
-#endif
-
-  // load OpenGL ES 3.0 new functions
-  const bool has30es = IsGlGreaterEqual (3, 0)
-       && hasVAO
-    #ifndef __EMSCRIPTEN__
-       && hasMapBufferRange
-    #endif
-       && hasInstanced
-       && arbSamplerObject != NULL
-       && arbFBOBlit != NULL
-       && FindProcShort (glReadBuffer)
-       && FindProcShort (glDrawRangeElements)
-       && FindProcShort (glTexImage3D)
-       && FindProcShort (glTexSubImage3D)
-       && FindProcShort (glCopyTexSubImage3D)
-       && FindProcShort (glCompressedTexImage3D)
-       && FindProcShort (glCompressedTexSubImage3D)
-       && FindProcShort (glGenQueries)
-       && FindProcShort (glDeleteQueries)
-       && FindProcShort (glIsQuery)
-       && FindProcShort (glBeginQuery)
-       && FindProcShort (glEndQuery)
-       && FindProcShort (glGetQueryiv)
-       && FindProcShort (glGetQueryObjectuiv)
-       && FindProcShort (glDrawBuffers)
-       && FindProcShort (glUniformMatrix2x3fv)
-       && FindProcShort (glUniformMatrix3x2fv)
-       && FindProcShort (glUniformMatrix2x4fv)
-       && FindProcShort (glUniformMatrix4x2fv)
-       && FindProcShort (glUniformMatrix3x4fv)
-       && FindProcShort (glUniformMatrix4x3fv)
-       && FindProcShort (glRenderbufferStorageMultisample)
-       && FindProcShort (glFramebufferTextureLayer)
-       && FindProcShort (glGetIntegeri_v)
-       && FindProcShort (glBeginTransformFeedback)
-       && FindProcShort (glEndTransformFeedback)
-       && FindProcShort (glBindBufferRange)
-       && FindProcShort (glBindBufferBase)
-       && FindProcShort (glTransformFeedbackVaryings)
-       && FindProcShort (glGetTransformFeedbackVarying)
-       && FindProcShort (glVertexAttribIPointer)
-       && FindProcShort (glGetVertexAttribIiv)
-       && FindProcShort (glGetVertexAttribIuiv)
-       && FindProcShort (glVertexAttribI4i)
-       && FindProcShort (glVertexAttribI4ui)
-       && FindProcShort (glVertexAttribI4iv)
-       && FindProcShort (glVertexAttribI4uiv)
-       && FindProcShort (glGetUniformuiv)
-       && FindProcShort (glGetFragDataLocation)
-       && FindProcShort (glUniform1ui)
-       && FindProcShort (glUniform2ui)
-       && FindProcShort (glUniform3ui)
-       && FindProcShort (glUniform4ui)
-       && FindProcShort (glUniform1uiv)
-       && FindProcShort (glUniform2uiv)
-       && FindProcShort (glUniform3uiv)
-       && FindProcShort (glUniform4uiv)
-       && FindProcShort (glClearBufferiv)
-       && FindProcShort (glClearBufferuiv)
-       && FindProcShort (glClearBufferfv)
-       && FindProcShort (glClearBufferfi)
-       && FindProcShort (glGetStringi)
-       && FindProcShort (glCopyBufferSubData)
-       && FindProcShort (glGetUniformIndices)
-       && FindProcShort (glGetActiveUniformsiv)
-       && FindProcShort (glGetUniformBlockIndex)
-       && FindProcShort (glGetActiveUniformBlockiv)
-       && FindProcShort (glGetActiveUniformBlockName)
-       && FindProcShort (glUniformBlockBinding)
-       && FindProcShort (glFenceSync)
-       && FindProcShort (glIsSync)
-       && FindProcShort (glDeleteSync)
-       && FindProcShort (glClientWaitSync)
-       && FindProcShort (glWaitSync)
-       && FindProcShort (glGetInteger64v)
-       && FindProcShort (glGetSynciv)
-       && FindProcShort (glGetInteger64i_v)
-       && FindProcShort (glGetBufferParameteri64v)
-       && FindProcShort (glBindTransformFeedback)
-       && FindProcShort (glDeleteTransformFeedbacks)
-       && FindProcShort (glGenTransformFeedbacks)
-       && FindProcShort (glIsTransformFeedback)
-       && FindProcShort (glPauseTransformFeedback)
-       && FindProcShort (glResumeTransformFeedback)
-       && FindProcShort (glGetProgramBinary)
-       && FindProcShort (glProgramBinary)
-       && FindProcShort (glProgramParameteri)
-       && FindProcShort (glInvalidateFramebuffer)
-       && FindProcShort (glInvalidateSubFramebuffer)
-       && FindProcShort (glTexStorage2D)
-       && FindProcShort (glTexStorage3D)
-       && FindProcShort (glGetInternalformativ);
-  if (!has30es)
-  {
-    checkWrongVersion (3, 0, aLastFailedProc);
-  }
-  else
-  {
-    core30    = (OpenGl_GlCore30*    )(&(*myFuncs));
-    core30fwd = (OpenGl_GlCore30Fwd* )(&(*myFuncs));
-    hasGetBufferData = true;
-  }
-
-  // load OpenGL ES 3.1 new functions
-  const bool has31es = IsGlGreaterEqual (3, 1)
-       && has30es
-       && FindProcShort (glDispatchCompute)
-       && FindProcShort (glDispatchComputeIndirect)
-       && FindProcShort (glDrawArraysIndirect)
-       && FindProcShort (glDrawElementsIndirect)
-       && FindProcShort (glFramebufferParameteri)
-       && FindProcShort (glGetFramebufferParameteriv)
-       && FindProcShort (glGetProgramInterfaceiv)
-       && FindProcShort (glGetProgramResourceIndex)
-       && FindProcShort (glGetProgramResourceName)
-       && FindProcShort (glGetProgramResourceiv)
-       && FindProcShort (glGetProgramResourceLocation)
-       && FindProcShort (glUseProgramStages)
-       && FindProcShort (glActiveShaderProgram)
-       && FindProcShort (glCreateShaderProgramv)
-       && FindProcShort (glBindProgramPipeline)
-       && FindProcShort (glDeleteProgramPipelines)
-       && FindProcShort (glGenProgramPipelines)
-       && FindProcShort (glIsProgramPipeline)
-       && FindProcShort (glGetProgramPipelineiv)
-       && FindProcShort (glProgramUniform1i)
-       && FindProcShort (glProgramUniform2i)
-       && FindProcShort (glProgramUniform3i)
-       && FindProcShort (glProgramUniform4i)
-       && FindProcShort (glProgramUniform1ui)
-       && FindProcShort (glProgramUniform2ui)
-       && FindProcShort (glProgramUniform3ui)
-       && FindProcShort (glProgramUniform4ui)
-       && FindProcShort (glProgramUniform1f)
-       && FindProcShort (glProgramUniform2f)
-       && FindProcShort (glProgramUniform3f)
-       && FindProcShort (glProgramUniform4f)
-       && FindProcShort (glProgramUniform1iv)
-       && FindProcShort (glProgramUniform2iv)
-       && FindProcShort (glProgramUniform3iv)
-       && FindProcShort (glProgramUniform4iv)
-       && FindProcShort (glProgramUniform1uiv)
-       && FindProcShort (glProgramUniform2uiv)
-       && FindProcShort (glProgramUniform3uiv)
-       && FindProcShort (glProgramUniform4uiv)
-       && FindProcShort (glProgramUniform1fv)
-       && FindProcShort (glProgramUniform2fv)
-       && FindProcShort (glProgramUniform3fv)
-       && FindProcShort (glProgramUniform4fv)
-       && FindProcShort (glProgramUniformMatrix2fv)
-       && FindProcShort (glProgramUniformMatrix3fv)
-       && FindProcShort (glProgramUniformMatrix4fv)
-       && FindProcShort (glProgramUniformMatrix2x3fv)
-       && FindProcShort (glProgramUniformMatrix3x2fv)
-       && FindProcShort (glProgramUniformMatrix2x4fv)
-       && FindProcShort (glProgramUniformMatrix4x2fv)
-       && FindProcShort (glProgramUniformMatrix3x4fv)
-       && FindProcShort (glProgramUniformMatrix4x3fv)
-       && FindProcShort (glValidateProgramPipeline)
-       && FindProcShort (glGetProgramPipelineInfoLog)
-       && FindProcShort (glBindImageTexture)
-       && FindProcShort (glGetBooleani_v)
-       && FindProcShort (glMemoryBarrier)
-       && FindProcShort (glMemoryBarrierByRegion)
-       && FindProcShort (glTexStorage2DMultisample)
-       && FindProcShort (glGetMultisamplefv)
-       && FindProcShort (glSampleMaski)
-       && FindProcShort (glGetTexLevelParameteriv)
-       && FindProcShort (glGetTexLevelParameterfv)
-       && FindProcShort (glBindVertexBuffer)
-       && FindProcShort (glVertexAttribFormat)
-       && FindProcShort (glVertexAttribIFormat)
-       && FindProcShort (glVertexAttribBinding)
-       && FindProcShort (glVertexBindingDivisor);
-  if (!has31es)
-  {
-    checkWrongVersion (3, 1, aLastFailedProc);
-  }
+  myFuncs->load (*this, isCoreProfile);
 
   // initialize debug context extension
-  if (IsGlGreaterEqual (3, 2)
-   || CheckExtension ("GL_KHR_debug"))
-  {
-    // this functionality become a part of OpenGL ES 3.2
-    arbDbg = NULL;
-    if (IsGlGreaterEqual (3, 2)
-     && FindProcShort (glDebugMessageControl)
-     && FindProcShort (glDebugMessageInsert)
-     && FindProcShort (glDebugMessageCallback)
-     && FindProcShort (glGetDebugMessageLog))
+  if (arbDbg != NULL
+   && caps->contextDebug)
+  {
+    // setup default callback
+    myIsGlDebugCtx = Standard_True;
+    arbDbg->glDebugMessageCallback (debugCallbackWrap, this);
+  #if defined(GL_ES_VERSION_2_0)
+    ::glEnable (GL_DEBUG_OUTPUT);
+  #else
+    if (core43 != NULL)
     {
-      arbDbg = (OpenGl_ArbDbg* )(&(*myFuncs));
+      ::glEnable (GL_DEBUG_OUTPUT);
     }
-    // According to GL_KHR_debug spec, all functions should have KHR suffix.
-    // However, some implementations can export these functions without suffix.
-    else if (!IsGlGreaterEqual (3, 2)
-     && FindProc ("glDebugMessageControlKHR",  myFuncs->glDebugMessageControl)
-     && FindProc ("glDebugMessageInsertKHR",   myFuncs->glDebugMessageInsert)
-     && FindProc ("glDebugMessageCallbackKHR", myFuncs->glDebugMessageCallback)
-     && FindProc ("glGetDebugMessageLogKHR",   myFuncs->glGetDebugMessageLog))
+  #endif
+    if (caps->contextSyncDebug)
     {
-      arbDbg = (OpenGl_ArbDbg* )(&(*myFuncs));
-    }
-
-    if (arbDbg != NULL
-     && caps->contextDebug)
-    {
-      // setup default callback
-      myIsGlDebugCtx = Standard_True;
-      arbDbg->glDebugMessageCallback (debugCallbackWrap, this);
-      ::glEnable (GL_DEBUG_OUTPUT);
-      if (caps->contextSyncDebug)
-      {
-        // note that some broken implementations (e.g. simulators) might generate error message on this call
-        ::glEnable (GL_DEBUG_OUTPUT_SYNCHRONOUS);
-      }
+      // note that some broken implementations (e.g. simulators) might generate error message on this call
+      ::glEnable (GL_DEBUG_OUTPUT_SYNCHRONOUS);
     }
   }
 
-  // load OpenGL ES 3.2 new functions
-  const bool has32es = IsGlGreaterEqual (3, 2)
-       && has31es
-       && hasTexBuffer32
-       && arbDbg != NULL
-       && FindProcShort (glBlendBarrier)
-       && FindProcShort (glCopyImageSubData)
-       && FindProcShort (glPushDebugGroup)
-       && FindProcShort (glPopDebugGroup)
-       && FindProcShort (glObjectLabel)
-       && FindProcShort (glGetObjectLabel)
-       && FindProcShort (glObjectPtrLabel)
-       && FindProcShort (glGetObjectPtrLabel)
-       && FindProcShort (glGetPointerv)
-       && FindProcShort (glEnablei)
-       && FindProcShort (glDisablei)
-       && FindProcShort (glBlendEquationi)
-       && FindProcShort (glBlendEquationSeparatei)
-       && FindProcShort (glBlendFunci)
-       && FindProcShort (glBlendFuncSeparatei)
-       && FindProcShort (glColorMaski)
-       && FindProcShort (glIsEnabledi)
-       && FindProcShort (glDrawElementsBaseVertex)
-       && FindProcShort (glDrawRangeElementsBaseVertex)
-       && FindProcShort (glDrawElementsInstancedBaseVertex)
-       && FindProcShort (glFramebufferTexture)
-       && FindProcShort (glPrimitiveBoundingBox)
-       && FindProcShort (glGetGraphicsResetStatus)
-       && FindProcShort (glReadnPixels)
-       && FindProcShort (glGetnUniformfv)
-       && FindProcShort (glGetnUniformiv)
-       && FindProcShort (glGetnUniformuiv)
-       && FindProcShort (glMinSampleShading)
-       && FindProcShort (glPatchParameteri)
-       && FindProcShort (glTexParameterIiv)
-       && FindProcShort (glTexParameterIuiv)
-       && FindProcShort (glGetTexParameterIiv)
-       && FindProcShort (glGetTexParameterIuiv)
-       && FindProcShort (glSamplerParameterIiv)
-       && FindProcShort (glSamplerParameterIuiv)
-       && FindProcShort (glGetSamplerParameterIiv)
-       && FindProcShort (glGetSamplerParameterIuiv)
-       && FindProcShort (glTexBufferRange)
-       && FindProcShort (glTexStorage3DMultisample);
-  if (!has32es)
-  {
-    checkWrongVersion (3, 2, aLastFailedProc);
-  }
-
-  extDrawBuffers = CheckExtension ("GL_EXT_draw_buffers") && FindProc ("glDrawBuffersEXT", myFuncs->glDrawBuffers);
-  arbDrawBuffers = CheckExtension ("GL_ARB_draw_buffers") && FindProc ("glDrawBuffersARB", myFuncs->glDrawBuffers);
-
-  if (IsGlGreaterEqual (3, 0) && FindProcShort (glDrawBuffers))
-  {
-    hasDrawBuffers = OpenGl_FeatureInCore;
-  }
-  else if (extDrawBuffers || arbDrawBuffers)
-  {
-    hasDrawBuffers = OpenGl_FeatureInExtensions;
-  }
-
-  hasFloatBuffer     = IsGlGreaterEqual (3, 2) ? OpenGl_FeatureInCore :
-                       CheckExtension ("GL_EXT_color_buffer_float") ? OpenGl_FeatureInExtensions 
-                                                                    : OpenGl_FeatureNotAvailable;
-  hasHalfFloatBuffer = IsGlGreaterEqual (3, 2) ? OpenGl_FeatureInCore :
-                       CheckExtension ("GL_EXT_color_buffer_half_float") ? OpenGl_FeatureInExtensions 
-                                                                         : OpenGl_FeatureNotAvailable;
-
-  oesSampleVariables = CheckExtension ("GL_OES_sample_variables");
-  oesStdDerivatives  = CheckExtension ("GL_OES_standard_derivatives");
-  hasSampleVariables = IsGlGreaterEqual (3, 2) ? OpenGl_FeatureInCore :
-                       oesSampleVariables ? OpenGl_FeatureInExtensions
-                                          : OpenGl_FeatureNotAvailable;
-  hasGlslBitwiseOps = IsGlGreaterEqual (3, 0)
-                    ? OpenGl_FeatureInCore
-                    : OpenGl_FeatureNotAvailable;
-  // without hasHighp, dFdx/dFdy precision is considered too low for flat shading (visual artifacts)
-  hasFlatShading = IsGlGreaterEqual (3, 0)
-                 ? OpenGl_FeatureInCore
-                  : (oesStdDerivatives && hasHighp
-                   ? OpenGl_FeatureInExtensions
-                   : OpenGl_FeatureNotAvailable);
-  if (!IsGlGreaterEqual (3, 1)
-    && myVendor.Search("qualcomm") != -1)
-  {
-    // dFdx/dFdy are completely broken on tested Adreno devices with versions below OpenGl ES 3.1
-    hasFlatShading = OpenGl_FeatureNotAvailable;
-  }
-
-  hasGeometryStage = IsGlGreaterEqual (3, 2)
-                   ? OpenGl_FeatureInCore
-                   : (CheckExtension ("GL_EXT_geometry_shader") && CheckExtension ("GL_EXT_shader_io_blocks")
-                     ? OpenGl_FeatureInExtensions
-                     : OpenGl_FeatureNotAvailable);
-#else
-
-  myTexClamp = IsGlGreaterEqual (1, 2) ? GL_CLAMP_TO_EDGE : GL_CLAMP;
-
-  hasTexRGBA8 = Standard_True;
-  hasTexSRGB       = IsGlGreaterEqual (2, 1);
-  hasFboSRGB       = IsGlGreaterEqual (2, 1);
-  hasSRGBControl   = hasFboSRGB;
-  hasFboRenderMipmap = Standard_True;
-  arbDrawBuffers   = CheckExtension ("GL_ARB_draw_buffers");
-  arbNPTW          = CheckExtension ("GL_ARB_texture_non_power_of_two");
-  arbTexFloat      = IsGlGreaterEqual (3, 0)
-                  || CheckExtension ("GL_ARB_texture_float");
-  hasTexFloatLinear = arbTexFloat;
-  arbSampleShading = CheckExtension ("GL_ARB_sample_shading");
-  arbDepthClamp    = IsGlGreaterEqual (3, 2)
-                  || CheckExtension ("GL_ARB_depth_clamp")
-                  || CheckExtension ("NV_depth_clamp");
-  extBgra          = IsGlGreaterEqual (1, 2)
-                  || CheckExtension ("GL_EXT_bgra");
-  extAnis          = CheckExtension ("GL_EXT_texture_filter_anisotropic");
-  extPDS           = CheckExtension ("GL_EXT_packed_depth_stencil");
-  atiMem           = CheckExtension ("GL_ATI_meminfo");
-  nvxMem           = CheckExtension ("GL_NVX_gpu_memory_info");
-
-  if (extBgra)
-  {
-    mySupportedFormats->Add (Image_Format_BGR);
-    mySupportedFormats->Add (Image_Format_BGR32);
-    mySupportedFormats->Add (Image_Format_BGRA);
-  }
-
-  hasDrawBuffers = IsGlGreaterEqual (2, 0) ? OpenGl_FeatureInCore :
-                   arbDrawBuffers ? OpenGl_FeatureInExtensions 
-                                  : OpenGl_FeatureNotAvailable;
-
-  hasGlslBitwiseOps = IsGlGreaterEqual (3, 0)
-                    ? OpenGl_FeatureInCore
-                    : CheckExtension ("GL_EXT_gpu_shader4")
-                     ? OpenGl_FeatureInExtensions
-                     : OpenGl_FeatureNotAvailable;
-
-  hasFloatBuffer = hasHalfFloatBuffer =  IsGlGreaterEqual (3, 0) ? OpenGl_FeatureInCore :
-                                         CheckExtension ("GL_ARB_color_buffer_float") ? OpenGl_FeatureInExtensions
-                                                                                      : OpenGl_FeatureNotAvailable;
-
-  hasGeometryStage = IsGlGreaterEqual (3, 2)
-                   ? OpenGl_FeatureInCore
-                   : OpenGl_FeatureNotAvailable;
-
-  hasSampleVariables = IsGlGreaterEqual (4, 0) ? OpenGl_FeatureInCore :
-                        arbSampleShading ? OpenGl_FeatureInExtensions
-                                         : OpenGl_FeatureNotAvailable;
-
-  GLint aStereo = GL_FALSE;
-  glGetIntegerv (GL_STEREO, &aStereo);
-  myIsStereoBuffers = aStereo == 1;
-
-  // get number of maximum clipping planes
-  glGetIntegerv (GL_MAX_CLIP_PLANES,  &myMaxClipPlanes);
-#endif
-
   if (hasDrawBuffers)
   {
     glGetIntegerv (GL_MAX_DRAW_BUFFERS,      &myMaxDrawBuffers);
@@ -2105,1229 +1577,51 @@ void OpenGl_Context::init (const Standard_Boolean theIsCoreProfile)
 
   myClippingState.Init();
 
-#if !defined(GL_ES_VERSION_2_0)
-
-  bool has12 = false;
-  bool has13 = false;
-  bool has14 = false;
-  bool has15 = false;
-  bool has20 = false;
-  bool has21 = false;
-  bool has30 = false;
-  bool has31 = false;
-  bool has32 = false;
-  bool has33 = false;
-  bool has40 = false;
-  bool has41 = false;
-  bool has42 = false;
-  bool has43 = false;
-  bool has44 = false;
-  bool has45 = false;
-
-  // retrieve platform-dependent extensions
-#if defined(HAVE_EGL)
-  //
-#elif defined(_WIN32)
-  if (FindProcShort (wglGetExtensionsStringARB))
-  {
-    const char* aWglExts = myFuncs->wglGetExtensionsStringARB (wglGetCurrentDC());
-    if (CheckExtension (aWglExts, "WGL_EXT_swap_control"))
-    {
-      FindProcShort (wglSwapIntervalEXT);
-    }
-    if (CheckExtension (aWglExts, "WGL_ARB_pixel_format"))
-    {
-      FindProcShort (wglChoosePixelFormatARB);
-    }
-    if (CheckExtension (aWglExts, "WGL_ARB_create_context_profile"))
-    {
-      FindProcShort (wglCreateContextAttribsARB);
-    }
-    if (CheckExtension (aWglExts, "WGL_NV_DX_interop"))
-    {
-      FindProcShort (wglDXSetResourceShareHandleNV);
-      FindProcShort (wglDXOpenDeviceNV);
-      FindProcShort (wglDXCloseDeviceNV);
-      FindProcShort (wglDXRegisterObjectNV);
-      FindProcShort (wglDXUnregisterObjectNV);
-      FindProcShort (wglDXObjectAccessNV);
-      FindProcShort (wglDXLockObjectsNV);
-      FindProcShort (wglDXUnlockObjectsNV);
-    }
-    if (CheckExtension (aWglExts, "WGL_AMD_gpu_association"))
-    {
-      FindProcShort (wglGetGPUIDsAMD);
-      FindProcShort (wglGetGPUInfoAMD);
-      FindProcShort (wglGetContextGPUIDAMD);
-    }
-  }
-#elif defined(__APPLE__)
-    //
-#else
-    const char* aGlxExts = ::glXQueryExtensionsString ((Display* )myDisplay, DefaultScreen ((Display* )myDisplay));
-    if (CheckExtension (aGlxExts, "GLX_EXT_swap_control"))
-    {
-      FindProcShort (glXSwapIntervalEXT);
-    }
-    if (CheckExtension (aGlxExts, "GLX_SGI_swap_control"))
-    {
-      FindProcShort (glXSwapIntervalSGI);
-    }
-    if (CheckExtension (aGlxExts, "GLX_MESA_query_renderer"))
-    {
-      FindProcShort (glXQueryRendererIntegerMESA);
-      FindProcShort (glXQueryCurrentRendererIntegerMESA);
-      FindProcShort (glXQueryRendererStringMESA);
-      FindProcShort (glXQueryCurrentRendererStringMESA);
-    }
-    //extSwapTear = CheckExtension (aGlxExts, "GLX_EXT_swap_control_tear");
-#endif
-
-  // load OpenGL 1.2 new functions
-  has12 = IsGlGreaterEqual (1, 2)
-       && FindProcShort (glBlendColor)
-       && FindProcShort (glBlendEquation)
-       && FindProcShort (glDrawRangeElements)
-       && FindProcShort (glTexImage3D)
-       && FindProcShort (glTexSubImage3D)
-       && FindProcShort (glCopyTexSubImage3D);
-  if (!has12)
-  {
-    checkWrongVersion (1, 2, aLastFailedProc);
-  }
-
-  // load OpenGL 1.3 new functions
-  has13 = IsGlGreaterEqual (1, 3)
-       && FindProcShort (glActiveTexture)
-       && FindProcShort (glSampleCoverage)
-       && FindProcShort (glCompressedTexImage3D)
-       && FindProcShort (glCompressedTexImage2D)
-       && FindProcShort (glCompressedTexImage1D)
-       && FindProcShort (glCompressedTexSubImage3D)
-       && FindProcShort (glCompressedTexSubImage2D)
-       && FindProcShort (glCompressedTexSubImage1D)
-       && FindProcShort (glGetCompressedTexImage);
-
-  if (!isCoreProfile)
-  {
-    has13 = has13
-       && FindProcShort (glClientActiveTexture)
-       && FindProcShort (glMultiTexCoord1d)
-       && FindProcShort (glMultiTexCoord1dv)
-       && FindProcShort (glMultiTexCoord1f)
-       && FindProcShort (glMultiTexCoord1fv)
-       && FindProcShort (glMultiTexCoord1i)
-       && FindProcShort (glMultiTexCoord1iv)
-       && FindProcShort (glMultiTexCoord1s)
-       && FindProcShort (glMultiTexCoord1sv)
-       && FindProcShort (glMultiTexCoord2d)
-       && FindProcShort (glMultiTexCoord2dv)
-       && FindProcShort (glMultiTexCoord2f)
-       && FindProcShort (glMultiTexCoord2fv)
-       && FindProcShort (glMultiTexCoord2i)
-       && FindProcShort (glMultiTexCoord2iv)
-       && FindProcShort (glMultiTexCoord2s)
-       && FindProcShort (glMultiTexCoord2sv)
-       && FindProcShort (glMultiTexCoord3d)
-       && FindProcShort (glMultiTexCoord3dv)
-       && FindProcShort (glMultiTexCoord3f)
-       && FindProcShort (glMultiTexCoord3fv)
-       && FindProcShort (glMultiTexCoord3i)
-       && FindProcShort (glMultiTexCoord3iv)
-       && FindProcShort (glMultiTexCoord3s)
-       && FindProcShort (glMultiTexCoord3sv)
-       && FindProcShort (glMultiTexCoord4d)
-       && FindProcShort (glMultiTexCoord4dv)
-       && FindProcShort (glMultiTexCoord4f)
-       && FindProcShort (glMultiTexCoord4fv)
-       && FindProcShort (glMultiTexCoord4i)
-       && FindProcShort (glMultiTexCoord4iv)
-       && FindProcShort (glMultiTexCoord4s)
-       && FindProcShort (glMultiTexCoord4sv)
-       && FindProcShort (glLoadTransposeMatrixf)
-       && FindProcShort (glLoadTransposeMatrixd)
-       && FindProcShort (glMultTransposeMatrixf)
-       && FindProcShort (glMultTransposeMatrixd);
-  }
-  if (!has13)
-  {
-    checkWrongVersion (1, 3, aLastFailedProc);
-  }
-
-  // load OpenGL 1.4 new functions
-  has14 = IsGlGreaterEqual (1, 4)
-       && FindProcShort (glBlendFuncSeparate)
-       && FindProcShort (glMultiDrawArrays)
-       && FindProcShort (glMultiDrawElements)
-       && FindProcShort (glPointParameterf)
-       && FindProcShort (glPointParameterfv)
-       && FindProcShort (glPointParameteri)
-       && FindProcShort (glPointParameteriv);
-  if (!has14)
-  {
-    checkWrongVersion (1, 4, aLastFailedProc);
-  }
-
-  // load OpenGL 1.5 new functions
-  has15 = IsGlGreaterEqual (1, 5)
-       && FindProcShort (glGenQueries)
-       && FindProcShort (glDeleteQueries)
-       && FindProcShort (glIsQuery)
-       && FindProcShort (glBeginQuery)
-       && FindProcShort (glEndQuery)
-       && FindProcShort (glGetQueryiv)
-       && FindProcShort (glGetQueryObjectiv)
-       && FindProcShort (glGetQueryObjectuiv)
-       && FindProcShort (glBindBuffer)
-       && FindProcShort (glDeleteBuffers)
-       && FindProcShort (glGenBuffers)
-       && FindProcShort (glIsBuffer)
-       && FindProcShort (glBufferData)
-       && FindProcShort (glBufferSubData)
-       && FindProcShort (glGetBufferSubData)
-       && FindProcShort (glMapBuffer)
-       && FindProcShort (glUnmapBuffer)
-       && FindProcShort (glGetBufferParameteriv)
-       && FindProcShort (glGetBufferPointerv);
-  if (has15)
-  {
-    if (!isCoreProfile)
-    {
-      core15 = (OpenGl_GlCore15* )(&(*myFuncs));
-    }
-    core15fwd = (OpenGl_GlCore15Fwd* )(&(*myFuncs));
-    hasGetBufferData = true;
-  }
-  else
-  {
-    checkWrongVersion (1, 5, aLastFailedProc);
-  }
-
-  // load OpenGL 2.0 new functions
-  has20 = IsGlGreaterEqual (2, 0)
-       && FindProcShort (glBlendEquationSeparate)
-       && FindProcShort (glDrawBuffers)
-       && FindProcShort (glStencilOpSeparate)
-       && FindProcShort (glStencilFuncSeparate)
-       && FindProcShort (glStencilMaskSeparate)
-       && FindProcShort (glAttachShader)
-       && FindProcShort (glBindAttribLocation)
-       && FindProcShort (glCompileShader)
-       && FindProcShort (glCreateProgram)
-       && FindProcShort (glCreateShader)
-       && FindProcShort (glDeleteProgram)
-       && FindProcShort (glDeleteShader)
-       && FindProcShort (glDetachShader)
-       && FindProcShort (glDisableVertexAttribArray)
-       && FindProcShort (glEnableVertexAttribArray)
-       && FindProcShort (glGetActiveAttrib)
-       && FindProcShort (glGetActiveUniform)
-       && FindProcShort (glGetAttachedShaders)
-       && FindProcShort (glGetAttribLocation)
-       && FindProcShort (glGetProgramiv)
-       && FindProcShort (glGetProgramInfoLog)
-       && FindProcShort (glGetShaderiv)
-       && FindProcShort (glGetShaderInfoLog)
-       && FindProcShort (glGetShaderSource)
-       && FindProcShort (glGetUniformLocation)
-       && FindProcShort (glGetUniformfv)
-       && FindProcShort (glGetUniformiv)
-       && FindProcShort (glGetVertexAttribdv)
-       && FindProcShort (glGetVertexAttribfv)
-       && FindProcShort (glGetVertexAttribiv)
-       && FindProcShort (glGetVertexAttribPointerv)
-       && FindProcShort (glIsProgram)
-       && FindProcShort (glIsShader)
-       && FindProcShort (glLinkProgram)
-       && FindProcShort (glShaderSource)
-       && FindProcShort (glUseProgram)
-       && FindProcShort (glUniform1f)
-       && FindProcShort (glUniform2f)
-       && FindProcShort (glUniform3f)
-       && FindProcShort (glUniform4f)
-       && FindProcShort (glUniform1i)
-       && FindProcShort (glUniform2i)
-       && FindProcShort (glUniform3i)
-       && FindProcShort (glUniform4i)
-       && FindProcShort (glUniform1fv)
-       && FindProcShort (glUniform2fv)
-       && FindProcShort (glUniform3fv)
-       && FindProcShort (glUniform4fv)
-       && FindProcShort (glUniform1iv)
-       && FindProcShort (glUniform2iv)
-       && FindProcShort (glUniform3iv)
-       && FindProcShort (glUniform4iv)
-       && FindProcShort (glUniformMatrix2fv)
-       && FindProcShort (glUniformMatrix3fv)
-       && FindProcShort (glUniformMatrix4fv)
-       && FindProcShort (glValidateProgram)
-       && FindProcShort (glVertexAttrib1d)
-       && FindProcShort (glVertexAttrib1dv)
-       && FindProcShort (glVertexAttrib1f)
-       && FindProcShort (glVertexAttrib1fv)
-       && FindProcShort (glVertexAttrib1s)
-       && FindProcShort (glVertexAttrib1sv)
-       && FindProcShort (glVertexAttrib2d)
-       && FindProcShort (glVertexAttrib2dv)
-       && FindProcShort (glVertexAttrib2f)
-       && FindProcShort (glVertexAttrib2fv)
-       && FindProcShort (glVertexAttrib2s)
-       && FindProcShort (glVertexAttrib2sv)
-       && FindProcShort (glVertexAttrib3d)
-       && FindProcShort (glVertexAttrib3dv)
-       && FindProcShort (glVertexAttrib3f)
-       && FindProcShort (glVertexAttrib3fv)
-       && FindProcShort (glVertexAttrib3s)
-       && FindProcShort (glVertexAttrib3sv)
-       && FindProcShort (glVertexAttrib4Nbv)
-       && FindProcShort (glVertexAttrib4Niv)
-       && FindProcShort (glVertexAttrib4Nsv)
-       && FindProcShort (glVertexAttrib4Nub)
-       && FindProcShort (glVertexAttrib4Nubv)
-       && FindProcShort (glVertexAttrib4Nuiv)
-       && FindProcShort (glVertexAttrib4Nusv)
-       && FindProcShort (glVertexAttrib4bv)
-       && FindProcShort (glVertexAttrib4d)
-       && FindProcShort (glVertexAttrib4dv)
-       && FindProcShort (glVertexAttrib4f)
-       && FindProcShort (glVertexAttrib4fv)
-       && FindProcShort (glVertexAttrib4iv)
-       && FindProcShort (glVertexAttrib4s)
-       && FindProcShort (glVertexAttrib4sv)
-       && FindProcShort (glVertexAttrib4ubv)
-       && FindProcShort (glVertexAttrib4uiv)
-       && FindProcShort (glVertexAttrib4usv)
-       && FindProcShort (glVertexAttribPointer);
-  if (has20)
-  {
-    const char* aGlslVer = (const char* )::glGetString (GL_SHADING_LANGUAGE_VERSION);
-    if (aGlslVer == NULL
-    || *aGlslVer == '\0')
-    {
-      // broken context has been detected
-      PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
-                   TCollection_AsciiString("Error! OpenGL context reports version ")
-                   + myGlVerMajor  + "." + myGlVerMinor + " but reports wrong GLSL version");
-      myGlVerMajor = 1;
-      myGlVerMinor = 5;
-    }
-    else
-    {
-      if (!isCoreProfile)
-      {
-        core20  = (OpenGl_GlCore20*    )(&(*myFuncs));
-      }
-      core20fwd = (OpenGl_GlCore20Fwd* )(&(*myFuncs));
-    }
-  }
-  else
-  {
-    checkWrongVersion (2, 0, aLastFailedProc);
-  }
-
-  // load OpenGL 2.1 new functions
-  has21 = IsGlGreaterEqual (2, 1)
-       && FindProcShort (glUniformMatrix2x3fv)
-       && FindProcShort (glUniformMatrix3x2fv)
-       && FindProcShort (glUniformMatrix2x4fv)
-       && FindProcShort (glUniformMatrix4x2fv)
-       && FindProcShort (glUniformMatrix3x4fv)
-       && FindProcShort (glUniformMatrix4x3fv);
-  if (!has21)
-  {
-    checkWrongVersion (2, 1, aLastFailedProc);
-  }
-
-  // load GL_ARB_framebuffer_object (added to OpenGL 3.0 core)
-  const bool hasFBO = (IsGlGreaterEqual (3, 0) || CheckExtension ("GL_ARB_framebuffer_object"))
-       && FindProcShort (glIsRenderbuffer)
-       && FindProcShort (glBindRenderbuffer)
-       && FindProcShort (glDeleteRenderbuffers)
-       && FindProcShort (glGenRenderbuffers)
-       && FindProcShort (glRenderbufferStorage)
-       && FindProcShort (glGetRenderbufferParameteriv)
-       && FindProcShort (glIsFramebuffer)
-       && FindProcShort (glBindFramebuffer)
-       && FindProcShort (glDeleteFramebuffers)
-       && FindProcShort (glGenFramebuffers)
-       && FindProcShort (glCheckFramebufferStatus)
-       && FindProcShort (glFramebufferTexture1D)
-       && FindProcShort (glFramebufferTexture2D)
-       && FindProcShort (glFramebufferTexture3D)
-       && FindProcShort (glFramebufferRenderbuffer)
-       && FindProcShort (glGetFramebufferAttachmentParameteriv)
-       && FindProcShort (glGenerateMipmap)
-       && FindProcShort (glBlitFramebuffer)
-       && FindProcShort (glRenderbufferStorageMultisample)
-       && FindProcShort (glFramebufferTextureLayer);
-
-  // load GL_ARB_vertex_array_object (added to OpenGL 3.0 core)
-  const bool hasVAO = (IsGlGreaterEqual (3, 0) || CheckExtension ("GL_ARB_vertex_array_object"))
-       && FindProcShort (glBindVertexArray)
-       && FindProcShort (glDeleteVertexArrays)
-       && FindProcShort (glGenVertexArrays)
-       && FindProcShort (glIsVertexArray);
-
-  // load GL_ARB_map_buffer_range (added to OpenGL 3.0 core)
-  const bool hasMapBufferRange = (IsGlGreaterEqual (3, 0) || CheckExtension ("GL_ARB_map_buffer_range"))
-       && FindProcShort (glMapBufferRange)
-       && FindProcShort (glFlushMappedBufferRange);
-
-  // load OpenGL 3.0 new functions
-  has30 = IsGlGreaterEqual (3, 0)
-       && hasFBO
-       && hasVAO
-       && hasMapBufferRange
-       && FindProcShort (glColorMaski)
-       && FindProcShort (glGetBooleani_v)
-       && FindProcShort (glGetIntegeri_v)
-       && FindProcShort (glEnablei)
-       && FindProcShort (glDisablei)
-       && FindProcShort (glIsEnabledi)
-       && FindProcShort (glBeginTransformFeedback)
-       && FindProcShort (glEndTransformFeedback)
-       && FindProcShort (glBindBufferRange)
-       && FindProcShort (glBindBufferBase)
-       && FindProcShort (glTransformFeedbackVaryings)
-       && FindProcShort (glGetTransformFeedbackVarying)
-       && FindProcShort (glClampColor)
-       && FindProcShort (glBeginConditionalRender)
-       && FindProcShort (glEndConditionalRender)
-       && FindProcShort (glVertexAttribIPointer)
-       && FindProcShort (glGetVertexAttribIiv)
-       && FindProcShort (glGetVertexAttribIuiv)
-       && FindProcShort (glVertexAttribI1i)
-       && FindProcShort (glVertexAttribI2i)
-       && FindProcShort (glVertexAttribI3i)
-       && FindProcShort (glVertexAttribI4i)
-       && FindProcShort (glVertexAttribI1ui)
-       && FindProcShort (glVertexAttribI2ui)
-       && FindProcShort (glVertexAttribI3ui)
-       && FindProcShort (glVertexAttribI4ui)
-       && FindProcShort (glVertexAttribI1iv)
-       && FindProcShort (glVertexAttribI2iv)
-       && FindProcShort (glVertexAttribI3iv)
-       && FindProcShort (glVertexAttribI4iv)
-       && FindProcShort (glVertexAttribI1uiv)
-       && FindProcShort (glVertexAttribI2uiv)
-       && FindProcShort (glVertexAttribI3uiv)
-       && FindProcShort (glVertexAttribI4uiv)
-       && FindProcShort (glVertexAttribI4bv)
-       && FindProcShort (glVertexAttribI4sv)
-       && FindProcShort (glVertexAttribI4ubv)
-       && FindProcShort (glVertexAttribI4usv)
-       && FindProcShort (glGetUniformuiv)
-       && FindProcShort (glBindFragDataLocation)
-       && FindProcShort (glGetFragDataLocation)
-       && FindProcShort (glUniform1ui)
-       && FindProcShort (glUniform2ui)
-       && FindProcShort (glUniform3ui)
-       && FindProcShort (glUniform4ui)
-       && FindProcShort (glUniform1uiv)
-       && FindProcShort (glUniform2uiv)
-       && FindProcShort (glUniform3uiv)
-       && FindProcShort (glUniform4uiv)
-       && FindProcShort (glTexParameterIiv)
-       && FindProcShort (glTexParameterIuiv)
-       && FindProcShort (glGetTexParameterIiv)
-       && FindProcShort (glGetTexParameterIuiv)
-       && FindProcShort (glClearBufferiv)
-       && FindProcShort (glClearBufferuiv)
-       && FindProcShort (glClearBufferfv)
-       && FindProcShort (glClearBufferfi)
-       && FindProcShort (glGetStringi);
-  if (!has30)
-  {
-    checkWrongVersion (3, 0, aLastFailedProc);
-  }
-
-  // load GL_ARB_uniform_buffer_object (added to OpenGL 3.1 core)
-  const bool hasUBO = (IsGlGreaterEqual (3, 1) || CheckExtension ("GL_ARB_uniform_buffer_object"))
-       && FindProcShort (glGetUniformIndices)
-       && FindProcShort (glGetActiveUniformsiv)
-       && FindProcShort (glGetActiveUniformName)
-       && FindProcShort (glGetUniformBlockIndex)
-       && FindProcShort (glGetActiveUniformBlockiv)
-       && FindProcShort (glGetActiveUniformBlockName)
-       && FindProcShort (glUniformBlockBinding);
-
-  // load GL_ARB_copy_buffer (added to OpenGL 3.1 core)
-  const bool hasCopyBufSubData = (IsGlGreaterEqual (3, 1) || CheckExtension ("GL_ARB_copy_buffer"))
-       && FindProcShort (glCopyBufferSubData);
-
-  if (has30)
-  {
-    // NPOT textures are required by OpenGL 2.0 specifications
-    // but doesn't hardware accelerated by some ancient OpenGL 2.1 hardware (GeForce FX, RadeOn 9700 etc.)
-    arbNPTW  = Standard_True;
-    arbTexRG = Standard_True;
-
-    if (!isCoreProfile)
-    {
-      core30 = (OpenGl_GlCore30* )(&(*myFuncs));
-    }
-    core30fwd = (OpenGl_GlCore30Fwd* )(&(*myFuncs));
-  }
-
-  // load OpenGL 3.1 new functions
-  has31 = IsGlGreaterEqual (3, 1)
-       && hasUBO
-       && hasCopyBufSubData
-       && FindProcShort (glDrawArraysInstanced)
-       && FindProcShort (glDrawElementsInstanced)
-       && FindProcShort (glTexBuffer)
-       && FindProcShort (glPrimitiveRestartIndex);
-  if (has31)
-  {
-    arbTBO = (OpenGl_ArbTBO* )(&(*myFuncs));
-    arbIns = (OpenGl_ArbIns* )(&(*myFuncs));
-  }
-  else
+#if defined(GL_ES_VERSION_2_0)
+  if (IsGlGreaterEqual (3, 1)
+   && myFuncs->glTexStorage2DMultisample != NULL)
   {
-    checkWrongVersion (3, 1, aLastFailedProc);
-
-    // initialize TBO extension (ARB)
-    if (CheckExtension ("GL_ARB_texture_buffer_object")
-     && FindProc ("glTexBufferARB", myFuncs->glTexBuffer))
-    {
-      arbTBO = (OpenGl_ArbTBO* )(&(*myFuncs));
-    }
-
-    // initialize hardware instancing extension (ARB)
-    if (CheckExtension ("GL_ARB_draw_instanced")
-     && FindProc ("glDrawArraysInstancedARB",   myFuncs->glDrawArraysInstanced)
-     && FindProc ("glDrawElementsInstancedARB", myFuncs->glDrawElementsInstanced))
-    {
-      arbIns = (OpenGl_ArbIns* )(&(*myFuncs));
-    }
-  }
-
-  arbTboRGB32 = CheckExtension ("GL_ARB_texture_buffer_object_rgb32");
-
-  // load GL_ARB_draw_elements_base_vertex (added to OpenGL 3.2 core)
-  const bool hasDrawElemsBaseVert = (IsGlGreaterEqual (3, 2) || CheckExtension ("GL_ARB_draw_elements_base_vertex"))
-       && FindProcShort (glDrawElementsBaseVertex)
-       && FindProcShort (glDrawRangeElementsBaseVertex)
-       && FindProcShort (glDrawElementsInstancedBaseVertex)
-       && FindProcShort (glMultiDrawElementsBaseVertex);
-
-  // load GL_ARB_provoking_vertex (added to OpenGL 3.2 core)
-  const bool hasProvokingVert = (IsGlGreaterEqual (3, 2) || CheckExtension ("GL_ARB_provoking_vertex"))
-       && FindProcShort (glProvokingVertex);
-
-  // load GL_ARB_sync (added to OpenGL 3.2 core)
-  const bool hasSync = (IsGlGreaterEqual (3, 2) || CheckExtension ("GL_ARB_sync"))
-       && FindProcShort (glFenceSync)
-       && FindProcShort (glIsSync)
-       && FindProcShort (glDeleteSync)
-       && FindProcShort (glClientWaitSync)
-       && FindProcShort (glWaitSync)
-       && FindProcShort (glGetInteger64v)
-       && FindProcShort (glGetSynciv);
-
-  // load GL_ARB_texture_multisample (added to OpenGL 3.2 core)
-  const bool hasTextureMultisample = (IsGlGreaterEqual (3, 2) || CheckExtension ("GL_ARB_texture_multisample"))
-       && FindProcShort (glTexImage2DMultisample)
-       && FindProcShort (glTexImage3DMultisample)
-       && FindProcShort (glGetMultisamplefv)
-       && FindProcShort (glSampleMaski);
-
-  // load OpenGL 3.2 new functions
-  has32 = IsGlGreaterEqual (3, 2)
-       && hasDrawElemsBaseVert
-       && hasProvokingVert
-       && hasSync
-       && hasTextureMultisample
-       && FindProcShort (glGetInteger64i_v)
-       && FindProcShort (glGetBufferParameteri64v)
-       && FindProcShort (glFramebufferTexture);
-  if (has32)
-  {
-    core32 = (OpenGl_GlCore32* )(&(*myFuncs));
-    if (isCoreProfile)
-    {
-      core32->glGenVertexArrays (1, &myDefaultVao);
-    }
-    else
-    {
-      core32back = (OpenGl_GlCore32Back* )(&(*myFuncs));
-    }
+    // MSAA RenderBuffers have been defined in OpenGL ES 3.0,
+    // but MSAA Textures - only in OpenGL ES 3.1+
     ::glGetIntegerv (GL_MAX_SAMPLES, &myMaxMsaaSamples);
   }
-  else
-  {
-    checkWrongVersion (3, 2, aLastFailedProc);
-  }
-
-  // load GL_ARB_blend_func_extended (added to OpenGL 3.3 core)
-  const bool hasBlendFuncExtended = (IsGlGreaterEqual (3, 3) || CheckExtension ("GL_ARB_blend_func_extended"))
-       && FindProcShort (glBindFragDataLocationIndexed)
-       && FindProcShort (glGetFragDataIndex);
-
-  // load GL_ARB_sampler_objects (added to OpenGL 3.3 core)
-  const bool hasSamplerObjects = (IsGlGreaterEqual (3, 3) || CheckExtension ("GL_ARB_sampler_objects"))
-       && FindProcShort (glGenSamplers)
-       && FindProcShort (glDeleteSamplers)
-       && FindProcShort (glIsSampler)
-       && FindProcShort (glBindSampler)
-       && FindProcShort (glSamplerParameteri)
-       && FindProcShort (glSamplerParameteriv)
-       && FindProcShort (glSamplerParameterf)
-       && FindProcShort (glSamplerParameterfv)
-       && FindProcShort (glSamplerParameterIiv)
-       && FindProcShort (glSamplerParameterIuiv)
-       && FindProcShort (glGetSamplerParameteriv)
-       && FindProcShort (glGetSamplerParameterIiv)
-       && FindProcShort (glGetSamplerParameterfv)
-       && FindProcShort (glGetSamplerParameterIuiv);
-  if (hasSamplerObjects)
-  {
-    arbSamplerObject = (OpenGl_ArbSamplerObject* )(&(*myFuncs));
-  }
-
-  // load GL_ARB_timer_query (added to OpenGL 3.3 core)
-  const bool hasTimerQuery = (IsGlGreaterEqual (3, 3) || CheckExtension ("GL_ARB_timer_query"))
-       && FindProcShort (glQueryCounter)
-       && FindProcShort (glGetQueryObjecti64v)
-       && FindProcShort (glGetQueryObjectui64v);
-
-  // load GL_ARB_vertex_type_2_10_10_10_rev (added to OpenGL 3.3 core)
-  const bool hasVertType21010101rev = (IsGlGreaterEqual (3, 3) || CheckExtension ("GL_ARB_vertex_type_2_10_10_10_rev"))
-       && FindProcShort (glVertexAttribP1ui)
-       && FindProcShort (glVertexAttribP1uiv)
-       && FindProcShort (glVertexAttribP2ui)
-       && FindProcShort (glVertexAttribP2uiv)
-       && FindProcShort (glVertexAttribP3ui)
-       && FindProcShort (glVertexAttribP3uiv)
-       && FindProcShort (glVertexAttribP4ui)
-       && FindProcShort (glVertexAttribP4uiv);
-
-  if ( hasVertType21010101rev
-   && !isCoreProfile)
-  {
-    // load deprecated functions
-    const bool hasVertType21010101revExt =
-          FindProcShort (glVertexP2ui)
-       && FindProcShort (glVertexP2uiv)
-       && FindProcShort (glVertexP3ui)
-       && FindProcShort (glVertexP3uiv)
-       && FindProcShort (glVertexP4ui)
-       && FindProcShort (glVertexP4uiv)
-       && FindProcShort (glTexCoordP1ui)
-       && FindProcShort (glTexCoordP1uiv)
-       && FindProcShort (glTexCoordP2ui)
-       && FindProcShort (glTexCoordP2uiv)
-       && FindProcShort (glTexCoordP3ui)
-       && FindProcShort (glTexCoordP3uiv)
-       && FindProcShort (glTexCoordP4ui)
-       && FindProcShort (glTexCoordP4uiv)
-       && FindProcShort (glMultiTexCoordP1ui)
-       && FindProcShort (glMultiTexCoordP1uiv)
-       && FindProcShort (glMultiTexCoordP2ui)
-       && FindProcShort (glMultiTexCoordP2uiv)
-       && FindProcShort (glMultiTexCoordP3ui)
-       && FindProcShort (glMultiTexCoordP3uiv)
-       && FindProcShort (glMultiTexCoordP4ui)
-       && FindProcShort (glMultiTexCoordP4uiv)
-       && FindProcShort (glNormalP3ui)
-       && FindProcShort (glNormalP3uiv)
-       && FindProcShort (glColorP3ui)
-       && FindProcShort (glColorP3uiv)
-       && FindProcShort (glColorP4ui)
-       && FindProcShort (glColorP4uiv)
-       && FindProcShort (glSecondaryColorP3ui)
-       && FindProcShort (glSecondaryColorP3uiv);
-    (void )hasVertType21010101revExt;
-  }
-
-  // load OpenGL 3.3 extra functions
-  has33 = IsGlGreaterEqual (3, 3)
-       && hasBlendFuncExtended
-       && hasSamplerObjects
-       && hasTimerQuery
-       && hasVertType21010101rev
-       && FindProcShort (glVertexAttribDivisor);
-  if (has33)
-  {
-    core33 = (OpenGl_GlCore33* )(&(*myFuncs));
-    if (!isCoreProfile)
-    {
-      core33back = (OpenGl_GlCore33Back* )(&(*myFuncs));
-    }
-  }
-  else
-  {
-    checkWrongVersion (3, 3, aLastFailedProc);
-  }
-
-  // load GL_ARB_draw_indirect (added to OpenGL 4.0 core)
-  const bool hasDrawIndirect = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_draw_indirect"))
-       && FindProcShort (glDrawArraysIndirect)
-       && FindProcShort (glDrawElementsIndirect);
-
-  // load GL_ARB_gpu_shader_fp64 (added to OpenGL 4.0 core)
-  const bool hasShaderFP64 = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_gpu_shader_fp64"))
-       && FindProcShort (glUniform1d)
-       && FindProcShort (glUniform2d)
-       && FindProcShort (glUniform3d)
-       && FindProcShort (glUniform4d)
-       && FindProcShort (glUniform1dv)
-       && FindProcShort (glUniform2dv)
-       && FindProcShort (glUniform3dv)
-       && FindProcShort (glUniform4dv)
-       && FindProcShort (glUniformMatrix2dv)
-       && FindProcShort (glUniformMatrix3dv)
-       && FindProcShort (glUniformMatrix4dv)
-       && FindProcShort (glUniformMatrix2x3dv)
-       && FindProcShort (glUniformMatrix2x4dv)
-       && FindProcShort (glUniformMatrix3x2dv)
-       && FindProcShort (glUniformMatrix3x4dv)
-       && FindProcShort (glUniformMatrix4x2dv)
-       && FindProcShort (glUniformMatrix4x3dv)
-       && FindProcShort (glGetUniformdv);
-
-  // load GL_ARB_shader_subroutine (added to OpenGL 4.0 core)
-  const bool hasShaderSubroutine = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_shader_subroutine"))
-       && FindProcShort (glGetSubroutineUniformLocation)
-       && FindProcShort (glGetSubroutineIndex)
-       && FindProcShort (glGetActiveSubroutineUniformiv)
-       && FindProcShort (glGetActiveSubroutineUniformName)
-       && FindProcShort (glGetActiveSubroutineName)
-       && FindProcShort (glUniformSubroutinesuiv)
-       && FindProcShort (glGetUniformSubroutineuiv)
-       && FindProcShort (glGetProgramStageiv);
-
-  // load GL_ARB_tessellation_shader (added to OpenGL 4.0 core)
-  const bool hasTessellationShader = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_tessellation_shader"))
-       && FindProcShort (glPatchParameteri)
-       && FindProcShort (glPatchParameterfv);
-
-  // load GL_ARB_transform_feedback2 (added to OpenGL 4.0 core)
-  const bool hasTrsfFeedback2 = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_transform_feedback2"))
-       && FindProcShort (glBindTransformFeedback)
-       && FindProcShort (glDeleteTransformFeedbacks)
-       && FindProcShort (glGenTransformFeedbacks)
-       && FindProcShort (glIsTransformFeedback)
-       && FindProcShort (glPauseTransformFeedback)
-       && FindProcShort (glResumeTransformFeedback)
-       && FindProcShort (glDrawTransformFeedback);
-
-  // load GL_ARB_transform_feedback3 (added to OpenGL 4.0 core)
-  const bool hasTrsfFeedback3 = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_transform_feedback3"))
-       && FindProcShort (glDrawTransformFeedbackStream)
-       && FindProcShort (glBeginQueryIndexed)
-       && FindProcShort (glEndQueryIndexed)
-       && FindProcShort (glGetQueryIndexediv);
-
-  // load OpenGL 4.0 new functions
-  has40 = IsGlGreaterEqual (4, 0)
-      && hasDrawIndirect
-      && hasShaderFP64
-      && hasShaderSubroutine
-      && hasTessellationShader
-      && hasTrsfFeedback2
-      && hasTrsfFeedback3
-      && FindProcShort (glMinSampleShading)
-      && FindProcShort (glBlendEquationi)
-      && FindProcShort (glBlendEquationSeparatei)
-      && FindProcShort (glBlendFunci)
-      && FindProcShort (glBlendFuncSeparatei);
-  if (has40)
-  {
-    arbTboRGB32 = Standard_True; // in core since OpenGL 4.0
-  }
-  else
-  {
-    checkWrongVersion (4, 0, aLastFailedProc);
-  }
-
-  // load GL_ARB_ES2_compatibility (added to OpenGL 4.1 core)
-  const bool hasES2Compatibility = (IsGlGreaterEqual (4, 1) || CheckExtension ("GL_ARB_ES2_compatibility"))
-       && FindProcShort (glReleaseShaderCompiler)
-       && FindProcShort (glShaderBinary)
-       && FindProcShort (glGetShaderPrecisionFormat)
-       && FindProcShort (glDepthRangef)
-       && FindProcShort (glClearDepthf);
-
-  // load GL_ARB_get_program_binary (added to OpenGL 4.1 core)
-  const bool hasGetProgramBinary = (IsGlGreaterEqual (4, 1) || CheckExtension ("GL_ARB_get_program_binary"))
-       && FindProcShort (glGetProgramBinary)
-       && FindProcShort (glProgramBinary)
-       && FindProcShort (glProgramParameteri);
-
-
-  // load GL_ARB_separate_shader_objects (added to OpenGL 4.1 core)
-  const bool hasSeparateShaderObjects = (IsGlGreaterEqual (4, 1) || CheckExtension ("GL_ARB_separate_shader_objects"))
-       && FindProcShort (glUseProgramStages)
-       && FindProcShort (glActiveShaderProgram)
-       && FindProcShort (glCreateShaderProgramv)
-       && FindProcShort (glBindProgramPipeline)
-       && FindProcShort (glDeleteProgramPipelines)
-       && FindProcShort (glGenProgramPipelines)
-       && FindProcShort (glIsProgramPipeline)
-       && FindProcShort (glGetProgramPipelineiv)
-       && FindProcShort (glProgramUniform1i)
-       && FindProcShort (glProgramUniform1iv)
-       && FindProcShort (glProgramUniform1f)
-       && FindProcShort (glProgramUniform1fv)
-       && FindProcShort (glProgramUniform1d)
-       && FindProcShort (glProgramUniform1dv)
-       && FindProcShort (glProgramUniform1ui)
-       && FindProcShort (glProgramUniform1uiv)
-       && FindProcShort (glProgramUniform2i)
-       && FindProcShort (glProgramUniform2iv)
-       && FindProcShort (glProgramUniform2f)
-       && FindProcShort (glProgramUniform2fv)
-       && FindProcShort (glProgramUniform2d)
-       && FindProcShort (glProgramUniform2dv)
-       && FindProcShort (glProgramUniform2ui)
-       && FindProcShort (glProgramUniform2uiv)
-       && FindProcShort (glProgramUniform3i)
-       && FindProcShort (glProgramUniform3iv)
-       && FindProcShort (glProgramUniform3f)
-       && FindProcShort (glProgramUniform3fv)
-       && FindProcShort (glProgramUniform3d)
-       && FindProcShort (glProgramUniform3dv)
-       && FindProcShort (glProgramUniform3ui)
-       && FindProcShort (glProgramUniform3uiv)
-       && FindProcShort (glProgramUniform4i)
-       && FindProcShort (glProgramUniform4iv)
-       && FindProcShort (glProgramUniform4f)
-       && FindProcShort (glProgramUniform4fv)
-       && FindProcShort (glProgramUniform4d)
-       && FindProcShort (glProgramUniform4dv)
-       && FindProcShort (glProgramUniform4ui)
-       && FindProcShort (glProgramUniform4uiv)
-       && FindProcShort (glProgramUniformMatrix2fv)
-       && FindProcShort (glProgramUniformMatrix3fv)
-       && FindProcShort (glProgramUniformMatrix4fv)
-       && FindProcShort (glProgramUniformMatrix2dv)
-       && FindProcShort (glProgramUniformMatrix3dv)
-       && FindProcShort (glProgramUniformMatrix4dv)
-       && FindProcShort (glProgramUniformMatrix2x3fv)
-       && FindProcShort (glProgramUniformMatrix3x2fv)
-       && FindProcShort (glProgramUniformMatrix2x4fv)
-       && FindProcShort (glProgramUniformMatrix4x2fv)
-       && FindProcShort (glProgramUniformMatrix3x4fv)
-       && FindProcShort (glProgramUniformMatrix4x3fv)
-       && FindProcShort (glProgramUniformMatrix2x3dv)
-       && FindProcShort (glProgramUniformMatrix3x2dv)
-       && FindProcShort (glProgramUniformMatrix2x4dv)
-       && FindProcShort (glProgramUniformMatrix4x2dv)
-       && FindProcShort (glProgramUniformMatrix3x4dv)
-       && FindProcShort (glProgramUniformMatrix4x3dv)
-       && FindProcShort (glValidateProgramPipeline)
-       && FindProcShort (glGetProgramPipelineInfoLog);
-
-  // load GL_ARB_vertex_attrib_64bit (added to OpenGL 4.1 core)
-  const bool hasVertAttrib64bit = (IsGlGreaterEqual (4, 1) || CheckExtension ("GL_ARB_vertex_attrib_64bit"))
-       && FindProcShort (glVertexAttribL1d)
-       && FindProcShort (glVertexAttribL2d)
-       && FindProcShort (glVertexAttribL3d)
-       && FindProcShort (glVertexAttribL4d)
-       && FindProcShort (glVertexAttribL1dv)
-       && FindProcShort (glVertexAttribL2dv)
-       && FindProcShort (glVertexAttribL3dv)
-       && FindProcShort (glVertexAttribL4dv)
-       && FindProcShort (glVertexAttribLPointer)
-       && FindProcShort (glGetVertexAttribLdv);
-
-  // load GL_ARB_viewport_array (added to OpenGL 4.1 core)
-  const bool hasViewportArray = (IsGlGreaterEqual (4, 1) || CheckExtension ("GL_ARB_viewport_array"))
-       && FindProcShort (glViewportArrayv)
-       && FindProcShort (glViewportIndexedf)
-       && FindProcShort (glViewportIndexedfv)
-       && FindProcShort (glScissorArrayv)
-       && FindProcShort (glScissorIndexed)
-       && FindProcShort (glScissorIndexedv)
-       && FindProcShort (glDepthRangeArrayv)
-       && FindProcShort (glDepthRangeIndexed)
-       && FindProcShort (glGetFloati_v)
-       && FindProcShort (glGetDoublei_v);
-
-  has41 = IsGlGreaterEqual (4, 1)
-       && hasES2Compatibility
-       && hasGetProgramBinary
-       && hasSeparateShaderObjects
-       && hasVertAttrib64bit
-       && hasViewportArray;
-  if (has41)
-  {
-    core41 = (OpenGl_GlCore41* )(&(*myFuncs));
-    if (!isCoreProfile)
-    {
-      core41back = (OpenGl_GlCore41Back* )(&(*myFuncs));
-    }
-  }
-  else
-  {
-    checkWrongVersion (4, 1, aLastFailedProc);
-  }
-
-  // load GL_ARB_base_instance (added to OpenGL 4.2 core)
-  const bool hasBaseInstance = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_base_instance"))
-       && FindProcShort (glDrawArraysInstancedBaseInstance)
-       && FindProcShort (glDrawElementsInstancedBaseInstance)
-       && FindProcShort (glDrawElementsInstancedBaseVertexBaseInstance);
-
-  // load GL_ARB_transform_feedback_instanced (added to OpenGL 4.2 core)
-  const bool hasTrsfFeedbackInstanced = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_transform_feedback_instanced"))
-       && FindProcShort (glDrawTransformFeedbackInstanced)
-       && FindProcShort (glDrawTransformFeedbackStreamInstanced);
-
-  // load GL_ARB_internalformat_query (added to OpenGL 4.2 core)
-  const bool hasInternalFormatQuery = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_internalformat_query"))
-       && FindProcShort (glGetInternalformativ);
-
-  // load GL_ARB_shader_atomic_counters (added to OpenGL 4.2 core)
-  const bool hasShaderAtomicCounters = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_shader_atomic_counters"))
-       && FindProcShort (glGetActiveAtomicCounterBufferiv);
-
-  // load GL_ARB_shader_image_load_store (added to OpenGL 4.2 core)
-  const bool hasShaderImgLoadStore = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_shader_image_load_store"))
-       && FindProcShort (glBindImageTexture)
-       && FindProcShort (glMemoryBarrier);
-
-  // load GL_ARB_texture_storage (added to OpenGL 4.2 core)
-  const bool hasTextureStorage = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_texture_storage"))
-       && FindProcShort (glTexStorage1D)
-       && FindProcShort (glTexStorage2D)
-       && FindProcShort (glTexStorage3D);
-
-  has42 = IsGlGreaterEqual (4, 2)
-       && hasBaseInstance
-       && hasTrsfFeedbackInstanced
-       && hasInternalFormatQuery
-       && hasShaderAtomicCounters
-       && hasShaderImgLoadStore
-       && hasTextureStorage;
-  if (has42)
-  {
-    core42 = (OpenGl_GlCore42* )(&(*myFuncs));
-    if (!isCoreProfile)
-    {
-      core42back = (OpenGl_GlCore42Back* )(&(*myFuncs));
-    }
-  }
-  else
-  {
-    checkWrongVersion (4, 2, aLastFailedProc);
-  }
-
-  has43 = IsGlGreaterEqual (4, 3)
-       && FindProcShort (glClearBufferData)
-       && FindProcShort (glClearBufferSubData)
-       && FindProcShort (glDispatchCompute)
-       && FindProcShort (glDispatchComputeIndirect)
-       && FindProcShort (glCopyImageSubData)
-       && FindProcShort (glFramebufferParameteri)
-       && FindProcShort (glGetFramebufferParameteriv)
-       && FindProcShort (glGetInternalformati64v)
-       && FindProcShort (glInvalidateTexSubImage)
-       && FindProcShort (glInvalidateTexImage)
-       && FindProcShort (glInvalidateBufferSubData)
-       && FindProcShort (glInvalidateBufferData)
-       && FindProcShort (glInvalidateFramebuffer)
-       && FindProcShort (glInvalidateSubFramebuffer)
-       && FindProcShort (glMultiDrawArraysIndirect)
-       && FindProcShort (glMultiDrawElementsIndirect)
-       && FindProcShort (glGetProgramInterfaceiv)
-       && FindProcShort (glGetProgramResourceIndex)
-       && FindProcShort (glGetProgramResourceName)
-       && FindProcShort (glGetProgramResourceiv)
-       && FindProcShort (glGetProgramResourceLocation)
-       && FindProcShort (glGetProgramResourceLocationIndex)
-       && FindProcShort (glShaderStorageBlockBinding)
-       && FindProcShort (glTexBufferRange)
-       && FindProcShort (glTexStorage2DMultisample)
-       && FindProcShort (glTexStorage3DMultisample)
-       && FindProcShort (glTextureView)
-       && FindProcShort (glBindVertexBuffer)
-       && FindProcShort (glVertexAttribFormat)
-       && FindProcShort (glVertexAttribIFormat)
-       && FindProcShort (glVertexAttribLFormat)
-       && FindProcShort (glVertexAttribBinding)
-       && FindProcShort (glVertexBindingDivisor)
-       && FindProcShort (glDebugMessageControl)
-       && FindProcShort (glDebugMessageInsert)
-       && FindProcShort (glDebugMessageCallback)
-       && FindProcShort (glGetDebugMessageLog)
-       && FindProcShort (glPushDebugGroup)
-       && FindProcShort (glPopDebugGroup)
-       && FindProcShort (glObjectLabel)
-       && FindProcShort (glGetObjectLabel)
-       && FindProcShort (glObjectPtrLabel)
-       && FindProcShort (glGetObjectPtrLabel);
-  if (has43)
-  {
-    core43 = (OpenGl_GlCore43* )(&(*myFuncs));
-    if (!isCoreProfile)
-    {
-      core43back = (OpenGl_GlCore43Back* )(&(*myFuncs));
-    }
-  }
-  else
-  {
-    checkWrongVersion (4, 3, aLastFailedProc);
-  }
-
-  // load GL_ARB_clear_texture (added to OpenGL 4.4 core)
-  bool arbTexClear = (IsGlGreaterEqual (4, 4) || CheckExtension ("GL_ARB_clear_texture"))
-       && FindProcShort (glClearTexImage)
-       && FindProcShort (glClearTexSubImage);
-
-  has44 = IsGlGreaterEqual (4, 4)
-       && arbTexClear
-       && FindProcShort (glBufferStorage)
-       && FindProcShort (glBindBuffersBase)
-       && FindProcShort (glBindBuffersRange)
-       && FindProcShort (glBindTextures)
-       && FindProcShort (glBindSamplers)
-       && FindProcShort (glBindImageTextures)
-       && FindProcShort (glBindVertexBuffers);
-  if (has44)
-  {
-    core44 = (OpenGl_GlCore44* )(&(*myFuncs));
-    if (!isCoreProfile)
-    {
-      core44back = (OpenGl_GlCore44Back* )(&(*myFuncs));
-    }
-  }
-  else
-  {
-    checkWrongVersion (4, 4, aLastFailedProc);
-  }
-
-  has45 = IsGlGreaterEqual (4, 5)
-       && FindProcShort (glBindVertexBuffers)
-       && FindProcShort (glClipControl)
-       && FindProcShort (glCreateTransformFeedbacks)
-       && FindProcShort (glTransformFeedbackBufferBase)
-       && FindProcShort (glTransformFeedbackBufferRange)
-       && FindProcShort (glGetTransformFeedbackiv)
-       && FindProcShort (glGetTransformFeedbacki_v)
-       && FindProcShort (glGetTransformFeedbacki64_v)
-       && FindProcShort (glCreateBuffers)
-       && FindProcShort (glNamedBufferStorage)
-       && FindProcShort (glNamedBufferData)
-       && FindProcShort (glNamedBufferSubData)
-       && FindProcShort (glCopyNamedBufferSubData)
-       && FindProcShort (glClearNamedBufferData)
-       && FindProcShort (glClearNamedBufferSubData)
-       && FindProcShort (glMapNamedBuffer)
-       && FindProcShort (glMapNamedBufferRange)
-       && FindProcShort (glUnmapNamedBuffer)
-       && FindProcShort (glFlushMappedNamedBufferRange)
-       && FindProcShort (glGetNamedBufferParameteriv)
-       && FindProcShort (glGetNamedBufferParameteri64v)
-       && FindProcShort (glGetNamedBufferPointerv)
-       && FindProcShort (glGetNamedBufferSubData)
-       && FindProcShort (glCreateFramebuffers)
-       && FindProcShort (glNamedFramebufferRenderbuffer)
-       && FindProcShort (glNamedFramebufferParameteri)
-       && FindProcShort (glNamedFramebufferTexture)
-       && FindProcShort (glNamedFramebufferTextureLayer)
-       && FindProcShort (glNamedFramebufferDrawBuffer)
-       && FindProcShort (glNamedFramebufferDrawBuffers)
-       && FindProcShort (glNamedFramebufferReadBuffer)
-       && FindProcShort (glInvalidateNamedFramebufferData)
-       && FindProcShort (glInvalidateNamedFramebufferSubData)
-       && FindProcShort (glClearNamedFramebufferiv)
-       && FindProcShort (glClearNamedFramebufferuiv)
-       && FindProcShort (glClearNamedFramebufferfv)
-       && FindProcShort (glClearNamedFramebufferfi)
-       && FindProcShort (glBlitNamedFramebuffer)
-       && FindProcShort (glCheckNamedFramebufferStatus)
-       && FindProcShort (glGetNamedFramebufferParameteriv)
-       && FindProcShort (glGetNamedFramebufferAttachmentParameteriv)
-       && FindProcShort (glCreateRenderbuffers)
-       && FindProcShort (glNamedRenderbufferStorage)
-       && FindProcShort (glNamedRenderbufferStorageMultisample)
-       && FindProcShort (glGetNamedRenderbufferParameteriv)
-       && FindProcShort (glCreateTextures)
-       && FindProcShort (glTextureBuffer)
-       && FindProcShort (glTextureBufferRange)
-       && FindProcShort (glTextureStorage1D)
-       && FindProcShort (glTextureStorage2D)
-       && FindProcShort (glTextureStorage3D)
-       && FindProcShort (glTextureStorage2DMultisample)
-       && FindProcShort (glTextureStorage3DMultisample)
-       && FindProcShort (glTextureSubImage1D)
-       && FindProcShort (glTextureSubImage2D)
-       && FindProcShort (glTextureSubImage3D)
-       && FindProcShort (glCompressedTextureSubImage1D)
-       && FindProcShort (glCompressedTextureSubImage2D)
-       && FindProcShort (glCompressedTextureSubImage3D)
-       && FindProcShort (glCopyTextureSubImage1D)
-       && FindProcShort (glCopyTextureSubImage2D)
-       && FindProcShort (glCopyTextureSubImage3D)
-       && FindProcShort (glTextureParameterf)
-       && FindProcShort (glTextureParameterfv)
-       && FindProcShort (glTextureParameteri)
-       && FindProcShort (glTextureParameterIiv)
-       && FindProcShort (glTextureParameterIuiv)
-       && FindProcShort (glTextureParameteriv)
-       && FindProcShort (glGenerateTextureMipmap)
-       && FindProcShort (glBindTextureUnit)
-       && FindProcShort (glGetTextureImage)
-       && FindProcShort (glGetCompressedTextureImage)
-       && FindProcShort (glGetTextureLevelParameterfv)
-       && FindProcShort (glGetTextureLevelParameteriv)
-       && FindProcShort (glGetTextureParameterfv)
-       && FindProcShort (glGetTextureParameterIiv)
-       && FindProcShort (glGetTextureParameterIuiv)
-       && FindProcShort (glGetTextureParameteriv)
-       && FindProcShort (glCreateVertexArrays)
-       && FindProcShort (glDisableVertexArrayAttrib)
-       && FindProcShort (glEnableVertexArrayAttrib)
-       && FindProcShort (glVertexArrayElementBuffer)
-       && FindProcShort (glVertexArrayVertexBuffer)
-       && FindProcShort (glVertexArrayVertexBuffers)
-       && FindProcShort (glVertexArrayAttribBinding)
-       && FindProcShort (glVertexArrayAttribFormat)
-       && FindProcShort (glVertexArrayAttribIFormat)
-       && FindProcShort (glVertexArrayAttribLFormat)
-       && FindProcShort (glVertexArrayBindingDivisor)
-       && FindProcShort (glGetVertexArrayiv)
-       && FindProcShort (glGetVertexArrayIndexediv)
-       && FindProcShort (glGetVertexArrayIndexed64iv)
-       && FindProcShort (glCreateSamplers)
-       && FindProcShort (glCreateProgramPipelines)
-       && FindProcShort (glCreateQueries)
-       && FindProcShort (glGetQueryBufferObjecti64v)
-       && FindProcShort (glGetQueryBufferObjectiv)
-       && FindProcShort (glGetQueryBufferObjectui64v)
-       && FindProcShort (glGetQueryBufferObjectuiv)
-       && FindProcShort (glMemoryBarrierByRegion)
-       && FindProcShort (glGetTextureSubImage)
-       && FindProcShort (glGetCompressedTextureSubImage)
-       && FindProcShort (glGetGraphicsResetStatus)
-       && FindProcShort (glGetnCompressedTexImage)
-       && FindProcShort (glGetnTexImage)
-       && FindProcShort (glGetnUniformdv)
-       && FindProcShort (glGetnUniformfv)
-       && FindProcShort (glGetnUniformiv)
-       && FindProcShort (glGetnUniformuiv)
-       && FindProcShort (glReadnPixels)
-       && FindProcShort (glGetnMapdv)
-       && FindProcShort (glGetnMapfv)
-       && FindProcShort (glGetnMapiv)
-       && FindProcShort (glGetnPixelMapfv)
-       && FindProcShort (glGetnPixelMapuiv)
-       && FindProcShort (glGetnPixelMapusv)
-       && FindProcShort (glGetnPolygonStipple)
-       && FindProcShort (glGetnColorTable)
-       && FindProcShort (glGetnConvolutionFilter)
-       && FindProcShort (glGetnSeparableFilter)
-       && FindProcShort (glGetnHistogram)
-       && FindProcShort (glGetnMinmax)
-       && FindProcShort (glTextureBarrier);
-  if (has45)
-  {
-    core45 = (OpenGl_GlCore45* )(&(*myFuncs));
-    if (!isCoreProfile)
-    {
-      core45back = (OpenGl_GlCore45Back* )(&(*myFuncs));
-    }
-  }
-  else
-  {
-    checkWrongVersion (4, 5, aLastFailedProc);
-  }
-
-  // initialize debug context extension
-  if (CheckExtension ("GL_ARB_debug_output"))
+#else
+  if (core30fwd != NULL)
   {
-    arbDbg = NULL;
-    if (has43)
-    {
-      arbDbg = (OpenGl_ArbDbg* )(&(*myFuncs));
-    }
-    else if (FindProc ("glDebugMessageControlARB",  myFuncs->glDebugMessageControl)
-          && FindProc ("glDebugMessageInsertARB",   myFuncs->glDebugMessageInsert)
-          && FindProc ("glDebugMessageCallbackARB", myFuncs->glDebugMessageCallback)
-          && FindProc ("glGetDebugMessageLogARB",   myFuncs->glGetDebugMessageLog))
+    // MSAA RenderBuffers have been defined in OpenGL 3.0,
+    // but MSAA Textures - only in OpenGL 3.2+
+    if (core32 != NULL)
     {
-      arbDbg = (OpenGl_ArbDbg* )(&(*myFuncs));
+      ::glGetIntegerv (GL_MAX_SAMPLES, &myMaxMsaaSamples);
     }
-
-    if (arbDbg != NULL
-     && caps->contextDebug)
+    else if (CheckExtension ("GL_ARB_texture_multisample")
+          && myFuncs->glTexImage2DMultisample != NULL)
     {
-      // setup default callback
-      myIsGlDebugCtx = Standard_True;
-      arbDbg->glDebugMessageCallback (debugCallbackWrap, this);
-      if (has43)
-      {
-        ::glEnable (GL_DEBUG_OUTPUT);
-      }
-      if (caps->contextSyncDebug)
-      {
-        ::glEnable (GL_DEBUG_OUTPUT_SYNCHRONOUS);
-      }
+      GLint aNbColorSamples = 0, aNbDepthSamples = 0;
+      ::glGetIntegerv (GL_MAX_COLOR_TEXTURE_SAMPLES, &aNbColorSamples);
+      ::glGetIntegerv (GL_MAX_DEPTH_TEXTURE_SAMPLES, &aNbDepthSamples);
+      myMaxMsaaSamples = Min (aNbColorSamples, aNbDepthSamples);
     }
   }
+#endif
 
-  // initialize FBO extension (ARB)
-  if (hasFBO)
+#if !defined(GL_ES_VERSION_2_0)
+  if (core32 != NULL && isCoreProfile)
   {
-    arbFBO     = (OpenGl_ArbFBO*     )(&(*myFuncs));
-    arbFBOBlit = (OpenGl_ArbFBOBlit* )(&(*myFuncs));
-    extPDS = Standard_True; // extension for EXT, but part of ARB
+    core32->glGenVertexArrays (1, &myDefaultVao);
   }
 
-  // initialize GS extension (EXT)
-  if (CheckExtension ("GL_EXT_geometry_shader4")
-   && FindProcShort (glProgramParameteriEXT))
-  {
-    extGS = (OpenGl_ExtGS* )(&(*myFuncs));
-  }
+  myTexClamp = IsGlGreaterEqual (1, 2) ? GL_CLAMP_TO_EDGE : GL_CLAMP;
 
-  // initialize bindless texture extension (ARB)
-  if (CheckExtension ("GL_ARB_bindless_texture")
-   && FindProcShort (glGetTextureHandleARB)
-   && FindProcShort (glGetTextureSamplerHandleARB)
-   && FindProcShort (glMakeTextureHandleResidentARB)
-   && FindProcShort (glMakeTextureHandleNonResidentARB)
-   && FindProcShort (glGetImageHandleARB)
-   && FindProcShort (glMakeImageHandleResidentARB)
-   && FindProcShort (glMakeImageHandleNonResidentARB)
-   && FindProcShort (glUniformHandleui64ARB)
-   && FindProcShort (glUniformHandleui64vARB)
-   && FindProcShort (glProgramUniformHandleui64ARB)
-   && FindProcShort (glProgramUniformHandleui64vARB)
-   && FindProcShort (glIsTextureHandleResidentARB)
-   && FindProcShort (glIsImageHandleResidentARB)
-   && FindProcShort (glVertexAttribL1ui64ARB)
-   && FindProcShort (glVertexAttribL1ui64vARB)
-   && FindProcShort (glGetVertexAttribLui64vARB))
-  {
-    arbTexBindless = (OpenGl_ArbTexBindless* )(&(*myFuncs));
-  }
+  GLint aStereo = GL_FALSE;
+  glGetIntegerv (GL_STEREO, &aStereo);
+  myIsStereoBuffers = aStereo == 1;
 
-  if (has30)
-  {
-    // MSAA RenderBuffers have been defined in OpenGL 3.0,
-    // but MSAA Textures - only in OpenGL 3.2+
-    if (!has32
-     && CheckExtension ("GL_ARB_texture_multisample")
-     && FindProcShort (glTexImage2DMultisample))
-    {
-      GLint aNbColorSamples = 0, aNbDepthSamples = 0;
-      ::glGetIntegerv (GL_MAX_COLOR_TEXTURE_SAMPLES, &aNbColorSamples);
-      ::glGetIntegerv (GL_MAX_DEPTH_TEXTURE_SAMPLES, &aNbDepthSamples);
-      myMaxMsaaSamples = Min (aNbColorSamples, aNbDepthSamples);
-    }
-    if (!has43
-     && CheckExtension ("GL_ARB_texture_storage_multisample")
-     && FindProcShort (glTexStorage2DMultisample))
-    {
-      //
-    }
-  }
+  // get number of maximum clipping planes
+  glGetIntegerv (GL_MAX_CLIP_PLANES, &myMaxClipPlanes);
 
   // check whether ray tracing mode is supported
-  myHasRayTracing = has31
+  myHasRayTracing = IsGlGreaterEqual (3, 1)
                  && arbTboRGB32
                  && arbFBOBlit  != NULL;
 
@@ -3337,7 +1631,7 @@ void OpenGl_Context::init (const Standard_Boolean theIsCoreProfile)
 
   // check whether adaptive screen sampling in ray tracing mode is supported
   myHasRayTracingAdaptiveSampling = myHasRayTracing
-                                 && has44;
+                                 && core44 != NULL;
   myHasRayTracingAdaptiveSamplingAtomic = myHasRayTracingAdaptiveSampling
                                        && CheckExtension ("GL_NV_shader_atomic_float");
 #endif
@@ -3383,6 +1677,21 @@ void OpenGl_Context::init (const Standard_Boolean theIsCoreProfile)
     }
   }
 
+  // standard formats
+  mySupportedFormats->Add (Image_Format_Gray);
+  mySupportedFormats->Add (Image_Format_Alpha);
+  mySupportedFormats->Add (Image_Format_RGB);
+  mySupportedFormats->Add (Image_Format_RGB32);
+  mySupportedFormats->Add (Image_Format_RGBA);
+  if (extBgra)
+  {
+  #if !defined(GL_ES_VERSION_2_0)
+    // no BGR on OpenGL ES - only BGRA as extension
+    mySupportedFormats->Add (Image_Format_BGR);
+  #endif
+    mySupportedFormats->Add (Image_Format_BGR32);
+    mySupportedFormats->Add (Image_Format_BGRA);
+  }
   if (arbTexFloat)
   {
     mySupportedFormats->Add (Image_Format_GrayF);
@@ -3418,6 +1727,11 @@ void OpenGl_Context::init (const Standard_Boolean theIsCoreProfile)
     mySupportedFormats->Add (Image_CompressedFormat_RGBA_S3TC_DXT3);
     mySupportedFormats->Add (Image_CompressedFormat_RGBA_S3TC_DXT5);
   }
+  if (!extPDS
+    && checkEnableWebGlExtension (*this, "GL_WEBGL_depth_texture"))
+  {
+    extPDS = true; // WebGL 1.0 extension (in WebGL 2.0 core)
+  }
 #else
   if (CheckExtension ("GL_EXT_texture_compression_s3tc")) // GL_EXT_texture_sRGB for sRGB formats
   {