From 4c760dae537ffe4f16b658e2c781fa2d2210e36e Mon Sep 17 00:00:00 2001 From: "Michal J. Gajda" Date: Mon, 20 Apr 2026 07:58:34 +0200 Subject: [PATCH] Manager: allow caller to supply VkPhysicalDeviceFeatures2 pNext chain Add an optional `desiredFeaturesChain` pointer to `Manager`'s configured constructor and `createDevice`. When non-null it is forwarded to `VkDeviceCreateInfo::pNext`, so callers can enable extension-gated features such as `VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::shaderBufferFloat32AtomicAdd` without bypassing Manager. Backward compatible: the new parameter defaults to `nullptr`, so existing call sites are unaffected. Caller owns the struct(s) and must keep them alive for the duration of the Manager constructor. --- src/Manager.cpp | 14 ++++++++++---- src/include/kompute/Manager.hpp | 9 +++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) 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