Files
XCEngine/docs/api/XCEngine/RHI/D3D12/D3D12ResourceView/D3D12ResourceView.md

3.2 KiB
Raw Blame History

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。

生命周期

  1. 通常由 D3D12DeviceCreate*View() 工厂函数创建。
  2. descriptor-backed view 会在初始化时写入某个 D3D12DescriptorHeap 槽位。
  3. 顶点 / 索引缓冲视图只缓存 GPU 地址、偏移、大小和 stride。
  4. Shutdown 只清空 view 自身状态;底层 ID3D12Resource 仍由纹理或缓冲对象拥有。

当前实现的真实行为

所有权

  • m_resource 只是裸指针,不会 AddRef
  • 如果通过 SetOwnedHeap 接管了 heapview 会在 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 + offsetsizestride 和格式。
  • GetNativeHandle() 对这两类 view 返回底层 ID3D12Resource*,而不是 descriptor handle。

当前限制

  • buffer view 初始化时不做越界检查,bufferLocation 需要调用方自己保证合法。
  • CreateShaderResourceDesc 这个 helper 只完整填写了 Texture2D 分支。
  • GetBuffer*() 系列字段主要只对顶点 / 索引缓冲视图有意义。

重点方法

相关文档