函数 GetMemoryType 的理解

从开始接触Vulkan,有个函数一直不解,今日做一个记录:

/*** Get the index of a memory type that has all the requested property bits set** @param typeBits Bit mask with bits set for each memory type supported by the resource to request for (from VkMemoryRequirements) * @param properties Bit mask of properties for the memory type to request* * @return Index of the requested memory type** @throw Throws an exception if memTypeFound is null and no memory type could be found that supports the requested properties*/uint32_t GetMemoryType(uint32_t typeBits, VkMemoryPropertyFlags properties) const {for (uint32_t i = 0; i < memoryProperties.memoryTypeCount; i++) {           if ((typeBits & 1) == 1) { // 问题一: 为什么要和1做与?if ((memoryProperties.memoryTypes[i].propertyFlags & properties) == properties) { // 问题二:为什么要和properties做与?return i;}}typeBits >>= 1;}throw std::runtime_error("Could not find a matching memory type");}

上述代码有两个地方需要理解,才能真正理解内存分配请求,如果不理解,直接抄写,也是没有问题的。
要回答上述两个问题,需要往前看:

// 省略部分代码
// Get memory requirements for the staging buffer (alignment, memory type bits)
vkGetBufferMemoryRequirements(logicalDevice, stagingBuffer, &reqs);
// Get memory type index for a host visible buffer
uint32_t index = GetMemoryType(reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
// 省略部分代码

根据上述代码可以得出:
typeBits:是通过函数vkGetBufferMemoryRequirements获取,是驱动返回的,代表的含义是:针对stagingBuffer这个缓存资源来说,驱动内部内存能够用来存放的类型集合,按位或以后,返回的。
properties:是应用程序直接传入的,代表了应用程序针对stagingBuffer这个缓存资源,额外需要的目的,HOST可见,且COHERENT

多说一句,Vulkan编程习惯里面的stagingBuffer一般都是用于数据上传至GPU上的中间缓存,也就是说,CPU必须可见,CPU往里面写入数据后,GPU侧最好也能直接看到,无需flush最好,但是GPU访问数据高效类型是DEVICE类型,所以,最后还需要经过一次拷贝。

现在来回答上述两个问题:

  1. 和1相与,是为了直接筛选出,驱动支持的内存类型;
  2. properties相与,是为了在驱动已经支持的前提下,找到额外的目的属性的内存类型。

这就是为什么,在经过寻找以后,如果没有交集的话,直接抛异常。

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

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

相关文章

2024年3月27号PMP每日三题含答案

2024年3月27号PMP每日三题含答案 1.首席信息官告知项目经理项目使用一个公共文件共享网站的行为违反了公司的安全要求。 项目经理应在下列哪一份文件中找到这项需求&#xff1f; A.项目安全计划 B.事业环境因素 C.组织过程资产 D.项目管理信息系统 1.解析&#xff1a;C 是参考…

Java入门之数据类型

一、数据类型 基本数据类型 &#xff08;1&#xff09;如果要定义“long类型的变量要在数值后面加一个L作为后缀” &#xff08;2&#xff09;如果要定义float类型的变量的时候数据值也要加一个作为后缀 小结&#xff1a; 练习 内容&#xff1a; 姓名&#xff1a;巴巴托斯 &…

【比特币】比特币的奥秘、禁令的深层逻辑与风云变幻

导语&#xff1a; 比特币(Bitcoin)&#xff0c;这个充满神秘色彩的数字货币&#xff0c;自诞生以来便成为各界瞩目的焦点。它背后所蕴含的Mining机制、禁令背后的深层逻辑以及市场的风云变幻&#xff0c;都让人欲罢不能。今天&#xff0c;我们将深入挖掘比特币的每一个角落&…

使用 nohup java - jar 不输出nohup日志

使用 nohup 命令来运行 Java 程序&#xff0c;并且不让输出写入 nohup.out 文件&#xff0c;可以使用重定向操作符 > 将标准输出重定向到 /dev/null 文件中。这样可以将输出丢弃&#xff0c;而不会写入日志文件。下面是具体的命令&#xff1a; nohup java -jar your_progra…

docker将本地镜像pull到阿里云和registry

目录 一、上次到阿里云服务器 1、制作一个带有vim功能的Ubuntu镜像 2、在阿里云上面创建镜像仓库 3、从阿里云仓库中上传和拉取镜像 二、上传镜像到本地私有库registry 1、下载镜像docker registry 2、运行私有库registry&#xff0c;相当于本地有个私有docker hub。 3…

Rust使用feature特性和条件编译,以及常用feature使用说明

Cargo Feature 是非常强大的机制&#xff0c;可以为大家提供条件编译和可选依赖的高级特性&#xff0c;可以为你省下不少的代码量来判断操作系统和条件编译等功能。rust官方条件编译文档&#xff1a;Conditional compilation - The Rust Reference features特性 Featuure 可以…

零基础学习挖掘PHP网站漏洞

教程介绍 本套课程&#xff0c;分为三个阶段&#xff1a;第一阶段&#xff1a;基础篇 学习PHP开发的基础知识&#xff0c;对PHP常见的漏洞进行分析&#xff0c;第二阶段&#xff1a;进阶篇 实战PHP漏洞靶场&#xff0c;了解市面上的PHP主流网站开发技术&#xff0c;并对市面上…

RocketMQ 流数据库解析:如何实现一体化流处理?

作者&#xff1a;林清山&#xff08;隆基&#xff09; 前言&#xff1a; 从初代开源消息队列崛起&#xff0c;到 PC 互联网、移动互联网爆发式发展&#xff0c;再到如今 IoT、云计算、云原生引领了新的技术趋势&#xff0c;消息中间件的发展已经走过了 30 多个年头。 目前&a…

AI+云平台|全闪云底座迎战

AI融万物之势席卷而来 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 行业特点 AI场景中80%以上是小文件&#xff0c;以非结构化数据为…

python-自动化测试- 多接口动态参数设计

什么叫做多接口的动态参数处理&#xff1f; 测试数据都放在excel中管理&#xff0c;每个接口如果有提取的数据就直接放在excel里写好&#xff0c;到时候直接读取出来做响应的提取操作即可。 电商项目&#xff1a; 购物车 token proId skuID等 需要执行多个接口 获取返回值&…

vue 隐藏导航栏和菜单栏,已解决

初始效果&#xff1a; 效果&#xff1a; 出现问题&#xff1a; 解决方法&#xff1a;

Java解决幸运数字

Java解决幸运数字 01 题目 哈沙德数是指在某个固定的进位制当中&#xff0c;可以被各位数字之和整 除的正整数。 例如 126 是十进制下的一个哈沙德数&#xff0c;因为 (126)10 mod (1 2 6) 0; 126 也是8进制下的哈沙德 数&#xff0c;因为(126)10 (176)8&#xff0c;(126)10…

第十四届蓝桥杯省赛Python组真题(未完)

AcWing 4965. 三国游戏 - AcWing 法1&#xff1a;dfs的时间复杂度是2^n 对于每一个我们有选与不选两种 //法1&#xff1a;dfs #include <bits/stdc.h> using namespace std; #define int long long #define x first #define y second typedef pair<int, int> PI…

使用docker-compose搭建wordpress博客

1、从远程仓库拉取worldpress镜像到本地 2、新建一个项目&#xff0c;然后在新建的项目目录里面新建一个docker-compose.yml模版文件。 3、编写docker-compose.yml文件 4、docker-compose up 运行项目。 5、在浏览器测试 使用docker-compose搭建wordpress博客实验成功。

Rust 实战练习 - 1. 输入,输出,环境变量,字符,字符串

目标&#xff1a; 获取程序命令行参数标准输入输出获取环境变量字符串&#xff0c;字符初步学习 cargo传递参数&#xff0c;需要加上-- use std::{env, ffi::OsString, io, io::Write};fn main() {println!("OS Env: {:?} > {:?}", env::current_dir().unwra…

VUE3——watch函数

与Vue2.x中watch配置功能一致 两个小“坑”&#xff1a; 监视reactive定义的响应式数据时&#xff1a;oldValue无法正确获取、强制开启了深度监视&#xff08;deep配置失效&#xff09;。监视reactive定义的响应式数据中某个属性时&#xff1a;deep配置有效。 //情况一&#x…

配置wss和隐藏端口号(WebSocket通信)

修改宝塔面板配置文件&#xff1a; 添加这几行代码&#xff1a; location /wss{proxy_pass http://127.0.0.1:23481; # 根据自己的socket端口号修改proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_s…

小技巧系列——Ubuntu下查看Eigen版本的一种方法(一)

小技巧系列——Ubuntu下查看Eigen版本的一种方法&#xff08;一&#xff09; 说明命令 说明 如何在Ubuntu下查看Eigen版本 命令 pkg-config --modversion eigen3

全网最详细的 Ubuntu 18.04 安装Livox mid-360驱动,测试 fast_lio2

目录 一、前言 二、依赖的环境 三、 安装Livox-SDK2&#xff0c;fast_lio2 和 livox_ros_driver2 (1) 安装Livox-SDK2 (2) 安装 fast_lio2 和 livox_ros_driver2 四、mid-360 设备硬件设置 五、运行设备 六、topic信息查看 一、前言 Livox mid-360需要使用Livox-SDK2…

【OceanBase OBCP题目解析17】关于OceanBase事务引擎一致性特点,描述正确的是

本文为云贝教育郭一军&#xff08;微信&#xff1a;guoyJoe&#xff09;原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 关于OceanBase事务引擎一致性特点&#xff0c;描述正确的是 &#xff1f; A. 保证…