OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright 2013 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 | |
8 #include "gl/GrGLExtensions.h" | |
9 #include "gl/GrGLDefines.h" | |
10 #include "gl/GrGLUtil.h" | |
11 | |
12 bool GrGLExtensions::init(GrGLBinding binding, | |
13 GrGLGetStringProc getString, | |
14 GrGLGetStringiProc getStringi, | |
robertphillips
2013/02/26 21:06:07
getIntegerv?
bsalomon
2013/02/26 21:32:51
Done.
| |
15 GrGLGetIntegervProc getIntegeriv) { | |
16 fStrings.reset(); | |
17 if (NULL == getString) { | |
18 return false; | |
19 } | |
20 bool indexed = false; | |
21 if (kDesktop_GrGLBinding == binding) { | |
22 const GrGLubyte* verString = getString(GR_GL_VERSION); | |
23 if (NULL == verString) { | |
24 return false; | |
25 } | |
26 GrGLVersion version = GrGLGetVersionFromString((const char*) verString); | |
27 indexed = version >= GR_GL_VER(3, 0); | |
28 } | |
29 if (indexed) { | |
30 if (NULL == getStringi || NULL == getIntegeriv) { | |
31 return false; | |
32 } | |
33 GrGLint extensionCnt = 0; | |
34 getIntegeriv(GR_GL_NUM_EXTENSIONS, &extensionCnt); | |
35 fStrings.push_back_n(extensionCnt); | |
36 for (int i = 0; i < extensionCnt; ++i) { | |
37 const char* ext = (const char*) getStringi(GR_GL_EXTENSIONS, i); | |
38 fStrings[i] = ext; | |
39 } | |
40 } else { | |
41 const char* extensions = (const char*) getString(GR_GL_EXTENSIONS); | |
Jvsquare
2013/02/26 21:33:39
Not a huge deal since it's in an init function, bu
bsalomon
2013/02/26 21:38:46
True... I was thinking that the initial scan to ge
| |
42 if (NULL == extensions) { | |
43 return false; | |
44 } | |
45 int extensionCnt = 1; | |
46 const char* e = (const char*) extensions; | |
47 while (NULL != (e = strchr(e+1, ' '))) { | |
48 e += 1; | |
49 ++extensionCnt; | |
50 } | |
51 fStrings.push_back_n(extensionCnt); | |
52 int i = 0; | |
53 while (true) { | |
54 size_t length = strcspn(extensions, " "); | |
55 GrAssert(i < extensionCnt); | |
56 fStrings[i].set(extensions, length); | |
57 ++i; | |
58 if ('\0' == extensions[length]) { | |
59 break; | |
60 } | |
61 extensions += length + 1; | |
62 } | |
63 GrAssert(i == extensionCnt); | |
64 } | |
65 return true; | |
66 } | |
67 | |
68 bool GrGLExtensions::has(const char* ext) const { | |
69 // TODO: Sort the extensions and binary search. | |
70 int count = fStrings.count(); | |
71 for (int i = 0; i < count; ++i) { | |
72 if (fStrings[i].equals(ext)) { | |
73 return true; | |
74 } | |
75 } | |
76 return false; | |
77 } | |
OLD | NEW |