Vulkan 学习(4)---- Vulkan 逻辑设备

news2024/9/23 13:26:14

目录

        • Vulkan Logical Device OverView
        • 逻辑设备创建
        • VkDeviceQueueCreateInfo
        • DeviceExtension
        • 获取DeviceQueue
        • 参考代码

Vulkan Logical Device OverView

在 Vulkan 中,逻辑设备(Logical Device)是与物理设备(Physical Device)交互的接口,它抽象了对特定GPU(物理设备)的访问,使得应用程序能够提交命令并管理资源,而无需与物理硬件打交道
举例来说:物理设备可能包含三种队列:图形,计算和传输。但是逻辑设备创建的时候,可以只关联一个单独的队列(比如图形),这样我们就可以很方便地向队列提交指令缓存了
vulkan_program

逻辑设备创建

创建逻辑设备时,需要指定你希望使用的队列族和队列、启用的扩展、以及一些其他特性,我们通过 vkCreateDevice() 函数创建逻辑设备, 函数原型如下:

VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(
    VkPhysicalDevice                            physicalDevice,
    const VkDeviceCreateInfo*                   pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkDevice*                                   pDevice);

  • physicalDevice 指定在哪一个物理设备上创建逻辑设备
  • pCreateInfo 创建逻辑设备的配置信息,是关键结构
  • pAllocator 内存分配器。如果为 nullptr表示使用内部默认分配器,否则为自定义分配器
  • pDevice 创建逻辑设备的实例

其中关键的输入参数结构是VkDeviceCreateInfo,其定义如下:

typedef struct VkDeviceCreateInfo {
    VkStructureType                    sType;
    const void*                        pNext;
    VkDeviceCreateFlags                flags;
    uint32_t                           queueCreateInfoCount;
    const VkDeviceQueueCreateInfo*     pQueueCreateInfos;
    uint32_t                           enabledLayerCount;
    const char* const*                 ppEnabledLayerNames;
    uint32_t                           enabledExtensionCount;
    const char* const*                 ppEnabledExtensionNames;
    const VkPhysicalDeviceFeatures*    pEnabledFeatures;
} VkDeviceCreateInfo;

各个参数的含义如下:

  • sType 是该结构体的类型枚举值, 必须是 VkStructureType::VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO
  • pNext 要么是 NULL 要么指向其他结构体来扩展该结构体
  • flags:resevered
  • queueCreateInfoCount 指定pQueueCreateInfos数组元素个数,一般设置为 1
  • pQueueCreateInfos 指定VkDeviceQueueCreateInfo数组, 用于配置要创建的设备队列信息
  • enabledLayerCount 指定ppEnabledLayerNames 数组元素个数。该成员已被遗弃
  • ppEnabledLayerNames 指定要开启的验证层。该成员已被遗弃
  • enabledExtensionCount 指定ppEnabledExtensionNames数组中元素个数
  • ppEnabledExtensionNames 指定要开启的扩展。该数组数量必须大于等于 enabledExtensionCount
  • pEnabledFeatures 配置要开启的特性
VkDeviceQueueCreateInfo

VkDeviceQueueCreateInfo 的定义如下:

typedef struct VkDeviceQueueCreateInfo {
    VkStructureType             sType;
    const void*                 pNext;
    VkDeviceQueueCreateFlags    flags;
    uint32_t                    queueFamilyIndex;
    uint32_t                    queueCount;
    const float*                pQueuePriorities;
} VkDeviceQueueCreateInfo;
  • sType 是该结构体的类型枚举值, 必须是 VkStructureType::VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO
  • pNext 要么是 NULL 要么指向其他结构体来扩展该结构体
  • flags 配置额外的信息。可设置的值定义在 VkDeviceQueueCreateFlagBits 枚举中
  • queueFamilyIndex 指定目标设备队列族的索引
  • queueCount 指定要在 queueFamilyIndex 中创建设备队列的数量
  • pQueuePriorities 指向元素数量为 queueCount 的 float 数组。用于配置创建的每一个设备队列的优先级

