mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2024-12-28 18:46:18 +00:00
a/vk: Also generate the extension list/checking
This commit is contained in:
parent
9fc992d540
commit
8a56046c1d
|
@ -4,9 +4,10 @@
|
||||||
"""Simple script to update vk_helpers.{c,h}."""
|
"""Simple script to update vk_helpers.{c,h}."""
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import List, Tuple
|
from typing import List, Optional, Tuple
|
||||||
|
|
||||||
# Each tuple is a function name, followed optionally by one or more conditions to test in the preprocessor, which will be wrapped in "defined()"
|
# Each tuple is a function name, followed optionally by one or more conditions
|
||||||
|
# to test in the preprocessor, which will be wrapped in "defined()"
|
||||||
# if they aren't already. Empty tuples insert a blank line.
|
# if they aren't already. Empty tuples insert a blank line.
|
||||||
|
|
||||||
DEVICE_FUNCTIONS = [
|
DEVICE_FUNCTIONS = [
|
||||||
|
@ -180,9 +181,9 @@ INSTANCE_FUNCTIONS = [
|
||||||
]
|
]
|
||||||
|
|
||||||
EXTENSIONS_TO_CHECK = [
|
EXTENSIONS_TO_CHECK = [
|
||||||
"GOOGLE_display_timing",
|
"VK_GOOGLE_display_timing",
|
||||||
"EXT_global_priority",
|
"VK_EXT_global_priority",
|
||||||
"EXT_robustness2",
|
"VK_EXT_robustness2",
|
||||||
]
|
]
|
||||||
|
|
||||||
ROOT = Path(__file__).resolve().parent.parent
|
ROOT = Path(__file__).resolve().parent.parent
|
||||||
|
@ -206,31 +207,52 @@ def compute_condition(pp_conditions):
|
||||||
return " && ".join(wrap_condition(x) for x in pp_conditions)
|
return " && ".join(wrap_condition(x) for x in pp_conditions)
|
||||||
|
|
||||||
|
|
||||||
|
class ConditionalGenerator:
|
||||||
|
"""Keep track of conditions to avoid unneeded repetition of ifdefs."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.current_condition = None
|
||||||
|
|
||||||
|
def process_condition(self, new_condition: Optional[str]) -> Optional[str]:
|
||||||
|
"""Return a line (or lines) to yield if required based on the new condition state."""
|
||||||
|
lines = []
|
||||||
|
if self.current_condition and new_condition != self.current_condition:
|
||||||
|
# Close current condition if required.
|
||||||
|
lines.append("#endif // {}".format(self.current_condition))
|
||||||
|
# empty line
|
||||||
|
lines.append("")
|
||||||
|
self.current_condition = None
|
||||||
|
|
||||||
|
if new_condition != self.current_condition:
|
||||||
|
# Open new condition if required
|
||||||
|
lines.append("#if {}".format(new_condition))
|
||||||
|
self.current_condition = new_condition
|
||||||
|
|
||||||
|
if lines:
|
||||||
|
return "\n".join(lines)
|
||||||
|
|
||||||
|
def finish(self) -> Optional[str]:
|
||||||
|
"""Return a line (or lines) to yield if required at the end of the loop."""
|
||||||
|
return self.process_condition(None)
|
||||||
|
|
||||||
|
|
||||||
def generate_per_function(functions: List[Tuple[str, ...]], per_function_handler):
|
def generate_per_function(functions: List[Tuple[str, ...]], per_function_handler):
|
||||||
current_condition = None
|
conditional = ConditionalGenerator()
|
||||||
for data in functions:
|
for data in functions:
|
||||||
if not data:
|
if not data:
|
||||||
# empty line
|
# empty line
|
||||||
yield ""
|
yield ""
|
||||||
continue
|
continue
|
||||||
new_condition = compute_condition(data[1:])
|
condition_line = conditional.process_condition(compute_condition(data[1:]))
|
||||||
if current_condition and new_condition != current_condition:
|
if condition_line:
|
||||||
# Close current condition if required.
|
yield condition_line
|
||||||
yield "#endif // {}".format(current_condition)
|
|
||||||
# empty line
|
|
||||||
yield ""
|
|
||||||
current_condition = None
|
|
||||||
|
|
||||||
if new_condition != current_condition:
|
|
||||||
# Open new condition if required
|
|
||||||
yield "#if {}".format(new_condition)
|
|
||||||
current_condition = new_condition
|
|
||||||
|
|
||||||
yield per_function_handler(data[0])
|
yield per_function_handler(data[0])
|
||||||
|
|
||||||
# close any trailing conditions
|
# close any trailing conditions
|
||||||
if current_condition:
|
condition_line = conditional.finish()
|
||||||
yield "#endif // {}".format(current_condition)
|
if condition_line:
|
||||||
|
yield condition_line
|
||||||
|
|
||||||
|
|
||||||
def generate_structure_members(functions: List[Tuple[str, ...]]):
|
def generate_structure_members(functions: List[Tuple[str, ...]]):
|
||||||
|
@ -254,6 +276,46 @@ def generate_dev_proc(functions: List[Tuple[str, ...]]):
|
||||||
return generate_per_function(functions, per_function)
|
return generate_per_function(functions, per_function)
|
||||||
|
|
||||||
|
|
||||||
|
def make_ext_member_name(ext: str):
|
||||||
|
return "has_{}".format(ext[3:])
|
||||||
|
|
||||||
|
|
||||||
|
def make_ext_name_define(ext: str):
|
||||||
|
return "{}_EXTENSION_NAME".format(ext.upper()).replace("2", "_2")
|
||||||
|
|
||||||
|
|
||||||
|
def generate_ext_members():
|
||||||
|
for ext in EXTENSIONS_TO_CHECK:
|
||||||
|
yield "\tbool {};".format(make_ext_member_name(ext))
|
||||||
|
|
||||||
|
|
||||||
|
def generate_ext_check():
|
||||||
|
yield "\t// Reset before filling out."
|
||||||
|
|
||||||
|
for ext in EXTENSIONS_TO_CHECK:
|
||||||
|
yield "\tvk->{} = false;".format(make_ext_member_name(ext))
|
||||||
|
|
||||||
|
yield ""
|
||||||
|
yield "\tfor (uint32_t i = 0; i < device_extension_count; i++) {"
|
||||||
|
yield "\t\tconst char *ext = device_extensions[i];"
|
||||||
|
yield ""
|
||||||
|
|
||||||
|
conditional = ConditionalGenerator()
|
||||||
|
for ext in EXTENSIONS_TO_CHECK:
|
||||||
|
condition_line = conditional.process_condition(compute_condition((ext,)))
|
||||||
|
if condition_line:
|
||||||
|
yield condition_line
|
||||||
|
yield "\t\tif (strcmp(ext, {}) == 0) {{".format(make_ext_name_define(ext))
|
||||||
|
yield "\t\t\tvk->{} = true;".format(make_ext_member_name(ext))
|
||||||
|
yield "\t\t\tcontinue;"
|
||||||
|
yield "\t\t}"
|
||||||
|
# close any trailing conditions
|
||||||
|
condition_line = conditional.finish()
|
||||||
|
if condition_line:
|
||||||
|
yield condition_line
|
||||||
|
yield "\t}"
|
||||||
|
|
||||||
|
|
||||||
def replace_middle(
|
def replace_middle(
|
||||||
lines: List[str], start_sentinel: str, end_sentinel: str, new_middle: List[str]
|
lines: List[str], start_sentinel: str, end_sentinel: str, new_middle: List[str]
|
||||||
) -> List[str]:
|
) -> List[str]:
|
||||||
|
@ -293,6 +355,12 @@ def process_header():
|
||||||
DEVICE_TEMPLATES["END"],
|
DEVICE_TEMPLATES["END"],
|
||||||
list(generate_structure_members(DEVICE_FUNCTIONS)),
|
list(generate_structure_members(DEVICE_FUNCTIONS)),
|
||||||
)
|
)
|
||||||
|
lines = replace_middle(
|
||||||
|
lines,
|
||||||
|
EXT_TEMPLATES["BEGIN"],
|
||||||
|
EXT_TEMPLATES["END"],
|
||||||
|
list(generate_ext_members()),
|
||||||
|
)
|
||||||
|
|
||||||
with open(str(HEADER_FN), "w", encoding="utf-8") as fp:
|
with open(str(HEADER_FN), "w", encoding="utf-8") as fp:
|
||||||
fp.write("\n".join(lines))
|
fp.write("\n".join(lines))
|
||||||
|
@ -317,6 +385,13 @@ def process_impl():
|
||||||
list(generate_dev_proc(DEVICE_FUNCTIONS)),
|
list(generate_dev_proc(DEVICE_FUNCTIONS)),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
lines = replace_middle(
|
||||||
|
lines,
|
||||||
|
EXT_TEMPLATES["BEGIN"],
|
||||||
|
EXT_TEMPLATES["END"],
|
||||||
|
list(generate_ext_check()),
|
||||||
|
)
|
||||||
|
|
||||||
with open(str(IMPL_FN), "w", encoding="utf-8") as fp:
|
with open(str(IMPL_FN), "w", encoding="utf-8") as fp:
|
||||||
fp.write("\n".join(lines))
|
fp.write("\n".join(lines))
|
||||||
fp.write("\n")
|
fp.write("\n")
|
||||||
|
|
|
@ -884,7 +884,8 @@ vk_get_instance_functions(struct vk_bundle *vk)
|
||||||
#if defined(VK_USE_PLATFORM_WIN32_KHR)
|
#if defined(VK_USE_PLATFORM_WIN32_KHR)
|
||||||
vk->vkCreateWin32SurfaceKHR = GET_INS_PROC(vk, vkCreateWin32SurfaceKHR);
|
vk->vkCreateWin32SurfaceKHR = GET_INS_PROC(vk, vkCreateWin32SurfaceKHR);
|
||||||
#endif // defined(VK_USE_PLATFORM_WIN32_KHR)
|
#endif // defined(VK_USE_PLATFORM_WIN32_KHR)
|
||||||
// end of GENERATED instance loader code - do not modify - used by scripts
|
|
||||||
|
// end of GENERATED instance loader code - do not modify - used by scripts
|
||||||
|
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1220,6 +1221,7 @@ vk_check_extension(struct vk_bundle *vk, VkExtensionProperties *props, uint32_t
|
||||||
static void
|
static void
|
||||||
fill_in_has_extensions(struct vk_bundle *vk, const char **device_extensions, uint32_t num_device_extensions)
|
fill_in_has_extensions(struct vk_bundle *vk, const char **device_extensions, uint32_t num_device_extensions)
|
||||||
{
|
{
|
||||||
|
// beginning of GENERATED extension code - do not modify - used by scripts
|
||||||
// Reset before filling out.
|
// Reset before filling out.
|
||||||
vk->has_GOOGLE_display_timing = false;
|
vk->has_GOOGLE_display_timing = false;
|
||||||
vk->has_EXT_global_priority = false;
|
vk->has_EXT_global_priority = false;
|
||||||
|
@ -1228,18 +1230,28 @@ fill_in_has_extensions(struct vk_bundle *vk, const char **device_extensions, uin
|
||||||
for (uint32_t i = 0; i < num_device_extensions; i++) {
|
for (uint32_t i = 0; i < num_device_extensions; i++) {
|
||||||
const char *ext = device_extensions[i];
|
const char *ext = device_extensions[i];
|
||||||
|
|
||||||
|
#if defined(VK_GOOGLE_display_timing)
|
||||||
if (strcmp(ext, VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME) == 0) {
|
if (strcmp(ext, VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME) == 0) {
|
||||||
vk->has_GOOGLE_display_timing = true;
|
vk->has_GOOGLE_display_timing = true;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
#endif // defined(VK_GOOGLE_display_timing)
|
||||||
|
|
||||||
|
#if defined(VK_EXT_global_priority)
|
||||||
if (strcmp(ext, VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME) == 0) {
|
if (strcmp(ext, VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME) == 0) {
|
||||||
vk->has_EXT_global_priority = true;
|
vk->has_EXT_global_priority = true;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
#ifdef VK_EXT_robustness2
|
#endif // defined(VK_EXT_global_priority)
|
||||||
|
|
||||||
|
#if defined(VK_EXT_robustness2)
|
||||||
if (strcmp(ext, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME) == 0) {
|
if (strcmp(ext, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME) == 0) {
|
||||||
vk->has_EXT_robustness2 = true;
|
vk->has_EXT_robustness2 = true;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif // defined(VK_EXT_robustness2)
|
||||||
}
|
}
|
||||||
|
// end of GENERATED extension code - do not modify - used by scripts
|
||||||
}
|
}
|
||||||
|
|
||||||
static VkResult
|
static VkResult
|
||||||
|
|
|
@ -48,9 +48,11 @@ struct vk_bundle
|
||||||
|
|
||||||
struct os_mutex queue_mutex;
|
struct os_mutex queue_mutex;
|
||||||
|
|
||||||
|
// beginning of GENERATED extension code - do not modify - used by scripts
|
||||||
bool has_GOOGLE_display_timing;
|
bool has_GOOGLE_display_timing;
|
||||||
bool has_EXT_global_priority;
|
bool has_EXT_global_priority;
|
||||||
bool has_EXT_robustness2;
|
bool has_EXT_robustness2;
|
||||||
|
// end of GENERATED extension code - do not modify - used by scripts
|
||||||
|
|
||||||
bool is_tegra;
|
bool is_tegra;
|
||||||
|
|
||||||
|
@ -129,6 +131,7 @@ struct vk_bundle
|
||||||
#if defined(VK_USE_PLATFORM_WIN32_KHR)
|
#if defined(VK_USE_PLATFORM_WIN32_KHR)
|
||||||
PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;
|
PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;
|
||||||
#endif // defined(VK_USE_PLATFORM_WIN32_KHR)
|
#endif // defined(VK_USE_PLATFORM_WIN32_KHR)
|
||||||
|
|
||||||
// end of GENERATED instance loader code - do not modify - used by scripts
|
// end of GENERATED instance loader code - do not modify - used by scripts
|
||||||
|
|
||||||
// beginning of GENERATED device loader code - do not modify - used by scripts
|
// beginning of GENERATED device loader code - do not modify - used by scripts
|
||||||
|
|
Loading…
Reference in a new issue