]> git.cworth.org Git - apitrace/blob - retrace/glws.cpp
Use skiplist-based FastCallSet within trace::CallSet
[apitrace] / retrace / glws.cpp
1 /**************************************************************************
2  *
3  * Copyright 2011 Jose Fonseca
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26
27 #include <assert.h>
28
29 #include "glproc.hpp"
30 #include "glws.hpp"
31
32
33 namespace glws {
34
35
36 bool
37 checkExtension(const char *extName, const char *extString)
38 {
39     assert(extName);
40     assert(extString);
41
42     const char *p = extString;
43     const char *q = extName;
44     char c;
45     do {
46         c = *p++;
47         if (c == '\0' || c == ' ') {
48             if (q && *q == '\0') {
49                 return true;
50             } else {
51                 q = extName;
52             }
53         } else {
54             if (q && *q == c) {
55                 ++q;
56             } else {
57                 q = 0;
58             }
59         }
60     } while (c);
61     return false;
62 }
63
64
65 bool
66 Context::hasExtension(const char *string) {
67     if (extensions.empty()) {
68         if (profile == PROFILE_CORE) {
69             // Use glGetStringi
70             GLint num_extensions = 0;
71             glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
72             for (int i = 0; i < num_extensions; ++i) {
73                 const char *extension = reinterpret_cast<const char *>(glGetStringi(GL_EXTENSIONS, i));
74                 if (extension) {
75                     extensions.insert(extension);
76                 }
77             }
78         } else {
79             // Use glGetString
80             const char *begin = reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS));
81             do {
82                 const char *end = begin;
83                 char c = *end;
84                 while (c != '\0' && c != ' ') {
85                     ++end;
86                     c = *end;
87                 }
88                 if (end != begin) {
89                     extensions.insert(std::string(begin, end));
90                 }
91                 
92                 if (c == '\0') {
93                     break;
94                 }
95                 begin = end + 1;
96             } while(1);
97         }
98     }
99
100     return extensions.find(string) != extensions.end();
101 }
102
103
104 } /* namespace glws */