Vulkan-Docs/doc/specs/vulkan/checkLinks.py

309 lines
12 KiB
Python
Raw Normal View History

2016-02-16 09:53:44 +00:00
#!/usr/bin/python3
#
Change log for January 23, 2017 Vulkan 1.0.39 spec update: * Bump API patch number and header version number to 39 for this update. Github Issues: * Clarified that only accesses via the specified buffer/image subresource ranges are included in the access scopes (public issue 306). * Add missing valid usage statements for flink:vkCreateComputePipelines and flink:vkCreateGraphicsPipelines (public issue 427). Internal Issues: * Add a Note to the <<invariance,Invariance>> appendix about a difference between OpenGL and Vulkan with regards to how primitives derived from offsets are handled (internal issue 355). * Add the +<<VK_KHR_get_physical_device_properties2>>+, +<<VK_KHR_maintenance1>>+, and +<<VK_KHR_shader_draw_parameters>>+ extensions (internal issue 448). * Add the +<<VK_EXT_shader_subgroup_vote>>+ and +<<VK_EXT_shader_subgroup_ballot>>+ extensions (internal issue 449). * Update the texture level-of-detail equation in the <<textures-scale-factor,Scale Factor Operation>> section to better approximate the ellipse major and minor axes (internal issue 547). * Forbid non-explicitly allowed uses of interface decorations in the introduction to the <<interfaces,Shader Interfaces>> chapter (internal issue 607). * Replace use of MathJax with KaTeX, for improved load-time performance as well as avoiding the scrolling-and-scrolling behavior due to MathJax asynchronous rendering when loading at an anchor inside the spec. This change also requires moving to HTML5 output for the spec instead of XHTML, and there is a visible difference in that the chapter navigation index is now in a scrollable sidebar instead of at the top of the document. We may or may not retain the nav sidebar based on feedback (internal issue 613). * Improve consistency of markup and formatting in extension appendices (internal issue 631). Other Issues: * Add explicit valid usage statements to slink:VkImageCopy requiring that the source and destination layer ranges be contained in their respective source and destination images. * Add valid usage language for swapchain of flink:vkAcquireNextImage. If the swapchain has been replaced, then it should not be passed to flink:vkAcquireNextImage. * Add a valid usage statement to flink:vkCreateImageView, that the image must have been created with an appropriate usage bit set. * Noted that slink:VkDisplayPresentInfoKHR is a valid extension of slink:VkPresentInfoKHR in the <<wsi_swapchain,WSI Swapchain>> section. * Update valid usage for flink:vkCmdSetViewport and flink:vkCmdSetScissor to account for the multiple viewport feature. If the feature is not enabled, the parameters for these functions have required values that are defined in the <<features-features-multiViewport,multiple viewports>> section of the spec but were not reflected in the valid usage text for these functions. * Add the +<<VK_EXT_swapchain_colorspace>>+ extension defining common color spaces.
2017-01-18 04:11:25 +00:00
# Copyright (c) 2015-2017 The Khronos Group Inc.
2016-02-16 09:53:44 +00:00
#
Change log for April 22, 2016 Vulkan 1.0.11 spec update: * Bump API patch number and header version number to 11 for this update. Github Issues: * Clarify the WSI extension language by switching from the fuzzier "ownership" language to more-consistent "acquire" language (public issue 117). * Clarify that memory barriers apply to all commands in the dependency chains in the flink:vkGetRenderAreaGranularity command and the <<synchronization-execution-and-memory-dependencies,Execution And Memory Dependencies>> section (public issue 132). * Clarify that a queue family is a set of queues in the <<fundamentals-execmodel,Execution Model>> section (public issue 166). * Removed requirement from valid usage language that VkPresentInfoKHR::waitSemaphoreCount must be greater than 0 (public issue 171). * Fix broken internal links, describe structures consistently, use consistent style for SPIR-V codewords, and tag normative terms that were missing asciidoc tags (public issue 183 and ancillary markup/normative language fixes). * Fix typos for slink:VkPhysicalDeviceLimits member names in slink:VkImageCreateInfo validity language (public issue 184). Internal Issues: * Document that the requested patch version number specified as part of slink:VkApplicationInfo::pname:apiVersion is ignored when creating an instance (internal issue 176). * Clarify handling of extension structs in the <<fundamentals-validusageValid Usage>> section (internal issue 254). * Update required slink:VkImageFormatProperties::pname:maxMipLevels to be limited to the maximum allowed mipmap pyramid size corresponding to the actual maximum supported size for the format (internal issue 256). * Modify the <<features-extentperimagetype,Allowed Extent Values Based On Image Type>> section so the allowed maximum extent is the maximum image dimension supported for each dimension of the type of texture being queried (internal issue 257). * Clarify in the <<spirvenv-module-validation,Validation Rules within a Module>> section that at least one of the code:LocalSize execution mode or code:WorkgroupSize decoration is required for each compute shader entry point in a shader module (internal issue 279). * Add validity rules for formats in flink:vkCmdClearColorImage and flink:vkCmdClearDepthStencilImage (internal issue 283). * Clarify that slink:VkImageFormatProperties::pname:maxResourceSize is an upper bound, and that it may not be possible to create an image anywhere near that size (internal issue 284). Other Commits: * Fix various minor markup errors reported by validation scripts. * Change copyright from Khronos Free Use License to Apache 2.0 license on relevant script/XML/header files. This does not affect the specification source copyright.
2016-04-21 08:08:38 +00:00
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
2016-02-16 09:53:44 +00:00
#
Change log for April 22, 2016 Vulkan 1.0.11 spec update: * Bump API patch number and header version number to 11 for this update. Github Issues: * Clarify the WSI extension language by switching from the fuzzier "ownership" language to more-consistent "acquire" language (public issue 117). * Clarify that memory barriers apply to all commands in the dependency chains in the flink:vkGetRenderAreaGranularity command and the <<synchronization-execution-and-memory-dependencies,Execution And Memory Dependencies>> section (public issue 132). * Clarify that a queue family is a set of queues in the <<fundamentals-execmodel,Execution Model>> section (public issue 166). * Removed requirement from valid usage language that VkPresentInfoKHR::waitSemaphoreCount must be greater than 0 (public issue 171). * Fix broken internal links, describe structures consistently, use consistent style for SPIR-V codewords, and tag normative terms that were missing asciidoc tags (public issue 183 and ancillary markup/normative language fixes). * Fix typos for slink:VkPhysicalDeviceLimits member names in slink:VkImageCreateInfo validity language (public issue 184). Internal Issues: * Document that the requested patch version number specified as part of slink:VkApplicationInfo::pname:apiVersion is ignored when creating an instance (internal issue 176). * Clarify handling of extension structs in the <<fundamentals-validusageValid Usage>> section (internal issue 254). * Update required slink:VkImageFormatProperties::pname:maxMipLevels to be limited to the maximum allowed mipmap pyramid size corresponding to the actual maximum supported size for the format (internal issue 256). * Modify the <<features-extentperimagetype,Allowed Extent Values Based On Image Type>> section so the allowed maximum extent is the maximum image dimension supported for each dimension of the type of texture being queried (internal issue 257). * Clarify in the <<spirvenv-module-validation,Validation Rules within a Module>> section that at least one of the code:LocalSize execution mode or code:WorkgroupSize decoration is required for each compute shader entry point in a shader module (internal issue 279). * Add validity rules for formats in flink:vkCmdClearColorImage and flink:vkCmdClearDepthStencilImage (internal issue 283). * Clarify that slink:VkImageFormatProperties::pname:maxResourceSize is an upper bound, and that it may not be possible to create an image anywhere near that size (internal issue 284). Other Commits: * Fix various minor markup errors reported by validation scripts. * Change copyright from Khronos Free Use License to Apache 2.0 license on relevant script/XML/header files. This does not affect the specification source copyright.
2016-04-21 08:08:38 +00:00
# http://www.apache.org/licenses/LICENSE-2.0
2016-02-16 09:53:44 +00:00
#
Change log for April 22, 2016 Vulkan 1.0.11 spec update: * Bump API patch number and header version number to 11 for this update. Github Issues: * Clarify the WSI extension language by switching from the fuzzier "ownership" language to more-consistent "acquire" language (public issue 117). * Clarify that memory barriers apply to all commands in the dependency chains in the flink:vkGetRenderAreaGranularity command and the <<synchronization-execution-and-memory-dependencies,Execution And Memory Dependencies>> section (public issue 132). * Clarify that a queue family is a set of queues in the <<fundamentals-execmodel,Execution Model>> section (public issue 166). * Removed requirement from valid usage language that VkPresentInfoKHR::waitSemaphoreCount must be greater than 0 (public issue 171). * Fix broken internal links, describe structures consistently, use consistent style for SPIR-V codewords, and tag normative terms that were missing asciidoc tags (public issue 183 and ancillary markup/normative language fixes). * Fix typos for slink:VkPhysicalDeviceLimits member names in slink:VkImageCreateInfo validity language (public issue 184). Internal Issues: * Document that the requested patch version number specified as part of slink:VkApplicationInfo::pname:apiVersion is ignored when creating an instance (internal issue 176). * Clarify handling of extension structs in the <<fundamentals-validusageValid Usage>> section (internal issue 254). * Update required slink:VkImageFormatProperties::pname:maxMipLevels to be limited to the maximum allowed mipmap pyramid size corresponding to the actual maximum supported size for the format (internal issue 256). * Modify the <<features-extentperimagetype,Allowed Extent Values Based On Image Type>> section so the allowed maximum extent is the maximum image dimension supported for each dimension of the type of texture being queried (internal issue 257). * Clarify in the <<spirvenv-module-validation,Validation Rules within a Module>> section that at least one of the code:LocalSize execution mode or code:WorkgroupSize decoration is required for each compute shader entry point in a shader module (internal issue 279). * Add validity rules for formats in flink:vkCmdClearColorImage and flink:vkCmdClearDepthStencilImage (internal issue 283). * Clarify that slink:VkImageFormatProperties::pname:maxResourceSize is an upper bound, and that it may not be possible to create an image anywhere near that size (internal issue 284). Other Commits: * Fix various minor markup errors reported by validation scripts. * Change copyright from Khronos Free Use License to Apache 2.0 license on relevant script/XML/header files. This does not affect the specification source copyright.
2016-04-21 08:08:38 +00:00
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
2016-02-16 09:53:44 +00:00
# checkLinks.py - validate link/reference API constructs in files
#
# Usage: checkLinks.py files > logfile
#
# Uses vkapi.py, which is a Python representation of relevant parts
# of the Vulkan API.
import copy, os, pdb, re, string, sys
from vkapi import *
global curFile, curLine, sectionDepth
global errCount, warnCount, emittedPrefix, printInfo
curFile = '???'
curLine = -1
sectionDepth = 0
errCount = 0
warnCount = 0
emittedPrefix = {}
printInfo = False
# Called before printing a warning or error. Only prints once prior
# to output for a given file.
def emitPrefix():
global curFile, curLine, emittedPrefix
if (curFile not in emittedPrefix.keys()):
emittedPrefix[curFile] = None
print('Checking file:', curFile)
print('-------------------------------')
def info(*args, **kwargs):
global curFile, curLine, printInfo
if (printInfo):
emitPrefix()
print('INFO: %s line %d:' % (curFile, curLine),
' '.join([str(arg) for arg in args]))
# Print a validation warning found in a file
def warning(*args, **kwargs):
global curFile, curLine, warnCount
warnCount = warnCount + 1
emitPrefix()
print('WARNING: %s line %d:' % (curFile, curLine),
' '.join([str(arg) for arg in args]))
# Print a validation error found in a file
def error(*args, **kwargs):
global curFile, curLine, errCount
errCount = errCount + 1
emitPrefix()
print('ERROR: %s line %d:' % (curFile, curLine),
' '.join([str(arg) for arg in args]))
# See if a tag value exists in the specified dictionary and
# suggest it as an alternative if so.
def checkTag(tag, value, dict, dictName, tagName):
if (value in dict.keys()):
warning(value, 'exists in the API but not as a',
tag + ': .', 'Try using the', tagName + ': tag.')
# Report an error due to an asciidoc tag which doesn't match
# a corresponding API entity.
def foundError(errType, tag, value):
global curFile, curLine
error('no such', errType, tag + ':' + value)
# Try some heuristics to detect likely problems such as missing vk
# prefixes or the wrong tag.
# Look in all the dictionaries in vkapi.py to see if the tag
# is just wrong but the API entity actually exists.
checkTag(tag, value, flags, 'flags', 'elink')
checkTag(tag, value, enums, 'enums', 'elink')
checkTag(tag, value, structs, 'structs', 'slink/sname')
checkTag(tag, value, handles, 'handles', 'slink/sname')
checkTag(tag, value, defines, 'defines', 'slink/sname')
2016-02-16 09:53:44 +00:00
checkTag(tag, value, consts, 'consts', 'ename')
checkTag(tag, value, protos, 'protos', 'flink/fname')
checkTag(tag, value, funcpointers, 'funcpointers', 'tlink/tname')
# Look for missing vk prefixes (quirky since it's case-dependent)
# NOT DONE YET
# Look for param in the list of all parameters of the specified functions
# Returns True if found, False otherwise
def findParam(param, funclist):
for f in funclist:
if (param in protos[f]):
info('parameter:', param, 'found in function:', f)
return True
return False
# Initialize tracking state for checking links/includes
def initChecks():
global curFile, curLine, curFuncs, curStruct, accumFunc, sectionDepth
global errCount, warnCount
global incPat, linkPat, pathPat, sectionPat
# Matches asciidoc single-line section tags
sectionPat = re.compile('^(=+) ')
# Matches any asciidoc include:: directive
pathPat = re.compile('^include::([\w./_]+)\[\]')
# Matches asciidoc include:: directives used in spec/ref pages (and also
# others such as validity)
incPat = re.compile('^\.\./(\w+)/(\w+)\.txt')
# Lists of current /protos/ (functions) and /structs/ includes. There
# can be several protos contiguously for different forms of a command
curFuncs = []
curStruct = None
# Tag if we should accumulate funcs or start a new list. Any intervening
# pname: tags or struct includes will restart the list.
accumFunc = False
# Matches all link names in the current spec/man pages. Assumes these
# macro names are not trailing subsets of other macros. Used to
# precede the regexp with [^A-Za-z], but this didn't catch macros
# at start of line.
linkPat = re.compile('([efpst](name|link)):(\w*)')
# Total error/warning counters
errCount = 0
warnCount = 0
# Validate asciidoc internal links in specified file.
# infile - filename to validate
# follow - if True, recursively follow include:: directives
# included - if True, function was called recursively
# Links checked are:
# fname:vkBlah - Vulkan command name (generates internal link)
# flink:vkBlah - Vulkan command name
# sname:VkBlah - Vulkan struct name (generates internal link)
# slink:VkBlah - Vulkan struct name
# elink:VkEnumName - Vulkan enumeration ('enum') type name
# ename:VK_BLAH - Vulkan enumerant token name
# pname:name - parameter name to a command or a struct member
# tlink:name - Other Vulkan type name (generates internal link)
# tname:name - Other Vulkan type name
def checkLinks(infile, follow = False, included = False):
global curFile, curLine, curFuncs, curStruct, accumFunc, sectionDepth
global errCount, warnCount
global incPat, linkPat, pathPat, sectionPat
# Global state which gets saved and restored by this function
oldCurFile = curFile
oldCurLine = curLine
curFile = infile
curLine = 0
# N.b. dirname() returns an empty string for a path with no directories,
# unlike the shell dirname(1).
if (not os.path.exists(curFile)):
error('No such file', curFile, '- skipping check')
# Restore global state before exiting the function
curFile = oldCurFile
curLine = oldCurLine
return
inPath = os.path.dirname(curFile)
Change log for November 25, 2016 Vulkan 1.0.35 spec update: * Bump API patch number and header version number to 35 for this update. Github Issues: * Document in the <<memory-device-hostaccess,Host Access>> section that mapping and unmapping does not invalidate or flush the mapped memory (public issues 27, 126). * Redefine the entire <<synchronization>> chapter in terms of consistent and well defined terminology, that's called out at the start of the chapter. This terminology is applied equally to all synchronization types, including subpass dependencies, submissions, and much of the implicit ordering stuff dotted around the spec. Key terms are laid out in the <<synchronization-dependencies,Execution and Memory Dependencies>> section at the top of the rewritten chapter (public issues 128, 131, 132, 217, 299, 300, 302, 306, 322, 346, 347, 371, 407). * Specify order of submission for batches in the <<vkQueueSubmit,vkQueueSubmit>> and <<vkQueueBindSparse,vkQueueBindSparse>> commands (public issue 371). * Add valid usage statements to each of the WSI extension sections indicating that the WSI-specific structure parameters must be valid, and remove automatically generated valid usage statements now covered by the manual sections (public issue 383). * Clarify render pass compatibility for flink:vkCmdExecuteCommands (public issue 390). Internal Issues: * Update +vk.xml+ to make previously explicit valid usage statements for <<vkDebugReportMessageEXT,vkDebugReportMessageEXT>> implicit instead (internal issue 553). * Add valid usage statement for slink:VkCreateImageInfo preventing creation of 1D sparse images (internal issue 573). * Fix Python scripts to always read/write files in utf-8 encoding, and a logic error in reflib.py which could cause a fatal error for malstructured asciidoc (internal issues 578, 586).
2016-11-26 10:33:44 +00:00
fp = open(curFile, 'r', encoding='utf-8')
2016-02-16 09:53:44 +00:00
for line in fp:
curLine = curLine + 1
# Track changes up and down section headers, and forget
# the current functions/structure when popping up a level
match = sectionPat.search(line)
if (match):
depth = len(match.group(1))
if (depth < sectionDepth):
info('Resetting current function/structure for section:', line)
curFuncs = []
curStruct = None
sectionDepth = depth
match = pathPat.search(line)
if (match):
incpath = match.group(1)
# An include:: directive. First check if it looks like a
# function or struct include file, and modify the corresponding
# current function or struct state accordingly.
match = incPat.search(incpath)
if (match):
# For prototypes, if it is preceded by
# another include:: directive with no intervening link: tags,
# add to the current function list. Otherwise start a new list.
# There is only one current structure.
category = match.group(1)
tag = match.group(2)
# @ Validate tag!
# @ Arguably, any intervening text should shift to accumFuncs = False,
# e.g. only back-to-back includes separated by blank lines would be
# accumulated.
if (category == 'protos'):
if (tag in protos.keys()):
if (accumFunc):
curFuncs.append(tag)
else:
curFuncs = [ tag ]
# Restart accumulating functions
accumFunc = True
info('curFuncs =', curFuncs, 'accumFunc =', accumFunc)
else:
error('include of nonexistent function', tag)
elif (category == 'structs'):
if (tag in structs.keys()):
curStruct = tag
# Any /structs/ include means to stop accumulating /protos/
accumFunc = False
info('curStruct =', curStruct)
else:
error('include of nonexistent struct', tag)
if (follow):
# Actually process the included file now, recursively
newpath = os.path.normpath(os.path.join(inPath, incpath))
info(curFile, ': including file:', newpath)
checkLinks(newpath, follow, included=True)
matches = linkPat.findall(line)
for match in matches:
# Start actual validation work. Depending on what the
# asciidoc tag name is, look up the value in the corresponding
# dictionary.
tag = match[0]
value = match[2]
if (tag == 'fname' or tag == 'flink'):
if (value not in protos.keys()):
foundError('function', tag, value)
elif (tag == 'sname' or tag == 'slink'):
if (value not in structs.keys() and
value not in handles.keys()):
foundError('aggregate/scalar/handle/define type', tag, value)
2016-02-16 09:53:44 +00:00
elif (tag == 'ename'):
if (value not in consts.keys() and value not in defines.keys()):
2016-02-16 09:53:44 +00:00
foundError('enumerant/constant', tag, value)
elif (tag == 'elink'):
if (value not in enums.keys() and value not in flags.keys()):
foundError('enum/bitflag type', tag, value)
elif (tag == 'tlink' or tag == 'tname'):
if (value not in funcpointers.keys()):
foundError('function pointer/other type', tag, value)
elif (tag == 'pname'):
# Any pname: tag means to stop accumulating /protos/
accumFunc = False
# See if this parameter is in the current proto(s) and struct
foundParam = False
if (curStruct and value in structs[curStruct]):
info('parameter', value, 'found in struct', curStruct)
elif (curFuncs and findParam(value, curFuncs)):
True
else:
warning('parameter', value, 'not found. curStruct =',
curStruct, 'curFuncs =', curFuncs)
else:
# This is a logic error
error('unknown tag', tag + ':' + value)
fp.close()
if (errCount > 0 or warnCount > 0):
if (not included):
print('Errors found:', errCount, 'Warnings found:', warnCount)
print('')
if (included):
info('----- returning from:', infile, 'to parent file', '-----')
# Don't generate any output for files without errors
# else:
# print(curFile + ': No errors found')
# Restore global state before exiting the function
curFile = oldCurFile
curLine = oldCurLine
if __name__ == '__main__':
follow = False
if (len(sys.argv) > 1):
for file in sys.argv[1:]:
if (file == '-follow'):
follow = True
elif (file == '-info'):
printInfo = True
else:
initChecks()
checkLinks(file, follow)
else:
print('Need arguments: [-follow] [-info] infile [infile...]', file=sys.stderr)