3.7 KiB
3.7 KiB
D3D12Common
D3D12 通用辅助函数集合,提供描述符大小、屏障创建、格式支持检查等功能。
头文件
#include <XCEngine/RHI/D3D12/D3D12Common.h>
命名空间
XCEngine::RHI
描述符大小函数
inline UINT GetDescriptorHandleIncrementSize(ID3D12Device* device, D3D12_DESCRIPTOR_HEAP_TYPE heapType)
获取描述符增量大小。
inline UINT GetRTVDescriptorSize(ID3D12Device* device)
获取 RTV 描述符大小。
inline UINT GetDSVDescriptorSize(ID3D12Device* device)
获取 DSV 描述符大小。
inline UINT GetCBV_SRV_UAVDescriptorSize(ID3D12Device* device)
获取 CBV/SRV/UAV 描述符大小。
inline UINT GetSamplerDescriptorSize(ID3D12Device* device)
获取 Sampler 描述符大小。
屏障创建函数
inline D3D12_RESOURCE_BARRIER CreateTransitionBarrier(...)
创建资源状态转换屏障。
参数:
resource: 目标资源stateBefore: 转换前状态stateAfter: 转换后状态subresource: 子资源索引(默认所有)
inline D3D12_RESOURCE_BARRIER CreateUAVBarrier(ID3D12Resource* resource = nullptr)
创建 UAV 屏障。
inline D3D12_RESOURCE_BARRIER CreateAliasingBarrier(...)
创建别名化屏障。
格式支持检查
inline bool CheckFormatSupport(ID3D12Device* device, DXGI_FORMAT format, D3D12_FORMAT_SUPPORT1 support1, D3D12_FORMAT_SUPPORT2 support2 = D3D12_FORMAT_SUPPORT2_NONE)
检查格式支持。
inline bool IsRenderTargetFormatSupported(ID3D12Device* device, DXGI_FORMAT format)
检查是否支持作为渲染目标。
inline bool IsDepthStencilFormatSupported(ID3D12Device* device, DXGI_FORMAT format)
检查是否支持作为深度模板。
inline bool IsShaderResourceFormatSupported(ID3D12Device* device, DXGI_FORMAT format)
检查 shader 是否可以读取该格式。
inline bool IsTextureFormatSupported(ID3D12Device* device, DXGI_FORMAT format)
检查是否支持作为纹理。
清除值创建
inline D3D12_CLEAR_VALUE CreateRenderTargetClearValue(DXGI_FORMAT format, float r = 0.0f, float g = 0.0f, float b = 0.0f, float a = 1.0f)
创建渲染目标清除值。
inline D3D12_CLEAR_VALUE CreateDepthStencilClearValue(DXGI_FORMAT format, float depth = 1.0f, uint8_t stencil = 0)
创建深度模板清除值。
视口和裁剪矩形
inline D3D12_VIEWPORT CreateViewport(float width, float height, float topLeftX = 0.0f, float topLeftY = 0.0f, float minDepth = 0.0f, float maxDepth = 1.0f)
创建视口。
inline D3D12_RECT CreateScissorRect(int left, int top, int right, int bottom)
创建裁剪矩形。
缓冲区视图
inline D3D12_VERTEX_BUFFER_VIEW CreateVertexBufferView(...)
创建顶点缓冲区视图。
inline D3D12_INDEX_BUFFER_VIEW CreateIndexBufferView(...)
创建索引缓冲区视图。
描述符句柄运算
inline D3D12_CPU_DESCRIPTOR_HANDLE GetCPUDescriptorHandle(...)
计算偏移后的 CPU 描述符句柄。
inline D3D12_GPU_DESCRIPTOR_HANDLE GetGPUDescriptorHandle(...)
计算偏移后的 GPU 描述符句柄。
使用示例
// Check format support
if (!IsRenderTargetFormatSupported(device, DXGI_FORMAT_R8G8B8A8_UNORM)) {
// Fall back to supported format
}
// Create barriers
D3D12_RESOURCE_BARRIER barriers[2];
barriers[0] = CreateTransitionBarrier(
resource, D3D12_RESOURCE_STATE_RENDER_TARGET,
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
barriers[1] = CreateUAVBarrier(uavResource);
// Set barriers
cmdList->ResourceBarrier(2, barriers);
// Create viewport
D3D12_VIEWPORT vp = CreateViewport(1920.0f, 1080.0f);
cmdList->RSSetViewports(1, &vp);
备注
- 所有函数为 inline,可在头文件中使用
- 这些是高频使用的辅助函数,避免重复代码