Vulkan® A Specification::Chapter 3::Initialization(初始化)

vulkan标准文档 vulkan的标准文档,官方需要下载,方便大家下载。是学习vulkan的工具书和好资料。 立即下载

原文链接:https://vulkan.lunarg.com/doc/view/1.2.135.0/windows/chunked_spec/chap3.html#initialization

更新记录:

2020/4/22 增加 3 初始化、增加 3.1 函数指针、增加 3.2 实例(未完)、增加(额外章节) 3.2.1 Vulkan版本

2020/4/22 补上3.1.1扩展物理设备核心功能,补上3.1.2 通过设备扩展扩展物理设备

2020/4/22 增加3.2实例(到VkValidationFlagsEXT小段之前(包括VkValidationFlagsEXT)翻译完成,接下来是VkValidationFeaturesEXT)

2020/4/23 第3章初始化 翻译完成

ლ(´ڡ`ლ) (*≧m≦*) (*・ω・) ヾ(。・ω・。) (=゚ω゚)ノ (○’ω’○) (´?ω?`) (。-`ω´-) (。⌒∇⌒)。

至此Vulkan官方文档第三章翻译完成,请大家如果发现问题及时留言。谢谢!

ლ(´ڡ`ლ) (*≧m≦*) (*・ω・) ヾ(。・ω・。) (=゚ω゚)ノ (○’ω’○) (´?ω?`) (。-`ω´-) (。⌒∇⌒)。

 

3 初始化


在使用Vulkan之前,必须创建一个VkInstance对象用于初始化Vulkan和加载Vulkan函数。

 

3.1函数指针


Vulkan的函数并不一定是通过静态链接暴露出来的,有时通过调用Vulkan提供的查询函数来获取Vulkan函数指针(特别是获取某些扩展提供的扩展函数)。

注::

某些扩展在未来的Vulkan中可能会从扩展标准荣升到核心标准中,或是被合并到其他扩展中。这时这些扩展中的函数一般都会有一个别名函数(可理解成typedef)。调用函数和调用其别名函数结果是一样的,但是获取每一个别名函数的行为是不一样的。在获取之前需要查看是否支持该扩展,并且查看该扩展是否支持该别名函数。

 

可通过调用vkGetInstanceProcAddr函数来获取Vulkan中的所有函数指针。

PFN_vkVoidFunction定义如下

typedef void (VKAPI_PTR *PFN_vkVoidFunction)(void);
PFN_vkVoidFunction vkGetInstanceProcAddr(
    VkInstance   instance,
    const char*  pName
);
  • instance::当前获取的函数指针所属的Vulkan实例(VkInstance)对象,如果为NULL说明要查询的目标函数指针不依赖于任何Vulkan实例。
  • pName::要查询的目标函数名,必须以\0结束的UTF-8字符串。

vkGetInstanceProcAddr该函数本身是通过特定的平台和加载器(loader)获得的。一般加载库会导出函数符号,所以应用可通过链接加载器或者动态加载或者使用平台特定的加载函数来获得函数。

下表说明使用vkGetInstanceProcAddr的各种使用情况并且说明返回值。

vkGetInstanceProcAddr返回的函数指针类型是PFN_vkVoidFunction类型,查询的目标函数获取之后需要强制转换成目标函数类型。

Instance参数

pName参数

返回值

*(意味着任何可用值,包括所有效值、无效值、NULL)

 

NULL(nullptr)

未定义

非空有效实例句柄

*

未定义

NULL(VK_NULL_HANDLE)

vkEnumerateInstanceVersion

目标函数指针

NULL(VK_NULL_HANDLE)

vkEnumerateInstanceExtensionProperties

目标函数指针

NULL(VK_NULL_HANDLE)

vkEnumerateInstanceLayerProperties

目标函数指针

NULL(VK_NULL_HANDLE)

vkCreateInstance

目标函数指针

非空有效实例句柄

Vulkan核心函数名称

目标函数指针(该目标函数的第一个参数必须是可调度对象instance或者instance的子对象,比如

VkPhysicalDevice、VkDevice、VkQueue等)

非空有效实例句柄

当前实例支持的扩展函数

目标函数指针(该目标函数的第一个参数必须是可调度对象instance或者instance的子对象,比如

VkPhysicalDevice、VkDevice、VkQueue等)

非空有效实例句柄

当前设备支持的扩展函数

目标函数指针(该目标函数的第一个参数必须是可调度对象instance或者instance的子对象,比如

VkPhysicalDevice、VkDevice、VkQueue等)

其他上面没有提到的情况

NULL(nullptr)

有效参数(隐示)


  • 如果instance不是NULL,则其必须是有效的VkInstance句柄
  • pName必须是以\0结尾的UTF-8字符串

