| 3155 | |
| 3156 | |
| 3157 | static int glad_vk_get_extensions( VkPhysicalDevice physical_device, uint32_t *out_extension_count, char ***out_extensions) { |
| 3158 | uint32_t i; |
| 3159 | uint32_t instance_extension_count = 0; |
| 3160 | uint32_t device_extension_count = 0; |
| 3161 | uint32_t max_extension_count; |
| 3162 | uint32_t total_extension_count; |
| 3163 | char **extensions; |
| 3164 | VkExtensionProperties *ext_properties; |
| 3165 | VkResult result; |
| 3166 | |
| 3167 | if (vkEnumerateInstanceExtensionProperties == NULL || (physical_device != NULL && vkEnumerateDeviceExtensionProperties == NULL)) { |
| 3168 | return 0; |
| 3169 | } |
| 3170 | |
| 3171 | result = vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, NULL); |
| 3172 | if (result != VK_SUCCESS) { |
| 3173 | return 0; |
| 3174 | } |
| 3175 | |
| 3176 | if (physical_device != NULL) { |
| 3177 | result = vkEnumerateDeviceExtensionProperties(physical_device, NULL, &device_extension_count, NULL); |
| 3178 | if (result != VK_SUCCESS) { |
| 3179 | return 0; |
| 3180 | } |
| 3181 | } |
| 3182 | |
| 3183 | total_extension_count = instance_extension_count + device_extension_count; |
| 3184 | max_extension_count = instance_extension_count > device_extension_count |
| 3185 | ? instance_extension_count : device_extension_count; |
| 3186 | |
| 3187 | ext_properties = (VkExtensionProperties*) malloc(max_extension_count * sizeof(VkExtensionProperties)); |
| 3188 | if (ext_properties == NULL) { |
| 3189 | return 0; |
| 3190 | } |
| 3191 | |
| 3192 | result = vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, ext_properties); |
| 3193 | if (result != VK_SUCCESS) { |
| 3194 | free((void*) ext_properties); |
| 3195 | return 0; |
| 3196 | } |
| 3197 | |
| 3198 | extensions = (char**) calloc(total_extension_count, sizeof(char*)); |
| 3199 | if (extensions == NULL) { |
| 3200 | free((void*) ext_properties); |
| 3201 | return 0; |
| 3202 | } |
| 3203 | |
| 3204 | for (i = 0; i < instance_extension_count; ++i) { |
| 3205 | VkExtensionProperties ext = ext_properties[i]; |
| 3206 | |
| 3207 | size_t extension_name_length = strlen(ext.extensionName) + 1; |
| 3208 | extensions[i] = (char*) malloc(extension_name_length * sizeof(char)); |
| 3209 | memcpy(extensions[i], ext.extensionName, extension_name_length * sizeof(char)); |
| 3210 | } |
| 3211 | |
| 3212 | if (physical_device != NULL) { |
| 3213 | result = vkEnumerateDeviceExtensionProperties(physical_device, NULL, &device_extension_count, ext_properties); |
| 3214 | if (result != VK_SUCCESS) { |
no outgoing calls
no test coverage detected