27 KiB
第二阶段计划:RHI 渲染硬件抽象层
目标:构建跨平台的渲染硬件抽象层,支持多后端(D3D12、Vulkan等) 阶段:第二阶段 前置依赖:第一阶段核心基础层(数学库、内存管理、线程系统)
2.1 阶段目标
实现完整的RHI抽象层,提供:
- 统一的图形API抽象接口
- D3D12后端完整实现
- 资源管理(纹理、缓冲区)
- 命令流提交机制
- 同步与同步原语
2.2 目录结构
engine/include/XCEngine/RHI/ # 渲染硬件抽象层(公开API)
├── Enums.h # 枚举定义(独立编号,跨平台)
├── Types.h # 通用类型定义
├── RHISystem.h # RHI 系统入口
├── RHIDevice.h # 抽象设备接口
├── Resource.h # 资源基类接口
├── ResourceView.h # 资源视图基类接口
├── RenderTargetView.h # 渲染目标视图接口
├── DepthStencilView.h # 深度模板视图接口
├── ShaderResourceView.h # 着色器资源视图接口
├── UnorderedAccessView.h # 无序访问视图接口
├── ConstantBufferView.h # 常量缓冲区视图接口
├── CommandQueue.h # 命令队列
├── CommandList.h # 命令列表
├── CommandAllocator.h # 命令分配器
├── Fence.h # 同步围栏
├── DescriptorHeap.h # 描述符堆
├── QueryHeap.h # 查询堆
├── RootSignature.h # 根签名
├── PipelineState.h # 管线状态
├── Sampler.h # 采样器
├── SwapChain.h # 交换链
├── Texture.h # 纹理资源
├── Buffer.h # 缓冲区资源
├── Shader.h # 着色器
└── D3D12/ # D3D12 后端实现
├── D3D12Enum.h # 枚举转换层(RHI→D3D12)
├── D3D12Device.h
├── D3D12Device.cpp
├── D3D12CommandList.h
├── D3D12CommandList.cpp
├── D3D12CommandQueue.h
├── D3D12CommandQueue.cpp
├── D3D12CommandAllocator.h
├── D3D12CommandAllocator.cpp
├── D3D12Fence.h
├── D3D12Fence.cpp
├── D3D12DescriptorHeap.h
├── D3D12DescriptorHeap.cpp
├── D3D12QueryHeap.h
├── D3D12QueryHeap.cpp
├── D3D12RootSignature.h
├── D3D12RootSignature.cpp
├── D3D12PipelineState.h
├── D3D12PipelineState.cpp
├── D3D12Sampler.h
├── D3D12Sampler.cpp
├── D3D12SwapChain.h
├── D3D12SwapChain.cpp
├── D3D12Texture.h
├── D3D12Texture.cpp
├── D3D12Buffer.h
├── D3D12Buffer.cpp
├── D3D12Shader.h
├── D3D12Shader.cpp
├── D3D12RenderTargetView.h
├── D3D12RenderTargetView.cpp
├── D3D12DepthStencilView.h
├── D3D12DepthStencilView.cpp
├── D3D12ShaderResourceView.h
├── D3D12ShaderResourceView.cpp
├── D3D12UnorderedAccessView.h
├── D3D12UnorderedAccessView.cpp
├── D3D12ConstantBufferView.h
├── D3D12ConstantBufferView.cpp
└── D3D12Common.h # 公共定义
2.3 任务拆分
2.3.1 基础枚举与类型定义
任务 2.1:Enums.h - 枚举定义
定义所有渲染相关的枚举类型:
Format- 像素格式ResourceStates- 资源状态ShaderType- 着色器类型PrimitiveTopology- 图元拓扑CullMode/FillMode- 剔除/填充模式BlendOp/BlendFactor- 混合操作/因子ComparisonFunc- 比较函数StencilOp- 模板操作TextureType- 纹理类型BufferType- 缓冲区类型QueryType- 查询类型DescriptorType- 描述符类型PipelineType- 管线类型CommandQueueType- 命令队列类型LoadAction/StoreAction- 渲染目标加载/存储操作PresentFlags- 呈现标志IndirectDrawArguments- 间接绘制参数IndirectDispatchArguments- 间接调度参数
任务 2.1.2:类型定义 - Types.h
定义通用结构体(不依赖特定图形API):
Viewport- 视口Rect- 矩形区域Color- 颜色ClearValue- 清空值ShaderCompileDesc- 着色器编译描述ShaderCompileResult- 着色器编译结果ShaderCompileMacro- 着色器宏定义InputElementDesc- 输入元素描述InputLayoutDesc- 输入布局描述VertexBufferBinding- 顶点缓冲区绑定TextureCopyLocation- 纹理复制位置DescriptorHandle- 描述符句柄(通用类型)GPUDescriptorHandle- GPU描述符句柄CPUDescriptorHandle- CPU描述符句柄ResourceBarrierDesc- 资源屏障描述SubresourceRange- 子资源范围TextureDesc- 纹理描述BufferDesc- 缓冲区描述RenderTargetDesc- 渲染目标描述DepthStencilDesc- 深度模板描述DescriptorHeapDesc- 描述符堆描述CommandQueueDesc- 命令队列描述CommandListDesc- 命令列表描述CommandAllocatorDesc- 命令分配器描述FenceDesc- 围栏描述QueryHeapDesc- 查询堆描述RootSignatureDesc- 根签名描述SamplerDesc- 采样器描述PipelineStateDesc- 管线状态描述SwapChainDesc- 交换链描述BlendStateDesc- 混合状态描述DepthStencilStateDesc- 深度模板状态描述RasterizerStateDesc- 光栅化状态描述ShaderBytecode- 着色器字节码ShaderBindingInfo- 着色器绑定信息RenderTargetViewDesc- 渲染目标视图描述DepthStencilViewDesc- 深度模板视图描述ShaderResourceViewDesc- 着色器资源视图描述UnorderedAccessViewDesc- 无序访问视图描述ConstantBufferViewDesc- 常量缓冲区视图描述FormatSupport- 格式支持信息
2.3.2 核心接口定义
任务 2.2:RHISystem.h - RHI系统入口
struct RHISystemConfig {
void* nativeWindowHandle = nullptr; // HWND on Windows
uint32_t width = 1280;
uint32_t height = 720;
bool fullscreen = false;
uint32_t backBufferCount = 2;
bool enableDebugLayer = false;
bool enableGBV = false;
};
class RHISystem {
public:
static RHISystem& Get();
bool Initialize(const RHISystemConfig& config);
void Shutdown();
IRHIDevice* GetDevice();
ISwapChain* GetSwapChain();
void BeginFrame();
void EndFrame();
// 窗口管理
void Resize(uint32_t width, uint32_t height);
void SetFullscreen(bool fullscreen);
bool IsFullscreen() const;
private:
std::unique_ptr<IRHIDevice> m_device;
std::unique_ptr<ISwapChain> m_swapChain;
};
任务 2.3:RHIDevice.h - 抽象设备接口
struct DeviceInfo {
String deviceName;
String driverVersion;
uint64_t dedicatedVideoMemory;
uint64_t dedicatedSystemMemory;
uint64_t sharedSystemMemory;
uint32_t vendorId;
uint32_t deviceId;
bool supportsRaytracing;
bool supportsMeshShaders;
bool supportsSamplerFeedback;
};
class IRHIDevice {
public:
virtual ~IRHIDevice() = default;
// 资源创建
virtual ICommandQueue* CreateCommandQueue(const CommandQueueDesc& desc) = 0;
virtual ICommandList* CreateCommandList(const CommandListDesc& desc) = 0;
virtual ICommandAllocator* CreateCommandAllocator(const CommandAllocatorDesc& desc) = 0;
virtual IFence* CreateFence(const FenceDesc& desc) = 0;
virtual IDescriptorHeap* CreateDescriptorHeap(const DescriptorHeapDesc& desc) = 0;
virtual IQueryHeap* CreateQueryHeap(const QueryHeapDesc& desc) = 0;
virtual IRootSignature* CreateRootSignature(const RootSignatureDesc& desc) = 0;
virtual IPipelineState* CreatePipelineState(const PipelineStateDesc& desc) = 0;
virtual ISampler* CreateSampler(const SamplerDesc& desc) = 0;
virtual ITexture* CreateTexture(const TextureDesc& desc) = 0;
virtual IBuffer* CreateBuffer(const BufferDesc& desc) = 0;
virtual ISwapChain* CreateSwapChain(const SwapChainDesc& desc) = 0;
// 视图创建
virtual IRenderTargetView* CreateRenderTargetView(IResource* resource, const RenderTargetViewDesc& desc) = 0;
virtual IDepthStencilView* CreateDepthStencilView(IResource* resource, const DepthStencilViewDesc& desc) = 0;
virtual IShaderResourceView* CreateShaderResourceView(IResource* resource, const ShaderResourceViewDesc& desc) = 0;
virtual IUnorderedAccessView* CreateUnorderedAccessView(IResource* resource, const UnorderedAccessViewDesc& desc) = 0;
virtual IConstantBufferView* CreateConstantBufferView(IResource* resource, const ConstantBufferViewDesc& desc) = 0;
// 着色器编译
virtual IShader* CompileShader(const ShaderCompileDesc& desc) = 0;
// 查询
virtual void GetDeviceInfo(DeviceInfo& info) const = 0;
virtual FormatSupport GetFormatSupport(Format format) const = 0;
};
任务 2.4:CommandQueue.h - 命令队列接口
class ICommandQueue {
public:
virtual ~ICommandQueue() = default;
virtual void ExecuteCommandLists(uint32_t count, ICommandList** lists) = 0;
virtual void Signal(IFence* fence, uint64_t value) = 0;
virtual void Wait(IFence* fence, uint64_t value) = 0;
virtual uint64_t GetCompletedValue() = 0;
virtual void WaitForIdle() = 0;
virtual CommandQueueType GetType() const = 0;
virtual uint64_t GetTimestampFrequency() const = 0;
};
任务 2.5:CommandList.h - 命令列表接口
class ICommandList {
public:
virtual ~ICommandList() = default;
// 状态转换
virtual void TransitionBarrier(uint32_t count, const ResourceBarrierDesc* barriers) = 0;
virtual void UAVBarrier(IResource* resource = nullptr) = 0;
virtual void AliasBarrier(IResource* before, IResource* after) = 0;
// 渲染状态
virtual void SetPipelineState(IPipelineState* pso) = 0;
virtual void SetRootSignature(IRootSignature* signature) = 0;
virtual void SetViewport(const Viewport& viewport) = 0;
virtual void SetViewports(uint32_t count, const Viewport* viewports) = 0;
virtual void SetScissorRect(const Rect& rect) = 0;
virtual void SetScissorRects(uint32_t count, const Rect* rects) = 0;
virtual void SetPrimitiveTopology(PrimitiveTopology topology) = 0;
virtual void SetRenderTargets(uint32_t count, IResource** renderTargets, IResource* depthStencil) = 0;
// 绑定
virtual void SetVertexBuffer(uint32_t slot, IBuffer* buffer, uint32_t offset, uint32_t stride) = 0;
virtual void SetVertexBuffers(uint32_t startSlot, uint32_t count, const VertexBufferBinding* bindings) = 0;
virtual void SetIndexBuffer(IBuffer* buffer, uint32_t offset, Format indexFormat) = 0;
virtual void SetConstantBuffer(uint32_t rootParameterIndex, IBuffer* buffer, uint32_t offset, uint32_t size) = 0;
virtual void SetShaderResource(uint32_t rootParameterIndex, IResource* resource) = 0;
virtual void SetUnorderedAccess(uint32_t rootParameterIndex, IResource* resource) = 0;
virtual void SetDescriptorHeap(IDescriptorHeap* heap) = 0;
virtual void SetGraphicsDescriptorTable(uint32_t rootParameterIndex, GPUDescriptorHandle baseHandle) = 0;
virtual void SetComputeDescriptorTable(uint32_t rootParameterIndex, GPUDescriptorHandle baseHandle) = 0;
// 渲染状态设置
virtual void SetStencilRef(uint8_t stencilRef) = 0;
virtual void SetBlendFactor(const float blendFactor[4]) = 0;
virtual void SetDepthBias(float depthBias, float slopeScaledDepthBias, float depthBiasClamp) = 0;
// 绘制
virtual void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t startVertex, uint32_t startInstance) = 0;
virtual void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t startIndex, int32_t baseVertex, uint32_t startInstance) = 0;
virtual void DrawInstancedIndirect(IBuffer* argBuffer, uint32_t alignedByteOffset) = 0;
virtual void DrawIndexedInstancedIndirect(IBuffer* argBuffer, uint32_t alignedByteOffset) = 0;
// 清空
virtual void ClearRenderTargetView(IResource* renderTarget, const float color[4]) = 0;
virtual void ClearDepthStencilView(IResource* depthStencil, uint32_t clearFlags, float depth, uint8_t stencil) = 0;
virtual void ClearUnorderedAccessView(IResource* unorderedAccess, const float values[4]) = 0;
// 复制
virtual void CopyResource(IResource* dst, IResource* src) = 0;
virtual void CopyBuffer(IBuffer* dst, uint64_t dstOffset, IBuffer* src, uint64_t srcOffset, uint64_t size) = 0;
virtual void CopyTexture(ITexture* dst, const TextureCopyLocation& dstLocation, ITexture* src, const TextureCopyLocation& srcLocation) = 0;
// 查询
virtual void BeginQuery(IQueryHeap* queryHeap, QueryType type, uint32_t index) = 0;
virtual void EndQuery(IQueryHeap* queryHeap, QueryType type, uint32_t index) = 0;
virtual void ResolveQuery(IQueryHeap* queryHeap, QueryType type, uint32_t startIndex, uint32_t count, IBuffer* resultBuffer, uint64_t resultOffset) = 0;
// 提交
virtual void Close() = 0;
virtual void Reset(ICommandAllocator* allocator) = 0;
// 计算着色器
virtual void Dispatch(uint32_t threadGroupCountX, uint32_t threadGroupCountY, uint32_t threadGroupCountZ) = 0;
virtual void DispatchIndirect(IBuffer* argBuffer, uint32_t alignedByteOffset) = 0;
// Bundle (用于命令复用)
virtual void ExecuteBundle(ICommandList* bundle) = 0;
};
任务 2.6:其他核心接口
Resource.h- 资源基类接口(所有资源的共同基类)ResourceView.h- 资源视图基类接口RenderTargetView.h- 渲染目标视图接口DepthStencilView.h- 深度模板视图接口ShaderResourceView.h- 着色器资源视图接口UnorderedAccessView.h- 无序访问视图接口ConstantBufferView.h- 常量缓冲区视图接口CommandAllocator.h- 命令分配器接口
class ICommandAllocator {
public:
virtual ~ICommandAllocator() = default;
virtual void Reset() = 0;
virtual bool IsReady() const = 0;
};
Fence.h- 同步围栏接口
class IFence {
public:
virtual ~IFence() = default;
virtual void Signal(uint64_t value) = 0;
virtual void Wait(uint64_t value) = 0;
virtual uint64_t GetCompletedValue() = 0;
virtual void* GetEventHandle() = 0;
};
DescriptorHeap.h- 描述符堆接口
class IDescriptorHeap {
public:
virtual ~IDescriptorHeap() = default;
virtual CPUDescriptorHandle GetCPUDescriptorHandle(uint32_t index) = 0;
virtual GPUDescriptorHandle GetGPUDescriptorHandle(uint32_t index) = 0;
virtual uint32_t GetDescriptorCount() const = 0;
virtual DescriptorType GetType() const = 0;
};
QueryHeap.h- 查询堆接口
class IQueryHeap {
public:
virtual ~IQueryHeap() = default;
virtual void* GetNativeHandle() const = 0;
virtual QueryType GetType() const = 0;
virtual uint32_t GetCount() const = 0;
};
RootSignature.h- 根签名接口
class IRootSignature {
public:
virtual ~IRootSignature() = default;
virtual void* GetNativeHandle() const = 0;
virtual uint32_t GetParameterCount() const = 0;
};
PipelineState.h- 管线状态接口
class IPipelineState {
public:
virtual ~IPipelineState() = default;
virtual void* GetNativeHandle() const = 0;
virtual PipelineType GetType() const = 0;
};
Sampler.h- 采样器接口
class ISampler {
public:
virtual ~ISampler() = default;
virtual void* GetNativeHandle() const = 0;
};
SwapChain.h- 交换链接口
class ISwapChain {
public:
virtual ~ISwapChain() = default;
virtual uint32_t GetCurrentBackBufferIndex() = 0;
virtual IResource* GetBackBuffer(uint32_t index) = 0;
virtual void Present(uint32_t syncInterval, PresentFlags flags) = 0;
virtual void Resize(uint32_t width, uint32_t height) = 0;
virtual void SetFullscreen(bool fullscreen) = 0;
virtual bool IsFullscreen() const = 0;
virtual void* GetNativeHandle() const = 0;
};
Texture.h- 纹理资源接口
class ITexture : public IResource {
public:
virtual uint32_t GetWidth() const = 0;
virtual uint32_t GetHeight() const = 0;
virtual uint32_t GetDepth() const = 0;
virtual uint32_t GetMipLevels() const = 0;
virtual uint32_t GetArraySize() const = 0;
virtual Format GetFormat() const = 0;
virtual TextureType GetTextureType() const = 0;
virtual IShaderResourceView* GetOrCreateSRV() = 0;
virtual IRenderTargetView* GetOrCreateRTV(uint32_t mipSlice = 0, uint32_t arraySlice = 0) = 0;
virtual IDepthStencilView* GetOrCreateDSV(uint32_t mipSlice = 0, uint32_t arraySlice = 0) = 0;
virtual IUnorderedAccessView* GetOrCreateUAV(uint32_t mipSlice = 0, uint32_t arraySlice = 0) = 0;
};
Buffer.h- 缓冲区资源接口
class IBuffer : public IResource {
public:
virtual uint64_t GetSize() const = 0;
virtual uint32_t GetStride() const = 0;
virtual BufferType GetBufferType() const = 0;
virtual IConstantBufferView* GetOrCreateCBV() = 0;
virtual IShaderResourceView* GetOrCreateSRV() = 0;
virtual IUnorderedAccessView* GetOrCreateUAV() = 0;
};
Shader.h- 着色器接口
class IShader {
public:
virtual ~IShader() = default;
virtual const void* GetBytecode() const = 0;
virtual size_t GetBytecodeSize() const = 0;
virtual ShaderType GetType() const = 0;
virtual const InputLayoutDesc& GetInputLayout() const = 0;
virtual const ShaderBindingInfo& GetBindingInfo() const = 0;
};
RenderTarget.h- 渲染目标接口
class IRenderTarget {
public:
virtual ~IRenderTarget() = default;
virtual ITexture* GetTexture() = 0;
virtual IRenderTargetView* GetRTV() = 0;
virtual uint32_t GetWidth() const = 0;
virtual uint32_t GetHeight() const = 0;
virtual Format GetFormat() const = 0;
};
DepthStencil.h- 深度模板接口
class IDepthStencil {
public:
virtual ~IDepthStencil() = default;
virtual ITexture* GetTexture() = 0;
virtual IDepthStencilView* GetDSV() = 0;
virtual IShaderResourceView* GetSRV() = 0;
virtual uint32_t GetWidth() const = 0;
virtual uint32_t GetHeight() const = 0;
virtual Format GetFormat() const = 0;
};
任务 2.7:Resource.h - 资源基类接口
class IResource {
public:
virtual ~IResource() = default;
virtual void* GetNativeHandle() const = 0;
virtual ResourceStates GetState() const = 0;
virtual void SetState(ResourceStates state) = 0;
virtual uint64_t GetGPUAddress() const = 0;
virtual size_t GetSize() const = 0;
virtual const String& GetName() const = 0;
virtual void SetName(const String& name) = 0;
};
任务 2.8:ResourceView.h - 资源视图基类接口
class IResourceView {
public:
virtual ~IResourceView() = default;
virtual void* GetNativeHandle() const = 0;
virtual IResource* GetResource() const = 0;
};
2.3.3 D3D12 后端实现
任务 2.9:D3D12Common.h - 公共定义
D3D12相关的公共定义和辅助函数:
- 格式转换映射
- 描述符大小计算
- 资源状态转换
- 辅助工具函数
任务 2.10:D3D12Device - 设备实现
实现 D3D12Device 类:
- ID3D12Device 封装
- IDXGIFactory 创建与管理
- 所有资源创建接口实现
- 适配器信息查询
- 功能级别支持检测
- 内存信息查询
- 设备移除与恢复处理
任务 2.11:D3D12CommandQueue - 命令队列实现
实现 D3D12CommandQueue 类:
- ID3D12CommandQueue 封装
- 命令列表执行
- 围栏同步
- 时间戳频率查询
任务 2.12:D3D12CommandList - 命令列表实现
实现 D3D12CommandList 类:
- ID3D12GraphicsCommandList 封装
- 所有渲染命令实现
- 状态追踪与验证
- 资源追踪
任务 2.13:D3D12CommandAllocator - 命令分配器实现
实现 D3D12CommandAllocator 类:
- ID3D12CommandAllocator 封装
- 重置管理
任务 2.14:D3D12Fence - 围栏实现
实现 D3D12Fence 类:
- ID3D12Fence 封装
- CPU/GPU同步
- 事件句柄管理
任务 2.15:D3D12DescriptorHeap - 描述符堆实现
实现 D3D12DescriptorHeap 类:
- ID3D12DescriptorHeap 封装
- CPU/GPU描述符句柄管理
- 描述符分配/释放
- 堆增量大小计算
任务 2.16:D3D12RootSignature - 根签名实现
实现 D3D12RootSignature 类:
- ID3D12RootSignature 封装
- 根参数配置
- 描述符表布局
- 静态采样器
任务 2.17:D3D12PipelineState - 管线状态实现
实现 D3D12PipelineState 类:
- ID3D12PipelineState 封装
- 图形管线描述构建
- 计算管线描述构建
- 混合状态
- 深度模板状态
- 输入布局
- 顶点/像素着色器绑定
任务 2.18:D3D12Sampler - 采样器实现
实现 D3D12Sampler 类:
- D3D12_SAMPLER_DESC 封装
- 静态采样器支持
任务 2.19:D3D12QueryHeap - 查询堆实现
实现 D3D12QueryHeap 类:
- ID3D12QueryHeap 封装
- 时间戳查询
- 遮挡查询
- 流水线统计
任务 2.20:D3D12SwapChain - 交换链实现
实现 D3D12SwapChain 类:
- IDXGISwapChain3 封装
- 帧缓冲管理
- 呈现模式配置
- 完整屏幕支持
任务 2.21:D3D12Texture - 纹理实现
实现 D3D12Texture 类:
- ID3D12Resource 封装
- 纹理描述
- 子资源管理
- 视图创建(SRV, RTV, DSV, UAV)
- 状态管理
任务 2.22:D3D12Buffer - 缓冲区实现
实现 D3D12Buffer 类:
- ID3D12Resource 封装
- 缓冲区描述
- 视图创建(SRV, CBV, UAV)
- 上传堆管理
- 默认堆管理
任务 2.23:D3D12Shader - 着色器实现
实现 D3D12Shader 类:
- 着色器字节码管理
- 反射数据提取
- 输入布局构建
任务 2.24:D3D12RenderTargetView - 渲染目标视图实现
实现 D3D12RenderTargetView 类:
- ID3D12RenderTargetView 封装
- 描述符创建与管理
任务 2.25:D3D12DepthStencilView - 深度模板视图实现
实现 D3D12DepthStencilView 类:
- ID3D12DepthStencilView 封装
- 描述符创建与管理
任务 2.26:D3D12ShaderResourceView - 着色器资源视图实现
实现 D3D12ShaderResourceView 类:
- ID3D12ShaderResourceView 封装
- 描述符创建与管理
任务 2.27:D3D12UnorderedAccessView - 无序访问视图实现
实现 D3D12UnorderedAccessView 类:
- ID3D12UnorderedAccessView 封装
- 描述符创建与管理
任务 2.28:D3D12ConstantBufferView - 常量缓冲区视图实现
实现 D3D12ConstantBufferView 类:
- ID3D12ConstantBufferView 封装
- 描述符创建与管理
2.4 实现顺序
阶段 2.1: 基础枚举与类型 (1天)
├── 2.1.1 Enums.h [已完成]
│ └── RHI枚举定义(独立编号)
├── 2.1.2 Types.h (通用类型定义)
└── 2.1.3 D3D12Enum.h [已完成]
└── 枚举转换层(RHI→D3D12)
阶段 2.2: 核心接口定义 (3天)
├── 2.2.1 RHISystem.h
├── 2.2.2 RHIDevice.h
├── 2.2.3 Resource.h (资源基类)
├── 2.2.4 ResourceView.h (视图基类)
├── 2.2.5 CommandQueue.h
├── 2.2.6 CommandList.h
└── 2.2.7 其他接口文件
阶段 2.3: D3D12 后端实现 (7天)
├── 2.3.1 D3D12Common.h
├── 2.3.2 D3D12Device
├── 2.3.3 D3D12Resource / D3D12Texture / D3D12Buffer
├── 2.3.4 D3D12CommandQueue
├── 2.3.5 D3D12CommandList
├── 2.3.6 D3D12CommandAllocator
├── 2.3.7 D3D12Fence
├── 2.3.8 D3D12DescriptorHeap
├── 2.3.9 D3D12RootSignature
├── 2.3.10 D3D12PipelineState
├── 2.3.11 D3D12Sampler
├── 2.3.12 D3D12QueryHeap
├── 2.3.13 D3D12SwapChain
├── 2.3.14 D3D12Shader
├── 2.3.15 D3D12RenderTargetView
├── 2.3.16 D3D12DepthStencilView
├── 2.3.17 D3D12ShaderResourceView
├── 2.3.18 D3D12UnorderedAccessView
└── 2.3.19 D3D12ConstantBufferView
阶段 2.4: 集成测试 (1天)
├── 窗口创建与交换链关联
├── 渲染循环基本框架
└── 简单的清屏测试
2.5 验收标准
- 编译通过:所有头文件和实现文件能够无错误编译
- 接口完整:所有定义的接口都有D3D12实现
- 功能验证:
- 能够创建窗口并初始化D3D12设备
- 能够创建命令队列和命令列表
- 能够执行基本的渲染命令(清屏)
- 能够处理窗口消息和呈现
- 代码质量:
- 遵循编码规范
- 必要的注释和文档
- 错误处理完善
2.6 关键技术点
2.6.1 资源状态管理
D3D12要求严格的状态管理:
- 资源必须处于正确的状态才能使用
- 状态转换通过
TransitionBarrier - 常用状态:
D3D12_RESOURCE_STATE_GENERIC_READ,D3D12_RESOURCE_STATE_RENDER_TARGET,D3D12_RESOURCE_STATE_DEPTH_WRITE等
2.6.2 描述符管理
- 描述符堆类型:CBV/SRV/UAV, Sampler, RTV, DSV
- GPU可见描述符堆用于渲染
- CPU可见描述符堆用于描述符拷贝
- 描述符递增大小计算
2.6.3 根签名设计
- 根参数类型:根常量、根描述符、根描述符表
- 描述符表:描述符数组
- 静态采样器:不可变的采样器配置
2.6.4 管线状态对象
- 图形管线:混合、深度、模板、光栅化、输入布局、顶点/像素/几何/ Hull/Domain着色器
- 计算管线:根签名、CS着色器
2.6.5 视图接口设计
- 每种视图类型(RTV/DSV/SRV/UAV/CBV)都有独立接口
- 视图持有对底层资源的引用
- 视图描述符确定资源的解释方式
2.6.6 着色器编译
- 使用D3DCompiler API或dxc编译HLSL
- 支持着色器反射获取输入布局和资源绑定信息
- 支持着色器宏定义和include处理
2.6.7 跨平台抽象设计原则
- 所有接口使用抽象类型,不暴露D3D12特定类型
- GPUDescriptorHandle/CPUDescriptorHandle 作为通用句柄类型
- 资源状态使用统一的ResourceStates枚举
- 创建描述符结构体独立于特定API
- RHI枚举使用独立编号,通过转换层转换为特定API枚举
2.6.8 枚举转换层
RHI枚举使用独立编号(与任何图形API无关),通过转换层转换为特定API:
// RHI枚举(独立编号)
enum class FillMode { Wireframe, Solid };
// D3D12转换层
inline D3D12_FILL_MODE ToD3D12(FillMode mode) {
switch (mode) {
case FillMode::Wireframe: return D3D12_FILL_MODE_WIREFRAME;
case FillMode::Solid: return D3D12_FILL_MODE_SOLID;
}
}
2.7 后续阶段依赖
- 第三阶段:渲染管线(RenderPipeline)需要RHI作为基础
- 材质系统需要RHI的Shader和PipelineState
- 场景渲染需要CommandList提交绘制命令