为支持系统中对于多个不同版本的Vulkan实现,通过调用vkGetInstanceProAddr函数获取的函数指针可能会针对不同的VkDevice对象和子对象调用进行不同的调度。可通过vkGetDeviceProcAddr获取设备专属的函数指针来避免任何调用VkDevice对象函数的内部开销。

PFN_vkVoidFunction vkGetDeviceProcAddr(
    VkDevice        device,
    const char*     pName
);

       下面的表格显示了vkGetDeviceProcAddr函数的各种使用情况和返回值。返回值类型为PFN_vkVoidFunction,并且获取目标函数指针后必须转换成目标函数的类型,返回的函数指针的第一个参数必须是一个device句柄对象或者device的子对象。

Instance参数

pName参数

返回值

NULL

*(意味着任何可用值,包括所有效值、无效值、NULL)

 

未定义

无效设备句柄

*

未定义

有效设备句柄

NULL

未定义

有效设备句柄

核心设备层的Vulkan函数

目标函数指针(该目标函数的第一个参数必须是可调度对象device或者device的子对象,比如

VkDevice、VkQueue、VkCommandBuffer等)

有效设备句柄

支持的设备层扩展函数

目标函数指针(该目标函数的第一个参数必须是可调度对象device或者device的子对象,比如

VkDevice、VkQueue、VkCommandBuffer等)

其他上面没有提到的情况

NULL(nullptr)

有效参数(隐示)


  • device必须是有效VkDevice句柄
  • pName必须是以\0结尾的UTF-8字符串

 

3.1.1 扩展物理设备核心功能


       当物理支持的Vulkan设备版本大于等于当前已经增加了新功能的Vulkan版本时 物理设备的新核心功能就可以被使用。物理设备支持的Vulkan版本可通过调用vkGetPhysicalDeviceProperties函数获取。

 

3.1.2 通过设备扩展扩展物理设备


       当支持VK_KHR_get_physical_device_properties2扩展,或者Vulkan实例和物理设备支持的版本都高于或等于1.1时,物理设备级别的扩展功能可通过激活设备扩展获得。在创建逻辑设备(VkDevice)之前可通过调用vkEnumerateDeviceExtensionProperties函数获取支持的扩展。

       可以通过调用vkGetInstanceProcAddr函数获取物理设备级别的设备扩展提供的扩展函数。对于调用获得的函数指针可能对于不同的设备实现各不相同。应用一定不能将该物理设备不支持的扩展或者不支持的版本在该物理设备上激活。

       一些设备扩展会提供额外的结构体,一般可将这些额外的结构体数据传入pNext参数中。

 

3.2实例


       Vulkan中没有全局状态这一概念,对于每一个应用而言,其所有的状态都存储在一个VkInstance句柄对象中。创建一个VkInstance对象的同时会初始化Vulkan库并且允许应用调用Vulkan函数。

       Vulkan实例通过VkInstance句柄来定义:

VK_DEFINE_HANDLE(VkInstance)

       查询实例级别版本(Vulkan版本),可通过调用vkEnumerateInstanceVersion函数获取。

VkResult vkEnumerateInstanceVersion(
    uint32_t*    pApiVersion
);

 

返回值


成功

  • VK_SUCCESS

有效参数(隐示)


  • pApiVersion必须是一个有效uint32_t类型指针

pApiVersion是一个uint32_t类型的指针,代表支持的Vulkan版本。

 

3.2.1 Vulkan版本(插入章节,原文档无此章节)


       Vulkan目前算是一套新的API,还有待扩展更多高级的使用扩展。有些扩展模块会随着版本的升高会转成核心模块。所以在初始化Vulkan是需要指定支持的版本。

       Vulkan的版本分为3个部分

  • 主版本(major version),用于整个规范的版本
  • 副版本(minor version),用于新功能纳入了核心层
  • 补丁版本(patch version),用于调试、修改和改进用法

Vulkan中一个完整版本号由一个uint32_t类型表示。uint32_t的32表示该无符号整数由32位二进制位组成。uint32_t版本号组成如下:

  • 主版本,定义在31-22位上,最大可表示主版本号为1023。
  • 副版本,定义在21-12位上,最大可表示副版本号为1023。
  • 补丁版本,定义在11-0位上,最大可表示补丁号为4095。

Vulkan中可通过调用VK_VERSION_MAJOR获取版本号中的主版本号

#define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22)

Vulkan中可通过调用VK_VERSION_MINOR获取版本号中的副版本号

#define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff)

Vulkan中可通过调用VK_VERSION_PATCH获取版本号中的补丁版本号

#define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff)

 Vulkan中可通过调用VK_MAKE_VERSION并指定主版本号(major)和副版本号(minor)和补丁号(patch)创建uint32_t类型的Vulkan版本号。      

 #define VK_MAKE_VERSION(major, minor, patch) \
    (((major) << 22) | ((minor) << 12) | (patch))

目前Vulkan中已经预定义了一部分版本号

VK_API_VERSION_1_0代表Vulkan 1.0.0版本

