/* Hash table stats:
* size ${len(strmap.sorted_strings)} entries
* collisions entries:
-% for i in xrange(10):
+% for i in range(10):
* ${i}${'+' if i == 9 else ' '} ${strmap.collisions[i]}
% endfor
*/
}
}
+static bool
+radv_entrypoint_is_enabled_physical_device(int index, uint32_t core_version,
+ const struct radv_instance_extension_table *instance)
+{
+ switch (index) {
+% for e in entrypoints:
+ %if e.physical_device_command:
+ case ${e.num}:
+ % if e.core_version:
+ return instance && ${e.core_version.c_vk_version()} <= core_version;
+ % elif e.extensions:
+ % for ext in e.extensions:
+ % if ext.type == 'instance':
+ if (instance && instance->${ext.name[3:]}) return true;
+ % else:
+ return true;
+ % endif
+ %endfor
+ return false;
+ % else:
+ return instance;
+ % endif
+ %endif
+% endfor
+ default:
+ return false;
+ }
+}
+
static int
radv_lookup_entrypoint(const char *name)
{
if (index < 0 || !radv_entrypoint_is_enabled(index, core_version, instance, device))
return NULL;
return radv_resolve_entrypoint(index);
-}""", output_encoding='utf-8')
+}
+
+void *
+radv_lookup_physical_device_entrypoint_checked(const char *name,
+ uint32_t core_version,
+ const struct radv_instance_extension_table *instance)
+{
+ int index = radv_lookup_entrypoint(name);
+ if (index < 0 || !radv_entrypoint_is_enabled_physical_device(index, core_version, instance))
+ return NULL;
+ return radv_resolve_entrypoint(index);
+}
+
+""", output_encoding='utf-8')
U32_MASK = 2**32 - 1
self.params = params
self.guard = guard
self.device_command = len(params) > 0 and (params[0].type == 'VkDevice' or params[0].type == 'VkQueue' or params[0].type == 'VkCommandBuffer')
+ self.physical_device_command = len(params) > 0 and params[0].type == 'VkPhysicalDevice'
def prefixed_name(self, prefix):
assert self.name.startswith('vk')
super(EntrypointAlias, self).__init__(name)
self.alias = entrypoint
self.device_command = entrypoint.device_command
+ self.physical_device_command = entrypoint.physical_device_command
def prefixed_name(self, prefix):
return self.alias.prefixed_name(prefix)
if ext_name not in supported_exts:
continue
- if extension.attrib['supported'] != 'vulkan':
- continue
-
ext = supported_exts[ext_name]
ext.type = extension.attrib['type']
e_clone.name = e.name
entrypoints[e.name] = e_clone
- return [e for e in entrypoints.itervalues() if e.enabled]
+ return [e for e in entrypoints.values() if e.enabled]
def get_entrypoints_defines(doc):
fullname = entrypoint.attrib['name']
entrypoints_to_defines[fullname] = define
+ platform_define = {}
+ for platform in doc.findall('./platforms/platform'):
+ name = platform.attrib['name']
+ define = platform.attrib['protect']
+ platform_define[name] = define
+
for extension in doc.findall('./extensions/extension[@platform]'):
platform = extension.attrib['platform']
- define = 'VK_USE_PLATFORM_' + platform.upper() + '_KHR'
+ define = platform_define[platform]
for entrypoint in extension.findall('./require/command'):
fullname = entrypoint.attrib['name']