對于使用 Microsoft DirectX 光線追蹤應用程序的開發者而言,光線追蹤驗證可幫助您提高性能、發現難以調試的問題和崩潰的根本原因。
與現有調試解決方案不同,光線追蹤驗證會在驅動程序級別執行檢查,從而識別 D3D12 調試層等工具無法發現的潛在問題。警告和錯誤通過回調直接從驅動程序發送到應用程序,并通過現有的應用程序端調試或日志記錄系統進行處理。
強烈建議您在任何功能開發和功能測試期間盡可能啟用光線追蹤驗證。
要求
光線追蹤驗證需要 NVIDIA 驅動 551.61 及更高版本,以及 NVIDIA API(NvAPI)。
介于 545.00 和 551.61 之間的驅動程序版本也支持光線追蹤驗證。但是,在這些早期版本中,驗證速度可能會非常緩慢,令人望而卻步。我們建議升級到驅動程序 551.61 或更高版本。
啟用光線追蹤驗證
要啟用光線追蹤驗證,請將NV_ALLOW_RAYTRACING_VALIDATION=1
環境變量。
接下來,開發人員可以創建一個 Direct3D 12 設備,然后初始化 NVIDIA 圖形 API (NVAPI)。
在此設備上啟用光線追蹤驗證,NvAPI_D3D12_EnableRaytracingValidation
功能。
自定義NVAPI_D3D12_RAYTRACING_VALIDATION_MESSAGE_CALLBACK
將函數輸出到您選擇的調試器或日志記錄系統,然后將其注冊為NvAPI_D3D12_RegisterRaytracingValidationMessageCallback
。
在收到圍欄信號后或在設備移除處理程序中NvAPI_D3D12_FlushRaytracingValidationMessages
。
性能優化
運行具有光線追蹤驗證的應用程序會產生一定的性能成本。因此,應用程序不應該在啟用光線追蹤驗證的情況下運行。NV_ALLOW_RAYTRACING_VALIDATION=1
environment 變量可以防止最終用戶意外遇到任何性能下降。
NvAPI_D3D12_FlushRaytracingValidationMessages
對于調用時已在 GPU 上完成的工作,請向注冊的回調報告任何驗證消息。這使您能夠控制報告消息的粒度。至關重要的是,即使在設備移除錯誤之后,顯式刷新也能處理驗證消息。
應用示例
以下代碼示例展示了如何使用 NvAPI 在應用中啟用和使用光線追蹤驗證:
// Validation callback static void __stdcall myValidationMessageCallback( void * pUserData, NVAPI_D3D12_RAYTRACING_VALIDATION_MESSAGE_SEVERITY severity, const char * messageCode, const char * message, const char * messageDetails) { const char * severityString = "unknown" ; switch (severity) { case NVAPI_D3D12_RAYTRACING_VALIDATION_MESSAGE_SEVERITY_ERROR: severityString = "error" ; break ; case NVAPI_D3D12_RAYTRACING_VALIDATION_MESSAGE_SEVERITY_WARNING: severityString = "warning" ; break ; } fprintf (stderr, "Ray Tracing Validation message: %s: [%s] %s\n%s" , severityString, messageCode, message, messageDetails); fflush (stderr); } // Enable Ray Tracing Validation void onCreate() { NvAPI_Initialize(); ID3D12Device* device = MyCreateD3DDevice(); if (validationMode) { NvAPI_D3D12_EnableRaytracingValidation(device, NVAPI_D3D12_RAYTRACING_VALIDATION_FLAG_NONE); NvAPI_D3D12_RegisterRaytracingValidationMessageCallback(device, &myValidationMessageCallback, ( void *)&myCallbackData, &nvapiValidationCallbackHandle); } } // Flush the validation message after a fence signal void waitForGPU( UINT64 fenceValue) { fence->SetEventOnCompletion(fenceValue, fenceEvent); WaitForSingleObjectEx(fenceEvent, INFINITE, FALSE); if (validationMode) NvAPI_D3D12_FlushRaytracingValidationMessages(device); } // We highly recommend checking for DXGI_ERROR_DEVICE_REMOVED and flushing the validation message if this occurs void onDeviceRemoved() { // flushing after DXGI_ERROR_DEVICE_REMOVED is OK if (validationMode) NvAPI_D3D12_FlushRaytracingValidationMessages(device); } |
正在驗證的內容是什么?
光線追蹤驗證報告系統中發生的某些錯誤條件DispatchRays
和BuildRaytracingAccelerationStructure
會導致難以調試的錯誤或損壞。
例如,應用程序可能會為下一幀構建新的光線追蹤工作流,并更新當前幀仍在使用的著色器綁定表 (SBT).這可能會導致當前幀中 SBT 中缺少條目的潛在錯誤。光線追蹤驗證報告UNKNOWN_ENTRY_FUNCTION
錯誤以及特定于錯誤的詳細信息,指導您找到錯誤的根本原因。
驗證檢查DispatchRays
包括以下內容:
- 意外的 SBT 記錄著色器類型,例如在預期命中組時遇到錯過著色器條目。
- SBT 引用了不屬于管線的著色器。
- 越界 SBT 條目。
- 著色器負載類型不匹配,當調用的著色器期望的類型不同于傳遞給
TraceRay
。 - 已超過最大追蹤深度。
- 堆棧溢出。
驗證檢查BuildRaytracingAccelerationStructure
包括以下內容:
- 針對低效加速結構的性能警告。
- 在可重新擬合的底層 AS 中使用過度的生三角形。這可能會導致性能不佳。
- 壞頂點數據,例如 NaN 和大數。
- 條件不佳的幾何圖形或實例轉換。
- 用于改裝、復制或 TLAS 構建的源加速結構不完整。在 AS 操作之間正確同步時,可能存在應用端問題。
- 頂點、OMM 或 DMM 輸入索引越界檢查。
- 更改了 AS build 和 refit 之間的標志。
輸出示例
在發布時,以下是驅動驗證輸出的幾個示例。驅動捕獲的錯誤將隨著時間的推移而演變和增長。
error: [UNKNOWN_ENTRY_FUNCTION] attempted to execute a shader that is not part of the pipeline launch index: [451, 309, 0] additional occurrences: 12 SBT byte offset ( if applicable): 1088 SBT range: likely hitgroup/raygen/callable error: [UNEXPECTED_SHADER_TYPE] encountered a shader-binding-table record with unexpected shader type launch index: [0, 0, 0] additional occurrences: 10737 type: hitgroup expected: miss SBT byte offset: 64 SBT GPUVA: 0xb2841c0 error: [HIT_SBT_OUT_OF_BOUNDS] encountered an out-of-bounds access in the shader binding table when accessing a hitgroup record launch index: [826, 122, 0] additional occurrences: 1067 SBT byte offset: 7040 SBT byte size: 6528 SBT index: 110 instance SBT base index: 108 warning: [EXCESSIVE_DEGENERATE_PRIMITIVES] Acceleration structure has a significant portion of degenerated primitives, which can lead to poor performance. |
性能
啟用光線追蹤驗證會產生性能成本。但是,此成本通常很低,尤其是在未檢測到錯誤時。對于日常功能開發和調試而言,性能影響應該是可以接受的。正如前面提到的,應用程序不應啟用驗證模式。
在最近針對大量基準測試進行的測試中,我們觀察到,在未觸發任何錯誤的情況下,性能影響平均約為 3%的幀時間。對于確實觸發錯誤的基準測試,性能開銷在 3%到 40%之間。
光線追蹤驗證不會影響計算或像素著色器中基于光線查詢的光線追蹤。
結束語
光線追蹤驗證是一種功能強大的工具,用于調試棘手的崩潰和提高光線追蹤性能。啟用該驗證所需的更改小巧而簡單。
如果您正在開發光線追蹤應用,請立即考慮將其添加到您的開發生態系統中。有關更多信息,請參閱光線追蹤論壇。
?