#define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0)

VK_API_VERSION_1_1代表Vulkan 1.1.0版本

 #define VK_API_VERSION_1_1 VK_MAKE_VERSION(1, 1, 0)

VK_API_VERSION_1_2代表Vulkan 1.2.0版本

#define VK_API_VERSION_1_2 VK_MAKE_VERSION(1, 2, 0)

 

3.2实例(继续~)


       创建一个实例对象需要调用vkCreateInstance函数

VkResult vkCreateInstance(
    const VkInstanceCreateInfo*    pCreateInfo,
    const VkAllocationCallbacks*    pAllocator,
    VkInstance*    pInstance
);
  • pCreateInfo:: VkInstanceCreateInfo类型指针,包括创建Vulkan实例所需要的信息。
  • pAllocator::如果不为空(nullptr),则必须传入一个有效的自定义内存分配器。空表示使用默认分配器
  • pInstance::VkInstance类型指针,将会作为创建结果返回。

当运行vkCreateInstance函数时,Vulkan会去检查pCreateInfo中指定要被激活的层(layer)在当前Vulkan中是否支持,如果存在不支持的层vkCreateInstance将会返回VK_ERROR_LAYER_NOT_PRESENT错误码。之后会检查pCreateInfo中指定的要被激活的扩展(extension),如果存在不支持的扩展的话会返回VK_ERROR_EXTENSION_NOT_PRESENT错误码。当检查完毕后VkInstance对象将会被创建并赋到pInstance中。如果某个要被激活的扩展只有特定层(layer)支持的话,该层也需要激活。

 

返回值


成功

  • VK_SUCCESS

失败

  • VK_ERROR_OUT_OF_HOST_MEMORY
  • VK_ERROR_OUT_OF_DEVICE_MEMORY
  • VK_ERROR_INITIALIZATION_FAILED
  • VK_ERROR_LAYER_NOT_PRESENT
  • VK_ERROR_EXTENSION_NOT_PRESENT
  • VK_ERROR_INCOMPATIBLE_DRIVER

 

有效参数(隐示)


  • pCreateInfo必须是有效VkInstanceCreateInfo结构体指针
  • 如果pAllocator不是空,则其必须是有效VkAllocationCallbacks结构体指针。
  • pInstance必须是有效VkInstance类型指针

有效参数


  • 所有需要被激活的扩展,必须是当前Vulkan支持的扩展

 

VkInstanceCreateInfo结构体定义如下:

typedef struct VkInstanceCreateInfo {
    VkStructureType             sType;
    const void*                 pNext;
    VkInstanceCreateFlags       flags;
    const VkApplicationInfo*    pApplicationInfo;
    uint32_t                    enabledLayerCount;
    const char* const*          ppEnabledLayerNames;
    uint32_t                    enabledExtensionCount;
    const char* const*          ppEnabledExtensionNames;
} VkInstanceCreateInfo;
  • sType::当前结构体类型,必须为VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO
  • pNext::空(nullptr)或者为扩展提供的结构
  • flags::为未来预留接口,当前为0
  • pApplicationInfo::空(nullptr)或者指定VkApplicationInfo结构体指针。如果不是空可以帮助Vulkan更好的组织应用程序固有行为。
  • enabledLayerCount::要激活的层数
  • ppEnabledLayerNames::要激活的层名称数组。各名称必须为\0结束的UTF-8字符串。Vulkan对于层的加载顺序是按照该参数指定的数组顺序依次加载的。越在前面的层越接近应用,越往后越接近驱动。具体请看Layer章节(目前还没翻译)
  • enabledExtensionCount::要激活的扩展数

有效值(隐示)


  • sType必须是VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO
  • pNext中的任何结构体(都只能有一个,不能有重复类型)要么是空,要么是如下结构体指针链
  1. VkDebugReportCallbackCreateInfoEXT
  2. VkDebugUtilsMessengerCreateInfoEXT
  3. VkValidationFeaturesEXT
  4. VkValidationFlagsEXT
  • pNext链中的所有结构体的sType必须唯一,不能重复。
  • flag必须是0
  • 如果pApplicationInfo不为空的话,必须为有效VkApplicationInfo结构体指针。
  • 如果enabledLayerCount不为0的话,ppEnabledLayerNames中的各名称必须为\0结束的UTF-8字符串。
  • 如果enabledExtensionCount不为0的话,ppEnabledExtensionNames中的各名称必须为\0结束的UTF-8字符串。

 

当创建Vulkan实例时,可能有时想要关闭某些检查验证。这是可以通过在VkInstanceCreateInfo机构中的pNext中添加一个VkValidationFlagsEXT结构体用于指定要关闭的检查。

