| 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 *fDeviceExtensionStrings = *that.fDeviceExtensionStrings; | 43 *fDeviceExtensionStrings = *that.fDeviceExtensionStrings; |
| 44 *fInstanceLayerStrings = *that.fInstanceLayerStrings; | 44 *fInstanceLayerStrings = *that.fInstanceLayerStrings; |
| 45 *fDeviceLayerStrings = *that.fDeviceLayerStrings; | 45 *fDeviceLayerStrings = *that.fDeviceLayerStrings; |
| 46 | 46 |
| 47 fInitialized = that.fInitialized; | 47 fInitialized = that.fInitialized; |
| 48 return *this; | 48 return *this; |
| 49 } | 49 } |
| 50 | 50 |
| 51 bool GrVkExtensions::init( | 51 bool GrVkExtensions::init( |
| 52 uint32_t specVersion, | 52 uint32_t specVersion, |
| 53 VkPhysicalDevice physDev, |
| 53 PFN_vkEnumerateInstanceExtensionProperties enumerateInstanceExtensionPropert
ies, | 54 PFN_vkEnumerateInstanceExtensionProperties enumerateInstanceExtensionPropert
ies, |
| 54 PFN_vkEnumerateDeviceExtensionProperties enumerateDeviceExtensionProperties, | 55 PFN_vkEnumerateDeviceExtensionProperties enumerateDeviceExtensionProperties, |
| 55 PFN_vkEnumerateInstanceLayerProperties enumerateInstanceLayerProperties, | 56 PFN_vkEnumerateInstanceLayerProperties enumerateInstanceLayerProperties, |
| 56 PFN_vkEnumerateDeviceLayerProperties enumerateDeviceLayerProperties) { | 57 PFN_vkEnumerateDeviceLayerProperties enumerateDeviceLayerProperties) { |
| 57 fInitialized = false; | 58 fInitialized = false; |
| 58 this->reset(); | 59 this->reset(); |
| 60 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; |
| 59 | 61 |
| 60 if (!enumerateInstanceExtensionProperties || | 62 if (!enumerateInstanceExtensionProperties || |
| 61 !enumerateDeviceExtensionProperties || | 63 !enumerateDeviceExtensionProperties || |
| 62 !enumerateInstanceLayerProperties || | 64 !enumerateInstanceLayerProperties || |
| 63 !enumerateDeviceLayerProperties) { | 65 !enumerateDeviceLayerProperties) { |
| 64 return false; | 66 return false; |
| 65 } | 67 } |
| 66 | 68 |
| 69 // instance layers |
| 70 uint32_t layerCount = 0; |
| 71 VkResult res = enumerateInstanceLayerProperties(&layerCount, nullptr); |
| 72 if (VK_SUCCESS != res) { |
| 73 return false; |
| 74 } |
| 75 VkLayerProperties* layers = new VkLayerProperties[layerCount]; |
| 76 res = enumerateInstanceLayerProperties(&layerCount, layers); |
| 77 if (VK_SUCCESS != res) { |
| 78 return false; |
| 79 } |
| 80 for (uint32_t i = 0; i < layerCount; ++i) { |
| 81 if (specVersion >= layers[i].specVersion) { |
| 82 fInstanceLayerStrings->push_back() = layers[i].layerName; |
| 83 } |
| 84 } |
| 85 delete[] layers; |
| 86 if (!fInstanceLayerStrings->empty()) { |
| 87 SkTQSort(&fInstanceLayerStrings->front(), &fInstanceLayerStrings->back()
, cmp); |
| 88 } |
| 89 |
| 67 // instance extensions | 90 // instance extensions |
| 91 // via Vulkan implementation and implicitly enabled layers |
| 68 uint32_t extensionCount = 0; | 92 uint32_t extensionCount = 0; |
| 69 VkResult res = enumerateInstanceExtensionProperties(nullptr, &extensionCount
, nullptr); | 93 res = enumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr
); |
| 70 | 94 if (VK_SUCCESS != res) { |
| 95 return false; |
| 96 } |
| 71 VkExtensionProperties* extensions = new VkExtensionProperties[extensionCount
]; | 97 VkExtensionProperties* extensions = new VkExtensionProperties[extensionCount
]; |
| 72 res = enumerateInstanceExtensionProperties(nullptr, &extensionCount, extensi
ons); | 98 res = enumerateInstanceExtensionProperties(nullptr, &extensionCount, extensi
ons); |
| 73 | 99 if (VK_SUCCESS != res) { |
| 74 fInstanceExtensionStrings->push_back_n(extensionCount); | 100 return false; |
| 101 } |
| 75 for (uint32_t i = 0; i < extensionCount; ++i) { | 102 for (uint32_t i = 0; i < extensionCount; ++i) { |
| 76 if (specVersion >= extensions[i].specVersion) { | 103 if (specVersion >= extensions[i].specVersion) { |
| 77 (*fInstanceExtensionStrings)[i] = extensions[i].extensionName; | 104 fInstanceExtensionStrings->push_back() = extensions[i].extensionName
; |
| 78 } | 105 } |
| 79 } | 106 } |
| 80 delete [] extensions; | 107 delete [] extensions; |
| 108 // sort so we can search |
| 109 if (!fInstanceExtensionStrings->empty()) { |
| 110 SkTQSort(&fInstanceExtensionStrings->front(), &fInstanceExtensionStrings
->back(), cmp); |
| 111 } |
| 112 // via explicitly enabled layers |
| 113 layerCount = fInstanceLayerStrings->count(); |
| 114 for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex) { |
| 115 uint32_t extensionCount = 0; |
| 116 res = enumerateInstanceExtensionProperties((*fInstanceLayerStrings)[laye
rIndex].c_str(), |
| 117 &extensionCount, nullptr); |
| 118 if (VK_SUCCESS != res) { |
| 119 return false; |
| 120 } |
| 121 VkExtensionProperties* extensions = new VkExtensionProperties[extensionC
ount]; |
| 122 res = enumerateInstanceExtensionProperties((*fInstanceLayerStrings)[laye
rIndex].c_str(), |
| 123 &extensionCount, extensions); |
| 124 if (VK_SUCCESS != res) { |
| 125 return false; |
| 126 } |
| 127 for (uint32_t i = 0; i < extensionCount; ++i) { |
| 128 // if not already in the list, add it |
| 129 if (specVersion >= extensions[i].specVersion && |
| 130 find_string(*fInstanceExtensionStrings, extensions[i].extensionN
ame) < 0) { |
| 131 fInstanceExtensionStrings->push_back() = extensions[i].extension
Name; |
| 132 SkTQSort(&fInstanceExtensionStrings->front(), &fInstanceExtensio
nStrings->back(), |
| 133 cmp); |
| 134 } |
| 135 } |
| 136 delete[] extensions; |
| 137 } |
| 81 | 138 |
| 82 if (!fInstanceExtensionStrings->empty()) { | 139 // device layers |
| 140 layerCount = 0; |
| 141 res = enumerateDeviceLayerProperties(physDev, &layerCount, nullptr); |
| 142 if (VK_SUCCESS != res) { |
| 143 return false; |
| 144 } |
| 145 layers = new VkLayerProperties[layerCount]; |
| 146 res = enumerateDeviceLayerProperties(physDev, &layerCount, layers); |
| 147 if (VK_SUCCESS != res) { |
| 148 return false; |
| 149 } |
| 150 for (uint32_t i = 0; i < layerCount; ++i) { |
| 151 if (specVersion >= layers[i].specVersion) { |
| 152 fDeviceLayerStrings->push_back() = layers[i].layerName; |
| 153 } |
| 154 } |
| 155 delete[] layers; |
| 156 if (!fDeviceLayerStrings->empty()) { |
| 83 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; | 157 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; |
| 84 SkTQSort(&fInstanceExtensionStrings->front(), &fInstanceExtensionStrings
->back(), cmp); | 158 SkTQSort(&fDeviceLayerStrings->front(), &fDeviceLayerStrings->back(), cm
p); |
| 159 } |
| 160 |
| 161 // device extensions |
| 162 // via Vulkan implementation and implicitly enabled layers |
| 163 extensionCount = 0; |
| 164 res = enumerateDeviceExtensionProperties(physDev, nullptr, &extensionCount,
nullptr); |
| 165 if (VK_SUCCESS != res) { |
| 166 return false; |
| 167 } |
| 168 extensions = new VkExtensionProperties[extensionCount]; |
| 169 res = enumerateDeviceExtensionProperties(physDev, nullptr, &extensionCount,
extensions); |
| 170 if (VK_SUCCESS != res) { |
| 171 return false; |
| 172 } |
| 173 for (uint32_t i = 0; i < extensionCount; ++i) { |
| 174 if (specVersion >= extensions[i].specVersion) { |
| 175 fDeviceExtensionStrings->push_back() = extensions[i].extensionName; |
| 176 } |
| 177 } |
| 178 delete[] extensions; |
| 179 if (!fDeviceExtensionStrings->empty()) { |
| 180 SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp; |
| 181 SkTQSort(&fDeviceExtensionStrings->front(), &fDeviceExtensionStrings->ba
ck(), cmp); |
| 182 } |
| 183 // via explicitly enabled layers |
| 184 layerCount = fDeviceLayerStrings->count(); |
| 185 for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex) { |
| 186 uint32_t extensionCount = 0; |
| 187 res = enumerateDeviceExtensionProperties(physDev, |
| 188 (*fDeviceLayerStrings)[layerInd
ex].c_str(), |
| 189 &extensionCount, nullptr); |
| 190 if (VK_SUCCESS != res) { |
| 191 return false; |
| 192 } |
| 193 VkExtensionProperties* extensions = new VkExtensionProperties[extensionC
ount]; |
| 194 res = enumerateDeviceExtensionProperties(physDev, |
| 195 (*fDeviceLayerStrings)[layerInd
ex].c_str(), |
| 196 &extensionCount, extensions); |
| 197 if (VK_SUCCESS != res) { |
| 198 return false; |
| 199 } |
| 200 for (uint32_t i = 0; i < extensionCount; ++i) { |
| 201 // if not already in the list, add it |
| 202 if (specVersion >= extensions[i].specVersion && |
| 203 find_string(*fDeviceExtensionStrings, extensions[i].extensionNam
e) < 0) { |
| 204 fDeviceExtensionStrings->push_back() = extensions[i].extensionNa
me; |
| 205 SkTQSort(&fDeviceExtensionStrings->front(), &fDeviceExtensionStr
ings->back(), cmp); |
| 206 } |
| 207 } |
| 208 delete[] extensions; |
| 85 } | 209 } |
| 86 | 210 |
| 87 fInitialized = true; | 211 fInitialized = true; |
| 88 return true; | 212 return true; |
| 89 } | 213 } |
| 90 | 214 |
| 91 | 215 |
| 92 bool GrVkExtensions::hasInstanceExtension(const char ext[]) const { | 216 bool GrVkExtensions::hasInstanceExtension(const char ext[]) const { |
| 93 SkASSERT(fInitialized); | 217 SkASSERT(fInitialized); |
| 94 | 218 |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 SkDebugf("\nInstance Layers: "); | 367 SkDebugf("\nInstance Layers: "); |
| 244 for (int i = 0; i < cnt; ++i) { | 368 for (int i = 0; i < cnt; ++i) { |
| 245 SkDebugf("%s%s", (*fInstanceLayerStrings)[i].c_str(), (i < cnt - 1) ? se
p : ""); | 369 SkDebugf("%s%s", (*fInstanceLayerStrings)[i].c_str(), (i < cnt - 1) ? se
p : ""); |
| 246 } | 370 } |
| 247 cnt = fDeviceLayerStrings->count(); | 371 cnt = fDeviceLayerStrings->count(); |
| 248 SkDebugf("\nDevice Layers: "); | 372 SkDebugf("\nDevice Layers: "); |
| 249 for (int i = 0; i < cnt; ++i) { | 373 for (int i = 0; i < cnt; ++i) { |
| 250 SkDebugf("%s%s", (*fDeviceLayerStrings)[i].c_str(), (i < cnt - 1) ? sep
: ""); | 374 SkDebugf("%s%s", (*fDeviceLayerStrings)[i].c_str(), (i < cnt - 1) ? sep
: ""); |
| 251 } | 375 } |
| 252 } | 376 } |
| OLD | NEW |