-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAnyGLHelpers.c
126 lines (113 loc) · 2.99 KB
/
AnyGLHelpers.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "gl.h"
#include <string.h>
#include <stdio.h>
static int majorVersion;
static int minorVersion;
void AnyGL_getGLVersion(int* major, int* minor, int* es)
{
if (major)
*major = majorVersion;
if (minor)
*minor = minorVersion;
if (es)
*es = ANYGL_GLES;
}
int AnyGL_atLeastVersion(int major, int minor, int es)
{
if ((es != 0) != (ANYGL_GLES != 0))
return 0;
if (majorVersion > major || (majorVersion == major && minorVersion >= minor))
return 1;
return 0;
}
int AnyGL_updateGLVersion(void)
{
if (!ANYGL_SUPPORTED(glGetIntegerv))
return 0;
majorVersion = 0;
minorVersion = 0;
glGetIntegerv(GL_MAJOR_VERSION, &majorVersion);
glGetIntegerv(GL_MINOR_VERSION, &minorVersion);
if (majorVersion == 0)
{
// This may have caused a GL error for older versions of OpenGL.
glGetError();
glGetError();
const char* version = (const char*)glGetString(GL_VERSION);
if (!version)
return 0;
if (sscanf(version, "%u.%u", &majorVersion, &minorVersion) != 2)
return 0;
}
return 1;
}
int AnyGL_queryExtension(const char* name)
{
if (ANYGL_SUPPORTED(glGetStringi))
{
GLint count = 0, i;
glGetIntegerv(GL_NUM_EXTENSIONS, &count);
for (i = 0; i < count; ++i)
{
if (strcmp((const char*)glGetStringi(GL_EXTENSIONS, i), name) == 0)
return 1;
}
return 0;
}
else if (ANYGL_SUPPORTED(glGetString))
{
const char* extensions = (const char*)glGetString(GL_EXTENSIONS);
size_t begin = 0, end = 0;
if (!extensions)
return 0;
while (extensions[begin])
{
for (end = begin; extensions[end] && extensions[end] != ' '; ++end)
/* empty */;
if (begin != end && strncmp(extensions + begin, name, end - begin) == 0)
return 1;
begin = extensions[end] == ' ' ? end + 1 : end;
}
return 0;
}
else
return 0;
}
const char* AnyGL_errorString(unsigned int error)
{
switch (error)
{
case GL_NO_ERROR:
return "GL_NO_ERROR";
case GL_INVALID_ENUM:
return "GL_INVALID_ENUM";
case GL_INVALID_VALUE:
return "GL_INVALID_VALUE";
case GL_INVALID_OPERATION:
return "GL_INVALID_OPERATION";
case GL_INVALID_FRAMEBUFFER_OPERATION:
return "GL_INVALID_FRAMEBUFFER_OPERATION";
case GL_OUT_OF_MEMORY:
return "GL_OUT_OF_MEMORY";
case GL_FRAMEBUFFER_COMPLETE:
return "GL_FRAMEBUFFER_COMPLETE";
case GL_FRAMEBUFFER_UNDEFINED:
return "GL_FRAMEBUFFER_UNDEFINED";
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT";
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
return "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER";
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
return "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER";
case GL_FRAMEBUFFER_UNSUPPORTED:
return "GL_FRAMEBUFFER_UNSUPPORTED";
case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
return "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE";
case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS:
return "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS";
default:
return "UNKNOWN";
}
}