typedef struct VkValidationFlagsEXT {
    VkStructureType                sType;
    const void*                    pNext;
    uint32_t                       disabledValidationCheckCount;
    const VkValidationCheckEXT*    pDisabledValidationChecks;
} VkValidationFlagsEXT;
  • sType::用于表示当前结构体类型,必须是VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT
  • pNext::空或者是某些特定扩展提供的扩展结构体.
  • disabledValidationCheckCount::要关闭的检查个数

有效值(隐示)


  • sType必须是VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT
  • pDisabledValidationChecks必须为长度为disabledValidationCheckCount存储VkValidationCheckEXT枚举值的数组指针
  • disabledValidationCheckCount必须大于0

VkValidationFlagsEXT的定义如下:

typedef enum VkValidationCheckEXT {
    VK_VALIDATION_CHECK_ALL_EXT = 0,
    VK_VALIDATION_CHECK_SHADERS_EXT = 1,
    VK_VALIDATION_CHECK_MAX_ENUM_EXT = 0x7FFFFFFF
} VkValidationCheckEXT;
  • VK_VALIDATION_CHECK_ALL_EXT::关闭所有的验证检查
  • VK_VALIDATION_CHECK_SHADERS_EXT::关闭着色器验证

 

     当创建Vulkan实例时可以通过将VkValidationFeaturesEXT结构体数据加入VkInstanceCreateInfo结构体中的pNext来开启或关闭某些特性(Vaalidation feature)

typedef struct VkValidationFeaturesEXT {
    VkStructureType                         sType;
    const void*                             pNext;
    uint32_t                                enabledValidationFeatureCount;
    const VkValidationFeatureEnableEXT*     pEnabledValidationFeatures;
    uint32_t                                disabledValidationFeatureCount;
    const VkValidationFeatureDisableEXT*    pDisabledValidationFeatures;
} VkValidationFeaturesEXT;
  • sType::当前结构体类型,必须是VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT
  • pNext::空或者是扩展结构体
  • enabledValidationFeatureCount::要开启的特性数量
  • pEnabledValidationFeatures::指向VkValidationFeatureEnableEXT类型数组,表示要开启的特性数组
  • disabledValidationFeatureCount:: 要关闭的特性数量
  • pDisabledValidationFeatures:: 指向VkValidationFeatureDisableEXT类型数组,表示要关闭的特性数组

有效参数(隐示)


  • sType必须是VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT
  • 如果enabledValidationFeatureCount不是0,pEnabledValidationFeatures必须指向一个有效的VkValidationFeatureEnableEXT类型数组
  • 如果disabledValidationFeatureCount不是0,pDisabledValidationFeatures必须指向一个有效的VkValidationFeatureDisableEXT类型数组

VkValidationFeatureEnableEXT定义如下:

typedef enum VkValidationFeatureEnableEXT {
    VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT = 0,
    VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT = 1,
    VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT = 2,
    VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT = 3,
    VK_VALIDATION_FEATURE_ENABLE_MAX_ENUM_EXT = 0x7FFFFFFF
} VkValidationFeatureEnableEXT;
  • VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT::表示开启GPU辅助验证(GPU-assisted validation),当开启后着色器会生成额外的验证信息。该特性默认关闭。
  • VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT::表示验证层(validaton layers)会保留一个自己使用的描述符集(descriptor set,描述符集为外部与shader内部之间的数据桥梁)。VkPhysicalDeviceLimits::maxBoundDescriptorSets的值要比设备报告的值小1(表示不包括该特性的描述符集)。如果设备支持绑定一个描述符集,验证层不会进行GPU辅助验证。该特性默认关闭。在开启该特性时GPU辅助特性也需要开启。
  • VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT::表示开启Vulkan最佳实践验证(Vulkan best-practices validation)。开启后将会输出常见API滥用警告信息。该特性默认关闭。
  • VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT::表示该层将会处理着色器中的debugPrintfEXT操作和将结果发送到调试回调中。该特性默认关闭。当VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT特性被开启的情况下,禁止开启VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT特性。

 

      

VkValidationFeatureDisableEXT定义如下:

typedef enum VkValidationFeatureDisableEXT {
    VK_VALIDATION_FEATURE_DISABLE_ALL_EXT = 0,
    VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT = 1,
    VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT = 2,
    VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT = 3,
    VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT = 4,
    VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT = 5,
    VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT = 6,
    VK_VALIDATION_FEATURE_DISABLE_MAX_ENUM_EXT = 0x7FFFFFFF
} VkValidationFeatureDisableEXT;
  • VK_VALIDATION_FEATURE_DISABLE_ALL_EXT::关闭所有验证检查
  • VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT::表示关闭着色器验证,该特性默认开启。
  • VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT::表示关闭线程安全验证,该特性默认开启。
  • VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT::表示关闭无效参数验证,该特性默认开启
  • VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT::表示关闭对象生命周期验证,该特性默认开启。
  • VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT::表示关闭核心验证,该特性默认开启。当该特性关闭时,着色器验证和GPU辅助验证特性也将关闭。
  • VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT::表示关闭保护并防止重复可派遣对象句柄特性,该特性默认开启。

 

