KarmaEngine
Game Engine for practical learning and research purposes
Loading...
Searching...
No Matches
VulkanDynamicRHI.h
Go to the documentation of this file.
1
10
11#pragma once
12
13#include "DynamicRHI.h"
14#include "VulkanRHI.h"
15
16#include "VulkanDevice.h"
17
18struct GLFWwindow;
19
20namespace Karma
21{
26
35 template<typename TRHI>
37 {
38 return static_cast<TRHI*>(GDynamicRHI);
39 }
40
55 {
62 std::optional<uint32_t> graphicsFamily;
63
74 std::optional<uint32_t> presentFamily;
75
83 {
84 return graphicsFamily.has_value() && presentFamily.has_value();
85 }
86 };
87
99 {
106 VkSurfaceCapabilitiesKHR capabilities;
107
113 std::vector<VkSurfaceFormatKHR> formats;
114
120 std::vector<VkPresentModeKHR> presentModes;
121 };
122
131 {
132 public:
139
158
168 virtual bool Init() override;
169
178 virtual void Shutdown() override;
179
187 void InitInstance();
188
194 virtual void Present() override {}
195
202 SwapChainSupportDetails QuerySwapChainSupport(VkPhysicalDevice device);
203
209 inline VkInstance GetInstance() const
210 {
211 return m_VulkanInstance;
212 }
213
219 inline FVulkanDevice* GetDevice() const
220 {
221 return m_Device;
222 }
223
231 QueueFamilyIndices FindQueueFamilies(VkPhysicalDevice device);
232
240 inline bool GetValidationLayersSetting() const { return bEnableValidationLayers; }
241
248 inline const VkPhysicalDeviceFeatures& GetGpuDeviceFeatures() const{ return m_SupportedDeviceFeatures; }
249
255 inline const SwapChainSupportDetails& GetGpuSwapChainSupportDetails() const { return m_GPUSwapChainSupport; }
256
262 inline uint32_t SwapChainImageCount() const { return m_SwapChainImageCount; }
263
271 VkFormat FindSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features) const;
272
279 VkFormat FindDepthFormat() const;
280
295 uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
296
297 // These may be abstracted to FDynamicRHI
310
339 void UploadUniformBufferObjects(size_t frameIndex);
340
342 inline GLFWwindow* GetSurfaceWindow() const { return m_WindowHandle; }
343 inline VkSurfaceKHR GetSurface() const { return m_Surface; }
344
345 protected:
346 // Vulkan-specific members and methods can be added here
347
353 void CreateInstance();
354
365 void SetupDebugMessenger();
366
373 void CreateSurface();
374
380 void SelectDevice();
381
382 private:
383
392 void ComputeNumberOfSwapchainImagesSupported();
393
404 bool CheckDeviceExtensionSupport(VkPhysicalDevice device);
405
414 bool IsDeviceSuitable(VkPhysicalDevice device);
415
424 void PrintAvailablePhysicalDevices(const std::vector<VkPhysicalDevice>& physicalDevices);
425
443 VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,
444 const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
445 const VkAllocationCallbacks* pAllocator,
446 VkDebugUtilsMessengerEXT* pDebugMessenger);
447
458 void DestroyDebugUtilsMessengerEXT(VkInstance instance,
459 VkDebugUtilsMessengerEXT debugMessenger,
460 const VkAllocationCallbacks* pAllocator);
461
472 void PrintAvailableExtensions();
473
487 std::vector<const char*> GetRequiredExtensions(VkInstanceCreateFlags& flagsToBeSet);
488
498 bool CheckValidationLayerSupport();
499
512 void PopulateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
513
526 static VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
527 VkDebugUtilsMessageTypeFlagsEXT messageType,
528 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
529 void* pUserData);
530
531 public:
532 // To be set manually by coder
533 static std::vector<const char*> deviceExtensions;
534 static const std::vector<const char*> validationLayers;
535
536 protected:
537 uint32_t m_APIVersion;
538 VkInstance m_VulkanInstance;
539 FVulkanDevice* m_Device;
540 static bool bEnableValidationLayers;
541 VkDebugUtilsMessengerEXT m_DebugMessenger;
542 GLFWwindow* m_WindowHandle;
543 VkSurfaceKHR m_Surface;
544 VkPhysicalDeviceFeatures m_SupportedDeviceFeatures;
545 VkPhysicalDevice m_PhysicalDevice = VK_NULL_HANDLE;// GPU
546 SwapChainSupportDetails m_GPUSwapChainSupport;
547 uint32_t m_SwapChainImageCount;
548
549 std::set<VulkanUniformBuffer*> m_VulkanUBO;
550 };
551}
#define FORCEINLINE
Typical inlining macro for clarity.
Definition Core.h:170
Declaration of the FVulkanDevice class for managing Vulkan device resources.
FORCEINLINE TRHI * GetDynamicRHI()
Template function to get the dynamic RHI instance casted to the specified type.
Definition VulkanDynamicRHI.h:36
Manages Vulkan device resources and operations.
Definition VulkanDevice.h:33
void RegisterUniformBufferObject(VulkanUniformBuffer *ubo)
Register a uniformbuffer object to curate an array or uniformbuffers.
Definition VulkanRHI.cpp:558
void CreateSurface()
Platform agnostic creation of surface to present rendered images to. Typically they are backed by the...
Definition VulkanRHI.cpp:137
const SwapChainSupportDetails & GetGpuSwapChainSupportDetails() const
Getter for m_GPUSwapChainSupport struct which gets initialized in FVulkanDynamicRHI::IsDeviceSuitable...
Definition VulkanDynamicRHI.h:255
void UploadUniformBufferObjects(size_t frameIndex)
Uploads data to the registered VulkanUniformBuffers for the specified frame index.
Definition VulkanRHI.cpp:563
void SetupDebugMessenger()
Sets up the debug messenger for Vulkan instance.
Definition VulkanRHI.cpp:121
const VkPhysicalDeviceFeatures & GetGpuDeviceFeatures() const
Getter for m_SupportedDeviceFeatures which contains boolean values for supported features like availa...
Definition VulkanDynamicRHI.h:248
SwapChainSupportDetails QuerySwapChainSupport(VkPhysicalDevice device)
Uses Two-Pass Query to gather surface formats (physical device and surface paired color space or pixe...
Definition VulkanRHI.cpp:273
uint32_t SwapChainImageCount() const
Getter for the number of supported swapchain images.
Definition VulkanDynamicRHI.h:262
VkFormat FindDepthFormat() const
Finds an appropriate depth format for depth resources.
Definition VulkanRHI.cpp:202
FVulkanDevice * GetDevice() const
Getter for FVulkanDevice object created in FVulkanDynamicRHI::SelectDevice().
Definition VulkanDynamicRHI.h:219
virtual bool Init() override
For initializing VulkanDynamic RHI.
Definition VulkanRHI.cpp:27
void SelectDevice()
Picks an Engine appropriate GPU and creates FVulkanDevice.
Definition VulkanRHI.cpp:211
void CreateInstance()
Creates a Vulkan instance.
Definition VulkanRHI.cpp:61
VkInstance GetInstance() const
Getter for Vulkan instance.
Definition VulkanDynamicRHI.h:209
static FVulkanDynamicRHI & Get()
Getter for the FVulkanDynamicRHI instance.
Definition VulkanDynamicRHI.h:138
QueueFamilyIndices FindQueueFamilies(VkPhysicalDevice device)
Queries the graphics card for available queue families and compares against the availability of graph...
Definition VulkanRHI.cpp:352
virtual void Shutdown() override
Shuts down the RHI.
Definition VulkanRHI.cpp:42
bool GetValidationLayersSetting() const
Getter for the boolean bEnableValidationLayers.
Definition VulkanDynamicRHI.h:240
virtual void Present() override
Presents the rendered frame to the display.
Definition VulkanDynamicRHI.h:194
VkFormat FindSupportedFormat(const std::vector< VkFormat > &candidates, VkImageTiling tiling, VkFormatFeatureFlags features) const
Finds a supported format from the list of candidate formats based on the desired tiling and features....
Definition VulkanRHI.cpp:182
void InitInstance()
Calls FVulkanDevice::InitGPU() to create Vulkan logical device from selected GPU, and created appropr...
Definition VulkanRHI.cpp:37
uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties)
Finds appropriate memory type with demanded properties. Basically a loop is run from counter i = 0 to...
Definition VulkanRHI.cpp:165
FVulkanDynamicRHI()
Initialization constructor.
Definition VulkanRHI.cpp:17
Definition VulkanRHI.h:18
A structure for graphics and present queuefamilies.
Definition VulkanDynamicRHI.h:55
bool IsComplete()
Routine for querying if appropriate queue families (graphicsFamily and presentFamily) are available.
Definition VulkanDynamicRHI.h:82
std::optional< uint32_t > graphicsFamily
The queues in this queue family support graphics operations.
Definition VulkanDynamicRHI.h:62
std::optional< uint32_t > presentFamily
The queues in this queue family support image presentation.
Definition VulkanDynamicRHI.h:74
Structure with data required for appropriate creation and working of swapchain.
Definition VulkanDynamicRHI.h:99
VkSurfaceCapabilitiesKHR capabilities
Basic surface capabilities (min/max number of images in swap chain, min/max width and height of image...
Definition VulkanDynamicRHI.h:106
std::vector< VkPresentModeKHR > presentModes
Available presentation modes.
Definition VulkanDynamicRHI.h:120
std::vector< VkSurfaceFormatKHR > formats
Surface formats (pixel format, color space).
Definition VulkanDynamicRHI.h:113
The actual uniform buffer class with implemented function using Vulkan API.
Definition VulkanBuffer.h:266