2016-02-16 09:53:44 +00:00
|
|
|
|
// Copyright (c) 2015-2016 The Khronos Group Inc.
|
|
|
|
|
// Copyright notice at https://www.khronos.org/registry/speccopyright.html
|
|
|
|
|
|
2016-02-28 10:57:31 +00:00
|
|
|
|
[appendix]
|
|
|
|
|
|
2016-02-28 10:53:20 +00:00
|
|
|
|
[[extensions]]
|
2016-02-16 09:53:44 +00:00
|
|
|
|
= Layers & Extensions
|
|
|
|
|
|
|
|
|
|
Extensions to the {apiname} API can: be defined by authors, groups of
|
|
|
|
|
authors, and the Khronos {apiname} Working Group. In order not to compromise
|
|
|
|
|
the readability of the {apiname} Specification, the core Specification does
|
|
|
|
|
not incorporate most extensions. The online registry of extensions is
|
|
|
|
|
available at URL
|
|
|
|
|
|
|
|
|
|
http://www.khronos.org/registry/vulkan/
|
|
|
|
|
|
|
|
|
|
and allows generating versions of the Specification incorporating different
|
|
|
|
|
extensions.
|
|
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
|
.Note
|
|
|
|
|
====
|
|
|
|
|
The mechanism and process of specifying extensions is subject to change, as
|
|
|
|
|
we receive feedback from authors and further requirements of documentation
|
|
|
|
|
tooling. This appendix will be updated as this evolves.
|
|
|
|
|
====
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== Introduction
|
|
|
|
|
|
|
|
|
|
The Khronos extension registries and extension naming conventions serve
|
|
|
|
|
several purposes:
|
|
|
|
|
|
|
|
|
|
* Avoiding naming collisions between extensions developed by mutually
|
|
|
|
|
unaware parties, both in the extension names themselves, as well as
|
|
|
|
|
their token, command, and type names.
|
|
|
|
|
* Allocating enumerant values for tokens added by extensions
|
|
|
|
|
* Creating a defined order between extensions. Extensions with higher
|
|
|
|
|
numbers may: have dependencies upon extensions with lower numbers, and
|
|
|
|
|
must: define any relevant interactions with lower-numbered extensions.
|
|
|
|
|
* Provides a central repository for documentation and header changes
|
|
|
|
|
associated with extensions
|
|
|
|
|
|
|
|
|
|
{apiname}'s design and general software development trends introduces two
|
|
|
|
|
new paradigms that require rethinking the existing mechanisms:
|
|
|
|
|
|
|
|
|
|
* Layers, and with them a focus on a more open ecosystem where non-Khronos
|
|
|
|
|
members are expected to extend a Khronos API using the Layer mechanism.
|
|
|
|
|
* Namespaced constants (enumerations) that don't necessarily draw from a
|
|
|
|
|
single global set of token values.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== General Rules/Guidelines
|
|
|
|
|
|
|
|
|
|
Some general rules to simplify the specific rules below:
|
|
|
|
|
|
|
|
|
|
* Extensions and layers must: each have a globally unique name.
|
|
|
|
|
* All commands and tokens must: have a globally unique name.
|
|
|
|
|
* Extensions can: expose new commands, types, and/or tokens, but layers
|
|
|
|
|
mustnot:.
|
|
|
|
|
** However, layers can: expose their own extensions, which in turn are
|
|
|
|
|
allowed to expose new commands and tokens.
|
|
|
|
|
* All extensions must: be registered with Khronos.
|
|
|
|
|
* Extensions must: be strictly additive and backwards-compatible. That is,
|
|
|
|
|
extensions mustnot: remove existing functionality, or change existing
|
|
|
|
|
default behaviors. A {apiname} implementation may: support any
|
|
|
|
|
combination of extensions, but applications written using only the core
|
|
|
|
|
API, or a subset of the supported extensions, must: continue to work in
|
|
|
|
|
such an implementation without changes in behavior.
|
|
|
|
|
|
Change log for March 10, 2016 Vulkan 1.0.6 spec update:
* Bump API patch number and header version number to 6 for this
update.
Github Issues:
* Define 'invocation group' for compute and graphics shaders. Cleanup
definition and use of 'workgroup', and add glossary entries (public
issue 1).
* Various minor editorial fixes (public issue 33).
* Clarify locations for block members in the
<<interfaces-iointerfaces-locations,Location Assignment>>
section (public issue 45).
* Editorial fixes for <<commandbuffer-allocation,Command Buffer
Allocation>> section (public issues 54, 59).
* Clarify behavior of depth test in the <<fragops-depth,Depth
Test>> section (public issues 80, 81).
* Remove discussion of return codes from
flink:vkGetPhysicalDeviceSparseImageFormatProperties and
flink:vkGetImageSparseMemoryRequirements, which don't return values
(public issue 82).
* Allow flink:vkCmdDrawIndirect and flink:vkCmdDrawIndexedIndirect
pname:drawCount of 0, as well as 1, when the multiDrawIndirect
feature is not supported (public issue 88).
* Remove confusing wording in the <<features-limits,Limits>>
section describing the slink:VkPhysicalDeviceLimits
pname:minTexelBufferOffsetAlignment,
pname:minUniformBufferOffsetAlignment, and
pname:minStorageBufferOffsetAlignment members as both minimums and
maximums (public issue 91).
* Clarified that only the RGB components should be affected in places
where sRGB is referred to in the spec, such as ASTC formats. Minor
re-wording to avoid "color space" when actively incorrect, now that
we refer to the Data Format Spec which actually makes a distinction
between color space and transfer function (public issue 94).
* Treat pname:pPropertyCount == 0 consistently in
flink:vkEnumerateInstanceLayerProperties and
flink:vkEnumerateDeviceLayerProperties (public issue 99)
* Cleanup minor editorial issues in chapters 14-17 (public issue 100).
* Clarify definition of flink:vkEnumerateInstanceExtensionProperties
and flink:vkEnumerateDeviceExtensionProperties (public issue 101).
* Define the flink:vkEnumerateInstanceExtensionProperties and
flink:vkEnumerateDeviceExtensionProperties pname:pLayerName
parameter to be a pointer to a null-terminated UTF-8 string (public
issue 101).
* Rearrange "Missing information" references in mandatory format
tables (public issue 101).
* Clarify that the enumerated extensions returned by
flink:vkEnumerateInstanceExtensionProperties and
flink:vkEnumerateDeviceExtensionProperties will only include
extensions provided by the platform or extensions implemented in
implicitly enabled layers (public issue 101).
* Miscellaneous editorial fixes. Include the Vulkan spec patch number
in the PDF title. Fix label on <<fig-non-strict-lines,Non
strict lines>> diagram. Use more easily distinguished symbols in
tables in the <<features-required-format-support,Required
Format Support>> section. Don't require FQDNs used as layer names be
encoded in lower case if not possible, in the
<<extensions-naming-conventions, Extension and Layer Naming
Conventions>> section (public issues 101, 119, 121).
Internal Issues:
* Fixed excessive spacing in tables in XHTML (internal issue 18).
* Clarify that ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
applies to secondary command buffers. Previously spec only referred
to the members of pname:pCommandBuffers being affected by this bit.
Added a separate slink:VkSubmitInfo Valid Usage restriction
specifying that ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
also applies to any secondary command buffers that are recorded into
the primary command buffers in pname:pCommandBuffers (internal issue
106).
* Clarify that slink:VkDeviceCreateInfo::pname:pEnabledFeatures can be
NULL (internal issue 117).
* Remove "the value of" where it is redundant (e.g. speaking of an API
parameter, struct member, or SPIR-V variable, but not when speaking
of color components) (internal issue 175).
* Forced patch version to always be 0 in the header. Add a
"VK_API_VERSION_<major>_<minor>" macro for people to use to do the
right thing. Add a VK_HEADER_VERSION which captures the header
release number independent of the spec patch number (internal issue
176).
* Correct description of
slink:VkPipelineShaderStageCreateInfo::pname:pName to "a pointer to
a null-terminated UTF-8 string" (internal issue #197).
Other Commits:
* Updated DataFormat spec reference to the new date for revision 5 of
that spec.
* Fixed KEEP option (to retain LaTeX intermediate files) in the
Makefile to be included when edited there, as well as set on the
command line.
* Reserve and add "VK_IMG_filter_cubic" to the registry, and implement
script functionality to add and remove validity from existing
functions. Includes schema and readme changes.
* Update GL_KHR_vulkan_glsl so push_constants do not have descriptor
sets.
2016-03-11 01:33:02 +00:00
|
|
|
|
[[extensions-naming-conventions]]
|
2016-02-16 09:53:44 +00:00
|
|
|
|
== Extension and Layer Naming Conventions
|
|
|
|
|
|
|
|
|
|
* Extensions are named with the syntax: +VK_AUTHOR_<name>+.
|
|
|
|
|
* Layers are named with the syntax: +VK_LAYER_{AUTHOR|FQDN}_<name>+.
|
|
|
|
|
|
|
|
|
|
Both extensions and layer names include a +VK_+ prefix. In addition, layers
|
|
|
|
|
add a +LAYER_+ prefix. Extension and layer names also contain an _author
|
|
|
|
|
prefix_ identifying the author of the extension/layer. This prefix is a
|
|
|
|
|
short, capitalized, registered string identifying an author, such as a
|
|
|
|
|
Khronos member developing {apiname} implementations for their devices, or a
|
|
|
|
|
non-Khronos developer creating {apiname} layers.
|
|
|
|
|
|
|
|
|
|
Some authors have platform communities they wish to distinguish between, and
|
|
|
|
|
can: register additional author prefixes for that purpose. For example,
|
|
|
|
|
Google has separate Android and Chrome communities.
|
|
|
|
|
|
|
|
|
|
Details on how to register an author prefix are provided below. Layer
|
|
|
|
|
authors not wishing to register an author prefix with Khronos can: instead
|
|
|
|
|
use a fully-qualified domain name (FQDN) as the prefix. The FQDN should: be
|
|
|
|
|
a domain name owned by the author. FQDNs cannot: be used for extensions,
|
|
|
|
|
only for layers.
|
|
|
|
|
|
|
|
|
|
* The following are examples of extension and layer names, demonstrating
|
|
|
|
|
the above syntax:
|
|
|
|
|
** Extension names all use the base prefix +VK_+.
|
|
|
|
|
** Khronos-ratified extensions add the special author prefix +KHR+, and
|
|
|
|
|
will use the prefix +VK_KHR_+.
|
|
|
|
|
** The following author prefixes are reserved and mustnot: be used:
|
|
|
|
|
*** +VK+ - To avoid confusion with the top-level +VK_+ prefix.
|
|
|
|
|
*** +VULKAN+ - To avoid confusion with the name of the {apiname} API.
|
|
|
|
|
*** +LAYER+ - To avoid confusion with the higher-level ``LAYER'' prefix.
|
|
|
|
|
*** +KHRONOS+ - To avoid confusion with the Khronos organization.
|
|
|
|
|
** Multi-author extensions that have not been ratified by Khronos (those
|
|
|
|
|
developed via cooperation between, and intended to be supported by two
|
|
|
|
|
or more registered authors) add the special author prefix +EXT+ to the
|
|
|
|
|
base prefix, and will use the prefix +VK_EXT_+.
|
|
|
|
|
** Traditional author-specific extensions developed by one author (or one
|
|
|
|
|
author in cooperation with non-authors) add the author prefix to the
|
|
|
|
|
base prefix. For example, NVIDIA will use the prefix +VK_NV_+, and
|
|
|
|
|
Valve will use the prefix +VK_VALVE_+. Some authors can: have
|
|
|
|
|
additional registered author prefixes for special purposes. For
|
|
|
|
|
example, an Android extension developed by Google - but part of an
|
|
|
|
|
Android open-source community project, and so not a proprietary Google
|
|
|
|
|
extension - will use the prefix +VK_ANDROID_+.
|
|
|
|
|
** Layer names follow the same conventions as extensions, but use the base
|
|
|
|
|
prefix +VK_LAYER_+.
|
|
|
|
|
** Because layers need not be registered with Khronos, an alternative
|
|
|
|
|
prefix mechanism is needed to allow creating unique layer names without
|
|
|
|
|
registering an author prefix. Layer authors that prefer not to register
|
|
|
|
|
an author prefix can: instead use a fully-qualified domain name (FQDN)
|
Change log for March 10, 2016 Vulkan 1.0.6 spec update:
* Bump API patch number and header version number to 6 for this
update.
Github Issues:
* Define 'invocation group' for compute and graphics shaders. Cleanup
definition and use of 'workgroup', and add glossary entries (public
issue 1).
* Various minor editorial fixes (public issue 33).
* Clarify locations for block members in the
<<interfaces-iointerfaces-locations,Location Assignment>>
section (public issue 45).
* Editorial fixes for <<commandbuffer-allocation,Command Buffer
Allocation>> section (public issues 54, 59).
* Clarify behavior of depth test in the <<fragops-depth,Depth
Test>> section (public issues 80, 81).
* Remove discussion of return codes from
flink:vkGetPhysicalDeviceSparseImageFormatProperties and
flink:vkGetImageSparseMemoryRequirements, which don't return values
(public issue 82).
* Allow flink:vkCmdDrawIndirect and flink:vkCmdDrawIndexedIndirect
pname:drawCount of 0, as well as 1, when the multiDrawIndirect
feature is not supported (public issue 88).
* Remove confusing wording in the <<features-limits,Limits>>
section describing the slink:VkPhysicalDeviceLimits
pname:minTexelBufferOffsetAlignment,
pname:minUniformBufferOffsetAlignment, and
pname:minStorageBufferOffsetAlignment members as both minimums and
maximums (public issue 91).
* Clarified that only the RGB components should be affected in places
where sRGB is referred to in the spec, such as ASTC formats. Minor
re-wording to avoid "color space" when actively incorrect, now that
we refer to the Data Format Spec which actually makes a distinction
between color space and transfer function (public issue 94).
* Treat pname:pPropertyCount == 0 consistently in
flink:vkEnumerateInstanceLayerProperties and
flink:vkEnumerateDeviceLayerProperties (public issue 99)
* Cleanup minor editorial issues in chapters 14-17 (public issue 100).
* Clarify definition of flink:vkEnumerateInstanceExtensionProperties
and flink:vkEnumerateDeviceExtensionProperties (public issue 101).
* Define the flink:vkEnumerateInstanceExtensionProperties and
flink:vkEnumerateDeviceExtensionProperties pname:pLayerName
parameter to be a pointer to a null-terminated UTF-8 string (public
issue 101).
* Rearrange "Missing information" references in mandatory format
tables (public issue 101).
* Clarify that the enumerated extensions returned by
flink:vkEnumerateInstanceExtensionProperties and
flink:vkEnumerateDeviceExtensionProperties will only include
extensions provided by the platform or extensions implemented in
implicitly enabled layers (public issue 101).
* Miscellaneous editorial fixes. Include the Vulkan spec patch number
in the PDF title. Fix label on <<fig-non-strict-lines,Non
strict lines>> diagram. Use more easily distinguished symbols in
tables in the <<features-required-format-support,Required
Format Support>> section. Don't require FQDNs used as layer names be
encoded in lower case if not possible, in the
<<extensions-naming-conventions, Extension and Layer Naming
Conventions>> section (public issues 101, 119, 121).
Internal Issues:
* Fixed excessive spacing in tables in XHTML (internal issue 18).
* Clarify that ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
applies to secondary command buffers. Previously spec only referred
to the members of pname:pCommandBuffers being affected by this bit.
Added a separate slink:VkSubmitInfo Valid Usage restriction
specifying that ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
also applies to any secondary command buffers that are recorded into
the primary command buffers in pname:pCommandBuffers (internal issue
106).
* Clarify that slink:VkDeviceCreateInfo::pname:pEnabledFeatures can be
NULL (internal issue 117).
* Remove "the value of" where it is redundant (e.g. speaking of an API
parameter, struct member, or SPIR-V variable, but not when speaking
of color components) (internal issue 175).
* Forced patch version to always be 0 in the header. Add a
"VK_API_VERSION_<major>_<minor>" macro for people to use to do the
right thing. Add a VK_HEADER_VERSION which captures the header
release number independent of the spec patch number (internal issue
176).
* Correct description of
slink:VkPipelineShaderStageCreateInfo::pname:pName to "a pointer to
a null-terminated UTF-8 string" (internal issue #197).
Other Commits:
* Updated DataFormat spec reference to the new date for revision 5 of
that spec.
* Fixed KEEP option (to retain LaTeX intermediate files) in the
Makefile to be included when edited there, as well as set on the
command line.
* Reserve and add "VK_IMG_filter_cubic" to the registry, and implement
script functionality to add and remove validity from existing
functions. Includes schema and readme changes.
* Update GL_KHR_vulkan_glsl so push_constants do not have descriptor
sets.
2016-03-11 01:33:02 +00:00
|
|
|
|
in reverse-order as an author prefix, replacing +.+ (period) with `_`
|
|
|
|
|
(underscore) characters. For example, a layer written by the owner of
|
|
|
|
|
www.3dxcl.invalid would use the prefix `VK_LAYER_invalid_3dxcl_www_`.
|
|
|
|
|
FQDNs must: be encoded in UTF-8, and should: be in lower case, if
|
|
|
|
|
possible for the domain FQDN in question.
|
2016-02-16 09:53:44 +00:00
|
|
|
|
|
2016-02-28 10:53:20 +00:00
|
|
|
|
[NOTE]
|
|
|
|
|
.Note
|
|
|
|
|
====
|
|
|
|
|
To avoid linking to a nonexistent domain, the reserved TLD +.invalid+ is
|
|
|
|
|
used.
|
Change log for March 10, 2016 Vulkan 1.0.6 spec update:
* Bump API patch number and header version number to 6 for this
update.
Github Issues:
* Define 'invocation group' for compute and graphics shaders. Cleanup
definition and use of 'workgroup', and add glossary entries (public
issue 1).
* Various minor editorial fixes (public issue 33).
* Clarify locations for block members in the
<<interfaces-iointerfaces-locations,Location Assignment>>
section (public issue 45).
* Editorial fixes for <<commandbuffer-allocation,Command Buffer
Allocation>> section (public issues 54, 59).
* Clarify behavior of depth test in the <<fragops-depth,Depth
Test>> section (public issues 80, 81).
* Remove discussion of return codes from
flink:vkGetPhysicalDeviceSparseImageFormatProperties and
flink:vkGetImageSparseMemoryRequirements, which don't return values
(public issue 82).
* Allow flink:vkCmdDrawIndirect and flink:vkCmdDrawIndexedIndirect
pname:drawCount of 0, as well as 1, when the multiDrawIndirect
feature is not supported (public issue 88).
* Remove confusing wording in the <<features-limits,Limits>>
section describing the slink:VkPhysicalDeviceLimits
pname:minTexelBufferOffsetAlignment,
pname:minUniformBufferOffsetAlignment, and
pname:minStorageBufferOffsetAlignment members as both minimums and
maximums (public issue 91).
* Clarified that only the RGB components should be affected in places
where sRGB is referred to in the spec, such as ASTC formats. Minor
re-wording to avoid "color space" when actively incorrect, now that
we refer to the Data Format Spec which actually makes a distinction
between color space and transfer function (public issue 94).
* Treat pname:pPropertyCount == 0 consistently in
flink:vkEnumerateInstanceLayerProperties and
flink:vkEnumerateDeviceLayerProperties (public issue 99)
* Cleanup minor editorial issues in chapters 14-17 (public issue 100).
* Clarify definition of flink:vkEnumerateInstanceExtensionProperties
and flink:vkEnumerateDeviceExtensionProperties (public issue 101).
* Define the flink:vkEnumerateInstanceExtensionProperties and
flink:vkEnumerateDeviceExtensionProperties pname:pLayerName
parameter to be a pointer to a null-terminated UTF-8 string (public
issue 101).
* Rearrange "Missing information" references in mandatory format
tables (public issue 101).
* Clarify that the enumerated extensions returned by
flink:vkEnumerateInstanceExtensionProperties and
flink:vkEnumerateDeviceExtensionProperties will only include
extensions provided by the platform or extensions implemented in
implicitly enabled layers (public issue 101).
* Miscellaneous editorial fixes. Include the Vulkan spec patch number
in the PDF title. Fix label on <<fig-non-strict-lines,Non
strict lines>> diagram. Use more easily distinguished symbols in
tables in the <<features-required-format-support,Required
Format Support>> section. Don't require FQDNs used as layer names be
encoded in lower case if not possible, in the
<<extensions-naming-conventions, Extension and Layer Naming
Conventions>> section (public issues 101, 119, 121).
Internal Issues:
* Fixed excessive spacing in tables in XHTML (internal issue 18).
* Clarify that ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
applies to secondary command buffers. Previously spec only referred
to the members of pname:pCommandBuffers being affected by this bit.
Added a separate slink:VkSubmitInfo Valid Usage restriction
specifying that ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
also applies to any secondary command buffers that are recorded into
the primary command buffers in pname:pCommandBuffers (internal issue
106).
* Clarify that slink:VkDeviceCreateInfo::pname:pEnabledFeatures can be
NULL (internal issue 117).
* Remove "the value of" where it is redundant (e.g. speaking of an API
parameter, struct member, or SPIR-V variable, but not when speaking
of color components) (internal issue 175).
* Forced patch version to always be 0 in the header. Add a
"VK_API_VERSION_<major>_<minor>" macro for people to use to do the
right thing. Add a VK_HEADER_VERSION which captures the header
release number independent of the spec patch number (internal issue
176).
* Correct description of
slink:VkPipelineShaderStageCreateInfo::pname:pName to "a pointer to
a null-terminated UTF-8 string" (internal issue #197).
Other Commits:
* Updated DataFormat spec reference to the new date for revision 5 of
that spec.
* Fixed KEEP option (to retain LaTeX intermediate files) in the
Makefile to be included when edited there, as well as set on the
command line.
* Reserve and add "VK_IMG_filter_cubic" to the registry, and implement
script functionality to add and remove validity from existing
functions. Includes schema and readme changes.
* Update GL_KHR_vulkan_glsl so push_constants do not have descriptor
sets.
2016-03-11 01:33:02 +00:00
|
|
|
|
|
|
|
|
|
``Lower case'' is not a straightforward concept for all possible
|
|
|
|
|
encodings of domain names. We suggest using RFC 5895 to interpret this
|
|
|
|
|
phrase. The recommendation is that the representation of a FQDN in a layer
|
|
|
|
|
name should be the same way one would naturally type that name into a web
|
|
|
|
|
browser.
|
2016-02-28 10:53:20 +00:00
|
|
|
|
====
|
2016-02-16 09:53:44 +00:00
|
|
|
|
|
|
|
|
|
|
2016-02-28 10:53:20 +00:00
|
|
|
|
[[extensions-naming]]
|
|
|
|
|
== Extension Command, Type, and Token Naming Conventions
|
2016-02-16 09:53:44 +00:00
|
|
|
|
|
2016-02-28 10:53:20 +00:00
|
|
|
|
Extensions may: add new commands, types, and tokens, or collectively
|
|
|
|
|
``objects'', to the {apiname} API. These objects are given globally unique
|
|
|
|
|
names by appending the author prefix defined above for the extension name
|
|
|
|
|
according to the following templates.
|
2016-02-16 09:53:44 +00:00
|
|
|
|
|
2016-02-28 10:53:20 +00:00
|
|
|
|
A command or type name simply appends the author prefix. For example, a
|
|
|
|
|
Khronos-blessed extension could expose the following command:
|
2016-02-16 09:53:44 +00:00
|
|
|
|
|
|
|
|
|
["source","{basebackend@docbook:c++:cpp}",title=""]
|
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
|
void vkDoSomethingKHR(void);
|
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
A Google extension could expose the following command:
|
|
|
|
|
|
|
|
|
|
["source","{basebackend@docbook:c++:cpp}",title=""]
|
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
|
void vkDoSomethingGOOGLE(void);
|
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
|
|
2016-02-28 10:53:20 +00:00
|
|
|
|
And a multi-author extension could expose the following type:
|
2016-02-16 09:53:44 +00:00
|
|
|
|
|
|
|
|
|
["source","{basebackend@docbook:c++:cpp}",title=""]
|
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
|
typedef struct VkSomeDataEXT;
|
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
|
|
2016-02-28 10:53:20 +00:00
|
|
|
|
Enumeration or constant token names are constructed by following the token
|
|
|
|
|
name with `_` and the author prefix, so a non-Khronos extension could expose
|
2016-03-01 10:45:37 +00:00
|
|
|
|
this enumeration:
|
2016-02-16 09:53:44 +00:00
|
|
|
|
|
|
|
|
|
["source","{basebackend@docbook:c++:cpp}",title=""]
|
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
|
enum VkSomeValuesGRPHX {
|
|
|
|
|
VK_SOME_VALUE_0_GRPHX = 0,
|
|
|
|
|
VK_SOME_VALUE_1_GRPHX = 1,
|
|
|
|
|
VK_SOME_VALUE_2_GRPHX = 2,
|
|
|
|
|
};
|
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[[extensions-api-registry]]
|
|
|
|
|
== The {apiname} Registry
|
|
|
|
|
|
|
|
|
|
The canonical definition of the {apiname} APIs is kept in an XML file known
|
|
|
|
|
as the *{apiname} registry*. The registry is kept in +src/spec/vk.xml+ in
|
|
|
|
|
the branch of the vulkan project containing the most recently released core
|
|
|
|
|
API specification. The registry contains reserved author prefixes, core and
|
|
|
|
|
extension interface definitions, definitions of individual commands and
|
|
|
|
|
structures, and other information which must be agreed on by all
|
|
|
|
|
implementations. The registry is used to maintain a single, consistent
|
|
|
|
|
global namespace for the registered entities, to generate the
|
|
|
|
|
Khronos-supplied +vulkan.h+, and to create a variety of related
|
|
|
|
|
documentation used in generating the API specification and reference pages.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[[extensions-author-prefix]]
|
|
|
|
|
== Registering an Author Prefix with Khronos
|
|
|
|
|
|
|
|
|
|
Previous Khronos APIs could only officially be modified by Khronos members.
|
|
|
|
|
In an effort to build a more flexible platform, {apiname} allows non-Khronos
|
|
|
|
|
developers to extend and modify the API via layers and extensions in the
|
|
|
|
|
same manner as Khronos members. However, extensions must: still be
|
|
|
|
|
registered with Khronos. A mechanism for non-members to register layers and
|
|
|
|
|
extensions is provided.
|
|
|
|
|
|
|
|
|
|
Extension authors will be able to create an account on the Khronos github
|
|
|
|
|
project and, using this account, register an author prefix with
|
|
|
|
|
Khronos. This string must: be used as the author prefix in any extensions
|
|
|
|
|
the author registers. The same account will be used to request registration
|
|
|
|
|
of extensions or layers with Khronos, as described below.
|
|
|
|
|
|
|
|
|
|
To reserve an author prefix, propose a merge request against
|
|
|
|
|
<<extensions-api-registry,+vk.xml+>>. The merge must: add a +<tag>+ XML tag
|
|
|
|
|
and fill in the +name+, +author+ and +contact+ attributes with the requested
|
|
|
|
|
author prefix, the author's formal name (e.g. company or project name), and
|
|
|
|
|
contact email address, respectively. The author prefix will be reserved only
|
|
|
|
|
once this merge request is accepted.
|
|
|
|
|
|
|
|
|
|
Please do not try to reserve author names which clearly belong to another
|
|
|
|
|
existing company or software project which may: wish to develop {apiname}
|
|
|
|
|
extensions or layers in the future, as a matter of courtesy and respect.
|
|
|
|
|
Khronos may: decline to register author names that are not requested in good
|
|
|
|
|
faith.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[[extensions-vendor-id]]
|
|
|
|
|
== Registering a Vendor ID with Khronos
|
|
|
|
|
|
|
|
|
|
{apiname} implementers must report a valid vendor ID for their
|
|
|
|
|
implementation, as reported by
|
|
|
|
|
<<devsandqueues-physical-device-enumeration,physical device queries>>. If
|
|
|
|
|
there is no valid PCI vendor ID defined for the physical device,
|
|
|
|
|
implementations must: obtain a Khronos vendor ID.
|
|
|
|
|
|
|
|
|
|
Khronos vendor IDs are reserved in a similar fashion to
|
|
|
|
|
<<extensions-author-prefix,author prefixes>>. While vendor IDs are not
|
|
|
|
|
directly related to API extensions, the reservation process is very similar
|
|
|
|
|
and so is described in this section.
|
|
|
|
|
|
|
|
|
|
To reserve an Khronos vendor ID, you must first have a Khronos author
|
|
|
|
|
prefix. Propose a merge request against
|
|
|
|
|
<<extensions-api-registry,+vk.xml+>>. The merge must: add a +<vendorid>+ tag
|
|
|
|
|
and fill in the +name+ and +id+ attributes. The +name+ attribute must: be
|
|
|
|
|
set to the author prefix. The +id+ attribute must: be the first sequentially
|
|
|
|
|
available ID in the list of +<vendorid>+ tags. The vendor ID will be
|
|
|
|
|
reserved only once this merge request has been accepted.
|
|
|
|
|
|
|
|
|
|
Please do not try to reserve vendor IDs unless you are making a good faith
|
|
|
|
|
effort to develop a {apiname} implementation and require one for that
|
|
|
|
|
purpose.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== Registering Extensions and Layers
|
|
|
|
|
|
|
|
|
|
Extensions must: be registered with Khronos. Layers may: be registered, and
|
|
|
|
|
registration is strongly recommended. Registration means:
|
|
|
|
|
|
|
|
|
|
* Receiving an extension number.
|
|
|
|
|
* Adding the extension or layer name to the list in +vk.xml+ and appearing
|
|
|
|
|
on the Khronos registry website, which will link to associated
|
|
|
|
|
documentation hosted on Khronos.
|
|
|
|
|
* For extensions which add to the {apiname} API, including definitions of
|
|
|
|
|
those additions to +vk.xml+.
|
|
|
|
|
|
|
|
|
|
Registration for Khronos members is handled by filing a merge request in the
|
|
|
|
|
internal gitlab repository against the branch containing the core
|
|
|
|
|
specification against which the extension or layer will be written. The
|
|
|
|
|
merge must: modify +vk.xml+ to define extension names, API interfaces, and
|
|
|
|
|
related information. Registration is not complete until the registry
|
|
|
|
|
maintainer has validated and accepted the merge.
|
|
|
|
|
|
|
|
|
|
Since this process could in principle be completely automated, this
|
|
|
|
|
suggests a scalable mechanism for accepting registration of non-Khronos
|
|
|
|
|
extensions. Non-Khronos members who want to create extensions must: register
|
|
|
|
|
with Khronos by creating a github account, and registering their author
|
|
|
|
|
prefix and/or FQDNs to that account. They can: then submit new extension
|
|
|
|
|
registration requests by proposing merges to +vk.xml+. On acceptance of the
|
|
|
|
|
merge, the extension will be registered, though its specification need not
|
|
|
|
|
be checked into the Khronos github repository at that point.
|
|
|
|
|
|
|
|
|
|
The registration process can: be split into several steps to accommodate
|
|
|
|
|
extension number assignment prior to extension publication:
|
|
|
|
|
|
|
|
|
|
* Acquire an extension number. This is done by proposing a merge request
|
|
|
|
|
against +vk.xml+ similarly to how <<extensions-author-prefix,author
|
|
|
|
|
prefixes are reserved>>. The merge should: add a new +<extension>+ tag
|
|
|
|
|
at the end of the file with attributes specifying the proposed extension
|
|
|
|
|
+name+, the next unused sequential extension +number+, the +author+ and
|
|
|
|
|
+contact+ information (if different than that already specified for the
|
|
|
|
|
author prefix used in the extension name), and finally, specifying
|
|
|
|
|
+supported="disabled"+. The extension number will be reserved only once
|
|
|
|
|
this merge request is accepted into the master branch.
|
|
|
|
|
* Develop and test the extension using the registered extension number.
|
|
|
|
|
* Publish the extension to Khronos using the previously registered
|
|
|
|
|
extension number, by creating a branch of the repository with
|
|
|
|
|
appropriate changes relative to the core {apiname} API branch.
|
|
|
|
|
* Mark the extension as enabled, by proposing a merge to master changing
|
|
|
|
|
the +supported+ attribute value of the +<extension>+ to
|
|
|
|
|
+supported="vulkan"+. This should: be completely automated and under the
|
|
|
|
|
control of the publishers, to allow them to align publication on Khronos
|
|
|
|
|
with product releases. However, complete automation might be difficult,
|
|
|
|
|
since steps such as regenerating and validating +vulkan.h+ are involved.
|
|
|
|
|
Once the merge is accepted and the corresponding updated header with the
|
|
|
|
|
new extension interface is committed to the master branch, publication
|
|
|
|
|
is complete.
|
|
|
|
|
|
|
|
|
|
The automated process does not exist yet, and would require significant
|
|
|
|
|
investment in infrastructure to support the process on the Khronos servers.
|
|
|
|
|
|
|
|
|
|
ifdef::editing-notes[]
|
|
|
|
|
[NOTE]
|
|
|
|
|
.editing-note
|
|
|
|
|
====
|
|
|
|
|
TODO: This section is subject to change and not complete yet, but in broad
|
|
|
|
|
is how we expect extension registration and specifications to work. The
|
|
|
|
|
process will be refined as members and outside authors define further
|
|
|
|
|
extensions.
|
|
|
|
|
====
|
|
|
|
|
endif::editing-notes[]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== Documenting Extensions
|
|
|
|
|
|
|
|
|
|
Extensions are documented as modifications to the {apiname} specification.
|
|
|
|
|
These modifications will be on Git branches that are named with the
|
|
|
|
|
following syntax: +<major.minor core spec version>-<extension_name>+
|
|
|
|
|
|
|
|
|
|
For example, the VK_KHR_surface extension will be documented relative
|
|
|
|
|
to version 1.0 of the {apiname} specification. As such, the branch name will
|
|
|
|
|
be: +1.0-VK_KHR_surface+
|
|
|
|
|
|
|
|
|
|
If the extension modifies an existing section of the {apiname}
|
|
|
|
|
specification, those modifications are made in-place. Since the changes are
|
|
|
|
|
on a branch, the core-only specification can: be easily produced. A
|
|
|
|
|
specification with an extension is created by merging in the extension's
|
|
|
|
|
branch contents.
|
|
|
|
|
|
|
|
|
|
Extensions should: be merged according to their registered extension number.
|
|
|
|
|
If two extensions both modify the same portion of the specification, the
|
|
|
|
|
higher-numbered extension should: take care to deal with any conflicts.
|
|
|
|
|
|
|
|
|
|
The WSI extensions were used to help pioneer what should: be done for
|
|
|
|
|
extensions. This includes the following:
|
|
|
|
|
|
|
|
|
|
* All extensions should: add to the appendix of the {apiname}
|
|
|
|
|
specification. This should: be modeled after what was done for the
|
|
|
|
|
+VK_KHR_surface+ extension, which contains some high-level information
|
|
|
|
|
about the extension (as well as code examples, and revision history) in
|
|
|
|
|
the +appendices/vk_khr_surface.txt+ file.
|
|
|
|
|
* Each extension's appendix file is included by adding an +include+
|
|
|
|
|
statement to the +vkspec.txt+ file. Since most extensions will all put
|
|
|
|
|
their +include+ line at the same place in this file, they should: add
|
|
|
|
|
this statement on the master branch, even though the file won't actually
|
|
|
|
|
exist on the master branch. This will avoid merge conflicts when
|
|
|
|
|
multiple extensions' branches are merged in order to create the ``full''
|
|
|
|
|
branch specification.
|
|
|
|
|
* If there are any other places where 2 or more extensions will extend the
|
|
|
|
|
{apiname} specification, it is best to put that content in a file, and
|
|
|
|
|
use an +include+ statement to put that content into the spec. Again,
|
|
|
|
|
this +include+ line should: be put on the master branch in order to
|
|
|
|
|
avoid merge conflicts.
|
|
|
|
|
* If an extension is more of an addition to the {apiname} specification,
|
|
|
|
|
the extension should: add a chapter to the {apiname} specification.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== Assigning Extension Token Values
|
|
|
|
|
|
|
|
|
|
Extensions can: define their own enumeration types and assign any values to
|
|
|
|
|
their enumerants that they like. Each enumeration has a private namespace,
|
|
|
|
|
so collisions are not a problem. However, when extending existing
|
2016-02-28 10:53:20 +00:00
|
|
|
|
enumeration objects with new values, care must: be taken to preserve global
|
2016-02-16 09:53:44 +00:00
|
|
|
|
uniqueness of values. Enumerations which define new bitfields are treated
|
|
|
|
|
specially as described in <<extensions-reserving-bitfield-values,Reserving
|
|
|
|
|
Bitfield Values>> below.
|
|
|
|
|
|
|
|
|
|
Each extension is assigned a range of values that can: be used to create
|
|
|
|
|
globally-unique enum values. Most values will be negative numbers, but
|
|
|
|
|
positive numbers are also reserved. The ability to create both positive and
|
|
|
|
|
negative extension values is necessary to enable extending enumerations such
|
|
|
|
|
as stext:VkResult that assign special meaning to negative and positive
|
|
|
|
|
values. Therefore, 1000 positive and 1000 negative values are reserved for
|
|
|
|
|
each extension. Extensions must: not define enum values outside their
|
|
|
|
|
reserved range without explicit permission from the owner of those values
|
|
|
|
|
(e.g. from the author of another extension whose range is infringed on, or
|
|
|
|
|
from the Khronos Registrar if the values do not belong to any extension's
|
|
|
|
|
range).
|
|
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
|
.Note
|
|
|
|
|
====
|
|
|
|
|
Typically, extensions use a unique offset for each enumeration constant they
|
|
|
|
|
add, yielding 1000 distinct token values per extension. Since each
|
|
|
|
|
enumeration object has its own namespace, if an extension needs to add many
|
|
|
|
|
enumeration constant values, it can: reuse offsets on a per-type basis.
|
|
|
|
|
====
|
|
|
|
|
|
|
|
|
|
The information needed to add new values to the XML are as follows:
|
|
|
|
|
|
|
|
|
|
* The **extension name** (e.g. +VK_KHR_swapchain+) that is adding the new
|
|
|
|
|
enumeration constant.
|
|
|
|
|
* The existing enumeration **type** being extended (e.g.
|
|
|
|
|
stext:VkStructureType).
|
|
|
|
|
* The name of the new enumeration **token** being added (e.g.
|
|
|
|
|
etext:VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR).
|
|
|
|
|
* The **offset**, which is an integer between 0 and 999 relative to the
|
|
|
|
|
base being used for the extension.
|
|
|
|
|
* The **direction** may: be specified to indicate a negative value
|
|
|
|
|
(+dir="-"+) when needed for negative stext:VkResult values indicating
|
|
|
|
|
errors, like etext:VK_ERROR_SURFACE_LOST_KHR. The default direction is
|
|
|
|
|
positive, if not specified.
|
|
|
|
|
|
|
|
|
|
Implicit is the registered number of an extension, which is used to create a
|
Change log for March 25, 2016 Vulkan 1.0.7 spec update:
* Bump API patch number and header version number to 7 for this
update.
Github Issues:
* Fix slink:VkSpecializationMapEntry example to avoid C/C++ strict
aliasing issues (public issue 14).
* Clarify the meaning of "matching" in flink:vkCmdBindDescriptorSets
validity language (public issue 33).
* Add stub reference pages so xrefs to not-yet-written pages don't
generate 404 errors. However, the actual content of these pages
still needs to be filled in as time allows (public issue 44, but
does not close that issue out).
* Remove incorrect validity statement for
flink:vkGetImageSparseMemoryRequirements (public issue 85).
* Reword the
<<features-limits-bufferImageGranularity,bufferImageGranularity>>
feature in terms of "aliasing", and clarify that it applies to
bindings in the same memory object (public issue 90).
* Clarify the relationship of the slink:VkPhysicalDeviceLimits
pname:maxViewportDimensions and pname:viewportBoundsRange limits
(public issue 92).
* Specify sparse unbound texture replacement in the
<<textures-texel-replacement,Texel Replacement>> section
independently of robust buffer access language (public issue 100).
* Add the <<fundamentals-architecture-model,Architecture Model>>
section to explain architecture constraints Vulkan has chosen to
accept in order to enable portable and performant code (public issue
122).
* State that an object must not be destroyed until *all* (not *any*)
uses of that object have completed (public issue 123).
* Minor editorial cleanup (public issues 129, 134, 146, 148).
* Add validity language for layer and extension names to
slink:VkDeviceCreateInfo matching that used for
slink:VkInstanceCreateInfo (public issue 130).
* Clean up terminology for the case when the bits set in one bitmask
are a subset of the bits set in another bitmask (public issue 138).
* Document that input attachments are UniformConstant not Input, in
the <<interfaces-inputattachment,Fragment Input Attachment
Interface>> section (public glslang bug 169).
Internal Issues:
* Add max enum values to "flag bits" enums (internal issue #136).
* Clarify language around the various uses of the term "block" in the
<<appendix-compressedtex-bc,Block Compressed Image Formats>> section
(internal issue #202).
* Removed "expand" dependency from <enums> groups in vk.xml and added
auto-generation code in the scripts to infer it instead, to ensure
consistency. This caused renaming of sname:VkColorSpaceKHR and
sname:VkPresentModeKHR etext:BEGIN_RANGE (etc.) tokens, but those
tokens are metadata, not part of the API, and the Vulkan WG is OK
with this change. This change adds ranges to two additional enums
that were missing them due to not defining the "expand" attribute
(internal issue 217).
* Tweak makefile to generate ref page nroff (.3) files in the right
output directory, working around an a2x limitation (internal issue
223).
Other Commits:
* Add validity requirements for flink:vkCmdCopyQueryPoolResults
pname:dstBuffer parameter.
* Fix ref page build to generate .3 targets in the right output
directory.
2016-03-25 09:25:04 +00:00
|
|
|
|
range of unused values offset against a global extension base value.
|
|
|
|
|
Individual enumerant values are calculated as offsets in that range. Values
|
2016-02-16 09:53:44 +00:00
|
|
|
|
are calculated as follows:
|
|
|
|
|
|
|
|
|
|
* base_value = 1000000000
|
Change log for March 25, 2016 Vulkan 1.0.7 spec update:
* Bump API patch number and header version number to 7 for this
update.
Github Issues:
* Fix slink:VkSpecializationMapEntry example to avoid C/C++ strict
aliasing issues (public issue 14).
* Clarify the meaning of "matching" in flink:vkCmdBindDescriptorSets
validity language (public issue 33).
* Add stub reference pages so xrefs to not-yet-written pages don't
generate 404 errors. However, the actual content of these pages
still needs to be filled in as time allows (public issue 44, but
does not close that issue out).
* Remove incorrect validity statement for
flink:vkGetImageSparseMemoryRequirements (public issue 85).
* Reword the
<<features-limits-bufferImageGranularity,bufferImageGranularity>>
feature in terms of "aliasing", and clarify that it applies to
bindings in the same memory object (public issue 90).
* Clarify the relationship of the slink:VkPhysicalDeviceLimits
pname:maxViewportDimensions and pname:viewportBoundsRange limits
(public issue 92).
* Specify sparse unbound texture replacement in the
<<textures-texel-replacement,Texel Replacement>> section
independently of robust buffer access language (public issue 100).
* Add the <<fundamentals-architecture-model,Architecture Model>>
section to explain architecture constraints Vulkan has chosen to
accept in order to enable portable and performant code (public issue
122).
* State that an object must not be destroyed until *all* (not *any*)
uses of that object have completed (public issue 123).
* Minor editorial cleanup (public issues 129, 134, 146, 148).
* Add validity language for layer and extension names to
slink:VkDeviceCreateInfo matching that used for
slink:VkInstanceCreateInfo (public issue 130).
* Clean up terminology for the case when the bits set in one bitmask
are a subset of the bits set in another bitmask (public issue 138).
* Document that input attachments are UniformConstant not Input, in
the <<interfaces-inputattachment,Fragment Input Attachment
Interface>> section (public glslang bug 169).
Internal Issues:
* Add max enum values to "flag bits" enums (internal issue #136).
* Clarify language around the various uses of the term "block" in the
<<appendix-compressedtex-bc,Block Compressed Image Formats>> section
(internal issue #202).
* Removed "expand" dependency from <enums> groups in vk.xml and added
auto-generation code in the scripts to infer it instead, to ensure
consistency. This caused renaming of sname:VkColorSpaceKHR and
sname:VkPresentModeKHR etext:BEGIN_RANGE (etc.) tokens, but those
tokens are metadata, not part of the API, and the Vulkan WG is OK
with this change. This change adds ranges to two additional enums
that were missing them due to not defining the "expand" attribute
(internal issue 217).
* Tweak makefile to generate ref page nroff (.3) files in the right
output directory, working around an a2x limitation (internal issue
223).
Other Commits:
* Add validity requirements for flink:vkCmdCopyQueryPoolResults
pname:dstBuffer parameter.
* Fix ref page build to generate .3 targets in the right output
directory.
2016-03-25 09:25:04 +00:00
|
|
|
|
* range_size = 1000
|
2016-02-16 09:53:44 +00:00
|
|
|
|
* enum_offset(extension_number,offset) = base_value +
|
Change log for March 25, 2016 Vulkan 1.0.7 spec update:
* Bump API patch number and header version number to 7 for this
update.
Github Issues:
* Fix slink:VkSpecializationMapEntry example to avoid C/C++ strict
aliasing issues (public issue 14).
* Clarify the meaning of "matching" in flink:vkCmdBindDescriptorSets
validity language (public issue 33).
* Add stub reference pages so xrefs to not-yet-written pages don't
generate 404 errors. However, the actual content of these pages
still needs to be filled in as time allows (public issue 44, but
does not close that issue out).
* Remove incorrect validity statement for
flink:vkGetImageSparseMemoryRequirements (public issue 85).
* Reword the
<<features-limits-bufferImageGranularity,bufferImageGranularity>>
feature in terms of "aliasing", and clarify that it applies to
bindings in the same memory object (public issue 90).
* Clarify the relationship of the slink:VkPhysicalDeviceLimits
pname:maxViewportDimensions and pname:viewportBoundsRange limits
(public issue 92).
* Specify sparse unbound texture replacement in the
<<textures-texel-replacement,Texel Replacement>> section
independently of robust buffer access language (public issue 100).
* Add the <<fundamentals-architecture-model,Architecture Model>>
section to explain architecture constraints Vulkan has chosen to
accept in order to enable portable and performant code (public issue
122).
* State that an object must not be destroyed until *all* (not *any*)
uses of that object have completed (public issue 123).
* Minor editorial cleanup (public issues 129, 134, 146, 148).
* Add validity language for layer and extension names to
slink:VkDeviceCreateInfo matching that used for
slink:VkInstanceCreateInfo (public issue 130).
* Clean up terminology for the case when the bits set in one bitmask
are a subset of the bits set in another bitmask (public issue 138).
* Document that input attachments are UniformConstant not Input, in
the <<interfaces-inputattachment,Fragment Input Attachment
Interface>> section (public glslang bug 169).
Internal Issues:
* Add max enum values to "flag bits" enums (internal issue #136).
* Clarify language around the various uses of the term "block" in the
<<appendix-compressedtex-bc,Block Compressed Image Formats>> section
(internal issue #202).
* Removed "expand" dependency from <enums> groups in vk.xml and added
auto-generation code in the scripts to infer it instead, to ensure
consistency. This caused renaming of sname:VkColorSpaceKHR and
sname:VkPresentModeKHR etext:BEGIN_RANGE (etc.) tokens, but those
tokens are metadata, not part of the API, and the Vulkan WG is OK
with this change. This change adds ranges to two additional enums
that were missing them due to not defining the "expand" attribute
(internal issue 217).
* Tweak makefile to generate ref page nroff (.3) files in the right
output directory, working around an a2x limitation (internal issue
223).
Other Commits:
* Add validity requirements for flink:vkCmdCopyQueryPoolResults
pname:dstBuffer parameter.
* Fix ref page build to generate .3 targets in the right output
directory.
2016-03-25 09:25:04 +00:00
|
|
|
|
(extension_number - 1) × range_size + offset
|
2016-02-16 09:53:44 +00:00
|
|
|
|
* Positive values: enum_offset(extension_number,offset)
|
|
|
|
|
* Negative values: -enum_offset(extension_number,offset)
|
|
|
|
|
|
|
|
|
|
The exact syntax for specifying extension enumerant values is defined in the
|
|
|
|
|
+readme.pdf+ specifying the format of +vk.xml+, and extension authors can:
|
|
|
|
|
also refer to existing extensions for examples.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== Required Extension Tokens
|
|
|
|
|
|
|
|
|
|
In addition to any tokens specific to the functionality of an extension,
|
|
|
|
|
all extensions must: define two additional tokens.
|
|
|
|
|
|
|
|
|
|
* VK_EXTNAME_SPEC_VERSION is an integer constant which is the revision of
|
|
|
|
|
the extension named +VK_extname+ (EXTNAME is all upper-case, while
|
|
|
|
|
extname is the capitalization of the actual extension name) in
|
|
|
|
|
+vulkan.h+. This value begins at 1 with the initial version of an
|
|
|
|
|
extension specification, and is incremented when significant changes
|
|
|
|
|
(bugfixes or added functionality) are made. Note that the revision of an
|
|
|
|
|
extension defined in +vulkan.h+ and the revision supported by the
|
|
|
|
|
{apiname} implementation (the pname:specVersion field of the
|
|
|
|
|
slink:VkExtensionProperties structure corresponding to the extension and
|
|
|
|
|
returned by one of the <<debug-extensions,Extension Queries>>) may:
|
|
|
|
|
differ. In such cases, only the functionality and behavior of the
|
|
|
|
|
lowest-numbered revision can: be used.
|
|
|
|
|
* VK_EXTNAME_EXTENSION_NAME is a string constant which is the name of the
|
|
|
|
|
extension.
|
|
|
|
|
|
|
|
|
|
For example, for the WSI extension +VK_KHR_surface+, at the time of writing
|
|
|
|
|
the following definitions were in effect:
|
|
|
|
|
|
|
|
|
|
[source,c]
|
|
|
|
|
---------------------------------------------------
|
|
|
|
|
#define VK_KHR_SURFACE_SPEC_VERSION 24
|
|
|
|
|
#define VK_KHR_SURFACE_EXTENSION_NAME "VK_KHR_surface"
|
|
|
|
|
---------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== Extension Objects, Enums, and Typedefs
|
|
|
|
|
|
|
|
|
|
Expanding on previous discussion, extensions can: add values to existing
|
2016-02-28 10:53:20 +00:00
|
|
|
|
enums; and can: add their own commands, enums, typedefs, etc. This is done
|
|
|
|
|
by adding to <<extensions-api-registry,+vk.xml+>>. All such additions will
|
|
|
|
|
be included in the +vulkan.h+ header supplied by Khronos.
|
2016-02-16 09:53:44 +00:00
|
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
|
.Note
|
|
|
|
|
====
|
|
|
|
|
Application developers are encouraged to be careful when using +switch+
|
|
|
|
|
statements with {apiname} API enums. This is because extensions can: add new
|
|
|
|
|
values to existing enums. The use of a +default:+ statement, within a
|
|
|
|
|
+switch+, may: avoid future compilation issues.
|
|
|
|
|
====
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[[extension-function_prototypes]]
|
|
|
|
|
== Extension Function Prototypes
|
|
|
|
|
|
|
|
|
|
Function pointer declarations and function prototypes for all core {apiname}
|
2016-02-28 10:53:20 +00:00
|
|
|
|
API commands are included in the +vulkan.h+ file. These come from the
|
2016-02-16 09:53:44 +00:00
|
|
|
|
official XML specification of the {apiname} API hosted by Khronos.
|
|
|
|
|
|
|
|
|
|
Function pointer declarations are also included in the +vulkan.h+ file for
|
2016-02-28 10:53:20 +00:00
|
|
|
|
all commands defined by registered extensions. Function prototypes for
|
|
|
|
|
extensions may: be included in +vulkan.h+. Extension commands that are part
|
|
|
|
|
of the {apiname} ABI must: be flagged in the XML. Function prototypes will
|
|
|
|
|
be included in +vulkan.h+ for all extension commands that are part of the
|
|
|
|
|
{apiname} ABI.
|
|
|
|
|
|
|
|
|
|
An extension can: be considered platform specific, in which case its
|
|
|
|
|
interfaces in +vulkan.h+ are protected by #ifdefs. This is orthogonal to
|
|
|
|
|
whether an extension command is considered to be part of the {apiname} ABI.
|
|
|
|
|
|
|
|
|
|
The initial set of WSI extension commands are considered to be part of the
|
|
|
|
|
{apiname} ABI. Function prototypes for these WSI commands are included in
|
|
|
|
|
the +vulkan.h+ provided by Khronos, though the platform-specific portions of
|
2016-02-16 09:53:44 +00:00
|
|
|
|
+vulkan.h+ are protected by #ifdefs.
|
|
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
|
.Note
|
|
|
|
|
====
|
|
|
|
|
Based on feedback from implementers, Khronos expects that the Android,
|
|
|
|
|
Linux, and Windows {apiname} SDKs will include our +vulkan.h+ and export
|
|
|
|
|
the supported WSI functions for those platforms from their loader
|
|
|
|
|
libraries. Other implementations can: make different choices for their
|
|
|
|
|
headers and loader libraries, but are encouraged to be consistent with
|
|
|
|
|
these implementations.
|
|
|
|
|
====
|
|
|
|
|
|
|
|
|
|
|
2016-02-28 10:53:20 +00:00
|
|
|
|
== Accessing Extension Functions from Programs
|
2016-02-16 09:53:44 +00:00
|
|
|
|
|
2016-02-28 10:53:20 +00:00
|
|
|
|
flink:vkGetInstanceProcAddr and flink:vkGetDeviceProcAddr can: be used in
|
|
|
|
|
order to obtain function pointer addresses for core and extension commands
|
|
|
|
|
(per the description in <<initialization-functionpointers,Command Function
|
|
|
|
|
Pointers>>). Different {apiname} API loaders can: choose to statically
|
|
|
|
|
export functions for some or all of the core {apiname} API commands, and
|
|
|
|
|
can: statically export functions for some or all extension commands. If a
|
|
|
|
|
loader statically exports a function, an application can: link against that
|
|
|
|
|
function without needing to call one of the ftext:vkGet*ProcAddr commands.
|
2016-02-16 09:53:44 +00:00
|
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
|
.Note
|
|
|
|
|
====
|
2016-02-28 10:53:20 +00:00
|
|
|
|
The Khronos-provided {apiname} API loader for Android, Linux, and Windows
|
|
|
|
|
exports functions for all core {apiname} API and WSI extension commands. The
|
|
|
|
|
WSI functions are considered special, because they are required for many
|
2016-02-16 09:53:44 +00:00
|
|
|
|
applications.
|
|
|
|
|
====
|
|
|
|
|
|
2016-02-28 10:53:20 +00:00
|
|
|
|
|
2016-02-16 09:53:44 +00:00
|
|
|
|
[[extensions-reserving-bitfield-values]]
|
|
|
|
|
=== Reserving Bitfield Values
|
|
|
|
|
|
|
|
|
|
Enumerants which define bitfield values are a special case, since there are
|
|
|
|
|
only a small number of unused bits available for extensions. For core Vulkan
|
|
|
|
|
API and KHR extension bitfield types, reservations must: be approved by a
|
|
|
|
|
vote of the Vulkan Working Group. For EXT and vendor extension bitfield
|
|
|
|
|
types, reservations must: be approved by the listed contact of the
|
|
|
|
|
extension. Bits are not reserved, and mustnot: be used in a published
|
|
|
|
|
implementation or specification until the reservation is merged into
|
|
|
|
|
<<extensions-api-registry,+vk.xml+>> by the registry maintainer.
|
|
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
|
.Note
|
|
|
|
|
====
|
|
|
|
|
In reality the approving authority for EXT and vendor extension bitfield
|
|
|
|
|
additions will probably be the owner of the github branch containing the
|
|
|
|
|
specification of that extension; however, until the github process is fully
|
|
|
|
|
defined and locked down, it's safest to refer to the listed contact.
|
|
|
|
|
====
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== Extension Interactions
|
|
|
|
|
|
|
|
|
|
Extensions modifying the behavior of existing commands should: provide
|
2016-02-27 13:28:52 +00:00
|
|
|
|
additional parameters by using the pname:pNext field of an existing
|
2016-02-16 09:53:44 +00:00
|
|
|
|
structure, pointing to a new structure defined by the extension, as
|
|
|
|
|
described in the <<fundamentals-validusage,Valid Usage>> section. Extension
|
|
|
|
|
structures defined by multiple extensions affecting the same structure can
|
|
|
|
|
be chained together in this fashion.
|
|
|
|
|
|
|
|
|
|
It is in principle possible for extensions to provide additional parameters
|
|
|
|
|
through alternate means, such as passing a handle parameter to a structure
|
|
|
|
|
with a pname:sType defined by the extension, but this approach is
|
|
|
|
|
discouraged and shouldnot: be used.
|
|
|
|
|
|
|
|
|
|
When chaining multiple extensions to a structure, the implementation will
|
|
|
|
|
process the chain starting with the base parameter and proceeding through
|
|
|
|
|
each successive chained structure in turn. Extensions should: be defined to
|
|
|
|
|
accept any order of chaining, and must: define their interactions with other
|
|
|
|
|
extensions such that the results are deterministic. If an extension needs a
|
|
|
|
|
specific ordering of its extension structure with respect to other
|
|
|
|
|
extensions in a chain to provide deterministic results, it must: define the
|
|
|
|
|
required ordering and expected behavior as part of its specification.
|