Module: Mesa
Branch: staging/23.3
Commit: 9a43aab925b546da4d22dd88fc2daf888397a6fd
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9a43aab925b546da4d22dd88fc2daf888397a6fd

Author: Chia-I Wu <[email protected]>
Date:   Tue Dec 19 14:06:16 2023 -0800

vk/util: ignore unsupported feature structs

vk_physical_device_check_device_features should ignore unsupported
feature structs:

  Any component of the implementation (the loader, any enabled layers,
  and drivers) must skip over, without processing (other than reading
  the sType and pNext members) any extending structures in the chain not
  defined by core versions or extensions supported by that component.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10177
Cc: mesa-stable
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26767>
(cherry picked from commit eb5bb5c784e97c533e30b348e82e446ac0da59c8)

---

 .pick_status.json                                  |  2 +-
 src/vulkan/util/vk_physical_device_features_gen.py | 26 +++++++++++++++++++---
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 8a54d9baf93..f2c03ca069a 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -274,7 +274,7 @@
         "description": "vk/util: ignore unsupported feature structs",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": null,
         "notes": null
diff --git a/src/vulkan/util/vk_physical_device_features_gen.py 
b/src/vulkan/util/vk_physical_device_features_gen.py
index 23eacb6a378..2a9d589b6d2 100644
--- a/src/vulkan/util/vk_physical_device_features_gen.py
+++ b/src/vulkan/util/vk_physical_device_features_gen.py
@@ -32,7 +32,7 @@ import xml.etree.ElementTree as et
 
 import mako
 from mako.template import Template
-from vk_extensions import get_all_required, filter_api
+from vk_extensions import Requirements, get_all_required, filter_api
 
 def str_removeprefix(s, prefix):
     if s.startswith(prefix):
@@ -124,10 +124,21 @@ def get_renamed_feature(c_type, feature):
 
 @dataclass
 class FeatureStruct:
+    reqs: Requirements
     c_type: str
     s_type: str
     features: typing.List[str]
 
+    def condition(self, physical_dev):
+        conds = []
+        if self.reqs.core_version:
+            conds.append(physical_dev + '->properties.apiVersion >= ' +
+                         self.reqs.core_version.c_vk_version())
+        for ext in self.reqs.extensions:
+            conds.append(physical_dev + '->supported_extensions.' +
+                         ext.name[3:])
+        return '(' + ' || '.join(conds) + ')'
+
 TEMPLATE_H = Template(COPYRIGHT + """
 /* This file generated from ${filename}, don't edit directly. */
 #ifndef VK_FEATURES_H
@@ -203,6 +214,10 @@ vk_physical_device_check_device_features(struct 
vk_physical_device *physical_dev
       switch (features->sType) {
 % for f in feature_structs:
       case ${f.s_type}:
+% if f.condition("physical_device"):
+         if (!${f.condition("physical_device")})
+            break;
+% endif
          supported = (VkBaseOutStructure *) &supported_${f.c_type};
          break;
 % endfor
@@ -252,6 +267,10 @@ vk_physical_device_check_device_features(struct 
vk_physical_device *physical_dev
       }
 % for f in feature_structs:
       case ${f.s_type}: {
+% if f.condition("physical_device"):
+         if (!${f.condition("physical_device")})
+            break;
+% endif
          const ${f.c_type} *a = &supported_${f.c_type};
          const ${f.c_type} *b = (const void *) features;
 % for flag in f.features:
@@ -365,8 +384,9 @@ def get_feature_structs(doc, api, beta):
         if _type.attrib['name'] not in required:
             continue
 
+        reqs = required[_type.attrib['name']]
         # Skip extensions with a define for now
-        guard = required[_type.attrib['name']].guard
+        guard = reqs.guard
         if guard is not None and (guard != "VK_ENABLE_BETA_EXTENSIONS" or not 
beta):
             continue
 
@@ -391,7 +411,7 @@ def get_feature_structs(doc, api, beta):
                 assert p.find('./type').text == 'VkBool32'
                 flags.append(m_name)
 
-        feature_struct = FeatureStruct(c_type=_type.attrib.get('name'), 
s_type=s_type, features=flags)
+        feature_struct = FeatureStruct(reqs=reqs, 
c_type=_type.attrib.get('name'), s_type=s_type, features=flags)
         feature_structs[feature_struct.c_type] = feature_struct
 
     return feature_structs.values()

Reply via email to