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