Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: src/gpu/vk/GrVkExtensions.cpp

Issue 1970233002: Ignore patch version when checking compatibility of vulkan layers (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: extension Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698