OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "vk/GrVkExtensions.h" | 8 #include "vk/GrVkExtensions.h" |
9 #include "vk/GrVkUtil.h" | 9 #include "vk/GrVkUtil.h" |
10 | 10 |
(...skipping 14 matching lines...) Expand all Loading... |
25 SkString extensionStr(ext); | 25 SkString extensionStr(ext); |
26 int idx = SkTSearch<SkString, extension_compare>(&strings.front(), | 26 int idx = SkTSearch<SkString, extension_compare>(&strings.front(), |
27 strings.count(), | 27 strings.count(), |
28 extensionStr, | 28 extensionStr, |
29 sizeof(SkString)); | 29 sizeof(SkString)); |
30 return idx; | 30 return idx; |
31 } | 31 } |
32 | 32 |
33 #define GET_PROC_LOCAL(inst, F) PFN_vk ## F F = (PFN_vk ## F) vkGetInstanceProcA
ddr(inst, "vk" #F) | 33 #define GET_PROC_LOCAL(inst, F) PFN_vk ## F F = (PFN_vk ## F) vkGetInstanceProcA
ddr(inst, "vk" #F) |
34 | 34 |
| 35 static uint32_t remove_patch_version(uint32_t specVersion) { |
| 36 return (specVersion >> 12) << 12; |
| 37 } |
| 38 |
35 bool GrVkExtensions::initInstance(uint32_t specVersion) { | 39 bool GrVkExtensions::initInstance(uint32_t specVersion) { |
| 40 uint32_t nonPatchVersion = remove_patch_version(specVersion); |
36 | 41 |
37 GET_PROC_LOCAL(nullptr, EnumerateInstanceExtensionProperties); | 42 GET_PROC_LOCAL(nullptr, EnumerateInstanceExtensionProperties); |
38 GET_PROC_LOCAL(nullptr, EnumerateInstanceLayerProperties); | 43 GET_PROC_LOCAL(nullptr, EnumerateInstanceLayerProperties); |
39 | 44 |
40 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; | 45 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; |
41 | 46 |
42 if (!EnumerateInstanceExtensionProperties || | 47 if (!EnumerateInstanceExtensionProperties || |
43 !EnumerateInstanceLayerProperties) { | 48 !EnumerateInstanceLayerProperties) { |
44 return false; | 49 return false; |
45 } | 50 } |
46 | 51 |
47 // instance layers | 52 // instance layers |
48 uint32_t layerCount = 0; | 53 uint32_t layerCount = 0; |
49 VkResult res = EnumerateInstanceLayerProperties(&layerCount, nullptr); | 54 VkResult res = EnumerateInstanceLayerProperties(&layerCount, nullptr); |
50 if (VK_SUCCESS != res) { | 55 if (VK_SUCCESS != res) { |
51 return false; | 56 return false; |
52 } | 57 } |
53 VkLayerProperties* layers = new VkLayerProperties[layerCount]; | 58 VkLayerProperties* layers = new VkLayerProperties[layerCount]; |
54 res = EnumerateInstanceLayerProperties(&layerCount, layers); | 59 res = EnumerateInstanceLayerProperties(&layerCount, layers); |
55 if (VK_SUCCESS != res) { | 60 if (VK_SUCCESS != res) { |
56 delete[] layers; | 61 delete[] layers; |
57 return false; | 62 return false; |
58 } | 63 } |
59 for (uint32_t i = 0; i < layerCount; ++i) { | 64 for (uint32_t i = 0; i < layerCount; ++i) { |
60 if (specVersion >= layers[i].specVersion) { | 65 if (nonPatchVersion >= remove_patch_version(layers[i].specVersion)) { |
61 fInstanceLayerStrings->push_back() = layers[i].layerName; | 66 fInstanceLayerStrings->push_back() = layers[i].layerName; |
62 } | 67 } |
63 } | 68 } |
64 delete[] layers; | 69 delete[] layers; |
65 if (!fInstanceLayerStrings->empty()) { | 70 if (!fInstanceLayerStrings->empty()) { |
66 SkTQSort(&fInstanceLayerStrings->front(), &fInstanceLayerStrings->back()
, cmp); | 71 SkTQSort(&fInstanceLayerStrings->front(), &fInstanceLayerStrings->back()
, cmp); |
67 } | 72 } |
68 | 73 |
69 // instance extensions | 74 // instance extensions |
70 // via Vulkan implementation and implicitly enabled layers | 75 // via Vulkan implementation and implicitly enabled layers |
71 uint32_t extensionCount = 0; | 76 uint32_t extensionCount = 0; |
72 res = EnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr
); | 77 res = EnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr
); |
73 if (VK_SUCCESS != res) { | 78 if (VK_SUCCESS != res) { |
74 return false; | 79 return false; |
75 } | 80 } |
76 VkExtensionProperties* extensions = new VkExtensionProperties[extensionCount
]; | 81 VkExtensionProperties* extensions = new VkExtensionProperties[extensionCount
]; |
77 res = EnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensi
ons); | 82 res = EnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensi
ons); |
78 if (VK_SUCCESS != res) { | 83 if (VK_SUCCESS != res) { |
79 delete[] extensions; | 84 delete[] extensions; |
80 return false; | 85 return false; |
81 } | 86 } |
82 for (uint32_t i = 0; i < extensionCount; ++i) { | 87 for (uint32_t i = 0; i < extensionCount; ++i) { |
83 if (specVersion >= extensions[i].specVersion) { | 88 if (nonPatchVersion >= remove_patch_version(extensions[i].specVersion))
{ |
84 fInstanceExtensionStrings->push_back() = extensions[i].extensionName
; | 89 fInstanceExtensionStrings->push_back() = extensions[i].extensionName
; |
85 } | 90 } |
86 } | 91 } |
87 delete [] extensions; | 92 delete [] extensions; |
88 // sort so we can search | 93 // sort so we can search |
89 if (!fInstanceExtensionStrings->empty()) { | 94 if (!fInstanceExtensionStrings->empty()) { |
90 SkTQSort(&fInstanceExtensionStrings->front(), &fInstanceExtensionStrings
->back(), cmp); | 95 SkTQSort(&fInstanceExtensionStrings->front(), &fInstanceExtensionStrings
->back(), cmp); |
91 } | 96 } |
92 // via explicitly enabled layers | 97 // via explicitly enabled layers |
93 layerCount = fInstanceLayerStrings->count(); | 98 layerCount = fInstanceLayerStrings->count(); |
94 for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex) { | 99 for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex) { |
95 uint32_t extensionCount = 0; | 100 uint32_t extensionCount = 0; |
96 res = EnumerateInstanceExtensionProperties((*fInstanceLayerStrings)[laye
rIndex].c_str(), | 101 res = EnumerateInstanceExtensionProperties((*fInstanceLayerStrings)[laye
rIndex].c_str(), |
97 &extensionCount, nullptr); | 102 &extensionCount, nullptr); |
98 if (VK_SUCCESS != res) { | 103 if (VK_SUCCESS != res) { |
99 return false; | 104 return false; |
100 } | 105 } |
101 VkExtensionProperties* extensions = new VkExtensionProperties[extensionC
ount]; | 106 VkExtensionProperties* extensions = new VkExtensionProperties[extensionC
ount]; |
102 res = EnumerateInstanceExtensionProperties((*fInstanceLayerStrings)[laye
rIndex].c_str(), | 107 res = EnumerateInstanceExtensionProperties((*fInstanceLayerStrings)[laye
rIndex].c_str(), |
103 &extensionCount, extensions); | 108 &extensionCount, extensions); |
104 if (VK_SUCCESS != res) { | 109 if (VK_SUCCESS != res) { |
105 delete[] extensions; | 110 delete[] extensions; |
106 return false; | 111 return false; |
107 } | 112 } |
108 for (uint32_t i = 0; i < extensionCount; ++i) { | 113 for (uint32_t i = 0; i < extensionCount; ++i) { |
109 // if not already in the list, add it | 114 // if not already in the list, add it |
110 if (specVersion >= extensions[i].specVersion && | 115 if (nonPatchVersion >= remove_patch_version(extensions[i].specVersio
n) && |
111 find_string(*fInstanceExtensionStrings, extensions[i].extensionN
ame) < 0) { | 116 find_string(*fInstanceExtensionStrings, extensions[i].extensionN
ame) < 0) { |
112 fInstanceExtensionStrings->push_back() = extensions[i].extension
Name; | 117 fInstanceExtensionStrings->push_back() = extensions[i].extension
Name; |
113 SkTQSort(&fInstanceExtensionStrings->front(), &fInstanceExtensio
nStrings->back(), | 118 SkTQSort(&fInstanceExtensionStrings->front(), &fInstanceExtensio
nStrings->back(), |
114 cmp); | 119 cmp); |
115 } | 120 } |
116 } | 121 } |
117 delete[] extensions; | 122 delete[] extensions; |
118 } | 123 } |
119 | 124 |
120 return true; | 125 return true; |
121 } | 126 } |
122 | 127 |
123 bool GrVkExtensions::initDevice(uint32_t specVersion, VkInstance inst, VkPhysica
lDevice physDev) { | 128 bool GrVkExtensions::initDevice(uint32_t specVersion, VkInstance inst, VkPhysica
lDevice physDev) { |
| 129 uint32_t nonPatchVersion = remove_patch_version(specVersion); |
124 | 130 |
125 GET_PROC_LOCAL(inst, EnumerateDeviceExtensionProperties); | 131 GET_PROC_LOCAL(inst, EnumerateDeviceExtensionProperties); |
126 GET_PROC_LOCAL(inst, EnumerateDeviceLayerProperties); | 132 GET_PROC_LOCAL(inst, EnumerateDeviceLayerProperties); |
127 | 133 |
128 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; | 134 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; |
129 | 135 |
130 if (!EnumerateDeviceExtensionProperties || | 136 if (!EnumerateDeviceExtensionProperties || |
131 !EnumerateDeviceLayerProperties) { | 137 !EnumerateDeviceLayerProperties) { |
132 return false; | 138 return false; |
133 } | 139 } |
134 | 140 |
135 // device layers | 141 // device layers |
136 uint32_t layerCount = 0; | 142 uint32_t layerCount = 0; |
137 VkResult res = EnumerateDeviceLayerProperties(physDev, &layerCount, nullptr)
; | 143 VkResult res = EnumerateDeviceLayerProperties(physDev, &layerCount, nullptr)
; |
138 if (VK_SUCCESS != res) { | 144 if (VK_SUCCESS != res) { |
139 return false; | 145 return false; |
140 } | 146 } |
141 VkLayerProperties* layers = new VkLayerProperties[layerCount]; | 147 VkLayerProperties* layers = new VkLayerProperties[layerCount]; |
142 res = EnumerateDeviceLayerProperties(physDev, &layerCount, layers); | 148 res = EnumerateDeviceLayerProperties(physDev, &layerCount, layers); |
143 if (VK_SUCCESS != res) { | 149 if (VK_SUCCESS != res) { |
144 delete[] layers; | 150 delete[] layers; |
145 return false; | 151 return false; |
146 } | 152 } |
147 for (uint32_t i = 0; i < layerCount; ++i) { | 153 for (uint32_t i = 0; i < layerCount; ++i) { |
148 if (specVersion >= layers[i].specVersion) { | 154 if (nonPatchVersion >= remove_patch_version(layers[i].specVersion)) { |
149 fDeviceLayerStrings->push_back() = layers[i].layerName; | 155 fDeviceLayerStrings->push_back() = layers[i].layerName; |
150 } | 156 } |
151 } | 157 } |
152 delete[] layers; | 158 delete[] layers; |
153 if (!fDeviceLayerStrings->empty()) { | 159 if (!fDeviceLayerStrings->empty()) { |
154 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; | 160 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; |
155 SkTQSort(&fDeviceLayerStrings->front(), &fDeviceLayerStrings->back(), cm
p); | 161 SkTQSort(&fDeviceLayerStrings->front(), &fDeviceLayerStrings->back(), cm
p); |
156 } | 162 } |
157 | 163 |
158 // device extensions | 164 // device extensions |
159 // via Vulkan implementation and implicitly enabled layers | 165 // via Vulkan implementation and implicitly enabled layers |
160 uint32_t extensionCount = 0; | 166 uint32_t extensionCount = 0; |
161 res = EnumerateDeviceExtensionProperties(physDev, nullptr, &extensionCount,
nullptr); | 167 res = EnumerateDeviceExtensionProperties(physDev, nullptr, &extensionCount,
nullptr); |
162 if (VK_SUCCESS != res) { | 168 if (VK_SUCCESS != res) { |
163 return false; | 169 return false; |
164 } | 170 } |
165 VkExtensionProperties* extensions = new VkExtensionProperties[extensionCount
]; | 171 VkExtensionProperties* extensions = new VkExtensionProperties[extensionCount
]; |
166 res = EnumerateDeviceExtensionProperties(physDev, nullptr, &extensionCount,
extensions); | 172 res = EnumerateDeviceExtensionProperties(physDev, nullptr, &extensionCount,
extensions); |
167 if (VK_SUCCESS != res) { | 173 if (VK_SUCCESS != res) { |
168 delete[] extensions; | 174 delete[] extensions; |
169 return false; | 175 return false; |
170 } | 176 } |
171 for (uint32_t i = 0; i < extensionCount; ++i) { | 177 for (uint32_t i = 0; i < extensionCount; ++i) { |
172 if (specVersion >= extensions[i].specVersion) { | 178 if (nonPatchVersion >= remove_patch_version(extensions[i].specVersion))
{ |
173 fDeviceExtensionStrings->push_back() = extensions[i].extensionName; | 179 fDeviceExtensionStrings->push_back() = extensions[i].extensionName; |
174 } | 180 } |
175 } | 181 } |
176 delete[] extensions; | 182 delete[] extensions; |
177 if (!fDeviceExtensionStrings->empty()) { | 183 if (!fDeviceExtensionStrings->empty()) { |
178 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; | 184 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; |
179 SkTQSort(&fDeviceExtensionStrings->front(), &fDeviceExtensionStrings->ba
ck(), cmp); | 185 SkTQSort(&fDeviceExtensionStrings->front(), &fDeviceExtensionStrings->ba
ck(), cmp); |
180 } | 186 } |
181 // via explicitly enabled layers | 187 // via explicitly enabled layers |
182 layerCount = fDeviceLayerStrings->count(); | 188 layerCount = fDeviceLayerStrings->count(); |
183 for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex) { | 189 for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex) { |
184 uint32_t extensionCount = 0; | 190 uint32_t extensionCount = 0; |
185 res = EnumerateDeviceExtensionProperties(physDev, | 191 res = EnumerateDeviceExtensionProperties(physDev, |
186 (*fDeviceLayerStrings)[layerIndex].c_str(), | 192 (*fDeviceLayerStrings)[layerIndex].c_str(), |
187 &extensionCount, nullptr); | 193 &extensionCount, nullptr); |
188 if (VK_SUCCESS != res) { | 194 if (VK_SUCCESS != res) { |
189 return false; | 195 return false; |
190 } | 196 } |
191 VkExtensionProperties* extensions = new VkExtensionProperties[extensionC
ount]; | 197 VkExtensionProperties* extensions = new VkExtensionProperties[extensionC
ount]; |
192 res = EnumerateDeviceExtensionProperties(physDev, | 198 res = EnumerateDeviceExtensionProperties(physDev, |
193 (*fDeviceLayerStrings)[layerIndex].c_str(), | 199 (*fDeviceLayerStrings)[layerIndex].c_str(), |
194 &extensionCount, extensions); | 200 &extensionCount, extensions); |
195 if (VK_SUCCESS != res) { | 201 if (VK_SUCCESS != res) { |
196 delete[] extensions; | 202 delete[] extensions; |
197 return false; | 203 return false; |
198 } | 204 } |
199 for (uint32_t i = 0; i < extensionCount; ++i) { | 205 for (uint32_t i = 0; i < extensionCount; ++i) { |
200 // if not already in the list, add it | 206 // if not already in the list, add it |
201 if (specVersion >= extensions[i].specVersion && | 207 if (nonPatchVersion >= remove_patch_version(extensions[i].specVersio
n) && |
202 find_string(*fDeviceExtensionStrings, extensions[i].extensionNam
e) < 0) { | 208 find_string(*fDeviceExtensionStrings, extensions[i].extensionNam
e) < 0) { |
203 fDeviceExtensionStrings->push_back() = extensions[i].extensionNa
me; | 209 fDeviceExtensionStrings->push_back() = extensions[i].extensionNa
me; |
204 SkTQSort(&fDeviceExtensionStrings->front(), &fDeviceExtensionStr
ings->back(), cmp); | 210 SkTQSort(&fDeviceExtensionStrings->front(), &fDeviceExtensionStr
ings->back(), cmp); |
205 } | 211 } |
206 } | 212 } |
207 delete[] extensions; | 213 delete[] extensions; |
208 } | 214 } |
209 | 215 |
210 return true; | 216 return true; |
211 } | 217 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 SkDebugf("\nInstance Layers: "); | 250 SkDebugf("\nInstance Layers: "); |
245 for (int i = 0; i < cnt; ++i) { | 251 for (int i = 0; i < cnt; ++i) { |
246 SkDebugf("%s%s", (*fInstanceLayerStrings)[i].c_str(), (i < cnt - 1) ? se
p : ""); | 252 SkDebugf("%s%s", (*fInstanceLayerStrings)[i].c_str(), (i < cnt - 1) ? se
p : ""); |
247 } | 253 } |
248 cnt = fDeviceLayerStrings->count(); | 254 cnt = fDeviceLayerStrings->count(); |
249 SkDebugf("\nDevice Layers: "); | 255 SkDebugf("\nDevice Layers: "); |
250 for (int i = 0; i < cnt; ++i) { | 256 for (int i = 0; i < cnt; ++i) { |
251 SkDebugf("%s%s", (*fDeviceLayerStrings)[i].c_str(), (i < cnt - 1) ? sep
: ""); | 257 SkDebugf("%s%s", (*fDeviceLayerStrings)[i].c_str(), (i < cnt - 1) ? sep
: ""); |
252 } | 258 } |
253 } | 259 } |
OLD | NEW |