注::

       1.关闭类似于参数验证和对象生命验证后可能会导致其他验证层的错误或者崩溃。某些验证层的验证是已经假设输入是正确有效的了,并不会总是重新验证。

       2.VK_EXT_validation_features扩展中包括VK_EXT_validation_flags扩展的所有功能。

 

VkApplicationInfo结构体的定义如下:

typedef struct VkApplicationInfo {
    VkStructureType    sType;
    const void*        pNext;
    const char*        pApplicationName;
    uint32_t           applicationVersion;
    const char*        pEngineName;
    uint32_t           engineVersion;
    uint32_t           apiVersion;
} VkApplicationInfo;
  • sType::表示当前结构体类型,必须为VK_STRUCTURE_TYPE_APPLICATION_INFO
  • pNext::空或者为扩展结构体链
  • pApplicationName::空或者是以\0结束的UTF-8字符串,表示该应用的名称。
  • applicationVersion::表示自定义的应用开发版本
  • pEngineName:: 空或者是以\0结束的UTF-8字符串,表示创建应用的引擎名称。
  • engineVersion:: 表示自定义的引擎开发版本
  • apiVersion::表示该应用要使用的Vulkan版本。该版本必须是应用预计使用的Vulkan最高版本。创建实例时该版本参数中补丁号将会忽略,只有主版本号和副版本号起作用。

 

     如果系统支持的Vulkan版本为1.0的话,当apiVersion中指定的版本号高于1.0的话,将会返回VK_ERROR_INCOMPATIBLE_DRIVER错误码。当系统支持Vulkan的版本为1.1或高于1.1时,无论apiVersion中的值是多少都不会返回VK_ERROR_INCOMPATIBLE_DRIVER错误码。

 

注::

       1.因为在创建Vulkan实例时Vulkan 1.0的版本可能会返回VK_ERROR_INCOMPATIBLE_DRIVER错误码,所以在创建实例之前最好查询一下当前支持的Vulkan版本。可通过调用vkGetInstanceProcAddr函数查询vkEnumerateInstanceVersion函数指针,如果返回为空说明当前Vulkan版本为1.0,如果不为空则可以放心调用vkEnumerateInstanceVersion来获取Vulkan的版本了。(该方法也是Vulkan官方推荐的方法,在官方示例中有专门该方法的源码,正常的话源码位于Vulkan_SDK_Path\Samples\API-Samples\16-vulkan_1_1中)。

 

只要Vulkan的版本大于等于1.1,应用就可以使用与设备或物理设备中的所支持的Vulkan版本不一样的版本。物理设备支持的Vulkan版本可通过调用

vkGetPhysicalDeviceProperties函数附上VkPhysicalDeviceProperties结构体获取,位于VkPhysicalDeviceProperties中apiVersion属性中。

 

注::

      1. Khronos(Vulkan)的验证层将会把apiVersion版本作为应用的最高目标版本对待,并使用最低版本来验证API,如果应用尝试使用高于apiVersion版本的功能的话,就会触发一个验证错误。

       例如,如果系统支持的Vulkan 1.1版本,此时有三个物理设备分别支持Vulkan 1.0,

Vulkan 1.1,Vulkan 1.2的话。如果此时创建Vulkan实例时指定的(apiVersion)是Vulkan 1.2版本的话,应用可以进行如下使用:

  • Vulkan 1.0的功能可以被实例和所有物理设备使用
  • Vulkan 1.1的功能可以被实例和支持Vulkan 1.1和Vulkan 1.2版本的物理设备使用。
  • Vulkan 1.2的功能能被支持Vulkan 1.2版本的物理设备支持。

如果现在我们创建Vulkan实例的版本(apiVersion)指定成Vulkan 1.1版本的话,这时就变成应用禁止使用支持Vulkan 1.2的物理设备上的Vulkan 1.2的功能了。

 

如果隐示层不支持该版本的话必须将其关闭。

 

       注::

       1.如果在创建Vulkan实例时VkInstanceCreateInfo::pApplicationInfo为空或者apiVersion为0的话,这相当于指定apiVersion为VK_MAKE_VERSION(1,0,0) (Vulkan 1.0)实现同等价的。

 

有效参数(隐示)


  • sType必须是VK_STRUCTURE_TYPE_APPLICATION_INFO
  • pNext必须为空(NULL)
  • 如果pApplicationName不为空,pApplicationName必须是以\0结尾的UTF-8字符串
  • 如果pEngineName不为空,pEngineName必须是以\0结尾的UTF-8字符串

 

通过调用vkDestroyInstance函数销毁一个Vulkan实例

