1*90277196SAndroid Build Coastguard Worker#!/usr/bin/env python3 -i 2*90277196SAndroid Build Coastguard Worker# 3*90277196SAndroid Build Coastguard Worker# Copyright 2013-2024 The Khronos Group Inc. 4*90277196SAndroid Build Coastguard Worker# 5*90277196SAndroid Build Coastguard Worker# SPDX-License-Identifier: Apache-2.0 6*90277196SAndroid Build Coastguard Worker 7*90277196SAndroid Build Coastguard Worker# Working-group-specific style conventions, 8*90277196SAndroid Build Coastguard Worker# used in generation. 9*90277196SAndroid Build Coastguard Worker 10*90277196SAndroid Build Coastguard Workerimport re 11*90277196SAndroid Build Coastguard Workerimport os 12*90277196SAndroid Build Coastguard Worker 13*90277196SAndroid Build Coastguard Workerfrom spec_tools.conventions import ConventionsBase 14*90277196SAndroid Build Coastguard Worker 15*90277196SAndroid Build Coastguard Worker# Modified from default implementation - see category_requires_validation() below 16*90277196SAndroid Build Coastguard WorkerCATEGORIES_REQUIRING_VALIDATION = set(('handle', 'enum', 'bitmask')) 17*90277196SAndroid Build Coastguard Worker 18*90277196SAndroid Build Coastguard Worker# Tokenize into "words" for structure types, approximately per spec "Implicit Valid Usage" section 2.7.2 19*90277196SAndroid Build Coastguard Worker# This first set is for things we recognize explicitly as words, 20*90277196SAndroid Build Coastguard Worker# as exceptions to the general regex. 21*90277196SAndroid Build Coastguard Worker# Ideally these would be listed in the spec as exceptions, as OpenXR does. 22*90277196SAndroid Build Coastguard WorkerSPECIAL_WORDS = set(( 23*90277196SAndroid Build Coastguard Worker '16Bit', # VkPhysicalDevice16BitStorageFeatures 24*90277196SAndroid Build Coastguard Worker '2D', # VkPhysicalDeviceImage2DViewOf3DFeaturesEXT 25*90277196SAndroid Build Coastguard Worker '3D', # VkPhysicalDeviceImage2DViewOf3DFeaturesEXT 26*90277196SAndroid Build Coastguard Worker '8Bit', # VkPhysicalDevice8BitStorageFeaturesKHR 27*90277196SAndroid Build Coastguard Worker 'AABB', # VkGeometryAABBNV 28*90277196SAndroid Build Coastguard Worker 'ASTC', # VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT 29*90277196SAndroid Build Coastguard Worker 'D3D12', # VkD3D12FenceSubmitInfoKHR 30*90277196SAndroid Build Coastguard Worker 'Float16', # VkPhysicalDeviceShaderFloat16Int8FeaturesKHR 31*90277196SAndroid Build Coastguard Worker 'ImagePipe', # VkImagePipeSurfaceCreateInfoFUCHSIA 32*90277196SAndroid Build Coastguard Worker 'Int64', # VkPhysicalDeviceShaderAtomicInt64FeaturesKHR 33*90277196SAndroid Build Coastguard Worker 'Int8', # VkPhysicalDeviceShaderFloat16Int8FeaturesKHR 34*90277196SAndroid Build Coastguard Worker 'MacOS', # VkMacOSSurfaceCreateInfoMVK 35*90277196SAndroid Build Coastguard Worker 'RGBA10X6', # VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT 36*90277196SAndroid Build Coastguard Worker 'Uint8', # VkPhysicalDeviceIndexTypeUint8FeaturesEXT 37*90277196SAndroid Build Coastguard Worker 'Win32', # VkWin32SurfaceCreateInfoKHR 38*90277196SAndroid Build Coastguard Worker)) 39*90277196SAndroid Build Coastguard Worker# A regex to match any of the SPECIAL_WORDS 40*90277196SAndroid Build Coastguard WorkerEXCEPTION_PATTERN = r'(?P<exception>{})'.format( 41*90277196SAndroid Build Coastguard Worker '|'.join('(%s)' % re.escape(w) for w in SPECIAL_WORDS)) 42*90277196SAndroid Build Coastguard WorkerMAIN_RE = re.compile( 43*90277196SAndroid Build Coastguard Worker # the negative lookahead is to prevent the all-caps pattern from being too greedy. 44*90277196SAndroid Build Coastguard Worker r'({}|([0-9]+)|([A-Z][a-z]+)|([A-Z][A-Z]*(?![a-z])))'.format(EXCEPTION_PATTERN)) 45*90277196SAndroid Build Coastguard Worker 46*90277196SAndroid Build Coastguard Worker 47*90277196SAndroid Build Coastguard Workerclass VulkanConventions(ConventionsBase): 48*90277196SAndroid Build Coastguard Worker @property 49*90277196SAndroid Build Coastguard Worker def null(self): 50*90277196SAndroid Build Coastguard Worker """Preferred spelling of NULL.""" 51*90277196SAndroid Build Coastguard Worker return '`NULL`' 52*90277196SAndroid Build Coastguard Worker 53*90277196SAndroid Build Coastguard Worker def formatVersion(self, name, apivariant, major, minor): 54*90277196SAndroid Build Coastguard Worker """Mark up an API version name as a link in the spec.""" 55*90277196SAndroid Build Coastguard Worker version = f'{major}.{minor}' 56*90277196SAndroid Build Coastguard Worker if apivariant == 'VKSC': 57*90277196SAndroid Build Coastguard Worker # Vulkan SC has a different anchor pattern for version appendices 58*90277196SAndroid Build Coastguard Worker if version == '1.0': 59*90277196SAndroid Build Coastguard Worker return 'Vulkan SC 1.0' 60*90277196SAndroid Build Coastguard Worker else: 61*90277196SAndroid Build Coastguard Worker return f'<<versions-sc-{version}, Vulkan SC Version {version}>>' 62*90277196SAndroid Build Coastguard Worker else: 63*90277196SAndroid Build Coastguard Worker return f'<<versions-{version}, Vulkan Version {version}>>' 64*90277196SAndroid Build Coastguard Worker 65*90277196SAndroid Build Coastguard Worker def formatExtension(self, name): 66*90277196SAndroid Build Coastguard Worker """Mark up an extension name as a link in the spec.""" 67*90277196SAndroid Build Coastguard Worker return f'apiext:{name}' 68*90277196SAndroid Build Coastguard Worker 69*90277196SAndroid Build Coastguard Worker @property 70*90277196SAndroid Build Coastguard Worker def struct_macro(self): 71*90277196SAndroid Build Coastguard Worker """Get the appropriate format macro for a structure. 72*90277196SAndroid Build Coastguard Worker 73*90277196SAndroid Build Coastguard Worker Primarily affects generated valid usage statements. 74*90277196SAndroid Build Coastguard Worker """ 75*90277196SAndroid Build Coastguard Worker 76*90277196SAndroid Build Coastguard Worker return 'slink:' 77*90277196SAndroid Build Coastguard Worker 78*90277196SAndroid Build Coastguard Worker @property 79*90277196SAndroid Build Coastguard Worker def constFlagBits(self): 80*90277196SAndroid Build Coastguard Worker """Returns True if static const flag bits should be generated, False if an enumerated type should be generated.""" 81*90277196SAndroid Build Coastguard Worker return False 82*90277196SAndroid Build Coastguard Worker 83*90277196SAndroid Build Coastguard Worker @property 84*90277196SAndroid Build Coastguard Worker def structtype_member_name(self): 85*90277196SAndroid Build Coastguard Worker """Return name of the structure type member""" 86*90277196SAndroid Build Coastguard Worker return 'sType' 87*90277196SAndroid Build Coastguard Worker 88*90277196SAndroid Build Coastguard Worker @property 89*90277196SAndroid Build Coastguard Worker def nextpointer_member_name(self): 90*90277196SAndroid Build Coastguard Worker """Return name of the structure pointer chain member""" 91*90277196SAndroid Build Coastguard Worker return 'pNext' 92*90277196SAndroid Build Coastguard Worker 93*90277196SAndroid Build Coastguard Worker @property 94*90277196SAndroid Build Coastguard Worker def valid_pointer_prefix(self): 95*90277196SAndroid Build Coastguard Worker """Return prefix to pointers which must themselves be valid""" 96*90277196SAndroid Build Coastguard Worker return 'valid' 97*90277196SAndroid Build Coastguard Worker 98*90277196SAndroid Build Coastguard Worker def is_structure_type_member(self, paramtype, paramname): 99*90277196SAndroid Build Coastguard Worker """Determine if member type and name match the structure type member.""" 100*90277196SAndroid Build Coastguard Worker return paramtype == 'VkStructureType' and paramname == self.structtype_member_name 101*90277196SAndroid Build Coastguard Worker 102*90277196SAndroid Build Coastguard Worker def is_nextpointer_member(self, paramtype, paramname): 103*90277196SAndroid Build Coastguard Worker """Determine if member type and name match the next pointer chain member.""" 104*90277196SAndroid Build Coastguard Worker return paramtype == 'void' and paramname == self.nextpointer_member_name 105*90277196SAndroid Build Coastguard Worker 106*90277196SAndroid Build Coastguard Worker def generate_structure_type_from_name(self, structname): 107*90277196SAndroid Build Coastguard Worker """Generate a structure type name, like VK_STRUCTURE_TYPE_CREATE_INSTANCE_INFO""" 108*90277196SAndroid Build Coastguard Worker 109*90277196SAndroid Build Coastguard Worker structure_type_parts = [] 110*90277196SAndroid Build Coastguard Worker # Tokenize into "words" 111*90277196SAndroid Build Coastguard Worker for elem in MAIN_RE.findall(structname): 112*90277196SAndroid Build Coastguard Worker word = elem[0] 113*90277196SAndroid Build Coastguard Worker if word == 'Vk': 114*90277196SAndroid Build Coastguard Worker structure_type_parts.append('VK_STRUCTURE_TYPE') 115*90277196SAndroid Build Coastguard Worker else: 116*90277196SAndroid Build Coastguard Worker structure_type_parts.append(word.upper()) 117*90277196SAndroid Build Coastguard Worker name = '_'.join(structure_type_parts) 118*90277196SAndroid Build Coastguard Worker 119*90277196SAndroid Build Coastguard Worker # The simple-minded rules need modification for some structure names 120*90277196SAndroid Build Coastguard Worker subpats = [ 121*90277196SAndroid Build Coastguard Worker [ r'_H_(26[45])_', r'_H\1_' ], 122*90277196SAndroid Build Coastguard Worker [ r'_AV_1_', r'_AV1_' ], 123*90277196SAndroid Build Coastguard Worker [ r'_VULKAN_([0-9])([0-9])_', r'_VULKAN_\1_\2_' ], 124*90277196SAndroid Build Coastguard Worker [ r'_VULKAN_SC_([0-9])([0-9])_',r'_VULKAN_SC_\1_\2_' ], 125*90277196SAndroid Build Coastguard Worker [ r'_DIRECT_FB_', r'_DIRECTFB_' ], 126*90277196SAndroid Build Coastguard Worker [ r'_VULKAN_SC_10', r'_VULKAN_SC_1_0' ], 127*90277196SAndroid Build Coastguard Worker 128*90277196SAndroid Build Coastguard Worker ] 129*90277196SAndroid Build Coastguard Worker 130*90277196SAndroid Build Coastguard Worker for subpat in subpats: 131*90277196SAndroid Build Coastguard Worker name = re.sub(subpat[0], subpat[1], name) 132*90277196SAndroid Build Coastguard Worker return name 133*90277196SAndroid Build Coastguard Worker 134*90277196SAndroid Build Coastguard Worker @property 135*90277196SAndroid Build Coastguard Worker def warning_comment(self): 136*90277196SAndroid Build Coastguard Worker """Return warning comment to be placed in header of generated Asciidoctor files""" 137*90277196SAndroid Build Coastguard Worker return '// WARNING: DO NOT MODIFY! This file is automatically generated from the vk.xml registry' 138*90277196SAndroid Build Coastguard Worker 139*90277196SAndroid Build Coastguard Worker @property 140*90277196SAndroid Build Coastguard Worker def file_suffix(self): 141*90277196SAndroid Build Coastguard Worker """Return suffix of generated Asciidoctor files""" 142*90277196SAndroid Build Coastguard Worker return '.adoc' 143*90277196SAndroid Build Coastguard Worker 144*90277196SAndroid Build Coastguard Worker def api_name(self, spectype='api'): 145*90277196SAndroid Build Coastguard Worker """Return API or specification name for citations in ref pages.ref 146*90277196SAndroid Build Coastguard Worker pages should link to for 147*90277196SAndroid Build Coastguard Worker 148*90277196SAndroid Build Coastguard Worker spectype is the spec this refpage is for: 'api' is the Vulkan API 149*90277196SAndroid Build Coastguard Worker Specification. Defaults to 'api'. If an unrecognized spectype is 150*90277196SAndroid Build Coastguard Worker given, returns None. 151*90277196SAndroid Build Coastguard Worker """ 152*90277196SAndroid Build Coastguard Worker if spectype == 'api' or spectype is None: 153*90277196SAndroid Build Coastguard Worker return 'Vulkan' 154*90277196SAndroid Build Coastguard Worker else: 155*90277196SAndroid Build Coastguard Worker return None 156*90277196SAndroid Build Coastguard Worker 157*90277196SAndroid Build Coastguard Worker @property 158*90277196SAndroid Build Coastguard Worker def api_prefix(self): 159*90277196SAndroid Build Coastguard Worker """Return API token prefix""" 160*90277196SAndroid Build Coastguard Worker return 'VK_' 161*90277196SAndroid Build Coastguard Worker 162*90277196SAndroid Build Coastguard Worker @property 163*90277196SAndroid Build Coastguard Worker def write_contacts(self): 164*90277196SAndroid Build Coastguard Worker """Return whether contact list should be written to extension appendices""" 165*90277196SAndroid Build Coastguard Worker return True 166*90277196SAndroid Build Coastguard Worker 167*90277196SAndroid Build Coastguard Worker @property 168*90277196SAndroid Build Coastguard Worker def write_refpage_include(self): 169*90277196SAndroid Build Coastguard Worker """Return whether refpage include should be written to extension appendices""" 170*90277196SAndroid Build Coastguard Worker return True 171*90277196SAndroid Build Coastguard Worker 172*90277196SAndroid Build Coastguard Worker @property 173*90277196SAndroid Build Coastguard Worker def member_used_for_unique_vuid(self): 174*90277196SAndroid Build Coastguard Worker """Return the member name used in the VUID-...-...-unique ID.""" 175*90277196SAndroid Build Coastguard Worker return self.structtype_member_name 176*90277196SAndroid Build Coastguard Worker 177*90277196SAndroid Build Coastguard Worker def is_externsync_command(self, protoname): 178*90277196SAndroid Build Coastguard Worker """Returns True if the protoname element is an API command requiring 179*90277196SAndroid Build Coastguard Worker external synchronization 180*90277196SAndroid Build Coastguard Worker """ 181*90277196SAndroid Build Coastguard Worker return protoname is not None and 'vkCmd' in protoname 182*90277196SAndroid Build Coastguard Worker 183*90277196SAndroid Build Coastguard Worker def is_api_name(self, name): 184*90277196SAndroid Build Coastguard Worker """Returns True if name is in the reserved API namespace. 185*90277196SAndroid Build Coastguard Worker For Vulkan, these are names with a case-insensitive 'vk' prefix, or 186*90277196SAndroid Build Coastguard Worker a 'PFN_vk' function pointer type prefix. 187*90277196SAndroid Build Coastguard Worker """ 188*90277196SAndroid Build Coastguard Worker return name[0:2].lower() == 'vk' or name[0:6] == 'PFN_vk' 189*90277196SAndroid Build Coastguard Worker 190*90277196SAndroid Build Coastguard Worker def specURL(self, spectype='api'): 191*90277196SAndroid Build Coastguard Worker """Return public registry URL which ref pages should link to for the 192*90277196SAndroid Build Coastguard Worker current all-extensions HTML specification, so xrefs in the 193*90277196SAndroid Build Coastguard Worker asciidoc source that are not to ref pages can link into it 194*90277196SAndroid Build Coastguard Worker instead. N.b. this may need to change on a per-refpage basis if 195*90277196SAndroid Build Coastguard Worker there are multiple documents involved. 196*90277196SAndroid Build Coastguard Worker """ 197*90277196SAndroid Build Coastguard Worker return 'https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html' 198*90277196SAndroid Build Coastguard Worker 199*90277196SAndroid Build Coastguard Worker @property 200*90277196SAndroid Build Coastguard Worker def xml_api_name(self): 201*90277196SAndroid Build Coastguard Worker """Return the name used in the default API XML registry for the default API""" 202*90277196SAndroid Build Coastguard Worker return 'vulkan' 203*90277196SAndroid Build Coastguard Worker 204*90277196SAndroid Build Coastguard Worker @property 205*90277196SAndroid Build Coastguard Worker def registry_path(self): 206*90277196SAndroid Build Coastguard Worker """Return relpath to the default API XML registry in this project.""" 207*90277196SAndroid Build Coastguard Worker return 'xml/vk.xml' 208*90277196SAndroid Build Coastguard Worker 209*90277196SAndroid Build Coastguard Worker @property 210*90277196SAndroid Build Coastguard Worker def specification_path(self): 211*90277196SAndroid Build Coastguard Worker """Return relpath to the Asciidoctor specification sources in this project.""" 212*90277196SAndroid Build Coastguard Worker return '{generated}/meta' 213*90277196SAndroid Build Coastguard Worker 214*90277196SAndroid Build Coastguard Worker @property 215*90277196SAndroid Build Coastguard Worker def special_use_section_anchor(self): 216*90277196SAndroid Build Coastguard Worker """Return asciidoctor anchor name in the API Specification of the 217*90277196SAndroid Build Coastguard Worker section describing extension special uses in detail.""" 218*90277196SAndroid Build Coastguard Worker return 'extendingvulkan-compatibility-specialuse' 219*90277196SAndroid Build Coastguard Worker 220*90277196SAndroid Build Coastguard Worker @property 221*90277196SAndroid Build Coastguard Worker def extension_index_prefixes(self): 222*90277196SAndroid Build Coastguard Worker """Return a list of extension prefixes used to group extension refpages.""" 223*90277196SAndroid Build Coastguard Worker return ['VK_KHR', 'VK_EXT', 'VK'] 224*90277196SAndroid Build Coastguard Worker 225*90277196SAndroid Build Coastguard Worker @property 226*90277196SAndroid Build Coastguard Worker def unified_flag_refpages(self): 227*90277196SAndroid Build Coastguard Worker """Return True if Flags/FlagBits refpages are unified, False if 228*90277196SAndroid Build Coastguard Worker they are separate. 229*90277196SAndroid Build Coastguard Worker """ 230*90277196SAndroid Build Coastguard Worker return False 231*90277196SAndroid Build Coastguard Worker 232*90277196SAndroid Build Coastguard Worker @property 233*90277196SAndroid Build Coastguard Worker def spec_reflow_path(self): 234*90277196SAndroid Build Coastguard Worker """Return the path to the spec source folder to reflow""" 235*90277196SAndroid Build Coastguard Worker return os.getcwd() 236*90277196SAndroid Build Coastguard Worker 237*90277196SAndroid Build Coastguard Worker @property 238*90277196SAndroid Build Coastguard Worker def spec_no_reflow_dirs(self): 239*90277196SAndroid Build Coastguard Worker """Return a set of directories not to automatically descend into 240*90277196SAndroid Build Coastguard Worker when reflowing spec text 241*90277196SAndroid Build Coastguard Worker """ 242*90277196SAndroid Build Coastguard Worker return ('scripts', 'style') 243*90277196SAndroid Build Coastguard Worker 244*90277196SAndroid Build Coastguard Worker @property 245*90277196SAndroid Build Coastguard Worker def zero(self): 246*90277196SAndroid Build Coastguard Worker return '`0`' 247*90277196SAndroid Build Coastguard Worker 248*90277196SAndroid Build Coastguard Worker def category_requires_validation(self, category): 249*90277196SAndroid Build Coastguard Worker """Return True if the given type 'category' always requires validation. 250*90277196SAndroid Build Coastguard Worker 251*90277196SAndroid Build Coastguard Worker Overridden because Vulkan does not require "valid" text for basetype 252*90277196SAndroid Build Coastguard Worker in the spec right now.""" 253*90277196SAndroid Build Coastguard Worker return category in CATEGORIES_REQUIRING_VALIDATION 254*90277196SAndroid Build Coastguard Worker 255*90277196SAndroid Build Coastguard Worker @property 256*90277196SAndroid Build Coastguard Worker def should_skip_checking_codes(self): 257*90277196SAndroid Build Coastguard Worker """Return True if more than the basic validation of return codes should 258*90277196SAndroid Build Coastguard Worker be skipped for a command. 259*90277196SAndroid Build Coastguard Worker 260*90277196SAndroid Build Coastguard Worker Vulkan mostly relies on the validation layers rather than API 261*90277196SAndroid Build Coastguard Worker builtin error checking, so these checks are not appropriate. 262*90277196SAndroid Build Coastguard Worker 263*90277196SAndroid Build Coastguard Worker For example, passing in a VkFormat parameter will not potentially 264*90277196SAndroid Build Coastguard Worker generate a VK_ERROR_FORMAT_NOT_SUPPORTED code.""" 265*90277196SAndroid Build Coastguard Worker 266*90277196SAndroid Build Coastguard Worker return True 267*90277196SAndroid Build Coastguard Worker 268*90277196SAndroid Build Coastguard Worker def extension_file_path(self, name): 269*90277196SAndroid Build Coastguard Worker """Return file path to an extension appendix relative to a directory 270*90277196SAndroid Build Coastguard Worker containing all such appendices. 271*90277196SAndroid Build Coastguard Worker - name - extension name""" 272*90277196SAndroid Build Coastguard Worker 273*90277196SAndroid Build Coastguard Worker return f'{name}{self.file_suffix}' 274*90277196SAndroid Build Coastguard Worker 275*90277196SAndroid Build Coastguard Worker def valid_flag_bit(self, bitpos): 276*90277196SAndroid Build Coastguard Worker """Return True if bitpos is an allowed numeric bit position for 277*90277196SAndroid Build Coastguard Worker an API flag bit. 278*90277196SAndroid Build Coastguard Worker 279*90277196SAndroid Build Coastguard Worker Vulkan uses 32 bit Vk*Flags types, and assumes C compilers may 280*90277196SAndroid Build Coastguard Worker cause Vk*FlagBits values with bit 31 set to result in a 64 bit 281*90277196SAndroid Build Coastguard Worker enumerated type, so disallows such flags.""" 282*90277196SAndroid Build Coastguard Worker return bitpos >= 0 and bitpos < 31 283*90277196SAndroid Build Coastguard Worker 284*90277196SAndroid Build Coastguard Worker @property 285*90277196SAndroid Build Coastguard Worker def extra_refpage_headers(self): 286*90277196SAndroid Build Coastguard Worker """Return any extra text to add to refpage headers.""" 287*90277196SAndroid Build Coastguard Worker return 'include::{config}/attribs.adoc[]' 288*90277196SAndroid Build Coastguard Worker 289*90277196SAndroid Build Coastguard Worker @property 290*90277196SAndroid Build Coastguard Worker def extra_refpage_body(self): 291*90277196SAndroid Build Coastguard Worker """Return any extra text (following the title) for generated 292*90277196SAndroid Build Coastguard Worker reference pages.""" 293*90277196SAndroid Build Coastguard Worker return 'include::{generated}/specattribs.adoc[]' 294*90277196SAndroid Build Coastguard Worker 295*90277196SAndroid Build Coastguard Worker 296*90277196SAndroid Build Coastguard Workerclass VulkanSCConventions(VulkanConventions): 297*90277196SAndroid Build Coastguard Worker 298*90277196SAndroid Build Coastguard Worker def specURL(self, spectype='api'): 299*90277196SAndroid Build Coastguard Worker """Return public registry URL which ref pages should link to for the 300*90277196SAndroid Build Coastguard Worker current all-extensions HTML specification, so xrefs in the 301*90277196SAndroid Build Coastguard Worker asciidoc source that are not to ref pages can link into it 302*90277196SAndroid Build Coastguard Worker instead. N.b. this may need to change on a per-refpage basis if 303*90277196SAndroid Build Coastguard Worker there are multiple documents involved. 304*90277196SAndroid Build Coastguard Worker """ 305*90277196SAndroid Build Coastguard Worker return 'https://registry.khronos.org/vulkansc/specs/1.0-extensions/html/vkspec.html' 306*90277196SAndroid Build Coastguard Worker 307*90277196SAndroid Build Coastguard Worker @property 308*90277196SAndroid Build Coastguard Worker def xml_api_name(self): 309*90277196SAndroid Build Coastguard Worker """Return the name used in the default API XML registry for the default API""" 310*90277196SAndroid Build Coastguard Worker return 'vulkansc' 311*90277196SAndroid Build Coastguard Worker 312