對共享表面的紋理格式支持
驅動程序應支持共享資源和可共享的后臺緩沖區,以使用 DXGI_FORMAT 枚舉中的這些附加紋理格式:
- DXGI_FORMAT_A8_UNORM
- DXGI_FORMAT_R8_UNORM
- DXGI_FORMAT_R8G8_UNORM
- DXGI_FORMAT_BC1_TYPELESS\*
- DXGI_FORMAT_BC1_UNORM
- DXGI_FORMAT_BC1_UNORM_SRGB
- DXGI_FORMAT_BC2_TYPELESS\*
- DXGI_FORMAT_BC2_UNORM
- DXGI_FORMAT_BC2_UNORM_SRGB
- DXGI_FORMAT_BC3_TYPELESS\*
- DXGI_FORMAT_BC3_UNORM
- DXGI_FORMAT_BC3_UNORM_SRGB
此外,如果驅動程序在 Direct3D 功能級別 9 硬件上支持 Microsoft Direct3D 11 及更高版本,則應支持 DXGI_FORMAT_L8_UNORM 占位符格式。 DXGI_FORMAT_L8_UNORM 在功能上等效于 D3DDDIFMT_L8 格式。
驅動程序還應支持 來自 D3DDDIFORMAT 枚舉的其他紋理格式:
- D3DDDIFMT_G8R8
- D3DDDIFMT_R8
1. 核心支持格式列表
WDDM 驅動程序必須為 共享資源 和 可交換的后臺緩沖區 支持以下紋理格式:
(1) DXGI 格式(Direct3D 10/11/12)
格式 | 描述 | 典型用途 |
---|---|---|
DXGI_FORMAT_A8_UNORM | 8-bit 單通道 Alpha(無類型) | UI 蒙版、字體渲染 |
DXGI_FORMAT_R8_UNORM | 8-bit 單通道 Red | 灰度圖像、高度圖 |
DXGI_FORMAT_R8G8_UNORM | 16-bit 雙通道(Red+Green) | 法線貼圖、矢量場 |
DXGI_FORMAT_BC1_* | BC1 壓縮格式(DXT1) | 不透明/1-bit Alpha 紋理壓縮 |
DXGI_FORMAT_BC2_* | BC2 壓縮格式(DXT3) | 帶顯式 Alpha 的紋理壓縮 |
DXGI_FORMAT_BC3_* | BC3 壓縮格式(DXT5) | 帶插值 Alpha 的紋理壓縮 |
注:標有?
*_TYPELESS
?的格式需支持類型轉換(如?BC1_TYPELESS
?→?BC1_UNORM
)。
注:標有 *_TYPELESS 的格式需支持類型轉換(如 BC1_TYPELESS → BC1_UNORM)。
(2) D3DDDI 格式(Direct3D 9 兼容性)
格式 | 等效 DXGI 格式 | 描述 |
---|---|---|
D3DDDIFMT_L8_UNORM | DXGI_FORMAT_R8_UNORM | 8-bit 灰度(Direct3D 9 遺留) |
D3DDDIFMT_G8R8 | DXGI_FORMAT_R8G8_UNORM | 16-bit Green+Red |
D3DDDIFMT_R8 | DXGI_FORMAT_R8_UNORM | 8-bit Red |
2. 驅動實現要求
(1) 格式聲明
在 D3D10DDI_D3D11_OPTIONS 或 DXGI_DDI_BASE_ARGS 中聲明支持:
DXGI_DDI_BASE_ARGS BaseArgs = {0};
BaseArgs.DDIVersion = DXGI_DDI_VERSION_1_3;
BaseArgs.SupportedFormats.R8_UNORM = TRUE; // 示例:啟用 R8_UNORM
(2) 共享資源創建
處理 D3D11_DDI_RESOURCE_MISC_SHARED 標志的資源分配:
HRESULT CreateSharedResource(D3D10DDI_HDEVICE hDevice,CONST D3D11DDIARG_CREATERESOURCE* pArgs
) {if (pArgs->MiscFlags & D3D11_DDI_RESOURCE_MISC_SHARED) {ValidateFormat(pArgs->Format); // 檢查是否為支持的共享格式}// 正常創建資源...
}
(3) 跨 API 兼容性
Direct3D 9 → Direct3D 11 共享:
- 將 D3DDDIFMT_L8_UNORM 映射為 DXGI_FORMAT_R8_UNORM。
- 確保 D3DDDIFMT_G8R8 與 DXGI_FORMAT_R8G8_UNORM 數據布局一致。
3. 特殊場景處理
(1) Direct3D 9 硬件的 D3D11 支持
若硬件僅支持 Direct3D 9 功能級別,仍需通過占位符格式 DXGI_FORMAT_L8_UNORM 提供灰度支持:
// 在 GetCaps 中響應查詢
if (Type == D3DDDICAPS_GET_FORMAT_SUPPORT) {if (pArgs->Format == DXGI_FORMAT_L8_UNORM) {*(BOOL*)pData = TRUE; // 聲明支持}
}
(2) 壓縮紋理的共享
BCn 壓縮格式需保證跨進程/設備可訪問:
- 內存對齊:BC1/BC2/BC3 的塊大小為 4x4 像素。
- 禁止格式轉換(除非顯式指定 TYPELESS)。
4. WHCK 認證測試項
測試項 | 驗證目標 | 方法 |
---|---|---|
Device.Graphics.WDDM13.Format.Shared | 共享資源的格式支持正確性。 | 創建共享表面并跨進程讀寫驗證。 |
Device.Graphics.WDDM13.Format.BCn | BC 壓縮紋理的共享與渲染一致性。 | PIX 捕獲壓縮紋理數據。 |
Device.Graphics.WDDM13.Format.D3D9Compat | D3D9 遺留格式(如?L8_UNORM )的兼容性。 | D3D9 與 D3D11 互操作測試。 |
5. 調試與問題排查
常見問題:
- 共享失敗:檢查格式是否在 SupportedFormats 中聲明。
- 數據錯亂:驗證 D3DDDIFMT_G8R8 與 DXGI_FORMAT_R8G8_UNORM 的通道順序是否一致(G=R, R=G)。
工具推薦:
- PIX on Windows:捕獲共享表面的內存布局。
- DirectX Caps Viewer:檢查驅動聲明的格式支持。
6. 性能優化建議
- 壓縮紋理優先:對共享的靜態紋理(如 UI 素材)使用 BCn 壓縮以減少內存帶寬。
- 灰度優化:R8_UNORM/L8_UNORM 格式適合單通道數據(如遮罩),節省 75% 內存。
- 內存對齊:共享表面按 4KB 對齊,避免跨進程訪問的性能懲罰。
7. 總結
強制要求:WDDM 1.3+ 驅動必須支持上述格式以實現跨 API/進程資源共享。
關鍵點:
- 正確處理 D3DDDIFMT_* 與 DXGI_FORMAT_* 的映射關系。
- 壓縮紋理(BCn)需保證共享時的數據一致性。
兼容性:Direct3D 9 硬件需通過 L8_UNORM 提供灰度支持。