Foundation
Loading...
Searching...
No Matches
Device.hpp
Go to the documentation of this file.
1#pragma once
2#include <vk_mem_alloc.h>
3#include <RHICore/Device.hpp>
5#include "Common.hpp"
6namespace Foundation::RHI {
7 class VulkanApplication;
8 class VulkanDeviceQueue;
9 constexpr uint32_t kInvalidQueueIndex = static_cast<uint32_t>(-1);
11 {
15 VulkanDeviceQueue* Get(Handle handle) const;
17 switch (type) {
21 default:
23 }
24 }
25 bool IsValid() const {
26 return graphics != kInvalidHandle &&
29 }
30 bool CanPresent() const {
31 return present != kInvalidHandle;
32 }
33 bool IsDedicatedCompute() const {
34 return IsValid() && compute != graphics;
35 }
36 bool IsDedicatedTransfer() const {
37 return IsValid() && transfer != graphics;
38 }
39 bool IsDedicatedPresent() const {
40 return IsValid() && present != graphics;
41 }
42 };
43 class VulkanDevice;
46 vk::raii::Semaphore mSemaphore{ nullptr };
47 public:
49 [[nodiscard]] auto const& GetVkSemaphore() const { return mSemaphore; }
50
51 void DebugSetObjectName(const char* name) override;
52 };
55 vk::raii::Fence mFence{ nullptr };
56 public:
58 [[nodiscard]] auto const& GetVkFence() const { return mFence; }
59
60 void DebugSetObjectName(const char* name) override;
61 };
64 vk::raii::DescriptorSetLayout mLayout{ nullptr };
65 public:
67 [[nodiscard]] auto const& GetVkLayout() const { return mLayout; }
68
69 void DebugSetObjectName(const char* name) override;
70 };
73 vk::raii::Sampler mSampler{ nullptr };
74 public:
76 [[nodiscard]] auto const& GetVkSampler() const { return mSampler; }
77
78 void DebugSetObjectName(const char* name) override;
79 };
80 class VulkanDevice : public RHIDevice {
82
83 vk::PhysicalDeviceProperties mProperties;
84 vk::raii::PhysicalDevice mPhysicalDevice{ nullptr };
85 vk::raii::Device mDevice{ nullptr };
86 vk::raii::SurfaceKHR mSurface{ nullptr };
87
90
92 // Device Object storage
93 // Lifetimes and handle dereferencing are managed by the device.
95 // Queues
98
99 public:
101 ~VulkanDevice() override;
102
103 void DebugLogDeviceInfo() const;
104 void DebugLogAllocatorInfo() const;
105
107
111 RHISwapchain* GetSwapchain(Handle handle) const override;
112 void DestroySwapchain(Handle handle) override;
113
115 RHIPipelineState* GetPipelineState(Handle handle) const override;
116 void DestroyPipelineState(Handle handle) override;
117
119 RHIShaderModule* GetShaderModule(Handle handle) const override;
120 void DestroyShaderModule(Handle handle) override;
121
123 RHICommandPool* GetCommandPool(Handle handle) const override;
124 void DestroyCommandPool(Handle handle) override;
125
127 RHIDeviceSemaphore* GetSemaphore(Handle handle) const override;
128 void DestroySemaphore(Handle handle) override;
129
131 RHIDeviceFence* GetFence(Handle handle) const override;
132 void DestroyFence(Handle handle) override;
133
135 RHIBuffer* GetBuffer(Handle handle) const override;
136 void DestroyBuffer(Handle handle) override;
137
139 RHITexture* GetImage(Handle handle) const override;
140 void DestroyImage(Handle handle) override;
141
144 void DestroyDescriptorSetLayout(Handle handle) override;
145
147 RHIDeviceDescriptorPool::PoolDesc const& desc) override;
148 RHIDeviceDescriptorPool* GetDescriptorPool(Handle handle) const override;
149 void DestroyDescriptorPool(Handle handle) override;
150
152 RHIDeviceSampler* GetSampler(Handle handle) const override;
153 void DestroySampler(Handle handle) override;
154
157
160
161 void WaitIdle() const override;
162
163 Allocator* GetAllocator() const;
164 vk::AllocationCallbacks const& GetVkAllocatorCallbacks() const;
165
166 auto const& GetVkQueues() const { return mQueues; }
167 auto const& GetVkDevice() const { return mDevice; }
168 auto const& GetVkSurface() const { return mSurface; }
169 auto const& GetVkPhysicalDevice() const { return mPhysicalDevice; }
170 auto const& GetVkAllocator() const { return mVkAllocator; }
171
172 void DebugSetObjectName(const char* name) override;
173 };
177 vk::raii::Queue mQueue{ nullptr };
178 public:
182
183 [[nodiscard]] const VulkanDevice& GetVulkanDevice() const { return mDevice; }
184 [[nodiscard]] vk::raii::Queue GetVkQueue() const { return mQueue; }
186
187 void WaitIdle() const override;
189 void Present(PresentDesc const& desc) const override;
190 [[nodiscard]] uint32_t GetQueueIndex() const override { return GetVkQueueIndex(); }
191
192 void DebugSetObjectName(const char* name) override;
193 };
194}
General Purpose Allocator (GPA) interface.
Definition Allocator.hpp:24
std::span with relaxed constructors for pointer-aliasing types and common containers.
Definition Container.hpp:59
Class representing a window for the platform.
Definition Application.hpp:15
Definition Resource.hpp:30
Definition Command.hpp:13
Definition Descriptor.hpp:43
Definition Device.hpp:57
Definition Device.hpp:13
Definition Device.hpp:88
Definition Device.hpp:48
Definition Device.hpp:131
Definition PipelineState.hpp:7
Definition Shader.hpp:5
Definition Swapchain.hpp:19
Definition Resource.hpp:146
Definition Application.hpp:24
const VulkanDevice & mDevice
Definition Device.hpp:63
void DebugSetObjectName(const char *name) override
Definition Device.cpp:633
vk::raii::DescriptorSetLayout mLayout
Definition Device.hpp:64
auto const & GetVkLayout() const
Definition Device.hpp:67
Definition Device.hpp:53
void DebugSetObjectName(const char *name) override
Definition Device.cpp:418
vk::raii::Fence mFence
Definition Device.hpp:55
const VulkanDevice & mDevice
Definition Device.hpp:54
auto const & GetVkFence() const
Definition Device.hpp:58
Definition Device.hpp:174
vk::raii::Queue mQueue
Definition Device.hpp:177
VulkanDeviceQueue(const VulkanDevice &device, uint32_t queue_index)
Definition Device.hpp:179
uint32_t GetQueueIndex() const override
Definition Device.hpp:190
void WaitIdle() const override
Definition Device.cpp:505
vk::raii::Queue GetVkQueue() const
Definition Device.hpp:184
const uint32_t mQueueIndex
Definition Device.hpp:176
uint32_t GetVkQueueIndex() const
Definition Device.hpp:185
void DebugSetObjectName(const char *name) override
Definition Device.cpp:611
const VulkanDevice & mDevice
Definition Device.hpp:175
void Submit(Span< const SubmitDesc >, RHIDeviceFence *completionFence) const override
Definition Device.cpp:506
const VulkanDevice & GetVulkanDevice() const
Definition Device.hpp:183
Definition Device.hpp:71
const VulkanDevice & mDevice
Definition Device.hpp:72
void DebugSetObjectName(const char *name) override
Definition Device.cpp:699
auto const & GetVkSampler() const
Definition Device.hpp:76
vk::raii::Sampler mSampler
Definition Device.hpp:73
auto const & GetVkSemaphore() const
Definition Device.hpp:49
const VulkanDevice & mDevice
Definition Device.hpp:45
void DebugSetObjectName(const char *name) override
Definition Device.cpp:403
vk::raii::Semaphore mSemaphore
Definition Device.hpp:46
Definition Device.hpp:80
RHIDeviceFence * GetFence(Handle handle) const override
Definition Device.cpp:440
RHIObjectPool mStorage
Definition Device.hpp:94
RHIDeviceDescriptorSetLayout * GetDescriptorSetLayout(Handle handle) const override
Definition Device.cpp:680
RHIDeviceDescriptorPool * GetDescriptorPool(Handle handle) const override
Definition Device.cpp:692
void DestroySemaphore(Handle handle) override
Definition Device.cpp:434
RHIDeviceScopedObjectHandle< RHIShaderModule > CreateShaderModule(RHIShaderModule::ShaderModuleDesc const &desc) override
Definition Device.cpp:373
Native::NativeWindow * window
Definition Device.hpp:97
RHIDeviceScopedObjectHandle< RHIDeviceSemaphore > CreateSemaphore(bool is_timeline) override
Definition Device.cpp:426
RHIDeviceScopedObjectHandle< RHITexture > CreateTexture(RHITextureDesc const &desc) override
Definition Device.cpp:626
void ResetFences(Span< const RHIDeviceObjectHandle< RHIDeviceFence > > fences) override
Definition Device.cpp:443
vk::AllocationCallbacks const & GetVkAllocatorCallbacks() const
Definition Device.cpp:26
const VulkanApplication & mApp
Definition Device.hpp:81
void WaitForFences(Span< const RHIDeviceObjectHandle< RHIDeviceFence > > fences, bool wait_all, size_t timeout) override
Definition Device.cpp:453
RHIDeviceScopedObjectHandle< RHIDeviceFence > CreateFence(bool signaled) override
Definition Device.cpp:436
RHIDeviceScopedObjectHandle< RHIPipelineState > CreatePipelineState(RHIPipelineState::PipelineStateDesc const &desc) override
Definition Device.cpp:361
void DestroyFence(Handle handle) override
Definition Device.cpp:441
void DestroyPipelineState(Handle handle) override
Definition Device.cpp:369
void DestroyImage(Handle handle) override
Definition Device.cpp:631
Vector< RHISwapchainPresentMode > mSwapchainPresentModes
Definition Device.hpp:89
RHIBuffer * GetBuffer(Handle handle) const override
Definition Device.cpp:623
void DestroyShaderModule(Handle handle) override
Definition Device.cpp:381
RHIDeviceScopedObjectHandle< RHICommandPool > CreateCommandPool(RHICommandPool::PoolDesc desc) override
Definition Device.cpp:384
vk::raii::PhysicalDevice mPhysicalDevice
Definition Device.hpp:84
void DestroyBuffer(Handle handle) override
Definition Device.cpp:624
Vector< RHIResourceFormat > mSwapchainFormats
Definition Device.hpp:88
void DestroySampler(Handle handle) override
Definition Device.cpp:769
VmaAllocator mVkAllocator
Definition Device.hpp:91
Span< RHISwapchainPresentMode const > GetSwapchainSupportedPresentModes() const override
Definition Device.cpp:348
RHIDeviceQueue * GetDeviceQueue(RHIDeviceQueueType type) const override
Definition Device.cpp:328
void DestroyDescriptorPool(Handle handle) override
Definition Device.cpp:696
void DestroySwapchain(Handle handle) override
Definition Device.cpp:357
RHIPipelineState * GetPipelineState(Handle handle) const override
Definition Device.cpp:365
~VulkanDevice() override
Definition Device.cpp:316
auto const & GetVkQueues() const
Definition Device.hpp:166
RHIDeviceScopedObjectHandle< RHIDeviceSampler > CreateSampler(RHIDeviceSampler::SamplerDesc const &desc) override
Definition Device.cpp:761
auto const & GetVkAllocator() const
Definition Device.hpp:170
RHIDeviceScopedObjectHandle< RHISwapchain > CreateSwapchain(RHISwapchain::SwapchainDesc const &desc) override
Definition Device.cpp:352
void DebugLogAllocatorInfo() const
https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/blob/master/src/VulkanSample....
Definition Device.cpp:227
RHICommandPool * GetCommandPool(Handle handle) const override
Definition Device.cpp:388
RHIDeviceScopedObjectHandle< RHIBuffer > CreateBuffer(RHIBufferDesc const &desc) override
Definition Device.cpp:619
auto const & GetVkPhysicalDevice() const
Definition Device.hpp:169
vk::raii::Device mDevice
Definition Device.hpp:85
Allocator * GetAllocator() const
Definition Device.cpp:25
RHIShaderModule * GetShaderModule(Handle handle) const override
Definition Device.cpp:377
RHIDeviceSemaphore * GetSemaphore(Handle handle) const override
Definition Device.cpp:430
void DebugSetObjectName(const char *name) override
Definition Device.cpp:497
void DestroyDescriptorSetLayout(Handle handle) override
Definition Device.cpp:684
auto const & GetVkSurface() const
Definition Device.hpp:168
UniquePtr< VulkanDeviceQueues > mQueues
Definition Device.hpp:96
void WaitIdle() const override
Definition Device.cpp:325
vk::PhysicalDeviceProperties mProperties
Definition Device.hpp:83
vk::raii::SurfaceKHR mSurface
Definition Device.hpp:86
RHISwapchain * GetSwapchain(Handle handle) const override
Definition Device.cpp:356
Span< RHIResourceFormat const > GetSwapchainSupportedFormats() const override
Definition Device.cpp:347
RHIDeviceScopedObjectHandle< RHIDeviceDescriptorSetLayout > CreateDescriptorSetLayout(RHIDeviceDescriptorSetLayoutDesc const &desc) override
Definition Device.cpp:676
void SignalTimelineSemaphores(Span< const Pair< RHIDeviceObjectHandle< RHIDeviceSemaphore >, size_t > > semaphores) override
Definition Device.cpp:466
RHIDeviceScopedObjectHandle< RHIDeviceDescriptorPool > CreateDescriptorPool(RHIDeviceDescriptorPool::PoolDesc const &desc) override
Definition Device.cpp:688
void WaitForTimelineSemaphores(Span< const Pair< RHIDeviceObjectHandle< RHIDeviceSemaphore >, size_t > > semaphores, size_t timeout) override
Definition Device.cpp:476
RHITexture * GetImage(Handle handle) const override
Definition Device.cpp:630
void DestroyCommandPool(Handle handle) override
Definition Device.cpp:392
auto const & GetVkDevice() const
Definition Device.hpp:167
RHIDeviceSampler * GetSampler(Handle handle) const override
Definition Device.cpp:765
void DebugLogDeviceInfo() const
Definition Device.cpp:205
std::pair< First, Second > Pair
Alias for std::pair
Definition Container.hpp:30
std::unique_ptr< T, StlDeleter< T > > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:161
Low-level Rendering Hardware Interface (RHI) abstractions.
Definition Application.hpp:5
uint64_t Handle
Definition Details.hpp:9
static constexpr Handle kInvalidHandle
Definition Details.hpp:10
RHIDeviceQueueType
Definition Common.hpp:69
constexpr uint32_t kInvalidQueueIndex
Definition Device.hpp:9
Definition Resource.hpp:21
Definition Resource.hpp:79
Definition Device.hpp:11
VulkanDeviceQueue * Get(Handle handle) const
Definition Device.cpp:327
VulkanDeviceQueues(Allocator *allocator)
Definition Device.hpp:14
Handle compute
Definition Device.hpp:13
bool IsDedicatedTransfer() const
Definition Device.hpp:36
Handle graphics
Definition Device.hpp:13
Handle present
Definition Device.hpp:13
bool IsValid() const
Definition Device.hpp:25
RHIObjectPool< VulkanDeviceQueue > storage
Definition Device.hpp:12
bool CanPresent() const
Definition Device.hpp:30
bool IsDedicatedCompute() const
Definition Device.hpp:33
VulkanDeviceQueue * Get(RHIDeviceQueueType type) const
Definition Device.hpp:16
Handle transfer
Definition Device.hpp:13
bool IsDedicatedPresent() const
Definition Device.hpp:39