vkd3d: Enable VK_EXT_vertex_attribute_divisor.

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2018-10-25 11:24:03 +02:00 committed by Alexandre Julliard
parent 154c48000d
commit 5e6b35af8e
3 changed files with 21 additions and 6 deletions

View File

@ -64,6 +64,8 @@ static const char * const required_device_extensions[] =
static const struct vkd3d_optional_extension_info optional_device_extensions[] =
{
{VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, offsetof(struct vkd3d_vulkan_info, KHR_push_descriptor)},
{VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME,
offsetof(struct vkd3d_vulkan_info, EXT_vertex_attribute_divisor)},
};
static bool is_extension_disabled(const char *extension_name)
@ -993,9 +995,11 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
{
unsigned int direct_queue_family_index, copy_queue_family_index, compute_queue_family_index;
const struct vkd3d_vk_instance_procs *vk_procs = &device->vkd3d_instance->vk_procs;
VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vertex_divisor_features;
struct vkd3d_vulkan_info *vulkan_info = &device->vk_info;
VkQueueFamilyProperties *queue_properties = NULL;
VkDeviceQueueCreateInfo *queue_info = NULL;
VkPhysicalDeviceFeatures device_features;
VkPhysicalDeviceFeatures2 features2;
VkPhysicalDevice physical_device;
VkDeviceCreateInfo device_info;
uint32_t queue_family_count;
@ -1082,11 +1086,19 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
VK_CALL(vkGetPhysicalDeviceMemoryProperties(physical_device, &device->memory_properties));
VK_CALL(vkGetPhysicalDeviceFeatures(physical_device, &device_features));
if (FAILED(hr = vkd3d_init_device_caps(device, create_info, &device_features, &extension_count)))
memset(&vertex_divisor_features, 0, sizeof(vertex_divisor_features));
vertex_divisor_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT;
features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
features2.pNext = &vertex_divisor_features;
if (vulkan_info->KHR_get_physical_device_properties2)
VK_CALL(vkGetPhysicalDeviceFeatures2KHR(physical_device, &features2));
else
VK_CALL(vkGetPhysicalDeviceFeatures(physical_device, &features2.features));
if (FAILED(hr = vkd3d_init_device_caps(device, create_info, &features2.features, &extension_count)))
goto done;
device_features.shaderTessellationAndGeometryPointSize = VK_FALSE;
features2.features.shaderTessellationAndGeometryPointSize = VK_FALSE;
if (!(extensions = vkd3d_calloc(extension_count, sizeof(*extensions))))
{
@ -1096,7 +1108,7 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
/* Create device */
device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
device_info.pNext = NULL;
device_info.pNext = &vertex_divisor_features;
device_info.flags = 0;
device_info.queueCreateInfoCount = queue_family_count;
device_info.pQueueCreateInfos = queue_info;
@ -1108,7 +1120,7 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
create_info->device_extensions, create_info->device_extension_count,
NULL, 0, NULL, &device->vk_info);
device_info.ppEnabledExtensionNames = extensions;
device_info.pEnabledFeatures = &device_features;
device_info.pEnabledFeatures = &features2.features;
vr = VK_CALL(vkCreateDevice(physical_device, &device_info, NULL, &vk_device));
vkd3d_free(extensions);

View File

@ -83,6 +83,7 @@ struct vkd3d_vulkan_info
bool EXT_debug_report;
/* device extensions */
bool KHR_push_descriptor;
bool EXT_vertex_attribute_divisor;
VkPhysicalDeviceLimits device_limits;
VkPhysicalDeviceSparseProperties sparse_properties;

View File

@ -46,6 +46,8 @@ VK_INSTANCE_PFN(vkGetPhysicalDeviceMemoryProperties)
VK_INSTANCE_PFN(vkGetPhysicalDeviceProperties)
VK_INSTANCE_PFN(vkGetPhysicalDeviceQueueFamilyProperties)
VK_INSTANCE_PFN(vkGetPhysicalDeviceSparseImageFormatProperties)
/* VK_KHR_get_physical_device_properties2 */
VK_INSTANCE_EXT_PFN(vkGetPhysicalDeviceFeatures2KHR)
/* VK_EXT_debug_report */
VK_INSTANCE_EXT_PFN(vkCreateDebugReportCallbackEXT)
VK_INSTANCE_EXT_PFN(vkDestroyDebugReportCallbackEXT)