Line data Source code
1 0 : /* 2 : 3 : OOOpenGLExtensionManager.h 4 : 5 : Handles checking for and using OpenGL extensions and related information. 6 : 7 : This is thread safe, except for initialization; that is, +sharedManager should 8 : be called from the main thread at an early point. The OpenGL context must be 9 : set up by then. 10 : 11 : 12 : Copyright (C) 2007-2013 Jens Ayton and contributors 13 : 14 : Permission is hereby granted, free of charge, to any person obtaining a copy 15 : of this software and associated documentation files (the "Software"), to deal 16 : in the Software without restriction, including without limitation the rights 17 : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 18 : copies of the Software, and to permit persons to whom the Software is 19 : furnished to do so, subject to the following conditions: 20 : 21 : The above copyright notice and this permission notice shall be included in all 22 : copies or substantial portions of the Software. 23 : 24 : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 25 : IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 26 : FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 27 : AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 28 : LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 29 : OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30 : SOFTWARE. 31 : 32 : */ 33 : 34 : #import "OOCocoa.h" 35 : #import "OOOpenGL.h" 36 : #import "OOFunctionAttributes.h" 37 : #import "OOTypes.h" 38 : 39 : 40 : #ifndef OO_SHADERS 41 : #ifdef NO_SHADERS 42 : #define OO_SHADERS 0 43 : #else 44 0 : #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 0 : #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 0 : #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 0 : #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 0 : #define OO_TEXTURE_CUBE_MAP 0 108 : #endif 109 : 110 : 111 : 112 0 : #define OOOPENGLEXTMGR_LOCK_SET_ACCESS (!OOLITE_MAC_OS_X) 113 : 114 : 115 0 : @interface OOOpenGLExtensionManager: NSObject 116 : { 117 : @private 118 : #if OOOPENGLEXTMGR_LOCK_SET_ACCESS 119 : NSLock *lock; 120 : #endif 121 0 : NSSet *extensions; 122 : 123 0 : NSString *vendor; 124 0 : NSString *renderer; 125 : 126 0 : unsigned major, minor, release; 127 : 128 0 : BOOL usePointSmoothing; 129 0 : BOOL useLineSmoothing; 130 0 : BOOL useDustShader; 131 : 132 : #if OO_SHADERS 133 0 : BOOL shadersAvailable; 134 0 : BOOL shadersForceDisabled; 135 0 : OOShaderSetting defaultShaderSetting; 136 0 : OOShaderSetting maximumShaderSetting; 137 0 : GLint textureImageUnitCount; 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 146 : BOOL textureCombinersSupported; 147 : GLint textureUnitCount; 148 : #endif 149 : } 150 : 151 0 : + (OOOpenGLExtensionManager *) sharedManager; 152 : 153 0 : - (void) reset; 154 : 155 0 : - (BOOL)haveExtension:(NSString *)extension; 156 : 157 0 : - (BOOL)shadersSupported; 158 0 : - (BOOL)shadersForceDisabled; 159 0 : - (OOGraphicsDetail)defaultDetailLevel; 160 0 : - (OOGraphicsDetail)maximumDetailLevel; 161 0 : - (GLint)textureImageUnitCount; // Fragment shader sampler count limit. Does not apply to fixed function multitexturing. (GL_MAX_TEXTURE_IMAGE_UNITS_ARB) 162 : 163 0 : - (BOOL)vboSupported; // Vertex buffer objects 164 0 : - (BOOL)fboSupported; // Frame buffer objects 165 0 : - (BOOL)textureCombinersSupported; 166 0 : - (GLint)textureUnitCount; // Fixed function multitexture limit, does not apply to shaders. (GL_MAX_TEXTURE_UNITS_ARB) 167 : 168 0 : - (NSUInteger)majorVersionNumber; 169 0 : - (NSUInteger)minorVersionNumber; 170 0 : - (NSUInteger)releaseVersionNumber; 171 0 : - (void)getVersionMajor:(unsigned *)outMajor minor:(unsigned *)outMinor release:(unsigned *)outRelease; 172 0 : - (BOOL) versionIsAtLeastMajor:(unsigned)maj minor:(unsigned)min; 173 : 174 0 : - (NSString *) vendorString; 175 0 : - (NSString *) rendererString; 176 : 177 : // GL_POINT_SMOOTH is slow or non-functional on some GPUs. 178 0 : - (BOOL) usePointSmoothing; 179 0 : - (BOOL) useLineSmoothing; 180 : 181 : // Using vertex shader for dust transformation is counterproductive on systems which run vertex shaders on the CPU. 182 0 : - (BOOL) useDustShader; 183 : 184 : @end 185 : 186 : 187 : OOINLINE BOOL OOShadersSupported(void) INLINE_PURE_FUNC; 188 0 : OOINLINE BOOL OOShadersSupported(void) 189 : { 190 : return [[OOOpenGLExtensionManager sharedManager] shadersSupported]; 191 : } 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 201 : PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB; 202 : PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB; 203 : PFNGLUNIFORM1IARBPROC glUniform1iARB; 204 : PFNGLUNIFORM1FARBPROC glUniform1fARB; 205 : PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB; 206 : PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB; 207 : PFNGLUNIFORM4FVARBPROC glUniform4fvARB; 208 : PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; 209 : PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB; 210 : PFNGLGETINFOLOGARBPROC glGetInfoLogARB; 211 : PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB; 212 : PFNGLATTACHOBJECTARBPROC glAttachObjectARB; 213 : PFNGLDELETEOBJECTARBPROC glDeleteObjectARB; 214 : PFNGLLINKPROGRAMARBPROC glLinkProgramARB; 215 : PFNGLCOMPILESHADERARBPROC glCompileShaderARB; 216 : PFNGLSHADERSOURCEARBPROC glShaderSourceARB; 217 : PFNGLUNIFORM2FVARBPROC glUniform2fvARB; 218 : PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB; 219 : PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB; 220 : PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB; 221 : PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB; 222 : PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB; 223 : #endif // OO_SHADERS 224 : 225 : 226 : #if OO_SHADERS || OO_MULTITEXTURE 227 : PFNGLACTIVETEXTUREARBPROC glActiveTextureARB; 228 : #endif 229 : 230 : #if OO_MULTITEXTURE 231 : PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB; 232 : #endif 233 : 234 : #if OO_USE_VBO 235 : PFNGLGENBUFFERSARBPROC glGenBuffersARB; 236 : PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB; 237 : PFNGLBINDBUFFERARBPROC glBindBufferARB; 238 : PFNGLBUFFERDATAARBPROC glBufferDataARB; 239 : #endif 240 : 241 : #if OO_USE_FBO 242 : PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT; 243 : PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT; 244 : PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT; 245 : PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT; 246 : PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT; 247 : PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT; 248 : PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT; 249 : PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT; 250 : PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT; 251 : PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT; 252 : PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; 253 : PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; 254 : PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; 255 : PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; 256 : PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; 257 : PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; 258 : PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; 259 : PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; 260 : PFNGLGENBUFFERSPROC glGenBuffers; 261 : PFNGLBINDVERTEXARRAYPROC glBindVertexArray; 262 : PFNGLBINDBUFFERPROC glBindBuffer; 263 : PFNGLBUFFERDATAPROC glBufferData; 264 : PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; 265 : PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; 266 : PFNGLUSEPROGRAMPROC glUseProgram; 267 : PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; 268 : PFNGLUNIFORM1IPROC glUniform1i; 269 : PFNGLACTIVETEXTUREPROC glActiveTexture; 270 : PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate; 271 : PFNGLUNIFORM1FPROC glUniform1f; 272 : PFNGLUNIFORM2FVPROC glUniform2fv; 273 : PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; 274 : PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; 275 : PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; 276 : PFNGLDELETEBUFFERSPROC glDeleteBuffers; 277 : PFNGLDRAWBUFFERSPROC glDrawBuffers; 278 : PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; 279 : PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; 280 : PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; 281 : PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; 282 : PFNGLCLAMPCOLORPROC glClampColor; 283 : #endif 284 : 285 : #endif // OOLITE_WINDOWS