其中 queueFamilyIndex 必须 是目标物理设备中有效的设备队列族索引,并且queueCount必须小于等于queueFamilyIndex 索引对应的设备队列族中的队列数量。
其中 pQueuePriorities 配置的优先级的有效等级范围为[0, 1] ,值越大,优先级越高。其中 0.0 是最低的优先级,1.0是最高的优先级。
在某些设备中,优先级越高意味着将会得到更多的执行机会,具体的队列调由设备自身管理, Vulkan 并不规定调度规则

DeviceExtension

前文创建实例的时候可以设置实例的扩展,在 VkDeviceCreateInfo 我们需要通过 enabledExtensionCountppEnabledExtensionNames 来指定该逻辑设备要开启的设备扩展

在开启设备扩展之前,我们需要通过 vkEnumerateDeviceExtensionProperties函数获取目标设备支持的扩展
注意这和之前的获取 Insatance 的拓展并不一致,获取 Instance 拓展的函数是 vkEnumerateInstanceExtensionProperties

VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(
    VkPhysicalDevice                            physicalDevice,
    const char*                                 pLayerName,
    uint32_t*                                   pPropertyCount,
    VkExtensionProperties*                      pProperties);
  • physicalDevice 创建的物理设备
  • pLayerName 要么为空要么为层的名称,实际如果传入 nullptr,可以遍历出所有层
  • pPropertyCount 要么为空要么为 pProperties 中元素的数量。
  • pProperties 为扩展信息数组,元素个数 必须 大于等于 pPropertyCount 中指定数量

参考代码如下:

    std::cout << "===========================================================" << std::endl;
    uint32_t extension_property_count = 0;
    vkEnumerateDeviceExtensionProperties(physicalDevice,nullptr, &extension_property_count, nullptr);
    std::cout << "device extension count:" << extension_property_count << std::endl;

    std::vector<VkExtensionProperties> extension_properties(extension_property_count);
    vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr,  &extension_property_count, extension_properties.data());

    std::cout << "enumrate extension_properties:" << std::endl;
    for (auto& properties:extension_properties) {
        std::cout << "name:" << properties.extensionName << std::endl;
    }

一共可以打印出128层,如下:

name:VK_EXT_device_address_binding_report
name:VK_EXT_full_screen_exclusive

