58static void OOBadOpenGLExtensionUsed(
void)
GCC_ATTR((noreturn, used));
62PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)&OOBadOpenGLExtensionUsed;
63PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)&OOBadOpenGLExtensionUsed;
64PFNGLUNIFORM1IARBPROC glUniform1iARB = (PFNGLUNIFORM1IARBPROC)&OOBadOpenGLExtensionUsed;
65PFNGLUNIFORM1FARBPROC glUniform1fARB = (PFNGLUNIFORM1FARBPROC)&OOBadOpenGLExtensionUsed;
66PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)&OOBadOpenGLExtensionUsed;
67PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)&OOBadOpenGLExtensionUsed;
68PFNGLUNIFORM4FVARBPROC glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)&OOBadOpenGLExtensionUsed;
69PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)&OOBadOpenGLExtensionUsed;
70PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)&OOBadOpenGLExtensionUsed;
71PFNGLGETINFOLOGARBPROC glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)&OOBadOpenGLExtensionUsed;
72PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)&OOBadOpenGLExtensionUsed;
73PFNGLATTACHOBJECTARBPROC glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)&OOBadOpenGLExtensionUsed;
74PFNGLDELETEOBJECTARBPROC glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)&OOBadOpenGLExtensionUsed;
75PFNGLLINKPROGRAMARBPROC glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)&OOBadOpenGLExtensionUsed;
76PFNGLCOMPILESHADERARBPROC glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)&OOBadOpenGLExtensionUsed;
77PFNGLSHADERSOURCEARBPROC glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)&OOBadOpenGLExtensionUsed;
78PFNGLUNIFORM2FVARBPROC glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)&OOBadOpenGLExtensionUsed;
79PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)&OOBadOpenGLExtensionUsed;
80PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)&OOBadOpenGLExtensionUsed;
81PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)&OOBadOpenGLExtensionUsed;
82PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)&OOBadOpenGLExtensionUsed;
83PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)&OOBadOpenGLExtensionUsed;
86#if OO_SHADERS || OO_MULTITEXTURE
87PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)&OOBadOpenGLExtensionUsed;
91PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)&OOBadOpenGLExtensionUsed;
95PFNGLGENBUFFERSARBPROC glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)&OOBadOpenGLExtensionUsed;
96PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)&OOBadOpenGLExtensionUsed;
97PFNGLBINDBUFFERARBPROC glBindBufferARB = (PFNGLBINDBUFFERARBPROC)&OOBadOpenGLExtensionUsed;
98PFNGLBUFFERDATAARBPROC glBufferDataARB = (PFNGLBUFFERDATAARBPROC)&OOBadOpenGLExtensionUsed;
102PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)&OOBadOpenGLExtensionUsed;
103PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)&OOBadOpenGLExtensionUsed;
104PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)&OOBadOpenGLExtensionUsed;
105PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)&OOBadOpenGLExtensionUsed;
106PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)&OOBadOpenGLExtensionUsed;
107PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)&OOBadOpenGLExtensionUsed;
108PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)&OOBadOpenGLExtensionUsed;
109PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)&OOBadOpenGLExtensionUsed;
110PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)&OOBadOpenGLExtensionUsed;
111PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)&OOBadOpenGLExtensionUsed;
112PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)&OOBadOpenGLExtensionUsed;
113PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)&OOBadOpenGLExtensionUsed;
114PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)&OOBadOpenGLExtensionUsed;
115PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)&OOBadOpenGLExtensionUsed;
116PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)&OOBadOpenGLExtensionUsed;
117PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)&OOBadOpenGLExtensionUsed;
118PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)&OOBadOpenGLExtensionUsed;
119PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)&OOBadOpenGLExtensionUsed;
120PFNGLGENBUFFERSPROC glGenBuffers = (PFNGLGENBUFFERSPROC)&OOBadOpenGLExtensionUsed;
121PFNGLBINDVERTEXARRAYPROC glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)&OOBadOpenGLExtensionUsed;
122PFNGLBINDBUFFERPROC glBindBuffer = (PFNGLBINDBUFFERPROC)&OOBadOpenGLExtensionUsed;
123PFNGLBUFFERDATAPROC glBufferData = (PFNGLBUFFERDATAPROC)&OOBadOpenGLExtensionUsed;
124PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)&OOBadOpenGLExtensionUsed;
125PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)&OOBadOpenGLExtensionUsed;
126PFNGLUSEPROGRAMPROC glUseProgram = (PFNGLUSEPROGRAMPROC)&OOBadOpenGLExtensionUsed;
127PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)&OOBadOpenGLExtensionUsed;
128PFNGLUNIFORM1IPROC glUniform1i = (PFNGLUNIFORM1IPROC)&OOBadOpenGLExtensionUsed;
129PFNGLACTIVETEXTUREPROC glActiveTexture = (PFNGLACTIVETEXTUREPROC)&OOBadOpenGLExtensionUsed;
130PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)&OOBadOpenGLExtensionUsed;
131PFNGLUNIFORM1FPROC glUniform1f = (PFNGLUNIFORM1FPROC)&OOBadOpenGLExtensionUsed;
132PFNGLUNIFORM2FVPROC glUniform2fv = (PFNGLUNIFORM2FVPROC)&OOBadOpenGLExtensionUsed;
133PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)&OOBadOpenGLExtensionUsed;
134PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)&OOBadOpenGLExtensionUsed;
135PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)&OOBadOpenGLExtensionUsed;
136PFNGLDELETEBUFFERSPROC glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)&OOBadOpenGLExtensionUsed;
137PFNGLDRAWBUFFERSPROC glDrawBuffers = (PFNGLDRAWBUFFERSPROC)&OOBadOpenGLExtensionUsed;
138PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)&OOBadOpenGLExtensionUsed;
139PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)&OOBadOpenGLExtensionUsed;
140PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)&OOBadOpenGLExtensionUsed;
141PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)&OOBadOpenGLExtensionUsed;
142PFNGLCLAMPCOLORPROC glClampColor = (PFNGLCLAMPCOLORPROC)&OOBadOpenGLExtensionUsed;
157@interface OOOpenGLExtensionManager (OOPrivate)
164- (void)checkVBOSupported;
168- (void)checkFBOSupported;
171#if GL_ARB_texture_env_combine
172- (void)checkTextureCombinersSupported;
175- (NSDictionary *) lookUpPerGPUSettingsWithVersionString:(NSString *)version extensionsString:(NSString *)extensionsStr;
182 NSArray *components = [extensionString componentsSeparatedByString:@" "];
183 NSMutableArray *result = [NSMutableArray arrayWithCapacity:[components count]];
184 NSEnumerator *extEnum =
nil;
185 NSString *extStr =
nil;
186 for (extEnum = [components objectEnumerator]; (extStr = [extEnum nextObject]); )
188 if ([extStr length] > 0) [result addObject:extStr];
201#if OOOPENGLEXTMGR_LOCK_SET_ACCESS
202 lock = [[NSLock alloc] init];
203 [lock setName:@"OOOpenGLExtensionManager extension set lock"];
215 const GLubyte *versionString = NULL, *curr = NULL;
221 NSString *extensionsStr = [NSString stringWithUTF8String:(char *)glGetString(GL_EXTENSIONS)];
222 extensions = [[NSSet alloc] initWithArray:ArrayOfExtensions(extensionsStr)];
224 vendor = [[NSString alloc] initWithUTF8String:(const char *)glGetString(GL_VENDOR)];
225 renderer = [[NSString alloc] initWithUTF8String:(const char *)glGetString(GL_RENDERER)];
227 versionString = glGetString(GL_VERSION);
228 if (versionString != NULL)
234 curr = versionString;
254 OOLog(
@"rendering.opengl.version",
@"OpenGL renderer version: %u.%u.%u (\"%s\
"). Vendor: \"%@\". Renderer: \"%@\".", major, minor, release, versionString, vendor, renderer);
255 OOLog(
@"rendering.opengl.extensions",
@"OpenGL extensions (%lu):\n%@", [extensions
count], [[extensions allObjects] componentsJoinedByString:
@", "]);
260 [NSException raise:@"OoliteOpenGLTooOldException"
261 format:@"Oolite requires at least OpenGL %u.%u. You have %u.%u (\"%s\").", kMinMajorVersion, kMinMinorVersion, major, minor, versionString];
264 NSString *versionStr = [[[NSString alloc] initWithUTF8String:(const char *)versionString] autorelease];
265 NSDictionary *gpuConfig = [
self lookUpPerGPUSettingsWithVersionString:versionStr extensionsString:extensionsStr];
268 [
self checkShadersSupported];
270 if (shadersAvailable)
273 defaultValue:
@"SHADERS_FULL"]);
275 defaultValue:
@"SHADERS_FULL"]);
278 shadersAvailable = NO;
280 OOLog(
kOOLogOpenGLShaderSupport,
@"Shaders will not be used (disallowed for GPU type \"%@\
").", [gpuConfig oo_stringForKey:
@"name" defaultValue:renderer]);
282 if (maximumShaderSetting < defaultShaderSetting)
284 defaultShaderSetting = maximumShaderSetting;
287 if (shadersAvailable)
298 GLint texImageUnitOverride = [gpuConfig oo_intForKey:@"texture_image_units" defaultValue:textureImageUnitCount];
299 if (texImageUnitOverride < textureImageUnitCount) textureImageUnitCount =
MAX(texImageUnitOverride, 0);
303 [
self checkVBOSupported];
306 [
self checkFBOSupported];
309 [
self checkTextureCombinersSupported];
310 GLint texUnitOverride = [gpuConfig oo_intForKey:@"texture_units" defaultValue:textureUnitCount];
311 if (texUnitOverride < textureUnitCount) textureUnitCount =
MAX(texUnitOverride, 0);
314 usePointSmoothing = [gpuConfig oo_boolForKey:@"smooth_points" defaultValue:YES];
315 useLineSmoothing = [gpuConfig oo_boolForKey:@"smooth_lines" defaultValue:YES];
316 useDustShader = [gpuConfig oo_boolForKey:@"use_dust_shader" defaultValue:YES];
324#if OOOPENGLEXTMGR_LOCK_SET_ACCESS
343- (BOOL)haveExtension:(NSString *)extension
346#if OOOPENGLEXTMGR_LOCK_SET_ACCESS
350 BOOL result = [extensions containsObject:extension];
352#if OOOPENGLEXTMGR_LOCK_SET_ACCESS
360- (BOOL)shadersSupported
363 return shadersAvailable;
404- (GLint)textureImageUnitCount
407 return textureImageUnitCount;
434- (BOOL)textureCombinersSupported
437 return textureCombinersSupported;
444- (GLint)textureUnitCount
447 return textureUnitCount;
454- (NSUInteger)majorVersionNumber
460- (NSUInteger)minorVersionNumber
466- (NSUInteger)releaseVersionNumber
472- (void)getVersionMajor:(
unsigned *)outMajor minor:(
unsigned *)outMinor release:(
unsigned *)outRelease
474 if (outMajor != NULL) *outMajor = major;
475 if (outMinor != NULL) *outMinor = minor;
476 if (outRelease != NULL) *outRelease = release;
480- (BOOL) versionIsAtLeastMajor:(
unsigned)maj minor:(
unsigned)min
482 return major > maj || (major == maj && minor >= min);
486- (NSString *) vendorString
492- (NSString *) rendererString
498- (BOOL) usePointSmoothing
500 return usePointSmoothing;
504- (BOOL) useLineSmoothing
506 return useLineSmoothing;
510- (BOOL) useDustShader
512 return useDustShader;
523 const GLubyte *curr = *ioString;
525 while (
'0' <= *curr && *curr <=
'9')
527 result = result * 10 + *curr++ -
'0';
535@implementation OOOpenGLExtensionManager (OOPrivate)
546 shadersAvailable = NO;
553 NSArray *arguments = [[NSProcessInfo processInfo] arguments];
554 NSEnumerator *argEnum =
nil;
557 for (argEnum = [arguments objectEnumerator]; (arg = [argEnum nextObject]); )
559 if ([arg isEqual:
@"-noshaders"] || [arg isEqual:
@"--noshaders"])
566 NSString *
const requiredExtension[] =
568 @"GL_ARB_shading_language_100",
569 @"GL_ARB_fragment_shader",
570 @"GL_ARB_vertex_shader",
571 @"GL_ARB_multitexture",
572 @"GL_ARB_shader_objects",
575 NSString *
const *required = NULL;
577 for (required = requiredExtension; *required !=
nil; ++required)
579 if (![
self haveExtension:*required])
587 glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)wglGetProcAddress(
"glGetObjectParameterivARB");
588 glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)wglGetProcAddress(
"glCreateShaderObjectARB");
589 glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)wglGetProcAddress(
"glGetInfoLogARB");
590 glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)wglGetProcAddress(
"glCreateProgramObjectARB");
591 glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)wglGetProcAddress(
"glAttachObjectARB");
592 glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)wglGetProcAddress(
"glDeleteObjectARB");
593 glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)wglGetProcAddress(
"glLinkProgramARB");
594 glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)wglGetProcAddress(
"glCompileShaderARB");
595 glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)wglGetProcAddress(
"glShaderSourceARB");
596 glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)wglGetProcAddress(
"glUseProgramObjectARB");
597 glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress(
"glActiveTextureARB");
598 glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)wglGetProcAddress(
"glGetUniformLocationARB");
599 glUniform1iARB = (PFNGLUNIFORM1IARBPROC)wglGetProcAddress(
"glUniform1iARB");
600 glUniform1fARB = (PFNGLUNIFORM1FARBPROC)wglGetProcAddress(
"glUniform1fARB");
601 glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)wglGetProcAddress(
"glUniformMatrix3fvARB");
602 glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)wglGetProcAddress(
"glUniformMatrix4fvARB");
603 glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)wglGetProcAddress(
"glUniform4fvARB");
604 glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)wglGetProcAddress(
"glUniform2fvARB");
605 glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)wglGetProcAddress(
"glBindAttribLocationARB");
606 glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)wglGetProcAddress(
"glEnableVertexAttribArrayARB");
607 glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)wglGetProcAddress(
"glVertexAttribPointerARB");
608 glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)wglGetProcAddress(
"glDisableVertexAttribArrayARB");
609 glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)wglGetProcAddress(
"glValidateProgramARB");
612 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &textureImageUnitCount);
614 shadersAvailable = YES;
620- (void)checkVBOSupported
624 if ([
self versionIsAtLeastMajor:1 minor:5] || [
self haveExtension:
@"GL_ARB_vertex_buffer_object"])
632 glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress(
"glGenBuffersARB");
633 glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)wglGetProcAddress(
"glDeleteBuffersARB");
634 glBindBufferARB = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress(
"glBindBufferARB");
635 glBufferDataARB = (PFNGLBUFFERDATAARBPROC)wglGetProcAddress(
"glBufferDataARB");
643- (void)checkFBOSupported
647 if ([
self haveExtension:
@"GL_EXT_framebuffer_object"])
655 glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)wglGetProcAddress(
"glGenFramebuffersEXT");
656 glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)wglGetProcAddress(
"glBindFramebufferEXT");
657 glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)wglGetProcAddress(
"glGenRenderbuffersEXT");
658 glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)wglGetProcAddress(
"glBindRenderbufferEXT");
659 glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)wglGetProcAddress(
"glRenderbufferStorageEXT");
660 glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)wglGetProcAddress(
"glFramebufferRenderbufferEXT");
661 glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)wglGetProcAddress(
"glFramebufferTexture2DEXT");
662 glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)wglGetProcAddress(
"glCheckFramebufferStatusEXT");
663 glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)wglGetProcAddress(
"glDeleteFramebuffersEXT");
664 glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)wglGetProcAddress(
"glDeleteRenderbuffersEXT");
665 glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress(
"glGenRenderbuffers");
666 glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress (
"glBindRenderbuffer" );
667 glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress (
"glRenderbufferStorage" );
668 glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress (
"glGenFramebuffers" );
669 glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)wglGetProcAddress (
"glBindFramebuffer" );
670 glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)wglGetProcAddress (
"glFramebufferRenderbuffer" );
671 glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress (
"glFramebufferTexture2D" );
672 glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)wglGetProcAddress (
"glGenVertexArrays" );
673 glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress (
"glGenBuffers" );
674 glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)wglGetProcAddress (
"glBindVertexArray" );
675 glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress (
"glBindBuffer" );
676 glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress (
"glBufferData" );
677 glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress (
"glVertexAttribPointer" );
678 glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress (
"glEnableVertexAttribArray" );
679 glUseProgram = (PFNGLUSEPROGRAMPROC) wglGetProcAddress (
"glUseProgram" );
680 glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress (
"glGetUniformLocation" );
681 glUniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress (
"glUniform1i" );
682 glActiveTexture = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress (
"glActiveTexture" );
683 glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)wglGetProcAddress (
"glBlendFuncSeparate" );
684 glUniform1f = (PFNGLUNIFORM1FPROC)wglGetProcAddress (
"glUniform1f" );
685 glUniform2fv = (PFNGLUNIFORM2FVPROC)wglGetProcAddress (
"glUniform2fv" );
686 glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)wglGetProcAddress (
"glDeleteRenderbuffer" );
687 glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress (
"glDeleteFramebuffers" );
688 glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)wglGetProcAddress (
"glDeleteVertexArrays" );
689 glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress (
"glDeleteBuffers" );
690 glDrawBuffers = (PFNGLDRAWBUFFERSPROC)wglGetProcAddress (
"glDrawBuffers" );
691 glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)wglGetProcAddress (
"glCheckFramebufferStatus" );
692 glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)wglGetProcAddress (
"glTexImage2DMultisample" );
693 glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)wglGetProcAddress (
"glRenderbufferStorageMultisample" );
694 glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)wglGetProcAddress (
"glBlitFramebuffer" );
695 glClampColor = (PFNGLCLAMPCOLORPROC)wglGetProcAddress (
"glClampColor" );
703- (void)checkTextureCombinersSupported
705 textureCombinersSupported = [
self haveExtension:@"GL_ARB_texture_env_combine"];
707 if (textureCombinersSupported)
709 OOGL(glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &textureUnitCount));
713 glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress(
"glActiveTextureARB");
715 glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)wglGetProcAddress(
"glClientActiveTextureARB");
720 textureUnitCount = 1;
730 if (regexps ==
nil)
return YES;
731 if ([regexps isKindOfClass:[NSString class]])
733 return [string oo_matchesRegularExpression:regexps];
735 if ([regexps isKindOfClass:[NSArray class]])
737 NSEnumerator *regexpEnum =
nil;
738 NSString *regexp =
nil;
740 for (regexpEnum = [regexps objectEnumerator]; (regexp = [regexpEnum nextObject]); )
742 if (
EXPECT_NOT(![regexp isKindOfClass:[NSString class]]))
748 if (![
string oo_matchesRegularExpression:regexp])
return NO;
762 NSDictionary *configurations = context;
763 NSDictionary *dictA = [configurations oo_dictionaryForKey:keyA];
764 NSDictionary *dictB = [configurations oo_dictionaryForKey:keyB];
765 double precedenceA = [dictA oo_doubleForKey:@"precedence" defaultValue:1];
766 double precedenceB = [dictB oo_doubleForKey:@"precedence" defaultValue:1];
768 if (precedenceA > precedenceB)
return NSOrderedAscending;
769 if (precedenceA < precedenceB)
return NSOrderedDescending;
771 return [keyA caseInsensitiveCompare:keyB];
775- (NSDictionary *) lookUpPerGPUSettingsWithVersionString:(NSString *)versionStr extensionsString:(NSString *)extensionsStr
781 NSArray *keys = [[configurations allKeys] sortedArrayUsingFunction:CompareGPUSettingsByPriority context:configurations];
783 NSEnumerator *keyEnum =
nil;
785 NSDictionary *config =
nil;
787 for (keyEnum = [keys objectEnumerator]; (key = [keyEnum nextObject]); )
789 config = [configurations oo_dictionaryForKey:key];
792 NSDictionary *match = [config oo_dictionaryForKey:@"match"];
793 NSString *expr =
nil;
795 expr = [match objectForKey:@"vendor"];
798 expr = [match oo_stringForKey:@"renderer"];
801 expr = [match oo_stringForKey:@"version"];
804 expr = [match oo_stringForKey:@"extensions"];
807 OOLog(
@"rendering.opengl.gpuSpecific",
@"Matched GPU configuration \"%@\
".", key);
811 return [NSDictionary dictionary];
817@implementation OOOpenGLExtensionManager (Singleton)
826+ (id)allocWithZone:(NSZone *)inZone
837- (id)copyWithZone:(NSZone *)inZone
849- (NSUInteger)retainCount
869static void OOBadOpenGLExtensionUsed(
void)
871 OOLog(
@"rendering.opengl.badExtension",
@"***** An uninitialized OpenGL extension function has been called, terminating. This is a serious error, please report it. *****");
OOShaderSetting OOShaderSettingFromString(NSString *string)
static OODebugMonitor * sSingleton
#define OOLog(class, format,...)
static NSString *const kOOLogOpenGLShaderSupport
static OOOpenGLExtensionManager * sSingleton
static NSArray * ArrayOfExtensions(NSString *extensionString)
static unsigned IntegerFromString(const GLubyte **ioString)
static BOOL CheckRegExps(NSString *string, id regexps)
NSComparisonResult CompareGPUSettingsByPriority(id a, id b, void *context)
void checkShadersSupported()
NSDictionary * dictionaryFromFilesNamed:inFolder:andMerge:(NSString *fileName,[inFolder] NSString *folderName,[andMerge] BOOL mergeFiles)