blob: 6cc20e6560aaaf1d2761caa07d8f372e87b44d0b [file] [log] [blame]
jvanverthd2497f32016-03-18 12:39:05 -07001/*
2 * Copyright 2016 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 "vk/GrVkExtensions.h"
Greg Daniel98bffae2018-08-01 13:25:41 -04009
10// Can remove this once we get rid of the extension flags.
11#include "vk/GrVkBackendContext.h"
jvanverthd2497f32016-03-18 12:39:05 -070012
13#include "SkTSearch.h"
14#include "SkTSort.h"
15
16namespace { // This cannot be static because it is used as a template parameter.
17inline bool extension_compare(const SkString& a, const SkString& b) {
18 return strcmp(a.c_str(), b.c_str()) < 0;
19}
20}
21
22// finds the index of ext in strings or a negative result if ext is not found.
23static int find_string(const SkTArray<SkString>& strings, const char ext[]) {
24 if (strings.empty()) {
25 return -1;
26 }
27 SkString extensionStr(ext);
28 int idx = SkTSearch<SkString, extension_compare>(&strings.front(),
29 strings.count(),
30 extensionStr,
31 sizeof(SkString));
32 return idx;
33}
34
Greg Daniel98bffae2018-08-01 13:25:41 -040035void GrVkExtensions::init(uint32_t instanceExtensionCount,
36 const char* const* instanceExtensions,
37 uint32_t deviceExtensionCount,
38 const char* const* deviceExtensions) {
jvanverth633b3562016-03-23 11:01:22 -070039 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp;
jvanverthd2497f32016-03-18 12:39:05 -070040
Greg Daniel98bffae2018-08-01 13:25:41 -040041 for (uint32_t i = 0; i < instanceExtensionCount; ++i) {
42 const char* extension = instanceExtensions[i];
43 // if not already in the list, add it
44 if (find_string(fExtensionStrings, extension) < 0) {
45 fExtensionStrings.push_back() = extension;
46 SkTQSort(&fExtensionStrings.front(), &fExtensionStrings.back(), cmp);
jvanverth633b3562016-03-23 11:01:22 -070047 }
48 }
Greg Daniel98bffae2018-08-01 13:25:41 -040049 for (uint32_t i = 0; i < deviceExtensionCount; ++i) {
50 const char* extension = deviceExtensions[i];
51 // if not already in the list, add it
52 if (find_string(fExtensionStrings, extension) < 0) {
53 fExtensionStrings.push_back() = extension;
54 SkTQSort(&fExtensionStrings.front(), &fExtensionStrings.back(), cmp);
Greg Danieldc13c212018-06-28 23:29:35 +000055 }
Greg Danieldc13c212018-06-28 23:29:35 +000056 }
jvanverthfd7bd452016-03-25 06:29:52 -070057}
58
Greg Daniel98bffae2018-08-01 13:25:41 -040059bool GrVkExtensions::hasExtension(const char ext[]) const {
60 return find_string(fExtensionStrings, ext) >= 0;
jvanverthd2497f32016-03-18 12:39:05 -070061}
62