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 <mutex>
6
7#include "Application.hpp"
8#include "Common.hpp"
9namespace Foundation::RHI
10{
11 class VulkanApplication;
12 class VulkanDeviceQueue;
13 constexpr uint32_t kInvalidQueueIndex = static_cast<uint32_t>(-1);
15 {
18 VulkanDeviceQueues(Allocator* allocator) : storage(allocator) {};
19 VulkanDeviceQueue* Get(Handle handle) const;
21 {
22 switch (type)
23 {
25 return Get(compute);
27 return Get(transfer);
30 return Get(graphics);
31 default:
32 return nullptr;
33 }
34 }
35 bool IsValid() const
36 {
38 }
39 };
40 class VulkanDevice;
42 {
44 vk::raii::Semaphore mSemaphore{nullptr};
45
46 public:
48 [[nodiscard]] auto const& GetVkSemaphore() const { return mSemaphore; }
49
50 void DebugSetObjectName(const char* name) override;
51 };
53 {
55 vk::raii::Fence mFence{nullptr};
56
57 public:
58 VulkanDeviceFence(const VulkanDevice& device, bool signaled);
59 [[nodiscard]] auto const& GetVkFence() const { return mFence; }
60
61 void DebugSetObjectName(const char* name) override;
62 };
64 {
66 vk::raii::DescriptorSetLayout mLayout{nullptr};
67
68 public:
70 [[nodiscard]] auto const& GetVkLayout() const { return mLayout; }
71
72 void DebugSetObjectName(const char* name) override;
73 };
75 {
77 vk::raii::Sampler mSampler{nullptr};
78
79 public:
80 VulkanDeviceSampler(const VulkanDevice& device, SamplerDesc const& desc);
81 [[nodiscard]] auto const& GetVkSampler() const { return mSampler; }
82
83 void DebugSetObjectName(const char* name) override;
84 };
86 {
89 vk::raii::QueryPool mQueryPool{nullptr};
90
92
93 public:
94 VulkanDeviceQueryPool(const VulkanDevice& device, QueryPoolDesc const& desc);
95 [[nodiscard]] auto const& GetVkQueryPool() const { return mQueryPool; }
96
97 const float GetTimestampResolution() override { return mTimestampResolution; }
98
99 void Reset() override;
100
101 Span<const uint64_t> GetResults(bool wait) override;
102 void DebugSetObjectName(const char* name) override;
103 };
105 {
111 public:
112 VulkanVirtualAllocator(const VulkanDevice& device, uint64_t size);
113 ~VulkanVirtualAllocator() override;
114 [[nodiscard]] uint64_t Allocate(uint64_t size, uint64_t alignment) override;
115 void Free(uint64_t offset) override;
116 void Clear() override;
117 [[nodiscard]] uint64_t GetUsedBytes() const override;
118 [[nodiscard]] uint64_t GetCapacity() const override { return mCapacity; }
119 [[nodiscard]] uint64_t GetPeakUsage() const override { return mPeakUsage; }
120 };
121 class VulkanDevice : public RHIDevice
122 {
124
126
127 vk::raii::PhysicalDevice mPhysicalDevice{nullptr};
128 vk::raii::Device mDevice{nullptr};
129 vk::raii::SurfaceKHR mSurface{nullptr};
130
133
135 // Device Object storage
136 // Lifetimes and handle dereferencing are managed by the device.
138 // Queues
140 // Serializes queue submit/present/wait-idle: VkQueue access must be externally
141 // synchronized, and background uploads may submit while the renderer does.
143
144 vk::PhysicalDeviceProperties mPhysicalDeviceProperties{};
147 public:
149 VulkanDevice(VulkanApplication const& app, vk::raii::PhysicalDevice physicalDevice,
150 SDL_Window* window = nullptr);
151 ~VulkanDevice() override;
152
155
157
161 RHISwapchain* GetSwapchain(Handle handle) const override;
162 void DestroySwapchain(Handle handle) override;
163
166 RHIPipelineStateCache* GetPipelineCache(Handle handle) const override;
167 void DestroyPipelineCache(Handle handle) override;
168
171 RHIPipelineState* GetPipelineState(Handle handle) const override;
172 void DestroyPipelineState(Handle handle) override;
173
176 RHIShaderModule* GetShaderModule(Handle handle) const override;
177 void DestroyShaderModule(Handle handle) override;
178
180 RHICommandPool* GetCommandPool(Handle handle) const override;
181 void DestroyCommandPool(Handle handle) override;
182
184 RHIDeviceSemaphore* GetSemaphore(Handle handle) const override;
185 void DestroySemaphore(Handle handle) override;
186
188 RHIDeviceFence* GetFence(Handle handle) const override;
189 void DestroyFence(Handle handle) override;
190
192 RHIBuffer* GetBuffer(Handle handle) const override;
193 void DestroyBuffer(Handle handle) override;
194
196 RHITexture* GetTexture(Handle handle) const override;
197 void DestroyTexture(Handle handle) override;
198
202 void DestroyAccelerationStructure(Handle handle) override;
203
207 void DestroyDescriptorSetLayout(Handle handle) override;
208
211 RHIDeviceDescriptorPool* GetDescriptorPool(Handle handle) const override;
212 void DestroyDescriptorPool(Handle handle) override;
213
215 RHIDeviceSampler* GetSampler(Handle handle) const override;
216 void DestroySampler(Handle handle) override;
217
220 RHIDeviceQueryPool* GetQueryPool(Handle handle) const override;
221 void DestroyQueryPool(Handle handle) override;
222
224 RHIVirtualAllocator* GetVirtualAllocator(Handle handle) const override;
225 void DestroyVirtualAllocator(Handle handle) override;
226
229 Allocator* scratchAllocator = nullptr
230 ) const override;
231 [[nodiscard]] size_t
233 void* dest) const override;
234
237
240 size_t timeout) override;
241
242 void WaitIdle() const override;
243
244 void QueryBudget(size_t& used, size_t& budget) const override;
245 void QueryAllocationStats(size_t& blockBytes, size_t& allocationBytes) const override;
246 void QueryMemoryStats(RHIDeviceMemoryStats& outStats) const override;
247 String QueryDeviceString() const override;
248
249 Allocator* GetAllocator() const;
250
251 auto const& GetVkQueues() const { return mQueues; }
252 auto const& GetVkDevice() const { return mDevice; }
253 auto const& GetVkSurface() const { return mSurface; }
254 auto const& GetVkPhysicalDevice() const { return mPhysicalDevice; }
256 auto const& GetVkAllocator() const { return mVkAllocator; }
257 [[nodiscard]] vk::AllocationCallbacks const* GetVkAllocationCallbacks() const;
259
260 void DebugSetObjectName(const char* name) override;
261 };
263 {
267 vk::raii::Queue mQueue{nullptr};
268
269 public:
275
276 [[nodiscard]] const VulkanDevice& GetVulkanDevice() const { return mDevice; }
277 [[nodiscard]] vk::raii::Queue GetVkQueue() const { return mQueue; }
279 [[nodiscard]] uint32_t GetVkQueueFamily() const override { return mFamilyIndex; }
280
281 void WaitIdle() const override;
282 void Submit(Span<const SubmitDesc>, RHIDeviceFence* completionFence) const override;
283 void Present(PresentDesc const& desc) const override;
284
285
286 void DebugSetObjectName(const char* name) override;
287 };
288} // 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:245
Thread-safe type-erased handle dereference facility for RHI Objects.
Definition Details.hpp:148
Definition PipelineState.hpp:28
Definition PipelineState.hpp:45
Scoped move-only RAII handle wrapper for RHI Objects.
Definition Details.hpp:86
Definition Shader.hpp:5
Definition Swapchain.hpp:19
Definition Resource.hpp:216
Sub-allocates byte ranges within an abstract fixed-size space.
Definition Resource.hpp:124
Definition Application.hpp:9
const VulkanDevice & mDevice
Definition Device.hpp:65
void DebugSetObjectName(const char *name) override
Definition Device.cpp:939
vk::raii::DescriptorSetLayout mLayout
Definition Device.hpp:66
auto const & GetVkLayout() const
Definition Device.hpp:70
Definition Device.hpp:53
void DebugSetObjectName(const char *name) override
Definition Device.cpp:643
vk::raii::Fence mFence
Definition Device.hpp:55
const VulkanDevice & mDevice
Definition Device.hpp:54
auto const & GetVkFence() const
Definition Device.hpp:59
const VulkanDevice & mDevice
Definition Device.hpp:87
auto const & GetVkQueryPool() const
Definition Device.hpp:95
vk::raii::QueryPool mQueryPool
Definition Device.hpp:89
Vector< uint64_t > mResults
Definition Device.hpp:91
const float GetTimestampResolution() override
Definition Device.hpp:97
void Reset() override
Definition Device.cpp:1039
void DebugSetObjectName(const char *name) override
Definition Device.cpp:1052
Span< const uint64_t > GetResults(bool wait) override
Definition Device.cpp:1041
const float mTimestampResolution
Definition Device.hpp:88
Definition Device.hpp:263
vk::raii::Queue mQueue
Definition Device.hpp:267
void WaitIdle() const override
Definition Device.cpp:750
vk::raii::Queue GetVkQueue() const
Definition Device.hpp:277
const uint32_t mQueueIndex
Definition Device.hpp:265
uint32_t GetVkQueueIndex() const
Definition Device.hpp:278
uint32_t GetVkQueueFamily() const override
Definition Device.hpp:279
void DebugSetObjectName(const char *name) override
Definition Device.cpp:863
const VulkanDevice & mDevice
Definition Device.hpp:264
void Submit(Span< const SubmitDesc >, RHIDeviceFence *completionFence) const override
Definition Device.cpp:756
VulkanDeviceQueue(const VulkanDevice &device, uint32_t family_index, uint32_t queue_index)
Definition Device.hpp:270
const VulkanDevice & GetVulkanDevice() const
Definition Device.hpp:276
const uint32_t mFamilyIndex
Definition Device.hpp:266
Definition Device.hpp:75
const VulkanDevice & mDevice
Definition Device.hpp:76
void DebugSetObjectName(const char *name) override
Definition Device.cpp:1011
auto const & GetVkSampler() const
Definition Device.hpp:81
vk::raii::Sampler mSampler
Definition Device.hpp:77
auto const & GetVkSemaphore() const
Definition Device.hpp:48
const VulkanDevice & mDevice
Definition Device.hpp:43
void DebugSetObjectName(const char *name) override
Definition Device.cpp:626
vk::raii::Semaphore mSemaphore
Definition Device.hpp:44
Definition Device.hpp:122
RHIDeviceFence * GetFence(Handle handle) const override
Definition Device.cpp:668
bool WaitForFences(Span< RHIDeviceFence *const > fences, bool wait_all, size_t timeout) override
Wait for fences to arrive.
Definition Device.cpp:682
RHIObjectPool mStorage
Definition Device.hpp:137
RHIDeviceDescriptorSetLayout * GetDescriptorSetLayout(Handle handle) const override
Definition Device.cpp:988
RHIDeviceDescriptorPool * GetDescriptorPool(Handle handle) const override
Definition Device.cpp:1003
void DestroySemaphore(Handle handle) override
Definition Device.cpp:661
RHIDeviceScopedHandle< RHIDeviceDescriptorPool > CreateDescriptorPool(RHIDeviceDescriptorPool::PoolDesc const &desc) override
Definition Device.cpp:998
vk::AllocationCallbacks const * GetVkAllocationCallbacks() const
Definition Device.cpp:734
RHIDeviceScopedHandle< RHIVirtualAllocator > CreateVirtualAllocator(uint64_t size) override
Definition Device.cpp:1205
RHIDeviceCapabilities mDeviceCaps
Definition Device.hpp:146
void DestroyAccelerationStructure(Handle handle) override
Definition Device.cpp:937
void DestroyQueryPool(Handle handle) override
Definition Device.cpp:1153
VkAllocationCallbacks const * GetVkAllocationCallbacksNative() const
Definition Device.cpp:738
const VulkanApplication & mApp
Definition Device.hpp:123
void ResetFences(Span< RHIDeviceFence *const > fences) override
Definition Device.cpp:671
RHIDeviceScopedHandle< RHIDeviceFence > CreateFence(bool signaled) override
Definition Device.cpp:663
size_t WriteAccelerationStructureInstanceData(RHIAccelerationStructureGeometryInstance const &data, void *dest) const override
Definition Device.cpp:902
void DestroyFence(Handle handle) override
Definition Device.cpp:669
RHIDeviceScopedHandle< RHIPipelineState > CreatePipelineState(RHIPipelineState::PipelineStateDesc const &desc) override
Definition Device.cpp:576
void DestroyPipelineState(Handle handle) override
Definition Device.cpp:586
void QueryBudget(size_t &used, size_t &budget) const override
Definition Device.cpp:429
RHIDeviceScopedHandle< RHIPipelineStateCache > CreatePipelineCache(RHIPipelineStateCache::PipelineStateCacheDesc const &desc) override
Definition Device.cpp:561
Vector< RHISwapchainPresentMode > mSwapchainPresentModes
Definition Device.hpp:132
RHIDeviceScopedHandle< RHIDeviceSampler > CreateSampler(RHIDeviceSampler::SamplerDesc const &desc) override
Definition Device.cpp:1131
RHITexture * GetTexture(Handle handle) const override
Definition Device.cpp:884
RHIBuffer * GetBuffer(Handle handle) const override
Definition Device.cpp:876
RHIDeviceScopedHandle< RHIDeviceSemaphore > CreateSemaphore(bool is_timeline) override
Definition Device.cpp:651
void DestroyShaderModule(Handle handle) override
Definition Device.cpp:600
RHIDeviceScopedHandle< RHIBuffer > CreateBuffer(RHIBufferDesc const &desc) override
Definition Device.cpp:871
void DestroyVirtualAllocator(Handle handle) override
Definition Device.cpp:1215
vk::raii::PhysicalDevice mPhysicalDevice
Definition Device.hpp:127
bool WaitForTimelineSemaphores(Span< const Pair< RHIDeviceSemaphore *, size_t > > semaphores, size_t timeout) override
Wait for timeline semaphores to reach specified values.
Definition Device.cpp:709
RHIAccelerationStructure * GetAccelerationStructure(Handle handle) const override
Definition Device.cpp:932
void DestroyBuffer(Handle handle) override
Definition Device.cpp:877
RHIDeviceScopedHandle< RHIDeviceQueryPool > CreateQueryPool(RHIDeviceQueryPool::QueryPoolDesc const &desc) override
Definition Device.cpp:1143
void DestroySampler(Handle handle) override
Definition Device.cpp:1141
VmaAllocator mVkAllocator
Definition Device.hpp:134
Span< RHISwapchainPresentMode const > GetSwapchainSupportedPresentModes() const override
Definition Device.cpp:547
void QueryAllocationStats(size_t &blockBytes, size_t &allocationBytes) const override
Definition Device.cpp:438
RHIDeviceQueue * GetDeviceQueue(RHIDeviceQueueType type) const override
Definition Device.cpp:528
RHIDeviceScopedHandle< RHISwapchain > CreateSwapchain(RHISwapchain::SwapchainDesc const &desc) override
Definition Device.cpp:552
auto const & GetVkPhysicalDeviceProperties() const
Definition Device.hpp:255
void DestroyDescriptorPool(Handle handle) override
Definition Device.cpp:1008
void DestroySwapchain(Handle handle) override
Definition Device.cpp:558
RHIPipelineState * GetPipelineState(Handle handle) const override
Definition Device.cpp:581
RHIDeviceCapabilities GetCapabilities() const override
Definition Device.hpp:153
~VulkanDevice() override
Definition Device.cpp:413
RHIVirtualAllocator * GetVirtualAllocator(Handle handle) const override
Definition Device.cpp:1210
auto const & GetVkQueues() const
Definition Device.hpp:251
void QueryMemoryStats(RHIDeviceMemoryStats &outStats) const override
Definition Device.cpp:450
auto const & GetVkAllocator() const
Definition Device.hpp:256
Vector< RHISurfaceFormat > mSwapchainFormats
Definition Device.hpp:131
RHIDeviceScopedHandle< RHIAccelerationStructure > CreateAccelerationStructure(RHIAccelerationStructureDesc const &desc) override
Definition Device.cpp:927
Mutex mQueueSubmitMutex
Definition Device.hpp:142
RHICommandPool * GetCommandPool(Handle handle) const override
Definition Device.cpp:609
auto const & GetVkPhysicalDevice() const
Definition Device.hpp:254
vk::raii::Device mDevice
Definition Device.hpp:128
String QueryDeviceString() const override
Definition Device.cpp:517
Allocator * GetAllocator() const
Definition Device.cpp:60
RHIShaderModule * GetShaderModule(Handle handle) const override
Definition Device.cpp:595
RHIDeviceSemaphore * GetSemaphore(Handle handle) const override
Definition Device.cpp:656
void DebugSetObjectName(const char *name) override
Definition Device.cpp:742
vk::PhysicalDeviceProperties mPhysicalDeviceProperties
Definition Device.hpp:144
RHIPipelineStateCacheKey mPipelineCacheKey
Definition Device.hpp:145
void DestroyDescriptorSetLayout(Handle handle) override
Definition Device.cpp:993
auto const & GetVkSurface() const
Definition Device.hpp:253
UniquePtr< VulkanDeviceQueues > mQueues
Definition Device.hpp:139
RHIAccelerationStructureSizeInfo GetAccelerationStructureSizeInfo(RHIAccelerationStructureBuildDesc const &desc, Allocator *scratchAllocator=nullptr) const override
Definition Device.cpp:888
void SignalTimelineSemaphores(Span< const Pair< RHIDeviceSemaphore *, size_t > > semaphores) override
Definition Device.cpp:698
void WaitIdle() const override
Definition Device.cpp:427
RHIPipelineStateCacheKey GetPipelineCacheKey() const override
Definition Device.hpp:154
RHIPipelineStateCache * GetPipelineCache(Handle handle) const override
Definition Device.cpp:566
RHIDeviceScopedHandle< RHITexture > CreateTexture(RHITextureDesc const &desc) override
Definition Device.cpp:879
vk::raii::SurfaceKHR mSurface
Definition Device.hpp:129
RHISwapchain * GetSwapchain(Handle handle) const override
Definition Device.cpp:557
Mutex & GetQueueSubmitMutex() const
Definition Device.hpp:148
Span< RHISurfaceFormat const > GetSwapchainSupportedFormats() const override
Definition Device.cpp:545
void DestroyPipelineCache(Handle handle) override
Definition Device.cpp:571
void DestroyTexture(Handle handle) override
Definition Device.cpp:885
RHIDeviceScopedHandle< RHIShaderModule > CreateShaderModule(RHIShaderModule::ShaderModuleDesc const &desc) override
Definition Device.cpp:590
void DestroyCommandPool(Handle handle) override
Definition Device.cpp:614
SDL_Window * mWindow
Definition Device.hpp:125
auto const & GetVkDevice() const
Definition Device.hpp:252
RHIDeviceQueryPool * GetQueryPool(Handle handle) const override
Definition Device.cpp:1148
RHIDeviceScopedHandle< RHICommandPool > CreateCommandPool(RHICommandPool::PoolDesc desc) override
Definition Device.cpp:604
RHIDeviceScopedHandle< RHIDeviceDescriptorSetLayout > CreateDescriptorSetLayout(RHIDeviceDescriptorSetLayoutDesc const &desc) override
Definition Device.cpp:983
RHIDeviceSampler * GetSampler(Handle handle) const override
Definition Device.cpp:1136
void Clear() override
Definition Device.cpp:1191
uint64_t Allocate(uint64_t size, uint64_t alignment) override
Sub-allocates size bytes with the given alignment.
Definition Device.cpp:1169
Map< uint64_t, VmaVirtualAllocation > mAllocations
Definition Device.hpp:108
const VulkanDevice & mDevice
Definition Device.hpp:106
VmaVirtualBlock mBlock
Definition Device.hpp:107
uint64_t GetPeakUsage() const override
Definition Device.hpp:119
~VulkanVirtualAllocator() override
Definition Device.cpp:1163
uint64_t mPeakUsage
Definition Device.hpp:110
uint64_t GetUsedBytes() const override
Definition Device.cpp:1198
void Free(uint64_t offset) override
Definition Device.cpp:1183
uint64_t mCapacity
Definition Device.hpp:109
uint64_t GetCapacity() const override
Definition Device.hpp:118
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::mutex Mutex
Definition Thread.hpp:10
std::pair< First, Second > Pair
Alias for std::pair
Definition Container.hpp:32
std::map< K, V, Predicate, StlAllocator< Pair< const K, V > > > Map
std::map with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:160
std::unique_ptr< T, Deleter > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:170
T * Construct(Allocator *resource, Args &&...args)
Convenience placement new with object of type T using a Foundation::Core::Allocator.
Definition Allocator.hpp:153
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:183
uintptr_t Handle
Definition Details.hpp:8
RHIDeviceQueueType
Definition Common.hpp:164
static constexpr Handle kInvalidHandle
Definition Details.hpp:9
constexpr uint32_t kInvalidQueueIndex
Definition Device.hpp:13
Definition Resource.hpp:28
Definition Device.hpp:237
Definition PipelineState.hpp:13
Definition Resource.hpp:142
Definition Device.hpp:15
VulkanDeviceQueue * Get(Handle handle) const
Definition Device.cpp:526
VulkanDeviceQueues(Allocator *allocator)
Definition Device.hpp:18
Handle compute
Definition Device.hpp:17
Handle graphics
Definition Device.hpp:17
bool IsValid() const
Definition Device.hpp:35
RHIObjectPool< VulkanDeviceQueue > storage
Definition Device.hpp:16
VulkanDeviceQueue * Get(RHIDeviceQueueType type) const
Definition Device.hpp:20
Handle transfer
Definition Device.hpp:17