1 // Created on: 2012-01-26
2 // Created by: Kirill GAVRILOV
3 // Copyright (c) 2012-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
20 #include <OpenGl_Context.hxx>
22 #include <OpenGl_ArbTBO.hxx>
23 #include <OpenGl_ArbIns.hxx>
24 #include <OpenGl_ArbDbg.hxx>
25 #include <OpenGl_ArbFBO.hxx>
26 #include <OpenGl_ExtGS.hxx>
27 #include <OpenGl_ArbSamplerObject.hxx>
28 #include <OpenGl_ArbTexBindless.hxx>
29 #include <OpenGl_GlCore44.hxx>
30 #include <OpenGl_FrameBuffer.hxx>
31 #include <OpenGl_FrameStats.hxx>
32 #include <OpenGl_Sampler.hxx>
33 #include <OpenGl_ShaderManager.hxx>
34 #include <OpenGl_Workspace.hxx>
35 #include <OpenGl_AspectFace.hxx>
36 #include <Graphic3d_TransformUtils.hxx>
37 #include <Graphic3d_RenderingParams.hxx>
39 #include <Message_Messenger.hxx>
41 #include <NCollection_Vector.hxx>
43 #include <Standard_ProgramError.hxx>
45 IMPLEMENT_STANDARD_RTTIEXT(OpenGl_Context,Standard_Transient)
50 #pragma comment(lib, "libEGL.lib")
54 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
56 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
59 #include <OpenGL/OpenGL.h>
60 #include <CoreGraphics/CoreGraphics.h>
63 #include <GL/glx.h> // glXGetProcAddress()
68 static const Handle(OpenGl_Resource) NULL_GL_RESOURCE;
69 static const OpenGl_Mat4 THE_IDENTITY_MATRIX;
71 //! Add key-value pair to the dictionary.
72 static void addInfo (TColStd_IndexedDataMapOfStringString& theDict,
73 const TCollection_AsciiString& theKey,
74 const TCollection_AsciiString& theValue)
76 theDict.ChangeFromIndex (theDict.Add (theKey, theValue)) = theValue;
79 //! Add key-value pair to the dictionary.
80 static void addInfo (TColStd_IndexedDataMapOfStringString& theDict,
81 const TCollection_AsciiString& theKey,
84 TCollection_AsciiString aValue (theValue != NULL ? theValue : "");
85 theDict.ChangeFromIndex (theDict.Add (theKey, aValue)) = aValue;
89 // =======================================================================
90 // function : OpenGl_Context
92 // =======================================================================
93 OpenGl_Context::OpenGl_Context (const Handle(OpenGl_Caps)& theCaps)
112 caps (!theCaps.IsNull() ? theCaps : new OpenGl_Caps()),
113 #if defined(GL_ES_VERSION_2_0)
114 hasHighp (Standard_False),
115 hasUintIndex(Standard_False),
116 hasTexRGBA8(Standard_False),
117 hasFlatShading (OpenGl_FeatureNotAvailable),
119 hasHighp (Standard_True),
120 hasUintIndex(Standard_True),
121 hasTexRGBA8(Standard_True),
122 hasFlatShading (OpenGl_FeatureInCore),
124 hasDrawBuffers (OpenGl_FeatureNotAvailable),
125 hasFloatBuffer (OpenGl_FeatureNotAvailable),
126 hasHalfFloatBuffer (OpenGl_FeatureNotAvailable),
127 hasSampleVariables (OpenGl_FeatureNotAvailable),
128 arbDrawBuffers (Standard_False),
129 arbNPTW (Standard_False),
130 arbTexRG (Standard_False),
131 arbTexFloat (Standard_False),
132 arbSamplerObject (NULL),
133 arbTexBindless (NULL),
135 arbTboRGB32 (Standard_False),
140 arbSampleShading (Standard_False),
141 extFragDepth (Standard_False),
142 extDrawBuffers (Standard_False),
144 extBgra(Standard_False),
145 extAnis(Standard_False),
146 extPDS (Standard_False),
147 atiMem (Standard_False),
148 nvxMem (Standard_False),
149 oesSampleVariables (Standard_False),
150 oesStdDerivatives (Standard_False),
151 mySharedResources (new OpenGl_ResourcesMap()),
152 myDelayed (new OpenGl_DelayReleaseMap()),
153 myUnusedResources (new OpenGl_ResourcesStack()),
155 myGlLibHandle (NULL),
156 myFuncs (new OpenGl_GlFunctions()),
158 myTexClamp (GL_CLAMP_TO_EDGE),
160 myMaxTexCombined (1),
161 myMaxDumpSizeX (1024),
162 myMaxDumpSizeY (1024),
165 myMaxDrawBuffers (1),
166 myMaxColorAttachments (1),
169 myIsInitialized (Standard_False),
170 myIsStereoBuffers (Standard_False),
171 myIsGlNormalizeEnabled (Standard_False),
172 myHasRayTracing (Standard_False),
173 myHasRayTracingTextures (Standard_False),
174 myHasRayTracingAdaptiveSampling (Standard_False),
175 myHasRayTracingAdaptiveSamplingAtomic (Standard_False),
176 myFrameStats (new OpenGl_FrameStats()),
177 #if !defined(GL_ES_VERSION_2_0)
178 myPointSpriteOrig (GL_UPPER_LEFT),
179 myRenderMode (GL_RENDER),
180 myPolygonMode (GL_FILL),
182 myPointSpriteOrig (0),
186 myToCullBackFaces (false),
188 myDrawBuffers (0, 7),
191 myAlphaToCoverage (false),
192 myIsGlDebugCtx (Standard_False),
193 myResolution (Graphic3d_RenderingParams::THE_DEFAULT_RESOLUTION),
194 myResolutionRatio (1.0f),
195 myLineWidthScale (1.0f),
196 myRenderScale (1.0f),
197 myRenderScaleInv (1.0f)
203 myViewportVirt[0] = 0;
204 myViewportVirt[1] = 0;
205 myViewportVirt[2] = 0;
206 myViewportVirt[3] = 0;
208 myPolygonOffset.Mode = Aspect_POM_Off;
209 myPolygonOffset.Factor = 0.0f;
210 myPolygonOffset.Units = 0.0f;
212 // system-dependent fields
213 #if defined(HAVE_EGL)
214 myDisplay = (Aspect_Display )EGL_NO_DISPLAY;
215 myWindow = (Aspect_Drawable )EGL_NO_SURFACE;
216 myGContext = (Aspect_RenderingContext )EGL_NO_CONTEXT;
217 #elif defined(_WIN32)
221 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
222 // Vendors can not extend functionality on this system
223 // and developers are limited to OpenGL support provided by Mac OS X SDK.
224 // We retrieve function pointers from system library
225 // to generalize extensions support on all platforms.
226 // In this way we also reach binary compatibility benefit between OS releases
227 // if some newest functionality is optionally used.
228 // Notice that GL version / extension availability checks are required
229 // because function pointers may be available but not functionality itself
230 // (depends on renderer).
231 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
233 myGlLibHandle = dlopen ("/System/Library/Frameworks/OpenGLES.framework/OpenGLES", RTLD_LAZY);
236 myGlLibHandle = dlopen ("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY);
244 memset (myFuncs.operator->(), 0, sizeof(OpenGl_GlFunctions));
245 myShaderManager = new OpenGl_ShaderManager (this);
248 // =======================================================================
249 // function : ~OpenGl_Context
251 // =======================================================================
252 OpenGl_Context::~OpenGl_Context()
254 // release clean up queue
257 #if !defined(GL_ES_VERSION_2_0)
258 // release default VAO
259 if (myDefaultVao != 0
263 core32->glDeleteVertexArrays (1, &myDefaultVao);
268 // release default FBO
269 if (!myDefaultFbo.IsNull())
271 myDefaultFbo->Release (this);
272 myDefaultFbo.Nullify();
275 // release shared resources if any
276 if (mySharedResources->GetRefCount() <= 1)
278 myShaderManager.Nullify();
279 for (NCollection_DataMap<TCollection_AsciiString, Handle(OpenGl_Resource)>::Iterator anIter (*mySharedResources);
280 anIter.More(); anIter.Next())
282 anIter.Value()->Release (this);
285 // release delayed resources added during deletion of shared resources
286 while (!myUnusedResources->IsEmpty())
288 myUnusedResources->First()->Release (this);
289 myUnusedResources->RemoveFirst();
292 else if (myShaderManager->IsSameContext (this))
294 myShaderManager->SetContext (NULL);
296 mySharedResources.Nullify();
304 #if !defined(GL_ES_VERSION_2_0)
306 glGetPointerv (GL_DEBUG_CALLBACK_USER_PARAM, &aPtr);
310 arbDbg->glDebugMessageCallback (NULL, NULL);
312 myIsGlDebugCtx = Standard_False;
316 // =======================================================================
317 // function : forcedRelease
319 // =======================================================================
320 void OpenGl_Context::forcedRelease()
323 for (NCollection_DataMap<TCollection_AsciiString, Handle(OpenGl_Resource)>::Iterator anIter (*mySharedResources);
324 anIter.More(); anIter.Next())
326 anIter.Value()->Release (this);
328 mySharedResources->Clear();
329 myShaderManager->clear();
330 myShaderManager->SetContext (NULL);
332 // release delayed resources added during deletion of shared resources
333 while (!myUnusedResources->IsEmpty())
335 myUnusedResources->First()->Release (this);
336 myUnusedResources->RemoveFirst();
340 // =======================================================================
341 // function : ResizeViewport
343 // =======================================================================
344 void OpenGl_Context::ResizeViewport (const Standard_Integer* theRect)
346 core11fwd->glViewport (theRect[0], theRect[1], theRect[2], theRect[3]);
347 myViewport[0] = theRect[0];
348 myViewport[1] = theRect[1];
349 myViewport[2] = theRect[2];
350 myViewport[3] = theRect[3];
351 if (HasRenderScale())
353 myViewportVirt[0] = Standard_Integer(theRect[0] * myRenderScaleInv);
354 myViewportVirt[1] = Standard_Integer(theRect[1] * myRenderScaleInv);
355 myViewportVirt[2] = Standard_Integer(theRect[2] * myRenderScaleInv);
356 myViewportVirt[3] = Standard_Integer(theRect[3] * myRenderScaleInv);
360 myViewportVirt[0] = theRect[0];
361 myViewportVirt[1] = theRect[1];
362 myViewportVirt[2] = theRect[2];
363 myViewportVirt[3] = theRect[3];
367 #if !defined(GL_ES_VERSION_2_0)
368 inline Standard_Integer stereoToMonoBuffer (const Standard_Integer theBuffer)
384 // =======================================================================
385 // function : SetReadBuffer
387 // =======================================================================
388 void OpenGl_Context::SetReadBuffer (const Standard_Integer theReadBuffer)
390 #if !defined(GL_ES_VERSION_2_0)
391 myReadBuffer = !myIsStereoBuffers ? stereoToMonoBuffer (theReadBuffer) : theReadBuffer;
392 if (myReadBuffer < GL_COLOR_ATTACHMENT0
395 arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
397 ::glReadBuffer (myReadBuffer);
399 (void )theReadBuffer;
403 // =======================================================================
404 // function : SetDrawBuffer
406 // =======================================================================
407 void OpenGl_Context::SetDrawBuffer (const Standard_Integer theDrawBuffer)
409 #if !defined(GL_ES_VERSION_2_0)
410 const Standard_Integer aDrawBuffer = !myIsStereoBuffers ? stereoToMonoBuffer (theDrawBuffer) : theDrawBuffer;
411 if (aDrawBuffer < GL_COLOR_ATTACHMENT0
414 arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
416 ::glDrawBuffer (aDrawBuffer);
418 myDrawBuffers.Init (GL_NONE);
419 myDrawBuffers.SetValue (0, aDrawBuffer);
421 (void )theDrawBuffer;
425 // =======================================================================
426 // function : SetDrawBuffers
428 // =======================================================================
429 void OpenGl_Context::SetDrawBuffers (const Standard_Integer theNb, const Standard_Integer* theDrawBuffers)
431 Standard_ASSERT_RETURN (hasDrawBuffers, "Multiple draw buffers feature is not supported by the context", Standard_ASSERT_DO_NOTHING());
433 if (myDrawBuffers.Length() < theNb)
435 // should actually never happen here
436 myDrawBuffers.Resize (0, theNb - 1, false);
438 myDrawBuffers.Init (GL_NONE);
440 Standard_Boolean useDefaultFbo = Standard_False;
441 for (Standard_Integer anI = 0; anI < theNb; ++anI)
443 if (theDrawBuffers[anI] < GL_COLOR_ATTACHMENT0 && theDrawBuffers[anI] != GL_NONE)
445 useDefaultFbo = Standard_True;
449 myDrawBuffers.SetValue (anI, theDrawBuffers[anI]);
452 if (arbFBO != NULL && useDefaultFbo)
454 arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER);
457 myFuncs->glDrawBuffers (theNb, (const GLenum*)theDrawBuffers);
460 // =======================================================================
461 // function : SetCullBackFaces
463 // =======================================================================
464 void OpenGl_Context::SetCullBackFaces (bool theToEnable)
466 if (myToCullBackFaces == theToEnable)
471 myToCullBackFaces = theToEnable;
474 //glCullFace (GL_BACK); GL_BACK by default
475 core11fwd->glEnable (GL_CULL_FACE);
479 core11fwd->glDisable (GL_CULL_FACE);
483 // =======================================================================
484 // function : FetchState
486 // =======================================================================
487 void OpenGl_Context::FetchState()
489 #if !defined(GL_ES_VERSION_2_0)
490 // cache feedback mode state
493 ::glGetIntegerv (GL_RENDER_MODE, &myRenderMode);
496 // cache read buffers state
497 ::glGetIntegerv (GL_READ_BUFFER, &myReadBuffer);
499 // cache draw buffers state
500 if (myDrawBuffers.Length() < myMaxDrawBuffers)
502 myDrawBuffers.Resize (0, myMaxDrawBuffers - 1, false);
504 myDrawBuffers.Init (GL_NONE);
506 Standard_Integer aDrawBuffer = GL_NONE;
507 if (myMaxDrawBuffers == 1)
509 ::glGetIntegerv (GL_DRAW_BUFFER, &aDrawBuffer);
510 myDrawBuffers.SetValue (0, aDrawBuffer);
514 for (Standard_Integer anI = 0; anI < myMaxDrawBuffers; ++anI)
516 ::glGetIntegerv (GL_DRAW_BUFFER0 + anI, &aDrawBuffer);
517 myDrawBuffers.SetValue (anI, aDrawBuffer);
523 // =======================================================================
526 // =======================================================================
527 void OpenGl_Context::Share (const Handle(OpenGl_Context)& theShareCtx)
529 if (!theShareCtx.IsNull())
531 mySharedResources = theShareCtx->mySharedResources;
532 myDelayed = theShareCtx->myDelayed;
533 myUnusedResources = theShareCtx->myUnusedResources;
534 myShaderManager = theShareCtx->myShaderManager;
538 #if !defined(__APPLE__) || defined(MACOSX_USE_GLX)
540 // =======================================================================
541 // function : IsCurrent
543 // =======================================================================
544 Standard_Boolean OpenGl_Context::IsCurrent() const
546 #if defined(HAVE_EGL)
547 if ((EGLDisplay )myDisplay == EGL_NO_DISPLAY
548 || (EGLContext )myGContext == EGL_NO_CONTEXT)
550 return Standard_False;
553 return (((EGLDisplay )myDisplay == eglGetCurrentDisplay())
554 && ((EGLContext )myGContext == eglGetCurrentContext())
555 && ((EGLSurface )myWindow == eglGetCurrentSurface (EGL_DRAW)));
556 #elif defined(_WIN32)
557 if (myWindowDC == NULL || myGContext == NULL)
559 return Standard_False;
561 return (( (HDC )myWindowDC == wglGetCurrentDC())
562 && ((HGLRC )myGContext == wglGetCurrentContext()));
564 if (myDisplay == NULL || myWindow == 0 || myGContext == 0)
566 return Standard_False;
569 return ( ((Display* )myDisplay == glXGetCurrentDisplay())
570 && ((GLXContext )myGContext == glXGetCurrentContext())
571 && ((GLXDrawable )myWindow == glXGetCurrentDrawable()));
575 // =======================================================================
576 // function : MakeCurrent
578 // =======================================================================
579 Standard_Boolean OpenGl_Context::MakeCurrent()
581 #if defined(HAVE_EGL)
582 if ((EGLDisplay )myDisplay == EGL_NO_DISPLAY
583 || (EGLContext )myGContext == EGL_NO_CONTEXT)
585 Standard_ProgramError_Raise_if (myIsInitialized, "OpenGl_Context::Init() should be called before!");
586 return Standard_False;
589 if (eglMakeCurrent ((EGLDisplay )myDisplay, (EGLSurface )myWindow, (EGLSurface )myWindow, (EGLContext )myGContext) != EGL_TRUE)
591 // if there is no current context it might be impossible to use glGetError() correctly
592 PushMessage (GL_DEBUG_SOURCE_WINDOW_SYSTEM, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
593 "eglMakeCurrent() has failed!");
594 myIsInitialized = Standard_False;
595 return Standard_False;
597 #elif defined(_WIN32)
598 if (myWindowDC == NULL || myGContext == NULL)
600 Standard_ProgramError_Raise_if (myIsInitialized, "OpenGl_Context::Init() should be called before!");
601 return Standard_False;
604 // technically it should be safe to activate already bound GL context
605 // however some drivers (Intel etc.) may FAIL doing this for unknown reason
608 myShaderManager->SetContext (this);
609 return Standard_True;
611 else if (wglMakeCurrent ((HDC )myWindowDC, (HGLRC )myGContext) != TRUE)
613 // notice that glGetError() couldn't be used here!
614 wchar_t* aMsgBuff = NULL;
615 DWORD anErrorCode = GetLastError();
616 FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
617 NULL, anErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (wchar_t* )&aMsgBuff, 0, NULL);
618 TCollection_ExtendedString aMsg ("wglMakeCurrent() has failed. ");
619 if (aMsgBuff != NULL)
621 aMsg += (Standard_ExtString )aMsgBuff;
622 LocalFree (aMsgBuff);
624 PushMessage (GL_DEBUG_SOURCE_WINDOW_SYSTEM, GL_DEBUG_TYPE_ERROR, (unsigned int )anErrorCode, GL_DEBUG_SEVERITY_HIGH, aMsg);
625 myIsInitialized = Standard_False;
626 return Standard_False;
629 if (myDisplay == NULL || myWindow == 0 || myGContext == 0)
631 Standard_ProgramError_Raise_if (myIsInitialized, "OpenGl_Context::Init() should be called before!");
632 return Standard_False;
635 if (!glXMakeCurrent ((Display* )myDisplay, (GLXDrawable )myWindow, (GLXContext )myGContext))
637 // if there is no current context it might be impossible to use glGetError() correctly
638 PushMessage (GL_DEBUG_SOURCE_WINDOW_SYSTEM, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
639 "glXMakeCurrent() has failed!");
640 myIsInitialized = Standard_False;
641 return Standard_False;
644 myShaderManager->SetContext (this);
645 return Standard_True;
648 // =======================================================================
649 // function : SwapBuffers
651 // =======================================================================
652 void OpenGl_Context::SwapBuffers()
654 #if defined(HAVE_EGL)
655 if ((EGLSurface )myWindow != EGL_NO_SURFACE)
657 eglSwapBuffers ((EGLDisplay )myDisplay, (EGLSurface )myWindow);
659 #elif defined(_WIN32)
660 if ((HDC )myWindowDC != NULL)
662 ::SwapBuffers ((HDC )myWindowDC);
666 if ((Display* )myDisplay != NULL)
668 glXSwapBuffers ((Display* )myDisplay, (GLXDrawable )myWindow);
675 // =======================================================================
676 // function : SetSwapInterval
678 // =======================================================================
679 Standard_Boolean OpenGl_Context::SetSwapInterval (const Standard_Integer theInterval)
681 #if defined(HAVE_EGL)
682 if (::eglSwapInterval ((EGLDisplay )myDisplay, theInterval) == EGL_TRUE)
684 return Standard_True;
686 #elif defined(_WIN32)
687 if (myFuncs->wglSwapIntervalEXT != NULL)
689 myFuncs->wglSwapIntervalEXT (theInterval);
690 return Standard_True;
692 #elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
694 #elif defined(__APPLE__)
695 if (::CGLSetParameter (CGLGetCurrentContext(), kCGLCPSwapInterval, &theInterval) == kCGLNoError)
697 return Standard_True;
700 if (theInterval == -1
701 && myFuncs->glXSwapIntervalEXT != NULL)
703 typedef int (*glXSwapIntervalEXT_t_x)(Display* theDisplay, GLXDrawable theDrawable, int theInterval);
704 glXSwapIntervalEXT_t_x aFuncPtr = (glXSwapIntervalEXT_t_x )myFuncs->glXSwapIntervalEXT;
705 aFuncPtr ((Display* )myDisplay, (GLXDrawable )myWindow, theInterval);
706 return Standard_True;
708 else if (myFuncs->glXSwapIntervalSGI != NULL)
710 myFuncs->glXSwapIntervalSGI (theInterval);
711 return Standard_True;
714 return Standard_False;
717 // =======================================================================
718 // function : findProc
720 // =======================================================================
721 void* OpenGl_Context::findProc (const char* theFuncName)
723 #if defined(HAVE_EGL)
724 return (void* )eglGetProcAddress (theFuncName);
725 #elif defined(_WIN32)
726 return (void* )wglGetProcAddress (theFuncName);
727 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
728 return (myGlLibHandle != NULL) ? dlsym (myGlLibHandle, theFuncName) : NULL;
730 return (void* )glXGetProcAddress ((const GLubyte* )theFuncName);
734 // =======================================================================
735 // function : CheckExtension
737 // =======================================================================
738 Standard_Boolean OpenGl_Context::CheckExtension (const char* theExtName) const
740 if (theExtName == NULL)
743 std::cerr << "CheckExtension called with NULL string!\n";
745 return Standard_False;
748 #if !defined(GL_ES_VERSION_2_0)
749 // available since OpenGL 3.0
750 // and the ONLY way to check extensions with OpenGL 3.1+ core profile
751 if (IsGlGreaterEqual (3, 0)
752 && myFuncs->glGetStringi != NULL)
755 ::glGetIntegerv (GL_NUM_EXTENSIONS, &anExtNb);
756 const size_t anExtNameLen = strlen (theExtName);
757 for (GLint anIter = 0; anIter < anExtNb; ++anIter)
759 const char* anExtension = (const char* )myFuncs->glGetStringi (GL_EXTENSIONS, (GLuint )anIter);
760 const size_t aTestExtNameLen = strlen (anExtension);
761 if (aTestExtNameLen == anExtNameLen
762 && strncmp (anExtension, theExtName, anExtNameLen) == 0)
764 return Standard_True;
767 return Standard_False;
771 // use old way with huge string for all extensions
772 const char* anExtString = (const char* )glGetString (GL_EXTENSIONS);
773 if (anExtString == NULL)
775 Messenger()->Send ("TKOpenGL: glGetString (GL_EXTENSIONS) has returned NULL! No GL context?", Message_Warning);
776 return Standard_False;
778 return CheckExtension (anExtString, theExtName);
781 // =======================================================================
782 // function : CheckExtension
784 // =======================================================================
785 Standard_Boolean OpenGl_Context::CheckExtension (const char* theExtString,
786 const char* theExtName)
788 if (theExtString == NULL)
790 return Standard_False;
793 // Search for theExtName in the extensions string.
794 // Use of strstr() is not sufficient because extension names can be prefixes of other extension names.
795 char* aPtrIter = (char* )theExtString;
796 const char* aPtrEnd = aPtrIter + strlen (theExtString);
797 const size_t anExtNameLen = strlen (theExtName);
798 while (aPtrIter < aPtrEnd)
800 const size_t n = strcspn (aPtrIter, " ");
801 if ((n == anExtNameLen) && (strncmp (aPtrIter, theExtName, anExtNameLen) == 0))
803 return Standard_True;
807 return Standard_False;
810 #if !defined(__APPLE__) || defined(MACOSX_USE_GLX)
812 // =======================================================================
815 // =======================================================================
816 Standard_Boolean OpenGl_Context::Init (const Standard_Boolean theIsCoreProfile)
820 return Standard_True;
823 #if defined(HAVE_EGL)
824 myDisplay = (Aspect_Display )eglGetCurrentDisplay();
825 myGContext = (Aspect_RenderingContext )eglGetCurrentContext();
826 myWindow = (Aspect_Drawable )eglGetCurrentSurface(EGL_DRAW);
827 #elif defined(_WIN32)
828 myWindowDC = (Aspect_Handle )wglGetCurrentDC();
829 myGContext = (Aspect_RenderingContext )wglGetCurrentContext();
831 myDisplay = (Aspect_Display )glXGetCurrentDisplay();
832 myGContext = (Aspect_RenderingContext )glXGetCurrentContext();
833 myWindow = (Aspect_Drawable )glXGetCurrentDrawable();
835 if (myGContext == NULL)
837 return Standard_False;
840 init (theIsCoreProfile);
841 myIsInitialized = Standard_True;
842 return Standard_True;
847 // =======================================================================
850 // =======================================================================
851 #if defined(HAVE_EGL)
852 Standard_Boolean OpenGl_Context::Init (const Aspect_Drawable theEglSurface,
853 const Aspect_Display theEglDisplay,
854 const Aspect_RenderingContext theEglContext,
855 const Standard_Boolean theIsCoreProfile)
856 #elif defined(_WIN32)
857 Standard_Boolean OpenGl_Context::Init (const Aspect_Handle theWindow,
858 const Aspect_Handle theWindowDC,
859 const Aspect_RenderingContext theGContext,
860 const Standard_Boolean theIsCoreProfile)
861 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
863 #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
864 Standard_Boolean OpenGl_Context::Init (EAGLContext* theGContext,
865 const Standard_Boolean theIsCoreProfile)
867 Standard_Boolean OpenGl_Context::Init (NSOpenGLContext* theGContext,
868 const Standard_Boolean theIsCoreProfile)
872 Standard_Boolean OpenGl_Context::Init (const Aspect_Drawable theWindow,
873 const Aspect_Display theDisplay,
874 const Aspect_RenderingContext theGContext,
875 const Standard_Boolean theIsCoreProfile)
878 Standard_ProgramError_Raise_if (myIsInitialized, "OpenGl_Context::Init() should be called only once!");
879 #if defined(HAVE_EGL)
880 myWindow = theEglSurface;
881 myGContext = theEglContext;
882 myDisplay = theEglDisplay;
883 #elif defined(_WIN32)
884 myWindow = theWindow;
885 myGContext = theGContext;
886 myWindowDC = theWindowDC;
887 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
888 myGContext = theGContext;
890 myWindow = theWindow;
891 myGContext = theGContext;
892 myDisplay = theDisplay;
894 if (myGContext == NULL || !MakeCurrent())
896 return Standard_False;
899 init (theIsCoreProfile);
900 myIsInitialized = Standard_True;
901 return Standard_True;
904 // =======================================================================
905 // function : ResetErrors
907 // =======================================================================
908 bool OpenGl_Context::ResetErrors (const bool theToPrintErrors)
911 int anErr = ::glGetError();
912 const bool hasError = anErr != GL_NO_ERROR;
913 if (!theToPrintErrors)
915 for (; anErr != GL_NO_ERROR && aPrevErr != anErr; aPrevErr = anErr, anErr = ::glGetError())
922 for (; anErr != GL_NO_ERROR && aPrevErr != anErr; aPrevErr = anErr, anErr = ::glGetError())
924 TCollection_ExtendedString anErrId;
927 case GL_INVALID_ENUM: anErrId = "GL_INVALID_ENUM"; break;
928 case GL_INVALID_VALUE: anErrId = "GL_INVALID_VALUE"; break;
929 case GL_INVALID_OPERATION: anErrId = "GL_INVALID_OPERATION"; break;
930 #ifdef GL_STACK_OVERFLOW
931 case GL_STACK_OVERFLOW: anErrId = "GL_STACK_OVERFLOW"; break;
932 case GL_STACK_UNDERFLOW: anErrId = "GL_STACK_UNDERFLOW"; break;
934 case GL_OUT_OF_MEMORY: anErrId = "GL_OUT_OF_MEMORY"; break;
935 case GL_INVALID_FRAMEBUFFER_OPERATION:
936 anErrId = "GL_INVALID_FRAMEBUFFER_OPERATION";
939 anErrId = TCollection_ExtendedString("#") + anErr;
943 const TCollection_ExtendedString aMsg = TCollection_ExtendedString ("Unhandled GL error: ") + anErrId;
944 PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_OTHER, 0, GL_DEBUG_SEVERITY_LOW, aMsg);
949 // =======================================================================
950 // function : ReadGlVersion
952 // =======================================================================
953 void OpenGl_Context::ReadGlVersion (Standard_Integer& theGlVerMajor,
954 Standard_Integer& theGlVerMinor)
960 #ifdef GL_MAJOR_VERSION
961 // available since OpenGL 3.0 and OpenGL 3.0 ES
962 GLint aMajor = 0, aMinor = 0;
963 glGetIntegerv (GL_MAJOR_VERSION, &aMajor);
964 glGetIntegerv (GL_MINOR_VERSION, &aMinor);
965 // glGetError() sometimes does not report an error here even if
966 // GL does not know GL_MAJOR_VERSION and GL_MINOR_VERSION constants.
967 // This happens on some renderers like e.g. Cygwin MESA.
968 // Thus checking additionally if GL has put anything to
969 // the output variables.
970 if (::glGetError() == GL_NO_ERROR && aMajor != 0 && aMinor != 0)
972 theGlVerMajor = aMajor;
973 theGlVerMinor = aMinor;
976 for (GLenum anErr = ::glGetError(), aPrevErr = GL_NO_ERROR;; aPrevErr = anErr, anErr = ::glGetError())
978 if (anErr == GL_NO_ERROR
979 || anErr == aPrevErr)
986 // Read version string.
987 // Notice that only first two numbers split by point '2.1 XXXXX' are significant.
988 // Following trash (after space) is vendor-specific.
989 // New drivers also returns micro version of GL like '3.3.0' which has no meaning
990 // and should be considered as vendor-specific too.
991 const char* aVerStr = (const char* )glGetString (GL_VERSION);
992 if (aVerStr == NULL || *aVerStr == '\0')
994 // invalid GL context
998 //#if defined(GL_ES_VERSION_2_0)
999 // skip "OpenGL ES-** " section
1000 for (; *aVerStr != '\0'; ++aVerStr)
1002 if (*aVerStr >= '0' && *aVerStr <= '9')
1009 // parse string for major number
1012 size_t aMajIter = 0;
1013 while (aVerStr[aMajIter] >= '0' && aVerStr[aMajIter] <= '9')
1017 if (aMajIter == 0 || aMajIter >= sizeof(aMajorStr))
1021 memcpy (aMajorStr, aVerStr, aMajIter);
1022 aMajorStr[aMajIter] = '\0';
1024 // parse string for minor number
1025 aVerStr += aMajIter + 1;
1026 size_t aMinIter = 0;
1027 while (aVerStr[aMinIter] >= '0' && aVerStr[aMinIter] <= '9')
1031 if (aMinIter == 0 || aMinIter >= sizeof(aMinorStr))
1035 memcpy (aMinorStr, aVerStr, aMinIter);
1036 aMinorStr[aMinIter] = '\0';
1039 theGlVerMajor = atoi (aMajorStr);
1040 theGlVerMinor = atoi (aMinorStr);
1042 if (theGlVerMajor <= 0)
1049 static Standard_CString THE_DBGMSG_UNKNOWN = "UNKNOWN";
1050 static Standard_CString THE_DBGMSG_SOURCES[] =
1052 ".OpenGL", // GL_DEBUG_SOURCE_API
1053 ".WinSystem", // GL_DEBUG_SOURCE_WINDOW_SYSTEM
1054 ".GLSL", // GL_DEBUG_SOURCE_SHADER_COMPILER
1055 ".3rdParty", // GL_DEBUG_SOURCE_THIRD_PARTY
1056 "", // GL_DEBUG_SOURCE_APPLICATION
1057 ".Other" // GL_DEBUG_SOURCE_OTHER
1060 static Standard_CString THE_DBGMSG_TYPES[] =
1062 "Error", // GL_DEBUG_TYPE_ERROR
1063 "Deprecated", // GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR
1064 "Undef. behavior", // GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR
1065 "Portability", // GL_DEBUG_TYPE_PORTABILITY
1066 "Performance", // GL_DEBUG_TYPE_PERFORMANCE
1067 "Other" // GL_DEBUG_TYPE_OTHER
1070 static Standard_CString THE_DBGMSG_SEV_HIGH = "High"; // GL_DEBUG_SEVERITY_HIGH
1071 static Standard_CString THE_DBGMSG_SEV_MEDIUM = "Medium"; // GL_DEBUG_SEVERITY_MEDIUM
1072 static Standard_CString THE_DBGMSG_SEV_LOW = "Low"; // GL_DEBUG_SEVERITY_LOW
1074 //! Callback for GL_ARB_debug_output extension
1075 static void APIENTRY debugCallbackWrap(unsigned int theSource,
1076 unsigned int theType,
1078 unsigned int theSeverity,
1080 const char* theMessage,
1081 const void* theUserParam)
1083 OpenGl_Context* aCtx = (OpenGl_Context* )theUserParam;
1084 aCtx->PushMessage (theSource, theType, theId, theSeverity, theMessage);
1087 // =======================================================================
1088 // function : PushMessage
1090 // =======================================================================
1091 void OpenGl_Context::PushMessage (const unsigned int theSource,
1092 const unsigned int theType,
1093 const unsigned int theId,
1094 const unsigned int theSeverity,
1095 const TCollection_ExtendedString& theMessage)
1097 if (caps->suppressExtraMsg
1098 && theSource >= GL_DEBUG_SOURCE_API
1099 && theSource <= GL_DEBUG_SOURCE_OTHER
1100 && myFilters[theSource - GL_DEBUG_SOURCE_API].Contains (theId))
1105 Standard_CString& aSrc = (theSource >= GL_DEBUG_SOURCE_API
1106 && theSource <= GL_DEBUG_SOURCE_OTHER)
1107 ? THE_DBGMSG_SOURCES[theSource - GL_DEBUG_SOURCE_API]
1108 : THE_DBGMSG_UNKNOWN;
1109 Standard_CString& aType = (theType >= GL_DEBUG_TYPE_ERROR
1110 && theType <= GL_DEBUG_TYPE_OTHER)
1111 ? THE_DBGMSG_TYPES[theType - GL_DEBUG_TYPE_ERROR]
1112 : THE_DBGMSG_UNKNOWN;
1113 Standard_CString& aSev = theSeverity == GL_DEBUG_SEVERITY_HIGH
1114 ? THE_DBGMSG_SEV_HIGH
1115 : (theSeverity == GL_DEBUG_SEVERITY_MEDIUM
1116 ? THE_DBGMSG_SEV_MEDIUM
1117 : THE_DBGMSG_SEV_LOW);
1118 Message_Gravity aGrav = theSeverity == GL_DEBUG_SEVERITY_HIGH
1120 : (theSeverity == GL_DEBUG_SEVERITY_MEDIUM
1124 TCollection_ExtendedString aMsg;
1125 aMsg += "TKOpenGl"; aMsg += aSrc;
1126 aMsg += " | Type: "; aMsg += aType;
1127 aMsg += " | ID: "; aMsg += (Standard_Integer )theId;
1128 aMsg += " | Severity: "; aMsg += aSev;
1129 aMsg += " | Message:\n ";
1131 Messenger()->Send (aMsg, aGrav);
1134 // =======================================================================
1135 // function : ExcludeMessage
1137 // ======================================================================
1138 Standard_Boolean OpenGl_Context::ExcludeMessage (const unsigned int theSource,
1139 const unsigned int theId)
1141 return theSource >= GL_DEBUG_SOURCE_API
1142 && theSource <= GL_DEBUG_SOURCE_OTHER
1143 && myFilters[theSource - GL_DEBUG_SOURCE_API].Add (theId);
1146 // =======================================================================
1147 // function : IncludeMessage
1149 // ======================================================================
1150 Standard_Boolean OpenGl_Context::IncludeMessage (const unsigned int theSource,
1151 const unsigned int theId)
1153 return theSource >= GL_DEBUG_SOURCE_API
1154 && theSource <= GL_DEBUG_SOURCE_OTHER
1155 && myFilters[theSource - GL_DEBUG_SOURCE_API].Remove (theId);
1158 // =======================================================================
1159 // function : checkWrongVersion
1161 // ======================================================================
1162 void OpenGl_Context::checkWrongVersion (const Standard_Integer theGlVerMajor,
1163 const Standard_Integer theGlVerMinor)
1165 if (!IsGlGreaterEqual (theGlVerMajor, theGlVerMinor))
1170 TCollection_ExtendedString aMsg = TCollection_ExtendedString()
1171 + "Error! OpenGL context reports version "
1172 + myGlVerMajor + "." + myGlVerMinor
1173 + " but does not export required functions for "
1174 + theGlVerMajor + "." + theGlVerMinor;
1175 PushMessage (GL_DEBUG_SOURCE_APPLICATION,
1176 GL_DEBUG_TYPE_ERROR,
1178 GL_DEBUG_SEVERITY_HIGH,
1182 // =======================================================================
1185 // =======================================================================
1186 void OpenGl_Context::init (const Standard_Boolean theIsCoreProfile)
1191 myMaxMsaaSamples = 0;
1192 myMaxDrawBuffers = 1;
1193 myMaxColorAttachments = 1;
1194 ReadGlVersion (myGlVerMajor, myGlVerMinor);
1195 myVendor = (const char* )::glGetString (GL_VENDOR);
1196 myVendor.LowerCase();
1197 if (!caps->ffpEnable
1198 && !IsGlGreaterEqual (2, 0))
1200 caps->ffpEnable = true;
1201 TCollection_ExtendedString aMsg =
1202 TCollection_ExtendedString("OpenGL driver is too old! Context info:\n")
1203 + " Vendor: " + (const char* )::glGetString (GL_VENDOR) + "\n"
1204 + " Renderer: " + (const char* )::glGetString (GL_RENDERER) + "\n"
1205 + " Version: " + (const char* )::glGetString (GL_VERSION) + "\n"
1206 + " Fallback using deprecated fixed-function pipeline.\n"
1207 + " Visualization might work incorrectly.\n"
1208 " Consider upgrading the graphics driver.";
1209 PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_HIGH, aMsg);
1212 #if defined(GL_ES_VERSION_2_0)
1213 (void )theIsCoreProfile;
1214 const bool isCoreProfile = false;
1217 if (myVendor.Search ("nvidia") != -1)
1219 // Buffer detailed info: Buffer object 1 (bound to GL_ARRAY_BUFFER_ARB, usage hint is GL_STATIC_DRAW)
1220 // will use VIDEO memory as the source for buffer object operations.
1221 ExcludeMessage (GL_DEBUG_SOURCE_API, 131185);
1223 if (IsGlGreaterEqual (3, 0))
1225 // retrieve auxiliary function in advance
1226 FindProc ("glGetStringi", myFuncs->glGetStringi);
1229 bool isCoreProfile = false;
1230 if (IsGlGreaterEqual (3, 2))
1232 isCoreProfile = (theIsCoreProfile == Standard_True);
1234 // detect Core profile
1238 ::glGetIntegerv (GL_CONTEXT_PROFILE_MASK, &aProfile);
1239 isCoreProfile = (aProfile & GL_CONTEXT_CORE_PROFILE_BIT) != 0;
1247 core11 = (OpenGl_GlCore11* )(&(*myFuncs));
1249 core11fwd = (OpenGl_GlCore11Fwd* )(&(*myFuncs));
1267 arbTboRGB32 = Standard_False;
1275 //! Make record shorter to retrieve function pointer using variable with same name
1276 #define FindProcShort(theFunc) FindProc(#theFunc, myFuncs->theFunc)
1278 #if defined(GL_ES_VERSION_2_0)
1280 hasTexRGBA8 = IsGlGreaterEqual (3, 0)
1281 || CheckExtension ("GL_OES_rgb8_rgba8");
1282 // NPOT textures has limited support within OpenGL ES 2.0
1283 // which are relaxed by OpenGL ES 3.0 or some extensions
1284 //arbNPTW = IsGlGreaterEqual (3, 0)
1285 // || CheckExtension ("GL_OES_texture_npot")
1286 // || CheckExtension ("GL_NV_texture_npot_2D_mipmap");
1287 arbNPTW = Standard_True;
1288 arbTexRG = IsGlGreaterEqual (3, 0)
1289 || CheckExtension ("GL_EXT_texture_rg");
1290 extBgra = CheckExtension ("GL_EXT_texture_format_BGRA8888");
1291 extAnis = CheckExtension ("GL_EXT_texture_filter_anisotropic");
1292 extPDS = IsGlGreaterEqual (3, 0)
1293 || CheckExtension ("GL_OES_packed_depth_stencil");
1295 core11fwd = (OpenGl_GlCore11Fwd* )(&(*myFuncs));
1296 if (IsGlGreaterEqual (2, 0))
1298 // enable compatible functions
1299 core20 = (OpenGl_GlCore20* )(&(*myFuncs));
1300 core20fwd = (OpenGl_GlCore20Fwd* )(&(*myFuncs));
1301 core15fwd = (OpenGl_GlCore15Fwd* )(&(*myFuncs));
1302 arbFBO = (OpenGl_ArbFBO* )(&(*myFuncs));
1304 if (IsGlGreaterEqual (3, 0)
1305 && FindProcShort (glBlitFramebuffer))
1307 arbFBOBlit = (OpenGl_ArbFBOBlit* )(&(*myFuncs));
1309 if (IsGlGreaterEqual (3, 0)
1310 && FindProcShort (glGenSamplers)
1311 && FindProcShort (glDeleteSamplers)
1312 && FindProcShort (glIsSampler)
1313 && FindProcShort (glBindSampler)
1314 && FindProcShort (glSamplerParameteri)
1315 && FindProcShort (glSamplerParameteriv)
1316 && FindProcShort (glSamplerParameterf)
1317 && FindProcShort (glSamplerParameterfv)
1318 && FindProcShort (glGetSamplerParameteriv)
1319 && FindProcShort (glGetSamplerParameterfv))
1320 //&& FindProcShort (glSamplerParameterIiv) // only on Desktop or with extensions GL_OES_texture_border_clamp/GL_EXT_texture_border_clamp
1321 //&& FindProcShort (glSamplerParameterIuiv)
1322 //&& FindProcShort (glGetSamplerParameterIiv)
1323 //&& FindProcShort (glGetSamplerParameterIuiv))
1325 arbSamplerObject = (OpenGl_ArbSamplerObject* )(&(*myFuncs));
1327 extFragDepth = !IsGlGreaterEqual(3, 0)
1328 && CheckExtension ("GL_EXT_frag_depth");
1329 if (IsGlGreaterEqual (3, 1)
1330 && FindProc ("glTexStorage2DMultisample", myFuncs->glTexStorage2DMultisample))
1332 // MSAA RenderBuffers have been defined in OpenGL ES 3.0,
1333 // but MSAA Textures - only in OpenGL ES 3.1+
1334 ::glGetIntegerv (GL_MAX_SAMPLES, &myMaxMsaaSamples);
1337 hasUintIndex = IsGlGreaterEqual (3, 0)
1338 || CheckExtension ("GL_OES_element_index_uint");
1339 hasHighp = CheckExtension ("GL_OES_fragment_precision_high");
1340 GLint aRange[2] = {0, 0};
1342 ::glGetShaderPrecisionFormat (GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, aRange, &aPrec);
1345 hasHighp = Standard_True;
1348 arbTexFloat = IsGlGreaterEqual (3, 0)
1349 && FindProc ("glTexImage3D", myFuncs->glTexImage3D);
1351 const Standard_Boolean hasTexBuffer32 = IsGlGreaterEqual (3, 2) && FindProc ("glTexBuffer", myFuncs->glTexBuffer);
1352 const Standard_Boolean hasExtTexBuffer = CheckExtension ("GL_EXT_texture_buffer") && FindProc ("glTexBufferEXT", myFuncs->glTexBuffer);
1354 if (hasTexBuffer32 || hasExtTexBuffer)
1356 arbTBO = reinterpret_cast<OpenGl_ArbTBO*> (myFuncs.get());
1359 // initialize debug context extension
1360 if (CheckExtension ("GL_KHR_debug"))
1362 // this functionality become a part of OpenGL ES 3.2
1364 // According to GL_KHR_debug spec, all functions should have KHR suffix.
1365 // However, some implementations can export these functions without suffix.
1366 if (FindProc ("glDebugMessageControlKHR", myFuncs->glDebugMessageControl)
1367 && FindProc ("glDebugMessageInsertKHR", myFuncs->glDebugMessageInsert)
1368 && FindProc ("glDebugMessageCallbackKHR", myFuncs->glDebugMessageCallback)
1369 && FindProc ("glGetDebugMessageLogKHR", myFuncs->glGetDebugMessageLog))
1371 arbDbg = (OpenGl_ArbDbg* )(&(*myFuncs));
1375 && caps->contextDebug)
1377 // setup default callback
1378 myIsGlDebugCtx = Standard_True;
1379 arbDbg->glDebugMessageCallback (debugCallbackWrap, this);
1380 ::glEnable (GL_DEBUG_OUTPUT);
1381 if (caps->contextSyncDebug)
1383 // note that some broken implementations (e.g. simulators) might generate error message on this call
1384 ::glEnable (GL_DEBUG_OUTPUT_SYNCHRONOUS);
1389 extDrawBuffers = CheckExtension ("GL_EXT_draw_buffers") && FindProc ("glDrawBuffersEXT", myFuncs->glDrawBuffers);
1390 arbDrawBuffers = CheckExtension ("GL_ARB_draw_buffers") && FindProc ("glDrawBuffersARB", myFuncs->glDrawBuffers);
1392 if (IsGlGreaterEqual (3, 0) && FindProc ("glDrawBuffers", myFuncs->glDrawBuffers))
1394 hasDrawBuffers = OpenGl_FeatureInCore;
1396 else if (extDrawBuffers || arbDrawBuffers)
1398 hasDrawBuffers = OpenGl_FeatureInExtensions;
1401 hasFloatBuffer = IsGlGreaterEqual (3, 2) ? OpenGl_FeatureInCore :
1402 CheckExtension ("GL_EXT_color_buffer_float") ? OpenGl_FeatureInExtensions
1403 : OpenGl_FeatureNotAvailable;
1404 hasHalfFloatBuffer = IsGlGreaterEqual (3, 2) ? OpenGl_FeatureInCore :
1405 CheckExtension ("GL_EXT_color_buffer_half_float") ? OpenGl_FeatureInExtensions
1406 : OpenGl_FeatureNotAvailable;
1408 oesSampleVariables = CheckExtension ("GL_OES_sample_variables");
1409 oesStdDerivatives = CheckExtension ("GL_OES_standard_derivatives");
1410 hasSampleVariables = IsGlGreaterEqual (3, 2) ? OpenGl_FeatureInCore :
1411 oesSampleVariables ? OpenGl_FeatureInExtensions
1412 : OpenGl_FeatureNotAvailable;
1413 // without hasHighp, dFdx/dFdy precision is considered too low for flat shading (visual artifacts)
1414 hasFlatShading = IsGlGreaterEqual (3, 0)
1415 ? OpenGl_FeatureInCore
1416 : (oesStdDerivatives && hasHighp
1417 ? OpenGl_FeatureInExtensions
1418 : OpenGl_FeatureNotAvailable);
1419 if (!IsGlGreaterEqual (3, 1)
1420 && myVendor.Search("qualcomm") != -1)
1422 // dFdx/dFdy are completely broken on tested Adreno devices with versions below OpenGl ES 3.1
1423 hasFlatShading = OpenGl_FeatureNotAvailable;
1427 myTexClamp = IsGlGreaterEqual (1, 2) ? GL_CLAMP_TO_EDGE : GL_CLAMP;
1429 hasTexRGBA8 = Standard_True;
1430 arbDrawBuffers = CheckExtension ("GL_ARB_draw_buffers");
1431 arbNPTW = CheckExtension ("GL_ARB_texture_non_power_of_two");
1432 arbTexFloat = IsGlGreaterEqual (3, 0)
1433 || CheckExtension ("GL_ARB_texture_float");
1434 arbSampleShading = CheckExtension ("GL_ARB_sample_shading");
1435 extBgra = CheckExtension ("GL_EXT_bgra");
1436 extAnis = CheckExtension ("GL_EXT_texture_filter_anisotropic");
1437 extPDS = CheckExtension ("GL_EXT_packed_depth_stencil");
1438 atiMem = CheckExtension ("GL_ATI_meminfo");
1439 nvxMem = CheckExtension ("GL_NVX_gpu_memory_info");
1441 hasDrawBuffers = IsGlGreaterEqual (2, 0) ? OpenGl_FeatureInCore :
1442 arbDrawBuffers ? OpenGl_FeatureInExtensions
1443 : OpenGl_FeatureNotAvailable;
1445 hasFloatBuffer = hasHalfFloatBuffer = IsGlGreaterEqual (3, 0) ? OpenGl_FeatureInCore :
1446 CheckExtension ("GL_ARB_color_buffer_float") ? OpenGl_FeatureInExtensions
1447 : OpenGl_FeatureNotAvailable;
1449 hasSampleVariables = IsGlGreaterEqual (4, 0) ? OpenGl_FeatureInCore :
1450 arbSampleShading ? OpenGl_FeatureInExtensions
1451 : OpenGl_FeatureNotAvailable;
1453 GLint aStereo = GL_FALSE;
1454 glGetIntegerv (GL_STEREO, &aStereo);
1455 myIsStereoBuffers = aStereo == 1;
1457 // get number of maximum clipping planes
1458 glGetIntegerv (GL_MAX_CLIP_PLANES, &myMaxClipPlanes);
1463 glGetIntegerv (GL_MAX_DRAW_BUFFERS, &myMaxDrawBuffers);
1464 glGetIntegerv (GL_MAX_COLOR_ATTACHMENTS, &myMaxColorAttachments);
1465 if (myDrawBuffers.Length() < myMaxDrawBuffers)
1467 myDrawBuffers.Resize (0, myMaxDrawBuffers - 1, false);
1471 glGetIntegerv (GL_MAX_TEXTURE_SIZE, &myMaxTexDim);
1472 if (IsGlGreaterEqual (1, 5))
1474 glGetIntegerv (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &myMaxTexCombined);
1477 GLint aMaxVPortSize[2] = {0, 0};
1478 glGetIntegerv (GL_MAX_VIEWPORT_DIMS, aMaxVPortSize);
1479 myMaxDumpSizeX = Min (aMaxVPortSize[0], myMaxTexDim);
1480 myMaxDumpSizeY = Min (aMaxVPortSize[1], myMaxTexDim);
1481 if (myVendor == "intel")
1483 // Intel drivers have known bug with empty dump for images with width>=5462
1484 myMaxDumpSizeX = Min (myMaxDumpSizeX, 4096);
1489 glGetIntegerv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &myAnisoMax);
1492 myClippingState.Init();
1494 #if !defined(GL_ES_VERSION_2_0)
1512 // retrieve platform-dependent extensions
1513 #if defined(HAVE_EGL)
1515 #elif defined(_WIN32)
1516 if (FindProcShort (wglGetExtensionsStringARB))
1518 const char* aWglExts = myFuncs->wglGetExtensionsStringARB (wglGetCurrentDC());
1519 if (CheckExtension (aWglExts, "WGL_EXT_swap_control"))
1521 FindProcShort (wglSwapIntervalEXT);
1523 if (CheckExtension (aWglExts, "WGL_ARB_pixel_format"))
1525 FindProcShort (wglChoosePixelFormatARB);
1527 if (CheckExtension (aWglExts, "WGL_ARB_create_context_profile"))
1529 FindProcShort (wglCreateContextAttribsARB);
1531 if (CheckExtension (aWglExts, "WGL_NV_DX_interop"))
1533 FindProcShort (wglDXSetResourceShareHandleNV);
1534 FindProcShort (wglDXOpenDeviceNV);
1535 FindProcShort (wglDXCloseDeviceNV);
1536 FindProcShort (wglDXRegisterObjectNV);
1537 FindProcShort (wglDXUnregisterObjectNV);
1538 FindProcShort (wglDXObjectAccessNV);
1539 FindProcShort (wglDXLockObjectsNV);
1540 FindProcShort (wglDXUnlockObjectsNV);
1542 if (CheckExtension (aWglExts, "WGL_AMD_gpu_association"))
1544 FindProcShort (wglGetGPUIDsAMD);
1545 FindProcShort (wglGetGPUInfoAMD);
1546 FindProcShort (wglGetContextGPUIDAMD);
1549 #elif defined(__APPLE__)
1552 const char* aGlxExts = ::glXQueryExtensionsString ((Display* )myDisplay, DefaultScreen ((Display* )myDisplay));
1553 if (CheckExtension (aGlxExts, "GLX_EXT_swap_control"))
1555 FindProcShort (glXSwapIntervalEXT);
1557 if (CheckExtension (aGlxExts, "GLX_SGI_swap_control"))
1559 FindProcShort (glXSwapIntervalSGI);
1561 if (CheckExtension (aGlxExts, "GLX_MESA_query_renderer"))
1563 FindProcShort (glXQueryRendererIntegerMESA);
1564 FindProcShort (glXQueryCurrentRendererIntegerMESA);
1565 FindProcShort (glXQueryRendererStringMESA);
1566 FindProcShort (glXQueryCurrentRendererStringMESA);
1568 //extSwapTear = CheckExtension (aGlxExts, "GLX_EXT_swap_control_tear");
1571 // load OpenGL 1.2 new functions
1572 has12 = IsGlGreaterEqual (1, 2)
1573 && FindProcShort (glBlendColor)
1574 && FindProcShort (glBlendEquation)
1575 && FindProcShort (glDrawRangeElements)
1576 && FindProcShort (glTexImage3D)
1577 && FindProcShort (glTexSubImage3D)
1578 && FindProcShort (glCopyTexSubImage3D);
1580 // load OpenGL 1.3 new functions
1581 has13 = IsGlGreaterEqual (1, 3)
1582 && FindProcShort (glActiveTexture)
1583 && FindProcShort (glSampleCoverage)
1584 && FindProcShort (glCompressedTexImage3D)
1585 && FindProcShort (glCompressedTexImage2D)
1586 && FindProcShort (glCompressedTexImage1D)
1587 && FindProcShort (glCompressedTexSubImage3D)
1588 && FindProcShort (glCompressedTexSubImage2D)
1589 && FindProcShort (glCompressedTexSubImage1D)
1590 && FindProcShort (glGetCompressedTexImage);
1595 && FindProcShort (glClientActiveTexture)
1596 && FindProcShort (glMultiTexCoord1d)
1597 && FindProcShort (glMultiTexCoord1dv)
1598 && FindProcShort (glMultiTexCoord1f)
1599 && FindProcShort (glMultiTexCoord1fv)
1600 && FindProcShort (glMultiTexCoord1i)
1601 && FindProcShort (glMultiTexCoord1iv)
1602 && FindProcShort (glMultiTexCoord1s)
1603 && FindProcShort (glMultiTexCoord1sv)
1604 && FindProcShort (glMultiTexCoord2d)
1605 && FindProcShort (glMultiTexCoord2dv)
1606 && FindProcShort (glMultiTexCoord2f)
1607 && FindProcShort (glMultiTexCoord2fv)
1608 && FindProcShort (glMultiTexCoord2i)
1609 && FindProcShort (glMultiTexCoord2iv)
1610 && FindProcShort (glMultiTexCoord2s)
1611 && FindProcShort (glMultiTexCoord2sv)
1612 && FindProcShort (glMultiTexCoord3d)
1613 && FindProcShort (glMultiTexCoord3dv)
1614 && FindProcShort (glMultiTexCoord3f)
1615 && FindProcShort (glMultiTexCoord3fv)
1616 && FindProcShort (glMultiTexCoord3i)
1617 && FindProcShort (glMultiTexCoord3iv)
1618 && FindProcShort (glMultiTexCoord3s)
1619 && FindProcShort (glMultiTexCoord3sv)
1620 && FindProcShort (glMultiTexCoord4d)
1621 && FindProcShort (glMultiTexCoord4dv)
1622 && FindProcShort (glMultiTexCoord4f)
1623 && FindProcShort (glMultiTexCoord4fv)
1624 && FindProcShort (glMultiTexCoord4i)
1625 && FindProcShort (glMultiTexCoord4iv)
1626 && FindProcShort (glMultiTexCoord4s)
1627 && FindProcShort (glMultiTexCoord4sv)
1628 && FindProcShort (glLoadTransposeMatrixf)
1629 && FindProcShort (glLoadTransposeMatrixd)
1630 && FindProcShort (glMultTransposeMatrixf)
1631 && FindProcShort (glMultTransposeMatrixd);
1634 // load OpenGL 1.4 new functions
1635 has14 = IsGlGreaterEqual (1, 4)
1636 && FindProcShort (glBlendFuncSeparate)
1637 && FindProcShort (glMultiDrawArrays)
1638 && FindProcShort (glMultiDrawElements)
1639 && FindProcShort (glPointParameterf)
1640 && FindProcShort (glPointParameterfv)
1641 && FindProcShort (glPointParameteri)
1642 && FindProcShort (glPointParameteriv);
1644 // load OpenGL 1.5 new functions
1645 has15 = IsGlGreaterEqual (1, 5)
1646 && FindProcShort (glGenQueries)
1647 && FindProcShort (glDeleteQueries)
1648 && FindProcShort (glIsQuery)
1649 && FindProcShort (glBeginQuery)
1650 && FindProcShort (glEndQuery)
1651 && FindProcShort (glGetQueryiv)
1652 && FindProcShort (glGetQueryObjectiv)
1653 && FindProcShort (glGetQueryObjectuiv)
1654 && FindProcShort (glBindBuffer)
1655 && FindProcShort (glDeleteBuffers)
1656 && FindProcShort (glGenBuffers)
1657 && FindProcShort (glIsBuffer)
1658 && FindProcShort (glBufferData)
1659 && FindProcShort (glBufferSubData)
1660 && FindProcShort (glGetBufferSubData)
1661 && FindProcShort (glMapBuffer)
1662 && FindProcShort (glUnmapBuffer)
1663 && FindProcShort (glGetBufferParameteriv)
1664 && FindProcShort (glGetBufferPointerv);
1666 // load OpenGL 2.0 new functions
1667 has20 = IsGlGreaterEqual (2, 0)
1668 && FindProcShort (glBlendEquationSeparate)
1669 && FindProcShort (glDrawBuffers)
1670 && FindProcShort (glStencilOpSeparate)
1671 && FindProcShort (glStencilFuncSeparate)
1672 && FindProcShort (glStencilMaskSeparate)
1673 && FindProcShort (glAttachShader)
1674 && FindProcShort (glBindAttribLocation)
1675 && FindProcShort (glCompileShader)
1676 && FindProcShort (glCreateProgram)
1677 && FindProcShort (glCreateShader)
1678 && FindProcShort (glDeleteProgram)
1679 && FindProcShort (glDeleteShader)
1680 && FindProcShort (glDetachShader)
1681 && FindProcShort (glDisableVertexAttribArray)
1682 && FindProcShort (glEnableVertexAttribArray)
1683 && FindProcShort (glGetActiveAttrib)
1684 && FindProcShort (glGetActiveUniform)
1685 && FindProcShort (glGetAttachedShaders)
1686 && FindProcShort (glGetAttribLocation)
1687 && FindProcShort (glGetProgramiv)
1688 && FindProcShort (glGetProgramInfoLog)
1689 && FindProcShort (glGetShaderiv)
1690 && FindProcShort (glGetShaderInfoLog)
1691 && FindProcShort (glGetShaderSource)
1692 && FindProcShort (glGetUniformLocation)
1693 && FindProcShort (glGetUniformfv)
1694 && FindProcShort (glGetUniformiv)
1695 && FindProcShort (glGetVertexAttribdv)
1696 && FindProcShort (glGetVertexAttribfv)
1697 && FindProcShort (glGetVertexAttribiv)
1698 && FindProcShort (glGetVertexAttribPointerv)
1699 && FindProcShort (glIsProgram)
1700 && FindProcShort (glIsShader)
1701 && FindProcShort (glLinkProgram)
1702 && FindProcShort (glShaderSource)
1703 && FindProcShort (glUseProgram)
1704 && FindProcShort (glUniform1f)
1705 && FindProcShort (glUniform2f)
1706 && FindProcShort (glUniform3f)
1707 && FindProcShort (glUniform4f)
1708 && FindProcShort (glUniform1i)
1709 && FindProcShort (glUniform2i)
1710 && FindProcShort (glUniform3i)
1711 && FindProcShort (glUniform4i)
1712 && FindProcShort (glUniform1fv)
1713 && FindProcShort (glUniform2fv)
1714 && FindProcShort (glUniform3fv)
1715 && FindProcShort (glUniform4fv)
1716 && FindProcShort (glUniform1iv)
1717 && FindProcShort (glUniform2iv)
1718 && FindProcShort (glUniform3iv)
1719 && FindProcShort (glUniform4iv)
1720 && FindProcShort (glUniformMatrix2fv)
1721 && FindProcShort (glUniformMatrix3fv)
1722 && FindProcShort (glUniformMatrix4fv)
1723 && FindProcShort (glValidateProgram)
1724 && FindProcShort (glVertexAttrib1d)
1725 && FindProcShort (glVertexAttrib1dv)
1726 && FindProcShort (glVertexAttrib1f)
1727 && FindProcShort (glVertexAttrib1fv)
1728 && FindProcShort (glVertexAttrib1s)
1729 && FindProcShort (glVertexAttrib1sv)
1730 && FindProcShort (glVertexAttrib2d)
1731 && FindProcShort (glVertexAttrib2dv)
1732 && FindProcShort (glVertexAttrib2f)
1733 && FindProcShort (glVertexAttrib2fv)
1734 && FindProcShort (glVertexAttrib2s)
1735 && FindProcShort (glVertexAttrib2sv)
1736 && FindProcShort (glVertexAttrib3d)
1737 && FindProcShort (glVertexAttrib3dv)
1738 && FindProcShort (glVertexAttrib3f)
1739 && FindProcShort (glVertexAttrib3fv)
1740 && FindProcShort (glVertexAttrib3s)
1741 && FindProcShort (glVertexAttrib3sv)
1742 && FindProcShort (glVertexAttrib4Nbv)
1743 && FindProcShort (glVertexAttrib4Niv)
1744 && FindProcShort (glVertexAttrib4Nsv)
1745 && FindProcShort (glVertexAttrib4Nub)
1746 && FindProcShort (glVertexAttrib4Nubv)
1747 && FindProcShort (glVertexAttrib4Nuiv)
1748 && FindProcShort (glVertexAttrib4Nusv)
1749 && FindProcShort (glVertexAttrib4bv)
1750 && FindProcShort (glVertexAttrib4d)
1751 && FindProcShort (glVertexAttrib4dv)
1752 && FindProcShort (glVertexAttrib4f)
1753 && FindProcShort (glVertexAttrib4fv)
1754 && FindProcShort (glVertexAttrib4iv)
1755 && FindProcShort (glVertexAttrib4s)
1756 && FindProcShort (glVertexAttrib4sv)
1757 && FindProcShort (glVertexAttrib4ubv)
1758 && FindProcShort (glVertexAttrib4uiv)
1759 && FindProcShort (glVertexAttrib4usv)
1760 && FindProcShort (glVertexAttribPointer);
1762 // load OpenGL 2.1 new functions
1763 has21 = IsGlGreaterEqual (2, 1)
1764 && FindProcShort (glUniformMatrix2x3fv)
1765 && FindProcShort (glUniformMatrix3x2fv)
1766 && FindProcShort (glUniformMatrix2x4fv)
1767 && FindProcShort (glUniformMatrix4x2fv)
1768 && FindProcShort (glUniformMatrix3x4fv)
1769 && FindProcShort (glUniformMatrix4x3fv);
1771 // load GL_ARB_framebuffer_object (added to OpenGL 3.0 core)
1772 const bool hasFBO = (IsGlGreaterEqual (3, 0) || CheckExtension ("GL_ARB_framebuffer_object"))
1773 && FindProcShort (glIsRenderbuffer)
1774 && FindProcShort (glBindRenderbuffer)
1775 && FindProcShort (glDeleteRenderbuffers)
1776 && FindProcShort (glGenRenderbuffers)
1777 && FindProcShort (glRenderbufferStorage)
1778 && FindProcShort (glGetRenderbufferParameteriv)
1779 && FindProcShort (glIsFramebuffer)
1780 && FindProcShort (glBindFramebuffer)
1781 && FindProcShort (glDeleteFramebuffers)
1782 && FindProcShort (glGenFramebuffers)
1783 && FindProcShort (glCheckFramebufferStatus)
1784 && FindProcShort (glFramebufferTexture1D)
1785 && FindProcShort (glFramebufferTexture2D)
1786 && FindProcShort (glFramebufferTexture3D)
1787 && FindProcShort (glFramebufferRenderbuffer)
1788 && FindProcShort (glGetFramebufferAttachmentParameteriv)
1789 && FindProcShort (glGenerateMipmap)
1790 && FindProcShort (glBlitFramebuffer)
1791 && FindProcShort (glRenderbufferStorageMultisample)
1792 && FindProcShort (glFramebufferTextureLayer);
1794 // load GL_ARB_vertex_array_object (added to OpenGL 3.0 core)
1795 const bool hasVAO = (IsGlGreaterEqual (3, 0) || CheckExtension ("GL_ARB_vertex_array_object"))
1796 && FindProcShort (glBindVertexArray)
1797 && FindProcShort (glDeleteVertexArrays)
1798 && FindProcShort (glGenVertexArrays)
1799 && FindProcShort (glIsVertexArray);
1801 // load GL_ARB_map_buffer_range (added to OpenGL 3.0 core)
1802 const bool hasMapBufferRange = (IsGlGreaterEqual (3, 0) || CheckExtension ("GL_ARB_map_buffer_range"))
1803 && FindProcShort (glMapBufferRange)
1804 && FindProcShort (glFlushMappedBufferRange);
1806 // load OpenGL 3.0 new functions
1807 has30 = IsGlGreaterEqual (3, 0)
1810 && hasMapBufferRange
1811 && FindProcShort (glColorMaski)
1812 && FindProcShort (glGetBooleani_v)
1813 && FindProcShort (glGetIntegeri_v)
1814 && FindProcShort (glEnablei)
1815 && FindProcShort (glDisablei)
1816 && FindProcShort (glIsEnabledi)
1817 && FindProcShort (glBeginTransformFeedback)
1818 && FindProcShort (glEndTransformFeedback)
1819 && FindProcShort (glBindBufferRange)
1820 && FindProcShort (glBindBufferBase)
1821 && FindProcShort (glTransformFeedbackVaryings)
1822 && FindProcShort (glGetTransformFeedbackVarying)
1823 && FindProcShort (glClampColor)
1824 && FindProcShort (glBeginConditionalRender)
1825 && FindProcShort (glEndConditionalRender)
1826 && FindProcShort (glVertexAttribIPointer)
1827 && FindProcShort (glGetVertexAttribIiv)
1828 && FindProcShort (glGetVertexAttribIuiv)
1829 && FindProcShort (glVertexAttribI1i)
1830 && FindProcShort (glVertexAttribI2i)
1831 && FindProcShort (glVertexAttribI3i)
1832 && FindProcShort (glVertexAttribI4i)
1833 && FindProcShort (glVertexAttribI1ui)
1834 && FindProcShort (glVertexAttribI2ui)
1835 && FindProcShort (glVertexAttribI3ui)
1836 && FindProcShort (glVertexAttribI4ui)
1837 && FindProcShort (glVertexAttribI1iv)
1838 && FindProcShort (glVertexAttribI2iv)
1839 && FindProcShort (glVertexAttribI3iv)
1840 && FindProcShort (glVertexAttribI4iv)
1841 && FindProcShort (glVertexAttribI1uiv)
1842 && FindProcShort (glVertexAttribI2uiv)
1843 && FindProcShort (glVertexAttribI3uiv)
1844 && FindProcShort (glVertexAttribI4uiv)
1845 && FindProcShort (glVertexAttribI4bv)
1846 && FindProcShort (glVertexAttribI4sv)
1847 && FindProcShort (glVertexAttribI4ubv)
1848 && FindProcShort (glVertexAttribI4usv)
1849 && FindProcShort (glGetUniformuiv)
1850 && FindProcShort (glBindFragDataLocation)
1851 && FindProcShort (glGetFragDataLocation)
1852 && FindProcShort (glUniform1ui)
1853 && FindProcShort (glUniform2ui)
1854 && FindProcShort (glUniform3ui)
1855 && FindProcShort (glUniform4ui)
1856 && FindProcShort (glUniform1uiv)
1857 && FindProcShort (glUniform2uiv)
1858 && FindProcShort (glUniform3uiv)
1859 && FindProcShort (glUniform4uiv)
1860 && FindProcShort (glTexParameterIiv)
1861 && FindProcShort (glTexParameterIuiv)
1862 && FindProcShort (glGetTexParameterIiv)
1863 && FindProcShort (glGetTexParameterIuiv)
1864 && FindProcShort (glClearBufferiv)
1865 && FindProcShort (glClearBufferuiv)
1866 && FindProcShort (glClearBufferfv)
1867 && FindProcShort (glClearBufferfi)
1868 && FindProcShort (glGetStringi);
1870 // load GL_ARB_uniform_buffer_object (added to OpenGL 3.1 core)
1871 const bool hasUBO = (IsGlGreaterEqual (3, 1) || CheckExtension ("GL_ARB_uniform_buffer_object"))
1872 && FindProcShort (glGetUniformIndices)
1873 && FindProcShort (glGetActiveUniformsiv)
1874 && FindProcShort (glGetActiveUniformName)
1875 && FindProcShort (glGetUniformBlockIndex)
1876 && FindProcShort (glGetActiveUniformBlockiv)
1877 && FindProcShort (glGetActiveUniformBlockName)
1878 && FindProcShort (glUniformBlockBinding);
1880 // load GL_ARB_copy_buffer (added to OpenGL 3.1 core)
1881 const bool hasCopyBufSubData = (IsGlGreaterEqual (3, 1) || CheckExtension ("GL_ARB_copy_buffer"))
1882 && FindProcShort (glCopyBufferSubData);
1886 // NPOT textures are required by OpenGL 2.0 specifications
1887 // but doesn't hardware accelerated by some ancient OpenGL 2.1 hardware (GeForce FX, RadeOn 9700 etc.)
1888 arbNPTW = Standard_True;
1889 arbTexRG = Standard_True;
1892 // load OpenGL 3.1 new functions
1893 has31 = IsGlGreaterEqual (3, 1)
1895 && hasCopyBufSubData
1896 && FindProcShort (glDrawArraysInstanced)
1897 && FindProcShort (glDrawElementsInstanced)
1898 && FindProcShort (glTexBuffer)
1899 && FindProcShort (glPrimitiveRestartIndex);
1901 // load GL_ARB_draw_elements_base_vertex (added to OpenGL 3.2 core)
1902 const bool hasDrawElemsBaseVert = (IsGlGreaterEqual (3, 2) || CheckExtension ("GL_ARB_draw_elements_base_vertex"))
1903 && FindProcShort (glDrawElementsBaseVertex)
1904 && FindProcShort (glDrawRangeElementsBaseVertex)
1905 && FindProcShort (glDrawElementsInstancedBaseVertex)
1906 && FindProcShort (glMultiDrawElementsBaseVertex);
1908 // load GL_ARB_provoking_vertex (added to OpenGL 3.2 core)
1909 const bool hasProvokingVert = (IsGlGreaterEqual (3, 2) || CheckExtension ("GL_ARB_provoking_vertex"))
1910 && FindProcShort (glProvokingVertex);
1912 // load GL_ARB_sync (added to OpenGL 3.2 core)
1913 const bool hasSync = (IsGlGreaterEqual (3, 2) || CheckExtension ("GL_ARB_sync"))
1914 && FindProcShort (glFenceSync)
1915 && FindProcShort (glIsSync)
1916 && FindProcShort (glDeleteSync)
1917 && FindProcShort (glClientWaitSync)
1918 && FindProcShort (glWaitSync)
1919 && FindProcShort (glGetInteger64v)
1920 && FindProcShort (glGetSynciv);
1922 // load GL_ARB_texture_multisample (added to OpenGL 3.2 core)
1923 const bool hasTextureMultisample = (IsGlGreaterEqual (3, 2) || CheckExtension ("GL_ARB_texture_multisample"))
1924 && FindProcShort (glTexImage2DMultisample)
1925 && FindProcShort (glTexImage3DMultisample)
1926 && FindProcShort (glGetMultisamplefv)
1927 && FindProcShort (glSampleMaski);
1929 // load OpenGL 3.2 new functions
1930 has32 = IsGlGreaterEqual (3, 2)
1931 && hasDrawElemsBaseVert
1934 && hasTextureMultisample
1935 && FindProcShort (glGetInteger64i_v)
1936 && FindProcShort (glGetBufferParameteri64v)
1937 && FindProcShort (glFramebufferTexture);
1939 // load GL_ARB_blend_func_extended (added to OpenGL 3.3 core)
1940 const bool hasBlendFuncExtended = (IsGlGreaterEqual (3, 3) || CheckExtension ("GL_ARB_blend_func_extended"))
1941 && FindProcShort (glBindFragDataLocationIndexed)
1942 && FindProcShort (glGetFragDataIndex);
1944 // load GL_ARB_sampler_objects (added to OpenGL 3.3 core)
1945 const bool hasSamplerObjects = (IsGlGreaterEqual (3, 3) || CheckExtension ("GL_ARB_sampler_objects"))
1946 && FindProcShort (glGenSamplers)
1947 && FindProcShort (glDeleteSamplers)
1948 && FindProcShort (glIsSampler)
1949 && FindProcShort (glBindSampler)
1950 && FindProcShort (glSamplerParameteri)
1951 && FindProcShort (glSamplerParameteriv)
1952 && FindProcShort (glSamplerParameterf)
1953 && FindProcShort (glSamplerParameterfv)
1954 && FindProcShort (glSamplerParameterIiv)
1955 && FindProcShort (glSamplerParameterIuiv)
1956 && FindProcShort (glGetSamplerParameteriv)
1957 && FindProcShort (glGetSamplerParameterIiv)
1958 && FindProcShort (glGetSamplerParameterfv)
1959 && FindProcShort (glGetSamplerParameterIuiv);
1960 if (hasSamplerObjects)
1962 arbSamplerObject = (OpenGl_ArbSamplerObject* )(&(*myFuncs));
1965 // load GL_ARB_timer_query (added to OpenGL 3.3 core)
1966 const bool hasTimerQuery = (IsGlGreaterEqual (3, 3) || CheckExtension ("GL_ARB_timer_query"))
1967 && FindProcShort (glQueryCounter)
1968 && FindProcShort (glGetQueryObjecti64v)
1969 && FindProcShort (glGetQueryObjectui64v);
1971 // load GL_ARB_vertex_type_2_10_10_10_rev (added to OpenGL 3.3 core)
1972 const bool hasVertType21010101rev = (IsGlGreaterEqual (3, 3) || CheckExtension ("GL_ARB_vertex_type_2_10_10_10_rev"))
1973 && FindProcShort (glVertexAttribP1ui)
1974 && FindProcShort (glVertexAttribP1uiv)
1975 && FindProcShort (glVertexAttribP2ui)
1976 && FindProcShort (glVertexAttribP2uiv)
1977 && FindProcShort (glVertexAttribP3ui)
1978 && FindProcShort (glVertexAttribP3uiv)
1979 && FindProcShort (glVertexAttribP4ui)
1980 && FindProcShort (glVertexAttribP4uiv);
1982 if ( hasVertType21010101rev
1985 // load deprecated functions
1986 const bool hasVertType21010101revExt =
1987 FindProcShort (glVertexP2ui)
1988 && FindProcShort (glVertexP2uiv)
1989 && FindProcShort (glVertexP3ui)
1990 && FindProcShort (glVertexP3uiv)
1991 && FindProcShort (glVertexP4ui)
1992 && FindProcShort (glVertexP4uiv)
1993 && FindProcShort (glTexCoordP1ui)
1994 && FindProcShort (glTexCoordP1uiv)
1995 && FindProcShort (glTexCoordP2ui)
1996 && FindProcShort (glTexCoordP2uiv)
1997 && FindProcShort (glTexCoordP3ui)
1998 && FindProcShort (glTexCoordP3uiv)
1999 && FindProcShort (glTexCoordP4ui)
2000 && FindProcShort (glTexCoordP4uiv)
2001 && FindProcShort (glMultiTexCoordP1ui)
2002 && FindProcShort (glMultiTexCoordP1uiv)
2003 && FindProcShort (glMultiTexCoordP2ui)
2004 && FindProcShort (glMultiTexCoordP2uiv)
2005 && FindProcShort (glMultiTexCoordP3ui)
2006 && FindProcShort (glMultiTexCoordP3uiv)
2007 && FindProcShort (glMultiTexCoordP4ui)
2008 && FindProcShort (glMultiTexCoordP4uiv)
2009 && FindProcShort (glNormalP3ui)
2010 && FindProcShort (glNormalP3uiv)
2011 && FindProcShort (glColorP3ui)
2012 && FindProcShort (glColorP3uiv)
2013 && FindProcShort (glColorP4ui)
2014 && FindProcShort (glColorP4uiv)
2015 && FindProcShort (glSecondaryColorP3ui)
2016 && FindProcShort (glSecondaryColorP3uiv);
2017 (void )hasVertType21010101revExt;
2020 // load OpenGL 3.3 extra functions
2021 has33 = IsGlGreaterEqual (3, 3)
2022 && hasBlendFuncExtended
2023 && hasSamplerObjects
2025 && hasVertType21010101rev
2026 && FindProcShort (glVertexAttribDivisor);
2028 // load GL_ARB_draw_indirect (added to OpenGL 4.0 core)
2029 const bool hasDrawIndirect = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_draw_indirect"))
2030 && FindProcShort (glDrawArraysIndirect)
2031 && FindProcShort (glDrawElementsIndirect);
2033 // load GL_ARB_gpu_shader_fp64 (added to OpenGL 4.0 core)
2034 const bool hasShaderFP64 = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_gpu_shader_fp64"))
2035 && FindProcShort (glUniform1d)
2036 && FindProcShort (glUniform2d)
2037 && FindProcShort (glUniform3d)
2038 && FindProcShort (glUniform4d)
2039 && FindProcShort (glUniform1dv)
2040 && FindProcShort (glUniform2dv)
2041 && FindProcShort (glUniform3dv)
2042 && FindProcShort (glUniform4dv)
2043 && FindProcShort (glUniformMatrix2dv)
2044 && FindProcShort (glUniformMatrix3dv)
2045 && FindProcShort (glUniformMatrix4dv)
2046 && FindProcShort (glUniformMatrix2x3dv)
2047 && FindProcShort (glUniformMatrix2x4dv)
2048 && FindProcShort (glUniformMatrix3x2dv)
2049 && FindProcShort (glUniformMatrix3x4dv)
2050 && FindProcShort (glUniformMatrix4x2dv)
2051 && FindProcShort (glUniformMatrix4x3dv)
2052 && FindProcShort (glGetUniformdv);
2054 // load GL_ARB_shader_subroutine (added to OpenGL 4.0 core)
2055 const bool hasShaderSubroutine = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_shader_subroutine"))
2056 && FindProcShort (glGetSubroutineUniformLocation)
2057 && FindProcShort (glGetSubroutineIndex)
2058 && FindProcShort (glGetActiveSubroutineUniformiv)
2059 && FindProcShort (glGetActiveSubroutineUniformName)
2060 && FindProcShort (glGetActiveSubroutineName)
2061 && FindProcShort (glUniformSubroutinesuiv)
2062 && FindProcShort (glGetUniformSubroutineuiv)
2063 && FindProcShort (glGetProgramStageiv);
2065 // load GL_ARB_tessellation_shader (added to OpenGL 4.0 core)
2066 const bool hasTessellationShader = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_tessellation_shader"))
2067 && FindProcShort (glPatchParameteri)
2068 && FindProcShort (glPatchParameterfv);
2070 // load GL_ARB_transform_feedback2 (added to OpenGL 4.0 core)
2071 const bool hasTrsfFeedback2 = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_transform_feedback2"))
2072 && FindProcShort (glBindTransformFeedback)
2073 && FindProcShort (glDeleteTransformFeedbacks)
2074 && FindProcShort (glGenTransformFeedbacks)
2075 && FindProcShort (glIsTransformFeedback)
2076 && FindProcShort (glPauseTransformFeedback)
2077 && FindProcShort (glResumeTransformFeedback)
2078 && FindProcShort (glDrawTransformFeedback);
2080 // load GL_ARB_transform_feedback3 (added to OpenGL 4.0 core)
2081 const bool hasTrsfFeedback3 = (IsGlGreaterEqual (4, 0) || CheckExtension ("GL_ARB_transform_feedback3"))
2082 && FindProcShort (glDrawTransformFeedbackStream)
2083 && FindProcShort (glBeginQueryIndexed)
2084 && FindProcShort (glEndQueryIndexed)
2085 && FindProcShort (glGetQueryIndexediv);
2087 // load OpenGL 4.0 new functions
2088 has40 = IsGlGreaterEqual (4, 0)
2091 && hasShaderSubroutine
2092 && hasTessellationShader
2095 && FindProcShort (glMinSampleShading)
2096 && FindProcShort (glBlendEquationi)
2097 && FindProcShort (glBlendEquationSeparatei)
2098 && FindProcShort (glBlendFunci)
2099 && FindProcShort (glBlendFuncSeparatei);
2101 // load GL_ARB_ES2_compatibility (added to OpenGL 4.1 core)
2102 const bool hasES2Compatibility = (IsGlGreaterEqual (4, 1) || CheckExtension ("GL_ARB_ES2_compatibility"))
2103 && FindProcShort (glReleaseShaderCompiler)
2104 && FindProcShort (glShaderBinary)
2105 && FindProcShort (glGetShaderPrecisionFormat)
2106 && FindProcShort (glDepthRangef)
2107 && FindProcShort (glClearDepthf);
2109 // load GL_ARB_get_program_binary (added to OpenGL 4.1 core)
2110 const bool hasGetProgramBinary = (IsGlGreaterEqual (4, 1) || CheckExtension ("GL_ARB_get_program_binary"))
2111 && FindProcShort (glGetProgramBinary)
2112 && FindProcShort (glProgramBinary)
2113 && FindProcShort (glProgramParameteri);
2116 // load GL_ARB_separate_shader_objects (added to OpenGL 4.1 core)
2117 const bool hasSeparateShaderObjects = (IsGlGreaterEqual (4, 1) || CheckExtension ("GL_ARB_separate_shader_objects"))
2118 && FindProcShort (glUseProgramStages)
2119 && FindProcShort (glActiveShaderProgram)
2120 && FindProcShort (glCreateShaderProgramv)
2121 && FindProcShort (glBindProgramPipeline)
2122 && FindProcShort (glDeleteProgramPipelines)
2123 && FindProcShort (glGenProgramPipelines)
2124 && FindProcShort (glIsProgramPipeline)
2125 && FindProcShort (glGetProgramPipelineiv)
2126 && FindProcShort (glProgramUniform1i)
2127 && FindProcShort (glProgramUniform1iv)
2128 && FindProcShort (glProgramUniform1f)
2129 && FindProcShort (glProgramUniform1fv)
2130 && FindProcShort (glProgramUniform1d)
2131 && FindProcShort (glProgramUniform1dv)
2132 && FindProcShort (glProgramUniform1ui)
2133 && FindProcShort (glProgramUniform1uiv)
2134 && FindProcShort (glProgramUniform2i)
2135 && FindProcShort (glProgramUniform2iv)
2136 && FindProcShort (glProgramUniform2f)
2137 && FindProcShort (glProgramUniform2fv)
2138 && FindProcShort (glProgramUniform2d)
2139 && FindProcShort (glProgramUniform2dv)
2140 && FindProcShort (glProgramUniform2ui)
2141 && FindProcShort (glProgramUniform2uiv)
2142 && FindProcShort (glProgramUniform3i)
2143 && FindProcShort (glProgramUniform3iv)
2144 && FindProcShort (glProgramUniform3f)
2145 && FindProcShort (glProgramUniform3fv)
2146 && FindProcShort (glProgramUniform3d)
2147 && FindProcShort (glProgramUniform3dv)
2148 && FindProcShort (glProgramUniform3ui)
2149 && FindProcShort (glProgramUniform3uiv)
2150 && FindProcShort (glProgramUniform4i)
2151 && FindProcShort (glProgramUniform4iv)
2152 && FindProcShort (glProgramUniform4f)
2153 && FindProcShort (glProgramUniform4fv)
2154 && FindProcShort (glProgramUniform4d)
2155 && FindProcShort (glProgramUniform4dv)
2156 && FindProcShort (glProgramUniform4ui)
2157 && FindProcShort (glProgramUniform4uiv)
2158 && FindProcShort (glProgramUniformMatrix2fv)
2159 && FindProcShort (glProgramUniformMatrix3fv)
2160 && FindProcShort (glProgramUniformMatrix4fv)
2161 && FindProcShort (glProgramUniformMatrix2dv)
2162 && FindProcShort (glProgramUniformMatrix3dv)
2163 && FindProcShort (glProgramUniformMatrix4dv)
2164 && FindProcShort (glProgramUniformMatrix2x3fv)
2165 && FindProcShort (glProgramUniformMatrix3x2fv)
2166 && FindProcShort (glProgramUniformMatrix2x4fv)
2167 && FindProcShort (glProgramUniformMatrix4x2fv)
2168 && FindProcShort (glProgramUniformMatrix3x4fv)
2169 && FindProcShort (glProgramUniformMatrix4x3fv)
2170 && FindProcShort (glProgramUniformMatrix2x3dv)
2171 && FindProcShort (glProgramUniformMatrix3x2dv)
2172 && FindProcShort (glProgramUniformMatrix2x4dv)
2173 && FindProcShort (glProgramUniformMatrix4x2dv)
2174 && FindProcShort (glProgramUniformMatrix3x4dv)
2175 && FindProcShort (glProgramUniformMatrix4x3dv)
2176 && FindProcShort (glValidateProgramPipeline)
2177 && FindProcShort (glGetProgramPipelineInfoLog);
2179 // load GL_ARB_vertex_attrib_64bit (added to OpenGL 4.1 core)
2180 const bool hasVertAttrib64bit = (IsGlGreaterEqual (4, 1) || CheckExtension ("GL_ARB_vertex_attrib_64bit"))
2181 && FindProcShort (glVertexAttribL1d)
2182 && FindProcShort (glVertexAttribL2d)
2183 && FindProcShort (glVertexAttribL3d)
2184 && FindProcShort (glVertexAttribL4d)
2185 && FindProcShort (glVertexAttribL1dv)
2186 && FindProcShort (glVertexAttribL2dv)
2187 && FindProcShort (glVertexAttribL3dv)
2188 && FindProcShort (glVertexAttribL4dv)
2189 && FindProcShort (glVertexAttribLPointer)
2190 && FindProcShort (glGetVertexAttribLdv);
2192 // load GL_ARB_viewport_array (added to OpenGL 4.1 core)
2193 const bool hasViewportArray = (IsGlGreaterEqual (4, 1) || CheckExtension ("GL_ARB_viewport_array"))
2194 && FindProcShort (glViewportArrayv)
2195 && FindProcShort (glViewportIndexedf)
2196 && FindProcShort (glViewportIndexedfv)
2197 && FindProcShort (glScissorArrayv)
2198 && FindProcShort (glScissorIndexed)
2199 && FindProcShort (glScissorIndexedv)
2200 && FindProcShort (glDepthRangeArrayv)
2201 && FindProcShort (glDepthRangeIndexed)
2202 && FindProcShort (glGetFloati_v)
2203 && FindProcShort (glGetDoublei_v);
2205 has41 = IsGlGreaterEqual (4, 1)
2206 && hasES2Compatibility
2207 && hasGetProgramBinary
2208 && hasSeparateShaderObjects
2209 && hasVertAttrib64bit
2210 && hasViewportArray;
2212 // load GL_ARB_base_instance (added to OpenGL 4.2 core)
2213 const bool hasBaseInstance = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_base_instance"))
2214 && FindProcShort (glDrawArraysInstancedBaseInstance)
2215 && FindProcShort (glDrawElementsInstancedBaseInstance)
2216 && FindProcShort (glDrawElementsInstancedBaseVertexBaseInstance);
2218 // load GL_ARB_transform_feedback_instanced (added to OpenGL 4.2 core)
2219 const bool hasTrsfFeedbackInstanced = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_transform_feedback_instanced"))
2220 && FindProcShort (glDrawTransformFeedbackInstanced)
2221 && FindProcShort (glDrawTransformFeedbackStreamInstanced);
2223 // load GL_ARB_internalformat_query (added to OpenGL 4.2 core)
2224 const bool hasInternalFormatQuery = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_internalformat_query"))
2225 && FindProcShort (glGetInternalformativ);
2227 // load GL_ARB_shader_atomic_counters (added to OpenGL 4.2 core)
2228 const bool hasShaderAtomicCounters = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_shader_atomic_counters"))
2229 && FindProcShort (glGetActiveAtomicCounterBufferiv);
2231 // load GL_ARB_shader_image_load_store (added to OpenGL 4.2 core)
2232 const bool hasShaderImgLoadStore = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_shader_image_load_store"))
2233 && FindProcShort (glBindImageTexture)
2234 && FindProcShort (glMemoryBarrier);
2236 // load GL_ARB_texture_storage (added to OpenGL 4.2 core)
2237 const bool hasTextureStorage = (IsGlGreaterEqual (4, 2) || CheckExtension ("GL_ARB_texture_storage"))
2238 && FindProcShort (glTexStorage1D)
2239 && FindProcShort (glTexStorage2D)
2240 && FindProcShort (glTexStorage3D);
2242 has42 = IsGlGreaterEqual (4, 2)
2244 && hasTrsfFeedbackInstanced
2245 && hasInternalFormatQuery
2246 && hasShaderAtomicCounters
2247 && hasShaderImgLoadStore
2248 && hasTextureStorage;
2250 has43 = IsGlGreaterEqual (4, 3)
2251 && FindProcShort (glClearBufferData)
2252 && FindProcShort (glClearBufferSubData)
2253 && FindProcShort (glDispatchCompute)
2254 && FindProcShort (glDispatchComputeIndirect)
2255 && FindProcShort (glCopyImageSubData)
2256 && FindProcShort (glFramebufferParameteri)
2257 && FindProcShort (glGetFramebufferParameteriv)
2258 && FindProcShort (glGetInternalformati64v)
2259 && FindProcShort (glInvalidateTexSubImage)
2260 && FindProcShort (glInvalidateTexImage)
2261 && FindProcShort (glInvalidateBufferSubData)
2262 && FindProcShort (glInvalidateBufferData)
2263 && FindProcShort (glInvalidateFramebuffer)
2264 && FindProcShort (glInvalidateSubFramebuffer)
2265 && FindProcShort (glMultiDrawArraysIndirect)
2266 && FindProcShort (glMultiDrawElementsIndirect)
2267 && FindProcShort (glGetProgramInterfaceiv)
2268 && FindProcShort (glGetProgramResourceIndex)
2269 && FindProcShort (glGetProgramResourceName)
2270 && FindProcShort (glGetProgramResourceiv)
2271 && FindProcShort (glGetProgramResourceLocation)
2272 && FindProcShort (glGetProgramResourceLocationIndex)
2273 && FindProcShort (glShaderStorageBlockBinding)
2274 && FindProcShort (glTexBufferRange)
2275 && FindProcShort (glTexStorage2DMultisample)
2276 && FindProcShort (glTexStorage3DMultisample)
2277 && FindProcShort (glTextureView)
2278 && FindProcShort (glBindVertexBuffer)
2279 && FindProcShort (glVertexAttribFormat)
2280 && FindProcShort (glVertexAttribIFormat)
2281 && FindProcShort (glVertexAttribLFormat)
2282 && FindProcShort (glVertexAttribBinding)
2283 && FindProcShort (glVertexBindingDivisor)
2284 && FindProcShort (glDebugMessageControl)
2285 && FindProcShort (glDebugMessageInsert)
2286 && FindProcShort (glDebugMessageCallback)
2287 && FindProcShort (glGetDebugMessageLog)
2288 && FindProcShort (glPushDebugGroup)
2289 && FindProcShort (glPopDebugGroup)
2290 && FindProcShort (glObjectLabel)
2291 && FindProcShort (glGetObjectLabel)
2292 && FindProcShort (glObjectPtrLabel)
2293 && FindProcShort (glGetObjectPtrLabel);
2295 // load GL_ARB_clear_texture (added to OpenGL 4.4 core)
2296 bool arbTexClear = (IsGlGreaterEqual (4, 4) || CheckExtension ("GL_ARB_clear_texture"))
2297 && FindProcShort (glClearTexImage)
2298 && FindProcShort (glClearTexSubImage);
2300 has44 = IsGlGreaterEqual (4, 4)
2302 && FindProcShort (glBufferStorage)
2303 && FindProcShort (glBindBuffersBase)
2304 && FindProcShort (glBindBuffersRange)
2305 && FindProcShort (glBindTextures)
2306 && FindProcShort (glBindSamplers)
2307 && FindProcShort (glBindImageTextures)
2308 && FindProcShort (glBindVertexBuffers);
2310 // initialize debug context extension
2311 if (CheckExtension ("GL_ARB_debug_output"))
2316 arbDbg = (OpenGl_ArbDbg* )(&(*myFuncs));
2318 else if (FindProc ("glDebugMessageControlARB", myFuncs->glDebugMessageControl)
2319 && FindProc ("glDebugMessageInsertARB", myFuncs->glDebugMessageInsert)
2320 && FindProc ("glDebugMessageCallbackARB", myFuncs->glDebugMessageCallback)
2321 && FindProc ("glGetDebugMessageLogARB", myFuncs->glGetDebugMessageLog))
2323 arbDbg = (OpenGl_ArbDbg* )(&(*myFuncs));
2327 && caps->contextDebug)
2329 // setup default callback
2330 myIsGlDebugCtx = Standard_True;
2331 arbDbg->glDebugMessageCallback (debugCallbackWrap, this);
2334 ::glEnable (GL_DEBUG_OUTPUT);
2336 if (caps->contextSyncDebug)
2338 ::glEnable (GL_DEBUG_OUTPUT_SYNCHRONOUS);
2343 // initialize TBO extension (ARB)
2345 && CheckExtension ("GL_ARB_texture_buffer_object")
2346 && FindProc ("glTexBufferARB", myFuncs->glTexBuffer))
2348 arbTBO = (OpenGl_ArbTBO* )(&(*myFuncs));
2350 arbTboRGB32 = CheckExtension ("GL_ARB_texture_buffer_object_rgb32");
2352 // initialize hardware instancing extension (ARB)
2354 && CheckExtension ("GL_ARB_draw_instanced")
2355 && FindProc ("glDrawArraysInstancedARB", myFuncs->glDrawArraysInstanced)
2356 && FindProc ("glDrawElementsInstancedARB", myFuncs->glDrawElementsInstanced))
2358 arbIns = (OpenGl_ArbIns* )(&(*myFuncs));
2361 // initialize FBO extension (ARB)
2364 arbFBO = (OpenGl_ArbFBO* )(&(*myFuncs));
2365 arbFBOBlit = (OpenGl_ArbFBOBlit* )(&(*myFuncs));
2366 extPDS = Standard_True; // extension for EXT, but part of ARB
2369 // initialize GS extension (EXT)
2370 if (CheckExtension ("GL_EXT_geometry_shader4")
2371 && FindProcShort (glProgramParameteriEXT))
2373 extGS = (OpenGl_ExtGS* )(&(*myFuncs));
2376 // initialize bindless texture extension (ARB)
2377 if (CheckExtension ("GL_ARB_bindless_texture")
2378 && FindProcShort (glGetTextureHandleARB)
2379 && FindProcShort (glGetTextureSamplerHandleARB)
2380 && FindProcShort (glMakeTextureHandleResidentARB)
2381 && FindProcShort (glMakeTextureHandleNonResidentARB)
2382 && FindProcShort (glGetImageHandleARB)
2383 && FindProcShort (glMakeImageHandleResidentARB)
2384 && FindProcShort (glMakeImageHandleNonResidentARB)
2385 && FindProcShort (glUniformHandleui64ARB)
2386 && FindProcShort (glUniformHandleui64vARB)
2387 && FindProcShort (glProgramUniformHandleui64ARB)
2388 && FindProcShort (glProgramUniformHandleui64vARB)
2389 && FindProcShort (glIsTextureHandleResidentARB)
2390 && FindProcShort (glIsImageHandleResidentARB)
2391 && FindProcShort (glVertexAttribL1ui64ARB)
2392 && FindProcShort (glVertexAttribL1ui64vARB)
2393 && FindProcShort (glGetVertexAttribLui64vARB))
2395 arbTexBindless = (OpenGl_ArbTexBindless* )(&(*myFuncs));
2400 checkWrongVersion (1, 2);
2407 checkWrongVersion (1, 3);
2414 checkWrongVersion (1, 4);
2421 checkWrongVersion (1, 5);
2428 core15 = (OpenGl_GlCore15* )(&(*myFuncs));
2430 core15fwd = (OpenGl_GlCore15Fwd* )(&(*myFuncs));
2434 checkWrongVersion (2, 0);
2440 const char* aGlslVer = (const char* )::glGetString (GL_SHADING_LANGUAGE_VERSION);
2441 if (aGlslVer == NULL
2442 || *aGlslVer == '\0')
2444 // broken context has been detected
2445 TCollection_ExtendedString aMsg = TCollection_ExtendedString()
2446 + "Error! OpenGL context reports version "
2447 + myGlVerMajor + "." + myGlVerMinor
2448 + " but reports wrong GLSL version";
2449 PushMessage (GL_DEBUG_SOURCE_APPLICATION,
2450 GL_DEBUG_TYPE_ERROR,
2452 GL_DEBUG_SEVERITY_HIGH,
2461 core20 = (OpenGl_GlCore20* )(&(*myFuncs));
2463 core20fwd = (OpenGl_GlCore20Fwd* )(&(*myFuncs));
2467 checkWrongVersion (2, 1);
2475 checkWrongVersion (3, 0);
2481 // MSAA RenderBuffers have been defined in OpenGL 3.0,
2482 // but MSAA Textures - only in OpenGL 3.2+
2484 && CheckExtension ("GL_ARB_texture_multisample")
2485 && FindProcShort (glTexImage2DMultisample))
2487 GLint aNbColorSamples = 0, aNbDepthSamples = 0;
2488 ::glGetIntegerv (GL_MAX_COLOR_TEXTURE_SAMPLES, &aNbColorSamples);
2489 ::glGetIntegerv (GL_MAX_DEPTH_TEXTURE_SAMPLES, &aNbDepthSamples);
2490 myMaxMsaaSamples = Min (aNbColorSamples, aNbDepthSamples);
2493 && CheckExtension ("GL_ARB_texture_storage_multisample")
2494 && FindProcShort (glTexStorage2DMultisample))
2501 checkWrongVersion (3, 1);
2506 arbTBO = (OpenGl_ArbTBO* )(&(*myFuncs));
2507 arbIns = (OpenGl_ArbIns* )(&(*myFuncs));
2509 // check whether ray tracing mode is supported
2510 myHasRayTracing = has31
2512 && arbFBOBlit != NULL;
2514 // check whether textures in ray tracing mode are supported
2515 myHasRayTracingTextures = myHasRayTracing
2516 && arbTexBindless != NULL;
2518 // check whether adaptive screen sampling in ray tracing mode is supported
2519 myHasRayTracingAdaptiveSampling = myHasRayTracing
2521 myHasRayTracingAdaptiveSamplingAtomic = myHasRayTracingAdaptiveSampling
2522 && CheckExtension ("GL_NV_shader_atomic_float");
2526 checkWrongVersion (3, 2);
2531 core32 = (OpenGl_GlCore32* )(&(*myFuncs));
2534 core32->glGenVertexArrays (1, &myDefaultVao);
2538 core32back = (OpenGl_GlCore32Back* )(&(*myFuncs));
2540 ::glGetIntegerv (GL_MAX_SAMPLES, &myMaxMsaaSamples);
2544 checkWrongVersion (3, 3);
2549 core33 = (OpenGl_GlCore33* )(&(*myFuncs));
2552 core33back = (OpenGl_GlCore33Back* )(&(*myFuncs));
2557 checkWrongVersion (4, 0);
2562 arbTboRGB32 = Standard_True; // in core since OpenGL 4.0
2566 checkWrongVersion (4, 1);
2571 core41 = (OpenGl_GlCore41* )(&(*myFuncs));
2574 core41back = (OpenGl_GlCore41Back* )(&(*myFuncs));
2579 checkWrongVersion (4, 2);
2584 core42 = (OpenGl_GlCore42* )(&(*myFuncs));
2587 core42back = (OpenGl_GlCore42Back* )(&(*myFuncs));
2592 checkWrongVersion (4, 3);
2597 core43 = (OpenGl_GlCore43* )(&(*myFuncs));
2600 core43back = (OpenGl_GlCore43Back* )(&(*myFuncs));
2605 checkWrongVersion (4, 4);
2610 core44 = (OpenGl_GlCore44* )(&(*myFuncs));
2613 core44back = (OpenGl_GlCore44Back* )(&(*myFuncs));
2618 // =======================================================================
2619 // function : MemoryInfo
2621 // =======================================================================
2622 Standard_Size OpenGl_Context::AvailableMemory() const
2624 #if !defined(GL_ES_VERSION_2_0)
2627 // this is actually information for VBO pool
2628 // however because pools are mostly shared
2629 // it can be used for total GPU memory estimations
2632 glGetIntegerv (GL_VBO_FREE_MEMORY_ATI, aMemInfo);
2633 // returned value is in KiB, however this maybe changed in future
2634 return Standard_Size(aMemInfo[0]) * 1024;
2638 // current available dedicated video memory (in KiB), currently unused GPU memory
2640 glGetIntegerv (GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &aMemInfo);
2641 return Standard_Size(aMemInfo) * 1024;
2647 // =======================================================================
2648 // function : MemoryInfo
2650 // =======================================================================
2651 TCollection_AsciiString OpenGl_Context::MemoryInfo() const
2653 TColStd_IndexedDataMapOfStringString aDict;
2656 TCollection_AsciiString aText;
2657 for (TColStd_IndexedDataMapOfStringString::Iterator anIter (aDict); anIter.More(); anIter.Next())
2659 if (!aText.IsEmpty())
2663 aText += TCollection_AsciiString(" ") + anIter.Key() + ": " + anIter.Value();
2668 // =======================================================================
2669 // function : MemoryInfo
2671 // =======================================================================
2672 void OpenGl_Context::MemoryInfo (TColStd_IndexedDataMapOfStringString& theDict) const
2674 #if defined(GL_ES_VERSION_2_0)
2676 #elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
2677 GLint aGlRendId = 0;
2678 CGLGetParameter (CGLGetCurrentContext(), kCGLCPCurrentRendererID, &aGlRendId);
2680 CGLRendererInfoObj aRendObj = NULL;
2681 CGOpenGLDisplayMask aDispMask = CGDisplayIDToOpenGLDisplayMask (kCGDirectMainDisplay);
2683 CGLQueryRendererInfo (aDispMask, &aRendObj, &aRendNb);
2684 for (GLint aRendIter = 0; aRendIter < aRendNb; ++aRendIter)
2687 if (CGLDescribeRenderer (aRendObj, aRendIter, kCGLRPRendererID, &aRendId) != kCGLNoError
2688 || aRendId != aGlRendId)
2693 //kCGLRPVideoMemoryMegabytes = 131;
2694 //kCGLRPTextureMemoryMegabytes = 132;
2696 #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
2697 if (CGLDescribeRenderer(aRendObj, aRendIter, kCGLRPVideoMemoryMegabytes, &aVMem) == kCGLNoError)
2699 addInfo (theDict, "GPU memory", TCollection_AsciiString() + aVMem + " MiB");
2701 if (CGLDescribeRenderer(aRendObj, aRendIter, kCGLRPTextureMemoryMegabytes, &aVMem) == kCGLNoError)
2703 addInfo (theDict, "GPU Texture memory", TCollection_AsciiString() + aVMem + " MiB");
2706 if (CGLDescribeRenderer(aRendObj, aRendIter, kCGLRPVideoMemory, &aVMem) == kCGLNoError)
2708 addInfo (theDict, "GPU memory", TCollection_AsciiString() + (aVMem / (1024 * 1024)) + " MiB");
2710 if (CGLDescribeRenderer(aRendObj, aRendIter, kCGLRPTextureMemory, &aVMem) == kCGLNoError)
2712 addInfo (theDict, "GPU Texture memory", TCollection_AsciiString() + (aVMem / (1024 * 1024)) + " MiB");
2718 #if !defined(GL_ES_VERSION_2_0)
2722 memset (aValues, 0, sizeof(aValues));
2723 glGetIntegerv (GL_VBO_FREE_MEMORY_ATI, aValues);
2725 // total memory free in the pool
2726 addInfo (theDict, "GPU free memory", TCollection_AsciiString() + (aValues[0] / 1024) + " MiB");
2728 if (aValues[1] != aValues[0])
2730 // largest available free block in the pool
2731 addInfo (theDict, "Largest free block", TCollection_AsciiString() + (aValues[1] / 1024) + " MiB");
2733 if (aValues[2] != aValues[0])
2735 // total auxiliary memory free
2736 addInfo (theDict, "Free auxiliary memory", TCollection_AsciiString() + (aValues[2] / 1024) + " MiB");
2741 //current available dedicated video memory (in KiB), currently unused GPU memory
2743 glGetIntegerv (GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &aValue);
2744 addInfo (theDict, "GPU free memory", TCollection_AsciiString() + (aValue / 1024) + " MiB");
2746 // dedicated video memory, total size (in KiB) of the GPU memory
2747 GLint aDedicated = 0;
2748 glGetIntegerv (GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &aDedicated);
2749 addInfo (theDict, "GPU memory", TCollection_AsciiString() + (aDedicated / 1024) + " MiB");
2751 // total available memory, total size (in KiB) of the memory available for allocations
2752 glGetIntegerv (GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX, &aValue);
2753 if (aValue != aDedicated)
2755 // different only for special configurations
2756 addInfo (theDict, "Total memory", TCollection_AsciiString() + (aValue / 1024) + " MiB");
2760 else if (myFuncs->wglGetGPUInfoAMD != NULL
2761 && myFuncs->wglGetContextGPUIDAMD != NULL)
2763 GLuint aTotalMemMiB = 0;
2764 UINT anAmdId = myFuncs->wglGetContextGPUIDAMD ((HGLRC )myGContext);
2767 if (myFuncs->wglGetGPUInfoAMD (anAmdId, WGL_GPU_RAM_AMD, GL_UNSIGNED_INT, sizeof(aTotalMemMiB), &aTotalMemMiB) > 0)
2769 addInfo (theDict, "GPU memory", TCollection_AsciiString() + (int )aTotalMemMiB + " MiB");
2776 #if !defined(GL_ES_VERSION_2_0) && !defined(__APPLE__) && !defined(_WIN32)
2777 // GLX_RENDERER_VENDOR_ID_MESA
2778 if (myFuncs->glXQueryCurrentRendererIntegerMESA != NULL)
2780 unsigned int aVMemMiB = 0;
2781 if (myFuncs->glXQueryCurrentRendererIntegerMESA (GLX_RENDERER_VIDEO_MEMORY_MESA, &aVMemMiB) != False)
2783 addInfo (theDict, "GPU memory", TCollection_AsciiString() + int(aVMemMiB) + " MiB");
2789 // =======================================================================
2790 // function : DiagnosticInfo
2792 // =======================================================================
2793 void OpenGl_Context::DiagnosticInformation (TColStd_IndexedDataMapOfStringString& theDict,
2794 Graphic3d_DiagnosticInfo theFlags) const
2796 if ((theFlags & Graphic3d_DiagnosticInfo_NativePlatform) != 0)
2798 #if defined(HAVE_EGL)
2799 addInfo (theDict, "EGLVersion", ::eglQueryString ((EGLDisplay )myDisplay, EGL_VERSION));
2800 addInfo (theDict, "EGLVendor", ::eglQueryString ((EGLDisplay )myDisplay, EGL_VENDOR));
2801 addInfo (theDict, "EGLClientAPIs", ::eglQueryString ((EGLDisplay )myDisplay, EGL_CLIENT_APIS));
2802 if ((theFlags & Graphic3d_DiagnosticInfo_Extensions) != 0)
2804 addInfo (theDict, "EGLExtensions", ::eglQueryString ((EGLDisplay )myDisplay, EGL_EXTENSIONS));
2806 #elif defined(_WIN32)
2807 if ((theFlags & Graphic3d_DiagnosticInfo_Extensions) != 0
2808 && myFuncs->wglGetExtensionsStringARB != NULL)
2810 const char* aWglExts = myFuncs->wglGetExtensionsStringARB ((HDC )myWindowDC);
2811 addInfo (theDict, "WGLExtensions", aWglExts);
2813 #elif defined(__APPLE__)
2816 Display* aDisplay = (Display*)myDisplay;
2817 const int aScreen = DefaultScreen(aDisplay);
2818 addInfo (theDict, "GLXDirectRendering", ::glXIsDirect (aDisplay, (GLXContext )myGContext) ? "Yes" : "No");
2819 addInfo (theDict, "GLXVendor", ::glXQueryServerString (aDisplay, aScreen, GLX_VENDOR));
2820 addInfo (theDict, "GLXVersion", ::glXQueryServerString (aDisplay, aScreen, GLX_VERSION));
2821 if ((theFlags & Graphic3d_DiagnosticInfo_Extensions) != 0)
2823 const char* aGlxExts = ::glXQueryExtensionsString (aDisplay, aScreen);
2824 addInfo(theDict, "GLXExtensions", aGlxExts);
2827 addInfo (theDict, "GLXClientVendor", ::glXGetClientString (aDisplay, GLX_VENDOR));
2828 addInfo (theDict, "GLXClientVersion", ::glXGetClientString (aDisplay, GLX_VERSION));
2829 if ((theFlags & Graphic3d_DiagnosticInfo_Extensions) != 0)
2831 addInfo (theDict, "GLXClientExtensions", ::glXGetClientString (aDisplay, GLX_EXTENSIONS));
2836 if ((theFlags & Graphic3d_DiagnosticInfo_Device) != 0)
2838 addInfo (theDict, "GLvendor", (const char*)::glGetString (GL_VENDOR));
2839 addInfo (theDict, "GLdevice", (const char*)::glGetString (GL_RENDERER));
2840 addInfo (theDict, "GLversion", (const char*)::glGetString (GL_VERSION));
2841 if (IsGlGreaterEqual (2, 0))
2843 addInfo (theDict, "GLSLversion", (const char*)::glGetString (GL_SHADING_LANGUAGE_VERSION));
2847 addInfo (theDict, "GLdebug", "ON");
2851 if ((theFlags & Graphic3d_DiagnosticInfo_Limits) != 0)
2853 addInfo (theDict, "Max texture size", TCollection_AsciiString(myMaxTexDim));
2854 addInfo (theDict, "Max FBO dump size", TCollection_AsciiString() + myMaxDumpSizeX + "x" + myMaxDumpSizeY);
2855 addInfo (theDict, "Max combined texture units", TCollection_AsciiString(myMaxTexCombined));
2856 addInfo (theDict, "Max MSAA samples", TCollection_AsciiString(myMaxMsaaSamples));
2859 if ((theFlags & Graphic3d_DiagnosticInfo_FrameBuffer) != 0)
2861 GLint aViewport[4] = {};
2862 ::glGetIntegerv (GL_VIEWPORT, aViewport);
2863 addInfo (theDict, "Viewport", TCollection_AsciiString() + aViewport[2] + "x" + aViewport[3]);
2866 if ((theFlags & Graphic3d_DiagnosticInfo_Memory) != 0)
2868 MemoryInfo (theDict);
2871 if ((theFlags & Graphic3d_DiagnosticInfo_Extensions) != 0)
2873 #if !defined(GL_ES_VERSION_2_0)
2874 if (IsGlGreaterEqual (3, 0)
2875 && myFuncs->glGetStringi != NULL)
2877 TCollection_AsciiString anExtList;
2879 ::glGetIntegerv (GL_NUM_EXTENSIONS, &anExtNb);
2880 for (GLint anIter = 0; anIter < anExtNb; ++anIter)
2882 const char* anExtension = (const char*)myFuncs->glGetStringi (GL_EXTENSIONS, (GLuint)anIter);
2883 if (!anExtList.IsEmpty())
2887 anExtList += anExtension;
2889 addInfo(theDict, "GLextensions", anExtList);
2894 addInfo (theDict, "GLextensions", (const char*)::glGetString (GL_EXTENSIONS));
2899 // =======================================================================
2900 // function : GetResource
2902 // =======================================================================
2903 const Handle(OpenGl_Resource)& OpenGl_Context::GetResource (const TCollection_AsciiString& theKey) const
2905 return mySharedResources->IsBound (theKey) ? mySharedResources->Find (theKey) : NULL_GL_RESOURCE;
2908 // =======================================================================
2909 // function : ShareResource
2911 // =======================================================================
2912 Standard_Boolean OpenGl_Context::ShareResource (const TCollection_AsciiString& theKey,
2913 const Handle(OpenGl_Resource)& theResource)
2915 if (theKey.IsEmpty() || theResource.IsNull())
2917 return Standard_False;
2919 return mySharedResources->Bind (theKey, theResource);
2922 // =======================================================================
2923 // function : ReleaseResource
2925 // =======================================================================
2926 void OpenGl_Context::ReleaseResource (const TCollection_AsciiString& theKey,
2927 const Standard_Boolean theToDelay)
2929 if (!mySharedResources->IsBound (theKey))
2933 const Handle(OpenGl_Resource)& aRes = mySharedResources->Find (theKey);
2934 if (aRes->GetRefCount() > 1)
2941 myDelayed->Bind (theKey, 1);
2945 aRes->Release (this);
2946 mySharedResources->UnBind (theKey);
2950 // =======================================================================
2951 // function : ReleaseDelayed
2953 // =======================================================================
2954 void OpenGl_Context::ReleaseDelayed()
2956 // release queued elements
2957 while (!myUnusedResources->IsEmpty())
2959 myUnusedResources->First()->Release (this);
2960 myUnusedResources->RemoveFirst();
2963 // release delayed shared resources
2964 NCollection_Vector<TCollection_AsciiString> aDeadList;
2965 for (NCollection_DataMap<TCollection_AsciiString, Standard_Integer>::Iterator anIter (*myDelayed);
2966 anIter.More(); anIter.Next())
2968 if (++anIter.ChangeValue() <= 2)
2970 continue; // postpone release one more frame to ensure noone use it periodically
2973 const TCollection_AsciiString& aKey = anIter.Key();
2974 if (!mySharedResources->IsBound (aKey))
2976 // mixed unshared strategy delayed/undelayed was used!
2977 aDeadList.Append (aKey);
2981 const Handle(OpenGl_Resource)& aRes = mySharedResources->ChangeFind (aKey);
2982 if (aRes->GetRefCount() > 1)
2984 // should be only 1 instance in mySharedResources
2985 // if not - resource was reused again
2986 aDeadList.Append (aKey);
2990 // release resource if no one requiested it more than 2 redraw calls
2991 aRes->Release (this);
2992 mySharedResources->UnBind (aKey);
2993 aDeadList.Append (aKey);
2996 for (Standard_Integer anIter = 0; anIter < aDeadList.Length(); ++anIter)
2998 myDelayed->UnBind (aDeadList.Value (anIter));
3002 // =======================================================================
3003 // function : BindTextures
3005 // =======================================================================
3006 Handle(OpenGl_TextureSet) OpenGl_Context::BindTextures (const Handle(OpenGl_TextureSet)& theTextures)
3008 if (myActiveTextures == theTextures)
3010 return myActiveTextures;
3013 Handle(OpenGl_Context) aThisCtx (this);
3014 OpenGl_TextureSet::Iterator aTextureIterOld (myActiveTextures), aTextureIterNew (theTextures);
3017 if (!aTextureIterNew.More())
3019 for (; aTextureIterOld.More(); aTextureIterOld.Next())
3021 if (const Handle(OpenGl_Texture)& aTextureOld = aTextureIterOld.Value())
3023 #if !defined(GL_ES_VERSION_2_0)
3026 OpenGl_Sampler::resetGlobalTextureParams (aThisCtx, *aTextureOld, aTextureOld->Sampler()->Parameters());
3029 aTextureOld->Unbind (aThisCtx);
3035 const Handle(OpenGl_Texture)& aTextureNew = aTextureIterNew.Value();
3036 if (aTextureIterOld.More())
3038 const Handle(OpenGl_Texture)& aTextureOld = aTextureIterOld.Value();
3039 if (aTextureNew == aTextureOld)
3041 aTextureIterNew.Next();
3042 aTextureIterOld.Next();
3045 else if (aTextureNew.IsNull()
3046 || !aTextureNew->IsValid())
3048 if (!aTextureOld.IsNull())
3050 #if !defined(GL_ES_VERSION_2_0)
3053 OpenGl_Sampler::resetGlobalTextureParams (aThisCtx, *aTextureOld, aTextureOld->Sampler()->Parameters());
3056 aTextureOld->Unbind (aThisCtx);
3059 aTextureIterNew.Next();
3060 aTextureIterOld.Next();
3064 aTextureIterOld.Next();
3066 if (aTextureNew.IsNull())
3068 aTextureIterNew.Next();
3072 const Graphic3d_TextureUnit aTexUnit = aTextureNew->Sampler()->Parameters()->TextureUnit();
3073 if (aTexUnit >= myMaxTexCombined)
3075 PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
3076 TCollection_AsciiString("Texture unit ") + aTexUnit + " for " + aTextureNew->ResourceId() + " exceeds hardware limit " + myMaxTexCombined);
3077 aTextureIterNew.Next();
3081 aTextureNew->Bind (aThisCtx);
3082 if (aTextureNew->Sampler()->ToUpdateParameters())
3084 if (aTextureNew->Sampler()->IsImmutable())
3086 aTextureNew->Sampler()->Init (aThisCtx, *aTextureNew);
3090 OpenGl_Sampler::applySamplerParams (aThisCtx, aTextureNew->Sampler()->Parameters(), aTextureNew->Sampler().get(), aTextureNew->GetTarget(), aTextureNew->HasMipmaps());
3093 #if !defined(GL_ES_VERSION_2_0)
3096 OpenGl_Sampler::applyGlobalTextureParams (aThisCtx, *aTextureNew, aTextureNew->Sampler()->Parameters());
3099 aTextureIterNew.Next();
3102 Handle(OpenGl_TextureSet) anOldTextures = myActiveTextures;
3103 myActiveTextures = theTextures;
3104 return anOldTextures;
3107 // =======================================================================
3108 // function : BindProgram
3110 // =======================================================================
3111 Standard_Boolean OpenGl_Context::BindProgram (const Handle(OpenGl_ShaderProgram)& theProgram)
3113 if (core20fwd == NULL)
3115 return Standard_False;
3117 else if (myActiveProgram == theProgram)
3119 return Standard_True;
3122 if (theProgram.IsNull()
3123 || !theProgram->IsValid())
3125 if (!myActiveProgram.IsNull())
3127 core20fwd->glUseProgram (OpenGl_ShaderProgram::NO_PROGRAM);
3128 myActiveProgram.Nullify();
3130 return Standard_False;
3133 myActiveProgram = theProgram;
3134 core20fwd->glUseProgram (theProgram->ProgramId());
3135 return Standard_True;
3138 // =======================================================================
3139 // function : BindDefaultVao
3141 // =======================================================================
3142 void OpenGl_Context::BindDefaultVao()
3144 #if !defined(GL_ES_VERSION_2_0)
3145 if (myDefaultVao == 0
3151 core32->glBindVertexArray (myDefaultVao);
3155 // =======================================================================
3156 // function : SetDefaultFrameBuffer
3158 // =======================================================================
3159 Handle(OpenGl_FrameBuffer) OpenGl_Context::SetDefaultFrameBuffer (const Handle(OpenGl_FrameBuffer)& theFbo)
3161 Handle(OpenGl_FrameBuffer) aFbo = myDefaultFbo;
3162 myDefaultFbo = theFbo;
3166 // =======================================================================
3167 // function : SetShadingMaterial
3169 // =======================================================================
3170 void OpenGl_Context::SetShadingMaterial (const OpenGl_AspectFace* theAspect,
3171 const Handle(Graphic3d_PresentationAttributes)& theHighlight)
3173 const Handle(Graphic3d_AspectFillArea3d)& anAspect = (!theHighlight.IsNull() && !theHighlight->BasicFillAreaAspect().IsNull())
3174 ? theHighlight->BasicFillAreaAspect()
3175 : theAspect->Aspect();
3177 const bool toDistinguish = anAspect->Distinguish();
3178 const bool toMapTexture = anAspect->ToMapTexture();
3179 const Graphic3d_MaterialAspect& aMatFrontSrc = anAspect->FrontMaterial();
3180 const Graphic3d_MaterialAspect& aMatBackSrc = toDistinguish
3181 ? anAspect->BackMaterial()
3183 const Quantity_Color& aFrontIntColor = anAspect->InteriorColor();
3184 const Quantity_Color& aBackIntColor = toDistinguish
3185 ? anAspect->BackInteriorColor()
3188 myMatFront.Init (aMatFrontSrc, aFrontIntColor);
3191 myMatBack.Init (aMatBackSrc, aBackIntColor);
3195 myMatBack = myMatFront;
3198 if (!theHighlight.IsNull()
3199 && theHighlight->BasicFillAreaAspect().IsNull())
3201 myMatFront.SetColor (theHighlight->ColorRGBA());
3202 myMatBack .SetColor (theHighlight->ColorRGBA());
3205 Standard_ShortReal anAlphaFront = 1.0f;
3206 Standard_ShortReal anAlphaBack = 1.0f;
3207 if (CheckIsTransparent (theAspect, theHighlight, anAlphaFront, anAlphaBack))
3209 myMatFront.Diffuse.a() = anAlphaFront;
3210 myMatBack .Diffuse.a() = anAlphaBack;
3213 // do not update material properties in case of zero reflection mode,
3214 // because GL lighting will be disabled by OpenGl_PrimitiveArray::DrawArray() anyway.
3215 const OpenGl_MaterialState& aMatState = myShaderManager->MaterialState();
3216 const float anAlphaCutoff = anAspect->AlphaMode() == Graphic3d_AlphaMode_Mask
3217 ? anAspect->AlphaCutoff()
3219 if (theAspect->ShadingModel() == Graphic3d_TOSM_UNLIT)
3221 if (anAlphaCutoff == aMatState.AlphaCutoff())
3226 else if (myMatFront == aMatState.FrontMaterial()
3227 && myMatBack == aMatState.BackMaterial()
3228 && toDistinguish == aMatState.ToDistinguish()
3229 && toMapTexture == aMatState.ToMapTexture()
3230 && anAlphaCutoff == aMatState.AlphaCutoff())
3235 myShaderManager->UpdateMaterialStateTo (myMatFront, myMatBack, anAlphaCutoff, toDistinguish, toMapTexture);
3238 // =======================================================================
3239 // function : CheckIsTransparent
3241 // =======================================================================
3242 Standard_Boolean OpenGl_Context::CheckIsTransparent (const OpenGl_AspectFace* theAspect,
3243 const Handle(Graphic3d_PresentationAttributes)& theHighlight,
3244 Standard_ShortReal& theAlphaFront,
3245 Standard_ShortReal& theAlphaBack)
3247 const Handle(Graphic3d_AspectFillArea3d)& anAspect = (!theHighlight.IsNull() && !theHighlight->BasicFillAreaAspect().IsNull())
3248 ? theHighlight->BasicFillAreaAspect()
3249 : theAspect->Aspect();
3251 const bool toDistinguish = anAspect->Distinguish();
3252 const Graphic3d_MaterialAspect& aMatFrontSrc = anAspect->FrontMaterial();
3253 const Graphic3d_MaterialAspect& aMatBackSrc = toDistinguish
3254 ? anAspect->BackMaterial()
3257 // handling transparency
3258 if (!theHighlight.IsNull()
3259 && theHighlight->BasicFillAreaAspect().IsNull())
3261 theAlphaFront = theHighlight->ColorRGBA().Alpha();
3262 theAlphaBack = theHighlight->ColorRGBA().Alpha();
3266 theAlphaFront = aMatFrontSrc.Alpha();
3267 theAlphaBack = aMatBackSrc .Alpha();
3270 if (anAspect->AlphaMode() == Graphic3d_AlphaMode_BlendAuto)
3272 return theAlphaFront < 1.0f
3273 || theAlphaBack < 1.0f;
3275 return anAspect->AlphaMode() == Graphic3d_AlphaMode_Blend;
3278 // =======================================================================
3279 // function : SetColor4fv
3281 // =======================================================================
3282 void OpenGl_Context::SetColor4fv (const OpenGl_Vec4& theColor)
3284 if (!myActiveProgram.IsNull())
3286 myActiveProgram->SetUniform (this, myActiveProgram->GetStateLocation (OpenGl_OCCT_COLOR), theColor);
3288 #if !defined(GL_ES_VERSION_2_0)
3289 else if (core11 != NULL)
3291 core11->glColor4fv (theColor.GetData());
3296 // =======================================================================
3297 // function : SetTypeOfLine
3299 // =======================================================================
3300 void OpenGl_Context::SetTypeOfLine (const Aspect_TypeOfLine theType,
3301 const Standard_ShortReal theFactor)
3303 Standard_Integer aPattern = 0xFFFF;
3306 case Aspect_TOL_DASH:
3311 case Aspect_TOL_DOT:
3316 case Aspect_TOL_DOTDASH:
3321 case Aspect_TOL_EMPTY:
3322 case Aspect_TOL_SOLID:
3327 case Aspect_TOL_USERDEFINED:
3334 if (!myActiveProgram.IsNull())
3336 myActiveProgram->SetUniform (this, "uPattern", aPattern);
3337 myActiveProgram->SetUniform (this, "uFactor", theFactor);
3341 #if !defined(GL_ES_VERSION_2_0)
3342 if (aPattern != 0xFFFF)
3346 core11fwd->glEnable (GL_LINE_STIPPLE);
3348 core11->glLineStipple (static_cast<GLint> (theFactor),
3349 static_cast<GLushort> (aPattern));
3356 core11fwd->glDisable (GL_LINE_STIPPLE);
3362 // =======================================================================
3363 // function : SetLineWidth
3365 // =======================================================================
3366 void OpenGl_Context::SetLineWidth (const Standard_ShortReal theWidth)
3370 // glLineWidth() is still defined within Core Profile, but has no effect with values != 1.0f
3371 core11fwd->glLineWidth (theWidth * myLineWidthScale);
3375 // =======================================================================
3376 // function : SetTextureMatrix
3378 // =======================================================================
3379 void OpenGl_Context::SetTextureMatrix (const Handle(Graphic3d_TextureParams)& theParams)
3381 if (theParams.IsNull())
3385 else if (!myActiveProgram.IsNull())
3387 const GLint aUniLoc = myActiveProgram->GetStateLocation (OpenGl_OCCT_TEXTURE_TRSF2D);
3388 if (aUniLoc == OpenGl_ShaderProgram::INVALID_LOCATION)
3393 // pack transformation parameters
3394 OpenGl_Vec4 aTrsf[2] =
3396 OpenGl_Vec4 (-theParams->Translation().x(),
3397 -theParams->Translation().y(),
3398 theParams->Scale().x(),
3399 theParams->Scale().y()),
3400 OpenGl_Vec4 (static_cast<float> (std::sin (-theParams->Rotation() * M_PI / 180.0)),
3401 static_cast<float> (std::cos (-theParams->Rotation() * M_PI / 180.0)),
3404 myActiveProgram->SetUniform (this, aUniLoc, 2, aTrsf);
3408 #if !defined(GL_ES_VERSION_2_0)
3411 GLint aMatrixMode = GL_TEXTURE;
3412 ::glGetIntegerv (GL_MATRIX_MODE, &aMatrixMode);
3414 core11->glMatrixMode (GL_TEXTURE);
3415 OpenGl_Mat4 aTextureMat;
3416 const Graphic3d_Vec2& aScale = theParams->Scale();
3417 const Graphic3d_Vec2& aTrans = theParams->Translation();
3418 Graphic3d_TransformUtils::Scale (aTextureMat, aScale.x(), aScale.y(), 1.0f);
3419 Graphic3d_TransformUtils::Translate (aTextureMat, -aTrans.x(), -aTrans.y(), 0.0f);
3420 Graphic3d_TransformUtils::Rotate (aTextureMat, -theParams->Rotation(), 0.0f, 0.0f, 1.0f);
3421 core11->glLoadMatrixf (aTextureMat);
3422 core11->glMatrixMode (aMatrixMode);
3427 // =======================================================================
3428 // function : SetPointSize
3430 // =======================================================================
3431 void OpenGl_Context::SetPointSize (const Standard_ShortReal theSize)
3433 if (!myActiveProgram.IsNull())
3435 myActiveProgram->SetUniform (this, myActiveProgram->GetStateLocation (OpenGl_OCCT_POINT_SIZE), theSize);
3436 #if !defined(GL_ES_VERSION_2_0)
3437 //myContext->core11fwd->glEnable (GL_VERTEX_PROGRAM_POINT_SIZE);
3440 #if !defined(GL_ES_VERSION_2_0)
3443 core11fwd->glPointSize (theSize);
3444 if (core20fwd != NULL)
3446 //myContext->core11fwd->glDisable (GL_VERTEX_PROGRAM_POINT_SIZE);
3452 // =======================================================================
3453 // function : SetPointSpriteOrigin
3455 // =======================================================================
3456 void OpenGl_Context::SetPointSpriteOrigin()
3458 #if !defined(GL_ES_VERSION_2_0)
3459 if (core15fwd == NULL)
3464 const int aNewState = !myActiveProgram.IsNull() ? GL_UPPER_LEFT : GL_LOWER_LEFT;
3465 if (myPointSpriteOrig != aNewState)
3467 myPointSpriteOrig = aNewState;
3468 core15fwd->glPointParameteri (GL_POINT_SPRITE_COORD_ORIGIN, aNewState);
3473 // =======================================================================
3474 // function : SetGlNormalizeEnabled
3476 // =======================================================================
3477 Standard_Boolean OpenGl_Context::SetGlNormalizeEnabled (Standard_Boolean isEnabled)
3479 if (isEnabled == myIsGlNormalizeEnabled)
3481 return myIsGlNormalizeEnabled;
3484 Standard_Boolean anOldGlNormalize = myIsGlNormalizeEnabled;
3486 myIsGlNormalizeEnabled = isEnabled;
3488 #if !defined(GL_ES_VERSION_2_0)
3493 ::glEnable (GL_NORMALIZE);
3497 ::glDisable (GL_NORMALIZE);
3502 return anOldGlNormalize;
3505 // =======================================================================
3506 // function : SetPolygonMode
3508 // =======================================================================
3509 Standard_Integer OpenGl_Context::SetPolygonMode (const Standard_Integer theMode)
3511 if (myPolygonMode == theMode)
3513 return myPolygonMode;
3516 const Standard_Integer anOldPolygonMode = myPolygonMode;
3518 myPolygonMode = theMode;
3520 #if !defined(GL_ES_VERSION_2_0)
3521 ::glPolygonMode (GL_FRONT_AND_BACK, (GLenum)theMode);
3524 return anOldPolygonMode;
3527 // =======================================================================
3528 // function : SetPolygonHatchEnabled
3530 // =======================================================================
3531 bool OpenGl_Context::SetPolygonHatchEnabled (const bool theIsEnabled)
3533 if (myHatchStyles.IsNull())
3537 else if (myHatchStyles->IsEnabled() == theIsEnabled)
3539 return theIsEnabled;
3542 return myHatchStyles->SetEnabled (this, theIsEnabled);
3545 // =======================================================================
3546 // function : SetPolygonHatchStyle
3548 // =======================================================================
3549 Standard_Integer OpenGl_Context::SetPolygonHatchStyle (const Handle(Graphic3d_HatchStyle)& theStyle)
3551 if (theStyle.IsNull())
3556 if (myHatchStyles.IsNull())
3558 if (!GetResource ("OpenGl_LineAttributes", myHatchStyles))
3560 // share and register for release once the resource is no longer used
3561 myHatchStyles = new OpenGl_LineAttributes();
3562 ShareResource ("OpenGl_LineAttributes", myHatchStyles);
3565 if (myHatchStyles->TypeOfHatch() == theStyle->HatchType())
3567 return theStyle->HatchType();
3570 return myHatchStyles->SetTypeOfHatch (this, theStyle);
3573 // =======================================================================
3574 // function : SetPolygonOffset
3576 // =======================================================================
3577 void OpenGl_Context::SetPolygonOffset (const Graphic3d_PolygonOffset& theOffset)
3579 const bool toFillOld = (myPolygonOffset.Mode & Aspect_POM_Fill) == Aspect_POM_Fill;
3580 const bool toFillNew = (theOffset.Mode & Aspect_POM_Fill) == Aspect_POM_Fill;
3581 if (toFillNew != toFillOld)
3585 glEnable (GL_POLYGON_OFFSET_FILL);
3589 glDisable (GL_POLYGON_OFFSET_FILL);
3593 #if !defined(GL_ES_VERSION_2_0)
3594 const bool toLineOld = (myPolygonOffset.Mode & Aspect_POM_Line) == Aspect_POM_Line;
3595 const bool toLineNew = (theOffset.Mode & Aspect_POM_Line) == Aspect_POM_Line;
3596 if (toLineNew != toLineOld)
3600 glEnable (GL_POLYGON_OFFSET_LINE);
3604 glDisable (GL_POLYGON_OFFSET_LINE);
3608 const bool toPointOld = (myPolygonOffset.Mode & Aspect_POM_Point) == Aspect_POM_Point;
3609 const bool toPointNew = (theOffset.Mode & Aspect_POM_Point) == Aspect_POM_Point;
3610 if (toPointNew != toPointOld)
3614 glEnable (GL_POLYGON_OFFSET_POINT);
3618 glDisable (GL_POLYGON_OFFSET_POINT);
3623 if (myPolygonOffset.Factor != theOffset.Factor
3624 || myPolygonOffset.Units != theOffset.Units)
3626 glPolygonOffset (theOffset.Factor, theOffset.Units);
3628 myPolygonOffset = theOffset;
3631 // =======================================================================
3632 // function : ApplyModelWorldMatrix
3634 // =======================================================================
3635 void OpenGl_Context::ApplyModelWorldMatrix()
3637 if (myShaderManager->ModelWorldState().ModelWorldMatrix() != ModelWorldState.Current())
3639 myShaderManager->UpdateModelWorldStateTo (ModelWorldState.Current());
3643 // =======================================================================
3644 // function : ApplyWorldViewMatrix
3646 // =======================================================================
3647 void OpenGl_Context::ApplyWorldViewMatrix()
3649 if (myShaderManager->ModelWorldState().ModelWorldMatrix() != THE_IDENTITY_MATRIX)
3651 myShaderManager->UpdateModelWorldStateTo (THE_IDENTITY_MATRIX);
3653 if (myShaderManager->WorldViewState().WorldViewMatrix() != WorldViewState.Current())
3655 myShaderManager->UpdateWorldViewStateTo (WorldViewState.Current());
3659 // =======================================================================
3660 // function : ApplyModelViewMatrix
3662 // =======================================================================
3663 void OpenGl_Context::ApplyModelViewMatrix()
3665 if (myShaderManager->ModelWorldState().ModelWorldMatrix() != ModelWorldState.Current())
3667 myShaderManager->UpdateModelWorldStateTo (ModelWorldState.Current());
3669 if (myShaderManager->WorldViewState().WorldViewMatrix() != WorldViewState.Current())
3671 myShaderManager->UpdateWorldViewStateTo (WorldViewState.Current());
3675 // =======================================================================
3676 // function : ApplyProjectionMatrix
3678 // =======================================================================
3679 void OpenGl_Context::ApplyProjectionMatrix()
3681 if (myShaderManager->ProjectionState().ProjectionMatrix() != ProjectionState.Current())
3683 myShaderManager->UpdateProjectionStateTo (ProjectionState.Current());
3687 // =======================================================================
3688 // function : EnableFeatures
3690 // =======================================================================
3691 void OpenGl_Context::EnableFeatures() const
3696 // =======================================================================
3697 // function : DisableFeatures
3699 // =======================================================================
3700 void OpenGl_Context::DisableFeatures() const
3702 // Disable stuff that's likely to slow down glDrawPixels.
3703 glDisable(GL_DITHER);
3704 glDisable(GL_BLEND);
3705 glDisable(GL_DEPTH_TEST);
3706 glDisable(GL_STENCIL_TEST);
3708 #if !defined(GL_ES_VERSION_2_0)
3714 glDisable(GL_TEXTURE_1D);
3715 glDisable(GL_TEXTURE_2D);
3717 glDisable(GL_LIGHTING);
3718 glDisable(GL_ALPHA_TEST);
3720 glDisable(GL_LOGIC_OP);
3722 glPixelTransferi(GL_MAP_COLOR, GL_FALSE);
3723 glPixelTransferi(GL_RED_SCALE, 1);
3724 glPixelTransferi(GL_RED_BIAS, 0);
3725 glPixelTransferi(GL_GREEN_SCALE, 1);
3726 glPixelTransferi(GL_GREEN_BIAS, 0);
3727 glPixelTransferi(GL_BLUE_SCALE, 1);
3728 glPixelTransferi(GL_BLUE_BIAS, 0);
3729 glPixelTransferi(GL_ALPHA_SCALE, 1);
3730 glPixelTransferi(GL_ALPHA_BIAS, 0);
3732 if ((myGlVerMajor >= 1) && (myGlVerMinor >= 2))
3734 if (CheckExtension ("GL_CONVOLUTION_1D_EXT"))
3735 glDisable(GL_CONVOLUTION_1D_EXT);
3737 if (CheckExtension ("GL_CONVOLUTION_2D_EXT"))
3738 glDisable(GL_CONVOLUTION_2D_EXT);
3740 if (CheckExtension ("GL_SEPARABLE_2D_EXT"))
3741 glDisable(GL_SEPARABLE_2D_EXT);
3743 if (CheckExtension ("GL_SEPARABLE_2D_EXT"))
3744 glDisable(GL_HISTOGRAM_EXT);
3746 if (CheckExtension ("GL_MINMAX_EXT"))
3747 glDisable(GL_MINMAX_EXT);
3749 if (CheckExtension ("GL_TEXTURE_3D_EXT"))
3750 glDisable(GL_TEXTURE_3D_EXT);
3755 // =======================================================================
3756 // function : SetColorMask
3758 // =======================================================================
3759 bool OpenGl_Context::SetColorMask (bool theToWriteColor)
3761 const GLboolean toWrite = theToWriteColor ? GL_TRUE : GL_FALSE;
3762 glColorMask (toWrite, toWrite, toWrite, toWrite);
3764 const bool anOldValue = myColorMask;
3765 myColorMask = theToWriteColor;
3769 // =======================================================================
3770 // function : SetSampleAlphaToCoverage
3772 // =======================================================================
3773 bool OpenGl_Context::SetSampleAlphaToCoverage (bool theToEnable)
3775 if (myAlphaToCoverage == theToEnable)
3777 return myAlphaToCoverage;
3780 if (core15fwd != NULL)
3784 //core15fwd->core15fwd->glSampleCoverage (1.0f, GL_FALSE);
3785 core15fwd->glEnable (GL_SAMPLE_ALPHA_TO_COVERAGE);
3789 core15fwd->glDisable (GL_SAMPLE_ALPHA_TO_COVERAGE);
3793 const bool anOldValue = myAlphaToCoverage;
3794 myAlphaToCoverage = theToEnable;