Program Listing for File VulkanDevice.ixx

Program Listing for File VulkanDevice.ixx#

Return to documentation for file (Src/GraphicsEngineVulkan/vulkan_base/VulkanDevice.ixx)

module;

#include <gsl/gsl>
#include <vector>
#include <vulkan/vulkan.hpp>
#include "renderer/SwapChainDetails.hpp"

export module kataglyphis.vulkan.device;

import kataglyphis.vulkan.instance;
import kataglyphis.vulkan.queue_family_indices;

export namespace Kataglyphis {
class VulkanDevice
{
  public:
    VulkanDevice(gsl::not_null<VulkanInstance *> instance, gsl::not_null<vk::SurfaceKHR *> surface);

    [[nodiscard]] vk::PhysicalDeviceProperties get_physical_device_properties() const { return device_properties; };
    [[nodiscard]] vk::PhysicalDevice get_physical_device() const { return physical_device; };
    [[nodiscard]] vk::Device get_logical_device() const { return logical_device; };
    [[nodiscard]] Kataglyphis::VulkanRendererInternals::QueueFamilyIndices const &get_queue_families() const { return cached_queue_family_indices; };
    [[nodiscard]] vk::Queue get_graphics_queue() const { return graphics_queue; };
    [[nodiscard]] vk::Queue get_compute_queue() const { return compute_queue; };
    [[nodiscard]] vk::Queue get_presentation_queue() const { return presentation_queue; };
    [[nodiscard]] Kataglyphis::VulkanRendererInternals::SwapChainDetails get_swapchain_details();
    [[nodiscard]] bool supports_hardware_accelerated_rrt() const { return device_supports_hardware_accelerated_rrt; };
    [[nodiscard]] bool supports_buffer_device_address() const { return device_supports_buffer_device_address; };

    void clean_up();

    ~VulkanDevice();

  private:
    vk::PhysicalDevice physical_device{};
    vk::PhysicalDeviceProperties device_properties{};

    vk::Device logical_device{};

    gsl::not_null<VulkanInstance *> instance;
    gsl::not_null<vk::SurfaceKHR *> surface;

    vk::Queue graphics_queue{};
    vk::Queue presentation_queue{};
    vk::Queue compute_queue{};
    bool device_supports_hardware_accelerated_rrt = true;
    bool device_supports_buffer_device_address = false;

    Kataglyphis::VulkanRendererInternals::QueueFamilyIndices cached_queue_family_indices{};

    void pick_physical_device();
    void create_logical_device();

    // Helper methods for create_logical_device refactoring
    struct DeviceFeatureConfig
    {
        vk::PhysicalDeviceFeatures2 features2;
        vk::PhysicalDeviceVulkan12Features features12;
        vk::PhysicalDeviceVulkan13Features features13;
        vk::PhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features;
        vk::PhysicalDeviceRayTracingPipelineFeaturesKHR ray_tracing_pipeline_features;
        vk::PhysicalDeviceRayQueryFeaturesKHR ray_query_feature;
        std::vector<const char *> extensions;
    };
    std::vector<vk::DeviceQueueCreateInfo> create_device_queues(
      const Kataglyphis::VulkanRendererInternals::QueueFamilyIndices &indices);
    void query_available_features(vk::PhysicalDeviceVulkan13Features &available_features13,
      vk::PhysicalDeviceVulkan12Features &available_features12,
      vk::PhysicalDeviceFeatures2 &available_features2,
      vk::PhysicalDeviceRayQueryFeaturesKHR &available_ray_query,
      vk::PhysicalDeviceRayTracingPipelineFeaturesKHR &available_ray_tracing_pipeline,
      vk::PhysicalDeviceAccelerationStructureFeaturesKHR &available_acceleration_structure);
    bool check_ray_tracing_support(
      const std::vector<vk::ExtensionProperties> &available_extensions,
      const vk::PhysicalDeviceVulkan12Features &available_features12,
      const vk::PhysicalDeviceVulkan13Features &available_features13,
      const vk::PhysicalDeviceAccelerationStructureFeaturesKHR &available_acceleration_structure,
      const vk::PhysicalDeviceRayTracingPipelineFeaturesKHR &available_ray_tracing_pipeline,
      const vk::PhysicalDeviceRayQueryFeaturesKHR &available_ray_query);
    void configure_device_features(DeviceFeatureConfig &config, bool enable_ray_tracing);

    Kataglyphis::VulkanRendererInternals::QueueFamilyIndices get_queue_families(vk::PhysicalDevice selected_physical_device);
    Kataglyphis::VulkanRendererInternals::SwapChainDetails get_swapchain_details(vk::PhysicalDevice device);

    bool check_device_suitable(vk::PhysicalDevice device);
    bool check_device_extension_support(vk::PhysicalDevice device);

    const std::vector<const char *> device_extensions = {

        VK_KHR_SWAPCHAIN_EXTENSION_NAME

    };

    const std::vector<const char *> device_extensions_for_raytracing = {

        VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME,
        VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME,
        VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME,
        VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME,
        VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME,
        VK_KHR_SPIRV_1_4_EXTENSION_NAME,
        VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME,
        VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME,
        VK_KHR_RAY_QUERY_EXTENSION_NAME

    };
};
}// namespace Kataglyphis