Skip to content

Commit

Permalink
deploy: 55378f1
Browse files Browse the repository at this point in the history
  • Loading branch information
FuXiii committed Sep 14, 2024
1 parent ab18067 commit 37814b6
Show file tree
Hide file tree
Showing 12 changed files with 539 additions and 465 deletions.
2 changes: 1 addition & 1 deletion .buildinfo
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: ef9afda11aa1c502d42dc1a4fc45b8d4
config: feea49b46bdab24ed05b97fb0780dea5
tags: 645f666f9bcd5a90fca523b33c5a78b7
941 changes: 484 additions & 457 deletions Changelog.html

Large diffs are not rendered by default.

10 changes: 8 additions & 2 deletions Overview.html
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,7 @@ <h1>纵览<a class="headerlink" href="#id1" title="Link to this heading">¶</a><
<li><p class="sd-card-text">2024/1/20 增加 <code class="docutils literal notranslate"><span class="pre">vkWaitForFences</span></code> 章节。</p></li>
<li><p class="sd-card-text">2024/2/4 增加 <code class="docutils literal notranslate"><span class="pre">VkInstanceCreateFlags</span></code> 章节。并增加 <code class="docutils literal notranslate"><span class="pre">VkFlags</span> <span class="pre">与</span> <span class="pre">位域</span></code> 说明。</p></li>
<li><p class="sd-card-text">2024/2/4 更新 <code class="docutils literal notranslate"><span class="pre">VkQueueFlags</span></code> 章节。将其中的 <code class="docutils literal notranslate"><span class="pre">VkFlags</span></code> 说明转移至 <code class="docutils literal notranslate"><span class="pre">VkInstanceCreateFlags</span></code> 章节的 <code class="docutils literal notranslate"><span class="pre">VkFlags</span> <span class="pre">与</span> <span class="pre">位域</span></code> 说明中。</p></li>
<li><p class="sd-card-text">2024/9/14 增加 <code class="docutils literal notranslate"><span class="pre">模棱两可的函数获取</span></code> 注释说明。</p></li>
</ul>
</div>
</details><p>由于 <code class="docutils literal notranslate"><span class="pre">Vulkan</span></code> 比较复杂,为了更好的入门 <code class="docutils literal notranslate"><span class="pre">Vulkan</span></code> ,还是大致过一遍 <code class="docutils literal notranslate"><span class="pre">Vulkan</span></code> 的核心思路,这对以后的学习很有帮助。</p>
Expand Down Expand Up @@ -745,7 +746,12 @@ <h3>Vulkan 函数分类<a class="headerlink" href="#id9" title="Link to this hea
</div>
<div class="note admonition">
<p class="admonition-title">vkGetInstanceProcAddr 和 Device 域函数</p>
<p>在 <code class="docutils literal notranslate"><span class="pre">Vulkan</span></code> 中并没有禁止用户使用 <code class="docutils literal notranslate"><span class="pre">vkGetInstanceProcAddr</span></code> 获得 <code class="docutils literal notranslate"><span class="pre">Device</span></code> 域函数,但这是不推荐的,当有多个硬件设备时会造成模棱两可的函数获取。比如电脑上插着两个显卡,一个是摩尔线程的,一个是景嘉微的,这两个设备都支持绘制函数 <code class="docutils literal notranslate"><span class="pre">vkCmdDraw</span></code> 函数 ,但是到底获取的是哪个设备的实现是由 <code class="docutils literal notranslate"><span class="pre">Vulkan</span> <span class="pre">Loader</span></code> 定义的,用户并不能知道返回的函数是哪个设备的实现。</p>
<p>在 <code class="docutils literal notranslate"><span class="pre">Vulkan</span></code> 中并没有禁止用户使用 <code class="docutils literal notranslate"><span class="pre">vkGetInstanceProcAddr</span></code> 获得 <code class="docutils literal notranslate"><span class="pre">Device</span></code> 域函数,但这是不推荐的,当有多个硬件设备时会造成 “模棱两可” 的函数获取。比如电脑上插着两个显卡,一个是摩尔线程的,一个是景嘉微的,这两个设备都支持绘制函数 <code class="docutils literal notranslate"><span class="pre">vkCmdDraw</span></code> 函数 ,但是到底获取的是哪个设备的实现是由 <code class="docutils literal notranslate"><span class="pre">Vulkan</span> <span class="pre">Loader</span></code> 定义的,用户并不能知道返回的函数是哪个设备的实现。</p>
<div class="seealso admonition">
<p class="admonition-title">模棱两可的函数获取</p>
<p><code class="docutils literal notranslate"><span class="pre">vkGetInstanceProcAddr</span></code> 对于获取 <code class="docutils literal notranslate"><span class="pre">Device</span> <span class="pre">域</span></code> 函数:当调用这些 <code class="docutils literal notranslate"><span class="pre">Device</span> <span class="pre">域</span></code> 函数时 <span class="sd-sphinx-override sd-badge sd-bg-danger sd-bg-text-danger">一定</span> 是作用在某一个句柄(设备句柄或其子句柄)上,而句柄间有明确的子父关系 , <code class="docutils literal notranslate"><span class="pre">Vulkan</span> <span class="pre">Loader</span></code> 会根据句柄的子父关系查找到对应的设备句柄,并调用对应设备上的函数实现。
<code class="docutils literal notranslate"><span class="pre">Vulkan</span> <span class="pre">Loader</span></code> 在其中作为中间商进行了内部的函数调度,这种调度是需要消耗一部分调度时间的,为了得到更加高效的执行效率,推荐直接 <a class="reference internal" href="#get-deivce-function"><span class="std std-ref">获取 Device 域函数</span></a> 并调用,这将直接省去内部函数调度。</p>
</div>
</div>
</section>
<section id="vkgetinstanceprocaddr">
Expand Down Expand Up @@ -1582,7 +1588,7 @@ <h4>VkDeviceQueueCreateInfo<a class="headerlink" href="#vkdevicequeuecreateinfo"
</section>
</section>
<section id="device">
<h2>获取 Device 域函数<a class="headerlink" href="#device" title="Link to this heading">¶</a></h2>
<span id="get-deivce-function"></span><h2>获取 Device 域函数<a class="headerlink" href="#device" title="Link to this heading">¶</a></h2>
<p>在创建完逻辑设备 <code class="docutils literal notranslate"><span class="pre">VkDevice</span></code> 之后,与 <code class="docutils literal notranslate"><span class="pre">VkDevice</span></code> 及其产生的子对象(句柄)的所有交互函数都属于 <code class="docutils literal notranslate"><span class="pre">Device</span> <span class="pre">域函数</span></code> 。我们通过 <code class="docutils literal notranslate"><span class="pre">Vulkan</span></code> 提供的 <code class="docutils literal notranslate"><span class="pre">vkGetDeviceProcAddr</span></code> 函数获取 <code class="docutils literal notranslate"><span class="pre">Device</span></code> 域函数。</p>
<section id="vkgetdeviceprocaddr">
<h3>vkGetDeviceProcAddr<a class="headerlink" href="#vkgetdeviceprocaddr" title="Link to this heading">¶</a></h3>
Expand Down
3 changes: 2 additions & 1 deletion Resource.html
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,7 @@ <h1>资源<a class="headerlink" href="#id1" title="Link to this heading">¶</a><
<li><p class="sd-card-text">2024/5/7 增加 <code class="docutils literal notranslate"><span class="pre">二维多级渐远纹理</span></code> 示例章节。</p></li>
<li><p class="sd-card-text">2024/5/7 增加 <code class="docutils literal notranslate"><span class="pre">多采样二维颜色附件纹理</span></code> 示例章节。</p></li>
<li><p class="sd-card-text">2024/5/7 增加 <code class="docutils literal notranslate"><span class="pre">深度-模板附件纹理</span></code> 示例章节。</p></li>
<li><p class="sd-card-text">2024/9/3 修正 <code class="docutils literal notranslate"><span class="pre">VkImageTiling</span></code> 打印错误。</p></li>
</ul>
</div>
</details><p><code class="docutils literal notranslate"><span class="pre">Vulkan</span></code> 中只有 <code class="docutils literal notranslate"><span class="pre">2</span></code> 种资源 :</p>
Expand Down Expand Up @@ -995,7 +996,6 @@ <h5>VkSampleCountFlagBits<a class="headerlink" href="#vksamplecountflagbits" tit
<p><span class="caption-text">单次采样与 <code class="docutils literal notranslate"><span class="pre">8</span></code> 次采样对比示意图</span><a class="headerlink" href="#id29" title="Link to this image"></a></p>
</figcaption>
</figure>
<p>其中 <code class="docutils literal notranslate"><span class="pre">VkImageCreateInfo::tiling</span></code><code class="docutils literal notranslate"><span class="pre">VkImageTiling</span></code> 类型定义如下:</p>
</section>
<section id="id11">
<h5>图片资源逻辑模型<a class="headerlink" href="#id11" title="Link to this heading"></a></h5>
Expand Down Expand Up @@ -1173,6 +1173,7 @@ <h5>多级渐远<a class="headerlink" href="#id13" title="Link to this heading">
<p class="admonition-title">多级渐远纹理内部数据</p>
<p>如上示意图中各级的渐远纹理中每个像素都是有确切图像值的,这些只是帮助您从逻辑上理解多级渐远,但是在实际通过 <code class="docutils literal notranslate"><span class="pre">vkCreateImage(...)</span></code> 创建带有多级渐远纹理中,图片数据全都是初始值(可能为 <code class="docutils literal notranslate"><span class="pre">0</span></code> )。每一级别的多级渐远图片中每个像素具体为何值,需要通过执行 <code class="docutils literal notranslate"><span class="pre">GPU指令</span></code> 手动运算赋值。这将会在之后的章节进行讲解。</p>
</div>
<p>其中 <code class="docutils literal notranslate"><span class="pre">VkImageCreateInfo::tiling</span></code><code class="docutils literal notranslate"><span class="pre">VkImageTiling</span></code> 类型定义如下:</p>
</section>
<section id="vkimagetiling">
<h5>VkImageTiling<a class="headerlink" href="#vkimagetiling" title="Link to this heading"></a></h5>
Expand Down
9 changes: 9 additions & 0 deletions ResourceAndMemory.html
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ <h1>资源与内存<a class="headerlink" href="#id1" title="Link to this heading
<li><p class="sd-card-text">2024/5/18 更新 <code class="docutils literal notranslate"><span class="pre">VkMemoryRequirements</span></code> 章节。</p></li>
<li><p class="sd-card-text">2024/5/21 更新 <code class="docutils literal notranslate"><span class="pre">VkMemoryRequirements</span></code> 章节。</p></li>
<li><p class="sd-card-text">2024/5/21 增加 <code class="docutils literal notranslate"><span class="pre">资源与设备内存绑定</span></code> 章节。</p></li>
<li><p class="sd-card-text">2024/9/6 更新 <code class="docutils literal notranslate"><span class="pre">对应关系</span></code> 章节。</p></li>
</ul>
</div>
</details><p><a class="reference external" href="./Resource.html">资源</a> 章节中我们知道一个资源仅仅是一个 <code class="docutils literal notranslate"><span class="pre">虚拟资源句柄</span></code> ,其本质上并没有相应的内存实体用于存储数据。所以在创建完资源后,需要分配内存并与资源进行绑定,用于之后的数据读写。</p>
Expand Down Expand Up @@ -420,6 +421,14 @@ <h3>VkMemoryRequirements<a class="headerlink" href="#vkmemoryrequirements" title
</pre></div>
</div>
<p>所以一个 <code class="docutils literal notranslate"><span class="pre">32</span></code> 位的 <code class="docutils literal notranslate"><span class="pre">VkMemoryRequirements::memoryTypeBits</span></code> 完全可以覆盖到所有的 <code class="docutils literal notranslate"><span class="pre">VkPhysicalDeviceMemoryProperties::memoryTypes</span></code> 对应索引。</p>
<p>示意图如下:</p>
<figure class="align-default" id="id7">
<img alt="../_static/memory_type_bits.png" src="../_static/memory_type_bits.png" />
<figcaption>
<p><span class="caption-text">memoryTypeBits 与 memoryTypes</span><a class="headerlink" href="#id7" title="Link to this image"></a></p>
</figcaption>
</figure>
<p>假如, <code class="docutils literal notranslate"><span class="pre">VkPhysicalDeviceMemoryProperties::memoryTypes</span></code><code class="docutils literal notranslate"><span class="pre">10</span></code> 个内存类型,其中 <code class="docutils literal notranslate"><span class="pre">VkMemoryRequirements::memoryTypeBits</span></code> 比特位为 <code class="docutils literal notranslate"><span class="pre">1</span></code> 所对应的内存索引的那个 <code class="docutils literal notranslate"><span class="pre">设备内存</span></code> 支持该为资源分配内存。</p>
</div>
</div>
<p>由于 <code class="docutils literal notranslate"><span class="pre">VkMemoryRequirements::memoryTypeBits</span></code> 中是按比特位存储的索引,所以我们需要遍历 <code class="docutils literal notranslate"><span class="pre">32</span></code> 位的每一位,来确定对应位是否为 <code class="docutils literal notranslate"><span class="pre">1</span></code> 。示例代码如下:</p>
Expand Down
12 changes: 12 additions & 0 deletions _sources/Changelog.md.txt
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 _sources/Overview.rst.txt
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 _sources/Resource.rst.txt
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 _sources/ResourceAndMemory.rst.txt
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 _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.
Binary file modified objects.inv
Binary file not shown.
2 changes: 1 addition & 1 deletion searchindex.js

Large diffs are not rendered by default.

0 comments on commit 37814b6

Please sign in to comment.