Mesa (staging/20.3): vulkan/overay: fix violation of VUID-VkDeviceCreateInfo-pNext-00373

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jan 13 00:04:28 UTC 2021


Module: Mesa
Branch: staging/20.3
Commit: 97365ce754ed26414d8162a3bda9d0d909c59563
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=97365ce754ed26414d8162a3bda9d0d909c59563

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>
(cherry picked from commit 208538143293466c5a90f6dc8a5aaa67849e3557)

---

 .pick_status.json                    |  2 +-
 src/vulkan/overlay-layer/overlay.cpp | 27 ++++++++++++++++++++-------
 src/vulkan/util/gen_enum_to_str.py   |  3 +++
 3 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 878f5f5b4f9..9b8c9d7f885 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -697,7 +697,7 @@
         "description": "vulkan/overay: fix violation of VUID-VkDeviceCreateInfo-pNext-00373",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": "ea7a6fa98055ada285894ddea106d8292db55393"
     },
diff --git a/src/vulkan/overlay-layer/overlay.cpp b/src/vulkan/overlay-layer/overlay.cpp
index c415d6a8205..c3a86a68ca7 100644
--- a/src/vulkan/overlay-layer/overlay.cpp
+++ b/src/vulkan/overlay-layer/overlay.cpp
@@ -2466,18 +2466,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 ebaf2a1a0cc..cbd2790cb3f 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"
 
@@ -102,6 +103,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);
         }
         #pragma GCC diagnostic pop
         unreachable("Undefined struct type.");



More information about the mesa-commit mailing list