docs(api): deepen D3D12 query heap and shader docs

This commit is contained in:
2026-03-28 00:40:56 +08:00
parent cd756ec9a3
commit 6bde199393
25 changed files with 464 additions and 420 deletions

View File

@@ -1,28 +1,20 @@
# D3D12QueryHeap::D3D12QueryHeap()
构造对象。
# D3D12QueryHeap::D3D12QueryHeap
```cpp
D3D12QueryHeap();
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12QueryHeap.h`,当前页面用于固定 `D3D12QueryHeap` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
构造一个空的 D3D12 query heap 包装对象
**返回:** `void` - 无返回值。
## 当前实现行为
**示例:**
```cpp
#include <XCEngine/RHI/D3D12/D3D12QueryHeap.h>
void Example() {
XCEngine::RHI::D3D12QueryHeap object;
}
```
- `m_type` 初始化为 `QueryType::Timestamp`
- `m_count` 初始化为 `0`
- `m_queryHeap` 为空
## 相关文档
- [返回类总览](D3D12QueryHeap.md)
- [返回模块目录](../D3D12.md)
- [Initialize](Initialize.md)
- [D3D12QueryHeap](D3D12QueryHeap.md)

View File

@@ -6,32 +6,78 @@
**头文件**: `XCEngine/RHI/D3D12/D3D12QueryHeap.h`
**描述**: 定义 `XCEngine/RHI/D3D12` 子目录中的 `D3D12QueryHeap` public API
**描述**: D3D12 后端的 query heap 包装,负责创建并保存 `ID3D12QueryHeap`,供命令列表执行 `BeginQuery``EndQuery``ResolveQueryData`
## 概
## 概
`D3D12QueryHeap.h` `XCEngine/RHI/D3D12` 子目录 下的 public header当前页面作为平行目录中的 canonical 总览,用于汇总该头文件暴露的主要声明
`D3D12QueryHeap`当前后端里比较薄的一层资源包装
## 声明概览
它主要做三件事:
| 声明 | 类型 | 说明 |
|------|------|------|
| `D3D12QueryHeap` | `class` | 头文件中的公开声明。 |
- 根据 [QueryType](../../RHITypes/RHITypes.md) 创建一个 `ID3D12QueryHeap`
- 记录 query 类型和数量
- 把原生 query heap 暴露给 [D3D12CommandList](../D3D12CommandList/D3D12CommandList.md) 这类低层调用方
## 公共方法
它当前不负责这些事情:
| 方法 | 描述 |
|------|------|
| [D3D12QueryHeap()](Constructor.md) | 构造对象。 |
| [~D3D12QueryHeap()](Destructor.md) | 销毁对象并释放相关资源。 |
| [Initialize](Initialize.md) | 初始化内部状态。 |
| [Shutdown](Shutdown.md) | 关闭并清理内部状态。 |
| [GetQueryHeap](GetQueryHeap.md) | 获取相关状态或对象。 |
| [GetNativeHandle](GetNativeHandle.md) | 获取相关状态或对象。 |
| [GetType](GetType.md) | 获取相关状态或对象。 |
| [GetCount](GetCount.md) | 获取相关状态或对象。 |
- 不分配结果缓冲区
- 不封装 `ResolveQueryData(...)` 的结果读取
- 不维护 query 槽位分配策略
- 不做 query 生命周期调度
## 设计定位
这类对象在商业级引擎里通常只是 query 系统的一小部分。完整方案往往还会包含:
- 结果缓冲与 readback 管理
- 时间戳校准与频率换算
- query 池复用
- frame graph / profiler 集成
当前 XCEngine 处于更早期、更基础的阶段,因此 `D3D12QueryHeap` 只先承担“创建原生 heap 并把它暴露出来”的职责。
## 生命周期
- 构造后默认类型为 `QueryType::Timestamp`,数量为 `0`
- [Initialize](Initialize.md) 成功后持有一个 `ID3D12QueryHeap`
- [Shutdown](Shutdown.md) 释放 COM 对象并把类型、数量复位
- 析构时自动调用 [Shutdown](Shutdown.md)
## 当前实现的真实行为
- `Initialize()` 根据 `QueryType` 选择 `D3D12_QUERY_HEAP_DESC::Type`
- `desc.NodeMask` 当前固定写成 `0`
- [Initialize](Initialize.md) 不读取 [QueryHeapDesc](../../RHITypes/RHITypes.md) 里的 `nodeMask`
- 不对 `device == nullptr``count == 0` 做前置保护,完全依赖 `CreateQueryHeap(...)` 的返回结果
- [GetNativeHandle](GetNativeHandle.md) 和 [GetQueryHeap](GetQueryHeap.md) 返回的是同一个原生指针
## 使用方式
当前典型调用链大致如下:
1. [D3D12Device](../D3D12Device/D3D12Device.md) 通过 `CreateQueryHeap(desc)` 创建对象
2. 调用方取出原生 `ID3D12QueryHeap*`
3. [D3D12CommandList](../D3D12CommandList/D3D12CommandList.md) 调用 `BeginQuery(...)``EndQuery(...)``ResolveQueryData(...)`
4. 结果写入单独的 buffer再由上层自己处理读回
## 当前限制
- 只封装 heap不封装 query 结果读取链路
- 不支持 node mask 透传
- 没有 query index 分配器
- 没有线程安全保证
- 当前工程里几乎没有直接针对它的单元测试覆盖
## 关键方法
- [Initialize](Initialize.md)
- [GetQueryHeap](GetQueryHeap.md)
- [GetType](GetType.md)
- [GetCount](GetCount.md)
- [Shutdown](Shutdown.md)
## 相关文档
- [当前目录](../D3D12.md) - 返回 `D3D12` 平行目录
- [API 总索引](../../../../main.md) - 返回顶层索引
- [D3D12](../D3D12.md)
- [D3D12CommandList](../D3D12CommandList/D3D12CommandList.md)
- [D3D12Device](../D3D12Device/D3D12Device.md)

