Skip to content

Commit

Permalink
dev merge to main
Browse files Browse the repository at this point in the history
  • Loading branch information
FuXiii committed Sep 14, 2024
2 parents 3f5500a + 4eca54e commit 55378f1
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 5 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ Vulkan入门精要

使用`Sphinx`书写和发布

<!--
## Sponsor
想赞助的小伙伴,欢迎使用`爱发电`赞助,请量力而为,如果赞助完真有困难可以退回,**未成年人禁止投喂!!!**
![爱发电Essentials.of.Vulkan](./source/_static/aifadian.jpg)
![爱发电Essentials.of.Vulkan](./source/_static/aifadian.jpg)
-->
1 change: 1 addition & 0 deletions memorandum.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
资源与内存->VkMemoryRequirements->对应关系 给出图示
12 changes: 12 additions & 0 deletions source/Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@
此更新日志为纵览更新,对于具体文章的更新位于每个文章的开头的 `更新记录` 中。
```

## 2024/9/14

>* 更新`纵览`文档
## 2024/9/6

>* 更新`资源与内存`文档
## 2024/9/3

>* 更新`资源`文档
## 2024/8/29

>* 更新`欢迎来到 Vulkan 入门精要`文档
Expand Down
11 changes: 10 additions & 1 deletion source/Overview.rst
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@
* 2024/1/20 增加 ``vkWaitForFences`` 章节。
* 2024/2/4 增加 ``VkInstanceCreateFlags`` 章节。并增加 ``VkFlags 与 位域`` 说明。
* 2024/2/4 更新 ``VkQueueFlags`` 章节。将其中的 ``VkFlags`` 说明转移至 ``VkInstanceCreateFlags`` 章节的 ``VkFlags 与 位域`` 说明中。
* 2024/9/14 增加 ``模棱两可的函数获取`` 注释说明。

由于 ``Vulkan`` 比较复杂,为了更好的入门 ``Vulkan`` ,还是大致过一遍 ``Vulkan`` 的核心思路,这对以后的学习很有帮助。

Expand Down Expand Up @@ -442,7 +443,13 @@ Vulkan 函数分类
.. admonition:: vkGetInstanceProcAddr 和 Device 域函数
:class: note

在 ``Vulkan`` 中并没有禁止用户使用 ``vkGetInstanceProcAddr`` 获得 ``Device`` 域函数,但这是不推荐的,当有多个硬件设备时会造成模棱两可的函数获取。比如电脑上插着两个显卡,一个是摩尔线程的,一个是景嘉微的,这两个设备都支持绘制函数 ``vkCmdDraw`` 函数 ,但是到底获取的是哪个设备的实现是由 ``Vulkan Loader`` 定义的,用户并不能知道返回的函数是哪个设备的实现。
在 ``Vulkan`` 中并没有禁止用户使用 ``vkGetInstanceProcAddr`` 获得 ``Device`` 域函数,但这是不推荐的,当有多个硬件设备时会造成 “模棱两可” 的函数获取。比如电脑上插着两个显卡,一个是摩尔线程的,一个是景嘉微的,这两个设备都支持绘制函数 ``vkCmdDraw`` 函数 ,但是到底获取的是哪个设备的实现是由 ``Vulkan Loader`` 定义的,用户并不能知道返回的函数是哪个设备的实现。

.. admonition:: 模棱两可的函数获取
:class: seealso

``vkGetInstanceProcAddr`` 对于获取 ``Device 域`` 函数:当调用这些 ``Device 域`` 函数时 :bdg-danger:`一定` 是作用在某一个句柄(设备句柄或其子句柄)上,而句柄间有明确的子父关系 , ``Vulkan Loader`` 会根据句柄的子父关系查找到对应的设备句柄,并调用对应设备上的函数实现。
``Vulkan Loader`` 在其中作为中间商进行了内部的函数调度,这种调度是需要消耗一部分调度时间的,为了得到更加高效的执行效率,推荐直接 :ref:`Get_Deivce_Function` 并调用,这将直接省去内部函数调度。

vkGetInstanceProcAddr
************************
Expand Down Expand Up @@ -1426,6 +1433,8 @@ VkDeviceQueueCreateInfo

assert(result == VkResult::VK_SUCCESS) //是否创建成功

.. _Get_Deivce_Function:

获取 Device 域函数
############################

Expand Down
5 changes: 3 additions & 2 deletions source/Resource.rst
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
* 2024/5/7 增加 ``二维多级渐远纹理`` 示例章节。
* 2024/5/7 增加 ``多采样二维颜色附件纹理`` 示例章节。
* 2024/5/7 增加 ``深度-模板附件纹理`` 示例章节。
* 2024/9/3 修正 ``VkImageTiling`` 打印错误。


在 ``Vulkan`` 中只有 ``2`` 种资源 :
Expand Down Expand Up @@ -714,8 +715,6 @@ VkSampleCountFlagBits

单次采样与 ``8`` 次采样对比示意图

其中 ``VkImageCreateInfo::tiling`` 的 ``VkImageTiling`` 类型定义如下:

图片资源逻辑模型
^^^^^^^^^^^^^^^^^^^^^^^^

Expand Down Expand Up @@ -900,6 +899,8 @@ VkImageCreateFlagBits

如上示意图中各级的渐远纹理中每个像素都是有确切图像值的,这些只是帮助您从逻辑上理解多级渐远,但是在实际通过 ``vkCreateImage(...)`` 创建带有多级渐远纹理中,图片数据全都是初始值(可能为 ``0`` )。每一级别的多级渐远图片中每个像素具体为何值,需要通过执行 ``GPU指令`` 手动运算赋值。这将会在之后的章节进行讲解。

其中 ``VkImageCreateInfo::tiling`` 的 ``VkImageTiling`` 类型定义如下:

VkImageTiling
^^^^^^^^^^^^^^^^^^^^^^^^

Expand Down
9 changes: 9 additions & 0 deletions source/ResourceAndMemory.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* 2024/5/18 更新 ``VkMemoryRequirements`` 章节。
* 2024/5/21 更新 ``VkMemoryRequirements`` 章节。
* 2024/5/21 增加 ``资源与设备内存绑定`` 章节。
* 2024/9/6 更新 ``对应关系`` 章节。

在 `资源 <./Resource.html>`_ 章节中我们知道一个资源仅仅是一个 ``虚拟资源句柄`` ,其本质上并没有相应的内存实体用于存储数据。所以在创建完资源后,需要分配内存并与资源进行绑定,用于之后的数据读写。

Expand Down Expand Up @@ -114,6 +115,14 @@ VkMemoryRequirements

所以一个 ``32`` 位的 ``VkMemoryRequirements::memoryTypeBits`` 完全可以覆盖到所有的 ``VkPhysicalDeviceMemoryProperties::memoryTypes`` 对应索引。

示意图如下:

.. figure:: ../_static/memory_type_bits.png

memoryTypeBits 与 memoryTypes

假如, ``VkPhysicalDeviceMemoryProperties::memoryTypes`` 有 ``10`` 个内存类型,其中 ``VkMemoryRequirements::memoryTypeBits`` 比特位为 ``1`` 所对应的内存索引的那个 ``设备内存`` 支持该为资源分配内存。

由于 ``VkMemoryRequirements::memoryTypeBits`` 中是按比特位存储的索引,所以我们需要遍历 ``32`` 位的每一位,来确定对应位是否为 ``1`` 。示例代码如下:

.. code:: c++
Expand Down
Binary file added source/_static/memory_type_bits.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
'myst_parser',
'sphinx_copybutton',
'sphinx_inline_tabs',
'sphinx_last_updated_by_git',
#'sphinx_last_updated_by_git',
'sphinx_design',
'sphinx_comments',
]
Expand Down

0 comments on commit 55378f1

Please sign in to comment.