vkd3d: Remove vkd3d_optional_device_extensions_info

Roll this into vkd3d_device_create_info, no need for this to be a pNext thing.

Additionally, fix some memory leaks on device creation failure.

Signed-off-by: Joshua Ashton <joshua@froggi.es>
This commit is contained in:
Joshua Ashton 2021-04-19 17:08:02 +01:00 committed by Hans-Kristian Arntzen
parent 59148c1932
commit bd988f2b74
4 changed files with 31 additions and 54 deletions

View File

@ -76,9 +76,6 @@ enum vkd3d_structure_type
VKD3D_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
VKD3D_STRUCTURE_TYPE_IMAGE_RESOURCE_CREATE_INFO,
/* 1.2 */
VKD3D_STRUCTURE_TYPE_OPTIONAL_DEVICE_EXTENSIONS_INFO,
VKD3D_FORCE_32_BIT_ENUM(VKD3D_STRUCTURE_TYPE),
};
@ -125,20 +122,13 @@ struct vkd3d_device_create_info
const char * const *device_extensions;
uint32_t device_extension_count;
const char * const *optional_device_extensions;
uint32_t optional_device_extension_count;
IUnknown *parent;
LUID adapter_luid;
};
/* Extends vkd3d_device_create_info. Available since 1.2. */
struct vkd3d_optional_device_extensions_info
{
enum vkd3d_structure_type type;
const void *next;
const char * const *extensions;
uint32_t extension_count;
};
struct vkd3d_image_resource_create_info
{
enum vkd3d_structure_type type;

View File

@ -1543,10 +1543,9 @@ static void vkd3d_trace_physical_device_features(const struct vkd3d_physical_dev
static HRESULT vkd3d_init_device_extensions(struct d3d12_device *device,
const struct vkd3d_device_create_info *create_info,
uint32_t *device_extension_count, bool **user_extension_supported)
uint32_t *device_extension_count, bool *user_extension_supported)
{
const struct vkd3d_vk_instance_procs *vk_procs = &device->vkd3d_instance->vk_procs;
const struct vkd3d_optional_device_extensions_info *optional_extensions;
VkPhysicalDevice physical_device = device->vk_physical_device;
struct vkd3d_vulkan_info *vulkan_info = &device->vk_info;
VkExtensionProperties *vk_extensions;
@ -1574,26 +1573,13 @@ static HRESULT vkd3d_init_device_extensions(struct d3d12_device *device,
return hresult_from_vk_result(vr);
}
optional_extensions = vkd3d_find_struct(create_info->next, OPTIONAL_DEVICE_EXTENSIONS_INFO);
if (optional_extensions && optional_extensions->extension_count)
{
if (!(*user_extension_supported = vkd3d_calloc(optional_extensions->extension_count, sizeof(bool))))
{
vkd3d_free(vk_extensions);
return E_OUTOFMEMORY;
}
}
else
{
*user_extension_supported = NULL;
}
*device_extension_count = vkd3d_check_extensions(vk_extensions, count, NULL, 0,
optional_device_extensions, ARRAY_SIZE(optional_device_extensions),
create_info->device_extensions, create_info->device_extension_count,
optional_extensions ? optional_extensions->extensions : NULL,
optional_extensions ? optional_extensions->extension_count : 0,
*user_extension_supported, vulkan_info, "device");
create_info->device_extensions,
create_info->device_extension_count,
create_info->optional_device_extensions,
create_info->optional_device_extension_count,
user_extension_supported, vulkan_info, "device");
if (get_spec_version(vk_extensions, count, VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME) < 3)
vulkan_info->EXT_vertex_attribute_divisor = false;
@ -1999,7 +1985,6 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
const struct vkd3d_device_create_info *create_info)
{
const struct vkd3d_vk_instance_procs *vk_procs = &device->vkd3d_instance->vk_procs;
const struct vkd3d_optional_device_extensions_info *optional_extensions;
struct vkd3d_device_queue_info device_queue_info;
VkPhysicalDeviceProperties device_properties;
bool *user_extension_supported = NULL;
@ -2039,14 +2024,26 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
VK_CALL(vkGetPhysicalDeviceMemoryProperties(physical_device, &device->memory_properties));
if (create_info->optional_device_extension_count)
{
if (!(user_extension_supported = vkd3d_calloc(create_info->optional_device_extension_count, sizeof(bool))))
return E_OUTOFMEMORY;
}
if (FAILED(hr = vkd3d_init_device_extensions(device, create_info,
&extension_count, &user_extension_supported)))
&extension_count, user_extension_supported)))
{
vkd3d_free(user_extension_supported);
return hr;
}
vkd3d_physical_device_info_init(&device->device_info, device);
if (FAILED(hr = vkd3d_init_device_caps(device, create_info, &device->device_info)))
{
vkd3d_free(user_extension_supported);
return hr;
}
if (!(extensions = vkd3d_calloc(extension_count, sizeof(*extensions))))
{
@ -2054,8 +2051,6 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
return E_OUTOFMEMORY;
}
optional_extensions = vkd3d_find_struct(create_info->next, OPTIONAL_DEVICE_EXTENSIONS_INFO);
/* Create device */
device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
device_info.pNext = device->device_info.features2.pNext;
@ -2066,9 +2061,10 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
device_info.ppEnabledLayerNames = NULL;
device_info.enabledExtensionCount = vkd3d_enable_extensions(extensions, NULL, 0,
optional_device_extensions, ARRAY_SIZE(optional_device_extensions),
create_info->device_extensions, create_info->device_extension_count,
optional_extensions ? optional_extensions->extensions : NULL,
optional_extensions ? optional_extensions->extension_count : 0,
create_info->device_extensions,
create_info->device_extension_count,
create_info->optional_device_extensions,
create_info->optional_device_extension_count,
user_extension_supported, &device->vk_info);
device_info.ppEnabledExtensionNames = extensions;
device_info.pEnabledFeatures = &device->device_info.features2.features;