View File

@@ -1,29 +1,19 @@
# D3D12QueryHeap::~D3D12QueryHeap()
销毁对象并释放相关资源。
# D3D12QueryHeap::~D3D12QueryHeap
```cpp
~D3D12QueryHeap();
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12QueryHeap.h`,当前页面用于固定 `D3D12QueryHeap` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
销毁 query heap 对象
**返回:** `void` - 无返回值。
## 当前实现行为
**示例:**
```cpp
#include <XCEngine/RHI/D3D12/D3D12QueryHeap.h>
void Example() {
XCEngine::RHI::D3D12QueryHeap object;
// 对象离开作用域时会自动触发析构。
}
```
- 析构函数内部直接调用 [Shutdown](Shutdown.md)
- 会释放持有的 `ID3D12QueryHeap`
## 相关文档
- [返回类总览](D3D12QueryHeap.md)
- [返回模块目录](../D3D12.md)
- [Shutdown](Shutdown.md)
- [D3D12QueryHeap](D3D12QueryHeap.md)

View File

@@ -1,30 +1,19 @@
# D3D12QueryHeap::GetCount
获取相关状态或对象。
```cpp
uint32_t GetCount() const;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12QueryHeap.h`,当前页面用于固定 `D3D12QueryHeap` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
返回当前 query heap 可容纳的 query 槽位数量
**返回:** `uint32_t` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
```cpp
#include <XCEngine/RHI/D3D12/D3D12QueryHeap.h>
void Example() {
XCEngine::RHI::D3D12QueryHeap object;
// 根据上下文补齐参数后调用 D3D12QueryHeap::GetCount(...)。
(void)object;
}
```
- 成功初始化后返回最后一次 [Initialize](Initialize.md) 传入的 `count`
- [Shutdown](Shutdown.md) 之后返回 `0`
## 相关文档
- [返回类总览](D3D12QueryHeap.md)
- [返回模块目录](../D3D12.md)
- [Initialize](Initialize.md)
- [GetType](GetType.md)

View File

@@ -1,30 +1,19 @@
# D3D12QueryHeap::GetNativeHandle
获取相关状态或对象。
```cpp
void* GetNativeHandle() const;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12QueryHeap.h`,当前页面用于固定 `D3D12QueryHeap` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
返回 query heap 的原生句柄表示
**返回:** `void*` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
```cpp
#include <XCEngine/RHI/D3D12/D3D12QueryHeap.h>
void Example() {
XCEngine::RHI::D3D12QueryHeap object;
// 根据上下文补齐参数后调用 D3D12QueryHeap::GetNativeHandle(...)。
(void)object;
}
```
- 直接返回 `m_queryHeap.Get()`
- 与 [GetQueryHeap](GetQueryHeap.md) 返回的是同一个底层对象,只是类型被擦成了 `void*`
## 相关文档
- [返回类总览](D3D12QueryHeap.md)
- [返回模块目录](../D3D12.md)
- [GetQueryHeap](GetQueryHeap.md)
- [D3D12QueryHeap](D3D12QueryHeap.md)

