diff --git a/src/VkBootstrap.cpp b/src/VkBootstrap.cpp index 86e960f..b738735 100644 --- a/src/VkBootstrap.cpp +++ b/src/VkBootstrap.cpp @@ -1015,12 +1015,9 @@ 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 e2fb789..ac47e42 100644 --- a/src/VkBootstrap.h +++ b/src/VkBootstrap.h @@ -198,26 +198,21 @@ 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), - update_proc(other.update_proc), - copy_proc(other.copy_proc) { + ExtensionFeatures (const ExtensionFeatures& other) : delete_proc(other.delete_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; @@ -225,7 +220,6 @@ 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, {}); @@ -240,6 +234,14 @@ 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 = {}; @@ -250,16 +252,6 @@ 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) { @@ -273,19 +265,9 @@ 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; } @@ -308,9 +290,8 @@ struct ExtensionFeatures { VkBaseOutStructure* structure = nullptr; std::vector fields; private: - DeleteProc delete_proc = nullptr; - UpdateProc update_proc = nullptr; - CopyProc copy_proc = nullptr; + DeleteProc delete_proc = {}; + CopyProc copy_proc = {}; }; struct Instance {