(七) vulkan2 - Validation layers
準(zhǔn)備
????前面三角形運(yùn)行成功了,開始解除SDK系統(tǒng)安裝
????sudo apt autoremove vulkan-sdk libvulkan-tools
設(shè)定工作目錄/opt/vulkan
????下載vulkansdk-linux-x86_64-1.3.243.0.tar.gz解壓
????運(yùn)行vkcude測(cè)試
????????export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/vulkan/1.3.243.0/x86_64/lib/
????????./1.3.243.0/x86_64/bin/vkcube
????? ? 如果已經(jīng)安裝了使用vulkan的microsoft-edge-stable或obs-studio或vlc,則系統(tǒng)中已經(jīng)有l(wèi)ibvulkan.so.1,需要注意和下載的SDK的版本是否一致
whereis libvulkan.so.1
libvulkan.so.1: /usr/lib/x86_64-linux-gnu/libvulkan.so.1
ls -l /usr/lib/x86_64-linux-gnu/libvulkan.so.1
/usr/lib/x86_64-linux-gnu/libvulkan.so.1 -> libvulkan.so.1.3.243
我這里和SDK一致
概念
????直接使用網(wǎng)頁(yè)翻譯成中文查看,看看和自己的理解是否一致
Common operations in validation layers are:
Checking the values of parameters against the specification to detect misuse
根據(jù)規(guī)范檢查參數(shù)值以檢測(cè)誤用
Tracking creation and destruction of objects to find resource leaks
跟蹤對(duì)象的創(chuàng)建和銷毀以查找資源泄漏
Checking thread safety by tracking the threads that calls originate from
通過(guò)跟蹤調(diào)用源自的線程來(lái)檢查線程安全性
Logging every call and its parameters to the standard output
將每個(gè)調(diào)用及其參數(shù)記錄到標(biāo)準(zhǔn)輸出中
Tracing Vulkan calls for profiling and replaying
追蹤 Vulkan 需要分析和重放
下面是診斷中函數(shù)實(shí)現(xiàn)的示例 驗(yàn)證層可能如下所示:
VkResult vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo,?const VkAllocationCallbacks* pAllocator,?
?VkInstance* instance)
{? ? ? ??
? ? ? ? if (pCreateInfo == nullptr || instance == nullptr) {
? ? ? ? ? ? log("Null pointer passed to required parameter!");
? ? ? ? ? ? return VK_ERROR_INITIALIZATION_FAILED;
? ? ? ? }
? ? ? ? return real_vkCreateInstance(pCreateInfo, pAllocator, instance);
}
前面的認(rèn)識(shí):
? ? 這樣就很清楚“validation layers”是什么東西了 (翻譯為“驗(yàn)證層”也能理解)
? ? 其實(shí)就是一種debug和release模式(極端且更接近的是assert斷言)
(所以不用正確翻譯,就直接說(shuō)是 “使能調(diào)試檢查”)
? ? 在編寫代碼時(shí)使用debug模式,盡可能地“打印”/檢查出潛在的錯(cuò)誤;發(fā)布時(shí)release模式,去掉多余的調(diào)用/封裝/檢查來(lái)提高“性能”?
沒(méi)有問(wèn)題,后面還有補(bǔ)充內(nèi)容。
????這些驗(yàn)證層可以自由堆疊以包含所有您感興趣的調(diào)試功能。對(duì)于調(diào)試版本,您只需啟用驗(yàn)證層即可,并為發(fā)布版本完全禁用它們,這為您提供了兩全其美!
????Vulkan沒(méi)有內(nèi)置任何驗(yàn)證層,但LunarG Vulkan SDK 提供了一組很好的層來(lái)檢查常見(jiàn)錯(cuò)誤。他們也是完全開源,因此,您可以檢查錯(cuò)誤。使用驗(yàn)證層是避免應(yīng)用程序中斷的最佳方法。
????驗(yàn)證層只有在系統(tǒng)上安裝后才能使用。 例如,LunarG 驗(yàn)證層僅在具有已安裝 Vulkan SDK中。
????Vulkan 中以前有兩種不同類型的驗(yàn)證層: 實(shí)例 和特定于設(shè)備。這個(gè)想法是實(shí)例層只會(huì)檢查 與全局 Vulkan 對(duì)象(如實(shí)例)和設(shè)備特定層相關(guān)的調(diào)用 、只會(huì)檢查與特定 GPU 相關(guān)的調(diào)用。設(shè)備特定層現(xiàn)已棄用,這意味著實(shí)例驗(yàn)證層適用于所有Vulkan調(diào)用。規(guī)范文檔仍建議您啟用驗(yàn)證設(shè)備級(jí)別的層以及兼容性,這是某些人所要求的實(shí)現(xiàn)。我們將簡(jiǎn)單地在邏輯上指定與實(shí)例相同的層設(shè)備級(jí)別,我們將在后面看到。
????和理解的是差不多一個(gè)意思。
????繼續(xù)看。
所有有用的標(biāo)準(zhǔn)驗(yàn)證都捆綁到 SDK 中包含的層中,該層稱為 VK_LAYER_KHRONOS_validation
下一個(gè)內(nèi)容,前面刪除掉的

vkCreateDebugUtilsMessengerEXT
vkDestroyDebugUtilsMessengerEXT
這兩個(gè)有啥用?
為什么在創(chuàng)建instance時(shí)設(shè)置了callback還要調(diào)用vkCreateDebugUtilsMessengerEXT再設(shè)置一遍?
動(dòng)手
????先說(shuō)Instance,前面的理解
? ? Instance百度翻譯:例子; 事例; 實(shí)例;
? ? 我喜歡取第一個(gè)概念,轉(zhuǎn)述為創(chuàng)建一個(gè)“例子”(應(yīng)用)并告知要求和用途
????現(xiàn)在,用windows窗口中概念來(lái)說(shuō),vulkan instance就是“窗口”(VULKAN API)的handle; 用linux中概念來(lái)說(shuō),一個(gè)vulkan instance就是VULKAN API的descriptor (linux下有 file descriptor簡(jiǎn)稱fd);
????創(chuàng)建一個(gè)窗口,拿到handle; 創(chuàng)建/打開一個(gè)文件,拿到fd。
????使用vulkan api,拿到instance。
??(
vkDestroyInstance 釋放資源,才會(huì)去檢查
)
????創(chuàng)建surface,不釋放,然后
1.?添加教程中的CreateDebugUtilsMessengerEXT、DestroyDebugUtilsMessengerEXT
2.?不添加CreateDebugUtilsMessengerEXT、
DestroyDebugUtilsMessengerEXT
沒(méi)有任何區(qū)別
????還得看spec,https://registry.khronos.org/vulkan/specs/1.3-extensions/pdf/vkspec.pdf

????callback傳遞給vkCreateInstance(),只會(huì)在vkCreateInstance和vkDestroyInstance執(zhí)行時(shí)才有回調(diào)對(duì)應(yīng)的callback。其他時(shí)候需要使用vkCreateDebugReportCallbackEXT或者vkCreateDebugUtilsMessengerEXT來(lái)使能回調(diào)對(duì)應(yīng)的callback。
? ? 這樣就清楚了為什么上面測(cè)試都一樣。
完整的工程
vulkan.pro

main.cpp

mainwindow.h

mainwindow.cpp





????