View File

@@ -1,30 +1,27 @@
# D3D12QueryHeap::GetQueryHeap
获取相关状态或对象。
```cpp
ID3D12QueryHeap* GetQueryHeap() const;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12QueryHeap.h`,当前页面用于固定 `D3D12QueryHeap` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
返回原生 `ID3D12QueryHeap*`
**返回:** `ID3D12QueryHeap*` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 直接返回 `m_queryHeap.Get()`
- 不做空指针保护
```cpp
#include <XCEngine/RHI/D3D12/D3D12QueryHeap.h>
## 使用场景
void Example() {
XCEngine::RHI::D3D12QueryHeap object;
// 根据上下文补齐参数后调用 D3D12QueryHeap::GetQueryHeap(...)
(void)object;
}
```
这是给低层 D3D12 调用方用的接口,例如命令列表需要它来执行:
- `BeginQuery(...)`
- `EndQuery(...)`
- `ResolveQueryData(...)`
## 相关文档
- [返回类总览](D3D12QueryHeap.md)
- [返回模块目录](../D3D12.md)
- [GetNativeHandle](GetNativeHandle.md)
- [D3D12CommandList](../D3D12CommandList/D3D12CommandList.md)

View File

@@ -1,30 +1,19 @@
# D3D12QueryHeap::GetType
获取相关状态或对象。
```cpp
QueryType GetType() const;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12QueryHeap.h`,当前页面用于固定 `D3D12QueryHeap` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
返回当前 query heap 记录的 query 类型
**返回:** `QueryType` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
```cpp
#include <XCEngine/RHI/D3D12/D3D12QueryHeap.h>
void Example() {
XCEngine::RHI::D3D12QueryHeap object;
// 根据上下文补齐参数后调用 D3D12QueryHeap::GetType(...)。
(void)object;
}
```
- 成功初始化后返回最后一次 [Initialize](Initialize.md) 传入的类型
- [Shutdown](Shutdown.md) 之后恢复为 `QueryType::Timestamp`
## 相关文档
- [返回类总览](D3D12QueryHeap.md)
- [返回模块目录](../D3D12.md)
- [Initialize](Initialize.md)
- [GetCount](GetCount.md)

View File

@@ -1,33 +1,46 @@
# D3D12QueryHeap::Initialize
初始化内部状态。
```cpp
bool Initialize(ID3D12Device* device, QueryType type, uint32_t count);
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12QueryHeap.h`,当前页面用于固定 `D3D12QueryHeap` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
- `device` - 参数语义详见头文件声明。
- `type` - 参数语义详见头文件声明。
- `count` - 参数语义详见头文件声明。
创建原生 `ID3D12QueryHeap`
**返回:** `bool` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 构造一个 `D3D12_QUERY_HEAP_DESC`
- `desc.Count = count`
- `desc.NodeMask = 0`
- 根据 `type` 选择:
- `QueryType::Timestamp` -> `D3D12_QUERY_HEAP_TYPE_TIMESTAMP`
- `QueryType::Occlusion` -> `D3D12_QUERY_HEAP_TYPE_OCCLUSION`
- `QueryType::PipelineStatistics` -> `D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS`
- 调用 `device->CreateQueryHeap(...)`
- 成功后缓存 `m_type``m_count`
```cpp
#include <XCEngine/RHI/D3D12/D3D12QueryHeap.h>
## 重要说明
void Example() {
XCEngine::RHI::D3D12QueryHeap object;
// 根据上下文补齐参数后调用 D3D12QueryHeap::Initialize(...)。
(void)object;
}
```
这里虽然在设备层有 [QueryHeapDesc](../../RHITypes/RHITypes.md) 抽象,但当前真正落到实现时,只使用了:
- `queryType`
- `count`
`nodeMask` 当前没有被透传。
## 当前限制
- 不检查 `device` 是否为空
- 不检查 `count` 是否为 `0`
- 不支持多节点配置
## 使用建议
如果你正在设计 profiler 或 occlusion 系统,应该把它理解成“原生 query heap 句柄创建器”,而不是完整的 query 子系统入口。
## 相关文档
- [返回类总览](D3D12QueryHeap.md)
- [返回模块目录](../D3D12.md)
- [GetQueryHeap](GetQueryHeap.md)
- [GetType](GetType.md)
- [GetCount](GetCount.md)

View File

