KarmaEngine
Game Engine for practical learning and research purposes
Loading...
Searching...
No Matches
VulkanContext.h
Go to the documentation of this file.
1
10#pragma once
11
12#define GLFW_INCLUDE_VULKAN
13#include "krpch.h"
14
16#include "GLFW/glfw3.h"
17#include "vulkan/vulkan_core.h"
20
21namespace Karma
22{
26 class RendererAPI;
27
32
37
52 {
59 std::optional<uint32_t> graphicsFamily;
60
71 std::optional<uint32_t> presentFamily;
72
80 {
81 return graphicsFamily.has_value() && presentFamily.has_value();
82 }
83 };
84
96 {
103 VkSurfaceCapabilitiesKHR capabilities;
104
110 std::vector<VkSurfaceFormatKHR> formats;
111
117 std::vector<VkPresentModeKHR> presentModes;
118 };
119
128 {
129 public:
138 VulkanContext(GLFWwindow* windowHandle);
139
160 virtual ~VulkanContext() override;
161
184 virtual void Init() override;
185
195 virtual void SwapBuffers() override;
196
197 virtual bool OnWindowResize(WindowResizeEvent& event) override {/*No need for Vulkan for now.*/ return true; }
198
204 void CreateInstance();
205
214 void PrintAvailableExtensions();
215
222 void PrintAvailablePhysicalDevices(const std::vector<VkPhysicalDevice>& physicalDevices);
223
224 // Validation layers
225 bool CheckValidationLayerSupport();
226 std::vector<const char*> GetRequiredExtensions(VkInstanceCreateFlags& flagsToBeSet);
227
228 static VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
229 VkDebugUtilsMessageTypeFlagsEXT messageType,
230 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
231 void* pUserData);
232
233 void SetupDebugMessenger();
234 void PopulateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
235 VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,
236 const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
237 const VkAllocationCallbacks* pAllocator,
238 VkDebugUtilsMessengerEXT* pDebugMessenger);
239
240 void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator);
241
247 void CreateSurface();
248
256 void PickPhysicalDevice();
257
267 bool IsDeviceSuitable(VkPhysicalDevice device);
268
275 QueueFamilyIndices FindQueueFamilies(VkPhysicalDevice device);
276
288 void CreateLogicalDevice();
289
302 void CreateSwapChain();
303
312 bool CheckDeviceExtensionSupport(VkPhysicalDevice device);
313
320 SwapChainSupportDetails QuerySwapChainSupport(VkPhysicalDevice device);
321
337 VkSurfaceFormatKHR ChooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& availableFormats);
338
349 VkPresentModeKHR ChooseSwapPresentMode(const std::vector<VkPresentModeKHR>& availablePresentModes);
350
359 VkExtent2D ChooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities);
360
370 uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
371
378 void CreateImageViews();
379
385 void CreateRenderPass();
386
392 void CreateFrameBuffers();
393
399 void CreateCommandPool();
400
407 void CreateDepthResources();
408
416 VkFormat FindSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features);
417
424 VkFormat FindDepthFormat();
425
436 bool HasStencilComponent(VkFormat format);
437
451 void TransitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout);
452
466 void CopyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height);
467
476 void RecreateSwapChain();
477
486 void CleanupSwapChain();
487
498 void SetVSync(bool bEnable);
499
505 void Initializeglslang();
506
513 void RegisterUBO(const std::shared_ptr<VulkanUniformBuffer>& ubo);
514
521 void ClearUBO();
522
529 void RecreateUBO();
530
552 void UploadUBO(size_t frameIndex);
553
554 // Getters
555 VkDevice GetLogicalDevice() const { return m_device; }
556 VkPhysicalDevice GetPhysicalDevice() const { return m_physicalDevice; }
557 VkExtent2D GetSwapChainExtent() const { return m_swapChainExtent; }
558 VkRenderPass GetRenderPass() const { return m_renderPass; }
559 const std::vector<VkFramebuffer>& GetSwapChainFrameBuffer() const { return m_swapChainFrameBuffers; }
560 VkSwapchainKHR GetSwapChain() const { return m_swapChain; }
561 inline const std::vector<VkImage>& GetSwapChainImages() const { return m_swapChainImages; }
562 VkFormat GetSwapChainImageFormat() const { return m_swapChainImageFormat; }
563 const std::vector<VkImageView>& GetSwapChainImageViews() const { return m_swapChainImageViews; }
564 VkSurfaceFormatKHR GetSurfaceFormat() const { return m_surfaceFormat; }
565 VkQueue GetGraphicsQueue() const { return m_graphicsQueue; }
566 VkQueue GetPresentQueue() const { return m_presentQueue; }
567 VkCommandPool GetCommandPool() const { return m_commandPool; }
568 VkImageView GetDepthImageView() const { return m_DepthImageView; }
569 const VkPhysicalDeviceFeatures& GetSupportedDeviceFeatures() const { return m_SupportedDeviceFeatures; }
570 VkInstance GetInstance() const { return m_Instance; }
571 uint32_t GetImageCount() const { return uint32_t(m_swapChainImages.size()); }
572 uint32_t GetMinImageCount() const { return m_MinImageCount; }
573 VkSurfaceKHR GetSurface() const { return m_surface; }
574 VkPresentModeKHR GetPresentMode() const { return m_presentMode; }
575
576 private:
577 // Apologies for little out-of-sync naming convention, was dealing with flood of lines when
578 // learning Vulkan!
579 GLFWwindow* m_windowHandle;
580 VulkanRendererAPI* m_vulkanRendererAPI;
581
582 VkInstance m_Instance;
583 VkDebugUtilsMessengerEXT debugMessenger;
584
585 VkPhysicalDeviceFeatures m_SupportedDeviceFeatures;
586
587 static bool bEnableValidationLayers;
588
589 VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE;
590 VkDevice m_device;
591 VkQueue m_graphicsQueue;
592
593 VkSurfaceKHR m_surface;
594 VkQueue m_presentQueue;
595 VkPresentModeKHR m_presentMode;
596
597 VkSurfaceFormatKHR m_surfaceFormat;
598
599 VkSwapchainKHR m_swapChain;
600 std::vector<VkImage> m_swapChainImages;
601 VkFormat m_swapChainImageFormat;
602 VkExtent2D m_swapChainExtent;
603 std::vector<VkImageView> m_swapChainImageViews;
604
605 VkRenderPass m_renderPass;
606
607 std::vector<VkFramebuffer> m_swapChainFrameBuffers;
608 VkCommandPool m_commandPool;
609
610 std::set<std::shared_ptr<VulkanUniformBuffer>> m_VulkanUBO;
611
612 bool bVSync = false;
613
614 VkImage m_DepthImage;
615 VkDeviceMemory m_DepthImageMemory;
616 VkImageView m_DepthImageView;
617
618 uint32_t m_MinImageCount = 0;
619 };
620}
#define KARMA_API
Defining Karma's API macro for storage class information.
Definition Core.h:41
This file contains base class GraphicsContext.
This file contains VulkanVertex/Index/ImageBuffer classes.
This file contains VulkanRendererAPI class with Vulkan specific implementation of RendererAPI pure vi...
An abstract class for creating a context for Renderer and provide graphics API.
Definition GraphicsContext.h:20
An abstract class for a renderer.
Definition RendererAPI.h:23
VulkanContext(GLFWwindow *windowHandle)
A constructor to set the m_vulkanRendererAPI (using static_cast, or compilet time cast)....
Definition VulkanContext.cpp:22
virtual bool OnWindowResize(WindowResizeEvent &event) override
Calls glViewport function which specifies the affine transformation of x and y from normalized device...
Definition VulkanContext.h:197
virtual void SwapBuffers() override
In Vulkan there is no default framebuffer, hence we need to explicitly swap the buffers in the swapch...
Definition VulkanContext.cpp:120
virtual void Init() override
Initializes VulkanContext by creating appropriate Vulkan and glslang specific instruments and allocat...
Definition VulkanContext.cpp:92
Vulkan specific implementation of VertexArray class.
Definition VulkanVertexArray.h:34
Event triggered when Window is resized.
Definition ApplicationEvent.h:22
A structure for graphics and present queuefamilies.
Definition VulkanContext.h:52
bool IsComplete()
Routine for querying if appropriate queue families (graphicsFamily and presentFamily) are available.
Definition VulkanContext.h:79
std::optional< uint32_t > graphicsFamily
The queues in this queue family support graphics operations.
Definition VulkanContext.h:59
std::optional< uint32_t > presentFamily
The queues in this queue family support image presentation.
Definition VulkanContext.h:71
Structure with data required for appropriate creation and working of swapchain.
Definition VulkanContext.h:96
VkSurfaceCapabilitiesKHR capabilities
Basic surface capabilities (min/max number of images in swap chain, min/max width and height of image...
Definition VulkanContext.h:103
std::vector< VkPresentModeKHR > presentModes
Available presentation modes.
Definition VulkanContext.h:117
std::vector< VkSurfaceFormatKHR > formats
Surface formats (pixel format, color space).
Definition VulkanContext.h:110
The actual uniform buffer class with implemented function using Vulkan API.
Definition VulkanBuffer.h:292