diff --git a/src/Manager.cpp b/src/Manager.cpp index b5facd0c..73542e4a 100644 --- a/src/Manager.cpp +++ b/src/Manager.cpp @@ -51,7 +51,8 @@ Manager::Manager() Manager::Manager(uint32_t physicalDeviceIndex, const std::vector& familyQueueIndices, - const std::vector& desiredExtensions) + const std::vector& desiredExtensions, + const void* desiredFeaturesChain) { this->mManageResources = true; @@ -61,8 +62,10 @@ Manager::Manager(uint32_t physicalDeviceIndex, #endif this->createInstance(); - this->createDevice( - familyQueueIndices, physicalDeviceIndex, desiredExtensions); + this->createDevice(familyQueueIndices, + physicalDeviceIndex, + desiredExtensions, + desiredFeaturesChain); } Manager::Manager(std::shared_ptr instance, @@ -328,7 +331,8 @@ Manager::clear() void Manager::createDevice(const std::vector& familyQueueIndices, uint32_t physicalDeviceIndex, - const std::vector& desiredExtensions) + const std::vector& desiredExtensions, + const void* desiredFeaturesChain) { KP_LOG_DEBUG("Kompute Manager creating Device"); @@ -470,6 +474,8 @@ Manager::createDevice(const std::vector& familyQueueIndices, validExtensions.size(), validExtensions.data()); + deviceCreateInfo.pNext = desiredFeaturesChain; + this->mDevice = std::make_shared(); physicalDevice.createDevice( &deviceCreateInfo, nullptr, this->mDevice.get()); diff --git a/src/include/kompute/Manager.hpp b/src/include/kompute/Manager.hpp index cc02df80..99d263ea 100644 --- a/src/include/kompute/Manager.hpp +++ b/src/include/kompute/Manager.hpp @@ -32,10 +32,14 @@ class Manager * explicit allocation * @param desiredExtensions The desired extensions to load from * physicalDevice + * @param desiredFeaturesChain (Optional) Caller-owned pNext chain + * forwarded to VkDeviceCreateInfo::pNext (e.g. a VkPhysicalDeviceFeatures2 + * head enabling VK_EXT_shader_atomic_float). */ Manager(uint32_t physicalDeviceIndex, const std::vector& familyQueueIndices = {}, - const std::vector& desiredExtensions = {}); + const std::vector& desiredExtensions = {}, + const void* desiredFeaturesChain = nullptr); /** * Manager constructor which allows your own vulkan application to integrate @@ -561,7 +565,8 @@ class Manager void createInstance(); void createDevice(const std::vector& familyQueueIndices = {}, uint32_t hysicalDeviceIndex = 0, - const std::vector& desiredExtensions = {}); + const std::vector& desiredExtensions = {}, + const void* desiredFeaturesChain = nullptr); }; } // End namespace kp