@@ -1,30 +1,24 @@
# D3D12QueryHeap::Shutdown
关闭并清理内部状态。
```cpp
void Shutdown();
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12QueryHeap.h`,当前页面用于固定 `D3D12QueryHeap` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
释放原生 query heap 并复位本地状态
**返回:** `void` - 无返回值。
## 当前实现行为
**示例:**
- `m_queryHeap.Reset()`
- `m_type = QueryType::Timestamp`
- `m_count = 0`
```cpp
#include <XCEngine/RHI/D3D12/D3D12QueryHeap.h>
## 设计说明
void Example() {
XCEngine::RHI::D3D12QueryHeap object;
// 根据上下文补齐参数后调用 D3D12QueryHeap::Shutdown(...)。
(void)object;
}
```
当前类只持有一个 COM 对象,因此清理逻辑比较直接。它不会处理任何与 query 结果 buffer 相关的清理,因为那部分不属于这个类。
## 相关文档
- [返回类总览](D3D12QueryHeap.md)
- [返回模块目录](../D3D12.md)
- [Initialize](Initialize.md)
- [Destructor](Destructor.md)

View File

@@ -1,34 +1,38 @@
# D3D12Shader::Compile
公开方法,详见头文件声明。
```cpp
bool Compile(const void* sourceData, size_t sourceSize, const char* entryPoint, const char* target) override;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
- `sourceData` - 参数语义详见头文件声明。
- `sourceSize` - 参数语义详见头文件声明。
- `entryPoint` - 参数语义详见头文件声明。
- `target` - 参数语义详见头文件声明。
从内存中的 HLSL 源码编译 shader。
**返回:** `bool` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 调用 `D3DCompile(...)`
- 编译标志同样固定为 `D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION`
- 不提供文件名、宏或 include handler
- 失败时如果 `m_error` 非空,只调用 `OutputDebugStringA(errorMsg)`,不会像 [CompileFromFile](CompileFromFile.md) 一样写到 `stderr`
- 成功后按 `target` 推断类型
-`m_uniformsCached` 设为 `false`
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 使用场景
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::Compile(...)。
(void)object;
}
```
这个重载主要服务于:
- [D3D12Device](../D3D12Device/D3D12Device.md) 的内存源码编译路径
- 单元测试里的内嵌 HLSL 字符串
- 运行时生成 shader 文本的实验性场景
## 当前限制
- 仍然是 FXC 路径
- 没有源码来源名,编译报错定位体验弱于文件编译
- 类型推断依赖 `target` 字符串,而不是字节码内容
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [CompileFromFile](CompileFromFile.md)
- [GetBytecode](GetBytecode.md)
- [GetType](GetType.md)

View File

@@ -1,33 +1,44 @@
# D3D12Shader::CompileFromFile
公开方法,详见头文件声明。
```cpp
bool CompileFromFile(const wchar_t* filePath, const char* entryPoint, const char* target) override;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
- `filePath` - 参数语义详见头文件声明。
- `entryPoint` - 参数语义详见头文件声明。
- `target` - 参数语义详见头文件声明。
从 HLSL 文件编译 shader。
**返回:** `bool` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 调用 `D3DCompileFromFile(...)`
- 编译标志固定为 `D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION`
- 不传入自定义宏、include handler 或效果框架参数
- 如果失败且 `m_error` 非空:
- 调用 `OutputDebugStringA(errorMsg)`
- 调用 `fprintf(stderr, "[SHADER ERROR] %s\n", errorMsg)`
- 如果成功,则根据 `target` 推断 shader 类型
- 最后把 `m_uniformsCached` 设为 `false`
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 类型推断规则
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::CompileFromFile(...)。
(void)object;
}
```
- `target` 包含 `vs_` -> `ShaderType::Vertex`
- `target` 包含 `ps_` -> `ShaderType::Fragment`
- `target` 包含 `gs_` -> `ShaderType::Geometry`
- `target` 包含 `cs_` -> `ShaderType::Compute`
## 当前限制
- 不支持 DXC
- 不支持 include 搜索策略定制
- 不支持宏变体
- 如果 `target` 不匹配已知前缀,类型不会进入“未知”,而是保留旧值
## 使用建议
这是当前 D3D12 后端最常见的编译入口。测试和集成样例大量通过它把 `.hlsl` 文件转成可直接用于 PSO 的字节码。
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [Compile](Compile.md)
- [GetD3D12Bytecode](GetD3D12Bytecode.md)
- [GetType](GetType.md)

View File

