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