mirror of
https://github.com/status-im/Vulkan-Docs.git
synced 2025-02-18 17:28:16 +00:00
* Bump API patch number and header version number to 27 for this update. Github Issues: * Weaken flink:vkGetPipelineCacheData invariance conditions; previous conditions were stronger than agreed and can't be guaranteed (public issue 280). * Add link to "Vulkan Loader Specification and Architecture Overview" document to Normative References section (public issue 359). Internal Issues: * Be more clear in the <<interfaces-resources-layout-std140, uniform buffer layout>> section that block offsets can be out of order (internal issue 396). * Document that extension authors should add support for their extensions to the validation layers (internal issue 398). * Clarify that the valid range of depth clear values should be limited to the 0..1 range and that copies to depth aspect must also be in this range (internal issue 412). * Specify ``a'' vs. ``an'' use in the style guide (internal issue 432). * Increase the maximum pname:nonCoherentAtomSize value in the <<features-limits-required,Required Limits>> section from 128 to 256 (internal issue 435). * Fix vk_platform.h for compiler errors on some Android platforms (internal issue 441). * Clarify that slink:VkPhysicalDeviceFeatures::pname:pEnabledFeatures == `NULL` disables all features, including the "required" feature pname:robustBufferAccess (internal issue 479). Other Issues: * Expand style guide and make it more self-consistent. * Use ISO 8601 date format everywhere. * Emphasise the correct way of using slink:VkSurfaceCapabilitiesKHR::pname:maxImageCount. * Added +VK_EXT_validation_flags+ extension for validation flag mechanism. * Fix an <<credits,author credit>> to include their current employer.
529 lines
18 KiB
Plaintext
529 lines
18 KiB
Plaintext
// Copyright (c) 2015-2016 Khronos Group. This work is licensed under a
|
|
// Creative Commons Attribution 4.0 International License; see
|
|
// http://creativecommons.org/licenses/by/4.0/
|
|
|
|
[[writing]]
|
|
= Writing Style
|
|
|
|
|
|
[[writing-misc]]
|
|
== Miscellaneous Grammar, Spelling, and Punctuation Issues
|
|
|
|
=== Use the Oxford Comma (Serial Comma)
|
|
|
|
When writing a sentence listing a series of items, include a comma before
|
|
the ``and'' separating the last item.
|
|
|
|
*Correct:* The red, green, blue, and alpha components.
|
|
|
|
*Incorrect:* The red, green, blue and alpha components.
|
|
|
|
Also see http://blog.oxforddictionaries.com/2011/06/oxford-comma/
|
|
|
|
|
|
=== Date Format
|
|
|
|
Whenever possible, write dates in the <<iso-8601,ISO 8601>> format:
|
|
YYYY-MM-DD.
|
|
|
|
If needed for consistency with existing dates, e.g. in appendix changelogs,
|
|
you can also write ``Month DD, YYYY'' where ``Month'' is the English name of
|
|
the month.
|
|
|
|
Never use ambigious formats such as ``09/12/16''.
|
|
|
|
.Example Markup
|
|
----
|
|
* 2016-09-12
|
|
* September 12, 2016
|
|
----
|
|
|
|
|
|
[[writing-misc-a-an]]
|
|
=== A/An and Markup Macros
|
|
|
|
Use ``a'' and ``an'' http://www.grammar.com/a-vs-an-when-to-use/[correctly],
|
|
based on the *sound* of the letter beginning the following word.
|
|
|
|
It is easy to get this wrong when talking about Vulkan API names tagged with
|
|
the <<markup-macros,markup macros>>. For example, if you wanted to say:
|
|
|
|
A VK_ERROR_DEVICE_LOST error
|
|
|
|
the correct way to mark this up in asciidoc would be:
|
|
|
|
A ename:VK_ERROR_DEVICE_LOST error
|
|
|
|
However, on first glance at this it *appears* wrong, because the ``word''
|
|
following ``a'' is the macro name, ``ename{cl}''. That starts with a vowel,
|
|
so the temptation is to say
|
|
|
|
An ename:VK_ERROR_DEVICE_LOST error may occur.
|
|
|
|
What matters here is how the *output* document is formatted.
|
|
|
|
|
|
=== Numbers in Text
|
|
|
|
When describing the need for a small number of objects, smaller than ten, spell
|
|
the number out (e.g. ``one''). If you are describing a literal value that is a
|
|
small number, you may use a numeric value (e.g. ``1'').
|
|
|
|
For example, instead of writing that a bitmask ``contains 1 or more bits'',
|
|
write that it ``contains one or more bits''. A counter example is that it is okay
|
|
to write ``For non-stereoscopic-3D applications, this value is 1.''
|
|
|
|
|
|
=== Use American Spelling Conventions
|
|
|
|
In case of conflict, use American rather than British spelling
|
|
conventions, except for noted exceptions in the table below.
|
|
|
|
.Spelling
|
|
[width="60%",options="header"]
|
|
|====
|
|
| Use Spelling | Instead Of | Comments
|
|
| color | colour |
|
|
| signaled | signalled |
|
|
| tessellation | tesselation | Historical exception
|
|
|====
|
|
|
|
|
|
=== Compound Words and Preferred Orthography
|
|
|
|
Unless there is longstanding precedent in computer science literature,
|
|
or the word is a noted exception in the table below, do not
|
|
arbitrarily cram terms together.
|
|
|
|
This does not apply to parameter names in the API,
|
|
where capitalization is used to distinguish words. For example, it is
|
|
proper to refer to the use of a pname:colorSpace member of a structure as a
|
|
``color space'' value.
|
|
|
|
.Spelling
|
|
[width="70%",options="header",cols="20%,20%,60%"]
|
|
|====
|
|
| Use Spelling | Instead Of | Comments
|
|
| bit plane | bitplane |
|
|
| color space | colorspace |
|
|
| double-buffer | doublebuffer |
|
|
| entry point | entry-point
|
|
| Except if needed to disambiguate from surrounding terms.
|
|
| flat shading | flatshading |
|
|
| GitHub | Github | Site's preferred spelling
|
|
| LOD | lod | Acronym for ``Level Of Detail''
|
|
| mip level +
|
|
mip layer +
|
|
mip size +
|
|
mip tail
|
|
| miplevel +
|
|
miplayer +
|
|
mipsize +
|
|
miptail | ``mipmap *term*'' may be used in time
|
|
3+h| Exceptions
|
|
| mipmap | mip map | Exception for historical reasons
|
|
| swapchain | swap chain | Exception due to heavy use in WSI extensions
|
|
|====
|
|
|
|
==== Words With "Pre-" Prefixes
|
|
|
|
// also: premultiply preorder prerotation predefin
|
|
|
|
When using the prefix ``pre'' to indicate ``prior to'', such as in the words
|
|
``preinitialized'', ``preprocess'', and ``pretransform'', do not separate
|
|
the prefix from the word with a hyphen.
|
|
|
|
|
|
[[writing-describing]]
|
|
== Describing Commands and Parameters
|
|
|
|
The <<vulkan-spec,Vulkan API Specification>>
|
|
describes API commands followed by descriptions of their
|
|
parameters, which are usually simple scalar types, handles or pointers to
|
|
Vulkan objects or arrays of objects, or structures containing combinations
|
|
of scalar types and objects. The templates and examples shown and annotated
|
|
here are based on the <<vulkan-spec,Vulkan API Specification>>. Do not vary from them without
|
|
compelling need.
|
|
|
|
Normative parts of the <<vulkan-spec,Vulkan API Specification>> should describe _what_ something does,
|
|
rather than _how_ or _why_ an application would want to use it.
|
|
|
|
When explicitly allowed by the Specification, the reserved value code:NULL may:
|
|
be used for Vulkan dispatchable objects, pointer parameters and members,
|
|
and the reserved value dname:VK_NULL_HANDLE may: be used for
|
|
Vulkan non-dispatchable object handle parameters and members.
|
|
Otherwise, pointers and handles must:
|
|
refer to valid memory and valid Vulkan objects, respectively.
|
|
|
|
|
|
[NOTE]
|
|
.Guideline
|
|
====
|
|
As a simple example, say
|
|
|
|
``To create a command pool, call fname:vkCreateCommandPool''
|
|
|
|
rather than
|
|
|
|
``You/The application/The user can create a command pool by calling
|
|
fname:vkCreateCommandPool''.
|
|
|
|
====
|
|
|
|
Explanations of _why_ and _how_ should largely be confined to reference
|
|
documentation, sample code, tutorials, and other such documents. Occasional
|
|
non-normative explanations can be included in the <<vulkan-spec,Vulkan API Specification>>
|
|
using <<markup-informative-notes,informative notes>>.
|
|
|
|
|
|
[[writing-latexmath]]
|
|
== LaTeX Math Markup
|
|
|
|
There is a considerable amount of math in the documentation, ranging from
|
|
simple arithmetic expressions to complicated conditionals. For the most
|
|
part, math is marked up using LaTeX math notation, which is either passed
|
|
through to the Mathjax browser renderer for HTML outputs, or passed through
|
|
to LaTeX for PDF outputs. For some very simple math expressions, asciidoc
|
|
markup can be used.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
We still do not have the latexmath vs. asciidoc font situation sorted out
|
|
for all target output forms, so there can be some visual inconsistencies.
|
|
====
|
|
|
|
While LaTeX math macros, including the amsmath package, are supported,
|
|
general LaTeX constructs are not.
|
|
|
|
_Inline math_ is encoded using the latexmath{cl} macro. For example:
|
|
|
|
* latexmath:[$[0,1\]$]
|
|
* latexmath:[$x \cdot 0 = 0 \cdot x = 0$]
|
|
* latexmath:[${\textbf c} = t {\textbf c}_1 + (1-t){\textbf c}_2. $]
|
|
|
|
.Example Markup
|
|
----
|
|
latexmath:[$[0,1\]$]
|
|
latexmath:[$x \cdot 0 = 0 \cdot x = 0$]
|
|
latexmath:[${\textbf c} = t {\textbf c}_1 + (1-t){\textbf c}_2. $]
|
|
----
|
|
|
|
Note the escaped bracket in markup for the first expression, which is
|
|
necessary to work around asciidoc macro parsing:
|
|
|
|
|
|
_Block math_ is used for more complex equations. This example uses the
|
|
amsmath `align*` macros to delimit the expression:
|
|
|
|
[latexmath]
|
|
+++++++++++++++++++
|
|
\begin{align*}
|
|
c_{RGB} & =
|
|
\begin{cases}
|
|
\frac{c_{sRGB}}{12.92} & \textrm{for } c_{sRGB} \leq 0.04045 \\
|
|
\left ( \frac{c_{sRGB}+0.055}{1.055} \right )^{2.4} & \textrm{for } c_{sRGB} > 0.04045
|
|
\end{cases}
|
|
\end{align*}
|
|
+++++++++++++++++++
|
|
|
|
.Example Markup
|
|
----
|
|
[latexmath]
|
|
+++++++++++++++++++
|
|
\begin{align*}
|
|
c_{RGB} & =
|
|
\begin{cases}
|
|
\frac{c_{sRGB}}{12.92} & \textrm{for } c_{sRGB} \leq 0.04045 \\
|
|
\left ( \frac{c_{sRGB}+0.055}{1.055} \right )^{2.4} & \textrm{for } c_{sRGB} > 0.04045
|
|
\end{cases}
|
|
\end{align*}
|
|
+++++++++++++++++++
|
|
----
|
|
|
|
This example uses normal LaTeX math brackets to delimit the expression:
|
|
|
|
[latexmath]
|
|
+++++++++++++++++++
|
|
\[
|
|
V =
|
|
\begin{cases}
|
|
(-1)^S \times 0.0, & E = 0, M = 0 \\
|
|
(-1)^S \times 2^{-14} \times { M \over 2^{10} },
|
|
& E = 0, M \neq 0 \\
|
|
(-1)^S \times 2^{E-15} \times { \left( 1 + { M \over 2^{10} } \right) },
|
|
& 0 < E < 31 \\
|
|
(-1)^S \times Inf, & E = 31, M = 0 \\
|
|
NaN, & E = 31, M \neq 0
|
|
\end{cases}
|
|
\]
|
|
+++++++++++++++++++
|
|
|
|
.Example Markup
|
|
----
|
|
[latexmath]
|
|
+++++++++++++++++++
|
|
\[
|
|
V =
|
|
\begin{cases}
|
|
(-1)^S \times 0.0, & E = 0, M = 0 \\
|
|
(-1)^S \times 2^{-14} \times { M \over 2^{10} },
|
|
& E = 0, M \neq 0 \\
|
|
(-1)^S \times 2^{E-15} \times { \left( 1 + { M \over 2^{10} } \right) },
|
|
& 0 < E < 31 \\
|
|
(-1)^S \times Inf, & E = 31, M = 0 \\
|
|
NaN, & E = 31, M \neq 0
|
|
\end{cases}
|
|
\]
|
|
+++++++++++++++++++
|
|
----
|
|
|
|
|
|
[[writing-pNext-chain]]
|
|
== Describing Extension Structure Chains
|
|
|
|
When describing an extension structure which is passed to an existing
|
|
command by placing it in the pname:pNext chain of a structure parameter of
|
|
that command, introduce the structure description in this fashion:
|
|
|
|
When *performing an operation described by the extension struct*, add the
|
|
slink:VkExtensionStructNameID to the pname:pNext chain of the
|
|
slink:VkBaseExtensionStructName structure passed to the
|
|
flink:vkBaseFunctionName command *saying what the extension struct
|
|
does*.
|
|
|
|
|
|
[[writing-example]]
|
|
== An Example Command Description
|
|
|
|
The <<sample-command,next section>> is a sample based on the <<vulkan-spec,Vulkan API Specification>>,
|
|
and describes a command in enough detail to see the different usage patterns
|
|
and layout / markup used. Informative notes discussing markup and guidelines
|
|
are interspersed with the example description to explain how and why it
|
|
looks as it does.
|
|
|
|
|
|
[[sample-command]]
|
|
== Sample Command Description: Creating Command Pools
|
|
|
|
// refBegin vkCreateCommandPool Create a new command pool object
|
|
|
|
To create a command pool, call:
|
|
|
|
include::../api/protos/vkCreateCommandPool.txt[]
|
|
|
|
[NOTE]
|
|
.Guideline
|
|
====
|
|
Begin the command description with a comment delimiting the language for
|
|
<<writing-refpages,automatic extraction into a reference page>>.
|
|
|
|
Use a short, active sentence when describing what commands do, instead of
|
|
more passive phrasing like ``A command pool is created by calling:'' or ``The
|
|
application may create a command pool by calling:''.
|
|
|
|
After the description, include the autogenerated prototype for the
|
|
command from the `../protos/` directory:
|
|
|
|
// refBegin vkCreateCommandPool Create a new command pool object
|
|
|
|
To create a command pool, call:
|
|
|
|
include::../api/protos/vkCreateCommandPool.txt[]
|
|
|
|
Note that each autogenerated command, enumeration, flag, or structure
|
|
definition include file also defines a corresponding asciidoc anchor which
|
|
is the base name of the file. In this case, the anchor is named
|
|
`vkCreateCommandPool`.
|
|
====
|
|
|
|
* pname:device is the logical device that the command pool is created on.
|
|
* pname:pCreateInfo points to an instance of the
|
|
slink:VkCommandPoolCreateInfo structure containing information used to
|
|
create the command pool.
|
|
* pname:pAllocator controls host memory allocation as described in the
|
|
<<memory-allocation, Memory Allocation>> chapter.
|
|
* pname:pCommandPool points to a handle in which the created command pool
|
|
object is returned.
|
|
|
|
[NOTE]
|
|
.Guideline
|
|
====
|
|
Each command parameter is described in a separate bullet list entry,
|
|
followed by validity rules, then detailed descriptions of any new
|
|
structures, flags, or enumerations introduced by this command.
|
|
|
|
Each parameter should appear as a separate bullet list item beginning with
|
|
the parameter name, in the same order as parameters appear in the command.
|
|
This aids in extracting short descriptions of parameters for inclusion in
|
|
annotated headers and similar documentation. Make sure to tag each parameter
|
|
with the pname{cl} macro.
|
|
|
|
Strive for compact notation, and in particular always try to use the
|
|
phrasing ``pname{cl}param _is_'' rather than wordier forms such as
|
|
``pname{cl}param _specifies_'' or ``The pname{cl}param parameter specifies''. In
|
|
general there is no need to describe a parameter which is a Vulkan object
|
|
handle *as* a handle; for example, say ``pname{cl}device is the logical
|
|
device'' rather than ``pname{cl}device is a handle to the logical device''. An
|
|
exception is object creation functions, where a pointer to a handle of the
|
|
proper type is used to return the newly created object.
|
|
====
|
|
|
|
include::../validity/protos/vkCreateCommandPool.txt[]
|
|
|
|
[NOTE]
|
|
.Guideline
|
|
====
|
|
Parameter and member validation language for commands and structures is also
|
|
autogenerated from vk.xml, and included from the `../validity/` directories:
|
|
|
|
include::../validity/protos/vkCreateCommandPool.txt[]
|
|
|
|
Structures and enumerations first used as parameters of a command are
|
|
described next.
|
|
====
|
|
|
|
// refBegin VkCommandPoolCreateInfo - Structure specifying parameters of a newly created command pool
|
|
|
|
The sname:VkCommandPoolCreateInfo structure is defined as:
|
|
|
|
include::../api/structs/VkCommandPoolCreateInfo.txt[]
|
|
|
|
[NOTE]
|
|
.Guideline
|
|
====
|
|
Begin the structure description with a comment delimiting the language for
|
|
<<writing-refpages,automatic extraction into a reference page>>.
|
|
|
|
Use a short, active paragraph to introduce the structure, usually just
|
|
``The sname:VkStructureName structure is defined as:''.
|
|
|
|
After the description, include the autogenerated definition for the
|
|
structure from the `../structs/` directory:
|
|
|
|
// refBegin VkCommandPoolCreateInfo - Structure specifying parameters of a newly created command pool
|
|
|
|
The sname:VkCommandPoolCreateInfo structure is defined as:
|
|
|
|
include::../api/structs/VkCommandPoolCreateInfo.txt[]
|
|
====
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:flags is a combination of bitmask flags indicating usage behavior
|
|
for the pool and command buffers allocated from it. Possible values
|
|
include:
|
|
+
|
|
--
|
|
// refBegin VkCommandPoolCreateFlagBits - Bitmask specifying usage behavior for a command pool
|
|
include::../api/enums/VkCommandPoolCreateFlagBits.txt[]
|
|
--
|
|
+
|
|
** ename:VK_COMMAND_POOL_CREATE_TRANSIENT_BIT indicates that command buffers
|
|
allocated from the pool will be short-lived.
|
|
** ename:VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT controls whether
|
|
command buffers allocated from the pool can: be individually reset.
|
|
* pname:queueFamilyIndex designates a queue family. Command buffers in
|
|
this command pool must: be submitted on queues from the same family.
|
|
|
|
[NOTE]
|
|
.Guideline
|
|
====
|
|
Each structure member is described in a separate bullet list entry. For the
|
|
stext:Vk*CreateInfo structures in particular, there is standard boilerplate
|
|
for the pname:sType and pname:pNext members, followed by the members
|
|
specific to the structure.
|
|
|
|
----
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
----
|
|
|
|
In some cases, such as when the type of a member is itself a new type, the
|
|
entry will cover multiple paragraphs. In these cases the normal list nesting
|
|
and indentation guidelines cannot be applied due to limitations of the
|
|
asciidoc parser. It is usually best to append a continuation block following
|
|
the first paragraph of such a list item:
|
|
|
|
----
|
|
* pname:flags is a bitmask indicating usage behavior for the pool and
|
|
command buffers allocated from it. Bits which can: be set include:
|
|
+
|
|
--
|
|
// refBegin VkCommandPoolCreateFlagBits - Bitmask specifying usage behavior for a command pool
|
|
\include::../api/enums/VkCommandPoolCreateFlagBits.txt[]
|
|
--
|
|
+
|
|
** ename:VK_COMMAND_POOL_CREATE_TRANSIENT_BIT
|
|
indicates that command buffers allocated
|
|
from the pool will be short-lived.
|
|
** ename:VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
|
|
controls whether command buffers allocated from
|
|
the pool can: be individually reset.
|
|
----
|
|
====
|
|
|
|
include::../validity/structs/VkCommandPoolCreateInfo.txt[]
|
|
|
|
[NOTE]
|
|
.Guideline
|
|
====
|
|
Following the definition of structure members, include the validity language
|
|
for this structure:
|
|
|
|
include::../validity/structs/VkCommandPoolCreateInfo.txt[]
|
|
====
|
|
|
|
|
|
[[writing-refpages]]
|
|
== Markup For Automatic Reference Page Extraction
|
|
|
|
The Vulkan reference pages are (mostly) being extracted from
|
|
corresponding sections of the API Specification. This requires that the
|
|
markup and writing conventions described above be adhered to rigidly.
|
|
|
|
The extraction scripts for a given page rely on the existence of the
|
|
asciidoc +include+ of the autogenerated definition of that command,
|
|
structure, or other API interface element. Various heuristics are used
|
|
to determine which text to extract for that page; the general model is:
|
|
|
|
* Optional (but usually specified) comment line specifying the
|
|
interface name and the short description used in the title of the
|
|
corresponding ref page:
|
|
+
|
|
----
|
|
// refBegin name - description
|
|
----
|
|
+
|
|
* A paragraph of text introducing the definition of the interface. If
|
|
the +refBegin+ comment does not exist, this paragraph must be
|
|
present.
|
|
* The +include+ line for the interface, which must be consistent
|
|
with the interface name in the comment line.
|
|
* A bullet list describing function parameters, structure members,
|
|
enumerants in an enumerated type, etc. This list should contain no
|
|
empty lines, as the extraction script classifies the uninterrupted
|
|
block of text following the +include+ directive as the +Parameters+
|
|
or +Members+ section of the ref page.
|
|
* Optional paragraphs of text making up the +Description+ section of
|
|
the ref page.
|
|
* The +include+ line for the validity statement of commands and
|
|
structures. Other interfaces such as enumerated types do not have
|
|
validity statements.
|
|
* Comment line specifying the end of the extracted text for the
|
|
reference page and optional page names to link to in the +See Also+
|
|
section of the page. If the validity +include+ is not present, this
|
|
line must be present:
|
|
+
|
|
----
|
|
// refEnd name [seeAlsoNames]*
|
|
----
|
|
|
|
All elements specifying an interface name (+refBegin+ and +refEnd+
|
|
comments, interface +include+ line, and validity +include+ line) must
|
|
use the same interface name, if present. Otherwise the extraction script
|
|
is either unable to extract that page, or will extract the wrong text.
|
|
The extraction process is somewhat fragile, so care should be taken and
|
|
the results of reference page extraction verified after making changes
|
|
to that portion of the specification source.
|