1// 2// CGLInfo.m 3// celestia 4// 5// Created by Bob Ippolito on Wed Jun 26 2002. 6// 2005-05 Modified substantially by Da Woon Jung 7// 8 9#import "CGLInfo.h" 10#import <OpenGL/OpenGL.h> 11#import <OpenGL/gl.h> 12#import <OpenGL/glext.h> 13 14#ifndef GL_SHADING_LANGUAGE_VERSION_ARB 15#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C 16#endif 17 18static char *gExtensions; 19 20#define ENDL [result appendString:@"\n"] 21 22// Function taken from glext.cpp, so we don't have to compile 23// this whole file as Obj-C++ 24static BOOL ExtensionSupported(const char *ext) 25{ 26 if (gExtensions == nil) 27 return false; 28 29 char *extensions = gExtensions; 30 int len = strlen(ext); 31 for (;;) { 32 if (strncmp(extensions, ext, len) == 0) 33 return YES; 34 extensions = strchr(extensions, ' '); 35 if (extensions != nil) 36 ++extensions; 37 else 38 break; 39 } 40 41 return NO; 42} 43 44static NSString *queryGLInteger(GLenum e, NSString *desc) 45{ 46 GLint r = 0; 47 NSString *result; 48 49 glGetIntegerv(e, &r); 50// if (glGetError()) 51// result = [NSString stringWithFormat:NSLocalizedString(@"%@: --not available--",""), desc]; 52// else 53 result = [NSString stringWithFormat: NSLocalizedString(@"%@: %d",""), desc, r]; 54 55 return result; 56} 57 58static NSString *queryGLExtension(const char *extName) 59{ 60 return [NSString stringWithFormat: NSLocalizedString(@"%s: %@",""), extName, (ExtensionSupported(extName) ? NSLocalizedString(@"Supported","") : @"-")]; 61} 62 63 64@implementation CGLInfo 65 66+(NSString *)info 67{ 68 NSMutableString *result = [NSMutableString string]; 69 gExtensions = (char *) glGetString(GL_EXTENSIONS); 70 71 [result appendString: 72 [NSString stringWithFormat:NSLocalizedString(@"Vendor: %@",""), 73 [NSString stringWithUTF8String:(const char *)glGetString (GL_VENDOR)]]]; ENDL; 74 [result appendString: 75 [NSString stringWithFormat:NSLocalizedString(@"Renderer: %@",""), [NSString stringWithUTF8String:(const char *)glGetString (GL_RENDERER)]]]; ENDL; 76 [result appendString: 77 [NSString stringWithFormat:NSLocalizedString(@"Version: %@",""), [NSString stringWithUTF8String:(const char *)glGetString (GL_VERSION)]]]; ENDL; 78 79 if (ExtensionSupported("GL_ARB_shading_language_100")) 80 { 81 NSString *glslVersion = [NSString stringWithUTF8String: 82 (const char *)glGetString (0x8B8C)]; 83 if (glslVersion) 84 { 85 [result appendString: 86 [NSString stringWithFormat: @"%@%@", 87 NSLocalizedStringFromTable(@"GLSL version: ",@"po",""), 88 glslVersion] 89 ]; ENDL; 90 } 91 } 92 93 ENDL; 94 95 [result appendString: 96 (ExtensionSupported("GL_ARB_multitexture") ? 97 queryGLInteger(GL_MAX_TEXTURE_UNITS_ARB, NSLocalizedString(@"Max simultaneous textures","")) : 98 [NSString stringWithFormat: [NSString stringWithFormat: @"%@: 1", NSLocalizedString(@"Max simultaneous textures","")]])]; ENDL; 99 [result appendString: queryGLInteger(GL_MAX_TEXTURE_SIZE, NSLocalizedString(@"Max texture size",""))]; ENDL; 100 101 if (ExtensionSupported("GL_ARB_texture_cube_map")) 102 { 103 GLint maxCubeMapSize = 0; 104 glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, &maxCubeMapSize); 105 [result appendString: 106 [NSString stringWithFormat: @"%@%d", 107 NSLocalizedStringFromTable(@"Max cube map size: ",@"po",""), 108 maxCubeMapSize] 109 ]; ENDL; 110 } 111 112 GLfloat pointSizeRange[2]; 113 glGetFloatv(GL_POINT_SIZE_RANGE, pointSizeRange); 114 [result appendString: 115 [NSString stringWithFormat: @"%@%f - %f", 116 NSLocalizedStringFromTable(@"Point size range: ",@"po",""), 117 pointSizeRange[0], pointSizeRange[1]] 118 ]; ENDL; 119 120 ENDL; 121 122 [result appendString: NSLocalizedString(@"Extensions:","")]; ENDL; 123 [result appendString: queryGLExtension("GL_ARB_vertex_buffer_object")]; ENDL; 124 [result appendString: queryGLExtension("GL_ARB_texture_compression")]; ENDL; 125 [result appendString: queryGLExtension("GL_EXT_texture_compression_s3tc")]; ENDL; 126 [result appendString: queryGLExtension("GL_ARB_texture_border_clamp")]; ENDL; 127 [result appendString: queryGLExtension("GL_EXT_texture_edge_clamp")]; ENDL; 128 [result appendString: queryGLExtension("GL_ARB_texture_cube_map")]; ENDL; 129 [result appendString: queryGLExtension("GL_SGIS_generate_mipmap")]; ENDL; 130 [result appendString: queryGLExtension("GL_EXT_rescale_normal")]; ENDL; 131 [result appendString: queryGLExtension("GL_ARB_point_sprite")]; ENDL; 132 133 ENDL; 134 135 [result appendString: queryGLExtension("GL_ARB_vertex_program")]; ENDL; 136 [result appendString: queryGLExtension("GL_NV_vertex_program")]; ENDL; 137 [result appendString: queryGLExtension("GL_NV_fragment_program")]; ENDL; 138 [result appendString: queryGLExtension("GL_NV_register_combiners")]; ENDL; 139 [result appendString: queryGLExtension("GL_ARB_texture_env_dot3")]; ENDL; 140 [result appendString: queryGLExtension("GL_ARB_texture_env_combine")]; ENDL; 141 [result appendString: queryGLExtension("GL_EXT_texture_env_combine")]; ENDL; 142 143 [result appendString: queryGLExtension("GL_ARB_shading_language_100")]; ENDL; 144 [result appendString: queryGLExtension("GL_ARB_shader_objects")]; ENDL; 145 [result appendString: queryGLExtension("GL_ARB_vertex_shader")]; ENDL; 146 [result appendString: queryGLExtension("GL_ARB_fragment_shader")]; ENDL; 147 148 return result; 149} 150@end 151