1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-09 18:50:54 +03:00
occt/src/OpenGl/OpenGl_GlFunctions.cxx
kgv 93cdaa76da 0031196: Visualization, TKOpenGl - enable Ray-Tracing using OpenGL ES 3.2
OpenGl_Context now activates Ray-Tracing and arbTboRGB32 for GLES 3.2.
Removed initialization of some uniforms from GLSL code.
Fixed implicit casts within Ray-Tracing shaders.
2021-02-24 20:58:38 +03:00

1713 lines
70 KiB
C++

// 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.arbTboRGB32 = isGlGreaterEqualShort (3, 2); // OpenGL ES 3.2 introduces TBO already supporting RGB32 format
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
}