mirror of
https://github.com/status-im/Vulkan-Docs.git
synced 2025-02-02 17:43:26 +00:00
55220784e0
* Update release number to 101. Public Issues: * Make clear that memory types for imported host memory must be host visible in slink:VkMemoryHostPointerPropertiesEXT.txt (public issue 897). * Make <<interfaces-resources-layout, WARNING block>> into a NOTE block, per the styleguide (public pull request 916). Internal Issues: * Make <<textures-output-format-conversion, computation of derivatives in non-uniform flow control>> have undefined behavior (internal issue 1367). * Make behavior, not just values, undefined for <<textures-layout-validation, reads from inconsistent YCbCr layouts>> (internal issue 1366). * Consolidate version and extension behavior documentation in the <<extended-functionality, Extended Functionality>> appendix, While a great deal of text was moved from other parts of the Specification into the appendix, this just serves to simplify and make consistent discussions of versions and extensions (internal issue 1473). * Add limits for slink:VkPhysicalDeviceRayTracingPropertiesNV in the <<features-limits-types, Required Limit Types>> and <<features-limits-required, Required Limits>> tables (internal issue 1511). * Disallow <<memory-protected-memory, indirect calls within protected command buffers>> by adding valid usage statements for the related indirect dispatch and draw commands (internal issue 1513). * Add valid usage stataements to slink:VkGraphicsPipelineCreateInfo, slink:VkSubpassDescription, slink:VkSubpassDescription2KHR, slink:VkSubpassDescriptionDepthStencilResolveKHR, and slink:VkImageViewCreateInfo preventing the creation of a renderpass with attachments in formats that are not supported for rendering (internal issue 1552). * Qualify valid usage statements for slink:VkAttachmentReference::pname:layout parameter so restrictions only apply if an attachment is ename:VK_ATTACHMENT_UNUSED (internal issue 1561). * Add valid usage statement for flink:vkCmdDrawIndirectByteCountEXT restricting pname:vertexStride to be positive (internal issue 1566). * Make the `VK_EXT_sample_locations` extension depend on `VK_KHR_get_physical_device_properties2` in `vk.xml`. * Rearrange and simplify the <<interfaces-resources-layout, block layout rules>>. New Extensions: * `VK_NV_cooperative_matrix` * `VK_EXT_depth_clip_enable` (internal issue 1485).
429 lines
17 KiB
Plaintext
429 lines
17 KiB
Plaintext
// Copyright (c) 2015-2019 Khronos Group. This work is licensed under a
|
|
// Creative Commons Attribution 4.0 International License; see
|
|
// http://creativecommons.org/licenses/by/4.0/
|
|
|
|
[[initialization]]
|
|
= Initialization
|
|
|
|
Before using Vulkan, an application must: initialize it by loading the
|
|
Vulkan commands, and creating a sname:VkInstance object.
|
|
|
|
|
|
[[initialization-functionpointers]]
|
|
== Command Function Pointers
|
|
|
|
Vulkan commands are not necessarily exposed by static linking on a platform.
|
|
Commands to query function pointers for Vulkan commands are described below.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
When extensions are <<extendingvulkan-compatibility-promotion,promoted>> or
|
|
otherwise incorporated into another extension or Vulkan core version,
|
|
command <<extendingvulkan-compatibility-aliases,aliases>> may be included.
|
|
Whilst the behavior of each command alias is identical, the behavior of
|
|
retrieving each alias's function pointer is not.
|
|
A function pointer for a given alias can only be retrieved if the extension
|
|
or version that introduced that alias is supported and enabled, irrespective
|
|
of whether any other alias is available.
|
|
====
|
|
|
|
[open,refpage='vkGetInstanceProcAddr',desc='Return a function pointer for a command',type='protos',xrefs='PFN_vkVoidFunction']
|
|
--
|
|
|
|
Function pointers for all Vulkan commands can: be obtained with the command:
|
|
|
|
include::../api/protos/vkGetInstanceProcAddr.txt[]
|
|
|
|
* pname:instance is the instance that the function pointer will be
|
|
compatible with, or `NULL` for commands not dependent on any instance.
|
|
* pname:pName is the name of the command to obtain.
|
|
|
|
fname:vkGetInstanceProcAddr itself is obtained in a platform- and loader-
|
|
specific manner.
|
|
Typically, the loader library will export this command as a function symbol,
|
|
so applications can: link against the loader library, or load it dynamically
|
|
and look up the symbol using platform-specific APIs.
|
|
|
|
The table below defines the various use cases for
|
|
fname:vkGetInstanceProcAddr and expected return value ("`fp`" is "`function
|
|
pointer`") for each case.
|
|
|
|
The returned function pointer is of type tlink:PFN_vkVoidFunction, and must
|
|
be cast to the type of the command being queried.
|
|
|
|
.vkGetInstanceProcAddr behavior
|
|
[width="80%",options="header"]
|
|
|====
|
|
| pname:instance | pname:pName | return value
|
|
| * | `NULL` | undefined:
|
|
| invalid instance | * | undefined:
|
|
ifdef::VK_VERSION_1_1[]
|
|
| `NULL` | flink:vkEnumerateInstanceVersion | fp
|
|
endif::VK_VERSION_1_1[]
|
|
| `NULL` | flink:vkEnumerateInstanceExtensionProperties | fp
|
|
| `NULL` | flink:vkEnumerateInstanceLayerProperties | fp
|
|
| `NULL` | flink:vkCreateInstance | fp
|
|
| `NULL` | * (any pname:pName not covered above) | `NULL`
|
|
| instance | core Vulkan command | fp^1^
|
|
| instance | enabled instance extension commands for pname:instance | fp^1^
|
|
| instance | available device extension^2^ commands for pname:instance | fp^1^
|
|
| instance | * (any pname:pName not covered above) | `NULL`
|
|
|====
|
|
|
|
1::
|
|
The returned function pointer must: only be called with a dispatchable
|
|
object (the first parameter) that is pname:instance or a child of
|
|
pname:instance, e.g. slink:VkInstance, slink:VkPhysicalDevice,
|
|
slink:VkDevice, slink:VkQueue, or slink:VkCommandBuffer.
|
|
|
|
2::
|
|
An "`available device extension`" is a device extension supported by any
|
|
physical device enumerated by pname:instance.
|
|
|
|
include::../validity/protos/vkGetInstanceProcAddr.txt[]
|
|
--
|
|
|
|
[open,refpage='vkGetDeviceProcAddr',desc='Return a function pointer for a command',type='protos',xrefs='PFN_vkVoidFunction']
|
|
--
|
|
|
|
In order to support systems with multiple Vulkan implementations, the
|
|
function pointers returned by fname:vkGetInstanceProcAddr may: point to
|
|
dispatch code that calls a different real implementation for different
|
|
slink:VkDevice objects or their child objects.
|
|
The overhead of the internal dispatch for slink:VkDevice objects can be
|
|
avoided by obtaining device-specific function pointers for any commands that
|
|
use a device or device-child object as their dispatchable object.
|
|
Such function pointers can: be obtained with the command:
|
|
|
|
include::../api/protos/vkGetDeviceProcAddr.txt[]
|
|
|
|
The table below defines the various use cases for fname:vkGetDeviceProcAddr
|
|
and expected return value for each case.
|
|
|
|
The returned function pointer is of type tlink:PFN_vkVoidFunction, and must
|
|
be cast to the type of the command being queried.
|
|
The function pointer must: only be called with a dispatchable object (the
|
|
first parameter) that is pname:device or a child of pname:device.
|
|
|
|
.vkGetDeviceProcAddr behavior
|
|
[width="80%",options="header"]
|
|
|====
|
|
| pname:device | pname:pName | return value
|
|
| `NULL` | * | undefined:
|
|
| invalid device | * | undefined:
|
|
| device | `NULL` | undefined:
|
|
| device | core device-level Vulkan command | fp
|
|
| device | enabled device extension commands | fp
|
|
| device | * (any pname:pName not covered above) | `NULL`
|
|
|====
|
|
|
|
include::../validity/protos/vkGetDeviceProcAddr.txt[]
|
|
|
|
--
|
|
|
|
[open,refpage='PFN_vkVoidFunction',desc='Dummy function pointer type returned by queries',type='funcpointers',xrefs='vkGetDeviceProcAddr vkGetInstanceProcAddr']
|
|
--
|
|
|
|
The definition of tlink:PFN_vkVoidFunction is:
|
|
|
|
include::../api/funcpointers/PFN_vkVoidFunction.txt[]
|
|
|
|
--
|
|
|
|
|
|
ifdef::VK_VERSION_1_1[]
|
|
|
|
=== Extending Physical Device Core Functionality
|
|
|
|
New core physical-device-level functionality can: be used when the
|
|
physical-device version is greater than or equal to the version of Vulkan
|
|
that added the new functionality.
|
|
The Vulkan version supported by a physical device can: be obtained by
|
|
calling flink:vkGetPhysicalDeviceProperties.
|
|
|
|
endif::VK_VERSION_1_1[]
|
|
|
|
|
|
ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
|
|
|
|
[[initialization-phys-dev-extensions]]
|
|
=== Extending Physical Device From Device Extensions
|
|
|
|
When the `<<VK_KHR_get_physical_device_properties2>>` extension is enabled,
|
|
ifdef::VK_VERSION_1_1[]
|
|
or when both the instance and the physical-device versions are at least 1.1,
|
|
endif::VK_VERSION_1_1[]
|
|
physical-device-level functionality of a device extension can: be used with
|
|
a physical device if the corresponding extension is enumerated by
|
|
flink:vkEnumerateDeviceExtensionProperties for that physical device, even
|
|
before a logical device has been created.
|
|
|
|
To obtain a function pointer for a physical-device-level command from a
|
|
device extension, an application can: use flink:vkGetInstanceProcAddr.
|
|
This function pointer may: point to dispatch code, which calls a different
|
|
real implementation for different sname:VkPhysicalDevice objects.
|
|
Behavior is undefined: if an extension physical-device command is called on
|
|
a physical device that does not support the extension.
|
|
|
|
Device extensions may: define structures that can: be added to the
|
|
ptext:pNext chain of physical-device-level commands.
|
|
Behavior is undefined: if such an extension structure is passed to a
|
|
physical-device-level command for a physical device that does not support
|
|
the extension.
|
|
|
|
endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
|
|
|
|
|
|
[[initialization-instances]]
|
|
== Instances
|
|
|
|
[open,refpage='VkInstance',desc='Opaque handle to an instance object',type='handles']
|
|
--
|
|
|
|
There is no global state in Vulkan and all per-application state is stored
|
|
in a sname:VkInstance object.
|
|
Creating a sname:VkInstance object initializes the Vulkan library and allows
|
|
the application to pass information about itself to the implementation.
|
|
|
|
Instances are represented by sname:VkInstance handles:
|
|
|
|
include::../api/handles/VkInstance.txt[]
|
|
|
|
--
|
|
|
|
ifdef::VK_VERSION_1_1[]
|
|
[open,refpage='vkEnumerateInstanceVersion',desc='Query instance-level version before instance creation',type='protos']
|
|
--
|
|
|
|
To query the version of instance-level functionality supported by the
|
|
implementation, call:
|
|
|
|
include::../api/protos/vkEnumerateInstanceVersion.txt[]
|
|
|
|
* pname:pApiVersion points to a code:uint32_t, which is the version of
|
|
Vulkan supported by instance-level functionality, encoded as described
|
|
in <<extendingvulkan-coreversions-versionnumbers>>.
|
|
|
|
include::../validity/protos/vkEnumerateInstanceVersion.txt[]
|
|
|
|
--
|
|
endif::VK_VERSION_1_1[]
|
|
|
|
[open,refpage='vkCreateInstance',desc='Create a new Vulkan instance',type='protos']
|
|
--
|
|
|
|
To create an instance object, call:
|
|
|
|
include::../api/protos/vkCreateInstance.txt[]
|
|
|
|
* pname:pCreateInfo points to an instance of slink:VkInstanceCreateInfo
|
|
controlling creation of the instance.
|
|
* pname:pAllocator controls host memory allocation as described in the
|
|
<<memory-allocation, Memory Allocation>> chapter.
|
|
* pname:pInstance points a slink:VkInstance handle in which the resulting
|
|
instance is returned.
|
|
|
|
fname:vkCreateInstance verifies that the requested layers exist.
|
|
If not, fname:vkCreateInstance will return ename:VK_ERROR_LAYER_NOT_PRESENT.
|
|
Next fname:vkCreateInstance verifies that the requested extensions are
|
|
supported (e.g. in the implementation or in any enabled instance layer) and
|
|
if any requested extension is not supported, fname:vkCreateInstance must:
|
|
return ename:VK_ERROR_EXTENSION_NOT_PRESENT.
|
|
After verifying and enabling the instance layers and extensions the
|
|
sname:VkInstance object is created and returned to the application.
|
|
If a requested extension is only supported by a layer, both the layer and
|
|
the extension need to be specified at fname:vkCreateInstance time for the
|
|
creation to succeed.
|
|
|
|
.Valid Usage
|
|
****
|
|
* [[VUID-vkCreateInstance-ppEnabledExtensionNames-01388]]
|
|
All <<extendingvulkan-extensions-extensiondependencies, required
|
|
extensions>> for each extension in the
|
|
slink:VkInstanceCreateInfo::pname:ppEnabledExtensionNames list must:
|
|
also be present in that list.
|
|
****
|
|
|
|
include::../validity/protos/vkCreateInstance.txt[]
|
|
--
|
|
|
|
[open,refpage='VkInstanceCreateInfo',desc='Structure specifying parameters of a newly created instance',type='structs']
|
|
--
|
|
|
|
The sname:VkInstanceCreateInfo structure is defined as:
|
|
|
|
include::../api/structs/VkInstanceCreateInfo.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:flags is reserved for future use.
|
|
* pname:pApplicationInfo is `NULL` or a pointer to an instance of
|
|
sname:VkApplicationInfo.
|
|
If not `NULL`, this information helps implementations recognize behavior
|
|
inherent to classes of applications.
|
|
slink:VkApplicationInfo is defined in detail below.
|
|
* pname:enabledLayerCount is the number of global layers to enable.
|
|
* pname:ppEnabledLayerNames is a pointer to an array of
|
|
pname:enabledLayerCount null-terminated UTF-8 strings containing the
|
|
names of layers to enable for the created instance.
|
|
See the <<extendingvulkan-layers>> section for further details.
|
|
* pname:enabledExtensionCount is the number of global extensions to
|
|
enable.
|
|
* pname:ppEnabledExtensionNames is a pointer to an array of
|
|
pname:enabledExtensionCount null-terminated UTF-8 strings containing the
|
|
names of extensions to enable.
|
|
|
|
include::../validity/structs/VkInstanceCreateInfo.txt[]
|
|
--
|
|
|
|
[open,refpage='VkInstanceCreateFlags',desc='Reserved for future use',type='flags']
|
|
--
|
|
include::../api/flags/VkInstanceCreateFlags.txt[]
|
|
|
|
tname:VkInstanceCreateFlags is a bitmask type for setting a mask, but is
|
|
currently reserved for future use.
|
|
--
|
|
|
|
ifdef::VK_EXT_validation_flags[]
|
|
include::VK_EXT_validation_flags.txt[]
|
|
endif::VK_EXT_validation_flags[]
|
|
|
|
ifdef::VK_EXT_validation_features[]
|
|
include::VK_EXT_validation_features.txt[]
|
|
endif::VK_EXT_validation_features[]
|
|
|
|
|
|
[open,refpage='VkApplicationInfo',desc='Structure specifying application info',type='structs']
|
|
--
|
|
|
|
The sname:VkApplicationInfo structure is defined as:
|
|
|
|
include::../api/structs/VkApplicationInfo.txt[]
|
|
|
|
* pname:sType is the type of this structure.
|
|
* pname:pNext is `NULL` or a pointer to an extension-specific structure.
|
|
* pname:pApplicationName is `NULL` or is a pointer to a null-terminated
|
|
UTF-8 string containing the name of the application.
|
|
* pname:applicationVersion is an unsigned integer variable containing the
|
|
developer-supplied version number of the application.
|
|
* pname:pEngineName is `NULL` or is a pointer to a null-terminated UTF-8
|
|
string containing the name of the engine (if any) used to create the
|
|
application.
|
|
* pname:engineVersion is an unsigned integer variable containing the
|
|
developer-supplied version number of the engine used to create the
|
|
application.
|
|
ifndef::VK_VERSION_1_1[]
|
|
* pname:apiVersion is the version of the Vulkan API against which the
|
|
application expects to run, encoded as described in
|
|
<<extendingvulkan-coreversions-versionnumbers>>.
|
|
If pname:apiVersion is 0 the implementation must: ignore it, otherwise
|
|
if the implementation does not support the requested pname:apiVersion,
|
|
or an effective substitute for pname:apiVersion, it must: return
|
|
ename:VK_ERROR_INCOMPATIBLE_DRIVER.
|
|
endif::VK_VERSION_1_1[]
|
|
ifdef::VK_VERSION_1_1[]
|
|
* pname:apiVersion must: be the highest version of Vulkan that the
|
|
application is designed to use, encoded as described in
|
|
<<extendingvulkan-coreversions-versionnumbers>>.
|
|
endif::VK_VERSION_1_1[]
|
|
The patch version number specified in pname:apiVersion is ignored when
|
|
creating an instance object.
|
|
Only the major and minor versions of the instance must: match those
|
|
requested in pname:apiVersion.
|
|
|
|
ifdef::VK_VERSION_1_1[]
|
|
Vulkan 1.0 implementations were required to return
|
|
ename:VK_ERROR_INCOMPATIBLE_DRIVER if pname:apiVersion was larger than 1.0.
|
|
Implementations that support Vulkan 1.1 or later must: not return
|
|
ename:VK_ERROR_INCOMPATIBLE_DRIVER for any value of pname:apiVersion.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
Because Vulkan 1.0 implementations may: fail with
|
|
ename:VK_ERROR_INCOMPATIBLE_DRIVER, applications should: determine the
|
|
version of Vulkan available before calling flink:vkCreateInstance.
|
|
If the flink:vkGetInstanceProcAddr returns `NULL` for
|
|
flink:vkEnumerateInstanceVersion, it is a Vulkan 1.0 implementation.
|
|
Otherwise, the application can: call flink:vkEnumerateInstanceVersion to
|
|
determine the version of Vulkan.
|
|
====
|
|
|
|
ifdef::VK_VERSION_1_1[]
|
|
As long as the instance supports at least Vulkan 1.1, an application can:
|
|
use different versions of Vulkan with an instance than it does with a device
|
|
or physical device.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
|
|
The Khronos validation layers will treat pname:apiVersion as the highest API
|
|
version the application targets, and will validate API usage against the
|
|
minimum of that version and the implementation version (instance or device,
|
|
depending on context).
|
|
If an application tries to use functionality from a greater version than
|
|
this, a validation error will be triggered.
|
|
|
|
For example, if the instance supports Vulkan 1.1 and three physical devices
|
|
support Vulkan 1.0, Vulkan 1.1, and a hypothetical Vulkan 1.2, respectively,
|
|
and if the application sets pname:apiVersion to 1.2, the application can:
|
|
use the following versions of Vulkan:
|
|
|
|
* Vulkan 1.0 can: be used with the instance and with all physical devices.
|
|
* Vulkan 1.1 can: be used with the instance and with the physical devices
|
|
that support Vulkan 1.1 and Vulkan 1.2.
|
|
* Vulkan 1.2 can: be used with the physical device that supports Vulkan
|
|
1.2.
|
|
|
|
If we modify the above example so that the application sets pname:apiVersion
|
|
to 1.1, then the application must: not use Vulkan 1.2 functionality on the
|
|
physical device that supports Vulkan 1.2.
|
|
====
|
|
endif::VK_VERSION_1_1[]
|
|
|
|
Implicit layers must: be disabled if they do not support a version at least
|
|
as high as pname:apiVersion.
|
|
See the <<LoaderAndLayerInterface, Vulkan Loader Specification and
|
|
Architecture Overview>> document for additional information.
|
|
|
|
[NOTE]
|
|
.Note
|
|
====
|
|
Providing a `NULL` sname:VkInstanceCreateInfo::pname:pApplicationInfo or
|
|
providing an pname:apiVersion of 0 is equivalent to providing an
|
|
pname:apiVersion of `VK_MAKE_VERSION(1,0,0)`.
|
|
====
|
|
endif::VK_VERSION_1_1[]
|
|
|
|
include::../validity/structs/VkApplicationInfo.txt[]
|
|
--
|
|
|
|
[open,refpage='vkDestroyInstance',desc='Destroy an instance of Vulkan',type='protos']
|
|
--
|
|
|
|
To destroy an instance, call:
|
|
|
|
include::../api/protos/vkDestroyInstance.txt[]
|
|
|
|
* pname:instance is the handle of the instance to destroy.
|
|
* pname:pAllocator controls host memory allocation as described in the
|
|
<<memory-allocation, Memory Allocation>> chapter.
|
|
|
|
.Valid Usage
|
|
****
|
|
* [[VUID-vkDestroyInstance-instance-00629]]
|
|
All child objects created using pname:instance must: have been destroyed
|
|
prior to destroying pname:instance
|
|
* [[VUID-vkDestroyInstance-instance-00630]]
|
|
If sname:VkAllocationCallbacks were provided when pname:instance was
|
|
created, a compatible set of callbacks must: be provided here
|
|
* [[VUID-vkDestroyInstance-instance-00631]]
|
|
If no sname:VkAllocationCallbacks were provided when pname:instance was
|
|
created, pname:pAllocator must: be `NULL`
|
|
****
|
|
|
|
include::../validity/protos/vkDestroyInstance.txt[]
|
|
--
|