View File

@ -539,12 +539,6 @@ static HRESULT create_vkd3d_device(struct vkd3d_instance *instance,
{
VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME,
};
static const struct vkd3d_optional_device_extensions_info optional_extensions =
{
.type = VKD3D_STRUCTURE_TYPE_OPTIONAL_DEVICE_EXTENSIONS_INFO,
.extensions = device_extensions,
.extension_count = ARRAY_SIZE(device_extensions),
};
struct vkd3d_device_create_info device_create_info;
VkPhysicalDevice vk_physical_device;
@ -554,10 +548,12 @@ static HRESULT create_vkd3d_device(struct vkd3d_instance *instance,
memset(&device_create_info, 0, sizeof(device_create_info));
device_create_info.type = VKD3D_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
device_create_info.next = &optional_extensions;
device_create_info.next = NULL;
device_create_info.minimum_feature_level = minimum_feature_level;
device_create_info.instance = instance;
device_create_info.vk_physical_device = vk_physical_device;
device_create_info.optional_device_extensions = device_extensions;
device_create_info.optional_device_extension_count = ARRAY_SIZE(device_extensions);
return vkd3d_create_device(&device_create_info, iid, device);
}

View File

@ -463,7 +463,6 @@ static void test_optional_device_extensions(void)
VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
};
struct vkd3d_optional_device_extensions_info optional_extensions;
struct vkd3d_instance_create_info instance_create_info;
struct vkd3d_device_create_info device_create_info;
struct vkd3d_instance *instance;
@ -483,14 +482,10 @@ static void test_optional_device_extensions(void)
hr = vkd3d_create_device(&device_create_info, &IID_ID3D12Device, (void **)&device);
ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
optional_extensions.type = VKD3D_STRUCTURE_TYPE_OPTIONAL_DEVICE_EXTENSIONS_INFO;
optional_extensions.next = NULL;
optional_extensions.extensions = extensions;
optional_extensions.extension_count = ARRAY_SIZE(extensions);
device_create_info.next = &optional_extensions;
device_create_info.device_extensions = NULL;
device_create_info.device_extension_count = 0;
device_create_info.optional_device_extensions = extensions;
device_create_info.optional_device_extensions = ARRAY_SIZE(extensions);
hr = vkd3d_create_device(&device_create_info, &IID_ID3D12Device, (void **)&device);
ok(hr == S_OK, "Failed to create device, hr %#x.\n", hr);