mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-09 18:50:54 +03:00
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.
1713 lines
70 KiB
C++
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
|
|
}
|