Mesa (master): zink: allow Extension/Version to be shared across files
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Dec 11 12:18:08 UTC 2020
Module: Mesa
Branch: master
Commit: 2f58d933ea8358ea80b374a5e23063e9bcc6e091
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2f58d933ea8358ea80b374a5e23063e9bcc6e091
Author: Hoe Hao Cheng <haochengho12907 at gmail.com>
Date: Fri Nov 27 00:50:59 2020 +0800
zink: allow Extension/Version to be shared across files
Acked-by: Adam Jackson <ajax at redhat.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7800>
---
src/gallium/drivers/zink/zink_device_info.py | 236 ++++++++-------------------
src/gallium/drivers/zink/zink_extensions.py | 93 +++++++++++
2 files changed, 164 insertions(+), 165 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_device_info.py b/src/gallium/drivers/zink/zink_device_info.py
index 91fdf6d02ac..fe06938fdf9 100644
--- a/src/gallium/drivers/zink/zink_device_info.py
+++ b/src/gallium/drivers/zink/zink_device_info.py
@@ -26,6 +26,7 @@
from mako.template import Template
from mako.lookup import TemplateLookup
from os import path
+from zink_extensions import Extension,Version
import sys
# constructor:
@@ -57,83 +58,81 @@ import sys
# given by vkEnumerateDeviceExtensionProperties() include the extension.
#
# - guard: adds a #if defined(`extension_name`)/#endif guard around the code generated for this Extension.
-def EXTENSIONS():
- return [
- Extension("VK_KHR_maintenance1",
- required=True),
- Extension("VK_KHR_external_memory"),
- Extension("VK_KHR_external_memory_fd"),
- Extension("VK_KHR_vulkan_memory_model"),
- Extension("VK_EXT_conditional_rendering",
- alias="cond_render",
- features=True,
- conditions=["$feats.conditionalRendering"]),
- Extension("VK_EXT_transform_feedback",
- alias="tf",
- properties=True,
- features=True,
- conditions=["$feats.transformFeedback"]),
- Extension("VK_EXT_index_type_uint8",
- alias="index_uint8",
- features=True,
- conditions=["$feats.indexTypeUint8"]),
- Extension("VK_EXT_robustness2",
- alias="rb2",
- properties=True,
- features=True,
- conditions=["$feats.nullDescriptor"]),
- Extension("VK_EXT_vertex_attribute_divisor",
- alias="vdiv",
- properties=True,
- features=True,
- conditions=["$feats.vertexAttributeInstanceRateDivisor"]),
- Extension("VK_EXT_calibrated_timestamps"),
- Extension("VK_EXT_custom_border_color",
- alias="border_color",
- properties=True,
- features=True,
- conditions=["$feats.customBorderColors"]),
- Extension("VK_EXT_blend_operation_advanced",
- alias="blend",
- properties=True,
- # TODO: we can probably support non-premul here with some work?
- conditions=["$props.advancedBlendNonPremultipliedSrcColor", "$props.advancedBlendNonPremultipliedDstColor"]),
- Extension("VK_EXT_extended_dynamic_state",
- alias="dynamic_state",
- features=True,
- conditions=["$feats.extendedDynamicState"]),
- Extension("VK_EXT_pipeline_creation_cache_control",
- alias="pipeline_cache_control",
- features=True,
- conditions=["$feats.pipelineCreationCacheControl"]),
- Extension("VK_EXT_shader_stencil_export",
- alias="stencil_export"),
- Extension("VK_EXTX_portability_subset",
- alias="portability_subset_extx",
- properties=True,
- features=True,
- guard=True),
- ]
+EXTENSIONS = [
+ Extension("VK_KHR_maintenance1",
+ required=True),
+ Extension("VK_KHR_external_memory"),
+ Extension("VK_KHR_external_memory_fd"),
+ Extension("VK_KHR_vulkan_memory_model"),
+ Extension("VK_EXT_conditional_rendering",
+ alias="cond_render",
+ features=True,
+ conditions=["$feats.conditionalRendering"]),
+ Extension("VK_EXT_transform_feedback",
+ alias="tf",
+ properties=True,
+ features=True,
+ conditions=["$feats.transformFeedback"]),
+ Extension("VK_EXT_index_type_uint8",
+ alias="index_uint8",
+ features=True,
+ conditions=["$feats.indexTypeUint8"]),
+ Extension("VK_EXT_robustness2",
+ alias="rb2",
+ properties=True,
+ features=True,
+ conditions=["$feats.nullDescriptor"]),
+ Extension("VK_EXT_vertex_attribute_divisor",
+ alias="vdiv",
+ properties=True,
+ features=True,
+ conditions=["$feats.vertexAttributeInstanceRateDivisor"]),
+ Extension("VK_EXT_calibrated_timestamps"),
+ Extension("VK_EXT_custom_border_color",
+ alias="border_color",
+ properties=True,
+ features=True,
+ conditions=["$feats.customBorderColors"]),
+ Extension("VK_EXT_blend_operation_advanced",
+ alias="blend",
+ properties=True,
+ # TODO: we can probably support non-premul here with some work?
+ conditions=["$props.advancedBlendNonPremultipliedSrcColor", "$props.advancedBlendNonPremultipliedDstColor"]),
+ Extension("VK_EXT_extended_dynamic_state",
+ alias="dynamic_state",
+ features=True,
+ conditions=["$feats.extendedDynamicState"]),
+ Extension("VK_EXT_pipeline_creation_cache_control",
+ alias="pipeline_cache_control",
+ features=True,
+ conditions=["$feats.pipelineCreationCacheControl"]),
+ Extension("VK_EXT_shader_stencil_export",
+ alias="stencil_export"),
+ Extension("VK_EXTX_portability_subset",
+ alias="portability_subset_extx",
+ properties=True,
+ features=True,
+ guard=True),
+]
# constructor: Versions(device_version(major, minor, patch), struct_version(major, minor))
# The attributes:
-# - device_version: Vulkan version, as tuple, to use with VK_MAKE_VERSION(version_major, version_minor, version_patch)
+# - device_version: Vulkan version, as tuple, to use with
+# VK_MAKE_VERSION(version_major, version_minor, version_patch)
#
# - struct_version: Vulkan version, as tuple, to use with structures and macros
-def VERSIONS():
- return [
- # VkPhysicalDeviceVulkan11Properties and VkPhysicalDeviceVulkan11Features is new from Vk 1.2, not Vk 1.1
- # https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#_new_structures
- Version((1,2,0), (1,1)),
- Version((1,2,0), (1,2)),
- ]
+VERSIONS = [
+ # VkPhysicalDeviceVulkan11Properties and VkPhysicalDeviceVulkan11Features is new from Vk 1.2, not Vk 1.1
+ # https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#_new_structures
+ Version((1,2,0), (1,1)),
+ Version((1,2,0), (1,2)),
+]
# There exists some inconsistencies regarding the enum constants, fix them.
# This is basically generated_code.replace(key, value).
-def REPLACEMENTS():
- return {
- "ROBUSTNESS2": "ROBUSTNESS_2"
- }
+REPLACEMENTS = {
+ "ROBUSTNESS2": "ROBUSTNESS_2"
+}
# This template provides helper functions for the other templates.
@@ -376,99 +375,6 @@ fail:
}
"""
-class Version:
- driver_version : (1,0,0)
- struct_version : (1,0)
-
- def __init__(self, version, struct):
- self.device_version = version
- self.struct_version = struct
-
- # e.g. "VM_MAKE_VERSION(1,2,0)"
- def version(self):
- return ("VK_MAKE_VERSION("
- + str(self.device_version[0])
- + ","
- + str(self.device_version[1])
- + ","
- + str(self.device_version[2])
- + ")")
-
- # e.g. "10"
- def struct(self):
- return (str(self.struct_version[0])+str(self.struct_version[1]))
-
- # the sType of the extension's struct
- # e.g. VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT
- # for VK_EXT_transform_feedback and struct="FEATURES"
- def stype(self, struct: str):
- return ("VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_"
- + str(self.struct_version[0]) + "_" + str(self.struct_version[1])
- + '_' + struct)
-
-class Extension:
- name : str = None
- alias : str = None
- is_required : bool = False
- has_properties : bool = False
- has_features : bool = False
- enable_conds : [str] = None
- guard : bool = False
-
- def __init__(self, name, alias="", required=False, properties=False, features=False, conditions=None, guard=False):
- self.name = name
- self.alias = alias
- self.is_required = required
- self.has_properties = properties
- self.has_features = features
- self.enable_conds = conditions
- self.guard = guard
-
- if alias == "" and (properties == True or features == True):
- raise RuntimeError("alias must be available when properties and/or features are used")
-
- # e.g.: "VK_EXT_robustness2" -> "robustness2"
- def pure_name(self):
- return '_'.join(self.name.split('_')[2:])
-
- # e.g.: "VK_EXT_robustness2" -> "EXT_robustness2"
- def name_with_vendor(self):
- return self.name[3:]
-
- # e.g.: "VK_EXT_robustness2" -> "Robustness2"
- def name_in_camel_case(self):
- return "".join([x.title() for x in self.name.split('_')[2:]])
-
- # e.g.: "VK_EXT_robustness2" -> "VK_EXT_ROBUSTNESS2_EXTENSION_NAME"
- # do note that inconsistencies exist, i.e. we have
- # VK_EXT_ROBUSTNESS_2_EXTENSION_NAME defined in the headers, but then
- # we also have VK_KHR_MAINTENANCE1_EXTENSION_NAME
- def extension_name(self):
- return self.name.upper() + "_EXTENSION_NAME"
-
- # generate a C string literal for the extension
- def extension_name_literal(self):
- return '"' + self.name + '"'
-
- # get the field in zink_device_info that refers to the extension's
- # feature/properties struct
- # e.g. rb2_<suffix> for VK_EXT_robustness2
- def field(self, suffix: str):
- return self.alias + '_' + suffix
-
- # the sType of the extension's struct
- # e.g. VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT
- # for VK_EXT_transform_feedback and struct="FEATURES"
- def stype(self, struct: str):
- return ("VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_"
- + self.pure_name().upper()
- + '_' + struct + '_'
- + self.vendor())
-
- # e.g. EXT in VK_EXT_robustness2
- def vendor(self):
- return self.name.split('_')[1]
-
def replace_code(code: str, replacement: dict):
for (k, v) in replacement.items():
@@ -488,9 +394,9 @@ if __name__ == "__main__":
print("usage: %s <path to .h> <path to .c>" % sys.argv[0])
exit(1)
- extensions = EXTENSIONS()
- versions = VERSIONS()
- replacement = REPLACEMENTS()
+ extensions = EXTENSIONS
+ versions = VERSIONS
+ replacement = REPLACEMENTS
lookup = TemplateLookup()
lookup.put_string("helpers", include_template)
diff --git a/src/gallium/drivers/zink/zink_extensions.py b/src/gallium/drivers/zink/zink_extensions.py
new file mode 100644
index 00000000000..f5db8accf16
--- /dev/null
+++ b/src/gallium/drivers/zink/zink_extensions.py
@@ -0,0 +1,93 @@
+class Extension:
+ name : str = None
+ alias : str = None
+ is_required : bool = False
+ has_properties : bool = False
+ has_features : bool = False
+ enable_conds : [str] = None
+ guard : bool = False
+
+ def __init__(self, name, alias="", required=False, properties=False, features=False, conditions=None, guard=False):
+ self.name = name
+ self.alias = alias
+ self.is_required = required
+ self.has_properties = properties
+ self.has_features = features
+ self.enable_conds = conditions
+ self.guard = guard
+
+ if alias == "" and (properties == True or features == True):
+ raise RuntimeError("alias must be available when properties and/or features are used")
+
+ # e.g.: "VK_EXT_robustness2" -> "robustness2"
+ def pure_name(self):
+ return '_'.join(self.name.split('_')[2:])
+
+ # e.g.: "VK_EXT_robustness2" -> "EXT_robustness2"
+ def name_with_vendor(self):
+ return self.name[3:]
+
+ # e.g.: "VK_EXT_robustness2" -> "Robustness2"
+ def name_in_camel_case(self):
+ return "".join([x.title() for x in self.name.split('_')[2:]])
+
+ # e.g.: "VK_EXT_robustness2" -> "VK_EXT_ROBUSTNESS2_EXTENSION_NAME"
+ # do note that inconsistencies exist, i.e. we have
+ # VK_EXT_ROBUSTNESS_2_EXTENSION_NAME defined in the headers, but then
+ # we also have VK_KHR_MAINTENANCE1_EXTENSION_NAME
+ def extension_name(self):
+ return self.name.upper() + "_EXTENSION_NAME"
+
+ # generate a C string literal for the extension
+ def extension_name_literal(self):
+ return '"' + self.name + '"'
+
+ # get the field in zink_device_info that refers to the extension's
+ # feature/properties struct
+ # e.g. rb2_<suffix> for VK_EXT_robustness2
+ def field(self, suffix: str):
+ return self.alias + '_' + suffix
+
+ # the sType of the extension's struct
+ # e.g. VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT
+ # for VK_EXT_transform_feedback and struct="FEATURES"
+ def stype(self, struct: str):
+ return ("VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_"
+ + self.pure_name().upper()
+ + '_' + struct + '_'
+ + self.vendor())
+
+ # e.g. EXT in VK_EXT_robustness2
+ def vendor(self):
+ return self.name.split('_')[1]
+
+
+class Version:
+ driver_version : (1,0,0)
+ struct_version : (1,0)
+
+ def __init__(self, version, struct):
+ self.device_version = version
+ self.struct_version = struct
+
+ # e.g. "VM_MAKE_VERSION(1,2,0)"
+ def version(self):
+ return ("VK_MAKE_VERSION("
+ + str(self.device_version[0])
+ + ","
+ + str(self.device_version[1])
+ + ","
+ + str(self.device_version[2])
+ + ")")
+
+ # e.g. "10"
+ def struct(self):
+ return (str(self.struct_version[0])+str(self.struct_version[1]))
+
+ # the sType of the extension's struct
+ # e.g. VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT
+ # for VK_EXT_transform_feedback and struct="FEATURES"
+ def stype(self, struct: str):
+ return ("VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_"
+ + str(self.struct_version[0]) + "_" + str(self.struct_version[1])
+ + '_' + struct)
More information about the mesa-commit
mailing list