列舉實體裝置
這一節的代碼檔案是
02-enumerate_devices.cpp
示例程式的下一步是确定系統上的實體裝置。
在您建立了一個執行個體之後,加載器知道有多少Vulkan實體裝置可用,但是您的應用程式還不知道這一點。應用程式通過通路Vulkan API來擷取一個有多少可用實體裝置的清單。
實體裝置與執行個體相關,如上圖所示。
從Vulkan擷取對象清單
擷取對象清單是Vulkan中相當常見的操作,并且API有一個一緻的模式。傳回清單的API函數有count和指針參數。count參數是一個指向整數的指針,以便API能夠設定它的值。步驟如下:
- 用一個指向整型的count參數和一個空指針來調用函數。
- API填充count值,表示清單中對象的數量。
- 應用配置設定足夠的空間來存儲清單。
- 應用再次調用這個函數,指針參數指向剛剛配置設定的空間。
你會在Vulkan API中經常看到這種模式。
vkEnumeratePhysicalDevices函數
vkEnumeratePhysicalDevices
函數隻傳回系統上每個實體裝置的句柄清單。一個實體裝置可能是一個圖形卡,它可以插入到桌面計算機中,在SoC上的某種GPU核心,等等。如果有多個裝置可用,應用程式必須決定它将使用哪一個。
代碼如下:
// Get the number of devices (GPUs) available.
VkResult res = vkEnumeratePhysicalDevices(info.inst, &gpu_count, NULL);
// Allocate space and get the list of devices.
info.gpus.resize(gpu_count);
res = vkEnumeratePhysicalDevices(info.inst, &gpu_count, info.gpus.data());
請注意
info.gpus
是一個vector,元素為
VkPhysicalDevice
。
所有的
enumerate
都是獲得實體裝置句柄的清單。
device
程式是這一程序的下一個步驟,它檢視這個清單來決定使用哪一個裝置。
info
結構體
info
你會注意到在上面的代碼中使用了
info
變量。每個示例程式使用全局
info
結構變量來跟蹤Vulkan資訊和應用程式狀态。這有助于使用更緊湊的函數調用來執行本教程中已經介紹過的步驟。例如,在
enumerate
程式中看到代碼行:
init_instance(info, "vulkansamples_enumerate");
它執行本教程的
建立Vulkan執行個體
頁面上讨論的步驟。
init_instance()
建立執行個體并将句柄儲存到
info
中。然後
vkEnumeratePhysicalDevices()
會将
info.inst
用于調用
vkEnumeratePhysicalDevices()
.
現在您已經擁有了裝置清單(GPU),現在是時候選擇GPU并建立一個Vulkan邏輯裝置對象,這樣你就可以開始使用GPU了。
© Copyright 2016 LunarG, Inc