// 用于与VK_KHR_surface 和平台相关的,VK_{vender}_{platform}_surface 扩展配合使用。用于窗口化显示渲染结果
name:VK_KHR_swapchain
name:VK_KHR_external_memory
name:VK_KHR_external_memory_win32
name:VK_EXT_external_memory_host
name:VK_KHR_external_semaphore
name:VK_KHR_external_semaphore_win32
name:VK_KHR_external_fence
name:VK_KHR_external_fence_win32
name:VK_KHR_timeline_semaphore
name:VK_KHR_win32_keyed_mutex
name:VK_KHR_get_memory_requirements2
name:VK_KHR_bind_memory2
name:VK_KHR_dedicated_allocation
name:VK_KHR_sampler_mirror_clamp_to_edge
name:VK_KHR_maintenance1
name:VK_KHR_maintenance2
name:VK_KHR_maintenance3
name:VK_KHR_maintenance4
name:VK_KHR_synchronization2
name:VK_KHR_shader_draw_parameters
name:VK_KHR_push_descriptor
name:VK_KHR_descriptor_update_template
name:VK_KHR_multiview
name:VK_KHR_shader_float16_int8
name:VK_KHR_shader_float_controls
name:VK_KHR_16bit_storage
name:VK_KHR_8bit_storage
name:VK_EXT_shader_subgroup_ballot
name:VK_EXT_shader_subgroup_vote
name:VK_KHR_storage_buffer_storage_class
name:VK_KHR_variable_pointers
name:VK_KHR_relaxed_block_layout
name:VK_EXT_sampler_filter_minmax
name:VK_KHR_device_group
name:VK_KHR_sampler_ycbcr_conversion
name:VK_EXT_ycbcr_2plane_444_formats
name:VK_EXT_4444_formats
name:VK_EXT_post_depth_coverage
name:VK_EXT_shader_viewport_index_layer
name:VK_EXT_shader_stencil_export
name:VK_EXT_conservative_rasterization
name:VK_EXT_sample_locations
name:VK_KHR_draw_indirect_count
name:VK_EXT_multi_draw
name:VK_KHR_image_format_list
name:VK_EXT_image_view_min_lod
name:VK_EXT_vertex_attribute_divisor
name:VK_EXT_descriptor_indexing
name:VK_EXT_mutable_descriptor_type
name:VK_EXT_inline_uniform_block
name:VK_KHR_create_renderpass2
name:VK_KHR_dynamic_rendering
name:VK_KHR_swapchain_mutable_format
name:VK_KHR_depth_stencil_resolve
name:VK_KHR_driver_properties
name:VK_KHR_vulkan_memory_model
name:VK_EXT_conditional_rendering
name:VK_EXT_hdr_metadata
name:VK_KHR_fragment_shading_rate
name:VK_EXT_depth_clip_enable
name:VK_EXT_depth_clip_control
name:VK_EXT_scalar_block_layout
name:VK_KHR_imageless_framebuffer
name:VK_KHR_buffer_device_address
name:VK_EXT_buffer_device_address
name:VK_KHR_pipeline_library
name:VK_EXT_host_query_reset
name:VK_KHR_performance_query
name:VK_NV_device_diagnostic_checkpoints
name:VK_KHR_separate_depth_stencil_layouts
name:VK_KHR_shader_clock
name:VK_KHR_spirv_1_4
name:VK_KHR_uniform_buffer_standard_layout
name:VK_EXT_separate_stencil_usage
name:VK_EXT_fragment_shader_interlock
name:VK_EXT_index_type_uint8
name:VK_EXT_primitive_topology_list_restart
name:VK_KHR_shader_subgroup_extended_types
name:VK_EXT_line_rasterization
name:VK_EXT_memory_budget
name:VK_EXT_memory_priority
name:VK_EXT_pageable_device_local_memory
name:VK_EXT_texel_buffer_alignment
name:VK_INTEL_performance_query
name:VK_EXT_subgroup_size_control
name:VK_EXT_shader_demote_to_helper_invocation
name:VK_EXT_pipeline_creation_feedback
name:VK_EXT_pipeline_creation_cache_control
name:VK_KHR_pipeline_executable_properties
name:VK_EXT_graphics_pipeline_library
name:VK_EXT_transform_feedback
name:VK_EXT_provoking_vertex
name:VK_EXT_extended_dynamic_state
name:VK_EXT_extended_dynamic_state2
name:VK_EXT_extended_dynamic_state3
name:VK_EXT_vertex_input_dynamic_state
name:VK_EXT_custom_border_color
name:VK_EXT_robustness2
name:VK_EXT_image_robustness
name:VK_EXT_pipeline_robustness
name:VK_EXT_calibrated_timestamps
name:VK_KHR_shader_integer_dot_product
name:VK_KHR_shader_subgroup_uniform_control_flow
name:VK_KHR_shader_terminate_invocation
name:VK_KHR_workgroup_memory_explicit_layout
name:VK_EXT_shader_atomic_float
name:VK_KHR_copy_commands2
name:VK_KHR_shader_non_semantic_info
name:VK_KHR_zero_initialize_workgroup_memory
name:VK_EXT_shader_atomic_float2
name:VK_EXT_global_priority
name:VK_EXT_global_priority_query
name:VK_KHR_global_priority
name:VK_KHR_format_feature_flags2
name:VK_KHR_video_queue
name:VK_KHR_video_decode_queue
name:VK_KHR_video_decode_h264
name:VK_KHR_video_decode_h265
name:VK_EXT_color_write_enable
name:VK_NV_compute_shader_derivatives
name:VK_EXT_private_data
name:VK_EXT_image_2d_view_of_3d
name:VK_EXT_primitives_generated_query
name:VK_EXT_shader_module_identifier
name:VK_EXT_attachment_feedback_loop_layout
name:VK_KHR_map_memory2
获取DeviceQueue

通过 vkGetDeviceQueue() 函数获取设备队列

VKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue(
    VkDevice                                    device,
    uint32_t                                    queueFamilyIndex,
    uint32_t                                    queueIndex,
    VkQueue*                                    pQueue);
  • device 目标逻辑设备。
  • queueFamilyIndex 是前面获取的目标设备队列的队列族索引。
  • queueIndex 对应 VkDeviceQueueCreateInfo::queueCount 的对应设备队列索引, 用于区分创建的多个队列
  • pQueue 对应 VkDeviceQueueCreateInfo::queueCount 创建的第 queueIndex 的设备队列
参考代码
void vulkanBasicDemo::vulkanCreateLogicalDevice() {
    float queuePriority = 1.0f;
    VkDeviceQueueCreateInfo queueCreateInfo = {};
    queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
    queueCreateInfo.queueFamilyIndex = graphicsQueueFamilyIndex;
    queueCreateInfo.queueCount = 1;
    queueCreateInfo.pQueuePriorities = &queuePriority;
    // device extension
    std::vector<const char*> device_extensions;
    device_extensions.push_back("VK_KHR_swapchain");
    VkDeviceCreateInfo deviceCreateInfo = {};
    deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
    deviceCreateInfo.queueCreateInfoCount = 1;
    deviceCreateInfo.pQueueCreateInfos = &queueCreateInfo;
    deviceCreateInfo.enabledExtensionCount = static_cast<uint32_t>(device_extensions.size());
    deviceCreateInfo.ppEnabledExtensionNames = device_extensions.data();

    if (vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device) != VK_SUCCESS) {
        throw std::runtime_error("failed to create logical device!");
    }

    vkGetDeviceQueue(device, graphicsQueueFamilyIndex, 0, &graphicsQueue);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CDD数据库文件制作(八)——服务配置(0x85)

目录 1.子功能创建2.会话切换配置/安全等级配置2.1.根据诊断调查表进行信息提取2.2.会话转换配置/安全等级配置3.寻址方式信息提取/禁止肯定响应位(SPRMIB)信息3.1.寻址方式/禁止肯定响应位(SPRMIB)配置4.否定响应码信息提取4.1.否定响应码配置按照诊断调查表中对0x85服务的…

PX30 Android8.1适配AIC8800 wifi

