天天看點

Vulkan【3】列舉實體裝置列舉實體裝置

列舉實體裝置

這一節的代碼檔案是

02-enumerate_devices.cpp

示例程式的下一步是确定系統上的實體裝置。

在您建立了一個執行個體之後,加載器知道有多少Vulkan實體裝置可用,但是您的應用程式還不知道這一點。應用程式通過通路Vulkan API來擷取一個有多少可用實體裝置的清單。

Vulkan【3】列舉實體裝置列舉實體裝置

實體裝置與執行個體相關,如上圖所示。

從Vulkan擷取對象清單

擷取對象清單是Vulkan中相當常見的操作,并且API有一個一緻的模式。傳回清單的API函數有count和指針參數。count參數是一個指向整數的指針,以便API能夠設定它的值。步驟如下:

  1. 用一個指向整型的count參數和一個空指針來調用函數。
  2. API填充count值,表示清單中對象的數量。
  3. 應用配置設定足夠的空間來存儲清單。
  4. 應用再次調用這個函數,指針參數指向剛剛配置設定的空間。

你會在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

結構變量來跟蹤Vulkan資訊和應用程式狀态。這有助于使用更緊湊的函數調用來執行本教程中已經介紹過的步驟。例如,在

enumerate

程式中看到代碼行:

init_instance(info, "vulkansamples_enumerate");
           

它執行本教程的

建立Vulkan執行個體

頁面上讨論的步驟。

init_instance()

建立執行個體并将句柄儲存到

info

中。然後

vkEnumeratePhysicalDevices()

會将

info.inst

用于調用

vkEnumeratePhysicalDevices()

.

現在您已經擁有了裝置清單(GPU),現在是時候選擇GPU并建立一個Vulkan邏輯裝置對象,這樣你就可以開始使用GPU了。

© Copyright 2016 LunarG, Inc