Skip to content

Commit f9a1dcd

Browse files
dxr 更新
1 parent f1e1740 commit f9a1dcd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+8550
-0
lines changed

PathTracing/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
book

PathTracing/book.toml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[book]
2+
authors = ["chenxiaolong"]
3+
language = "en"
4+
src = "src"
5+
title = "光线追踪"
6+
7+
[output.html]
8+
additional-css = ["./theme/css/catppuccin.css", "./theme/css/custom.css"]
9+
default-theme = "latte"
10+
preferred-dark-theme = "latte"
11+
12+
[preprocessor.katex]
13+
after = ["links"]

PathTracing/src/SUMMARY.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Summary
2+
- [Direct3D 12](dx12/dx12.md)
3+
- [Important Changes](dx12/important_changes.md)
4+
- [Hardware Feature Levels](dx12/hardware_feature_levels.md)
5+
- [Work submission in Direct3D 12](dx12/Work_submission_in_Direct3D12.md)
6+
- [Design Philosophy of Command Queues and Command Lists](dx12/design_philosophy.md)
7+
- [Creating and recording command lists and bundles](dx12/Creating_and_recording_command_lists_and_bundles.md)
8+
- [Executing and Synchronizing Command Lists](dx12/Executing_and_Synchronizing_Command_Lists.md)
9+
- [Managing Graphics Pipeline State in Dx12](dx12/managing_graphic_pipeline_state.md)
10+
- [Resource binding](dx12/resource_bingding_overview.md)
11+
12+
13+
14+
- [DirectX Raytracing](dxr/intro.md)
15+
- [overview](dxr/overview.md)
16+
- [Design goals](dxr/design_goals.md)
17+
- [Walkthrough](dxr/walkthrough/walkthrough.md)
18+
- [Initiating raytracing](dxr/walkthrough/initiating_raytracing.md)
19+
- [Ray](dxr/walkthrough/ray.md)
20+
- [Any hit shaders](dxr/walkthrough/any_hit_shaders.md)
21+
- [Closest hit shaders](dxr/walkthrough/closest_hit_shaders.md)
22+
- [TraceRay control flow](dxr/walkthrough/traceray_control_flow.md)
23+
- [Flags per ray](dxr/walkthrough/flags_per_ray.md)
24+
- [Instance masking](dxr/walkthrough/instance_masking.md)
25+
- [Callable Shader](dxr/walkthrough/callable_shaders.md)
26+
- [Resource Binding](dxr/walkthrough/resource_binding.md)
27+
- [Shader Identifier](dxr/walkthrough/shader_identifier.md)
28+
- [Inline Raytracing](dxr/walkthrough/inline_raytracing.md)
29+
- [Shader Execution Recording](dxr/walkthrough/shader_execution_recording.md)
30+
31+
- [HLSL](./hlsl.md)
32+
- [shader linking](./shaderlinking.md)
33+
- [变量定义](./变量定义.md)
34+

PathTracing/src/chapter_1.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Chapter 1

PathTracing/src/dx12/Creating_and_recording_command_lists_and_bundles.md