@@ -1,28 +1,25 @@
# D3D12Shader::D3D12Shader()
构造对象。
# D3D12Shader::D3D12Shader
```cpp
D3D12Shader();
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
构造一个空的 D3D12 shader 对象
**返回:** `void` - 无返回值。
## 当前实现行为
**示例:**
- `m_type` 初始化为 `ShaderType::Vertex`
- `m_uniformsCached` 初始化为 `false`
- 字节码和错误 blob 为空
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 注意事项
void Example() {
XCEngine::RHI::D3D12Shader object;
}
```
默认类型是 `Vertex` 只是一个初始值,不代表对象已经包含可用的顶点着色器字节码。
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [CompileFromFile](CompileFromFile.md)
- [Compile](Compile.md)
- [D3D12Shader](D3D12Shader.md)

View File

@@ -6,38 +6,102 @@
**头文件**: `XCEngine/RHI/D3D12/D3D12Shader.h`
**描述**: 定义 `XCEngine/RHI/D3D12` 子目录中的 `D3D12Shader` public API
**描述**: D3D12 后端的 HLSL 编译结果包装,负责保存 FXC 生成的字节码,并提供轻量级的 shader 反射信息访问
## 概
## 概
`D3D12Shader.h` `XCEngine/RHI/D3D12` 子目录 下的 public header当前页面作为平行目录中的 canonical 总览,用于汇总该头文件暴露的主要声明
`D3D12Shader`当前 D3D12 后端里最核心的“编译期资源”之一
## 声明概览
它承担的职责包括:
| 声明 | 类型 | 说明 |
|------|------|------|
| `D3D12Shader` | `class` | 继承自 `RHIShader` 的公开声明。 |
- 通过 `D3DCompileFromFile(...)``D3DCompile(...)` 编译 HLSL
- 保存编译得到的 `ID3DBlob`
- 根据 profile 推断 shader 类型
- 在需要时用 `D3DReflect(...)` 延迟反射出一组简化后的 `UniformInfo`
## 公共方法
它当前不承担这些职责:
| 方法 | 描述 |
|------|------|
| [D3D12Shader()](Constructor.md) | 构造对象。 |
| [~D3D12Shader()](Destructor.md) | 销毁对象并释放相关资源。 |
| [CompileFromFile](CompileFromFile.md) | 公开方法,详见头文件声明。 |
| [Compile](Compile.md) | 公开方法,详见头文件声明。 |
| [Shutdown](Shutdown.md) | 关闭并清理内部状态。 |
| [GetD3D12Bytecode](GetD3D12Bytecode.md) | 获取相关状态或对象。 |
| [GetBytecode](GetBytecode.md) | 获取相关状态或对象。 |
| [GetBytecodeSize](GetBytecodeSize.md) | 获取相关状态或对象。 |
| [GetType](GetType.md) | 获取相关状态或对象。 |
| [GetInputLayout](GetInputLayout.md) | 获取相关状态或对象。 |
| [GetNativeHandle](GetNativeHandle.md) | 获取相关状态或对象。 |
| [IsValid](IsValid.md) | 查询当前状态。 |
| [GetUniformInfos](GetUniformInfos.md) | 获取相关状态或对象。 |
| [GetUniformInfo](GetUniformInfo.md) | 获取相关状态或对象。 |
- 不使用 DXC / DXIL 编译链
- 不管理 root signature
- 不自动生成输入布局
- 不暴露完整反射结果对象
- 不缓存编译宏、include handler 或编译配置对象
## 设计定位
从商业级引擎角度看shader 系统通常会拆成三层:
- 源文件与变体管理
- 编译产物缓存
- 运行时反射和资源绑定元数据
当前 `D3D12Shader` 主要覆盖了中间这一层,并且只提供了一个相对轻量的反射侧出口。它的目标是先让测试、示例和 PSO 创建链路跑通,而不是一步到位做成完整的 shader pipeline。
## 生命周期
- 构造后默认 `m_type = ShaderType::Vertex`
- [CompileFromFile](CompileFromFile.md) 或 [Compile](Compile.md) 成功后持有编译字节码
- [GetUniformInfos](GetUniformInfos.md) / [GetUniformInfo](GetUniformInfo.md) 会在首次访问时触发延迟反射
- [Shutdown](Shutdown.md) 释放字节码和错误 blob并清空缓存的 uniform 信息
- 析构时自动调用 [Shutdown](Shutdown.md)
## 当前实现的真实行为
- 编译后端使用的是 `D3DCompile*`,也就是 FXC 路径,而不是 DXC
- 编译标志固定为 `D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION`
- 类型判断完全依赖 `target` 字符串里是否包含 `vs_``ps_``gs_``cs_`
- 如果 `target` 不匹配上述前缀,`m_type` 会保持之前的值
- [GetNativeHandle](GetNativeHandle.md) 返回的是 `ID3DBlob*`
- [GetD3D12Bytecode](GetD3D12Bytecode.md) 返回的 `D3D12_SHADER_BYTECODE` 内部指针直接指向 `m_bytecode` 的内存
- [GetInputLayout](GetInputLayout.md) 当前基本只是返回一个内部缓存字段,但这份字段没有在编译过程中自动填充
- `UniformInfo` 反射是延迟执行的,但实现只提取了简化信息,不是完整反射模型
## 反射部分需要特别注意
当前 `CacheUniformInfos()` 只是一个“够用就好”的实现,存在几个重要限制:
- 只遍历 `BoundResources`
- `info.arraySize` 当前取自 `bindDesc.NumSamples`,而不是资源绑定数组长度
- 常量缓冲大小通过 `GetConstantBufferByIndex(bindDesc.BindPoint)` 查询这隐含了“bind point 恰好等于 reflection constant-buffer index”的假设
- `info.offset` 没有被填充,保持默认值
这意味着它更适合作为调试和轻量查询接口,而不是高可靠的绑定布局真相来源。
## 为什么这样设计
这套设计明显偏向“快速建立可工作的 D3D12 编译链路”:
- 集成测试和样例可以直接从 HLSL 文件生成字节码
- pipeline state 能直接拿到 `D3D12_SHADER_BYTECODE`
- 调用方还能通过简化反射读到资源绑定名称和槽位
代价是:
- 编译链现代化程度不高
- 反射信息不够完整
- 文档必须把“哪些数据是可靠的、哪些只是近似或当前实现细节”写清楚
## 当前限制
- 没有 DXC 支持
- 没有 include handler、自定义宏或多变体编译支持
- 不自动生成输入布局
- `GetType()``Shutdown()` 后不会恢复到“未知状态”,而是保留之前的类型值
- `UniformInfo` 中的数组大小和部分常量缓冲尺寸信息在复杂 shader 下可能不准确
- 当前工程里没有直接针对 D3D12 反射细节的专门单元测试
## 关键方法
- [CompileFromFile](CompileFromFile.md)
- [Compile](Compile.md)
- [GetD3D12Bytecode](GetD3D12Bytecode.md)
- [GetUniformInfos](GetUniformInfos.md)
- [GetUniformInfo](GetUniformInfo.md)
- [Shutdown](Shutdown.md)
## 相关文档
- [当前目录](../D3D12.md) - 返回 `D3D12` 平行目录
- [API 总索引](../../../../main.md) - 返回顶层索引
- [D3D12](../D3D12.md)
- [D3D12Device](../D3D12Device/D3D12Device.md)
- [D3D12PipelineState](../D3D12PipelineState/D3D12PipelineState.md)
- [RHIShader](../../RHIShader/RHIShader.md)

