Mesa (master): vulkan/overay: fix violation of VUID-VkDeviceCreateInfo-pNext-00373
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Jan 11 20:35:27 UTC 2021
Module: Mesa
Branch: master
Commit: 208538143293466c5a90f6dc8a5aaa67849e3557
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=208538143293466c5a90f6dc8a5aaa67849e3557
Author: Pavel Asyutchenko <sventeam at yandex.ru>
Date: Wed Dec 23 00:05:54 2020 +0300
vulkan/overay: fix violation of VUID-VkDeviceCreateInfo-pNext-00373
We can't use VkDeviceCreateInfo::pEnabledFeatures when
VkPhysicalDeviceFeatures2 is present in pNext chain.
Fixes: ea7a6fa98055ad ("vulkan/overlay: add pipeline statistic & timestamps support")
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8208>
---
src/vulkan/overlay-layer/overlay.cpp | 27 ++++++++++++++++++++-------
src/vulkan/util/gen_enum_to_str.py | 3 +++
2 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/src/vulkan/overlay-layer/overlay.cpp b/src/vulkan/overlay-layer/overlay.cpp
index 2882bad73d4..32ea1d37378 100644
--- a/src/vulkan/overlay-layer/overlay.cpp
+++ b/src/vulkan/overlay-layer/overlay.cpp
@@ -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;
+
+ 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 (pCreateInfo->pEnabledFeatures)
- device_features = *(pCreateInfo->pEnabledFeatures);
if (instance_data->pipeline_statistics_enabled) {
- device_features.inheritedQueries = true;
- device_features.pipelineStatisticsQuery = true;
+ 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);
diff --git a/src/vulkan/util/gen_enum_to_str.py b/src/vulkan/util/gen_enum_to_str.py
index 4eb21c16823..d0ac26cdc7a 100644
--- a/src/vulkan/util/gen_enum_to_str.py
+++ b/src/vulkan/util/gen_enum_to_str.py
@@ -60,6 +60,7 @@ C_TEMPLATE = Template(textwrap.dedent(u"""\
#include <string.h>
#include <vulkan/vulkan.h>
#include <vulkan/vk_android_native_buffer.h>
+ #include <vulkan/vk_layer.h>
#include "util/macros.h"
#include "vk_enum_to_str.h"
@@ -98,6 +99,8 @@ C_TEMPLATE = Template(textwrap.dedent(u"""\
case ${struct.stype}: return sizeof(${struct.name});
% endif
%endfor
+ case VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO: return sizeof(VkLayerInstanceCreateInfo);
+ case VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO: return sizeof(VkLayerDeviceCreateInfo);
default:
unreachable("Undefined struct type.");
}
More information about the mesa-commit
mailing list