Oolite
Loading...
Searching...
No Matches
OOOpenGLExtensionManager.h
Go to the documentation of this file.
1/*
2
3OOOpenGLExtensionManager.h
4
5Handles checking for and using OpenGL extensions and related information.
6
7This is thread safe, except for initialization; that is, +sharedManager should
8be called from the main thread at an early point. The OpenGL context must be
9set up by then.
10
11
12Copyright (C) 2007-2013 Jens Ayton and contributors
13
14Permission is hereby granted, free of charge, to any person obtaining a copy
15of this software and associated documentation files (the "Software"), to deal
16in the Software without restriction, including without limitation the rights
17to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18copies of the Software, and to permit persons to whom the Software is
19furnished to do so, subject to the following conditions:
20
21The above copyright notice and this permission notice shall be included in all
22copies or substantial portions of the Software.
23
24THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30SOFTWARE.
31
32*/
33
34#import "OOCocoa.h"
35#import "OOOpenGL.h"
37#import "OOTypes.h"
38
39
40#ifndef OO_SHADERS
41#ifdef NO_SHADERS
42#define OO_SHADERS 0
43#else
44#define OO_SHADERS 1
45#endif
46#endif
47
48
49#if OO_SHADERS
50
51// Certain extensions are required for shader support.
52#ifndef GL_ARB_multitexture
53#warning NO_SHADERS not defined and GL_ARB_multitexture not defined; if possible, use a newer version of glext.h.
54#endif
55
56#ifndef GL_ARB_shader_objects
57#warning NO_SHADERS not defined and GL_ARB_shader_objects not defined; if possible, use a newer version of glext.h.
58#endif
59
60#ifndef GL_ARB_shading_language_100
61#warning NO_SHADERS not defined and GL_ARB_shading_language_100 not defined; if possible, use a newer version of glext.h.
62#endif
63
64#ifndef GL_ARB_fragment_shader
65#warning NO_SHADERS not defined and GL_ARB_fragment_shader not defined; if possible, use a newer version of glext.h.
66#endif
67
68#ifndef GL_ARB_vertex_shader
69#warning NO_SHADERS not defined and GL_ARB_vertex_shader not defined; if possible, use a newer version of glext.h.
70#endif
71
72#endif //OO_SHADERS
73
74
75#if GL_ARB_vertex_buffer_object
76#define OO_USE_VBO 0 // Disabled due to crashes on certain systems (and limited VBO use)
77#else
78#define OO_USE_VBO 0
79#warning Building without vertex buffer object support, are your OpenGL headers up to date?
80#endif
81
82
83#if GL_EXT_framebuffer_object
84#define OO_USE_FBO 1
85#else
86#define OO_USE_FBO 0
87#warning Building without frame buffer object support, are your OpenGL headers up to date?
88#endif
89
90
91/* Multitexturing requires GL_ARB_multitexture, but we only have use for it
92 if GL_ARB_texture_env_combine is available, and GL_ARB_texture_env_combine
93 requires GL_ARB_multitexture. Both GL_ARB_multitexture and
94 GL_ARB_texture_env_combine were promoted to core in OpenGL 1.3.
95*/
96#if GL_ARB_texture_env_combine
97#define OO_MULTITEXTURE 1
98#else
99#warning Building without texture combiner support, are your OpenGL headers up to date?
100#define OO_MULTITEXTURE 0
101#endif
102
103#if defined(GL_ARB_texture_cube_map) || defined(GL_VERSION_1_3)
104#define OO_TEXTURE_CUBE_MAP 1
105#else
106#warning Building without cube map support, are your OpenGL headers up to date?
107#define OO_TEXTURE_CUBE_MAP 0
108#endif
109
110
111
112#define OOOPENGLEXTMGR_LOCK_SET_ACCESS (!OOLITE_MAC_OS_X)
113
114
115@interface OOOpenGLExtensionManager: NSObject
116{
117@private
118#if OOOPENGLEXTMGR_LOCK_SET_ACCESS
119 NSLock *lock;
120#endif
122
123 NSString *vendor;
124 NSString *renderer;
125
126 unsigned major, minor, release;
127
131
132#if OO_SHADERS
138#endif
139#if OO_USE_VBO
140 BOOL vboSupported;
141#endif
142#if OO_USE_FBO
143 BOOL fboSupported;
144#endif
145#if OO_MULTITEXTURE
147 GLint textureUnitCount;
148#endif
149}
150
151+ (OOOpenGLExtensionManager *) sharedManager;
152
153- (void) reset;
154
155- (BOOL)haveExtension:(NSString *)extension;
156
157- (BOOL)shadersSupported;
158- (BOOL)shadersForceDisabled;
159- (OOGraphicsDetail)defaultDetailLevel;
160- (OOGraphicsDetail)maximumDetailLevel;
161- (GLint)textureImageUnitCount; // Fragment shader sampler count limit. Does not apply to fixed function multitexturing. (GL_MAX_TEXTURE_IMAGE_UNITS_ARB)
162
163- (BOOL)vboSupported; // Vertex buffer objects
164- (BOOL)fboSupported; // Frame buffer objects
165- (BOOL)textureCombinersSupported;
166- (GLint)textureUnitCount; // Fixed function multitexture limit, does not apply to shaders. (GL_MAX_TEXTURE_UNITS_ARB)
167
168- (NSUInteger)majorVersionNumber;
169- (NSUInteger)minorVersionNumber;
170- (NSUInteger)releaseVersionNumber;
171- (void)getVersionMajor:(unsigned *)outMajor minor:(unsigned *)outMinor release:(unsigned *)outRelease;
172- (BOOL) versionIsAtLeastMajor:(unsigned)maj minor:(unsigned)min;
173
174- (NSString *) vendorString;
175- (NSString *) rendererString;
176
177// GL_POINT_SMOOTH is slow or non-functional on some GPUs.
178- (BOOL) usePointSmoothing;
179- (BOOL) useLineSmoothing;
180
181// Using vertex shader for dust transformation is counterproductive on systems which run vertex shaders on the CPU.
182- (BOOL) useDustShader;
183
184@end
185
186
192
193
194#if OOLITE_WINDOWS
195/* Declare the function pointers for the OpenGL extensions used in the game
196 (required for Windows only).
197*/
198
199#if OO_SHADERS
200// Shader functions
201extern PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
202extern PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
203extern PFNGLUNIFORM1IARBPROC glUniform1iARB;
204extern PFNGLUNIFORM1FARBPROC glUniform1fARB;
205extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
206extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
207extern PFNGLUNIFORM4FVARBPROC glUniform4fvARB;
208extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
209extern PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
210extern PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
211extern PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
212extern PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
213extern PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
214extern PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
215extern PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
216extern PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
217extern PFNGLUNIFORM2FVARBPROC glUniform2fvARB;
218extern PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB;
219extern PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB;
220extern PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB;
221extern PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB;
222extern PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB;
223#endif // OO_SHADERS
224
225
226#if OO_SHADERS || OO_MULTITEXTURE
227// The SDL3/SDL_opengl.h header file declares glActiveTextureARB symbols as a function, not a function pointer, which means that if we
228// try to declare or set glActiveTextureARB we get compiler errors. StackOverflow AI suggests we either use GLEW or we use a declare a different
229// name for the symbol. As there are currently only three symbols with this problem, I've gone for the latter approach, creating a macro
230// so we can stull use glActiveTexture in the code
231// -- kanthoney 2026-05-04
232#define glActiveTextureARB glActiveTextureARBPtr
233extern PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
234#endif
235
236#if OO_MULTITEXTURE
237// See note for glActiveTextureARB
238#define glClientActiveTextureARB glClientActiveTextureARBPtr
239extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
240#endif
241
242#if OO_USE_VBO
243extern PFNGLGENBUFFERSARBPROC glGenBuffersARB;
244extern PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB;
245extern PFNGLBINDBUFFERARBPROC glBindBufferARB;
246extern PFNGLBUFFERDATAARBPROC glBufferDataARB;
247#endif
248
249#if OO_USE_FBO
250extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
251extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
252extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT;
253extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT;
254extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT;
255extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT;
256extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
257extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
258extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
259extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
260extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
261extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
262extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
263extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
264extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
265extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
266extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
267extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
268extern PFNGLGENBUFFERSPROC glGenBuffers;
269extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
270extern PFNGLBINDBUFFERPROC glBindBuffer;
271extern PFNGLBUFFERDATAPROC glBufferData;
272extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
273extern PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
274extern PFNGLUSEPROGRAMPROC glUseProgram;
275extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
276extern PFNGLUNIFORM1IPROC glUniform1i;
277// See note for glActiveTextureARB
278#define glActiveTexture glActiveTexturePtr
279extern PFNGLACTIVETEXTUREPROC glActiveTexture;
280extern PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate;
281extern PFNGLUNIFORM1FPROC glUniform1f;
282extern PFNGLUNIFORM2FVPROC glUniform2fv;
283extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
284extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
285extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
286extern PFNGLDELETEBUFFERSPROC glDeleteBuffers;
287extern PFNGLDRAWBUFFERSPROC glDrawBuffers;
288extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
289extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
290extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
291extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
292extern PFNGLCLAMPCOLORPROC glClampColor;
293#endif
294
295#endif // OOLITE_WINDOWS
#define INLINE_PURE_FUNC
#define OOINLINE
OOINLINE BOOL OOShadersSupported(void) INLINE_PURE_FUNC
OOShaderSetting
Definition OOOpenGL.h:35
OOGraphicsDetail
Definition OOTypes.h:243
OOOpenGLExtensionManager * sharedManager()