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>
This commit is contained in:
@@ -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()
|
||||
|
Reference in New Issue
Block a user