Foundation
Loading...
Searching...
No Matches
Device.hpp
Go to the documentation of this file.
1#pragma once
2#include <SDL3/SDL.h>
3#include <vk_mem_alloc.h>
4#include <RHICore/Device.hpp>
5#include <Core/Logging.hpp>
6#include "Common.hpp"
7namespace Foundation::RHI {
8 class VulkanApplication;
9 class VulkanDeviceQueue;
10 constexpr uint32_t kInvalidQueueIndex = static_cast<uint32_t>(-1);
12 {
16 VulkanDeviceQueue* Get(Handle handle) const;
18 switch (type) {
23 default:
24 CHECK_MSG(false, "Unknown queue type {}", type);
25 }
26 }
27 bool IsValid() const {
28 return graphics != kInvalidHandle &&
31 }
32 bool IsDedicatedCompute() const {
33 return IsValid() && compute != graphics;
34 }
35 bool IsDedicatedTransfer() const {
36 return IsValid() && transfer != graphics;
37 }
38 };
39 class VulkanDevice;
42 vk::raii::Semaphore mSemaphore{ nullptr };
43 public:
45 [[nodiscard]] auto const& GetVkSemaphore() const { return mSemaphore; }
46
47 void DebugSetObjectName(const char* name) override;
48 };
51 vk::raii::Fence mFence{ nullptr };
52 public:
53 VulkanDeviceFence(const VulkanDevice& device, bool signaled);
54 [[nodiscard]] auto const& GetVkFence() const { return mFence; }
55
56 void DebugSetObjectName(const char* name) override;
57 };
60 vk::raii::DescriptorSetLayout mLayout{ nullptr };
61 public:
63 [[nodiscard]] auto const& GetVkLayout() const { return mLayout; }
64
65 void DebugSetObjectName(const char* name) override;
66 };
69 vk::raii::Sampler mSampler{ nullptr };
70 public:
71 VulkanDeviceSampler(const VulkanDevice& device, SamplerDesc const& desc);
72 [[nodiscard]] auto const& GetVkSampler() const { return mSampler; }
73
74 void DebugSetObjectName(const char* name) override;
75 };
77 {
80 vk::raii::QueryPool mQueryPool{ nullptr };
81
83 public:
84 VulkanDeviceQueryPool(const VulkanDevice& device, QueryPoolDesc const& desc);
85 [[nodiscard]] auto const& GetVkQueryPool() const { return mQueryPool; }
86
87 const float GetTimestampResolution() override { return mTimestampResolution; }
88
89 void Reset() override;
90
92 void DebugSetObjectName(const char* name) override;
93 };
94 class VulkanDevice : public RHIDevice {
96
98
99 vk::PhysicalDeviceProperties mProperties;
100 vk::raii::PhysicalDevice mPhysicalDevice{ nullptr };
101 vk::raii::Device mDevice{ nullptr };
102 vk::raii::SurfaceKHR mSurface{ nullptr };
103
106
108 // Device Object storage
109 // Lifetimes and handle dereferencing are managed by the device.
111 // Queues
113 public:
114 VulkanDevice(VulkanApplication const& app, vk::raii::PhysicalDevice physicalDevice, SDL_Window* window = nullptr);
115 ~VulkanDevice() override;
116
118
122 RHISwapchain* GetSwapchain(Handle handle) const override;
123 void DestroySwapchain(Handle handle) override;
124
126 RHIPipelineStateCache* GetPipelineCache(Handle handle) const override;
127 void DestroyPipelineCache(Handle handle) override;
128
130 RHIPipelineState* GetPipelineState(Handle handle) const override;
131 void DestroyPipelineState(Handle handle) override;
132
134 RHIShaderModule* GetShaderModule(Handle handle) const override;
135 void DestroyShaderModule(Handle handle) override;
136
138 RHICommandPool* GetCommandPool(Handle handle) const override;
139 void DestroyCommandPool(Handle handle) override;
140
142 RHIDeviceSemaphore* GetSemaphore(Handle handle) const override;
143 void DestroySemaphore(Handle handle) override;
144
146 RHIDeviceFence* GetFence(Handle handle) const override;
147 void DestroyFence(Handle handle) override;
148
150 RHIBuffer* GetBuffer(Handle handle) const override;
151 void DestroyBuffer(Handle handle) override;
152
154 RHITexture* GetTexture(Handle handle) const override;
155 void DestroyTexture(Handle handle) override;
156
159 void DestroyAccelerationStructure(Handle handle) override;
160
163 void DestroyDescriptorSetLayout(Handle handle) override;
164
166 RHIDeviceDescriptorPool::PoolDesc const& desc) override;
167 RHIDeviceDescriptorPool* GetDescriptorPool(Handle handle) const override;
168 void DestroyDescriptorPool(Handle handle) override;
169
171 RHIDeviceSampler* GetSampler(Handle handle) const override;
172 void DestroySampler(Handle handle) override;
173
175 RHIDeviceQueryPool::QueryPoolDesc const& desc) override;
176 RHIDeviceQueryPool* GetQueryPool(Handle handle) const override;
177 void DestroyQueryPool(Handle handle) override;
178
181
184
185 void WaitIdle() const override;
186
187 void QueryBudget(size_t& used, size_t& budget) const override;
188 String QueryDeviceString() const override;
189
190 Allocator* GetAllocator() const;
191 vk::AllocationCallbacks const& GetVkAllocatorCallbacks() const;
192
193 auto const& GetVkQueues() const { return mQueues; }
194 auto const& GetVkDevice() const { return mDevice; }
195 auto const& GetVkSurface() const { return mSurface; }
196 auto const& GetVkPhysicalDevice() const { return mPhysicalDevice; }
197 auto const& GetVkAllocator() const { return mVkAllocator; }
198
199 void DebugSetObjectName(const char* name) override;
200 };
205 vk::raii::Queue mQueue{ nullptr };
206 public:
211
212 [[nodiscard]] const VulkanDevice& GetVulkanDevice() const { return mDevice; }
213 [[nodiscard]] vk::raii::Queue GetVkQueue() const { return mQueue; }
215 [[nodiscard]] uint32_t GetVkQueueFamily() const override { return mFamilyIndex; }
216
217 void WaitIdle() const override;
219 void Present(PresentDesc const& desc) const override;
220
221
222 void DebugSetObjectName(const char* name) override;
223 };
224}
#define CHECK_MSG(expr, format_str,...)
Definition Logging.hpp:50
General Purpose Allocator (GPA) interface.
Definition Allocator.hpp:24
Definition Resource.hpp:48
Definition Command.hpp:14
Definition Descriptor.hpp:43
Definition Device.hpp:66
Definition Device.hpp:164
Definition Device.hpp:16
Definition Device.hpp:104
Definition Device.hpp:55
Definition Device.hpp:188
Thread-safe type-erased handle dereference facility for RHI Objects.
Definition Details.hpp:149
Definition PipelineState.hpp:8
Definition PipelineState.hpp:22
Scoped move-only RAII handle wrapper for RHI Objects.
Definition Details.hpp:86
Definition Shader.hpp:5
Definition Swapchain.hpp:19
Definition Resource.hpp:169
Definition Application.hpp:16
const VulkanDevice & mDevice
Definition Device.hpp:59
void DebugSetObjectName(const char *name) override
Definition Device.cpp:532
vk::raii::DescriptorSetLayout mLayout
Definition Device.hpp:60
auto const & GetVkLayout() const
Definition Device.hpp:63
Definition Device.hpp:49
void DebugSetObjectName(const char *name) override
Definition Device.cpp:300
vk::raii::Fence mFence
Definition Device.hpp:51
const VulkanDevice & mDevice
Definition Device.hpp:50
auto const & GetVkFence() const
Definition Device.hpp:54
const VulkanDevice & mDevice
Definition Device.hpp:78
auto const & GetVkQueryPool() const
Definition Device.hpp:85
vk::raii::QueryPool mQueryPool
Definition Device.hpp:80
const float GetTimestampResolution() override
Definition Device.hpp:87
void Reset() override
Definition Device.cpp:621
Span< const uint64_t > GetTimestampResults(bool wait) override
Definition Device.cpp:622
void DebugSetObjectName(const char *name) override
Definition Device.cpp:633
Vector< uint64_t > mTimestampResults
Definition Device.hpp:82
const float mTimestampResolution
Definition Device.hpp:79
Definition Device.hpp:201
vk::raii::Queue mQueue
Definition Device.hpp:205
void WaitIdle() const override
Definition Device.cpp:394
vk::raii::Queue GetVkQueue() const
Definition Device.hpp:213
const uint32_t mQueueIndex
Definition Device.hpp:203
uint32_t GetVkQueueIndex() const
Definition Device.hpp:214
uint32_t GetVkQueueFamily() const override
Definition Device.hpp:215
void DebugSetObjectName(const char *name) override
Definition Device.cpp:499
const VulkanDevice & mDevice
Definition Device.hpp:202
void Submit(Span< const SubmitDesc >, RHIDeviceFence *completionFence) const override
Definition Device.cpp:395
VulkanDeviceQueue(const VulkanDevice &device, uint32_t family_index, uint32_t queue_index)
Definition Device.hpp:207
const VulkanDevice & GetVulkanDevice() const
Definition Device.hpp:212
const uint32_t mFamilyIndex
Definition Device.hpp:204
Definition Device.hpp:67
const VulkanDevice & mDevice
Definition Device.hpp:68
void DebugSetObjectName(const char *name) override
Definition Device.cpp:598
auto const & GetVkSampler() const
Definition Device.hpp:72
vk::raii::Sampler mSampler
Definition Device.hpp:69
auto const & GetVkSemaphore() const
Definition Device.hpp:45
const VulkanDevice & mDevice
Definition Device.hpp:41
void DebugSetObjectName(const char *name) override
Definition Device.cpp:285
vk::raii::Semaphore mSemaphore
Definition Device.hpp:42
Definition Device.hpp:94
RHIDeviceFence * GetFence(Handle handle) const override
Definition Device.cpp:322
bool WaitForFences(Span< RHIDeviceFence *const > fences, bool wait_all, size_t timeout) override
Wait for fences to arrive.
Definition Device.cpp:335
RHIObjectPool mStorage
Definition Device.hpp:110
RHIDeviceDescriptorSetLayout * GetDescriptorSetLayout(Handle handle) const override
Definition Device.cpp:579
RHIDeviceDescriptorPool * GetDescriptorPool(Handle handle) const override
Definition Device.cpp:591
void DestroySemaphore(Handle handle) override
Definition Device.cpp:316
RHIDeviceScopedHandle< RHIDeviceDescriptorPool > CreateDescriptorPool(RHIDeviceDescriptorPool::PoolDesc const &desc) override
Definition Device.cpp:587
void DestroyAccelerationStructure(Handle handle) override
Definition Device.cpp:530
void DestroyQueryPool(Handle handle) override
Definition Device.cpp:728
vk::AllocationCallbacks const & GetVkAllocatorCallbacks() const
Definition Device.cpp:14
const VulkanApplication & mApp
Definition Device.hpp:95
void ResetFences(Span< RHIDeviceFence *const > fences) override
Definition Device.cpp:325
RHIDeviceScopedHandle< RHIDeviceFence > CreateFence(bool signaled) override
Definition Device.cpp:318
void DestroyFence(Handle handle) override
Definition Device.cpp:323
RHIDeviceScopedHandle< RHIPipelineState > CreatePipelineState(RHIPipelineState::PipelineStateDesc const &desc) override
Definition Device.cpp:244
void DestroyPipelineState(Handle handle) override
Definition Device.cpp:252
void QueryBudget(size_t &used, size_t &budget) const override
Definition Device.cpp:185
RHIDeviceScopedHandle< RHIPipelineStateCache > CreatePipelineCache(RHIPipelineStateCache::PipelineStateCacheDesc const &desc) override
Definition Device.cpp:232
Vector< RHISwapchainPresentMode > mSwapchainPresentModes
Definition Device.hpp:105
RHIDeviceScopedHandle< RHIDeviceSampler > CreateSampler(RHIDeviceSampler::SamplerDesc const &desc) override
Definition Device.cpp:711
RHITexture * GetTexture(Handle handle) const override
Definition Device.cpp:518
RHIBuffer * GetBuffer(Handle handle) const override
Definition Device.cpp:511
RHIDeviceScopedHandle< RHIDeviceSemaphore > CreateSemaphore(bool is_timeline) override
Definition Device.cpp:308
void DestroyShaderModule(Handle handle) override
Definition Device.cpp:263
RHIDeviceScopedHandle< RHIBuffer > CreateBuffer(RHIBufferDesc const &desc) override
Definition Device.cpp:507
vk::raii::PhysicalDevice mPhysicalDevice
Definition Device.hpp:100
bool WaitForTimelineSemaphores(Span< const Pair< RHIDeviceSemaphore *, size_t > > semaphores, size_t timeout) override
Wait for timeline semaphores to reach specified values.
Definition Device.cpp:361
RHIAccelerationStructure * GetAccelerationStructure(Handle handle) const override
Definition Device.cpp:526
void DestroyBuffer(Handle handle) override
Definition Device.cpp:512
Vector< RHIResourceFormat > mSwapchainFormats
Definition Device.hpp:104
RHIDeviceScopedHandle< RHIDeviceQueryPool > CreateQueryPool(RHIDeviceQueryPool::QueryPoolDesc const &desc) override
Definition Device.cpp:720
void DestroySampler(Handle handle) override
Definition Device.cpp:719
VmaAllocator mVkAllocator
Definition Device.hpp:107
Span< RHISwapchainPresentMode const > GetSwapchainSupportedPresentModes() const override
Definition Device.cpp:221
RHIDeviceQueue * GetDeviceQueue(RHIDeviceQueueType type) const override
Definition Device.cpp:203
RHIDeviceScopedHandle< RHISwapchain > CreateSwapchain(RHISwapchain::SwapchainDesc const &desc) override
Definition Device.cpp:225
void DestroyDescriptorPool(Handle handle) override
Definition Device.cpp:595
void DestroySwapchain(Handle handle) override
Definition Device.cpp:230
RHIPipelineState * GetPipelineState(Handle handle) const override
Definition Device.cpp:248
~VulkanDevice() override
Definition Device.cpp:174
auto const & GetVkQueues() const
Definition Device.hpp:193
auto const & GetVkAllocator() const
Definition Device.hpp:197
RHIDeviceScopedHandle< RHIAccelerationStructure > CreateAccelerationStructure(RHIAccelerationStructureDesc const &desc) override
Definition Device.cpp:522
RHICommandPool * GetCommandPool(Handle handle) const override
Definition Device.cpp:270
auto const & GetVkPhysicalDevice() const
Definition Device.hpp:196
vk::raii::Device mDevice
Definition Device.hpp:101
String QueryDeviceString() const override
Definition Device.cpp:193
Allocator * GetAllocator() const
Definition Device.cpp:13
RHIShaderModule * GetShaderModule(Handle handle) const override
Definition Device.cpp:259
RHIDeviceSemaphore * GetSemaphore(Handle handle) const override
Definition Device.cpp:312
void DebugSetObjectName(const char *name) override
Definition Device.cpp:386
void DestroyDescriptorSetLayout(Handle handle) override
Definition Device.cpp:583
auto const & GetVkSurface() const
Definition Device.hpp:195
UniquePtr< VulkanDeviceQueues > mQueues
Definition Device.hpp:112
void SignalTimelineSemaphores(Span< const Pair< RHIDeviceSemaphore *, size_t > > semaphores) override
Definition Device.cpp:351
void WaitIdle() const override
Definition Device.cpp:184
vk::PhysicalDeviceProperties mProperties
Definition Device.hpp:99
RHIPipelineStateCache * GetPipelineCache(Handle handle) const override
Definition Device.cpp:236
RHIDeviceScopedHandle< RHITexture > CreateTexture(RHITextureDesc const &desc) override
Definition Device.cpp:514
vk::raii::SurfaceKHR mSurface
Definition Device.hpp:102
RHISwapchain * GetSwapchain(Handle handle) const override
Definition Device.cpp:229
void DestroyPipelineCache(Handle handle) override
Definition Device.cpp:240
Span< RHIResourceFormat const > GetSwapchainSupportedFormats() const override
Definition Device.cpp:220
void DestroyTexture(Handle handle) override
Definition Device.cpp:519
RHIDeviceScopedHandle< RHIShaderModule > CreateShaderModule(RHIShaderModule::ShaderModuleDesc const &desc) override
Definition Device.cpp:255
void DestroyCommandPool(Handle handle) override
Definition Device.cpp:274
SDL_Window * mWindow
Definition Device.hpp:97
auto const & GetVkDevice() const
Definition Device.hpp:194
RHIDeviceQueryPool * GetQueryPool(Handle handle) const override
Definition Device.cpp:724
RHIDeviceScopedHandle< RHICommandPool > CreateCommandPool(RHICommandPool::PoolDesc desc) override
Definition Device.cpp:266
RHIDeviceScopedHandle< RHIDeviceDescriptorSetLayout > CreateDescriptorSetLayout(RHIDeviceDescriptorSetLayoutDesc const &desc) override
Definition Device.cpp:575
RHIDeviceSampler * GetSampler(Handle handle) const override
Definition Device.cpp:715
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:130
std::basic_string< char > String
Alias for std::basic_string<char>, without an explicit allocator constructor.
Definition Container.hpp:112
std::pair< First, Second > Pair
Alias for std::pair
Definition Container.hpp:32
std::unique_ptr< T, Deleter > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:166
T * Construct(Allocator *resource, Args &&...args)
Convenience placement new with object of type T using a Foundation::Core::Allocator.
Definition Allocator.hpp:149
std::span< T > Span
Alias for std::span
Definition Container.hpp:60
Low-level Rendering Hardware Interface (RHI) abstractions.
Definition Application.hpp:4
Present
Definition Common.hpp:126
uintptr_t Handle
Definition Details.hpp:8
RHIDeviceQueueType
Definition Common.hpp:107
static constexpr Handle kInvalidHandle
Definition Details.hpp:9
constexpr uint32_t kInvalidQueueIndex
Definition Device.hpp:10
Definition Resource.hpp:24
Definition Resource.hpp:103
Definition Device.hpp:12
VulkanDeviceQueue * Get(Handle handle) const
Definition Device.cpp:202
VulkanDeviceQueues(Allocator *allocator)
Definition Device.hpp:15
Handle compute
Definition Device.hpp:14
bool IsDedicatedTransfer() const
Definition Device.hpp:35
Handle graphics
Definition Device.hpp:14
bool IsValid() const
Definition Device.hpp:27
RHIObjectPool< VulkanDeviceQueue > storage
Definition Device.hpp:13
bool IsDedicatedCompute() const
Definition Device.hpp:32
VulkanDeviceQueue * Get(RHIDeviceQueueType type) const
Definition Device.hpp:17
Handle transfer
Definition Device.hpp:14