| 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 |