vulkan/overay: fix violation of VUID-VkDeviceCreateInfo-pNext-00373
We can't use VkDeviceCreateInfo::pEnabledFeatures when
VkPhysicalDeviceFeatures2 is present in pNext chain.
Fixes: ea7a6fa980 ("vulkan/overlay: add pipeline statistic & timestamps support")
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8208>
This commit is contained in:
committed by
Marge Bot
parent
14e6f541b1
commit
2085381432
@@ -2470,18 +2470,31 @@ static VkResult overlay_CreateDevice(
|
||||
chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
|
||||
|
||||
VkPhysicalDeviceFeatures device_features = {};
|
||||
VkDeviceCreateInfo device_info = *pCreateInfo;
|
||||
VkPhysicalDeviceFeatures *device_features_ptr = NULL;
|
||||
|
||||
if (pCreateInfo->pEnabledFeatures)
|
||||
device_features = *(pCreateInfo->pEnabledFeatures);
|
||||
if (instance_data->pipeline_statistics_enabled) {
|
||||
device_features.inheritedQueries = true;
|
||||
device_features.pipelineStatisticsQuery = true;
|
||||
VkDeviceCreateInfo *device_info = (VkDeviceCreateInfo *)
|
||||
clone_chain((const struct VkBaseInStructure *)pCreateInfo);
|
||||
|
||||
VkPhysicalDeviceFeatures2 *device_features2 = (VkPhysicalDeviceFeatures2 *)
|
||||
vk_find_struct(device_info, PHYSICAL_DEVICE_FEATURES_2);
|
||||
if (device_features2) {
|
||||
/* Can't use device_info->pEnabledFeatures when VkPhysicalDeviceFeatures2 is present */
|
||||
device_features_ptr = &device_features2->features;
|
||||
} else {
|
||||
if (device_info->pEnabledFeatures)
|
||||
device_features = *(device_info->pEnabledFeatures);
|
||||
device_features_ptr = &device_features;
|
||||
device_info->pEnabledFeatures = &device_features;
|
||||
}
|
||||
|
||||
if (instance_data->pipeline_statistics_enabled) {
|
||||
device_features_ptr->inheritedQueries = true;
|
||||
device_features_ptr->pipelineStatisticsQuery = true;
|
||||
}
|
||||
device_info.pEnabledFeatures = &device_features;
|
||||
|
||||
|
||||
VkResult result = fpCreateDevice(physicalDevice, &device_info, pAllocator, pDevice);
|
||||
VkResult result = fpCreateDevice(physicalDevice, device_info, pAllocator, pDevice);
|
||||
free_chain((struct VkBaseOutStructure *)device_info);
|
||||
if (result != VK_SUCCESS) return result;
|
||||
|
||||
struct device_data *device_data = new_device_data(*pDevice, instance_data);
|
||||
|
||||
Reference in New Issue
Block a user