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