void vkDestroyInstance(
    VkInstance                                  instance,
    const VkAllocationCallbacks*                pAllocator
);
  • Instance::是要销毁的实例句柄
  • pAllocator::控制内存分配,将会在Memory Allocation章节讲解(目前未翻译,第10章内容),如果使用的是Vulkan默认分配器,该参数为空(nullptr)。

 

有效参数(隐示)


  • 如果instance不为空,则instance必须是有效句柄
  • 如果pAllocator不为空,则pAllocator必须指向一个有效的VkAllocationCallbacks结构体。

有效参数


  • 通过instance所创建的所有子对象都销毁之后再销毁instance句柄
  • 如果在创建instance时提供了自定义的VkAllocationCallbacks的话,这里必须提供与之兼容的回调
  • 如果在创建instance时没有提供VkAllocationCallbacks(就是使用Vulkan默认的分配器),pAllocator必须为空(nullptr)。

同步

  1. 本地访问instance必须进行同步处理

 

(๑>ڡ<)☆ 本章完 ヾ(*´▽‘*)ノ

【nnUNetv2进阶】三、nnUNetv2 自定义网络-发paper必会 对于很多朋友来说,找到nnunet的网络结构位置的代码可能比较困难,因为nnunet的网络结构从else:代码中没有网络结构的类名,那么使用的网络是哪个呢?打开预处理后的数据集中的nnUNetPlans.json文件,如下图,configurations里面有2d、3d_fullres等,这些表示nnunet的模型,下面的network_class_name指的就是训练使用的模型结构,一般都是PlainConvUNet。 阅读详情

相关推荐

Hi3516CV610 YOLOv8模型转换与部署实战:从源码到板端推理全流程解析

本文详细解析了Hi3516CV610开发板上YOLOv8模型的转换与部署全流程,包括模型转换、量化、编译和部署等关键步骤。通过实战案例和避坑指南,帮助开发者高效实现从PyTorch模型到嵌入式设备的推理优化,适用于智能门禁、视频分析等实时场景。

weixin_30790841的博客 654

Vulkan® - A Specification::Vulkan官方文档翻译计划

首先在这里表示抱歉,对于《Vulkan Programming Guide》Vulkan编程指南的翻译的工作更新太慢,这本书我已经看完了(看了好几遍了),《LearingVulkan》这本我也看完了。由于工作等原因不能时时更新,我表示非常抱歉。 虽然《Vulkan Programming Guide》和《LearingVulkan》都看完了,首先我强烈推荐阅读《Vulkan Programm...

AvatarForTest的博客 1018

Frida实战:高效dump Android内存中的so文件与修复技巧

本文详细介绍了使用Frida工具dump Android内存中已解密so文件的实战技巧。针对加固应用静态分析失效的痛点,文章提供了从环境搭建、使用frida_dump脚本自动化抓取内存数据,到利用SoFixer工具修复ELF文件结构的完整流程,帮助逆向分析人员高效获取可分析的so文件。

tt34567的博客 528

初识Vulkun(2):VkInstance创建和认识扩展

VkInstance的初始化和如何查询支持的扩展和层

weixin_44200074的博客 1130

程序化广告行业(2/89):从程序化广告深挖数据处理技巧

大家好!我一直希望能和大家在技术学习的道路上携手共进,这也是我写这一系列博客的初衷。上次我们一起学习了Python基础的数据处理知识,这次咱们借助一本程序化广告手册,深入挖掘数据处理的更多技巧。这本手册涵盖了程序化广告从概念到技术实现的诸多方面,而其中处处都涉及到数据处理,相信会给我们带来不少收获

yyy173611的博客 4572

Clion编译stm32cube初始化工程时non constant or forward reference address expression for section .ARM.extab报错

相信应该有同学在看了稚晖君关于clion开发stm32的文章之后也想在自己PC上实现“优雅の嵌入式开发”遇到和我类似的问题。他的文章是22年写的,我个人猜测应当是版本更新导致的不适配。意思就是说 READONLY 只能在gcc11以后的版本中使用,gcc10及以前的版本将无法正确识别,也就有如下错误。或者就可以将gcc升级至最新的版本。记得在clion工具链中修改c,cpp编译器的位置。可以将文本括号中的 READONLY 全部删除。当时由于没有注意到这行注释导致在这里卡了好久。

2301_77256849的博客 2512

Vulkan 教程中文版项目文档

