Foundation
Loading...
Searching...
No Matches
Device.hpp
Go to the documentation of this file.
1#pragma once
2#include <RHICore/Device.hpp>
3#include <SDL3/SDL.h>
4#include <vk_mem_alloc.h>
5#include "Common.hpp"
6namespace Foundation::RHI
7{
8 class VulkanApplication;
9 class VulkanDeviceQueue;
10 constexpr uint32_t kInvalidQueueIndex = static_cast<uint32_t>(-1);
39 class VulkanDevice;
41 {
43 vk::raii::Semaphore mSemaphore{nullptr};
44
45 public:
47 [[nodiscard]] auto const& GetVkSemaphore() const { return mSemaphore; }
48
49 void DebugSetObjectName(const char* name) override;
50 };
52 {
54 vk::raii::Fence mFence{nullptr};
55
56 public:
57 VulkanDeviceFence(const VulkanDevice& device, bool signaled);
58 [[nodiscard]] auto const& GetVkFence() const { return mFence; }
59
60 void DebugSetObjectName(const char* name) override;
61 };
63 {
65 vk::raii::DescriptorSetLayout mLayout{nullptr};
66
67 public:
69 [[nodiscard]] auto const& GetVkLayout() const { return mLayout; }
70
71 void DebugSetObjectName(const char* name) override;
72 };
74 {
76 vk::raii::Sampler mSampler{nullptr};
77
78 public:
79 VulkanDeviceSampler(const VulkanDevice& device, SamplerDesc const& desc);
80 [[nodiscard]] auto const& GetVkSampler() const { return mSampler; }
81
82 void DebugSetObjectName(const char* name) override;
83 };
85 {
88 vk::raii::QueryPool mQueryPool{nullptr};
89
91
92 public:
93 VulkanDeviceQueryPool(const VulkanDevice& device, QueryPoolDesc const& desc);
94 [[nodiscard]] auto const& GetVkQueryPool() const { return mQueryPool; }
95
96 const float GetTimestampResolution() override { return mTimestampResolution; }
97
98 void Reset() override;
99
100 Span<const uint64_t> GetResults(bool wait) override;
101 void DebugSetObjectName(const char* name) override;
102 };
103 class VulkanDevice : public RHIDevice
104 {
106
108
109 vk::raii::PhysicalDevice mPhysicalDevice{nullptr};
110 vk::raii::Device mDevice{nullptr};
111 vk::raii::SurfaceKHR mSurface{nullptr};
112
115
117 // Device Object storage
118 // Lifetimes and handle dereferencing are managed by the device.
120 // Queues
122
123 public:
124 VulkanDevice(VulkanApplication const& app, vk::raii::PhysicalDevice physicalDevice,
125 SDL_Window* window = nullptr);
126 ~VulkanDevice() override;
127
129
133 RHISwapchain* GetSwapchain(Handle handle) const override;
134 void DestroySwapchain(Handle handle) override;
135
138 RHIPipelineStateCache* GetPipelineCache(Handle handle) const override;
139 void DestroyPipelineCache(Handle handle) override;
140
143 RHIPipelineState* GetPipelineState(Handle handle) const override;
144 void DestroyPipelineState(Handle handle) override;
145
148 RHIShaderModule* GetShaderModule(Handle handle) const override;
149 void DestroyShaderModule(Handle handle) override;
150
152 RHICommandPool* GetCommandPool(Handle handle) const override;
153 void DestroyCommandPool(Handle handle) override;
154
156 RHIDeviceSemaphore* GetSemaphore(Handle handle) const override;
157 void DestroySemaphore(Handle handle) override;
158
160 RHIDeviceFence* GetFence(Handle handle) const override;
161 void DestroyFence(Handle handle) override;
162
164 RHIBuffer* GetBuffer(Handle handle) const override;
165 void DestroyBuffer(Handle handle) override;
166
168 RHITexture* GetTexture(Handle handle) const override;
169 void DestroyTexture(Handle handle) override;
170
174 void DestroyAccelerationStructure(Handle handle) override;
175
179 void DestroyDescriptorSetLayout(Handle handle) override;
180
183 RHIDeviceDescriptorPool* GetDescriptorPool(Handle handle) const override;
184 void DestroyDescriptorPool(Handle handle) override;
185
187 RHIDeviceSampler* GetSampler(Handle handle) const override;
188 void DestroySampler(Handle handle) override;
189
192 RHIDeviceQueryPool* GetQueryPool(Handle handle) const override;
193 void DestroyQueryPool(Handle handle) override;
194
197 ) const override;
198 [[nodiscard]] size_t
200 void* dest) const override;
201
204
207 size_t timeout) override;
208
209 void WaitIdle() const override;
210
211 void QueryBudget(size_t& used, size_t& budget) const override;
212 String QueryDeviceString() const override;
213
214 Allocator* GetAllocator() const;
215 vk::AllocationCallbacks const& GetVkAllocatorCallbacks() const;
216
217 auto const& GetVkQueues() const { return mQueues; }
218 auto const& GetVkDevice() const { return mDevice; }
219 auto const& GetVkSurface() const { return mSurface; }
220 auto const& GetVkPhysicalDevice() const { return mPhysicalDevice; }
221 auto const& GetVkAllocator() const { return mVkAllocator; }
222
223 void DebugSetObjectName(const char* name) override;
224 };
226 {
230 vk::raii::Queue mQueue{nullptr};
231
232 public:
238
239 [[nodiscard]] const VulkanDevice& GetVulkanDevice() const { return mDevice; }
240 [[nodiscard]] vk::raii::Queue GetVkQueue() const { return mQueue; }
242 [[nodiscard]] uint32_t GetVkQueueFamily() const override { return mFamilyIndex; }
243
244 void WaitIdle() const override;
246 void Present(PresentDesc const& desc) const override;
247
248
249 void DebugSetObjectName(const char* name) override;
250 };
251} // namespace Foundation::RHI
General Purpose Allocator (GPA) interface.
Definition Allocator.hpp:24
Definition Resource.hpp:57
Definition Command.hpp:18
Definition Descriptor.hpp:49
Definition Device.hpp:66
Definition Device.hpp:164
Definition Device.hpp:16
Definition Device.hpp:104
Definition Device.hpp:55
Definition Device.hpp:189
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:190
Definition Application.hpp:16
const VulkanDevice & mDevice
Definition Device.hpp:64
void DebugSetObjectName(const char *name) override
Definition Device.cpp:632
vk::raii::DescriptorSetLayout mLayout
Definition Device.hpp:65
auto const & GetVkLayout() const
Definition Device.hpp:69
Definition Device.hpp:52
void DebugSetObjectName(const char *name) override
Definition Device.cpp:353
vk::raii::Fence mFence
Definition Device.hpp:54
const VulkanDevice & mDevice
Definition Device.hpp:53
auto const & GetVkFence() const
Definition Device.hpp:58
const VulkanDevice & mDevice
Definition Device.hpp:86
auto const & GetVkQueryPool() const
Definition Device.hpp:94
vk::raii::QueryPool mQueryPool
Definition Device.hpp:88
Vector< uint64_t > mResults
Definition Device.hpp:90
const float GetTimestampResolution() override
Definition Device.hpp:96
void Reset() override
Definition Device.cpp:732
void DebugSetObjectName(const char *name) override
Definition Device.cpp:745
Span< const uint64_t > GetResults(bool wait) override
Definition Device.cpp:734
const float mTimestampResolution
Definition Device.hpp:87
Definition Device.hpp:226
vk::raii::Queue mQueue
Definition Device.hpp:230
void WaitIdle() const override
Definition Device.cpp:452
vk::raii::Queue GetVkQueue() const
Definition Device.hpp:240
const uint32_t mQueueIndex
Definition Device.hpp:228
uint32_t GetVkQueueIndex() const
Definition Device.hpp:241
uint32_t GetVkQueueFamily() const override
Definition Device.hpp:242
void DebugSetObjectName(const char *name) override
Definition Device.cpp:559
const VulkanDevice & mDevice
Definition Device.hpp:227
void Submit(Span< const SubmitDesc >, RHIDeviceFence *completionFence) const override
Definition Device.cpp:454
VulkanDeviceQueue(const VulkanDevice &device, uint32_t family_index, uint32_t queue_index)
Definition Device.hpp:233
const VulkanDevice & GetVulkanDevice() const
Definition Device.hpp:239
const uint32_t mFamilyIndex
Definition Device.hpp:229
Definition Device.hpp:74
const VulkanDevice & mDevice
Definition Device.hpp:75
void DebugSetObjectName(const char *name) override
Definition Device.cpp:704
auto const & GetVkSampler() const
Definition Device.hpp:80
vk::raii::Sampler mSampler
Definition Device.hpp:76
auto const & GetVkSemaphore() const
Definition Device.hpp:47
const VulkanDevice & mDevice
Definition Device.hpp:42
void DebugSetObjectName(const char *name) override
Definition Device.cpp:336
vk::raii::Semaphore mSemaphore
Definition Device.hpp:43
Definition Device.hpp:104
RHIDeviceFence * GetFence(Handle handle) const override
Definition Device.cpp:378
bool WaitForFences(Span< RHIDeviceFence *const > fences, bool wait_all, size_t timeout) override
Wait for fences to arrive.
Definition Device.cpp:392
RHIObjectPool mStorage
Definition Device.hpp:119
RHIDeviceDescriptorSetLayout * GetDescriptorSetLayout(Handle handle) const override
Definition Device.cpp:681
RHIDeviceDescriptorPool * GetDescriptorPool(Handle handle) const override
Definition Device.cpp:696
void DestroySemaphore(Handle handle) override
Definition Device.cpp:371
RHIDeviceScopedHandle< RHIDeviceDescriptorPool > CreateDescriptorPool(RHIDeviceDescriptorPool::PoolDesc const &desc) override
Definition Device.cpp:691
RHIAccelerationStructureSizeInfo GetAccelerationStructureSizeInfo(RHIAccelerationStructureBuildDesc const &desc) const override
Definition Device.cpp:584
void DestroyAccelerationStructure(Handle handle) override
Definition Device.cpp:630
void DestroyQueryPool(Handle handle) override
Definition Device.cpp:846
vk::AllocationCallbacks const & GetVkAllocatorCallbacks() const
Definition Device.cpp:21
const VulkanApplication & mApp
Definition Device.hpp:105
void ResetFences(Span< RHIDeviceFence *const > fences) override
Definition Device.cpp:381
RHIDeviceScopedHandle< RHIDeviceFence > CreateFence(bool signaled) override
Definition Device.cpp:373
size_t WriteAccelerationStructureInstanceData(RHIAccelerationStructureGeometryInstance const &data, void *dest) const override
Definition Device.cpp:596
void DestroyFence(Handle handle) override
Definition Device.cpp:379
RHIDeviceScopedHandle< RHIPipelineState > CreatePipelineState(RHIPipelineState::PipelineStateDesc const &desc) override
Definition Device.cpp:286
void DestroyPipelineState(Handle handle) override
Definition Device.cpp:296
void QueryBudget(size_t &used, size_t &budget) const override
Definition Device.cpp:218
RHIDeviceScopedHandle< RHIPipelineStateCache > CreatePipelineCache(RHIPipelineStateCache::PipelineStateCacheDesc const &desc) override
Definition Device.cpp:271
Vector< RHISwapchainPresentMode > mSwapchainPresentModes
Definition Device.hpp:114
RHIDeviceScopedHandle< RHIDeviceSampler > CreateSampler(RHIDeviceSampler::SamplerDesc const &desc) override
Definition Device.cpp:824
RHITexture * GetTexture(Handle handle) const override
Definition Device.cpp:580
RHIBuffer * GetBuffer(Handle handle) const override
Definition Device.cpp:572
RHIDeviceScopedHandle< RHIDeviceSemaphore > CreateSemaphore(bool is_timeline) override
Definition Device.cpp:361
void DestroyShaderModule(Handle handle) override
Definition Device.cpp:310
RHIDeviceScopedHandle< RHIBuffer > CreateBuffer(RHIBufferDesc const &desc) override
Definition Device.cpp:567
vk::raii::PhysicalDevice mPhysicalDevice
Definition Device.hpp:109
bool WaitForTimelineSemaphores(Span< const Pair< RHIDeviceSemaphore *, size_t > > semaphores, size_t timeout) override
Wait for timeline semaphores to reach specified values.
Definition Device.cpp:419
RHIAccelerationStructure * GetAccelerationStructure(Handle handle) const override
Definition Device.cpp:625
void DestroyBuffer(Handle handle) override
Definition Device.cpp:573
Vector< RHIResourceFormat > mSwapchainFormats
Definition Device.hpp:113
RHIDeviceScopedHandle< RHIDeviceQueryPool > CreateQueryPool(RHIDeviceQueryPool::QueryPoolDesc const &desc) override
Definition Device.cpp:836
void DestroySampler(Handle handle) override
Definition Device.cpp:834
VmaAllocator mVkAllocator
Definition Device.hpp:116
Span< RHISwapchainPresentMode const > GetSwapchainSupportedPresentModes() const override
Definition Device.cpp:257
RHIDeviceQueue * GetDeviceQueue(RHIDeviceQueueType type) const override
Definition Device.cpp:238
RHIDeviceScopedHandle< RHISwapchain > CreateSwapchain(RHISwapchain::SwapchainDesc const &desc) override
Definition Device.cpp:262
void DestroyDescriptorPool(Handle handle) override
Definition Device.cpp:701
void DestroySwapchain(Handle handle) override
Definition Device.cpp:268
RHIPipelineState * GetPipelineState(Handle handle) const override
Definition Device.cpp:291
~VulkanDevice() override
Definition Device.cpp:206
auto const & GetVkQueues() const
Definition Device.hpp:217
auto const & GetVkAllocator() const
Definition Device.hpp:221
RHIDeviceScopedHandle< RHIAccelerationStructure > CreateAccelerationStructure(RHIAccelerationStructureDesc const &desc) override
Definition Device.cpp:620
RHICommandPool * GetCommandPool(Handle handle) const override
Definition Device.cpp:319
auto const & GetVkPhysicalDevice() const
Definition Device.hpp:220
vk::raii::Device mDevice
Definition Device.hpp:110
String QueryDeviceString() const override
Definition Device.cpp:227
Allocator * GetAllocator() const
Definition Device.cpp:20
RHIShaderModule * GetShaderModule(Handle handle) const override
Definition Device.cpp:305
RHIDeviceSemaphore * GetSemaphore(Handle handle) const override
Definition Device.cpp:366
void DebugSetObjectName(const char *name) override
Definition Device.cpp:444
void DestroyDescriptorSetLayout(Handle handle) override
Definition Device.cpp:686
auto const & GetVkSurface() const
Definition Device.hpp:219
UniquePtr< VulkanDeviceQueues > mQueues
Definition Device.hpp:121
void SignalTimelineSemaphores(Span< const Pair< RHIDeviceSemaphore *, size_t > > semaphores) override
Definition Device.cpp:408
void WaitIdle() const override
Definition Device.cpp:216
RHIPipelineStateCache * GetPipelineCache(Handle handle) const override
Definition Device.cpp:276
RHIDeviceScopedHandle< RHITexture > CreateTexture(RHITextureDesc const &desc) override
Definition Device.cpp:575
vk::raii::SurfaceKHR mSurface
Definition Device.hpp:111
RHISwapchain * GetSwapchain(Handle handle) const override
Definition Device.cpp:267
void DestroyPipelineCache(Handle handle) override
Definition Device.cpp:281
Span< RHIResourceFormat const > GetSwapchainSupportedFormats() const override
Definition Device.cpp:255
void DestroyTexture(Handle handle) override
Definition Device.cpp:581
RHIDeviceScopedHandle< RHIShaderModule > CreateShaderModule(RHIShaderModule::ShaderModuleDesc const &desc) override
Definition Device.cpp:300
void DestroyCommandPool(Handle handle) override
Definition Device.cpp:324
SDL_Window * mWindow
Definition Device.hpp:107
auto const & GetVkDevice() const
Definition Device.hpp:218
RHIDeviceQueryPool * GetQueryPool(Handle handle) const override
Definition Device.cpp:841
RHIDeviceScopedHandle< RHICommandPool > CreateCommandPool(RHICommandPool::PoolDesc desc) override
Definition Device.cpp:314
RHIDeviceScopedHandle< RHIDeviceDescriptorSetLayout > CreateDescriptorSetLayout(RHIDeviceDescriptorSetLayoutDesc const &desc) override
Definition Device.cpp:676
RHIDeviceSampler * GetSampler(Handle handle) const override
Definition Device.cpp:829
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:128
uintptr_t Handle
Definition Details.hpp:8
RHIDeviceQueueType
Definition Common.hpp:109
static constexpr Handle kInvalidHandle
Definition Details.hpp:9
constexpr uint32_t kInvalidQueueIndex
Definition Device.hpp:10
Definition Resource.hpp:28
Definition Resource.hpp:116
Definition Device.hpp:12
VulkanDeviceQueue * Get(Handle handle) const
Definition Device.cpp:236
VulkanDeviceQueues(Allocator *allocator)
Definition Device.hpp:15
Handle compute
Definition Device.hpp:14
bool IsDedicatedTransfer() const
Definition Device.hpp:37
Handle graphics
Definition Device.hpp:14
bool IsValid() const
Definition Device.hpp:32
RHIObjectPool< VulkanDeviceQueue > storage
Definition Device.hpp:13
bool IsDedicatedCompute() const
Definition Device.hpp:36
VulkanDeviceQueue * Get(RHIDeviceQueueType type) const
Definition Device.hpp:17
Handle transfer
Definition Device.hpp:14