0024128: Prs3d_WFShape - remove debug environment switch DEBUG_TRIANGLES
[occt.git] / src / OpenGl / OpenGl_Context.hxx
CommitLineData
b311480e 1// Created on: 2012-01-26
2// Created by: Kirill GAVRILOV
3// Copyright (c) 2012-2012 OPEN CASCADE SAS
4//
5// The content of this file is subject to the Open CASCADE Technology Public
6// License Version 6.5 (the "License"). You may not use the content of this file
7// except in compliance with the License. Please obtain a copy of the License
8// at http://www.opencascade.org and read it completely before using this file.
9//
10// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12//
13// The Original Code and all software distributed under the License is
14// distributed on an "AS IS" basis, without warranty of any kind, and the
15// Initial Developer hereby disclaims all such warranties, including without
16// limitation, any warranties of merchantability, fitness for a particular
17// purpose or non-infringement. Please see the License for the specific terms
18// and conditions governing the rights and limitations under the License.
19
2166f0fa
SK
20#ifndef _OpenGl_Context_H__
21#define _OpenGl_Context_H__
22
2bd4c032 23#include <Aspect_Handle.hxx>
24#include <Aspect_Drawable.hxx>
25#include <Aspect_Display.hxx>
26#include <Aspect_RenderingContext.hxx>
5e27df78 27#include <Handle_OpenGl_Context.hxx>
28#include <NCollection_DataMap.hxx>
29#include <NCollection_Handle.hxx>
30#include <NCollection_Queue.hxx>
31#include <OpenGl_Resource.hxx>
2166f0fa 32#include <Standard_Transient.hxx>
f0430952 33#include <TCollection_AsciiString.hxx>
2166f0fa
SK
34#include <Handle_OpenGl_Context.hxx>
35
5f8b738e 36//! Forward declarations
37struct OpenGl_GlCore12;
38struct OpenGl_GlCore13;
39struct OpenGl_GlCore14;
40struct OpenGl_GlCore15;
41struct OpenGl_GlCore20;
42struct OpenGl_ArbVBO;
5e27df78 43struct OpenGl_ArbTBO;
44struct OpenGl_ArbIns;
5f8b738e 45struct OpenGl_ExtFBO;
37eb4787 46struct OpenGl_ExtGS;
2166f0fa 47
5f8b738e 48//! This class generalize access to the GL context and available extensions.
49//!
50//! Functions are grouped into structures and accessed as fields.
51//! You should check the group for NULL before usage (if group is not NULL
52//! then all functions are available):
53//! @code
54//! if (myContext->core20 != NULL)
55//! {
56//! myGlProgram = myContext->core20->glCreateProgram();
57//! .. do more stuff ..
58//! }
59//! else
60//! {
61//! .. compatibility with outdated configurations ..
62//! }
63//! @endcode
64//!
65//! Current implementation provide access to OpenGL core functionality up to 2.0 version
66//! (core12, core13, core14, core15, fields core20).
67//! within several extensions (arbVBO, extFBO, etc.).
68//!
69//! Simplified extensions classification:
70//! - prefixed with NV, AMD, ATI are vendor-specific (however may be provided by other vendors in some cases);
71//! - prefixed with EXT are accepted by 2+ vendors;
72//! - prefixed with ARB are accepted by Architecture Review Board and are candidates
73//! for inclusion into GL core functionality.
74//! Some functionality can be represented in several extensions simultaneously.
75//! In this case developer should be careful because different specification may differ
76//! in aspects (like enumeration values and error-handling).
77//!
78//! Notice that some systems provide mechanisms to simultaneously incorporate with GL contexts
79//! with different capabilities. Thats why OpenGl_Context should be initialized and used
80//! for each GL context individually.
2166f0fa
SK
81class OpenGl_Context : public Standard_Transient
82{
a174a3c5 83public:
84
85 //! Function for getting power of to number larger or equal to input number.
86 //! @param theNumber number to 'power of two'
87 //! @param theThreshold upper threshold
88 //! @return power of two number
89 inline static Standard_Integer GetPowerOfTwo (const Standard_Integer theNumber,
90 const Standard_Integer theThreshold)
91 {
92 for (Standard_Integer p2 = 2; p2 <= theThreshold; p2 <<= 1)
93 {
94 if (theNumber <= p2)
95 {
96 return p2;
97 }
98 }
99 return theThreshold;
100 }
101
2166f0fa
SK
102public:
103
5f8b738e 104 //! Empty constructor. You should call Init() to perform initialization with bound GL context.
105 Standard_EXPORT OpenGl_Context();
106
107 //! Destructor.
108 Standard_EXPORT virtual ~OpenGl_Context();
2166f0fa 109
5e27df78 110 //! Share GL context resources.
111 //! theShareCtx - handle to context to retrieve handles to shared resources.
112 Standard_EXPORT void Share (const Handle(OpenGl_Context)& theShareCtx);
113
2166f0fa
SK
114 //! Initialize available extensions.
115 //! GL context should be active!
f0430952 116 Standard_EXPORT Standard_Boolean Init();
2166f0fa 117
2bd4c032 118#if (defined(_WIN32) || defined(__WIN32__))
f0430952 119 Standard_EXPORT Standard_Boolean Init (const Aspect_Handle theWindow,
120 const Aspect_Handle theWindowDC,
121 const Aspect_RenderingContext theGContext);
4fe56619 122#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
123 Standard_EXPORT Standard_Boolean Init (const void* theGContext);
2bd4c032 124#else
f0430952 125 Standard_EXPORT Standard_Boolean Init (const Aspect_Drawable theWindow,
126 const Aspect_Display theDisplay,
127 const Aspect_RenderingContext theGContext);
2bd4c032 128#endif
129
5f8b738e 130 //! Check if theExtName extension is supported by active GL context.
2bd4c032 131 Standard_EXPORT Standard_Boolean CheckExtension (const char* theExtName) const;
2166f0fa
SK
132
133 //! Auxiliary template to retrieve GL function pointer.
5f8b738e 134 //! Pointer to function retrieved from library is statically casted
135 //! to requested type - there no way to check real signature of exported function.
2166f0fa
SK
136 //! The context should be bound before call.
137 template <typename FuncType_t>
5f8b738e 138 Standard_Boolean FindProc (const char* theFuncName,
139 FuncType_t& theFuncPtr)
2166f0fa 140 {
5f8b738e 141 theFuncPtr = (FuncType_t )findProc (theFuncName);
2166f0fa
SK
142 return (theFuncPtr != NULL);
143 }
144
2bd4c032 145 //! @return true if detected GL version is greater or equal to requested one.
146 inline Standard_Boolean IsGlGreaterEqual (const Standard_Integer theVerMajor,
147 const Standard_Integer theVerMinor)
5f8b738e 148 {
149 return (myGlVerMajor > theVerMajor)
150 || (myGlVerMajor == theVerMajor && myGlVerMinor >= theVerMinor);
151 }
152
153 //! Clean up errors stack for this GL context (glGetError() in loop).
154 Standard_EXPORT void ResetErrors();
155
86fa64d9 156 //! This method uses system-dependent API to retrieve information
157 //! about GL context bound to the current thread.
158 //! @return true if current thread is bound to this GL context
159 Standard_EXPORT Standard_Boolean IsCurrent() const;
160
2bd4c032 161 //! Activates current context.
162 //! Class should be initialized with appropriate info.
163 Standard_EXPORT Standard_Boolean MakeCurrent();
164
5e27df78 165 //! Swap front/back buffers for this GL context (should be activated before!).
166 Standard_EXPORT void SwapBuffers();
167
664cae74 168 //! Return true if active mode is GL_FEEDBACK (cached state)
169 Standard_EXPORT Standard_Boolean IsFeedback() const;
170
171 //! Setup feedback mode cached state
172 Standard_EXPORT void SetFeedback (const Standard_Boolean theFeedbackOn);
173
f0430952 174 //! This function retrieves information from GL about free GPU memory that is:
175 //! - OS-dependent. On some OS it is per-process and on others - for entire system.
176 //! - Vendor-dependent. Currently available only on NVIDIA and AMD/ATi drivers only.
177 //! - Numbers meaning may vary.
178 //! You should use this info only for diagnostics purposes.
179 //! @return free GPU dedicated memory in bytes.
180 Standard_EXPORT Standard_Size AvailableMemory() const;
181
182 //! This function retrieves information from GL about GPU memory
183 //! and contains more vendor-specific values than AvailableMemory().
184 Standard_EXPORT TCollection_AsciiString MemoryInfo() const;
185
5e27df78 186 //! Access shared resource by its name.
187 //! @param theKey - unique identifier;
188 //! @return handle to shared resource or NULL.
189 Standard_EXPORT const Handle(OpenGl_Resource)& GetResource (const TCollection_AsciiString& theKey) const;
190
191 //! Access shared resource by its name.
192 //! @param theKey - unique identifier;
193 //! @param theValue - handle to fill;
194 //! @return true if resource was shared.
195 template<typename TheHandleType>
196 Standard_Boolean GetResource (const TCollection_AsciiString& theKey,
197 TheHandleType& theValue) const
198 {
199 const Handle(OpenGl_Resource)& aResource = GetResource (theKey);
200 if (aResource.IsNull())
201 {
202 return Standard_False;
203 }
204
205 theValue = TheHandleType::DownCast (aResource);
206 return !theValue.IsNull();
207 }
208
209 //! Register shared resource.
210 //! Notice that after registration caller shouldn't release it by himself -
211 //! it will be automatically released on context destruction.
212 //! @param theKey - unique identifier, shouldn't be empty;
213 //! @param theResource - new resource to register, shouldn't be NULL.
214 Standard_EXPORT Standard_Boolean ShareResource (const TCollection_AsciiString& theKey,
215 const Handle(OpenGl_Resource)& theResource);
216
217 //! Release shared resource.
218 //! If there are more than one reference to this resource
219 //! (also used by some other existing object) then call will be ignored.
220 //! This means that current object itself should nullify handle before this call.
221 //! Notice that this is unrecommended operation at all and should be used
222 //! only in case of fat resources to release memory for other needs.
a174a3c5 223 //! @param theKey unique identifier
224 //! @param theToDelay postpone release until next redraw call
225 Standard_EXPORT void ReleaseResource (const TCollection_AsciiString& theKey,
226 const Standard_Boolean theToDelay = Standard_False);
5e27df78 227
228 //! Append resource to queue for delayed clean up.
229 //! Resources in this queue will be released at next redraw call.
230 Standard_EXPORT void DelayedRelease (Handle(OpenGl_Resource)& theResource);
231
232 //! Clean up the delayed release queue.
233 Standard_EXPORT void ReleaseDelayed();
234
bf75be98 235 //! @return maximum degree of anisotropy texture filter
236 Standard_EXPORT Standard_Integer MaxDegreeOfAnisotropy() const;
237
238 //! @return value for GL_MAX_TEXTURE_SIZE
239 Standard_EXPORT Standard_Integer MaxTextureSize() const;
240
5f8b738e 241private:
242
243 //! Wrapper to system function to retrieve GL function pointer by name.
244 Standard_EXPORT void* findProc (const char* theFuncName);
245
246 //! Read OpenGL version information from active context.
247 Standard_EXPORT void readGlVersion();
248
249 //! Private initialization function that should be called only once.
250 Standard_EXPORT void init();
251
252public: // core profiles
253
254 OpenGl_GlCore12* core12;
255 OpenGl_GlCore13* core13;
256 OpenGl_GlCore14* core14;
257 OpenGl_GlCore15* core15;
258 OpenGl_GlCore20* core20;
259
260public: // extensions
261
bf75be98 262 Standard_Boolean arbNPTW; //!< GL_ARB_texture_non_power_of_two
263 OpenGl_ArbVBO* arbVBO; //!< GL_ARB_vertex_buffer_object
264 OpenGl_ArbTBO* arbTBO; //!< GL_ARB_texture_buffer_object
265 OpenGl_ArbIns* arbIns; //!< GL_ARB_draw_instanced
266 OpenGl_ExtFBO* extFBO; //!< GL_EXT_framebuffer_object
267 OpenGl_ExtGS* extGS; //!< GL_EXT_geometry_shader4
268 Standard_Boolean extBgra; //!< GL_EXT_bgra
269 Standard_Boolean extAnis; //!< GL_EXT_texture_filter_anisotropic
270 Standard_Boolean atiMem; //!< GL_ATI_meminfo
271 Standard_Boolean nvxMem; //!< GL_NVX_gpu_memory_info
5f8b738e 272
5e27df78 273private: // system-dependent fields
2166f0fa 274
2bd4c032 275#if (defined(_WIN32) || defined(__WIN32__))
276 Aspect_Handle myWindow; //!< window handle (owner of GL context) : HWND
277 Aspect_Handle myWindowDC; //!< Device Descriptor handle : HDC
278 Aspect_RenderingContext myGContext; //!< Rendering Context handle : HGLRC
4fe56619 279#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX)
280 void* myGContext; //!< Rendering Context handle : NSOpenGLContext
2bd4c032 281#else
282 Aspect_Drawable myWindow; //!< window handle (owner of GL context) : GLXDrawable
283 Aspect_Display myDisplay; //!< connection to the X-server : Display*
284 Aspect_RenderingContext myGContext; //!< X-GLX rendering context : GLXContext
285#endif
286
5e27df78 287private: // context info
288
a174a3c5 289 typedef NCollection_DataMap<TCollection_AsciiString, Standard_Integer> OpenGl_DelayReleaseMap;
290 typedef NCollection_Handle<OpenGl_DelayReleaseMap> Handle(OpenGl_DelayReleaseMap);
5e27df78 291 typedef NCollection_DataMap<TCollection_AsciiString, Handle(OpenGl_Resource)> OpenGl_ResourcesMap;
292 typedef NCollection_Handle<OpenGl_ResourcesMap> Handle(OpenGl_ResourcesMap);
293 typedef NCollection_Queue<Handle(OpenGl_Resource)> OpenGl_ResourcesQueue;
294 typedef NCollection_Handle<OpenGl_ResourcesQueue> Handle(OpenGl_ResourcesQueue);
295
a174a3c5 296 Handle(OpenGl_ResourcesMap) mySharedResources; //!< shared resources with unique identification key
297 Handle(OpenGl_DelayReleaseMap) myDelayed; //!< shared resources for delayed release
298 Handle(OpenGl_ResourcesQueue) myReleaseQueue; //!< queue of resources for delayed clean up
5e27df78 299
5f8b738e 300 void* myGlLibHandle; //!< optional handle to GL library
301 OpenGl_GlCore20* myGlCore20; //!< common structure for GL core functions upto 2.0
bf75be98 302 Standard_Integer myAnisoMax; //!< maximum level of anisotropy texture filter
303 Standard_Integer myMaxTexDim; //!< value for GL_MAX_TEXTURE_SIZE
5f8b738e 304 Standard_Integer myGlVerMajor; //!< cached GL version major number
305 Standard_Integer myGlVerMinor; //!< cached GL version minor number
664cae74 306 Standard_Boolean myIsFeedback; //!< flag indicates GL_FEEDBACK mode
f0430952 307 Standard_Boolean myIsInitialized; //!< flag indicates initialization state
2166f0fa 308
5e27df78 309private:
310
311 //! Copying allowed only within Handles
312 OpenGl_Context (const OpenGl_Context& );
313 OpenGl_Context& operator= (const OpenGl_Context& );
314
2166f0fa
SK
315public:
316
5f8b738e 317 DEFINE_STANDARD_RTTI(OpenGl_Context) // Type definition
2166f0fa 318
5e27df78 319 friend class OpenGl_Window;
320
2166f0fa
SK
321};
322
323#endif // _OpenGl_Context_H__