Index: src/gpu/gl/GrGLExtensions.cpp |
=================================================================== |
--- src/gpu/gl/GrGLExtensions.cpp (revision 0) |
+++ src/gpu/gl/GrGLExtensions.cpp (revision 0) |
@@ -0,0 +1,79 @@ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "gl/GrGLExtensions.h" |
+#include "gl/GrGLDefines.h" |
+#include "gl/GrGLUtil.h" |
+ |
+bool GrGLExtensions::init(GrGLBinding binding, |
+ GrGLGetStringProc getString, |
+ GrGLGetStringiProc getStringi, |
+ GrGLGetIntegervProc getIntegerv) { |
+ fStrings.reset(); |
+ if (NULL == getString) { |
+ return false; |
+ } |
+ bool indexed = false; |
+ if (kDesktop_GrGLBinding == binding) { |
+ const GrGLubyte* verString = getString(GR_GL_VERSION); |
+ if (NULL == verString) { |
+ return false; |
+ } |
+ GrGLVersion version = GrGLGetVersionFromString((const char*) verString); |
+ indexed = version >= GR_GL_VER(3, 0); |
+ } |
+ if (indexed) { |
+ if (NULL == getStringi || NULL == getIntegerv) { |
+ return false; |
+ } |
+ GrGLint extensionCnt = 0; |
+ getIntegerv(GR_GL_NUM_EXTENSIONS, &extensionCnt); |
+ fStrings.push_back_n(extensionCnt); |
+ for (int i = 0; i < extensionCnt; ++i) { |
+ const char* ext = (const char*) getStringi(GR_GL_EXTENSIONS, i); |
+ fStrings[i] = ext; |
+ } |
+ } else { |
+ const char* extensions = (const char*) getString(GR_GL_EXTENSIONS); |
+ if (NULL == extensions) { |
+ return false; |
+ } |
+ // First count the extensions so that we don't cause the array to malloc multiple times. |
+ int extensionCnt = 1; |
+ const char* e = (const char*) extensions; |
+ while (NULL != (e = strchr(e+1, ' '))) { |
+ e += 1; |
+ ++extensionCnt; |
+ } |
+ fStrings.push_back_n(extensionCnt); |
+ |
+ int i = 0; |
+ while (true) { |
+ size_t length = strcspn(extensions, " "); |
+ GrAssert(i < extensionCnt); |
+ fStrings[i].set(extensions, length); |
+ ++i; |
+ if ('\0' == extensions[length]) { |
+ break; |
+ } |
+ extensions += length + 1; |
+ } |
+ GrAssert(i == extensionCnt); |
+ } |
+ return true; |
+} |
+ |
+bool GrGLExtensions::has(const char* ext) const { |
+ // TODO: Sort the extensions and binary search. |
+ int count = fStrings.count(); |
+ for (int i = 0; i < count; ++i) { |
+ if (fStrings[i].equals(ext)) { |
+ return true; |
+ } |
+ } |
+ return false; |
+} |