Oolite 1.91.0.7604-240417-a536cbe
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
137#endif
138#if OO_USE_VBO
139 BOOL vboSupported;
140#endif
141#if OO_USE_FBO
142 BOOL fboSupported;
143#endif
144#if OO_MULTITEXTURE
146 GLint textureUnitCount;
147#endif
148}
149
150+ (OOOpenGLExtensionManager *) sharedManager;
151
152- (void) reset;
153
154- (BOOL)haveExtension:(NSString *)extension;
155
156- (BOOL)shadersSupported;
157- (OOGraphicsDetail)defaultDetailLevel;
158- (OOGraphicsDetail)maximumDetailLevel;
159- (GLint)textureImageUnitCount; // Fragment shader sampler count limit. Does not apply to fixed function multitexturing. (GL_MAX_TEXTURE_IMAGE_UNITS_ARB)
160
161- (BOOL)vboSupported; // Vertex buffer objects
162- (BOOL)fboSupported; // Frame buffer objects
163- (BOOL)textureCombinersSupported;
164- (GLint)textureUnitCount; // Fixed function multitexture limit, does not apply to shaders. (GL_MAX_TEXTURE_UNITS_ARB)
165
166- (NSUInteger)majorVersionNumber;
167- (NSUInteger)minorVersionNumber;
168- (NSUInteger)releaseVersionNumber;
169- (void)getVersionMajor:(unsigned *)outMajor minor:(unsigned *)outMinor release:(unsigned *)outRelease;
170- (BOOL) versionIsAtLeastMajor:(unsigned)maj minor:(unsigned)min;
171
172- (NSString *) vendorString;
173- (NSString *) rendererString;
174
175// GL_POINT_SMOOTH is slow or non-functional on some GPUs.
176- (BOOL) usePointSmoothing;
177- (BOOL) useLineSmoothing;
178
179// Using vertex shader for dust transformation is counterproductive on systems which run vertex shaders on the CPU.
180- (BOOL) useDustShader;
181
182@end
183
184
190
191
192#if OOLITE_WINDOWS
193/* Declare the function pointers for the OpenGL extensions used in the game
194 (required for Windows only).
195*/
196
197#if OO_SHADERS
198// Shader functions
199PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
200PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
201PFNGLUNIFORM1IARBPROC glUniform1iARB;
202PFNGLUNIFORM1FARBPROC glUniform1fARB;
203PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB;
204PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
205PFNGLUNIFORM4FVARBPROC glUniform4fvARB;
206PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
207PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
208PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
209PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
210PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
211PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
212PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
213PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
214PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
215PFNGLUNIFORM2FVARBPROC glUniform2fvARB;
216PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB;
217PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB;
218PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB;
219PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB;
220PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB;
221#endif // OO_SHADERS
222
223
224#if OO_SHADERS || OO_MULTITEXTURE
225PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
226#endif
227
228#if OO_MULTITEXTURE
229PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
230#endif
231
232#if OO_USE_VBO
233PFNGLGENBUFFERSARBPROC glGenBuffersARB;
234PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB;
235PFNGLBINDBUFFERARBPROC glBindBufferARB;
236PFNGLBUFFERDATAARBPROC glBufferDataARB;
237#endif
238
239#if OO_USE_FBO
240PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
241PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
242PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT;
243PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT;
244PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT;
245PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT;
246PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
247PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
248PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
249PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
250PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
251PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
252PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
253PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
254PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
255PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
256PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
257PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
258PFNGLGENBUFFERSPROC glGenBuffers;
259PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
260PFNGLBINDBUFFERPROC glBindBuffer;
261PFNGLBUFFERDATAPROC glBufferData;
262PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
263PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
264PFNGLUSEPROGRAMPROC glUseProgram;
265PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
266PFNGLUNIFORM1IPROC glUniform1i;
267PFNGLACTIVETEXTUREPROC glActiveTexture;
268PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate;
269PFNGLUNIFORM1FPROC glUniform1f;
270PFNGLUNIFORM2FVPROC glUniform2fv;
271PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
272PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
273PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
274PFNGLDELETEBUFFERSPROC glDeleteBuffers;
275PFNGLDRAWBUFFERSPROC glDrawBuffers;
276PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
277PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
278PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
279PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
280PFNGLCLAMPCOLORPROC glClampColor;
281#endif
282
283#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()