3.2 KiB
3.2 KiB
D3D12ResourceView
命名空间: XCEngine::RHI
类型: class
头文件: XCEngine/RHI/D3D12/D3D12ResourceView.h
描述: D3D12 后端统一的资源视图对象,既封装基于 descriptor heap 的 RTV/DSV/SRV/UAV/CBV,也承载顶点缓冲和索引缓冲视图所需的地址与步长信息。
概述
在 D3D12 里,“view”并不是一种单一机制:
RTV/DSV/SRV/UAV/CBV依赖 descriptor heap 和 descriptor handle。VBV/IBV则更像一段结构化的地址信息,不需要真实 descriptor。
D3D12ResourceView 把这些差异统一封装到了同一个 RHI 对象里。上层只需要拿到一个 RHIResourceView,具体是 descriptor handle 还是 buffer address,由 D3D12 后端自己决定。
这和商业引擎里常见的“view handle”思路一致: 渲染层谈的是“资源如何被用”,后端才决定到底是 heap slot、CPU/GPU descriptor handle,还是 GPU virtual address。
生命周期
- 通常由
D3D12Device的Create*View()工厂函数创建。 - descriptor-backed view 会在初始化时写入某个
D3D12DescriptorHeap槽位。 - 顶点 / 索引缓冲视图只缓存 GPU 地址、偏移、大小和 stride。
Shutdown只清空 view 自身状态;底层ID3D12Resource仍由纹理或缓冲对象拥有。
当前实现的真实行为
所有权
m_resource只是裸指针,不会AddRef。- 如果通过
SetOwnedHeap接管了 heap,view 会在Shutdown()时释放它。 - 如果只是借用了外部 heap,则调用方必须保证 heap 生命周期覆盖 view 的使用期。
descriptor-backed view
InitializeAsRenderTarget()/DepthStencil()/ShaderResource()/UnorderedAccess()/ConstantBuffer()都会计算CPU descriptor handle并调用ID3D12Device::Create*View()。- 这类 view 的
GetNativeHandle()返回的是CPU descriptor handle.ptr。 GetGPUHandle()只有在绑定了 heap 时才有意义。
buffer view
InitializeAsVertexBuffer()/InitializeAsIndexBuffer()不会创建 D3D12 descriptor。- 它们只缓存
GPU virtual address + offset、size、stride和格式。 GetNativeHandle()对这两类 view 返回底层ID3D12Resource*,而不是 descriptor handle。
当前限制
- buffer view 初始化时不做越界检查,
bufferLocation需要调用方自己保证合法。 CreateShaderResourceDesc这个 helper 只完整填写了Texture2D分支。GetBuffer*()系列字段主要只对顶点 / 索引缓冲视图有意义。
重点方法
- InitializeAsRenderTarget
- InitializeAsShaderResource
- InitializeAsVertexBuffer
- InitializeAsIndexBuffer
- SetOwnedHeap
- GetCPUHandle
- GetGPUHandle