a/vk: Use enumeration helpers

This commit is contained in:
Jakob Bornecrantz 2023-07-02 22:56:14 +01:00
parent 9193427964
commit df5601fc1e

View file

@ -38,28 +38,6 @@ append_to_pnext_chain(VkBaseInStructure *head, VkBaseInStructure *new_struct)
head->pNext = (void *)new_struct; head->pNext = (void *)new_struct;
} }
static VkResult
enumerate_instance_extensions_properties(struct vk_bundle *vk,
VkExtensionProperties **out_props,
uint32_t *out_prop_count)
{
VkExtensionProperties *props = NULL;
uint32_t prop_count = 0;
VkResult ret;
ret = vk->vkEnumerateInstanceExtensionProperties(NULL, &prop_count, NULL);
vk_check_error("vkEnumerateInstanceExtensionProperties", ret, false);
props = U_TYPED_ARRAY_CALLOC(VkExtensionProperties, prop_count);
ret = vk->vkEnumerateInstanceExtensionProperties(NULL, &prop_count, props);
vk_check_error_with_free("vkEnumerateInstanceExtensionProperties", ret, false, props);
*out_props = props;
*out_prop_count = prop_count;
return VK_SUCCESS;
}
static bool static bool
should_skip_optional_instance_ext(struct vk_bundle *vk, should_skip_optional_instance_ext(struct vk_bundle *vk,
struct u_string_list *required_instance_ext_list, struct u_string_list *required_instance_ext_list,
@ -108,7 +86,11 @@ vk_check_required_instance_extensions(struct vk_bundle *vk, struct u_string_list
VkResult ret; VkResult ret;
// Two call. // Two call.
ret = enumerate_instance_extensions_properties(vk, &props, &prop_count); ret = vk_enumerate_instance_extensions_properties( //
vk, // vk_bundle
NULL, // layer_name
&prop_count, // out_prop_count
&props); // out_props
if (ret != VK_SUCCESS) { if (ret != VK_SUCCESS) {
return ret; // Already logged. return ret; // Already logged.
} }
@ -152,7 +134,11 @@ vk_build_instance_extensions(struct vk_bundle *vk,
VkResult ret; VkResult ret;
// Two call. // Two call.
ret = enumerate_instance_extensions_properties(vk, &props, &prop_count); ret = vk_enumerate_instance_extensions_properties( //
vk, // vk_bundle
NULL, // layer_name
&prop_count, // out_prop_count
&props); // out_props
if (ret != VK_SUCCESS) { if (ret != VK_SUCCESS) {
return NULL; // Already logged. return NULL; // Already logged.
} }
@ -553,19 +539,21 @@ select_preferred_device(struct vk_bundle *vk, VkPhysicalDevice *devices, uint32_
static VkResult static VkResult
select_physical_device(struct vk_bundle *vk, int forced_index) select_physical_device(struct vk_bundle *vk, int forced_index)
{ {
VkPhysicalDevice physical_devices[16]; VkPhysicalDevice *physical_devices = NULL;
uint32_t gpu_count = ARRAY_SIZE(physical_devices); uint32_t gpu_count = 0;
VkResult ret; VkResult ret;
ret = vk->vkEnumeratePhysicalDevices(vk->instance, &gpu_count, physical_devices); ret = vk_enumerate_physical_devices( //
vk, // vk_bundle
&gpu_count, // out_physical_device_count
&physical_devices); // out_physical_devices
if (ret != VK_SUCCESS) { if (ret != VK_SUCCESS) {
VK_DEBUG(vk, "vkEnumeratePhysicalDevices: %s", vk_result_string(ret)); VK_ERROR(vk, "vk_enumerate_physical_devices: %s", vk_result_string(ret));
return ret; return ret;
} }
if (gpu_count == 0) { if (gpu_count == 0) {
VK_DEBUG(vk, "No physical device found!"); VK_ERROR(vk, "No physical device found!");
return VK_ERROR_DEVICE_LOST; return VK_ERROR_DEVICE_LOST; // No need to free if zero devices.
} }
VK_DEBUG(vk, "Choosing Vulkan device index"); VK_DEBUG(vk, "Choosing Vulkan device index");
@ -575,6 +563,7 @@ select_physical_device(struct vk_bundle *vk, int forced_index)
if (uint_index + 1 > gpu_count) { if (uint_index + 1 > gpu_count) {
VK_ERROR(vk, "Attempted to force GPU index %u, but only %u GPUs are available", uint_index, VK_ERROR(vk, "Attempted to force GPU index %u, but only %u GPUs are available", uint_index,
gpu_count); gpu_count);
free(physical_devices);
return VK_ERROR_DEVICE_LOST; return VK_ERROR_DEVICE_LOST;
} }
gpu_index = uint_index; gpu_index = uint_index;
@ -584,11 +573,21 @@ select_physical_device(struct vk_bundle *vk, int forced_index)
gpu_index = select_preferred_device(vk, physical_devices, gpu_count); gpu_index = select_preferred_device(vk, physical_devices, gpu_count);
} }
// Setup the physical device on the bundle.
vk->physical_device = physical_devices[gpu_index]; vk->physical_device = physical_devices[gpu_index];
vk->physical_device_index = gpu_index; vk->physical_device_index = gpu_index;
// Free the array.
free(physical_devices);
physical_devices = NULL;
/*
* Have now selected device, get properties of it.
*/
VkPhysicalDeviceProperties pdp; VkPhysicalDeviceProperties pdp;
vk->vkGetPhysicalDeviceProperties(physical_devices[gpu_index], &pdp); vk->vkGetPhysicalDeviceProperties(vk->physical_device, &pdp);
char title[20]; char title[20];
(void)snprintf(title, sizeof(title), "Selected GPU: %u\n", gpu_index); (void)snprintf(title, sizeof(title), "Selected GPU: %u\n", gpu_index);
@ -869,28 +868,6 @@ fill_in_has_device_extensions(struct vk_bundle *vk, struct u_string_list *ext_li
// end of GENERATED device extension code - do not modify - used by scripts // end of GENERATED device extension code - do not modify - used by scripts
} }
static VkResult
get_device_ext_props(struct vk_bundle *vk,
VkPhysicalDevice physical_device,
VkExtensionProperties **out_props,
uint32_t *out_prop_count)
{
uint32_t prop_count = 0;
VkResult res = vk->vkEnumerateDeviceExtensionProperties(physical_device, NULL, &prop_count, NULL);
vk_check_error("vkEnumerateDeviceExtensionProperties", res, false);
VkExtensionProperties *props = U_TYPED_ARRAY_CALLOC(VkExtensionProperties, prop_count);
res = vk->vkEnumerateDeviceExtensionProperties(physical_device, NULL, &prop_count, props);
vk_check_error_with_free("vkEnumerateDeviceExtensionProperties", res, false, props);
// The preceding check returns on failure.
*out_props = props;
*out_prop_count = prop_count;
return VK_SUCCESS;
}
static bool static bool
should_skip_optional_device_ext(struct vk_bundle *vk, should_skip_optional_device_ext(struct vk_bundle *vk,
struct u_string_list *required_device_ext_list, struct u_string_list *required_device_ext_list,
@ -921,7 +898,16 @@ build_device_extensions(struct vk_bundle *vk,
{ {
VkExtensionProperties *props = NULL; VkExtensionProperties *props = NULL;
uint32_t prop_count = 0; uint32_t prop_count = 0;
if (get_device_ext_props(vk, physical_device, &props, &prop_count) != VK_SUCCESS) { VkResult ret;
ret = vk_enumerate_physical_device_extension_properties( //
vk, // vk_bundle
physical_device, // physical_device
NULL, // layer_name
&prop_count, // out_prop_count
&props); // out_props
if (ret != VK_SUCCESS) {
VK_ERROR(vk, "vk_enumerate_physical_device_extension_properties: %s", vk_result_string(ret));
return false; return false;
} }