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"
19#include "Platform/Vulkan/VulkanRendererAPI.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 virtual void SwapBuffers() override;
186 virtual bool OnWindowResize(WindowResizeEvent& event) override {/*No need for Vulkan for now.*/ return true; }
187
188 void CreateInstance();
189
190 void PrintAvailableExtensions();
191 void PrintAvailablePhysicalDevices(const std::vector<VkPhysicalDevice>& physicalDevices);
192
193 // Validation layers
194 bool CheckValidationLayerSupport();
195 std::vector<const char*> GetRequiredExtensions(VkInstanceCreateFlags& flagsToBeSet);
196
197 static VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
198 VkDebugUtilsMessageTypeFlagsEXT messageType,
199 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
200 void* pUserData);
201
202 void SetupDebugMessenger();
203 void PopulateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
204 VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,
205 const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
206 const VkAllocationCallbacks* pAllocator,
207 VkDebugUtilsMessengerEXT* pDebugMessenger);
208
209 void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator);
210
211 // Surface
212 void CreateSurface();
213
214 // Physical device
215 void PickPhysicalDevice();
216 bool IsDeviceSuitable(VkPhysicalDevice device);
217 QueueFamilyIndices FindQueueFamilies(VkPhysicalDevice device);
218
219 // Logical device
224 void CreateLogicalDevice();
225
226 // Swapchain
232 void CreateSwapChain();
233 bool CheckDeviceExtensionSupport(VkPhysicalDevice device);
234 SwapChainSupportDetails QuerySwapChainSupport(VkPhysicalDevice device);
235 VkSurfaceFormatKHR ChooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& availableFormats);
236 VkPresentModeKHR ChooseSwapPresentMode(const std::vector<VkPresentModeKHR>& availablePresentModes);
237 VkExtent2D ChooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities);
238 uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
239
240 // Image views
247 void CreateImageViews();
248
249 // Renderer pass
254 void CreateRenderPass();
255
256 // Framebuffers
262 void CreateFrameBuffers();
263
264 // CommandPool
270 void CreateCommandPool();
271
272 // DepthImage
273 void CreateDepthResources();
274 VkFormat FindSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features);
275 VkFormat FindDepthFormat();
276 bool HasStencilComponent(VkFormat format);
277
278 // Texture relevant
279 //void CreateTextureImage(VulkanImageBuffer* vImageBuffer);
280 void TransitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout);
281 void CopyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height);
282 //void CreateTextureImageView();
283 //void CreateTextureSampler();
284
285 void RecreateSwapChain();
286 void CleanupSwapChain();
287
288 void SetVSync(bool bEnable);
289
290 void Initializeglslang();
291 void RegisterUBO(const std::shared_ptr<VulkanUniformBuffer>& ubo);
292 void ClearUBO();
293 void RecreateUBO();
294 void UploadUBO(size_t frameIndex);
295
296 // Getters
297 VkDevice GetLogicalDevice() const { return m_device; }
298 VkPhysicalDevice GetPhysicalDevice() const { return m_physicalDevice; }
299 VkExtent2D GetSwapChainExtent() const { return m_swapChainExtent; }
300 VkRenderPass GetRenderPass() const { return m_renderPass; }
301 const std::vector<VkFramebuffer>& GetSwapChainFrameBuffer() const { return m_swapChainFrameBuffers; }
302 VkSwapchainKHR GetSwapChain() const { return m_swapChain; }
303 inline const std::vector<VkImage>& GetSwapChainImages() const { return m_swapChainImages; }
304 VkFormat GetSwapChainImageFormat() const { return m_swapChainImageFormat; }
305 const std::vector<VkImageView>& GetSwapChainImageViews() const { return m_swapChainImageViews; }
306 VkSurfaceFormatKHR GetSurfaceFormat() const { return m_surfaceFormat; }
307 VkQueue GetGraphicsQueue() const { return m_graphicsQueue; }
308 VkQueue GetPresentQueue() const { return m_presentQueue; }
309 VkCommandPool GetCommandPool() const { return m_commandPool; }
310 //VkImageView GetTextureImageView() const { return m_TextureImageView; }
311 //VkSampler GetTextureSampler() const { return m_TextureSampler; }
312 const VkPhysicalDeviceFeatures& GetSupportedDeviceFeatures() const { return m_SupportedDeviceFeatures; }
313 VkInstance GetInstance() const { return m_Instance; }
314 uint32_t GetImageCount() const { return uint32_t(m_swapChainImages.size()); }
315 uint32_t GetMinImageCount() const { return m_MinImageCount; }
316 VkSurfaceKHR GetSurface() const { return m_surface; }
317 VkPresentModeKHR GetPresentMode() const { return m_presentMode; }
318
319 private:
320 // Apologies for little out-of-sync naming convention, was dealing with flood of lines when
321 // learning Vulkan!
322 GLFWwindow* m_windowHandle;
323 VulkanRendererAPI* m_vulkanRendererAPI;
324
325 VkInstance m_Instance;
326 VkDebugUtilsMessengerEXT debugMessenger;
327
328 VkPhysicalDeviceFeatures m_SupportedDeviceFeatures;
329
330 static bool bEnableValidationLayers;
331
332 VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE;
333 VkDevice m_device;
334 VkQueue m_graphicsQueue;
335
336 VkSurfaceKHR m_surface;
337 VkQueue m_presentQueue;
338 VkPresentModeKHR m_presentMode;
339
340 VkSurfaceFormatKHR m_surfaceFormat;
341
342 VkSwapchainKHR m_swapChain;
343 std::vector<VkImage> m_swapChainImages;
344 VkFormat m_swapChainImageFormat;
345 VkExtent2D m_swapChainExtent;
346 std::vector<VkImageView> m_swapChainImageViews;
347
348 VkRenderPass m_renderPass;
349
350 std::vector<VkFramebuffer> m_swapChainFrameBuffers;
351 VkCommandPool m_commandPool;
352
353 std::set<std::shared_ptr<VulkanUniformBuffer>> m_VulkanUBO;
354
355 bool bVSync = false;
356
357 VkImage m_DepthImage;
358 VkDeviceMemory m_DepthImageMemory;
359 VkImageView m_DepthImageView;
360
361 uint32_t m_MinImageCount = 0;
362
363 //VkImage m_TextureImage;
364 /*
365 VkDeviceMemory m_TextureImageMemory;
366 VkImageView m_TextureImageView;
367 VkSampler m_TextureSampler;
368 */
369 };
370}
#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.
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:186
virtual void SwapBuffers() override
This function swaps the front and back buffers of the specified window. If the swap interval is great...
Definition VulkanContext.cpp:120
virtual void Init() override
Initializes VulkanContext by creating appropriate Vulkan and glslang specific instruments and allocat...
Definition VulkanContext.cpp:92
Definition VulkanVertexArray.h:12
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