wifi驱动生成ko文件 生成后 通过wpa_supplicant加载参数 external/wpa_supplicant_8/wpa_supplicant/main.c int main(int argc, char *argv[]) {int ret -1;char module_type[20]{0};wpa_printf(MSG_INFO,"argc %d\n",argc);if(argc 2) {if (wifi_type[0] 0) …

【MySQL】数据库基础(表的操作)

目录 一、创建表 二、查看表结构 三、修改表 3.1 添加新列 3.2 修改列属性 3.3 删除列属性 3.4 修改表名 3.5 向表中插入 3.6 修改列名 四、删除表 一、创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) …

docker容器安全加固参考建议——筑梦之路

这里主要是rootless的方案。 在以 root 用户身份运行 Docker 会带来一些潜在的危害和安全风险&#xff0c;这些风险包括&#xff1a; 容器逃逸&#xff1a;如果一个容器以 root 权限运行&#xff0c;并且它包含了漏洞或者被攻击者滥用&#xff0c;那么攻击者可能会成功逃出容器…

车载camera avm框图

一、关键词介绍: POC: power on coax LVDS: Low-Voltage Differential Signaling GMSL:Gigabit Multimedia Serial Link AVM: Around View Monitor Serdes:DeSerializer、Serializer DVP:Interface with ISP and Sensor: DVP(Digital Video Port) 二、车载camera avm…

书籍推荐:大数据之路 阿里巴巴大数据实践

书籍推荐&#xff1a;大数据之路 阿里巴巴大数据实践 这本书侧重于理论知识&#xff0c;并结合了阿里大数据发展的过程&#xff0c;将知识总结起来。总的来所&#xff0c;书中的有些章节个人感觉非常不错&#xff0c;比如&#xff1a;数据仓库建模&#xff1b;但是大部分章节都…

性能优化理论篇 | 如何保证数据安全落盘,5分钟彻底弄懂 一次write中的各种缓冲区 !

性能优化系列目录&#xff1a; 性能优化理论篇 | 彻底弄懂系统平均负载 性能优化理论篇 | swap area是个什么东西 性能优化理论篇 | Cache VS Buffer&#xff0c;傻傻分不清 &#xff1f; 在很多IO场景中&#xff0c;我们经常需要确保数据已经安全的写到磁盘上&#xff0c;以便…

xss之DOM破坏

文章目录 DOM破坏漏洞的复现https://xss.pwnfunction.com/基于bp学院DOM破坏漏洞复现思路分析实现 常见的xss触发的标签没有过滤的情况存在过滤的情况 DOM破坏 DOM破坏就是⼀种将 HTML 代码注⼊⻚⾯中以操纵 DOM 并最终更改⻚⾯上 JavaScript ⾏为的技术。 在⽆法直接 XSS的情…

Linux·权限与工具-make

1. Makefile/makefile工具 首先展示一下&#xff0c;makefile工具如何使用。我们先写一个C语言程序 然后我们建立一个Makefile/makefile文件&#xff0c;m大小写均可。我们在文件中写入这样两行 wq保存退出后&#xff0c;我们使用 make 命令 可以看到生成了可执行程序&#xff…

无人机模拟训练室技术详解

无人机模拟训练室作为现代无人机技术培训的重要组成部分&#xff0c;集成了高精度模拟技术、先进的数据处理能力及高度交互的操作界面&#xff0c;为无人机操作员提供了一个安全、高效、接近实战的训练环境。以下是对无人机模拟训练室技术的详细解析&#xff0c;涵盖系统基础概…

为TI的 AM355移植uboot和linux内核

一、uboot移植 在移植之前要先对uboot的源码结构有一定熟悉 1.uboot源码顶层目录下各源码文件夹的作用 2.编译后生成的uboot.xxx 各文件后缀含义 关于以上两点社区已经有很多前辈总结的很详细&#xff0c;这里不做赘述。 对于uboot源码分析韦东山老师b站上有免费的课程&#x…

QT中Charts基本用法

QT中Charts基本用法 第一步:创建工程,添加Charts库 第二步:添加charts视图 注意要打上对钩 第三步:添加所需成员 第四步:编写初始化函数 第五步:添加测试数据

C++学习笔记之算法模板

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、双指针1.1 有序数组的合并1.2 快慢指针/删除有序数组中的重复项1.3 求和 二、动态规划2.1 自底向上和自顶向下&#xff08;带备忘录&#xff09;2.2 带有当前状…

浅谈哈希长度扩展攻击

攻击原理&#xff1a; 我们首先需要了解一下Message Authentication codes (MACs) &#xff0c;称为消息验证码&#xff0c;一般用于服务器验证消息的真实性。服务器把密钥和消息连接起来&#xff0c;用摘要算法获取摘要&#xff0c;对于H&#xff08;secret data&#xff09…

RabbitMq的基本理解

MQ概念及同步异步&#xff1a; 同步调用&#xff1a; 是一种编程模型&#xff0c;其中调用者发送请求并等待响应。在同步调用中&#xff0c;调用者会阻塞&#xff0c;直到被调用的方法返回结果。 异步调用: 是一种编程模型&#xff0c;其中调用者发送请求后立即返回&#x…

09结构型设计模式——组合模式

一、组合模式的简介 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;主要用于处理树形结构中的对象组合问题。它允许你将对象组合成树形结构&#xff0c;以表示部分-整体层次结构。组合模式使得客户端能够统一地对待单个对象和对象组合&a…

SEREN MC2电源匹配器控制器Matching Network Controller手侧

SEREN MC2电源匹配器控制器Matching Network Controller手侧

NC 反转链表

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个单链…

亲测解决Bundler HTTPError Could not fetch specs from

这个问题源于ruby的网站连接不上&#xff0c;解决方法是修改网页地址或者网络配置。 环境 win11 ruby 问题原文 Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/ due to underlying error <IO::TimeoutEr…

C# 将Dll嵌入exe中发布

一、制作模版Dll 二、在exe工程中添加Dll 1、添加上述“创建Dll”&#xff0c;并修改属性为&#xff1a;不复制到输出目录的嵌入资源 2、引用“Resource”中的dll文件&#xff0c;并修改属性&#xff1a;不复制到本地 三、添加重载Dll代码 1、添加以下代码 class DependentFi…