``` VulkanTutorialCN/ ├── assets/ │ ├── models/ │ ├── shaders/ │ └── textures/ ├── chapters/ │ ├── 01_Introduction.md │ ├── 02_Development_Environment.md │ └── ... ├── code/ │ ├── 01_Bas...

gitblog_00979的博客 560

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

绿米Aqara S1【妙控开关 S1E】版本降级或升级自定义固件的方法

LeeKwen的专栏 2171

Vulkan规范:第一章

1. 简介 本章,除了“术语”、“规范化参考”小节,都是介绍性的信息。 这份文档,被称为“Vulkan 规范”或者此后仅称为“规范”,描述了Vulkan图形系统: 它是什么,它怎么行动,和实现它需要做什么。我们假设读者对计算机图形学有基础的 了解。这表示要对计算机图形学算法、术语,和现代化的GPU(Graphic Processing Units)熟悉。

know yourself 1954

基于MATLAB的Hough变换指针式仪表识别

综上所述,本文介绍了如何使用MATLAB中的Hough变换算法来实现指针式仪表的自动识别和读数。通过图像预处理、Hough变换和直线提取,我们可以准确地检测指针的位置,并进一步进行仪表读数。本文将介绍如何使用MATLAB中的Hough变换算法来实现指针式仪表的自动识别和读数。在指针式仪表识别中,我们可以利用Hough变换来检测仪表盘上的指针。以上是基于MATLAB的Hough变换指针式仪表识别的详细步骤和源代码示例。根据指针在仪表盘上的位置,我们可以进行角度计算或使用其他技术来获取准确的读数。

techDM的博客 462

点云目标检测:open3d多窗口联动可视化

多个模型之间的对比除了指标之外,还需要可以直接直观的对比可视化结果,这次介绍一下如何使用open3d同时打开两个窗口分别加载两个模型的结果进行对比,同时实现两个窗口的联动,也就是当一个窗口拖动或者缩放时另外一个窗口也跟着做同样的变换。

zhaoguanhua的博客 4688

Vulkan® A Specification::Chapter 4::Devices and Queues(设备和队列)

原文链接:https://vulkan.lunarg.com/doc/view/1.2.135.0/windows/chunked_spec/chap4.html#devsandqueues 更新记录: 2020/4/27增加 4设备和队列,增加4.1物理设备(翻译到获取额外信息处) 4 设备和队列 一旦Vulkan初始化完成,设备和队列将会成为应用与Vuka...

AvatarForTest的博客 750

【系统分析师】高分论文:论软件开发方法及应用(数据中心CMDB 系统)

【摘要】本文以作者负责的"数据中心CMDB系统"建设项目为例,探讨了系统分析和建模方法在IT项目中的应用实践。项目基于ITIL框架,旨在整合分散的配置信息,构建统一CMDB平台。通过分析结构化、面向对象和构件化三种开发方法特点,项目最终采用结构化分析与V模型结合的方式,并融入面向对象设计理念。系统经过4个月开发后上线,通过增量迭代满足不同数据源接口需求,采用适配器模式提高兼容性。经过2个月试点运行和优化,系统已稳定运行并获得用户认可,为后续IT服务管理集成奠定了基础。项目实施使作者积累了

数据知道的博客 4300

vulkan 学习资料

好的,我来为你推荐一些学习 Vulkan 的资料: Vulkan 官方文档:https://www.khronos.org/vulkan/ Vulkan 课程:https://www.youtube.com/watch?v=SC29n-bBkcw Vulkan 入门教程:https://vulkan-tutorial.com/ Vulkan 开发指南:https://developer.nvid...

weixin_35756892的博客 262

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Vulkan-Docs完全指南:深入解析下一代图形API规范

Vulkan-Docs是Khronos Group发布的Vulkan API官方规范文档,包含了构建高性能跨平台图形应用所需的完整技术细节。作为新一代低开销图形API,Vulkan通过显式控制GPU资源和并行处理能力,为游戏开发者和图形程序员提供了前所未有的性能优化空间。本指南将带你全面了解Vulkan-Docs的结构、核心内容与实用功能,助你快速掌握这份权威技术文档的使用方法。 ## 一、Vu

gitblog_00121的博客 987

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Vulkan教程(官方教程翻译版)

欢迎来到Vulkan示例教程 本教程以章节的方式一步一步指导你创建一个简单的Vulkan程序。 每个教程章节都对应一个示例程序,可以阅读这个示例程序,并可在实际编码中进行测试。 教程目录 介绍 实例化 枚举所有设备 初始化设备 初始化命令缓冲区 初始化交换链 初始化深度缓冲区 初始化Uniform缓冲区 初始化管线布局 初始化描述符集合 初始化渲染层 初始化着色器 初始化帧缓冲区 初始化...

克劳德D的开发日志 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

终极DXVK指南:如何利用Vulkan扩展在Linux上完美运行Windows游戏

DXVK是基于Vulkan的Direct3D 8/9/10/11翻译层,专为Linux和Wine环境设计,让玩家能够在Linux系统上流畅运行Windows游戏和应用程序。这款强大的**Vulkan扩展**工具通过将Direct3D调用转换为Vulkan API,显著提升了游戏性能和兼容性。 ## 🚀 DXVK核心功能介绍 DXVK的核心功能是将Windows的Direct3D图形API转换

gitblog_00087的博客 592

告别卡顿:DXVK动态渲染优化指南

你还在Linux/Wine环境下运行Direct3D游戏时遭遇卡顿、画面撕裂或帧率不稳定?本文将通过DXVK的动态渲染优化配置,帮助你解决这些问题,提升游戏体验。读完本文你将获得:DXVK核心功能解析、动态渲染配置指南、性能调优实战案例以及常见问题解决方案。 ## 项目简介 DXVK是一个基于Vulkan的翻译层,能够在Linux系统上通过Wine运行Direct3D 8/9/10/11应用程...

gitblog_00159的博客 407

Vulkan-官方示例解读-Shadows(光栅化)

2.重要函数 1)为屏幕外帧缓冲区设置单独的渲染通道。这是必需的,因为屏幕外帧缓冲区附件使用的格式与示例中的格式不同。 2)设置屏幕外帧缓冲器,用于将场景从光源的视点渲染。然后,此帧缓冲器的深度连接将用于从阴影通道的片段着色器中采样。 3)该示例中的创建命令缓冲:注意用到了两个渲染通道,第一个用于生成阴影贴图,而选择是否用光源视角进行渲染则在第二个中。 4)描述符布局 5)描述符集 6)管线 7)uniform 二、Shader 1.offscreen 阴影贴图渲染 vert frag 2.scene模型渲

wqdqwass的博客 1028

现代 Vulkan 秘籍(一)

这本书是为经验丰富的计算机图形软件工程师设计的,他们可能对较旧的图形 API,如 OpenGL 和 DirectX 10 非常熟悉,但对现代图形 API 相对较新。就像你一样,我们发现我们需要学习 Vulkan,但因为我们不理解 Vulkan 的基本概念,这是一个复杂且庞大的 API,所以我们很难实现实用的解决方案。本书的目标是向您介绍 API 的基本概念,然后通过精选的、经过验证的算法引导您了解 Vulkan 在每个配方中的新和细微之处。本书分为五部分,按以下顺序涵盖以下内容:基本 Vulkan 概念,如

龙哥盟 695

debug printf

#include<stdio.h> #define TEST_DEBUG(format,...) if(g_debug) { printf("%s %s @%d: "format, __FILE__, __func__, __LINE__, ##__VA_ARGS__);} int g_debug = 1; int main() { TEST_DEBUG("1234\n");...

weixin_41666796的博客 1676

[Vulkan教程] 一: 创建VkDevice

这个系列的文章是写给对已有的D3D11和GL比较熟悉并理解多线程、资源暂存、同步等概念但想进一步了解它们是如何以Vulkan实现的读者。 文章并不追求通俗易懂,里面有很多术语(为了解里面的晦涩内容,建议去阅读Vulkan规范或者更深度的教程)。为了更好地理解Vulkan的使用,文章会结合作者正在开发的Vulkan图形库kaleido3d来做说明。

Vivid Frames 6851

Vulkan 编程指南 - 基础代码 (Vulkan Tutorial / Base code / 00_base_code.cpp)

Vulkan 编程指南 - 基础代码 (Vulkan Tutorial / Base code / 00_base_code.cpp)

程永强 1519

Vulkan Cookbook 第一章 8 创建Vulkan实例

创建Vulkan实例 译者注:示例代码点击此处 Vulkan实例是一个收集应用程序状态的对象。它包含诸如应用程序名称、引擎的名称和版本之类的信息,或启用实例级扩展和层。 通过实例,我们还可以枚举可用的物理设备并创建逻辑设备,在这些逻辑设备上执行典型的操作,例如图像创建或绘图。因此,在使用Vulkan API之前,我们需要创建一个新的实例对象。 怎么做... 1.准备一个名为desired...

qq_19473837的博客 1000

SGLang 服务器部署完整指南:从零搭建到高并发调优实战

SGLang 是一个专为大语言模型和多模态模型设计的高性能推理服务框架,核心功能是把你本地的模型变成一个高并发的推理服务。这篇指南教你完成 **SGLang 部署** 的最短路径:先想清楚该用什么硬件和容器,然后用一条命令把服务跑起来,再按"你要提哪一项指标"做最小必要的性能优化,最后加上监控、压测和上线检查。全程只用你能直接复制执行的命令,不堆参数。 [![SGLang 多模型服务卡片](ht

gitblog_00609的博客 387

Vulkan® A Specification::Chapter 2::Fundamentals(基本概念)

原文链接:https://vulkan.lunarg.com/doc/view/1.2.131.2/windows/chunked_spec/chap2.html#fundamentals 更新记录: 2020/4/8:: 2基本概念 2.1本地和设备环境 2.2执行模式 2基本概念 这一章介绍Vulkan的架构、执行模式(execution model)、API、队列(queu...

AvatarForTest的博客 1698
上一篇: Vulkan® A Specification Core And Extension::Vulkan文档核心部分和扩展部分对照与翻译说明
下一篇: Vulkan® A Specification::Chapter 4::Devices and Queues(设备和队列)
FuXiii
博客等级 码龄9年 89粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值