mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 21:40:08 +01:00
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:
parent
2816db0182
commit
eb5bb5c784
1 changed files with 23 additions and 3 deletions
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue