51 std::span<const char* const> required_instance_extensions, std::span<const char* const> required_device_extensions = {}
53 ~VulkanCore() =
default;
55 VulkanCore(
const VulkanCore&) =
delete;
56 auto operator=(
const VulkanCore&) -> VulkanCore& =
delete;
59 auto getInstance()
const noexcept ->
const vk::raii::Instance& {
64 auto getDevice()
const noexcept ->
const vk::raii::Device& {
69 auto getPhysicalDevice()
const noexcept ->
const vk::raii::PhysicalDevice& {
70 return m_physical_device;
74 auto getAllocator()
const noexcept ->
const vma::raii::Allocator& {
79 auto getGraphicsQueueFamilyIndex()
const noexcept -> uint32_t {
80 return m_graphics_queue_family_index;
84 auto getComputeQueueFamilyIndex()
const noexcept -> uint32_t {
85 return m_compute_queue_family_index;
89 auto getTransferQueueFamilyIndex()
const noexcept -> uint32_t {
90 return m_transfer_queue_family_index;
94 auto getGraphicsQueue()
const noexcept -> vk::Queue {
95 return m_graphics_queue;
101 return m_compute_queue;
105 auto getTransferQueue() const noexcept -> vk::Queue {
106 return m_transfer_queue;
110 auto getRenderDocAPI() const noexcept -> const RENDERDOC_API_1_6_0* {
115 auto isRayTracingSupported() const noexcept ->
bool {
116 return m_ray_tracing_supported;
122 return m_mesh_shader_supported;
126 auto getBufferAddress(vk::Buffer buffer)
const -> vk::DeviceAddress {
127 vk::BufferDeviceAddressInfo info {};
128 info.buffer = buffer;
129 return m_device.getBufferAddress(info);
133 auto getScratchAllocationSize(vk::DeviceSize needed)
const noexcept -> vk::DeviceSize {
134 return needed + std::max(m_as_scratch_alignment, 1u);
140 const auto alignment =
static_cast<vk::DeviceAddress
>(std::max(m_as_scratch_alignment, 1u));
141 return (getBufferAddress(buffer) + alignment - 1) & ~(alignment - 1);
145 auto isMemoryBudgetSupported() const noexcept ->
bool {
146 return m_memory_budget_supported;
150 auto isFrameBoundarySupported() const noexcept ->
bool {
151 return m_frame_boundary_supported;
155 auto isTextureSharingSupported() const noexcept ->
bool {
156 return m_texture_sharing_supported;
160 auto getNsightMode() const noexcept -> NsightMode {
161 return m_nsight_mode;
166 void activateNsightGpuTraceIfNeeded()
const;
170 auto validationEnabled() const noexcept ->
bool {
171 return m_validation_enabled;
175 auto debugUtilsEnabled() const noexcept ->
bool {
176 return m_debug_utils_enabled;
180 auto supportsSamplerAnisotropy() const noexcept ->
bool {
181 return m_sampler_anisotropy_supported;
185 auto maxSamplerAnisotropy() const noexcept ->
float {
186 return m_max_sampler_anisotropy;
192 return m_pipeline_cache;
198 void savePipelineCache()
const;
206 return *m_async_compute;
212 return m_transfer_submit_mutex;
217 auto graphicsSubmitMutex() const noexcept -> std::mutex& {
218 return m_graphics_submit_mutex;
222 void pickPhysicalDevice(std::span<const char* const> required_device_extensions);
223 void createLogicalDeviceAndAllocator(std::span<const char* const> required_device_extensions);
226 auto calculateDeviceScore(
const vk::PhysicalDevice& device, std::span<const char* const> required_device_extensions)
230 auto checkValidationLayerSupport() -> bool;
233 static auto checkInstanceExtensionSupport(std::string_view extension) -> bool;
236 void initializeNsightActivity();
239 bool m_validation_enabled =
false;
240 bool m_debug_utils_enabled =
false;
242 vk::raii::Context m_context;
243 vk::raii::Instance m_instance =
nullptr;
245 vk::raii::DebugUtilsMessengerEXT m_debug_messenger =
nullptr;
248 vk::raii::PhysicalDevice m_physical_device =
nullptr;
249 vk::raii::Device m_device =
nullptr;
251 vk::raii::PipelineCache m_pipeline_cache =
nullptr;
253 std::unique_ptr<AsyncCompute> m_async_compute;
255 std::optional<vma::raii::Allocator> m_allocator;
257 uint32_t m_graphics_queue_family_index = std::numeric_limits<uint32_t>::max();
258 uint32_t m_compute_queue_family_index = std::numeric_limits<uint32_t>::max();
259 uint32_t m_transfer_queue_family_index = std::numeric_limits<uint32_t>::max();
260 vk::Queue m_graphics_queue =
nullptr;
261 vk::Queue m_compute_queue =
nullptr;
262 vk::Queue m_transfer_queue =
nullptr;
264 bool m_sampler_anisotropy_supported =
false;
265 float m_max_sampler_anisotropy = 1.0f;
267 mutable std::mutex m_graphics_submit_mutex;
268 mutable std::mutex m_transfer_submit_mutex;
269 uint32_t m_transfer_queue_index = 0;
271 RENDERDOC_API_1_6_0* rdoc_api =
nullptr;
273 mutable NsightMode m_nsight_mode = NsightMode::none;
275 bool m_frame_boundary_supported =
false;
276 bool m_memory_budget_supported =
false;
278 bool m_texture_sharing_supported =
false;
280 bool m_ray_tracing_supported =
false;
281 bool m_mesh_shader_supported =
false;
283 uint32_t m_as_scratch_alignment = 0;
284 mutable bool m_nsight_gputrace_activated =
false;