View File

@@ -1,29 +1,19 @@
# D3D12Shader::~D3D12Shader()
销毁对象并释放相关资源。
# D3D12Shader::~D3D12Shader
```cpp
~D3D12Shader() override;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
销毁 shader 对象
**返回:** `void` - 无返回值。
## 当前实现行为
**示例:**
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
void Example() {
XCEngine::RHI::D3D12Shader object;
// 对象离开作用域时会自动触发析构。
}
```
- 析构函数内部直接调用 [Shutdown](Shutdown.md)
- 会释放字节码 blob、错误 blob 和缓存的反射结果
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [Shutdown](Shutdown.md)
- [D3D12Shader](D3D12Shader.md)

View File

@@ -1,30 +1,23 @@
# D3D12Shader::GetBytecode
获取相关状态或对象。
```cpp
const void* GetBytecode() const;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
返回原始编译字节码缓冲的起始地址
**返回:** `const void*` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 如果 `m_bytecode` 有效,返回 `m_bytecode->GetBufferPointer()`
- 否则返回 `nullptr`
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 使用建议
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::GetBytecode(...)。
(void)object;
}
```
如果你要构建 D3D12 PSO优先使用 [GetD3D12Bytecode](GetD3D12Bytecode.md)。这个接口更适合调试、日志和外部序列化类场景。
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [GetBytecodeSize](GetBytecodeSize.md)
- [GetD3D12Bytecode](GetD3D12Bytecode.md)

View File

@@ -1,30 +1,23 @@
# D3D12Shader::GetBytecodeSize
获取相关状态或对象。
```cpp
size_t GetBytecodeSize() const;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
返回当前编译字节码的大小
**返回:** `size_t` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 如果 `m_bytecode` 有效,返回 `m_bytecode->GetBufferSize()`
- 否则返回 `0`
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 使用场景
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::GetBytecodeSize(...)。
(void)object;
}
```
集成测试和调试输出里常用它来确认 shader 是否成功编译并生成了非零字节码。
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [GetBytecode](GetBytecode.md)
- [IsValid](IsValid.md)

View File

@@ -1,30 +1,30 @@
# D3D12Shader::GetD3D12Bytecode
获取相关状态或对象。
```cpp
const D3D12_SHADER_BYTECODE GetD3D12Bytecode() const;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
返回可以直接提交给 D3D12 PSO 创建接口的 `D3D12_SHADER_BYTECODE` 结构
**返回:** `const D3D12_SHADER_BYTECODE` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 如果 `m_bytecode` 有效:
- `pShaderBytecode = m_bytecode->GetBufferPointer()`
- `BytecodeLength = m_bytecode->GetBufferSize()`
- 如果无效,返回零初始化结构
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 使用场景
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::GetD3D12Bytecode(...)。
(void)object;
}
```
这是 `D3D12PipelineState` 和 D3D12 集成样例最重要的接口之一,因为 `CreateGraphicsPipelineState(...)` / `CreateComputePipelineState(...)` 直接需要它。
## 注意事项
返回的是一个按值复制的结构体,但里面的指针仍然指向当前对象持有的 blob 内存。调用方必须保证 shader 对象在 PSO 使用该字节码期间仍然有效。
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [GetBytecode](GetBytecode.md)
- [GetBytecodeSize](GetBytecodeSize.md)
- [D3D12PipelineState](../D3D12PipelineState/D3D12PipelineState.md)

View File

@@ -1,30 +1,28 @@
# D3D12Shader::GetInputLayout
获取相关状态或对象。
```cpp
const InputLayoutDesc& GetInputLayout() const;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
返回当前 shader 对象内部保存的输入布局描述
**返回:** `const InputLayoutDesc&` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 直接返回 `m_inputLayout`
- 当前编译路径不会自动填充它
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 正确认识
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::GetInputLayout(...)。
(void)object;
}
```
这意味着对当前 D3D12 后端来说,[GetInputLayout](GetInputLayout.md) 不是一个可靠的“从 shader 自动反射出顶点输入布局”的接口。
实际图形 PSO 的输入布局更多来自:
- [GraphicsPipelineDesc](../../RHITypes/RHITypes.md) 里的显式 `inputLayout`
- [D3D12PipelineState](../D3D12PipelineState/D3D12PipelineState.md) 的配置
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [D3D12PipelineState](../D3D12PipelineState/D3D12PipelineState.md)
- [D3D12Shader](D3D12Shader.md)

View File

@@ -1,30 +1,23 @@
# D3D12Shader::GetNativeHandle
获取相关状态或对象。
```cpp
void* GetNativeHandle() override;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
返回 shader 的原生句柄表示
**返回:** `void*` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 返回 `m_bytecode.Get()`
- 也就是 `ID3DBlob*`
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 注意事项
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::GetNativeHandle(...)。
(void)object;
}
```
这不是某种“可直接绑定的 D3D12 shader 对象句柄”。D3D12 图形与计算着色器真正进入管线的方式,仍然是通过字节码构造 PSO。
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [GetD3D12Bytecode](GetD3D12Bytecode.md)
- [IsValid](IsValid.md)

View File

@@ -1,30 +1,25 @@
# D3D12Shader::GetType
获取相关状态或对象。
```cpp
ShaderType GetType() const override;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
返回当前对象记录的 shader 类型
**返回:** `ShaderType` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 直接返回 `m_type`
- 它由 [CompileFromFile](CompileFromFile.md) / [Compile](Compile.md) 根据 `target` 字符串更新
- [Shutdown](Shutdown.md) 不会重置它
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 注意事项
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::GetType(...)。
(void)object;
}
```
这个返回值反映的是“最近一次成功匹配到的 profile 前缀”,不是对字节码内容做实时解析得到的结论。
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [CompileFromFile](CompileFromFile.md)
- [Compile](Compile.md)
- [IsValid](IsValid.md)

View File

