59static void OOBadOpenGLExtensionUsed(
void)
GCC_ATTR((noreturn, used));
63PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)&OOBadOpenGLExtensionUsed;
64PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)&OOBadOpenGLExtensionUsed;
65PFNGLUNIFORM1IARBPROC glUniform1iARB = (PFNGLUNIFORM1IARBPROC)&OOBadOpenGLExtensionUsed;
66PFNGLUNIFORM1FARBPROC glUniform1fARB = (PFNGLUNIFORM1FARBPROC)&OOBadOpenGLExtensionUsed;
67PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)&OOBadOpenGLExtensionUsed;
68PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)&OOBadOpenGLExtensionUsed;
69PFNGLUNIFORM4FVARBPROC glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)&OOBadOpenGLExtensionUsed;
70PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)&OOBadOpenGLExtensionUsed;
71PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)&OOBadOpenGLExtensionUsed;
72PFNGLGETINFOLOGARBPROC glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)&OOBadOpenGLExtensionUsed;
73PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)&OOBadOpenGLExtensionUsed;
74PFNGLATTACHOBJECTARBPROC glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)&OOBadOpenGLExtensionUsed;
75PFNGLDELETEOBJECTARBPROC glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)&OOBadOpenGLExtensionUsed;
76PFNGLLINKPROGRAMARBPROC glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)&OOBadOpenGLExtensionUsed;
77PFNGLCOMPILESHADERARBPROC glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)&OOBadOpenGLExtensionUsed;
78PFNGLSHADERSOURCEARBPROC glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)&OOBadOpenGLExtensionUsed;
79PFNGLUNIFORM2FVARBPROC glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)&OOBadOpenGLExtensionUsed;
80PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)&OOBadOpenGLExtensionUsed;
81PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)&OOBadOpenGLExtensionUsed;
82PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)&OOBadOpenGLExtensionUsed;
83PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)&OOBadOpenGLExtensionUsed;
84PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)&OOBadOpenGLExtensionUsed;
87#if OO_SHADERS || OO_MULTITEXTURE
88PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)&OOBadOpenGLExtensionUsed;
92PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)&OOBadOpenGLExtensionUsed;
96PFNGLGENBUFFERSARBPROC glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)&OOBadOpenGLExtensionUsed;
97PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)&OOBadOpenGLExtensionUsed;
98PFNGLBINDBUFFERARBPROC glBindBufferARB = (PFNGLBINDBUFFERARBPROC)&OOBadOpenGLExtensionUsed;
99PFNGLBUFFERDATAARBPROC glBufferDataARB = (PFNGLBUFFERDATAARBPROC)&OOBadOpenGLExtensionUsed;
103PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)&OOBadOpenGLExtensionUsed;
104PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)&OOBadOpenGLExtensionUsed;
105PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)&OOBadOpenGLExtensionUsed;
106PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)&OOBadOpenGLExtensionUsed;
107PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)&OOBadOpenGLExtensionUsed;
108PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)&OOBadOpenGLExtensionUsed;
109PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)&OOBadOpenGLExtensionUsed;
110PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)&OOBadOpenGLExtensionUsed;
111PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)&OOBadOpenGLExtensionUsed;
112PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)&OOBadOpenGLExtensionUsed;
113PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)&OOBadOpenGLExtensionUsed;
114PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)&OOBadOpenGLExtensionUsed;
115PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)&OOBadOpenGLExtensionUsed;
116PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)&OOBadOpenGLExtensionUsed;
117PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)&OOBadOpenGLExtensionUsed;
118PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)&OOBadOpenGLExtensionUsed;
119PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)&OOBadOpenGLExtensionUsed;
120PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)&OOBadOpenGLExtensionUsed;
121PFNGLGENBUFFERSPROC glGenBuffers = (PFNGLGENBUFFERSPROC)&OOBadOpenGLExtensionUsed;
122PFNGLBINDVERTEXARRAYPROC glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)&OOBadOpenGLExtensionUsed;
123PFNGLBINDBUFFERPROC glBindBuffer = (PFNGLBINDBUFFERPROC)&OOBadOpenGLExtensionUsed;
124PFNGLBUFFERDATAPROC glBufferData = (PFNGLBUFFERDATAPROC)&OOBadOpenGLExtensionUsed;
125PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)&OOBadOpenGLExtensionUsed;
126PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)&OOBadOpenGLExtensionUsed;
127PFNGLUSEPROGRAMPROC glUseProgram = (PFNGLUSEPROGRAMPROC)&OOBadOpenGLExtensionUsed;
128PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)&OOBadOpenGLExtensionUsed;
129PFNGLUNIFORM1IPROC glUniform1i = (PFNGLUNIFORM1IPROC)&OOBadOpenGLExtensionUsed;
130PFNGLACTIVETEXTUREPROC glActiveTexture = (PFNGLACTIVETEXTUREPROC)&OOBadOpenGLExtensionUsed;
131PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)&OOBadOpenGLExtensionUsed;
132PFNGLUNIFORM1FPROC glUniform1f = (PFNGLUNIFORM1FPROC)&OOBadOpenGLExtensionUsed;
133PFNGLUNIFORM2FVPROC glUniform2fv = (PFNGLUNIFORM2FVPROC)&OOBadOpenGLExtensionUsed;
134PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)&OOBadOpenGLExtensionUsed;
135PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)&OOBadOpenGLExtensionUsed;
136PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)&OOBadOpenGLExtensionUsed;
137PFNGLDELETEBUFFERSPROC glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)&OOBadOpenGLExtensionUsed;
138PFNGLDRAWBUFFERSPROC glDrawBuffers = (PFNGLDRAWBUFFERSPROC)&OOBadOpenGLExtensionUsed;
139PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)&OOBadOpenGLExtensionUsed;
140PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)&OOBadOpenGLExtensionUsed;
141PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)&OOBadOpenGLExtensionUsed;
142PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)&OOBadOpenGLExtensionUsed;
143PFNGLCLAMPCOLORPROC glClampColor = (PFNGLCLAMPCOLORPROC)&OOBadOpenGLExtensionUsed;
158@interface OOOpenGLExtensionManager (OOPrivate)
165- (void)checkVBOSupported;
169- (void)checkFBOSupported;
172#if GL_ARB_texture_env_combine
173- (void)checkTextureCombinersSupported;
176- (NSDictionary *) lookUpPerGPUSettingsWithVersionString:(NSString *)version extensionsString:(NSString *)extensionsStr;
183 NSArray *components = [extensionString componentsSeparatedByString:@" "];
184 NSMutableArray *result = [NSMutableArray arrayWithCapacity:[components count]];
185 NSString *extStr =
nil;
186 foreach (extStr, components)
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 (%llu):\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;
370- (BOOL)shadersForceDisabled
373 return shadersForceDisabled;
414- (GLint)textureImageUnitCount
417 return textureImageUnitCount;
444- (BOOL)textureCombinersSupported
447 return textureCombinersSupported;
454- (GLint)textureUnitCount
457 return textureUnitCount;
464- (NSUInteger)majorVersionNumber
470- (NSUInteger)minorVersionNumber
476- (NSUInteger)releaseVersionNumber
482- (void)getVersionMajor:(
unsigned *)outMajor minor:(
unsigned *)outMinor release:(
unsigned *)outRelease
484 if (outMajor != NULL) *outMajor = major;
485 if (outMinor != NULL) *outMinor = minor;
486 if (outRelease != NULL) *outRelease = release;
490- (BOOL) versionIsAtLeastMajor:(
unsigned)maj minor:(
unsigned)min
492 return major > maj || (major == maj && minor >= min);
496- (NSString *) vendorString
502- (NSString *) rendererString
508- (BOOL) usePointSmoothing
510 return usePointSmoothing;
514- (BOOL) useLineSmoothing
516 return useLineSmoothing;
520- (BOOL) useDustShader
522 return useDustShader;
533 const GLubyte *curr = *ioString;
535 while (
'0' <= *curr && *curr <=
'9')
537 result = result * 10 + *curr++ -
'0';
545@implementation OOOpenGLExtensionManager (OOPrivate)
556 shadersAvailable = NO;
557 shadersForceDisabled = NO;
564 NSArray *arguments = [[NSProcessInfo processInfo] arguments];
567 foreach (arg, arguments)
569 if ([arg isEqual:
@"-noshaders"] || [arg isEqual:
@"--noshaders"])
571 shadersForceDisabled = YES;
577 NSString *
const requiredExtension[] =
579 @"GL_ARB_shading_language_100",
580 @"GL_ARB_fragment_shader",
581 @"GL_ARB_vertex_shader",
582 @"GL_ARB_multitexture",
583 @"GL_ARB_shader_objects",
586 NSString *
const *required = NULL;
588 for (required = requiredExtension; *required !=
nil; ++required)
590 if (![
self haveExtension:*required])
598 glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)wglGetProcAddress(
"glGetObjectParameterivARB");
599 glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)wglGetProcAddress(
"glCreateShaderObjectARB");
600 glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)wglGetProcAddress(
"glGetInfoLogARB");
601 glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)wglGetProcAddress(
"glCreateProgramObjectARB");
602 glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)wglGetProcAddress(
"glAttachObjectARB");
603 glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)wglGetProcAddress(
"glDeleteObjectARB");
604 glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)wglGetProcAddress(
"glLinkProgramARB");
605 glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)wglGetProcAddress(
"glCompileShaderARB");
606 glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)wglGetProcAddress(
"glShaderSourceARB");
607 glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)wglGetProcAddress(
"glUseProgramObjectARB");
608 glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress(
"glActiveTextureARB");
609 glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)wglGetProcAddress(
"glGetUniformLocationARB");
610 glUniform1iARB = (PFNGLUNIFORM1IARBPROC)wglGetProcAddress(
"glUniform1iARB");
611 glUniform1fARB = (PFNGLUNIFORM1FARBPROC)wglGetProcAddress(
"glUniform1fARB");
612 glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)wglGetProcAddress(
"glUniformMatrix3fvARB");
613 glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)wglGetProcAddress(
"glUniformMatrix4fvARB");
614 glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)wglGetProcAddress(
"glUniform4fvARB");
615 glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)wglGetProcAddress(
"glUniform2fvARB");
616 glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)wglGetProcAddress(
"glBindAttribLocationARB");
617 glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)wglGetProcAddress(
"glEnableVertexAttribArrayARB");
618 glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)wglGetProcAddress(
"glVertexAttribPointerARB");
619 glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)wglGetProcAddress(
"glDisableVertexAttribArrayARB");
620 glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)wglGetProcAddress(
"glValidateProgramARB");
623 glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &textureImageUnitCount);
625 shadersAvailable = YES;
631- (void)checkVBOSupported
635 if ([
self versionIsAtLeastMajor:1 minor:5] || [
self haveExtension:
@"GL_ARB_vertex_buffer_object"])
643 glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress(
"glGenBuffersARB");
644 glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)wglGetProcAddress(
"glDeleteBuffersARB");
645 glBindBufferARB = (PFNGLBINDBUFFERARBPROC)wglGetProcAddress(
"glBindBufferARB");
646 glBufferDataARB = (PFNGLBUFFERDATAARBPROC)wglGetProcAddress(
"glBufferDataARB");
654- (void)checkFBOSupported
658 if ([
self haveExtension:
@"GL_EXT_framebuffer_object"])
666 glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)wglGetProcAddress(
"glGenFramebuffersEXT");
667 glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)wglGetProcAddress(
"glBindFramebufferEXT");
668 glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)wglGetProcAddress(
"glGenRenderbuffersEXT");
669 glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)wglGetProcAddress(
"glBindRenderbufferEXT");
670 glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)wglGetProcAddress(
"glRenderbufferStorageEXT");
671 glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)wglGetProcAddress(
"glFramebufferRenderbufferEXT");
672 glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)wglGetProcAddress(
"glFramebufferTexture2DEXT");
673 glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)wglGetProcAddress(
"glCheckFramebufferStatusEXT");
674 glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)wglGetProcAddress(
"glDeleteFramebuffersEXT");
675 glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)wglGetProcAddress(
"glDeleteRenderbuffersEXT");
676 glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress(
"glGenRenderbuffers");
677 glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress (
"glBindRenderbuffer" );
678 glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress (
"glRenderbufferStorage" );
679 glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress (
"glGenFramebuffers" );
680 glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)wglGetProcAddress (
"glBindFramebuffer" );
681 glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)wglGetProcAddress (
"glFramebufferRenderbuffer" );
682 glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress (
"glFramebufferTexture2D" );
683 glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)wglGetProcAddress (
"glGenVertexArrays" );
684 glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress (
"glGenBuffers" );
685 glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)wglGetProcAddress (
"glBindVertexArray" );
686 glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress (
"glBindBuffer" );
687 glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress (
"glBufferData" );
688 glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress (
"glVertexAttribPointer" );
689 glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress (
"glEnableVertexAttribArray" );
690 glUseProgram = (PFNGLUSEPROGRAMPROC) wglGetProcAddress (
"glUseProgram" );
691 glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress (
"glGetUniformLocation" );
692 glUniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress (
"glUniform1i" );
693 glActiveTexture = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress (
"glActiveTexture" );
694 glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)wglGetProcAddress (
"glBlendFuncSeparate" );
695 glUniform1f = (PFNGLUNIFORM1FPROC)wglGetProcAddress (
"glUniform1f" );
696 glUniform2fv = (PFNGLUNIFORM2FVPROC)wglGetProcAddress (
"glUniform2fv" );
697 glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)wglGetProcAddress (
"glDeleteRenderbuffer" );
698 glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress (
"glDeleteFramebuffers" );
699 glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)wglGetProcAddress (
"glDeleteVertexArrays" );
700 glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress (
"glDeleteBuffers" );
701 glDrawBuffers = (PFNGLDRAWBUFFERSPROC)wglGetProcAddress (
"glDrawBuffers" );
702 glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)wglGetProcAddress (
"glCheckFramebufferStatus" );
703 glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)wglGetProcAddress (
"glTexImage2DMultisample" );
704 glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)wglGetProcAddress (
"glRenderbufferStorageMultisample" );
705 glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)wglGetProcAddress (
"glBlitFramebuffer" );
706 glClampColor = (PFNGLCLAMPCOLORPROC)wglGetProcAddress (
"glClampColor" );
714- (void)checkTextureCombinersSupported
716 textureCombinersSupported = [
self haveExtension:@"GL_ARB_texture_env_combine"];
718 if (textureCombinersSupported)
720 OOGL(glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &textureUnitCount));
724 glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress(
"glActiveTextureARB");
726 glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)wglGetProcAddress(
"glClientActiveTextureARB");
731 textureUnitCount = 1;
741 if (regexps ==
nil)
return YES;
742 if ([regexps isKindOfClass:[NSString class]])
744 return [string oo_matchesRegularExpression:regexps];
746 if ([regexps isKindOfClass:[NSArray class]])
748 NSEnumerator *regexpEnum =
nil;
749 NSString *regexp =
nil;
751 for (regexpEnum = [regexps objectEnumerator]; (regexp = [regexpEnum nextObject]); )
753 if (
EXPECT_NOT(![regexp isKindOfClass:[NSString class]]))
759 if (![
string oo_matchesRegularExpression:regexp])
return NO;
773 NSDictionary *configurations = context;
774 NSDictionary *dictA = [configurations oo_dictionaryForKey:keyA];
775 NSDictionary *dictB = [configurations oo_dictionaryForKey:keyB];
776 double precedenceA = [dictA oo_doubleForKey:@"precedence" defaultValue:1];
777 double precedenceB = [dictB oo_doubleForKey:@"precedence" defaultValue:1];
779 if (precedenceA > precedenceB)
return NSOrderedAscending;
780 if (precedenceA < precedenceB)
return NSOrderedDescending;
782 return [keyA caseInsensitiveCompare:keyB];
786- (NSDictionary *) lookUpPerGPUSettingsWithVersionString:(NSString *)versionStr extensionsString:(NSString *)extensionsStr
792 NSArray *keys = [[configurations allKeys] sortedArrayUsingFunction:CompareGPUSettingsByPriority context:configurations];
795 NSDictionary *config =
nil;
799 config = [configurations oo_dictionaryForKey:key];
802 NSDictionary *match = [config oo_dictionaryForKey:@"match"];
803 NSString *expr =
nil;
805 expr = [match objectForKey:@"vendor"];
808 expr = [match oo_stringForKey:@"renderer"];
811 expr = [match oo_stringForKey:@"version"];
814 expr = [match oo_stringForKey:@"extensions"];
817 OOLog(
@"rendering.opengl.gpuSpecific",
@"Matched GPU configuration \"%@\
".", key);
821 return [NSDictionary dictionary];
827@implementation OOOpenGLExtensionManager (Singleton)
836+ (id)allocWithZone:(NSZone *)inZone
847- (id)copyWithZone:(NSZone *)inZone
859- (NSUInteger)retainCount
879static void OOBadOpenGLExtensionUsed(
void)
881 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)