交換組和交換屏障是分別在同一系統(tǒng)和分布式系統(tǒng)上的不同窗口之間同步緩沖區(qū)交換的眾所周知的方法。最初是為 OpenGL 引入的,后來通過公共 NvAPI 接口進行擴展,并在 DirectX 9 到 12 中得到支持。
NVIDIA 現(xiàn)在引入了當前障礙的概念。它們結(jié)合了交換組和交換障礙,并提供了一種在系統(tǒng)內(nèi)和系統(tǒng)之間設(shè)置同步當前調(diào)用的簡單方法。
當應用程序請求加入當前障礙時,驅(qū)動程序會根據(jù)當前系統(tǒng)配置嘗試設(shè)置交換組或交換組與交換障礙的組合。這些函數(shù)再次通過公共 NvAPI 接口提供。
目前的障礙只有在應用程序處于全屏狀態(tài),沒有窗口邊框,也沒有桌面縮放或任務欄組合時才有效。如果這些要求中至少有一項未得到滿足,則當前的安全柵將斷開并恢復到掛起狀態(tài),直到所有要求都得到滿足。當當前屏障處于掛起狀態(tài)時,顯示器之間不會發(fā)生同步。
類似地,只有當顯示器連接到相同的 GPU 并設(shè)置為相同的定時時,當前屏障才能正常工作。顯示器也可以與 Quadro Sync 卡或 NVLink 連接器同步。
顯示同步通過以下兩種方式之一進行:
顯示器已配置為使用 Quadro sync 插件板形成同步組或同步到外部同步源,或兩者兼而有之。
通過創(chuàng)建跨越顯示器的馬賽克顯示表面,實現(xiàn)了顯示器的同步。
當通過其中一種方法同步顯示定時時,則可以使用 DX12 顯示屏障。
NvAPI 接口
要通過 NvAPI 中的 present barrier 擴展設(shè)置同步 present 調(diào)用,應用程序必須確保完全支持 present barrier 。如果是這種情況,它必須創(chuàng)建一個當前 barrier 客戶端,注冊所需的 DirectX 資源,并加入當前 barrier 。
查詢當前屏障支持
在嘗試同步當前調(diào)用之前,應用程序應首先檢查當前操作系統(tǒng)、驅(qū)動程序和硬件配置是否支持當前屏障同步。這是通過使用所需的 D3D12 設(shè)備作為參數(shù)調(diào)用相應的函數(shù)來實現(xiàn)的。
ID3D12Device* device; ... // initialize the device bool supported; assert(NvAPI_D3D12_QueryPresentBarrierSupport(device, &supported) == NVAPI_OK); if(supported) { LOG("D3D12 present barrier is supported on this system."); ... }
創(chuàng)建當前屏障客戶端句柄
如果系統(tǒng)提供當前屏障支持,應用程序可以通過提供 D3D12 設(shè)備和 DXGI 交換鏈來創(chuàng)建當前屏障客戶端。句柄用于注冊所需的資源、加入或離開當前障礙以及查詢幀統(tǒng)計信息。
IDXGISwapChain swapChain; ... // initialize the swap chain NvPresentBarrierClientHandle pbClientHandle = nullptr; assert(NvAPI_D3D12_CreatePresentBarrierClient(device, swapChain, &pbClientHandle) == NVAPI_OK);
注冊現(xiàn)有障礙資源
創(chuàng)建客戶端后,當前障礙需要訪問交換鏈的緩沖區(qū)資源和圍欄對象,以實現(xiàn)適當?shù)膸健鷻谥涤擅繋漠斍捌琳显黾?,應用程序不得更改。然而,應用程序可以使用它來同步主機和設(shè)備之間的命令分配器使用。每當交換鏈的緩沖區(qū)發(fā)生變化時,必須再次調(diào)用該函數(shù)。
ID3D12Fence pbFence; // the app may wait on the fence but must not signal it assert(SUCCEEDED(device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&pbFence)))); ID3D12Resource** backBuffers; unsigned int backBufferCount; ... // query buffers from swap chain assert(NvAPI_D3D12_RegisterPresentBarrierResources(pbClientHandle, pbFence, backBuffers, backBufferCount) == NVAPI_OK);
加入當前的障礙
創(chuàng)建當前屏障客戶端句柄并注冊掃描資源后,應用程序可以加入當前屏障同步。然后,未來 – 現(xiàn)在的呼叫與其他客戶端同步。
NV_JOIN_PRESENT_BARRIER_PARAMS params = {}; params.dwVersion = NV_JOIN_PRESENT_BARRIER_PARAMS_VER1; assert(NvAPI_JoinPresentBarrier(pbClientHandle, ¶ms) == NVAPI_OK);
離開目前的障礙
存在一個類似的函數(shù)來保持當前的勢壘同步??蛻舳吮3植蛔?,這樣應用程序就可以輕松地再次加入。
assert(NvAPI_LeavePresentBarrier(pbClientHandle));
應用程序的主循環(huán)
當一切都設(shè)置好后,應用程序可以執(zhí)行其主循環(huán),而無需任何更改,包括當前調(diào)用。目前的障礙自行處理同步。雖然應用程序可以選擇使用提供給當前屏障的圍欄進行主機和設(shè)備同步,但也可以使用自己的專用圍欄。
查詢統(tǒng)計信息
當客戶端注冊到當前屏障時,應用程序可以隨時查詢幀和同步統(tǒng)計信息,以確保一切按預期工作。
NV_PRESENT_BARRIER_FRAME_STATISTICS stats = {}; stats.dwVersion = NV_PRESENT_BARRIER_FRAME_STATICS_VER1; assert(NvAPI_QueryPresentBarrierFrameStatistics(pbClientHandle, &stats) == NVAPI_OK);
由函數(shù)調(diào)用填充的當前障礙統(tǒng)計對象提供了幾個有用的值。
SyncMode:上次當前調(diào)用中客戶端的當前障礙模式??赡苤担?/p>
PRESENT_BARRIER_NOT_JOINED:客戶尚未加入當前的障礙。
PRESENT_BARRIER_SYNC_CLIENT:客戶端加入了當前障礙,但未與任何其他客戶端同步。
PRESENT_BARRIER_SYNC_SYSTEM:客戶端加入了當前屏障,并與系統(tǒng)內(nèi)的其他客戶端同步。
PRESENT_BARRIER_SYNC_CLUSTER:客戶端加入了當前的障礙,并與系統(tǒng)內(nèi)和跨系統(tǒng)的其他客戶端同步。
PresentCount:幀成功加入當前障礙后從客戶端顯示的總次數(shù)。
PresentInSyncCount:自返回SyncMode以來,從客戶端顯示幀的總次數(shù)是PRESENT_BARRIER_SYNC_SYSTEM或PRESENT_BARRIER_SYNC_CLUSTER。如果SyncMode偏離這些值,它將重置為 0 。
FlipInSyncCount:自返回SyncMode以來,客戶端的翻轉(zhuǎn)總數(shù)為PRESENT_BARRIER_SYNC_SYSTEM或PRESENT_BARRIER_SYNC_CLUSTER。如果SyncMode偏離這些值,它將重置為 0 。
RefreshCount:自客戶端返回SyncMode以來的 v 空格總數(shù)為PRESENT_BARRIER_SYNC_SYSTEM或PRESENT_BARRIER_SYNC_CLUSTER。如果SyncMode偏離這些值,它將重置為 0 。
示例應用程序
NVIDIA DesignWorks Samples GitHub repo 中提供了一個專用的示例應用程序。它具有可調(diào)整和移動的彩色條和列模式,以直觀地檢查同步質(zhì)量(圖 1 )。該應用程序還支持多 GPU 設(shè)置上的交替幀渲染和立體渲染。在運行期間,它可以加入或離開當前的障礙同步。
圖 1.具有移動條線和實時統(tǒng)計信息的示例應用程序。
結(jié)論
Present barrier 同步是一種簡單、高級的方法,可以在單個系統(tǒng)和多個分布式系統(tǒng)場景中在多個顯示器上實現(xiàn)同步 Present 調(diào)用。該界面完全包含在 NvAPI 庫中,僅包含六個設(shè)置函數(shù),而復雜的管理概念對面向用戶的代碼隱藏。
關(guān)于作者
Nico Marniok 是 NVIDIA 專業(yè)可視化部門的高級開發(fā)技術(shù)工程師,他與獨立軟件供應商合作,利用計算機圖形軟件和硬件的最新技術(shù)。他專攻光線追蹤算法。 ISV 應用范圍從專業(yè)圖形設(shè)計到數(shù)字孿生可視化和模擬。在加入 NVIDIA 之前,Nico 畢業(yè)于奧斯納布呂克大學并獲得碩士學位,并在 3D 重建領(lǐng)域進行了研究,首先是計算機層析成像,后來是深度相機。
審核編輯:郭婷
-
顯示器
+關(guān)注
關(guān)注
21文章
5002瀏覽量
140236 -
NVIDIA
+關(guān)注
關(guān)注
14文章
5068瀏覽量
103462
發(fā)布評論請先 登錄
相關(guān)推薦
評論