From 172ca74f7099a0743a9a756a44f046ce9e188713 Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Tue, 23 Jun 2020 15:08:39 -0700 Subject: [PATCH] Now using Volk rather than statically linking the Vulkan loader --- .gitmodules | 6 ++++++ 3rdparty/volk | 1 + 3rdparty/vulkan | 1 + CMakeLists.txt | 44 +++++++++++++++++++++++++++++++++++++--- kraken/KRContext.cpp | 10 ++++++++- kraken/KREngine-common.h | 1 + 6 files changed, 59 insertions(+), 4 deletions(-) create mode 160000 3rdparty/volk create mode 160000 3rdparty/vulkan diff --git a/.gitmodules b/.gitmodules index db4ce41..acb441e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,9 @@ [submodule "3rdparty/glslang"] path = 3rdparty/glslang url = git@github.com:KhronosGroup/glslang.git +[submodule "3rdparty/vulkan"] + path = 3rdparty/vulkan + url = https://github.com/KhronosGroup/Vulkan-Headers +[submodule "3rdparty/volk"] + path = 3rdparty/volk + url = https://github.com/zeux/volk diff --git a/3rdparty/volk b/3rdparty/volk new file mode 160000 index 0000000..5d2e2cf --- /dev/null +++ b/3rdparty/volk @@ -0,0 +1 @@ +Subproject commit 5d2e2cf91f8a1fe4156d4c6b5c814d45d733684a diff --git a/3rdparty/vulkan b/3rdparty/vulkan new file mode 160000 index 0000000..8188e3f --- /dev/null +++ b/3rdparty/vulkan @@ -0,0 +1 @@ +Subproject commit 8188e3fbbc105591064093440f88081fb957d4f0 diff --git a/CMakeLists.txt b/CMakeLists.txt index f559ef3..1484573 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,11 +109,49 @@ include_directories(hydra/include) list (APPEND EXTRA_LIBS hydra) # ---- Vulkan ---- -if(NOT ANDROID) -find_package(Vulkan REQUIRED) -list (APPEND EXTRA_LIBS Vulkan::Vulkan) +add_library(vulkan INTERFACE) +set(VULKAN_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/vulkan/include) +target_sources(vulkan INTERFACE ${VULKAN_INCLUDE_DIR}/vulkan/vulkan.h) +target_include_directories(vulkan INTERFACE ${VULKAN_INCLUDE_DIR}) + +target_compile_definitions(vulkan INTERFACE VK_NO_PROTOTYPES) + +if(ANDROID) + target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_ANDROID_KHR) +elseif(WIN32) + target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_WIN32_KHR) +elseif(APPLE) + target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_MACOS_MVK) +elseif(UNIX) + # See whether X11 is available. If not, fall back to direct-to-display mode. + find_package(X11 QUIET) + if (X11_FOUND) + target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_XCB_KHR) + else() + set(DIRECT_TO_DISPLAY TRUE) + set(DIRECT_TO_DISPLAY TRUE PARENT_SCOPE) + target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_DISPLAY_KHR) + endif() endif() +list (APPEND EXTRA_LIBS vulkan) + +# ---- Volk ---- +# volk +set(VOLK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/volk") +set(VOLK_FILES + "${VOLK_DIR}/volk.c" + "${VOLK_DIR}/volk.h") + +add_library(volk STATIC ${VOLK_FILES}) + +target_link_libraries(volk PUBLIC vulkan) + +target_include_directories(volk PUBLIC ${VOLK_DIR}) + +set_property(TARGET volk PROPERTY FOLDER "3rdparty") + +list (APPEND EXTRA_LIBS volk) # ---- GLSlang ---- if(NOT ANDROID) diff --git a/kraken/KRContext.cpp b/kraken/KRContext.cpp index cb0a0f6..1bde534 100755 --- a/kraken/KRContext.cpp +++ b/kraken/KRContext.cpp @@ -640,6 +640,12 @@ void KRContext::receivedMemoryWarning() void KRContext::createDeviceContexts() { + VkResult res = volkInitialize(); + if (res != VK_SUCCESS) { + destroyDeviceContexts(); + return; + } + // initialize the VkApplicationInfo structure VkApplicationInfo app_info = {}; app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; @@ -662,10 +668,12 @@ KRContext::createDeviceContexts() inst_info.enabledLayerCount = 0; inst_info.ppEnabledLayerNames = NULL; - VkResult res = vkCreateInstance(&inst_info, NULL, &m_vulkanInstance); + res = vkCreateInstance(&inst_info, NULL, &m_vulkanInstance); if (res != VK_SUCCESS) { destroyDeviceContexts(); } + + volkLoadInstance(m_vulkanInstance); } void diff --git a/kraken/KREngine-common.h b/kraken/KREngine-common.h index a811e8b..c9ce754 100755 --- a/kraken/KREngine-common.h +++ b/kraken/KREngine-common.h @@ -100,6 +100,7 @@ using std::unordered_multimap; using std::hash; #include +#include #if defined(ANDROID) #include #include