Lines changed: 371 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
2+
* * *
3+
4+
执行与同步命令列表
5+
=========
6+
7+
_发布日期:2021年12月30日_
8+
9+
在 Microsoft Direct3D 12 中,已不再存在以往版本中的立即模式(Immediate Mode)。相反,应用程序需要创建命令列表(Command List)和 Bundle,然后录制一组 GPU 指令。命令队列(Command Queue)用于提交命令列表以供执行。这种模型让开发者可以更高效地控制 GPU 和 CPU 的使用。
10+
11+
* * *
12+
13+
目录
14+
--
15+
16+
* [命令队列概述](#%E5%91%BD%E4%BB%A4%E9%98%9F%E5%88%97%E6%A6%82%E8%BF%B0)
17+
18+
* [初始化命令队列](#%E5%88%9D%E5%A7%8B%E5%8C%96%E5%91%BD%E4%BB%A4%E9%98%9F%E5%88%97)
19+
20+
* [执行命令列表](#%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4%E5%88%97%E8%A1%A8)
21+
22+
* [多命令队列访问资源](#%E5%A4%9A%E5%91%BD%E4%BB%A4%E9%98%9F%E5%88%97%E8%AE%BF%E9%97%AE%E8%B5%84%E6%BA%90)
23+
24+
* [使用命令队列围栏同步命令列表执行](#%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E9%98%9F%E5%88%97%E5%9B%B4%E6%A0%8F%E5%90%8C%E6%AD%A5%E5%91%BD%E4%BB%A4%E5%88%97%E8%A1%A8%E6%89%A7%E8%A1%8C)
25+
26+
* [同步命令队列访问的资源](#%E5%90%8C%E6%AD%A5%E5%91%BD%E4%BB%A4%E9%98%9F%E5%88%97%E8%AE%BF%E9%97%AE%E7%9A%84%E8%B5%84%E6%BA%90)
27+
28+
* [命令队列对 Tiled Resources 的支持](#%E5%91%BD%E4%BB%A4%E9%98%9F%E5%88%97%E5%AF%B9-tiled-resources-%E7%9A%84%E6%94%AF%E6%8C%81)
29+
30+
31+
* * *
32+
33+
命令队列概述
34+
------
35+
36+
Direct3D 12 中的命令队列取代了以往运行时与驱动程序在“立即模式”下隐式进行的同步方式。命令队列通过 API 明确地让开发者管理并发性、并行性与同步,带来了以下优势:
37+
38+
* 避免因隐式同步带来的性能损耗;
39+
40+
* 允许在更高层级实现同步,从而提升效率与准确性;
41+
42+
* 显式地暴露高开销操作,有助于优化。
43+
44+
45+
这些改进使以下场景成为可能或表现更好:
46+
47+
* **提升并行性**:应用可使用更深的队列来处理后台任务(如视频解码),同时保持前台任务的独立性;
48+
49+
* **异步与低优先级 GPU 工作**:低优先级的 GPU 操作可以与主线程并行执行,同时借助原子操作在不阻塞的情况下使用其他线程结果;
50+
51+
* **高优先级计算工作**:支持在 3D 渲染过程中中断,执行少量高优先级的计算任务,以便尽早返回结果供 CPU 继续处理。
52+
53+
54+
* * *
55+
56+
初始化命令队列
57+
-------
58+
59+
使用 `ID3D12Device::CreateCommandQueue` 方法可以创建命令队列。该方法接收一个 `D3D12_COMMAND_LIST_TYPE` 参数,用于指定队列类型,也就决定了可提交的命令类型。
60+
61+
常见队列类型如下:
62+
63+
* `D3D12_COMMAND_LIST_TYPE_DIRECT`
64+
65+
* `D3D12_COMMAND_LIST_TYPE_COMPUTE`
66+
67+
* `D3D12_COMMAND_LIST_TYPE_COPY`
68+
69+
70+
一般来说:
71+
72+
* **DIRECT 队列**可接受所有类型的命令;
73+
74+
* **COMPUTE 队列**仅接受计算和拷贝相关命令;
75+
76+
* **COPY 队列**仅接受拷贝命令。
77+
78+
79+
⚠️ 注意:**Bundle 只能被 Direct 类型的命令列表调用,不能直接提交到命令队列。**
80+
81+
* * *
82+
83+
执行命令列表
84+
------
85+
86+
在录制完命令列表并获取默认命令队列或创建自定义队列后,可调用 `ID3D12CommandQueue::ExecuteCommandLists` 执行命令列表。
87+
88+
* 应用可在多个线程中提交命令列表,运行时会按提交顺序串行化处理;
89+
90+
* 系统会校验提交的命令列表,如违反以下限制,调用将被忽略:
91+
92+
1. 命令列表是 Bundle 类型,而非 Direct;
93+
94+
2. 未调用 `ID3D12GraphicsCommandList::Close` 结束录制;
95+
96+
3. 录制后,对命令分配器调用了 `ID3D12CommandAllocator::Reset`
97+
98+
4. 命令队列围栏指示该命令列表的上次执行尚未完成;
99+
100+
5. 查询状态(BeginQuery / EndQuery)前后不匹配;
101+
102+
6. 资源状态转换(Resource Barriers)前后不匹配。
103+
104+
105+
详见:[使用资源屏障同步资源状态](#%E5%90%8C%E6%AD%A5%E5%91%BD%E4%BB%A4%E9%98%9F%E5%88%97%E8%AE%BF%E9%97%AE%E7%9A%84%E8%B5%84%E6%BA%90)
106+
107+
* * *
108+
109+
多命令队列访问资源
110+
---------
111+
112+
运行时对资源访问做出以下限制:
113+
114+
* **资源不能被多个命令队列同时写入**。当资源在某队列上处于可写状态时,该资源被认为是该队列独占,必须先转换为只读或 `COMMON` 状态后,才能被其他队列访问。
115+
116+
* **资源在只读状态下可以被多个队列同时访问**,甚至可跨进程共享。
117+
118+
119+
参考:[使用资源屏障同步资源状态](#%E5%90%8C%E6%AD%A5%E5%91%BD%E4%BB%A4%E9%98%9F%E5%88%97%E8%AE%BF%E9%97%AE%E7%9A%84%E8%B5%84%E6%BA%90)
120+
121+
* * *
122+
123+
使用命令队列围栏同步命令列表执行
124+
----------------
125+
126+
Direct3D 12 支持多个并行命令队列,这就要求开发者显式同步它们之间的依赖。例如:
127+
128+
* 等待计算队列的输出,才能在图形队列中进行渲染;
129+
130+
* 等待图形队列完成渲染,计算队列才能对资源进行写入。
131+
132+
133+
为此,Direct3D 12 提供了 **围栏(Fence)机制**,通过 `ID3D12Fence` 接口表示。
134+
135+
* 围栏是一个表示当前处理工作单元的整数;
136+
137+
* 应用调用 `ID3D12CommandQueue::Signal` 来更新围栏值;
138+
139+
* 可查询围栏的当前值以判断任务是否完成,从而决定是否启动下一步操作。
140+
141+
142+
* * *
143+
144+
同步命令队列访问的资源
145+
-----------
146+
147+
Direct3D 12 使用 **资源屏障(Resource Barrier)** 来声明资源状态的同步转换。例如:
148+
149+
* 将资源从 **着色器资源视图**(SRV)转换为 **渲染目标视图**(RTV);
150+
151+
* 在命令列表中管理这些资源状态转换;
152+
153+
* 开启调试层时,系统会验证资源状态转换是否合法。
154+
155+
156+
更多信息请参考:[使用资源屏障同步资源状态](https://learn.microsoft.com/en-us/windows/win32/direct3d12/use-resource-barriers-to-synchronize-resource-states)
157+
158+
* * *
159+
160+
命令队列对 Tiled Resources 的支持
161+
-------------------------
162+
163+
Direct3D 11 中的 `ID3D11DeviceContext2` 提供了对 **Tiled Resources**(瓦片资源)的支持;在 D3D12 中,这些方法由 `ID3D12CommandQueue` 提供:
164+
165+
| 方法 | 描述 |
166+
| --- | --- |
167+
| `CopyTileMappings` | 将瓦片资源的映射从源复制到目标资源 |
168+
| `UpdateTileMappings` | 更新瓦片资源与内存堆中位置的映射 |
169+
170+
详情请参考:[Direct3D 11 Tiled Resources](https://learn.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-tiled-resources-intro)
171+
172+
* * *
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
* * *
3+
4+
🎮 Direct3D 12 中的工作提交机制
5+
=======================
6+
7+
> 📅 发布时间:2021年12月30日
8+
9+
* * *
10+
11+
🧠 概述
12+
-----
13+
14+
为提升 **Direct3D 应用的 CPU 使用效率**,自 Direct3D 12 起,不再支持与设备直接关联的 **立即上下文(Immediate Context)**
15+
16+
* * *
17+
18+
📦 新机制:命令列表(Command Lists)
19+
--------------------------
20+
21+
在 D3D12 中,应用程序需遵循如下流程:
22+
23+
1. **记录命令列表(Command Lists)**
24+
将绘制指令和资源管理调用记录下来。
25+
26+
2. **提交命令列表**
27+
可从多个线程同时将命令列表提交至一个或多个 **命令队列(Command Queues)**,这些队列负责管理命令的执行。
28+
29+
30+
* * *
31+
32+
🚀 性能提升点
33+
--------
34+
35+
这一机制的优势如下:
36+
37+
* **提高单线程效率**
38+
允许应用程序**预先计算渲染工作**并进行重复利用。
39+
40+
* **更好利用多核系统**
41+
渲染工作可以**分布到多个线程**,充分利用 CPU 多核能力。
42+
43+
44+
* * *
45+
46+
📝 总结
47+
-----
48+
49+
D3D12 的核心理念是:“**命令列表先录制,后执行,支持多线程并发提交**”,从根本上区别于 D3D11 的立即执行模式。这为游戏和图形应用提供了更高的灵活性和效率。

0 commit comments

Comments
 (0)