Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
VulkanCore.hpp
1#pragma once
2
3#include <functional>
4
5#include <vma/vk_mem_alloc.h>
6#include <vulkan/vulkan.h>
7
8#include <Common/Logging.hpp>
9#include <Common/Graphics/Core.hpp>
10#include <Common/Graphics/DLLDefs.hpp>
11
12class GpuCrashTracker;
13
16 VkSurfaceCapabilitiesKHR capabilities;
17 std::vector<VkSurfaceFormatKHR> formats;
18 std::vector<VkPresentModeKHR> presentModes;
19 };
20
22 uint32_t graphicsFamily = 0;
23 uint32_t presentFamily = 0;
24
25 bool hasGraphicsFamily = false;
26 bool hasPresentFamily = false;
27
28 bool IsComplete() const {
29 return hasGraphicsFamily && hasPresentFamily;
30 }
31 };
32
34 public:
35 virtual bool Initialize(const Grindstone::GraphicsAPI::Core::CreateInfo& ci) override;
36 virtual ~Core() override;
37
38 static Vulkan::Core* graphicsWrapper;
39 static Vulkan::Core& Get();
40 virtual void RegisterWindow(Window* window) override;
41 public:
42 QueueFamilyIndices FindQueueFamilies(VkPhysicalDevice device);
43 uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
44 virtual VkInstance GetInstance();
45 virtual VkDevice GetDevice();
46 virtual VkPhysicalDevice GetPhysicalDevice();
47 virtual VkCommandBuffer BeginSingleTimeCommands(const char* debugName);
48 virtual uint32_t GetGraphicsFamily();
49 virtual void EndSingleTimeCommands(VkCommandBuffer commandBuffer);
50 VkCommandPool GetGraphicsCommandPool() const;
51 GpuCrashTracker& GetGpuCrashTracker();
52 private:
53
54 VkInstance instance = nullptr;
55 VkDevice device = nullptr;
56 VkPhysicalDevice physicalDevice = nullptr;
57 VkDebugUtilsMessengerEXT debugMessenger = nullptr;
58 PFN_vkSetDebugUtilsObjectNameEXT pfnDebugUtilsSetObjectName = nullptr;
59 public:
60 VkQueue graphicsQueue = nullptr;
61 VkQueue presentQueue = nullptr;
62 uint32_t graphicsFamily = 0;
63 uint32_t presentFamily = 0;
64 VkCommandPool commandPoolGraphics = nullptr;
65 VkDescriptorPool descriptorPool = nullptr;
66 private:
67 void CreateInstance();
68 void SetupDebugMessenger();
69 void PickPhysicalDevice();
70 void CreateLogicalDevice();
71 void CreateCommandPool();
72 void CreateDescriptorPool();
73 private:
74 void CreateAllocator();
75 uint16_t ScoreDevice(VkPhysicalDevice device);
76 bool CheckDeviceExtensionSupport(VkPhysicalDevice device);
77 bool CheckValidationLayerSupport();
78 std::vector<const char*> GetRequiredExtensions();
79 void PopulateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
80 public:
81 virtual void NameObject(VkObjectType objectType, void* object, const char* objectName);
82
83 virtual const char* GetVendorName() const override;
84 virtual const char* GetAdapterName() const override;
85 virtual const char* GetAPIName() const override;
86 virtual const char* GetAPIVersion() const override;
87
88 virtual void AdjustPerspective(float *perspective) override;
89
90 virtual void DeleteFramebuffer(GraphicsAPI::Framebuffer *ptr) override;
91 virtual void DeleteBuffer(GraphicsAPI::Buffer *ptr) override;
92 virtual void DeleteGraphicsPipeline(GraphicsAPI::GraphicsPipeline* ptr) override;
93 virtual void DeleteComputePipeline(GraphicsAPI::ComputePipeline* ptr) override;
94 virtual void DeletePipelineLayout(GraphicsAPI::PipelineLayout* ptr) override;
95 virtual void DeleteRenderPass(GraphicsAPI::RenderPass *ptr) override;
96 virtual void DeleteSampler(GraphicsAPI::Sampler* ptr) override;
97 virtual void DeleteImage(GraphicsAPI::Image* ptr) override;
98 virtual void DeleteDescriptorSet(GraphicsAPI::DescriptorSet* ptr) override;
99 virtual void DeleteDescriptorSetLayout(GraphicsAPI::DescriptorSetLayout* ptr) override;
100 virtual void DeleteCommandBuffer(GraphicsAPI::CommandBuffer *ptr) override;
101 virtual void DeleteVertexArrayObject(GraphicsAPI::VertexArrayObject *ptr) override;
102
103 virtual GraphicsAPI::Framebuffer* CreateFramebuffer(const GraphicsAPI::Framebuffer::CreateInfo& ci) override;
104 virtual GraphicsAPI::RenderPass* CreateRenderPass(const GraphicsAPI::RenderPass::CreateInfo& ci) override;
105 virtual GraphicsAPI::GraphicsPipeline* CreateGraphicsPipeline(const GraphicsAPI::GraphicsPipeline::CreateInfo& ci) override;
106 virtual GraphicsAPI::ComputePipeline* CreateComputePipeline(const GraphicsAPI::ComputePipeline::CreateInfo& ci) override;
107 virtual GraphicsAPI::PipelineLayout* CreatePipelineLayout(const GraphicsAPI::PipelineLayout::CreateInfo& ci) override;
108 virtual GraphicsAPI::CommandBuffer* CreateCommandBuffer(const GraphicsAPI::CommandBuffer::CreateInfo& ci) override;
109 virtual GraphicsAPI::VertexArrayObject* CreateVertexArrayObject(const GraphicsAPI::VertexArrayObject::CreateInfo& ci) override;
110 virtual GraphicsAPI::Buffer* CreateBuffer(const GraphicsAPI::Buffer::CreateInfo& ci) override;
111 virtual GraphicsAPI::Sampler* CreateSampler(const GraphicsAPI::Sampler::CreateInfo& ci) override;
112 virtual GraphicsAPI::Image* CreateImage(const GraphicsAPI::Image::CreateInfo& ci) override;
113 virtual GraphicsAPI::DescriptorSet* CreateDescriptorSet(const GraphicsAPI::DescriptorSet::CreateInfo& ci) override;
114 virtual GraphicsAPI::DescriptorSetLayout* CreateDescriptorSetLayout(const GraphicsAPI::DescriptorSetLayout::CreateInfo& ci) override;
115
116 virtual GraphicsAPI::GraphicsPipeline* GetOrCreateGraphicsPipelineFromCache(
117 GraphicsAPI::PipelineLayout* pipelineLayout,
119 const GraphicsAPI::VertexInputLayout* vertexInputLayout
120 ) override;
121 virtual GraphicsAPI::DescriptorSetLayout* GetOrCreateDescriptorSetLayoutFromCache(const Grindstone::GraphicsAPI::DescriptorSetLayout::CreateInfo& createInfo) override;
122 virtual GraphicsAPI::PipelineLayout* GetOrCreatePipelineLayoutFromCache(const Grindstone::GraphicsAPI::PipelineLayout::CreateInfo& createInfo) override;
123 virtual GraphicsAPI::Sampler* GetOrCreateSampler(const Grindstone::GraphicsAPI::Sampler::CreateInfo& createInfo) override;
124
125 virtual inline bool ShouldUseImmediateMode() const override;
126 virtual inline bool SupportsCommandBuffers() const override;
127 virtual inline bool SupportsTesselation() const override;
128 virtual inline bool SupportsGeometryShader() const override;
129 virtual inline bool SupportsComputeShader() const override;
130 virtual inline bool SupportsMultiDrawIndirect() const override;
131
132 virtual void WaitUntilIdle() override;
133
134 // Unused
135 virtual void Clear(ClearMode mask, float clear_color[4], float clear_depth, uint32_t clear_stencil) override;
136 virtual void BindGraphicsPipeline(GraphicsAPI::GraphicsPipeline*) override;
137 virtual void BindVertexArrayObject(GraphicsAPI::VertexArrayObject *) override;
138 virtual void DrawImmediateIndexed(GeometryType geom_type, bool largeBuffer, int32_t baseVertex, uint32_t indexOffsetPtr, uint32_t indexCount) override;
139 virtual void DrawImmediateVertices(GeometryType geom_type, uint32_t base, uint32_t count) override;
140 virtual void SetImmediateBlending(
141 BlendOperation colorOp, BlendFactor colorSrc, BlendFactor colorDst,
142 BlendOperation alphaOp, BlendFactor alphaSrc, BlendFactor alphaDst
143 ) override;
144 virtual void EnableDepthWrite(bool state) override;
145 virtual void SetColorMask(ColorMask mask) override;
146 private:
147 std::string vendorName;
148 std::string adapterName;
149 std::string apiVersion;
150 VmaAllocator allocator;
151 GpuCrashTracker* gpuCrashTracker = nullptr;
152
153 Window* primaryWindow = nullptr;
154
155 // Inherited via Core
156 virtual const char* GetDefaultShaderExtension() const override;
157 virtual void CopyDepthBufferFromReadToWrite(uint32_t srcWidth, uint32_t srcHeight, uint32_t dstWidth, uint32_t dstHeight) override;
158 virtual void BindDefaultFramebuffer() override;
159 virtual void BindDefaultFramebufferWrite() override;
160 virtual void BindDefaultFramebufferRead() override;
161 virtual void ResizeViewport(uint32_t w, uint32_t h) override;
162
163 using SamplerHash = size_t;
164 using PipelineHash = size_t;
165 using PipelineLayoutHash = size_t;
166 using DescriptorSetLayoutHash = size_t;
167 std::unordered_map<DescriptorSetLayoutHash, Grindstone::GraphicsAPI::DescriptorSetLayout*> descriptorSetLayoutCache;
168 std::unordered_map<PipelineLayoutHash, Grindstone::GraphicsAPI::PipelineLayout*> pipelineLayoutCache;
169 std::unordered_map<PipelineHash, Grindstone::GraphicsAPI::GraphicsPipeline*> graphicsPipelineCache;
170 std::unordered_map<SamplerHash, Grindstone::GraphicsAPI::Sampler*> samplerCache;
171};
172}
Definition NsightAftermathGpuCrashTracker.h:39
Definition Buffer.hpp:49
Definition CommandBuffer.hpp:109
Definition ComputePipeline.hpp:19
Definition Core.hpp:41
Definition DescriptorSetLayout.hpp:14
Definition DescriptorSet.hpp:15
Definition Framebuffer.hpp:16
Definition GraphicsPipeline.hpp:20
Definition Image.hpp:49
Definition PipelineLayout.hpp:18
Definition RenderPass.hpp:10
Definition Sampler.hpp:49
Definition VertexArrayObject.hpp:9
Definition VulkanCore.hpp:33
Definition Window.hpp:12
Definition ImguiRendererVulkan.hpp:11