@@ -1,31 +1,26 @@
# D3D12Shader::GetUniformInfo
获取相关状态或对象。
```cpp
const UniformInfo* GetUniformInfo(const char* name) const override;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
- `name` - 参数语义详见头文件声明。
按名称查找一条简化的资源绑定信息。
**返回:** `const UniformInfo*` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 会先确保 [GetUniformInfos](GetUniformInfos.md) 的缓存已经建立
-`m_uniformInfos` 做线性遍历
- 找到同名项就返回其地址
- 否则返回 `nullptr`
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 注意事项
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::GetUniformInfo(...)。
(void)object;
}
```
- 这是线性查找,不是哈希表查找
- 返回的是内部缓存元素指针,只有在对象仍然有效且缓存未被清空时才可靠
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [GetUniformInfos](GetUniformInfos.md)
- [Shutdown](Shutdown.md)

View File

@@ -1,30 +1,42 @@
# D3D12Shader::GetUniformInfos
获取相关状态或对象。
```cpp
const std::vector<UniformInfo>& GetUniformInfos() const override;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
返回当前 shader 的简化资源绑定信息列表
**返回:** `const std::vector<UniformInfo>&` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 首次调用时会触发内部 `CacheUniformInfos()`
- `CacheUniformInfos()` 使用 `D3DReflect(...)` 获取 shader reflection
- 遍历 `shaderDesc.BoundResources`
- 为每个绑定资源生成一个 `UniformInfo`
- 后续调用直接返回缓存结果
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 当前反射内容
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::GetUniformInfos(...)。
(void)object;
}
```
每条 `UniformInfo` 至少会尝试填这些字段:
- `name`
- `bindPoint`
- `type`
- `size`
- `arraySize`
但需要注意:
- `arraySize` 当前来自 `bindDesc.NumSamples`
- `offset` 没有被填充
- 常量缓冲 `size` 的查询实现比较脆弱
## 使用建议
把它当成“当前 shader 里有哪些绑定资源的大概清单”是合理的;把它当成完整、严格、可直接驱动绑定系统的元数据来源则不够安全。
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [GetUniformInfo](GetUniformInfo.md)
- [D3D12Shader](D3D12Shader.md)

View File

@@ -1,30 +1,26 @@
# D3D12Shader::IsValid
查询当前状态。
```cpp
bool IsValid() const override;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
判断当前 shader 是否持有有效字节码
**返回:** `bool` - 返回值语义详见头文件声明。
## 当前实现行为
**示例:**
- 判断条件只有一个:`m_bytecode != nullptr`
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 这意味着什么
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::IsValid(...)。
(void)object;
}
```
只要 blob 存在,它就会返回 `true`。这个接口不检查:
- shader 类型是否符合当前用途
- 反射信息是否成功缓存
- 输入布局是否存在
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [GetNativeHandle](GetNativeHandle.md)
- [Shutdown](Shutdown.md)

View File

@@ -1,30 +1,34 @@
# D3D12Shader::Shutdown
关闭并清理内部状态。
```cpp
void Shutdown() override;
```
该方法声明于 `XCEngine/RHI/D3D12/D3D12Shader.h`,当前页面用于固定 `D3D12Shader` 类目录下的方法级 canonical 路径。
## 作用
**参数:**
释放编译结果和反射缓存
**返回:** `void` - 无返回值。
## 当前实现行为
**示例:**
- `m_bytecode.Reset()`
- `m_error.Reset()`
- `m_uniformInfos.clear()`
- `m_uniformsCached = false`
```cpp
#include <XCEngine/RHI/D3D12/D3D12Shader.h>
## 重要说明
void Example() {
XCEngine::RHI::D3D12Shader object;
// 根据上下文补齐参数后调用 D3D12Shader::Shutdown(...)。
(void)object;
}
```
当前实现不会重置:
- `m_type`
- `m_inputLayout`
因此在 [Shutdown](Shutdown.md) 之后:
- [IsValid](IsValid.md) 会变成 `false`
- 但 [GetType](GetType.md) 仍然可能返回上一次编译留下的 shader 类型
## 相关文档
- [返回类总览](D3D12Shader.md)
- [返回模块目录](../D3D12.md)
- [IsValid](IsValid.md)
- [GetType](GetType.md)
- [Destructor](Destructor.md)

View File

@@ -1,6 +1,6 @@
# API 文档重构状态
**生成时间**: `2026-03-28 00:24:57`
**生成时间**: `2026-03-28 00:40:20`
**来源**: `docs/api/_tools/audit_api_docs.py`