blob: 46bb94d1b2ab6c753c44d8cdeb9cb7e01c91574a [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 Daniela782dcb2018-06-28 20:18:59 +00009
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 Daniela782dcb2018-06-28 20:18:59 +000035GrVkExtensions::GrVkExtensions(uint32_t instanceExtensionCount,
36 const char* const* instanceExtensions,
37 uint32_t deviceExtensionCount,
38 const char* const* deviceExtensions)
39 : fExtensionStrings() {
jvanverth633b3562016-03-23 11:01:22 -070040 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp;
jvanverthd2497f32016-03-18 12:39:05 -070041
Greg Daniela782dcb2018-06-28 20:18:59 +000042 for (uint32_t i = 0; i < instanceExtensionCount; ++i) {
43 const char* extension = instanceExtensions[i];
44 // if not already in the list, add it
45 if (find_string(fExtensionStrings, extension) < 0) {
46 fExtensionStrings.push_back() = extension;
47 SkTQSort(&fExtensionStrings.front(), &fExtensionStrings.back(), cmp);
jvanverth633b3562016-03-23 11:01:22 -070048 }
49 }
Greg Daniela782dcb2018-06-28 20:18:59 +000050 for (uint32_t i = 0; i < deviceExtensionCount; ++i) {
51 const char* extension = deviceExtensions[i];
52 // if not already in the list, add it
53 if (find_string(fExtensionStrings, extension) < 0) {
54 fExtensionStrings.push_back() = extension;
55 SkTQSort(&fExtensionStrings.front(), &fExtensionStrings.back(), cmp);
Greg Danielcb92b262018-06-27 15:03:36 +000056 }
Greg Danielcb92b262018-06-27 15:03:36 +000057 }
jvanverthfd7bd452016-03-25 06:29:52 -070058}
59
Greg Daniela782dcb2018-06-28 20:18:59 +000060GrVkExtensions::GrVkExtensions(uint32_t extensionFlags)
61 : fExtensionStrings() {
jvanverthfd7bd452016-03-25 06:29:52 -070062 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp;
63
Greg Daniela782dcb2018-06-28 20:18:59 +000064 SkTArray<const char*> extensionNames;
65 GetExtensionArrayFromFlags(extensionFlags, &extensionNames);
66 for (int i = 0; i < extensionNames.count(); ++i) {
67 // if not already in the list, add it
68 if (find_string(fExtensionStrings, extensionNames[i]) < 0) {
69 fExtensionStrings.push_back() = extensionNames[i];
70 SkTQSort(&fExtensionStrings.front(), &fExtensionStrings.back(), cmp);
jvanverth633b3562016-03-23 11:01:22 -070071 }
72 }
jvanverthd2497f32016-03-18 12:39:05 -070073}
74
Greg Daniela782dcb2018-06-28 20:18:59 +000075bool GrVkExtensions::hasExtension(const char ext[]) const {
76 return find_string(fExtensionStrings, ext) >= 0;
jvanverthd2497f32016-03-18 12:39:05 -070077}
78
Greg Daniela782dcb2018-06-28 20:18:59 +000079void GrVkExtensions::GetExtensionArrayFromFlags(uint32_t extensionFlags,
80 SkTArray<const char*>* extensions) {
81#ifdef SK_ENABLE_VK_LAYERS
82 if (extensionFlags & kEXT_debug_report_GrVkExtensionFlag) {
83 extensions->push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
84 }
85#endif
86 if (extensionFlags & kKHR_surface_GrVkExtensionFlag) {
87 extensions->push_back(VK_KHR_SURFACE_EXTENSION_NAME);
88 }
89 if (extensionFlags & kKHR_swapchain_GrVkExtensionFlag) {
90 extensions->push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
91 }
92#ifdef SK_BUILD_FOR_WIN
93 if (extensionFlags & kKHR_win32_surface_GrVkExtensionFlag) {
94 extensions->push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
95 }
96#elif defined(SK_BUILD_FOR_ANDROID)
97 if (extensionFlags & kKHR_android_surface_GrVkExtensionFlag) {
98 extensions->push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
99 }
100#elif defined(SK_BUILD_FOR_UNIX) && !defined(__Fuchsia__)
101 if (extensionFlags & kKHR_xcb_surface_GrVkExtensionFlag) {
102 extensions->push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
103 }
104#endif
105 // Device extensions
106 if (extensionFlags & kKHR_swapchain_GrVkExtensionFlag) {
107 extensions->push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
108 }
109 if (extensionFlags & kNV_glsl_shader_GrVkExtensionFlag) {
110 extensions->push_back("VK_NV_glsl_shader");
111 }
jvanverthd2497f32016-03-18 12:39:05 -0700112}
113