Vulkan commands are not necessarily exposed statically on a platform. Function pointers for all Vulkan commands can be obtained with the command:
PFN_vkVoidFunction vkGetInstanceProcAddr( VkInstance instance, const char* pName);
instance
is the instance that the function pointer will be
compatible with.
pName
is the name of the command to obtain.
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.
Loaders are encouraged to export function symbols for all other core
Vulkan commands as well; if this is done, then applications that use only
the core Vulkan commands have no need to use vkGetInstanceProcAddr
.
Function pointers to commands that do not operate on a specific instance can
be obtained by using this command with instance
equal to NULL
. The
following commands can be accessed this way:
The returned function pointer is of type PFN_vkVoidFunction
, and must
be cast to the type of the command being queried.
If instance
is a valid VkInstance
, function pointers to any
commands that operate on instance
or a child of instance
can be
obtained. The returned function pointer must only be called with a
dispatchable object (the first parameter) that is a child of instance
.
If pName
is not the name of a core Vulkan command, or is an
extension command for any extension not supported by any available layer or
implementation, then vkGetInstanceProcAddr
will return NULL
.
![]() | editing-note |
---|---|
(Jon, Bug 14886 / Gitlab issue 4) The WSI group tentatively agreed that the
WSI extensions were special, and should get static entry points in link
libraries and prototypes in However, this decision has not been fully signed off on by the entire Vulkan WG yet AFAIK. Note that implementations typically will not support many of the WSI extensions, so “static entry points” do not relieve apps of the neccessity of runtime enabling and testing of each extension before using it. |
In order to support systems with multiple Vulkan implementations
comprising heterogeneous collections of hardware and software, the function
pointers returned by vkGetInstanceProcAddr
may point to dispatch
code, which calls a different real implementation for different
VkDevice
objects (and objects created from them). The overhead of this
internal dispatch 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:
PFN_vkVoidFunction vkGetDeviceProcAddr( VkDevice device, const char* pName);
device
is the logical device that provides the function pointer.
pName
is the name of any Vulkan command whose first parameter
is one of
VkDevice
VkQueue
VkCommandBuffer
The returned function pointer is of type PFN_vkVoidFunction
, and must
be cast to the type of the command being queried.
If pName
is not the name of one of these Vulkan commands, and is
not the name of an extension command belonging to an extension enabled for
device
, then vkGetDeviceProcAddr
will return NULL
.
The function pointer type returned from the vkGetInstanceProcAddr
and
vkGetDeviceProcAddr
is a dummy type not corresponding to any actual
Vulkan function:
typedef void (VKAPI_PTR *PFN_vkVoidFunction)(void);