diff --git a/framework/core/instance.h b/framework/core/instance.h index b8a86d7b5..6d8aae908 100644 --- a/framework/core/instance.h +++ b/framework/core/instance.h @@ -247,8 +247,7 @@ inline Instance::Instance(std::string const .enabledExtensionCount = static_cast(enabled_extensions_cstr.size()), .ppEnabledExtensionNames = enabled_extensions_cstr.data()}; - vkb::StructureChainBuilder scb; - scb.set_anchor_struct(create_info); + vkb::StructureChainBuilderCpp scb(create_info); if constexpr (bindingType == vkb::BindingType::Cpp) { extend_instance_create_info(scb); diff --git a/framework/structure_chain_builder.h b/framework/structure_chain_builder.h index 7b68905de..1a46a14d4 100644 --- a/framework/structure_chain_builder.h +++ b/framework/structure_chain_builder.h @@ -25,8 +25,10 @@ namespace vkb template class StructureChainBuilder { + static_assert((offsetof(AnchorStructType, sType) == 0) && (offsetof(AnchorStructType, pNext) == sizeof(void *))); + public: - StructureChainBuilder(); + StructureChainBuilder(AnchorStructType const &anchor_struct); template T &add_chain_data(T const &data_to_add = {}); // Adds data to the structure chain builder that is not part of the structure chain itself, but is used by the @@ -38,14 +40,11 @@ class StructureChainBuilder template StructType const *get_struct(size_t skip = 0) const; - void set_anchor_struct(AnchorStructType const &anchor_struct); - private: template StructType &add_struct_impl(StructType const &struct_to_add); template StructType const *get_struct_impl(size_t skip) const; - void set_anchor_struct_impl(AnchorStructType const &anchor_struct); private: std::vector> structure_chain; @@ -59,18 +58,17 @@ template using StructureChainBuilderCpp = StructureChainBuilder; template -template -T &StructureChainBuilder::add_chain_data(T const &data_to_add) +inline StructureChainBuilder::StructureChainBuilder(AnchorStructType const &anchor_struct) { - chain_data.push_back(std::make_unique(std::make_any(data_to_add))); - return *std::any_cast(chain_data.back().get()); + structure_chain.push_back(std::make_unique(std::make_any(anchor_struct))); } template -inline StructureChainBuilder::StructureChainBuilder() +template +inline T &StructureChainBuilder::add_chain_data(T const &data_to_add) { - static_assert((offsetof(AnchorStructType, sType) == 0) && (offsetof(AnchorStructType, pNext) == sizeof(void *))); - structure_chain.push_back(std::make_unique(std::make_any())); + chain_data.push_back(std::make_unique(std::make_any(data_to_add))); + return *std::any_cast(chain_data.back().get()); } template @@ -115,7 +113,7 @@ inline StructType const *StructureChainBuilder::g } else { - return reinterpret_cast(get_struct_impl::Type>(skip)); + return reinterpret_cast(get_struct_impl::Type>(skip)); } } @@ -137,26 +135,4 @@ inline StructType const *StructureChainBuilder::g return (it != structure_chain.end()) ? std::any_cast(it->get()) : nullptr; } -template -inline void StructureChainBuilder::set_anchor_struct(AnchorStructType const &anchor_struct) -{ - if constexpr (bindingType == vkb::BindingType::Cpp) - { - set_anchor_struct_impl(anchor_struct); - } - else - { - return reinterpret_cast::Type> *>(this)->add_anchor_struct( - reinterpret_cast::Type const &>(anchor_struct)); - } -} - -template -inline void StructureChainBuilder::set_anchor_struct_impl(AnchorStructType const &anchor_struct) -{ - void const *pNext = std::any_cast(structure_chain.front().get())->pNext; - *std::any_cast(structure_chain.front().get()) = anchor_struct; - std::any_cast(structure_chain.front().get())->pNext = pNext; -} - } // namespace vkb diff --git a/framework/vulkan_sample.h b/framework/vulkan_sample.h index b938f66ac..3c8804d5e 100644 --- a/framework/vulkan_sample.h +++ b/framework/vulkan_sample.h @@ -197,11 +197,9 @@ class VulkanSample : public vkb::Application */ virtual void draw_renderpass(vkb::core::CommandBuffer &command_buffer, vkb::rendering::RenderTarget &render_target); - virtual void extend_instance_create_info(vkb::StructureChainBuilder &create_info) const; - virtual uint32_t get_api_version() const; - virtual DebugReportCallbackCreateInfoType const *get_debug_report_callback_create_info() const; - virtual DebugUtilsMessengerCreateInfoType const *get_debug_utils_messenger_create_info() const; - virtual InstanceCreateFlagsType get_instance_create_flags(std::vector const &enabled_extensions) const; + virtual void extend_instance_create_info(vkb::StructureChainBuilder &scb) const; + virtual uint32_t get_api_version() const; + virtual InstanceCreateFlagsType get_instance_create_flags(std::vector const &enabled_extensions) const; /** * @brief Override this to customise the creation of the swapchain and render_context @@ -331,6 +329,11 @@ class VulkanSample : public vkb::Application void request_layer_settings_impl(std::vector &requested_layer_settings, vkb::StructureChainBuilderCpp &scb) const; static void set_viewport_and_scissor_impl(vkb::core::CommandBufferCpp const &command_buffer, vk::Extent2D const &extent); +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + vk::DebugReportCallbackCreateInfoEXT const &get_debug_report_callback_create_info() const; + vk::DebugUtilsMessengerCreateInfoEXT const &get_debug_utils_messenger_create_info() const; +#endif + /// /// PRIVATE MEMBERS /// @@ -758,16 +761,11 @@ inline void VulkanSample::extend_instance_create_info_impl(vkb::Str #if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) if (contains(create_info->enabledExtensionCount, create_info->ppEnabledExtensionNames, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) { - vk::DebugUtilsMessengerCreateInfoEXT debug_utils_messenger_create_info{.messageSeverity = vk::DebugUtilsMessageSeverityFlagBitsEXT::eError | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning, - .messageType = vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance, - .pfnUserCallback = vkb::core::debug_utils_messenger_callback}; - scb.add_struct(debug_utils_messenger_create_info); + scb.add_struct(get_debug_utils_messenger_create_info()); } else if (contains(create_info->enabledExtensionCount, create_info->ppEnabledExtensionNames, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)) { - vk::DebugReportCallbackCreateInfoEXT debug_report_callback_create_info{.flags = vk::DebugReportFlagBitsEXT::eError | vk::DebugReportFlagBitsEXT::eWarning | vk::DebugReportFlagBitsEXT::ePerformanceWarning, - .pfnCallback = vkb::core::debug_callback}; - scb.add_struct(debug_report_callback_create_info); + scb.add_struct(get_debug_report_callback_create_info()); } #endif @@ -819,45 +817,6 @@ inline uint32_t VulkanSample::get_api_version() const return VK_API_VERSION_1_1; } -template -inline typename VulkanSample::DebugReportCallbackCreateInfoType const *VulkanSample::get_debug_report_callback_create_info() const -{ -#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) - static vk::DebugReportCallbackCreateInfoEXT debug_report_callback_create_info{.flags = vk::DebugReportFlagBitsEXT::eError | vk::DebugReportFlagBitsEXT::eWarning | vk::DebugReportFlagBitsEXT::ePerformanceWarning, - .pfnCallback = vkb::core::debug_callback}; - if constexpr (bindingType == vkb::BindingType::Cpp) - { - return &debug_report_callback_create_info; - } - else - { - return reinterpret_cast(&debug_report_callback_create_info); - } -#else - return nullptr; -#endif -} - -template -inline typename VulkanSample::DebugUtilsMessengerCreateInfoType const *VulkanSample::get_debug_utils_messenger_create_info() const -{ -#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) - static vk::DebugUtilsMessengerCreateInfoEXT debug_utils_messenger_create_info{.messageSeverity = vk::DebugUtilsMessageSeverityFlagBitsEXT::eError | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning, - .messageType = vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance, - .pfnUserCallback = vkb::core::debug_utils_messenger_callback}; - if constexpr (bindingType == vkb::BindingType::Cpp) - { - return &debug_utils_messenger_create_info; - } - else - { - return reinterpret_cast(&debug_utils_messenger_create_info); - } -#else - return nullptr; -#endif -} - template inline typename VulkanSample::InstanceCreateFlagsType VulkanSample::get_instance_create_flags(std::vector const &enabled_extensions) const { @@ -911,6 +870,27 @@ inline vkb::core::Device &VulkanSample::get_device() } } +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) +template +inline vk::DebugReportCallbackCreateInfoEXT const &VulkanSample::get_debug_report_callback_create_info() const +{ + static vk::DebugReportCallbackCreateInfoEXT debug_report_callback_create_info = + {.flags = vk::DebugReportFlagBitsEXT::eError | vk::DebugReportFlagBitsEXT::eWarning | vk::DebugReportFlagBitsEXT::ePerformanceWarning, + .pfnCallback = vkb::core::debug_callback}; + return debug_report_callback_create_info; +} + +template +inline vk::DebugUtilsMessengerCreateInfoEXT const &VulkanSample::get_debug_utils_messenger_create_info() const +{ + static vk::DebugUtilsMessengerCreateInfoEXT debug_utils_messenger_create_info = + {.messageSeverity = vk::DebugUtilsMessageSeverityFlagBitsEXT::eError | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning, + .messageType = vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance, + .pfnUserCallback = vkb::core::debug_utils_messenger_callback}; + return debug_utils_messenger_create_info; +} +#endif + template inline vkb::Gui &VulkanSample::get_gui() { @@ -1207,40 +1187,17 @@ inline bool VulkanSample::prepare(const ApplicationOptions &options instance.reset(reinterpret_cast(create_instance().release())); } - // initialize debug utils or report callback based on enabled extensions, if any +#if defined(VKB_DEBUG) || defined(VKB_VALIDATION_LAYERS) + // initialize debug utils or report callback based on enabled extensions if (instance->is_extension_enabled(VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) { -#ifdef VKB_VULKAN_DEBUG - debug_utils = std::make_unique(); -#endif - auto const *debug_utils_messenger_create_info = get_debug_utils_messenger_create_info(); - if (debug_utils_messenger_create_info) - { - if constexpr (bindingType == BindingType::Cpp) - { - debug_utils_messenger = instance->get_handle().createDebugUtilsMessengerEXT(*debug_utils_messenger_create_info); - } - else - { - debug_utils_messenger = instance->get_handle().createDebugUtilsMessengerEXT(*reinterpret_cast(debug_utils_messenger_create_info)); - } - } + debug_utils_messenger = instance->get_handle().createDebugUtilsMessengerEXT(get_debug_utils_messenger_create_info()); } else if (instance->is_extension_enabled(VK_EXT_DEBUG_REPORT_EXTENSION_NAME)) { - auto const *debug_report_callback_create_info = get_debug_report_callback_create_info(); - if (debug_report_callback_create_info) - { - if constexpr (bindingType == BindingType::Cpp) - { - debug_report_callback = instance->get_handle().createDebugReportCallbackEXT(*debug_report_callback_create_info); - } - else - { - debug_report_callback = instance->get_handle().createDebugReportCallbackEXT(*reinterpret_cast(debug_report_callback_create_info)); - } - } + debug_report_callback = instance->get_handle().createDebugReportCallbackEXT(get_debug_report_callback_create_info()); } +#endif // Getting a valid vulkan surface from the platform surface = static_cast(window->create_surface(reinterpret_cast(*instance))); diff --git a/samples/extensions/shader_debugprintf/shader_debugprintf.cpp b/samples/extensions/shader_debugprintf/shader_debugprintf.cpp index ca0fa6be8..12d51e1db 100644 --- a/samples/extensions/shader_debugprintf/shader_debugprintf.cpp +++ b/samples/extensions/shader_debugprintf/shader_debugprintf.cpp @@ -59,6 +59,8 @@ ShaderDebugPrintf::~ShaderDebugPrintf() vkDestroyDescriptorSetLayout(get_device().get_handle(), descriptor_set_layout, nullptr); vkDestroySampler(get_device().get_handle(), textures.skysphere.sampler, nullptr); + + vkDestroyDebugUtilsMessengerEXT(get_instance().get_handle(), debug_utils_messenger, nullptr); } } @@ -445,6 +447,12 @@ bool ShaderDebugPrintf::prepare(const vkb::ApplicationOptions &options) return false; } + // Register a sample specific debug utils callback in addition to the one registered by the base class + if (get_instance().is_extension_enabled(VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) + { + vkCreateDebugUtilsMessengerEXT(get_instance().get_handle(), &get_debug_utils_messenger_create_info(), nullptr, &debug_utils_messenger); + } + camera.type = vkb::CameraType::LookAt; camera.set_position(glm::vec3(0.0f, 0.0f, -6.0f)); camera.set_rotation(glm::vec3(0.0f, 180.0f, 0.0f)); @@ -463,27 +471,24 @@ bool ShaderDebugPrintf::prepare(const vkb::ApplicationOptions &options) return true; } -void ShaderDebugPrintf::extend_instance_create_info(vkb::StructureChainBuilderC &scb) const +VkDebugUtilsMessengerCreateInfoEXT const &ShaderDebugPrintf::get_debug_utils_messenger_create_info() const { - ApiVulkanSample::extend_instance_create_info(scb); - - // Register a sample specific debug utils callback in addition to the one registered by the base class - VkDebugUtilsMessengerCreateInfoEXT debug_utils_messenger_create_info{.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, - .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, - .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, - .pfnUserCallback = debug_utils_message_callback}; - scb.add_struct(debug_utils_messenger_create_info); + static VkDebugUtilsMessengerCreateInfoEXT debug_utils_messenger_create_info = + {.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, + .pNext = nullptr, + .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, + .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, + .pfnUserCallback = debug_utils_message_callback, + .pUserData = nullptr}; + return debug_utils_messenger_create_info; } -VkDebugUtilsMessengerCreateInfoEXT const *ShaderDebugPrintf::get_debug_utils_messenger_create_info() const +void ShaderDebugPrintf::extend_instance_create_info(vkb::StructureChainBuilderC &scb) const { + ApiVulkanSample::extend_instance_create_info(scb); + // Register a sample specific debug utils callback in addition to the one registered by the base class - static VkDebugUtilsMessengerCreateInfoEXT local_debug_utils_messenger_create_info{.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, - .pNext = ApiVulkanSample::get_debug_utils_messenger_create_info(), - .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, - .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, - .pfnUserCallback = debug_utils_message_callback}; - return &local_debug_utils_messenger_create_info; + scb.add_struct(get_debug_utils_messenger_create_info()); } void ShaderDebugPrintf::render(float delta_time) diff --git a/samples/extensions/shader_debugprintf/shader_debugprintf.h b/samples/extensions/shader_debugprintf/shader_debugprintf.h index 90fe3dd41..052641e95 100644 --- a/samples/extensions/shader_debugprintf/shader_debugprintf.h +++ b/samples/extensions/shader_debugprintf/shader_debugprintf.h @@ -80,31 +80,35 @@ class ShaderDebugPrintf : public ApiVulkanSample ShaderDebugPrintf(); ~ShaderDebugPrintf(); - void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; - void request_instance_extensions(std::unordered_map &requested_extensions) const override; - void request_layer_settings(std::vector &requested_layer_settings, vkb::StructureChainBuilderC &scb) const override; - void request_validation_feature_enables(std::vector &requested_layer_settings) const override; - void build_command_buffers() override; - void load_assets(); - void setup_descriptor_pool(); - void setup_descriptor_set_layout(); - void setup_descriptor_sets(); - void prepare_pipelines(); - void prepare_uniform_buffers(); - void update_uniform_buffers(); - void draw(); - bool prepare(const vkb::ApplicationOptions &options) override; - virtual void extend_instance_create_info(vkb::StructureChainBuilderC &scb) const override; - virtual VkDebugUtilsMessengerCreateInfoEXT const *get_debug_utils_messenger_create_info() const override; - virtual void render(float delta_time) override; - virtual void on_update_ui_overlay(vkb::Drawer &drawer) override; - virtual bool resize(const uint32_t width, const uint32_t height) override; + void request_gpu_features(vkb::core::PhysicalDeviceC &gpu) override; + void request_instance_extensions(std::unordered_map &requested_extensions) const override; + void request_layer_settings(std::vector &requested_layer_settings, vkb::StructureChainBuilderC &scb) const override; + void request_validation_feature_enables(std::vector &requested_layer_settings) const override; + void build_command_buffers() override; + void load_assets(); + void setup_descriptor_pool(); + void setup_descriptor_set_layout(); + void setup_descriptor_sets(); + void prepare_pipelines(); + void prepare_uniform_buffers(); + void update_uniform_buffers(); + void draw(); + bool prepare(const vkb::ApplicationOptions &options) override; + virtual void extend_instance_create_info(vkb::StructureChainBuilderC &scb) const override; + virtual void render(float delta_time) override; + virtual void on_update_ui_overlay(vkb::Drawer &drawer) override; + virtual bool resize(const uint32_t width, const uint32_t height) override; private: // from vkb::VulkanSample virtual uint32_t get_api_version() const override; virtual void request_device_extensions(std::unordered_map &requested_extensions) const override; virtual void request_layers(std::unordered_map &requested_layers) const override; + + VkDebugUtilsMessengerCreateInfoEXT const &get_debug_utils_messenger_create_info() const; + + private: + VkDebugUtilsMessengerEXT debug_utils_messenger{VK_NULL_HANDLE}; }; std::unique_ptr create_shader_debugprintf();