]> git.tdb.fi Git - libs/gl.git/blob - source/core/backend.cpp
Make backend idenfication more generic
[libs/gl.git] / source / core / backend.cpp
1 #include <stdexcept>
2 #include <cstdlib>
3 #include <msp/strings/lexicalcast.h>
4 #include <msp/strings/utils.h>
5 #include "backend.h"
6 #include "gl.h"
7
8 using namespace std;
9
10 namespace Msp {
11 namespace GL {
12
13 Version::Version()
14 {
15         major = 0;
16         minor = 0;
17 }
18
19 Version::Version(unsigned short a, unsigned short i)
20 {
21         major = a;
22         minor = i;
23 }
24
25 Version::Version(const string &s)
26 {
27         vector<string> parts = split(s, '.');
28         major = lexical_cast<unsigned>(parts[0]);
29         minor = lexical_cast<unsigned>(parts[1]);
30 }
31
32 bool Version::operator>=(const Version &other) const
33 {
34         return major>other.major || (major==other.major && minor>=other.minor);
35 }
36
37
38 GraphicsApi get_backend_api()
39 {
40 #ifdef GL_ES_VERSION_2_0
41         return OPENGL_ES;
42 #else
43         return OPENGL;
44 #endif
45 }
46
47 inline Version get_gl_version()
48 {
49         const char *gl_ver_ptr = reinterpret_cast<const char *>(glGetString(GL_VERSION));
50         if(!gl_ver_ptr)
51                 throw runtime_error("OpenGL version not available");
52
53         string gl_ver = gl_ver_ptr;
54         if(!gl_ver.compare(0, 10, "OpenGL ES "))
55                 gl_ver.erase(0, 10);
56
57         Version ver(gl_ver.substr(0, gl_ver.find(' ')));
58
59         if(const char *force_ver_ptr = getenv("MSPGL_FORCE_VERSION"))
60         {
61                 Version force_ver(force_ver_ptr);
62                 if(force_ver<ver)
63                         ver = force_ver;
64         }
65
66         return ver;
67 }
68
69 const Version &get_backend_version()
70 {
71         static Version version = get_gl_version();
72         return version;
73 }
74
75 } // namespace GL
76 } // namespace Msp