mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-04 06:06:17 +00:00
a/vk: Use enumeration helpers
This commit is contained in:
parent
9193427964
commit
df5601fc1e
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue