docs(rhi): document buffer init overload and sample quality

This commit is contained in:
2026-04-10 17:51:45 +08:00
parent 89bbad2786
commit cba3823ea2
14 changed files with 153 additions and 8 deletions

View File

@@ -37,6 +37,7 @@
| [SetTopology](SetTopology.md) | 写入 `m_topologyType`。 |
| [SetRenderTargetFormats](SetRenderTargetFormats.md) | 执行该公开方法对应的当前实现。 |
| [SetSampleCount](SetSampleCount.md) | 写入 `m_sampleCount`。 |
| [SetSampleQuality](SetSampleQuality.md) | 写入 `m_sampleQuality`,并影响最终 `D3D12_SAMPLE_DESC` 与 hash。 |
| [SetComputeShader](SetComputeShader.md) | 执行 `Reset``IsValid` 协同流程。 |
| [SetRootSignature](SetRootSignature.md) | 写入 `m_rootSignature`。 |
| [GetRasterizerState](GetRasterizerState.md) | 返回 `m_rasterizerDesc` 当前值。 |

View File

@@ -14,11 +14,12 @@ void SetSampleCount(uint32_t count) override;
## 作用
更新 `m_sampleCount`
更新 `m_sampleCount``quality` 维度现在由 [SetSampleQuality](SetSampleQuality.md) 单独负责
## 当前实现
- 会更新 `m_sampleCount`
- `D3D12_SAMPLE_DESC.Quality` 不在这里设置,而是在 `SetSampleQuality(...)` 中写入 `m_sampleQuality`
## 相关文档

View File

@@ -0,0 +1,28 @@
# D3D12PipelineState::SetSampleQuality
**命名空间**: `XCEngine::RHI`
**类型**: `method`
**头文件**: `XCEngine/RHI/D3D12/D3D12PipelineState.h`
## 签名
```cpp
void SetSampleQuality(uint32_t quality) override;
```
## 作用
更新 D3D12 后端缓存的 sample quality 值。
## 当前实现
- 会把参数写入 `m_sampleQuality`
- 该值会进入 `GetHash()``renderTargetHash`
- 在 graphics PSO 创建路径里,最终会写入 `D3D12_GRAPHICS_PIPELINE_STATE_DESC::SampleDesc.Quality`
## 相关文档
- [D3D12PipelineState](D3D12PipelineState.md)
- [SetSampleCount](SetSampleCount.md)

View File

@@ -26,7 +26,7 @@
- [Bind](Bind.md) 会优先绑定 compute program否则绑定 graphics program
- `Bind()` 之后只会调用 [Apply](Apply.md),即深度/模板、混合、光栅化三类状态
- [ApplyViewport](ApplyViewport.md) 与 [ApplyScissor](ApplyScissor.md) 需要单独调用
- [SetRenderTargetFormats](SetRenderTargetFormats.md)、[SetSampleCount](SetSampleCount.md)、[GetHash](GetHash.md) 目前基本是占位实现
- [SetRenderTargetFormats](SetRenderTargetFormats.md)、[SetSampleCount](SetSampleCount.md)、[SetSampleQuality](SetSampleQuality.md)、[GetHash](GetHash.md) 目前基本是占位实现
- [IsValid](IsValid.md) 永远返回 `true`
- [EnsureValid](EnsureValid.md) 为空实现
- [GetNativeHandle](GetNativeHandle.md) 只返回 graphics `m_program`

View File

@@ -6,12 +6,13 @@ void SetSampleCount(uint32_t count) override;
## 作用
为统一 RHI 接口预留采样数设置入口
为统一 RHI 接口预留 sample count 设置入口;`quality` 维度在 [SetSampleQuality](SetSampleQuality.md) 中单独暴露
## 当前实现行为
- 空实现
- `count` 当前不会被缓存,也不会驱动 `GL_MULTISAMPLE` 之外的任何行为
- OpenGL 后端当前也不会在这里处理 sample quality
## 相关文档

View File

@@ -0,0 +1,20 @@
# OpenGLPipelineState::SetSampleQuality()
```cpp
void SetSampleQuality(uint32_t quality) override;
```
## 作用
为跨后端 `RHIPipelineState` 接口保留 sample quality 入口。
## 当前实现行为
- 空实现。
- `quality` 当前不会被缓存,也不会映射到额外的 OpenGL 状态。
- 现阶段 OpenGL 后端的多采样行为仍主要落在 rasterizer 状态里的 `multisampleEnable`
## 相关文档
- [OpenGLPipelineState](OpenGLPipelineState.md)
- [SetSampleCount](SetSampleCount.md)

View File

@@ -10,15 +10,35 @@
```cpp
virtual RHIBuffer* CreateBuffer(const BufferDesc& desc) = 0;
virtual RHIBuffer* CreateBuffer(
const BufferDesc& desc,
const void* initialData,
size_t initialDataSize,
ResourceStates finalState = ResourceStates::GenericRead);
```
## 作用
纯虚接口
创建 `RHIBuffer`。当前既有后端必须实现的基础重载,也有基类直接提供的“创建并写入初始数据”便捷重载
## 当前实现
- 该声明是纯虚接口,基类不提供实现。
- `CreateBuffer(const BufferDesc& desc)`
- 仍然是纯虚接口,具体后端必须提供基础 buffer 创建逻辑。
- `CreateBuffer(desc, initialData, initialDataSize, finalState)`
-`initialData == nullptr``initialDataSize == 0` 时,会回退到基础重载。
-`initialDataSize > desc.size` 时,返回 `nullptr`
- 成功创建后会先调用 `buffer->SetData(...)` 写入初始数据。
-`initialDataSize < desc.size`,会把剩余空间补零。
- 最后会调用 `buffer->SetState(finalState)`
当前 `VulkanDevice` / `OpenGLDevice` 只实现了基础重载,因此会走基类默认实现;`D3D12Device` 另外提供了后端自定义重载。
## 真实调用点
- `engine/src/Rendering/Caches/RenderResourceCache.cpp`
- 当前体积 payload 上传路径会用这个重载创建 storage buffer并把最终状态设置为 `GenericRead`
## 相关文档

View File

@@ -56,6 +56,7 @@
- [CreateSwapChain](CreateSwapChain.md)
`CreateTexture()` 还有一个带 `initialData``rowPitch` 的重载,允许直接创建并上传初始数据。
`CreateBuffer()` 现在也有一个由基类提供默认实现的带初始数据重载,可在创建后立即写入 payload、补零剩余区间并设置最终资源状态。
### 执行与同步
@@ -88,6 +89,24 @@
从接口形状就能看出,当前 `RHIDevice` 同时承担了资源创建器、视图工厂、descriptor 工厂和 pipeline 工厂的职责。
### Buffer 初始化重载
`RHIDevice.h` 当前新增了:
```cpp
virtual RHIBuffer* CreateBuffer(
const BufferDesc& desc,
const void* initialData,
size_t initialDataSize,
ResourceStates finalState = ResourceStates::GenericRead);
```
它不是新的纯虚接口,而是基类直接给出的默认实现。对调用方来说,这意味着:
1. 非 D3D12 后端即使只实现了基础 `CreateBuffer(const BufferDesc&)`,也天然获得了“创建后写入初始数据”的统一入口。
2. 这个重载会在必要时自动把剩余空间补零,并把 buffer 状态切到 `finalState`
3. 当前 `RenderResourceCache` 的体积 payload 上传已经在使用这一路径。
## 所有权约定
这是这页最关键的现实语义。

View File

