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)
{
}
#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);
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;
// 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
}
}
+ // 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);
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
{
--- /dev/null
+// Copyright (c) 2021 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#if defined(_WIN32)
+ #include <windows.h>
+#endif
+
+#include <OpenGl_Context.hxx>
+
+#include <OpenGl_ArbTBO.hxx>
+#include <OpenGl_ArbIns.hxx>
+#include <OpenGl_ArbDbg.hxx>
+#include <OpenGl_ArbFBO.hxx>
+#include <OpenGl_ExtGS.hxx>
+#include <OpenGl_ArbSamplerObject.hxx>
+#include <OpenGl_ArbTexBindless.hxx>
+#include <OpenGl_GlCore45.hxx>
+
+// =======================================================================
+// function : init
+// purpose :
+// =======================================================================
+void OpenGl_GlFunctions::load (OpenGl_Context& theCtx,
+ Standard_Boolean theIsCoreProfile)
+{
+ const bool isCoreProfile = theIsCoreProfile;
+ theCtx.core11 = !isCoreProfile ? (OpenGl_GlCore11* )this : NULL;
+ theCtx.core11fwd = (OpenGl_GlCore11Fwd* )this;
+ theCtx.core15 = NULL;
+ theCtx.core15fwd = NULL;
+ theCtx.core20 = NULL;
+ theCtx.core20fwd = NULL;
+ theCtx.core30 = NULL;
+ theCtx.core30fwd = NULL;
+ theCtx.core32 = NULL;
+ theCtx.core32back = NULL;
+ theCtx.core33 = NULL;
+ theCtx.core33back = NULL;
+ theCtx.core41 = NULL;
+ theCtx.core41back = NULL;
+ theCtx.core42 = NULL;
+ theCtx.core42back = NULL;
+ theCtx.core43 = NULL;
+ theCtx.core43back = NULL;
+ theCtx.core44 = NULL;
+ theCtx.core44back = NULL;
+ theCtx.core45 = NULL;
+ theCtx.core45back = NULL;
+ theCtx.arbTBO = NULL;
+ theCtx.arbTboRGB32 = false;
+ theCtx.arbIns = NULL;
+ theCtx.arbDbg = NULL;
+ theCtx.arbFBO = NULL;
+ theCtx.arbFBOBlit = NULL;
+ theCtx.extGS = NULL;
+
+ //! Make record shorter to retrieve function pointer using variable with same name
+ const char* aLastFailedProc = NULL;
+ #define FindProcShort(theFunc) theCtx.FindProcVerbose(aLastFailedProc, #theFunc, this->theFunc)
+ #define checkExtensionShort theCtx.CheckExtension
+ #define isGlGreaterEqualShort(theMaj,theMin) theCtx.IsGlGreaterEqual(theMaj,theMin)
+
+#if defined(GL_ES_VERSION_2_0)
+
+ theCtx.hasTexRGBA8 = isGlGreaterEqualShort (3, 0)
+ || checkExtensionShort ("GL_OES_rgb8_rgba8");
+ theCtx.hasTexSRGB = isGlGreaterEqualShort (3, 0);
+ theCtx.hasFboSRGB = isGlGreaterEqualShort (3, 0);
+ theCtx.hasFboRenderMipmap = isGlGreaterEqualShort (3, 0)
+ || checkExtensionShort ("GL_OES_fbo_render_mipmap");
+ theCtx.hasSRGBControl = checkExtensionShort ("GL_EXT_sRGB_write_control");
+ theCtx.hasPackRowLength = isGlGreaterEqualShort (3, 0);
+ theCtx.hasUnpackRowLength = isGlGreaterEqualShort (3, 0); // || checkExtensionShort ("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
+ //theCtx.arbNPTW = isGlGreaterEqualShort (3, 0)
+ // || checkExtensionShort ("GL_OES_texture_npot")
+ // || checkExtensionShort ("GL_NV_texture_npot_2D_mipmap");
+ theCtx.arbNPTW = true;
+ theCtx.arbTexRG = isGlGreaterEqualShort (3, 0)
+ || checkExtensionShort ("GL_EXT_texture_rg");
+ theCtx.extBgra = checkExtensionShort ("GL_EXT_texture_format_BGRA8888");
+ theCtx.extAnis = checkExtensionShort ("GL_EXT_texture_filter_anisotropic");
+ theCtx.extPDS = isGlGreaterEqualShort (3, 0)
+ || checkExtensionShort ("GL_OES_packed_depth_stencil");
+
+ theCtx.core11fwd = (OpenGl_GlCore11Fwd* )this;
+ if (isGlGreaterEqualShort (2, 0))
+ {
+ // enable compatible functions
+ theCtx.core20 = (OpenGl_GlCore20* )this;
+ theCtx.core20fwd = (OpenGl_GlCore20Fwd* )this;
+ theCtx.core15fwd = (OpenGl_GlCore15Fwd* )this;
+ theCtx.arbFBO = (OpenGl_ArbFBO* )this;
+ }
+ if (isGlGreaterEqualShort (3, 0)
+ && FindProcShort (glBlitFramebuffer))
+ {
+ theCtx.arbFBOBlit = (OpenGl_ArbFBOBlit* )this;
+ }
+ if (isGlGreaterEqualShort (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))
+ {
+ theCtx.arbSamplerObject = (OpenGl_ArbSamplerObject* )this;
+ }
+ theCtx.extFragDepth = !isGlGreaterEqualShort(3, 0)
+ && checkExtensionShort ("GL_EXT_frag_depth");
+ if (isGlGreaterEqualShort (3, 1)
+ && FindProcShort (glTexStorage2DMultisample))
+ {
+ //
+ }
+
+ theCtx.hasUintIndex = isGlGreaterEqualShort (3, 0)
+ || checkExtensionShort ("GL_OES_element_index_uint");
+ theCtx.hasHighp = checkExtensionShort ("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)
+ {
+ theCtx.hasHighp = Standard_True;
+ }
+
+ theCtx.arbTexFloat = (isGlGreaterEqualShort (3, 0)
+ && FindProcShort (glTexImage3D))
+ || checkExtensionShort ("GL_OES_texture_float");
+ theCtx.hasTexFloatLinear = theCtx.arbTexFloat
+ && checkExtensionShort ("GL_OES_texture_float_linear");
+
+ const bool hasTexBuffer32 = isGlGreaterEqualShort (3, 2) && FindProcShort (glTexBuffer);
+ const bool hasExtTexBuffer = checkExtensionShort ("GL_EXT_texture_buffer") && theCtx.FindProc ("glTexBufferEXT", this->glTexBuffer);
+ if (hasTexBuffer32 || hasExtTexBuffer)
+ {
+ theCtx.arbTBO = reinterpret_cast<OpenGl_ArbTBO*> (this);
+ }
+
+ bool hasInstanced = isGlGreaterEqualShort (3, 0)
+ && FindProcShort (glVertexAttribDivisor)
+ && FindProcShort (glDrawArraysInstanced)
+ && FindProcShort (glDrawElementsInstanced);
+ if (!hasInstanced)
+ {
+ hasInstanced = checkExtensionShort ("GL_ANGLE_instanced_arrays")
+ && theCtx.FindProc ("glVertexAttribDivisorANGLE", this->glVertexAttribDivisor)
+ && theCtx.FindProc ("glDrawArraysInstancedANGLE", this->glDrawArraysInstanced)
+ && theCtx.FindProc ("glDrawElementsInstancedANGLE", this->glDrawElementsInstanced);
+ }
+ if (hasInstanced)
+ {
+ theCtx.arbIns = (OpenGl_ArbIns* )this;
+ }
+
+ const bool hasVAO = isGlGreaterEqualShort (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 = isGlGreaterEqualShort (3, 0)
+ && FindProcShort (glMapBufferRange)
+ && FindProcShort (glUnmapBuffer)
+ && FindProcShort (glGetBufferPointerv)
+ && FindProcShort (glFlushMappedBufferRange);
+#endif
+
+ // load OpenGL ES 3.0 new functions
+ const bool has30es = isGlGreaterEqualShort (3, 0)
+ && hasVAO
+ #ifndef __EMSCRIPTEN__
+ && hasMapBufferRange
+ #endif
+ && hasInstanced
+ && theCtx.arbSamplerObject != NULL
+ && theCtx.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)
+ {
+ theCtx.checkWrongVersion (3, 0, aLastFailedProc);
+ }
+ else
+ {
+ theCtx.core30 = (OpenGl_GlCore30* )this;
+ theCtx.core30fwd = (OpenGl_GlCore30Fwd* )this;
+ theCtx.hasGetBufferData = true;
+ }
+
+ // load OpenGL ES 3.1 new functions
+ const bool has31es = isGlGreaterEqualShort (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)
+ {
+ theCtx.checkWrongVersion (3, 1, aLastFailedProc);
+ }
+
+ // initialize debug context extension
+ if (isGlGreaterEqualShort (3, 2)
+ || checkExtensionShort ("GL_KHR_debug"))
+ {
+ // this functionality become a part of OpenGL ES 3.2
+ theCtx.arbDbg = NULL;
+ if (isGlGreaterEqualShort (3, 2)
+ && FindProcShort (glDebugMessageControl)
+ && FindProcShort (glDebugMessageInsert)
+ && FindProcShort (glDebugMessageCallback)
+ && FindProcShort (glGetDebugMessageLog))
+ {
+ theCtx.arbDbg = (OpenGl_ArbDbg* )this;
+ }
+ // According to GL_KHR_debug spec, all functions should have KHR suffix.
+ // However, some implementations can export these functions without suffix.
+ else if (!isGlGreaterEqualShort (3, 2)
+ && theCtx.FindProc ("glDebugMessageControlKHR", this->glDebugMessageControl)
+ && theCtx.FindProc ("glDebugMessageInsertKHR", this->glDebugMessageInsert)
+ && theCtx.FindProc ("glDebugMessageCallbackKHR", this->glDebugMessageCallback)
+ && theCtx.FindProc ("glGetDebugMessageLogKHR", this->glGetDebugMessageLog))
+ {
+ theCtx.arbDbg = (OpenGl_ArbDbg* )this;
+ }
+ }
+
+ // load OpenGL ES 3.2 new functions
+ const bool has32es = isGlGreaterEqualShort (3, 2)
+ && has31es
+ && hasTexBuffer32
+ && theCtx.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)
+ {
+ theCtx.checkWrongVersion (3, 2, aLastFailedProc);
+ }
+
+ theCtx.extDrawBuffers = checkExtensionShort ("GL_EXT_draw_buffers") && theCtx.FindProc ("glDrawBuffersEXT", this->glDrawBuffers);
+ theCtx.arbDrawBuffers = checkExtensionShort ("GL_ARB_draw_buffers") && theCtx.FindProc ("glDrawBuffersARB", this->glDrawBuffers);
+
+ if (isGlGreaterEqualShort (3, 0) && FindProcShort (glDrawBuffers))
+ {
+ theCtx.hasDrawBuffers = OpenGl_FeatureInCore;
+ }
+ else if (theCtx.extDrawBuffers || theCtx.arbDrawBuffers)
+ {
+ theCtx.hasDrawBuffers = OpenGl_FeatureInExtensions;
+ }
+
+ theCtx.hasFloatBuffer = isGlGreaterEqualShort (3, 2) ? OpenGl_FeatureInCore :
+ checkExtensionShort ("GL_EXT_color_buffer_float") ? OpenGl_FeatureInExtensions
+ : OpenGl_FeatureNotAvailable;
+ theCtx.hasHalfFloatBuffer = isGlGreaterEqualShort (3, 2) ? OpenGl_FeatureInCore :
+ checkExtensionShort ("GL_EXT_color_buffer_half_float") ? OpenGl_FeatureInExtensions
+ : OpenGl_FeatureNotAvailable;
+
+ theCtx.oesSampleVariables = checkExtensionShort ("GL_OES_sample_variables");
+ theCtx.oesStdDerivatives = checkExtensionShort ("GL_OES_standard_derivatives");
+ theCtx.hasSampleVariables = isGlGreaterEqualShort (3, 2) ? OpenGl_FeatureInCore :
+ theCtx.oesSampleVariables ? OpenGl_FeatureInExtensions
+ : OpenGl_FeatureNotAvailable;
+ theCtx.hasGlslBitwiseOps = isGlGreaterEqualShort (3, 0)
+ ? OpenGl_FeatureInCore
+ : OpenGl_FeatureNotAvailable;
+ // without hasHighp, dFdx/dFdy precision is considered too low for flat shading (visual artifacts)
+ theCtx.hasFlatShading = isGlGreaterEqualShort (3, 0)
+ ? OpenGl_FeatureInCore
+ : (theCtx.oesStdDerivatives && theCtx.hasHighp
+ ? OpenGl_FeatureInExtensions
+ : OpenGl_FeatureNotAvailable);
+ if (!isGlGreaterEqualShort (3, 1)
+ && theCtx.Vendor().Search("qualcomm") != -1)
+ {
+ // dFdx/dFdy are completely broken on tested Adreno devices with versions below OpenGl ES 3.1
+ theCtx.hasFlatShading = OpenGl_FeatureNotAvailable;
+ }
+
+ theCtx.hasGeometryStage = isGlGreaterEqualShort (3, 2)
+ ? OpenGl_FeatureInCore
+ : (checkExtensionShort ("GL_EXT_geometry_shader") && checkExtensionShort ("GL_EXT_shader_io_blocks")
+ ? OpenGl_FeatureInExtensions
+ : OpenGl_FeatureNotAvailable);
+#else
+
+ theCtx.hasTexRGBA8 = true;
+ theCtx.hasTexSRGB = isGlGreaterEqualShort (2, 1);
+ theCtx.hasFboSRGB = isGlGreaterEqualShort (2, 1);
+ theCtx.hasSRGBControl = theCtx.hasFboSRGB;
+ theCtx.hasFboRenderMipmap = true;
+ theCtx.arbDrawBuffers = checkExtensionShort ("GL_ARB_draw_buffers");
+ theCtx.arbNPTW = checkExtensionShort ("GL_ARB_texture_non_power_of_two");
+ theCtx.arbTexFloat = isGlGreaterEqualShort (3, 0)
+ || checkExtensionShort ("GL_ARB_texture_float");
+ theCtx.hasTexFloatLinear = theCtx.arbTexFloat;
+ theCtx.arbSampleShading = checkExtensionShort ("GL_ARB_sample_shading");
+ theCtx.arbDepthClamp = isGlGreaterEqualShort (3, 2)
+ || checkExtensionShort ("GL_ARB_depth_clamp")
+ || checkExtensionShort ("NV_depth_clamp");
+ theCtx.extBgra = isGlGreaterEqualShort (1, 2)
+ || checkExtensionShort ("GL_EXT_bgra");
+ theCtx.extAnis = checkExtensionShort ("GL_EXT_texture_filter_anisotropic");
+ theCtx.extPDS = checkExtensionShort ("GL_EXT_packed_depth_stencil");
+ theCtx.atiMem = checkExtensionShort ("GL_ATI_meminfo");
+ theCtx.nvxMem = checkExtensionShort ("GL_NVX_gpu_memory_info");
+
+ theCtx.hasDrawBuffers = isGlGreaterEqualShort (2, 0) ? OpenGl_FeatureInCore :
+ theCtx.arbDrawBuffers ? OpenGl_FeatureInExtensions
+ : OpenGl_FeatureNotAvailable;
+
+ theCtx.hasGlslBitwiseOps = isGlGreaterEqualShort (3, 0)
+ ? OpenGl_FeatureInCore
+ : checkExtensionShort ("GL_EXT_gpu_shader4")
+ ? OpenGl_FeatureInExtensions
+ : OpenGl_FeatureNotAvailable;
+
+ theCtx.hasFloatBuffer = theCtx.hasHalfFloatBuffer =
+ isGlGreaterEqualShort (3, 0) ? OpenGl_FeatureInCore :
+ checkExtensionShort ("GL_ARB_color_buffer_float") ? OpenGl_FeatureInExtensions
+ : OpenGl_FeatureNotAvailable;
+
+ theCtx.hasGeometryStage = isGlGreaterEqualShort (3, 2)
+ ? OpenGl_FeatureInCore
+ : OpenGl_FeatureNotAvailable;
+
+ theCtx.hasSampleVariables = isGlGreaterEqualShort (4, 0) ? OpenGl_FeatureInCore :
+ theCtx.arbSampleShading ? OpenGl_FeatureInExtensions
+ : OpenGl_FeatureNotAvailable;
+
+ bool has12 = false, has13 = false, has14 = false, has15 = false;
+ bool has20 = false, has21 = false;
+ bool has30 = false, has31 = false, has32 = false, has33 = false;
+ bool has40 = false, has41 = false, has42 = false, has43 = false, has44 = false, has45 = false;
+
+ // retrieve platform-dependent extensions
+#if defined(HAVE_EGL)
+ //
+#elif defined(_WIN32)
+ if (FindProcShort (wglGetExtensionsStringARB))
+ {
+ const char* aWglExts = this->wglGetExtensionsStringARB (wglGetCurrentDC());
+ if (checkExtensionShort (aWglExts, "WGL_EXT_swap_control"))
+ {
+ FindProcShort (wglSwapIntervalEXT);
+ }
+ if (checkExtensionShort (aWglExts, "WGL_ARB_pixel_format"))
+ {
+ FindProcShort (wglChoosePixelFormatARB);
+ }
+ if (checkExtensionShort (aWglExts, "WGL_ARB_create_context_profile"))
+ {
+ FindProcShort (wglCreateContextAttribsARB);
+ }
+ if (checkExtensionShort (aWglExts, "WGL_NV_DX_interop"))
+ {
+ FindProcShort (wglDXSetResourceShareHandleNV);
+ FindProcShort (wglDXOpenDeviceNV);
+ FindProcShort (wglDXCloseDeviceNV);
+ FindProcShort (wglDXRegisterObjectNV);
+ FindProcShort (wglDXUnregisterObjectNV);
+ FindProcShort (wglDXObjectAccessNV);
+ FindProcShort (wglDXLockObjectsNV);
+ FindProcShort (wglDXUnlockObjectsNV);
+ }
+ if (checkExtensionShort (aWglExts, "WGL_AMD_gpu_association"))
+ {
+ FindProcShort (wglGetGPUIDsAMD);
+ FindProcShort (wglGetGPUInfoAMD);
+ FindProcShort (wglGetContextGPUIDAMD);
+ }
+ }
+#elif defined(__APPLE__)
+ //
+#else
+ const char* aGlxExts = ::glXQueryExtensionsString ((Display* )theCtx.myDisplay, DefaultScreen ((Display* )theCtx.myDisplay));
+ if (checkExtensionShort (aGlxExts, "GLX_EXT_swap_control"))
+ {
+ FindProcShort (glXSwapIntervalEXT);
+ }
+ if (checkExtensionShort (aGlxExts, "GLX_SGI_swap_control"))
+ {
+ FindProcShort (glXSwapIntervalSGI);
+ }
+ if (checkExtensionShort (aGlxExts, "GLX_MESA_query_renderer"))
+ {
+ FindProcShort (glXQueryRendererIntegerMESA);
+ FindProcShort (glXQueryCurrentRendererIntegerMESA);
+ FindProcShort (glXQueryRendererStringMESA);
+ FindProcShort (glXQueryCurrentRendererStringMESA);
+ }
+ //extSwapTear = checkExtensionShort (aGlxExts, "GLX_EXT_swap_control_tear");
+#endif
+
+ // load OpenGL 1.2 new functions
+ has12 = isGlGreaterEqualShort (1, 2)
+ && FindProcShort (glBlendColor)
+ && FindProcShort (glBlendEquation)
+ && FindProcShort (glDrawRangeElements)
+ && FindProcShort (glTexImage3D)
+ && FindProcShort (glTexSubImage3D)
+ && FindProcShort (glCopyTexSubImage3D);
+ if (!has12)
+ {
+ theCtx.checkWrongVersion (1, 2, aLastFailedProc);
+ }
+
+ // load OpenGL 1.3 new functions
+ has13 = isGlGreaterEqualShort (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)
+ {
+ theCtx.checkWrongVersion (1, 3, aLastFailedProc);
+ }
+
+ // load OpenGL 1.4 new functions
+ has14 = isGlGreaterEqualShort (1, 4)
+ && FindProcShort (glBlendFuncSeparate)
+ && FindProcShort (glMultiDrawArrays)
+ && FindProcShort (glMultiDrawElements)
+ && FindProcShort (glPointParameterf)
+ && FindProcShort (glPointParameterfv)
+ && FindProcShort (glPointParameteri)
+ && FindProcShort (glPointParameteriv);
+ if (!has14)
+ {
+ theCtx.checkWrongVersion (1, 4, aLastFailedProc);
+ }
+
+ // load OpenGL 1.5 new functions
+ has15 = isGlGreaterEqualShort (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)
+ {
+ theCtx.core15 = (OpenGl_GlCore15* )this;
+ }
+ theCtx.core15fwd = (OpenGl_GlCore15Fwd* )this;
+ theCtx.hasGetBufferData = true;
+ }
+ else
+ {
+ theCtx.checkWrongVersion (1, 5, aLastFailedProc);
+ }
+
+ // load OpenGL 2.0 new functions
+ has20 = isGlGreaterEqualShort (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
+ theCtx.checkWrongVersion (2, 0, "GLSL 1.1");
+ }
+ else
+ {
+ if (!isCoreProfile)
+ {
+ theCtx.core20 = (OpenGl_GlCore20* )this;
+ }
+ theCtx.core20fwd = (OpenGl_GlCore20Fwd* )this;
+ }
+ }
+ else
+ {
+ theCtx.checkWrongVersion (2, 0, aLastFailedProc);
+ }
+
+ // load OpenGL 2.1 new functions
+ has21 = isGlGreaterEqualShort (2, 1)
+ && FindProcShort (glUniformMatrix2x3fv)
+ && FindProcShort (glUniformMatrix3x2fv)
+ && FindProcShort (glUniformMatrix2x4fv)
+ && FindProcShort (glUniformMatrix4x2fv)
+ && FindProcShort (glUniformMatrix3x4fv)
+ && FindProcShort (glUniformMatrix4x3fv);
+ if (!has21)
+ {
+ theCtx.checkWrongVersion (2, 1, aLastFailedProc);
+ }
+
+ // load GL_ARB_framebuffer_object (added to OpenGL 3.0 core)
+ const bool hasFBO = (isGlGreaterEqualShort (3, 0) || checkExtensionShort ("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 = (isGlGreaterEqualShort (3, 0) || checkExtensionShort ("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 = (isGlGreaterEqualShort (3, 0) || checkExtensionShort ("GL_ARB_map_buffer_range"))
+ && FindProcShort (glMapBufferRange)
+ && FindProcShort (glFlushMappedBufferRange);
+
+ // load OpenGL 3.0 new functions
+ has30 = isGlGreaterEqualShort (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)
+ {
+ theCtx.checkWrongVersion (3, 0, aLastFailedProc);
+ }
+
+ // load GL_ARB_uniform_buffer_object (added to OpenGL 3.1 core)
+ const bool hasUBO = (isGlGreaterEqualShort (3, 1) || checkExtensionShort ("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 = (isGlGreaterEqualShort (3, 1) || checkExtensionShort ("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.)
+ theCtx.arbNPTW = true;
+ theCtx.arbTexRG = true;
+
+ if (!isCoreProfile)
+ {
+ theCtx.core30 = (OpenGl_GlCore30* )this;
+ }
+ theCtx.core30fwd = (OpenGl_GlCore30Fwd* )this;
+ }
+
+ // load OpenGL 3.1 new functions
+ has31 = isGlGreaterEqualShort (3, 1)
+ && hasUBO
+ && hasCopyBufSubData
+ && FindProcShort (glDrawArraysInstanced)
+ && FindProcShort (glDrawElementsInstanced)
+ && FindProcShort (glTexBuffer)
+ && FindProcShort (glPrimitiveRestartIndex);
+ if (has31)
+ {
+ theCtx.arbTBO = (OpenGl_ArbTBO* )this;
+ theCtx.arbIns = (OpenGl_ArbIns* )this;
+ }
+ else
+ {
+ theCtx.checkWrongVersion (3, 1, aLastFailedProc);
+
+ // initialize TBO extension (ARB)
+ if (checkExtensionShort ("GL_ARB_texture_buffer_object")
+ && theCtx.FindProc ("glTexBufferARB", this->glTexBuffer))
+ {
+ theCtx.arbTBO = (OpenGl_ArbTBO* )this;
+ }
+
+ // initialize hardware instancing extension (ARB)
+ if (checkExtensionShort ("GL_ARB_draw_instanced")
+ && theCtx.FindProc ("glDrawArraysInstancedARB", this->glDrawArraysInstanced)
+ && theCtx.FindProc ("glDrawElementsInstancedARB", this->glDrawElementsInstanced))
+ {
+ theCtx.arbIns = (OpenGl_ArbIns* )this;
+ }
+ }
+
+ theCtx.arbTboRGB32 = checkExtensionShort ("GL_ARB_texture_buffer_object_rgb32");
+
+ // load GL_ARB_draw_elements_base_vertex (added to OpenGL 3.2 core)
+ const bool hasDrawElemsBaseVert = (isGlGreaterEqualShort (3, 2) || checkExtensionShort ("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 = (isGlGreaterEqualShort (3, 2) || checkExtensionShort ("GL_ARB_provoking_vertex"))
+ && FindProcShort (glProvokingVertex);
+
+ // load GL_ARB_sync (added to OpenGL 3.2 core)
+ const bool hasSync = (isGlGreaterEqualShort (3, 2) || checkExtensionShort ("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 = (isGlGreaterEqualShort (3, 2) || checkExtensionShort ("GL_ARB_texture_multisample"))
+ && FindProcShort (glTexImage2DMultisample)
+ && FindProcShort (glTexImage3DMultisample)
+ && FindProcShort (glGetMultisamplefv)
+ && FindProcShort (glSampleMaski);
+
+ // load OpenGL 3.2 new functions
+ has32 = isGlGreaterEqualShort (3, 2)
+ && hasDrawElemsBaseVert
+ && hasProvokingVert
+ && hasSync
+ && hasTextureMultisample
+ && FindProcShort (glGetInteger64i_v)
+ && FindProcShort (glGetBufferParameteri64v)
+ && FindProcShort (glFramebufferTexture);
+ if (has32)
+ {
+ theCtx.core32 = (OpenGl_GlCore32* )this;
+ if (!isCoreProfile)
+ {
+ theCtx.core32back = (OpenGl_GlCore32Back* )this;
+ }
+ }
+ else
+ {
+ theCtx.checkWrongVersion (3, 2, aLastFailedProc);
+ }
+
+ // load GL_ARB_blend_func_extended (added to OpenGL 3.3 core)
+ const bool hasBlendFuncExtended = (isGlGreaterEqualShort (3, 3) || checkExtensionShort ("GL_ARB_blend_func_extended"))
+ && FindProcShort (glBindFragDataLocationIndexed)
+ && FindProcShort (glGetFragDataIndex);
+
+ // load GL_ARB_sampler_objects (added to OpenGL 3.3 core)
+ const bool hasSamplerObjects = (isGlGreaterEqualShort (3, 3) || checkExtensionShort ("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)
+ {
+ theCtx.arbSamplerObject = (OpenGl_ArbSamplerObject* )this;
+ }
+
+ // load GL_ARB_timer_query (added to OpenGL 3.3 core)
+ const bool hasTimerQuery = (isGlGreaterEqualShort (3, 3) || checkExtensionShort ("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 = (isGlGreaterEqualShort (3, 3) || checkExtensionShort ("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 = isGlGreaterEqualShort (3, 3)
+ && hasBlendFuncExtended
+ && hasSamplerObjects
+ && hasTimerQuery
+ && hasVertType21010101rev
+ && FindProcShort (glVertexAttribDivisor);
+ if (has33)
+ {
+ theCtx.core33 = (OpenGl_GlCore33* )this;
+ if (!isCoreProfile)
+ {
+ theCtx.core33back = (OpenGl_GlCore33Back* )this;
+ }
+ }
+ else
+ {
+ theCtx.checkWrongVersion (3, 3, aLastFailedProc);
+ }
+
+ // load GL_ARB_draw_indirect (added to OpenGL 4.0 core)
+ const bool hasDrawIndirect = (isGlGreaterEqualShort (4, 0) || checkExtensionShort ("GL_ARB_draw_indirect"))
+ && FindProcShort (glDrawArraysIndirect)
+ && FindProcShort (glDrawElementsIndirect);
+
+ // load GL_ARB_gpu_shader_fp64 (added to OpenGL 4.0 core)
+ const bool hasShaderFP64 = (isGlGreaterEqualShort (4, 0) || checkExtensionShort ("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 = (isGlGreaterEqualShort (4, 0) || checkExtensionShort ("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 = (isGlGreaterEqualShort (4, 0) || checkExtensionShort ("GL_ARB_tessellation_shader"))
+ && FindProcShort (glPatchParameteri)
+ && FindProcShort (glPatchParameterfv);
+
+ // load GL_ARB_transform_feedback2 (added to OpenGL 4.0 core)
+ const bool hasTrsfFeedback2 = (isGlGreaterEqualShort (4, 0) || checkExtensionShort ("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 = (isGlGreaterEqualShort (4, 0) || checkExtensionShort ("GL_ARB_transform_feedback3"))
+ && FindProcShort (glDrawTransformFeedbackStream)
+ && FindProcShort (glBeginQueryIndexed)
+ && FindProcShort (glEndQueryIndexed)
+ && FindProcShort (glGetQueryIndexediv);
+
+ // load OpenGL 4.0 new functions
+ has40 = isGlGreaterEqualShort (4, 0)
+ && hasDrawIndirect
+ && hasShaderFP64
+ && hasShaderSubroutine
+ && hasTessellationShader
+ && hasTrsfFeedback2
+ && hasTrsfFeedback3
+ && FindProcShort (glMinSampleShading)
+ && FindProcShort (glBlendEquationi)
+ && FindProcShort (glBlendEquationSeparatei)
+ && FindProcShort (glBlendFunci)
+ && FindProcShort (glBlendFuncSeparatei);
+ if (has40)
+ {
+ theCtx.arbTboRGB32 = true; // in core since OpenGL 4.0
+ }
+ else
+ {
+ theCtx.checkWrongVersion (4, 0, aLastFailedProc);
+ }
+
+ // load GL_ARB_ES2_compatibility (added to OpenGL 4.1 core)
+ const bool hasES2Compatibility = (isGlGreaterEqualShort (4, 1) || checkExtensionShort ("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 = (isGlGreaterEqualShort (4, 1) || checkExtensionShort ("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 = (isGlGreaterEqualShort (4, 1) || checkExtensionShort ("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 = (isGlGreaterEqualShort (4, 1) || checkExtensionShort ("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 = (isGlGreaterEqualShort (4, 1) || checkExtensionShort ("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 = isGlGreaterEqualShort (4, 1)
+ && hasES2Compatibility
+ && hasGetProgramBinary
+ && hasSeparateShaderObjects
+ && hasVertAttrib64bit
+ && hasViewportArray;
+ if (has41)
+ {
+ theCtx.core41 = (OpenGl_GlCore41* )this;
+ if (!isCoreProfile)
+ {
+ theCtx.core41back = (OpenGl_GlCore41Back* )this;
+ }
+ }
+ else
+ {
+ theCtx.checkWrongVersion (4, 1, aLastFailedProc);
+ }
+
+ // load GL_ARB_base_instance (added to OpenGL 4.2 core)
+ const bool hasBaseInstance = (isGlGreaterEqualShort (4, 2) || checkExtensionShort ("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 = (isGlGreaterEqualShort (4, 2) || checkExtensionShort ("GL_ARB_transform_feedback_instanced"))
+ && FindProcShort (glDrawTransformFeedbackInstanced)
+ && FindProcShort (glDrawTransformFeedbackStreamInstanced);
+
+ // load GL_ARB_internalformat_query (added to OpenGL 4.2 core)
+ const bool hasInternalFormatQuery = (isGlGreaterEqualShort (4, 2) || checkExtensionShort ("GL_ARB_internalformat_query"))
+ && FindProcShort (glGetInternalformativ);
+
+ // load GL_ARB_shader_atomic_counters (added to OpenGL 4.2 core)
+ const bool hasShaderAtomicCounters = (isGlGreaterEqualShort (4, 2) || checkExtensionShort ("GL_ARB_shader_atomic_counters"))
+ && FindProcShort (glGetActiveAtomicCounterBufferiv);
+
+ // load GL_ARB_shader_image_load_store (added to OpenGL 4.2 core)
+ const bool hasShaderImgLoadStore = (isGlGreaterEqualShort (4, 2) || checkExtensionShort ("GL_ARB_shader_image_load_store"))
+ && FindProcShort (glBindImageTexture)
+ && FindProcShort (glMemoryBarrier);
+
+ // load GL_ARB_texture_storage (added to OpenGL 4.2 core)
+ const bool hasTextureStorage = (isGlGreaterEqualShort (4, 2) || checkExtensionShort ("GL_ARB_texture_storage"))
+ && FindProcShort (glTexStorage1D)
+ && FindProcShort (glTexStorage2D)
+ && FindProcShort (glTexStorage3D);
+
+ has42 = isGlGreaterEqualShort (4, 2)
+ && hasBaseInstance
+ && hasTrsfFeedbackInstanced
+ && hasInternalFormatQuery
+ && hasShaderAtomicCounters
+ && hasShaderImgLoadStore
+ && hasTextureStorage;
+ if (has42)
+ {
+ theCtx.core42 = (OpenGl_GlCore42* )this;
+ if (!isCoreProfile)
+ {
+ theCtx.core42back = (OpenGl_GlCore42Back* )this;
+ }
+ }
+ else
+ {
+ theCtx.checkWrongVersion (4, 2, aLastFailedProc);
+ }
+
+ has43 = isGlGreaterEqualShort (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)
+ {
+ theCtx.core43 = (OpenGl_GlCore43* )this;
+ if (!isCoreProfile)
+ {
+ theCtx.core43back = (OpenGl_GlCore43Back* )this;
+ }
+ }
+ else
+ {
+ theCtx.checkWrongVersion (4, 3, aLastFailedProc);
+ }
+
+ // load GL_ARB_clear_texture (added to OpenGL 4.4 core)
+ bool arbTexClear = (isGlGreaterEqualShort (4, 4) || checkExtensionShort ("GL_ARB_clear_texture"))
+ && FindProcShort (glClearTexImage)
+ && FindProcShort (glClearTexSubImage);
+
+ has44 = isGlGreaterEqualShort (4, 4)
+ && arbTexClear
+ && FindProcShort (glBufferStorage)
+ && FindProcShort (glBindBuffersBase)
+ && FindProcShort (glBindBuffersRange)
+ && FindProcShort (glBindTextures)
+ && FindProcShort (glBindSamplers)
+ && FindProcShort (glBindImageTextures)
+ && FindProcShort (glBindVertexBuffers);
+ if (has44)
+ {
+ theCtx.core44 = (OpenGl_GlCore44* )this;
+ if (!isCoreProfile)
+ {
+ theCtx.core44back = (OpenGl_GlCore44Back* )this;
+ }
+ }
+ else
+ {
+ theCtx.checkWrongVersion (4, 4, aLastFailedProc);
+ }
+
+ has45 = isGlGreaterEqualShort (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)
+ {
+ theCtx.core45 = (OpenGl_GlCore45* )this;
+ if (!isCoreProfile)
+ {
+ theCtx.core45back = (OpenGl_GlCore45Back* )this;
+ }
+ }
+ else
+ {
+ theCtx.checkWrongVersion (4, 5, aLastFailedProc);
+ }
+
+ // initialize debug context extension
+ if (checkExtensionShort ("GL_ARB_debug_output"))
+ {
+ theCtx.arbDbg = NULL;
+ if (has43)
+ {
+ theCtx.arbDbg = (OpenGl_ArbDbg* )this;
+ }
+ else if (theCtx.FindProc ("glDebugMessageControlARB", this->glDebugMessageControl)
+ && theCtx.FindProc ("glDebugMessageInsertARB", this->glDebugMessageInsert)
+ && theCtx.FindProc ("glDebugMessageCallbackARB", this->glDebugMessageCallback)
+ && theCtx.FindProc ("glGetDebugMessageLogARB", this->glGetDebugMessageLog))
+ {
+ theCtx.arbDbg = (OpenGl_ArbDbg* )this;
+ }
+ }
+
+ // initialize FBO extension (ARB)
+ if (hasFBO)
+ {
+ theCtx.arbFBO = (OpenGl_ArbFBO* )this;
+ theCtx.arbFBOBlit = (OpenGl_ArbFBOBlit* )this;
+ theCtx.extPDS = Standard_True; // extension for EXT, but part of ARB
+ }
+
+ // initialize GS extension (EXT)
+ if (checkExtensionShort ("GL_EXT_geometry_shader4")
+ && FindProcShort (glProgramParameteriEXT))
+ {
+ theCtx.extGS = (OpenGl_ExtGS* )this;
+ }
+
+ // initialize bindless texture extension (ARB)
+ if (checkExtensionShort ("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))
+ {
+ theCtx.arbTexBindless = (OpenGl_ArbTexBindless* )this;
+ }
+
+ if (has30)
+ {
+ if (!has32
+ && checkExtensionShort ("GL_ARB_texture_multisample")
+ && FindProcShort (glTexImage2DMultisample))
+ {
+ //
+ }
+ if (!has43
+ && checkExtensionShort ("GL_ARB_texture_storage_multisample")
+ && FindProcShort (glTexStorage2DMultisample))
+ {
+ //
+ }
+ }
+#endif
+}