diff --git a/src/VkBootstrap.cpp b/src/VkBootstrap.cpp index b738735..86e960f 100644 --- a/src/VkBootstrap.cpp +++ b/src/VkBootstrap.cpp @@ -1015,9 +1015,12 @@ PhysicalDeviceSelector::PhysicalDeviceDesc PhysicalDeviceSelector::populate_devi prev = &extension; } if(desc.extension_features.size() > 0) { - desc.device_features2.pNext = &desc.extension_features[0].structure; + desc.device_features2.pNext = desc.extension_features[0].structure; } detail::vulkan_functions().fp_vkGetPhysicalDeviceFeatures2(phys_device, &desc.device_features2); + for(auto& extension : desc.extension_features) { + extension.update(); + } } #endif return desc; diff --git a/src/VkBootstrap.h b/src/VkBootstrap.h index ac47e42..e2fb789 100644 --- a/src/VkBootstrap.h +++ b/src/VkBootstrap.h @@ -198,21 +198,26 @@ class PhysicalDeviceSelector; struct ExtensionFeatures { using DeleteProc = void(*)(ExtensionFeatures&); + using UpdateProc = void(*)(ExtensionFeatures&); using CopyProc = void(*)(const ExtensionFeatures&, ExtensionFeatures&); ExtensionFeatures() = default; - ExtensionFeatures (const ExtensionFeatures& other) : delete_proc(other.delete_proc), copy_proc(other.copy_proc) { + ExtensionFeatures (const ExtensionFeatures& other) : delete_proc(other.delete_proc), + update_proc(other.update_proc), + copy_proc(other.copy_proc) { if(copy_proc) { copy_proc(other, *this); } } ExtensionFeatures (ExtensionFeatures&& other) : delete_proc(std::exchange(other.delete_proc, nullptr)), + update_proc(std::exchange(other.update_proc, nullptr)), copy_proc(std::exchange(other.copy_proc, nullptr)), structure(std::exchange(other.structure, nullptr)), fields(std::exchange(other.fields, {})) {} ExtensionFeatures& operator=(const ExtensionFeatures& other) { delete_proc = other.delete_proc; + update_proc = other.update_proc; copy_proc = other.copy_proc; if(copy_proc) { copy_proc(other, *this); } return *this; @@ -220,6 +225,7 @@ struct ExtensionFeatures { ExtensionFeatures& operator=(ExtensionFeatures&& other) { delete_proc = std::exchange(other.delete_proc, nullptr); + update_proc = std::exchange(other.update_proc, nullptr); copy_proc = std::exchange(other.copy_proc, nullptr); structure = std::exchange(other.structure, nullptr); fields = std::exchange(other.fields, {}); @@ -234,14 +240,6 @@ struct ExtensionFeatures { *new_features_structure = src; extension_features.structure = reinterpret_cast(new_features_structure); - auto structure_field_count = - (sizeof(T) - (sizeof(VkStructureType) + sizeof(void*))) / sizeof(VkBool32); - extension_features.fields.resize(structure_field_count); - memcpy(extension_features.fields.data(), - reinterpret_cast(extension_features.structure) + - (sizeof(VkStructureType) + sizeof(void*)), - sizeof(VkBool32) * extension_features.fields.size()); - extension_features.delete_proc = [](ExtensionFeatures& features) { features.fields = {}; @@ -252,6 +250,16 @@ struct ExtensionFeatures { }; + extension_features.update_proc = [](ExtensionFeatures& features) { + + auto structure_field_count = (sizeof(T) - (sizeof(void*) * 2)) / sizeof(VkBool32); + features.fields.resize(structure_field_count); + memcpy(features.fields.data(), + reinterpret_cast(features.structure) + (sizeof(void*) * 2), + sizeof(VkBool32) * features.fields.size()); + + }; + extension_features.copy_proc = [](const ExtensionFeatures& src, ExtensionFeatures& dst) { if(dst.structure) { @@ -265,9 +273,19 @@ struct ExtensionFeatures { }; + extension_features.update(); + return extension_features; } + void update() { + + if(update_proc) { + update_proc(*this); + } + + } + bool match(const ExtensionFeatures& other) const { if(!structure || !other.structure || structure->sType != other.structure->sType) { return false; } @@ -290,8 +308,9 @@ struct ExtensionFeatures { VkBaseOutStructure* structure = nullptr; std::vector fields; private: - DeleteProc delete_proc = {}; - CopyProc copy_proc = {}; + DeleteProc delete_proc = nullptr; + UpdateProc update_proc = nullptr; + CopyProc copy_proc = nullptr; }; struct Instance {