@@ -32,6 +32,7 @@
- [SetTopology](SetTopology.md)
- [SetRenderTargetFormats](SetRenderTargetFormats.md)
- [SetSampleCount](SetSampleCount.md)
- [SetSampleQuality](SetSampleQuality.md)
### 计算路径
@@ -110,6 +111,7 @@
- [SetTopology](SetTopology.md)
- [SetRenderTargetFormats](SetRenderTargetFormats.md)
- [SetSampleCount](SetSampleCount.md)
- [SetSampleQuality](SetSampleQuality.md)
- [SetComputeShader](SetComputeShader.md)
- [GetRasterizerState](GetRasterizerState.md)
- [GetBlendState](GetBlendState.md)

View File

@@ -14,11 +14,12 @@ virtual void SetSampleCount(uint32_t count) = 0;
## 作用
纯虚接口
设置多采样的 sample count 维度;当前接口已经把 sample quality 拆到独立的 [SetSampleQuality](SetSampleQuality.md)
## 当前实现
- 该声明是纯虚接口,基类不提供实现。
- 该声明是纯虚接口,基类不提供实现。
- 当前不要把它理解成“多采样配置的唯一入口”,因为 `quality` 已经是单独方法。
## 相关文档

View File

@@ -0,0 +1,30 @@
# RHIPipelineState::SetSampleQuality
**命名空间**: `XCEngine::RHI`
**类型**: `method`
**头文件**: `XCEngine/RHI/RHIPipelineState.h`
## 签名
```cpp
virtual void SetSampleQuality(uint32_t quality) = 0;
```
## 作用
设置多采样的 quality 维度;与 [SetSampleCount](SetSampleCount.md) 共同表达完整的 multisample 配置。
## 当前实现
- 该声明是纯虚接口,基类不提供实现。
- 各后端当前语义并不完全一致:
- D3D12 会把它写入 `D3D12_SAMPLE_DESC.Quality` 并纳入 pipeline hash。
- Vulkan 当前显式忽略这个参数。
- OpenGL 当前也是空实现。
## 相关文档
- [RHIPipelineState](RHIPipelineState.md)
- [SetSampleCount](SetSampleCount.md)

View File

@@ -6,12 +6,13 @@ void SetSampleCount(uint32_t count) override;
## 作用
更新缓存的采样数
更新缓存的 sample count`quality` 维度由 [SetSampleQuality](SetSampleQuality.md) 单独暴露
## 当前实现行为
- `count > 0` 时保存原值
- 否则回退为 `1`
- Vulkan 后端当前不会在这里处理 sample quality
## 相关文档

View File

@@ -0,0 +1,19 @@
# VulkanPipelineState::SetSampleQuality
```cpp
void SetSampleQuality(uint32_t quality) override;
```
## 作用
保留与抽象层一致的 sample quality 入口。
## 当前实现行为
- 当前实现显式 `(void)quality`,也就是直接忽略这个参数。
- Vulkan 后端当前只把 [SetSampleCount](SetSampleCount.md) 写入 `VkSampleCountFlagBits` 路径,没有额外的 sample quality 映射。
## 相关文档
- [VulkanPipelineState](VulkanPipelineState.md)
- [SetSampleCount](SetSampleCount.md)

View File

@@ -96,6 +96,7 @@
- `Bind()` / `Unbind()` 当前都是 no-op
- `GetHash()` 目前只用了拓扑和第一个 render target format 做轻量 hash
- `SetSampleQuality()` 当前显式忽略 `quality` 参数,只保留接口对齐
- `HasDepthStencilAttachment()` 只按 `m_depthStencilFormat` 是否为 `Unknown` 判断
## 线程语义
@@ -140,6 +141,7 @@
- `void SetTopology(uint32_t topologyType)`
- `void SetRenderTargetFormats(uint32_t count, const uint32_t* formats, uint32_t depthFormat)`
- `void SetSampleCount(uint32_t count)`
- `void SetSampleQuality(uint32_t quality)`
- `void SetComputeShader(RHIShader* shader)`
- `PipelineStateHash GetHash() const`
- `RHIShader* GetComputeShader() const`