CheeseEngine
A 2D Game Engine
Loading...
Searching...
No Matches
graphicCore.hpp
Go to the documentation of this file.
1#pragma once
2
3#define GLFW_INCLUDE_VULKAN
4#define GLM_FORCE_RADIANS
5
6#include <GLFW/glfw3.h>
8
9#include <algorithm>
10#include <array>
11#include <chrono>
12#include <cstdlib>
13#include <cstring>
14#include <fstream>
15#include <glm/glm.hpp>
16#include <glm/gtc/matrix_transform.hpp>
17#include <iostream>
18#include <mutex>
19#include <optional>
20#include <set>
21#include <stdexcept>
22#include <string>
23#include <thread>
24#include <unordered_map>
25#include <vector>
26
27#include "renderQueue.hpp"
28
29const uint32_t HEIGHT = 600;
30const uint32_t WIDTH = 800;
32const size_t MAX_VERTICES = 1200;
33const size_t MAX_INDICES = 3600;
34const uint32_t MAX_IMAGE_ARRAYS = 128;
35
36const std::vector<const char*> validationLayers = {"VK_LAYER_KHRONOS_validation"};
37
38const std::vector<const char*> deviceExtensions = {VK_KHR_SWAPCHAIN_EXTENSION_NAME};
39
40#ifdef CHEESE_SHADER_DIR
41const char* SHADER_DIR = CHEESE_SHADER_DIR;
42#else
43const char* SHADER_DIR = "../shaders";
44#endif
45
47
48#ifdef NDEBUG
49const bool enableValidationLayers = false;
50#else
51const bool enableValidationLayers = true;
52#endif
53
58public:
63 GraphicCore(GLFWwindow* window);
64
73 uint32_t addRectangle(glm::vec2 position, float width, float height, glm::vec3 color);
74
82 uint32_t addTriangle(std::array<glm::vec2, 3> positions, glm::vec3 color);
83
89 void removeFigure(uint32_t index);
90
97 void setTransform(uint32_t index, const glm::mat4& transform);
98
105 void setCamera(glm::vec2 position, float zoom);
106
113 TextureDescriptor addTexture(const std::string& path);
114
123 void setTexture(uint32_t figureIndex, TextureDescriptor textureDescriptor,
124 const std::vector<glm::vec2>& texCoords);
125
133
140
141private:
143 std::optional<uint32_t> graphicFamily;
144 std::optional<uint32_t> presentFamily;
145
147 };
148
150 VkSurfaceCapabilitiesKHR capabilities;
151 std::vector<VkSurfaceFormatKHR> formats;
152 std::vector<VkPresentModeKHR> presentModes;
153 };
154
156 alignas(16) glm::mat4 view;
157 alignas(16) glm::mat4 proj;
158 };
159
161 alignas(16) glm::mat4 model;
163 };
164
165 struct FigureDesc {
167 uint32_t vertexCount;
169 uint32_t indexCount;
170 glm::mat4 model;
171 uint32_t textureHandler = 0;
172 };
173
174 struct Camera {
175 glm::vec2 position;
176 float zoom;
177 };
178
179 struct Vertex {
180 glm::vec2 pos;
181 glm::vec3 color;
182 glm::vec2 texCoord;
183
184 static VkVertexInputBindingDescription getBindingDescription();
185
186 static std::array<VkVertexInputAttributeDescription, 3> getAttributeDescriptions();
187 };
188
190 VkImage image;
191 VkDeviceMemory imageMemory;
192 VkImageView imageView;
193 VkSampler sampler;
194 uint32_t layersCount;
195 VkExtent2D extent;
196 std::vector<stbi_uc*> pixels;
197 };
198
199 std::mutex verticesMutex;
200 std::mutex stopMutex;
201 std::thread graphicThread;
202
203 GLFWwindow* window;
204 VkInstance instance;
205 std::vector<VkExtensionProperties> instanceExtensions;
206 VkDebugUtilsMessengerEXT debugMessenger;
207 VkSurfaceKHR surface;
208 VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
209 VkDevice device;
212 VkSwapchainKHR swapChain = VK_NULL_HANDLE;
213 std::vector<VkImage> swapChainImages;
215 VkExtent2D swapChainExtent;
216 std::vector<VkImageView> swapChainImageViews;
217 VkRenderPass renderPass;
218 VkDescriptorSetLayout descriptorSetLayout;
219 VkPipelineLayout pipelineLayout;
221 std::vector<VkFramebuffer> swapChainFramebuffers;
222 VkCommandPool commandPool;
223 std::vector<VkCommandBuffer> commandBuffers;
224 std::vector<VkSemaphore> imageAvailableSemaphores;
225 std::vector<VkSemaphore> renderFinishedSemaphores;
226 std::vector<VkFence> inFlightFences;
227 std::vector<VkFence> imagesInFlight;
228 size_t currentFrame = 0;
229 bool framebufferResized = false;
230 VkBuffer vertexBuffer;
231 VkDeviceMemory vertexBufferMemory;
232 bool verticesChanged = false;
235 VkBuffer indexBuffer;
236 VkDeviceMemory indexBufferMemory;
239 std::vector<VkBuffer> uniformBuffers;
240 std::vector<VkDeviceMemory> uniformBuffersMemory;
241 std::vector<void*> uniformBuffersMapped;
242 VkDescriptorPool descriptorPool;
243 std::vector<VkDescriptorSet> descriptorSets;
244 std::vector<Vertex> vertices;
245 std::vector<uint16_t> indices;
246 std::unordered_map<int, FigureDesc> figures;
247 bool isStopped = false;
248 uint32_t indicesToDraw = 0;
249 uint32_t verticesCount = 0;
250 uint32_t nextFigureHex = 0x0;
253 std::vector<std::string> texturePaths;
254 std::vector<TextureArray> textureArrays;
255
257 VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
258 const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger);
259
261 VkDebugUtilsMessengerEXT debugMessenger,
262 const VkAllocationCallbacks* pAllocator);
263
264 static std::vector<char> readFile(const std::string& filename);
265
266 void run();
267
269
271
273
274 void mainLoop();
275
276 static void framebufferSizeCallback(GLFWwindow* window, int width, int height);
277
278 void _addRectangle(glm::vec2 position, float width, float height, glm::vec3 color,
279 uint32_t index);
280
281 void _addTriangle(std::array<glm::vec2, 3> positions, glm::vec3 color, uint32_t index);
282
283 void _removeFigure(uint32_t index);
284
285 void _setTranform(uint32_t index, glm::mat4 transform);
286
287 void _setCamera(glm::vec2 position, float zoom);
288
289 void _setTexture(uint32_t figureIndex, TextureDescriptor textureDescriptor,
290 std::vector<glm::vec2> texCoords);
291
293
295
296 void drawFrame();
297
298 void cleanup();
299
300 bool checkExtensionsSupport(const uint32_t extCount, const char** extToCheck);
301
303
305
307
309
311
313
315
317
319
321
322 void createImage(uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling,
323 VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage& image,
324 VkDeviceMemory& imageMemory, uint32_t arrayLayers);
325
326 VkCommandBuffer beginSingleTimeCommands();
327
328 void endSingleTimeCommands(VkCommandBuffer commandBuffer);
329
331
333
334 VkImageView createImageView(VkImage image, VkFormat format, uint32_t layerCount,
335 VkImageViewType viewType);
336
338
339 void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout,
340 VkImageLayout newLayout, uint32_t layerCount);
341
342 void copyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height,
343 uint32_t layerCount);
344
345 void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties,
346 VkBuffer& buffer, VkDeviceMemory& bufferMemory);
347
349
351
353
354 void updateUniformBuffer(uint32_t currentImage);
355
357
359
361
362 void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize bufferSize);
363
364 uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
365
366 void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex);
367
369
371
372 VkShaderModule createShaderModule(const std::vector<char>& code);
373
374 bool checkDeviceExtensionSupport(VkPhysicalDevice device);
375
376 bool isDeviceSuitable(VkPhysicalDevice device);
377
379
381
383
384 VkSurfaceFormatKHR chooseSwapSurfaceFormat(
385 const std::vector<VkSurfaceFormatKHR>& availableFormats);
386
387 VkPresentModeKHR chooseSwapPresentMode(
388 const std::vector<VkPresentModeKHR>& availablePresentModes);
389
390 VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities);
391
392 std::vector<const char*> getRequiredExtensions();
393
395
397
398 static VKAPI_ATTR VkBool32 VKAPI_CALL
399 debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
400 VkDebugUtilsMessageTypeFlagsEXT messageType,
401 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData);
402
403 void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
404
406};
Class that implements graphic system.
Definition graphicCore.hpp:57
static std::vector< char > readFile(const std::string &filename)
std::vector< VkImage > swapChainImages
Definition graphicCore.hpp:213
void createUniformBuffers()
std::vector< VkBuffer > uniformBuffers
Definition graphicCore.hpp:239
VkExtent2D swapChainExtent
Definition graphicCore.hpp:215
std::vector< Vertex > vertices
Definition graphicCore.hpp:244
void createDescriptorPool()
void createImage(uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage &image, VkDeviceMemory &imageMemory, uint32_t arrayLayers)
void createDescriptorSets()
VkCommandPool commandPool
Definition graphicCore.hpp:222
VkBuffer vertexBuffer
Definition graphicCore.hpp:230
std::vector< VkImageView > swapChainImageViews
Definition graphicCore.hpp:216
void createSyncObjects()
void createIndexBuffer()
void createCommandBuffers()
void createSwapChain()
void stopGraphicThread()
Stopping graphics thread method.
VkShaderModule createShaderModule(const std::vector< char > &code)
VkSwapchainKHR swapChain
Definition graphicCore.hpp:212
static void framebufferSizeCallback(GLFWwindow *window, int width, int height)
void _setCamera(glm::vec2 position, float zoom)
void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex)
VkRenderPass renderPass
Definition graphicCore.hpp:217
SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device)
VkFormat swapChainImageFormat
Definition graphicCore.hpp:214
GLFWwindow * window
Definition graphicCore.hpp:203
void cleanup()
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize bufferSize)
std::vector< void * > uniformBuffersMapped
Definition graphicCore.hpp:241
size_t currentFrame
Definition graphicCore.hpp:228
void startGraphicThread()
Starting graphics thread method.
void createGraphicsPipeline()
VkQueue presentQueue
Definition graphicCore.hpp:211
void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT &createInfo)
std::mutex verticesMutex
Definition graphicCore.hpp:199
std::vector< std::string > texturePaths
Definition graphicCore.hpp:253
VkDescriptorSetLayout descriptorSetLayout
Definition graphicCore.hpp:218
void setCamera(glm::vec2 position, float zoom)
Set camera method.
VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector< VkSurfaceFormatKHR > &availableFormats)
VkDeviceMemory vertexBufferMemory
Definition graphicCore.hpp:231
std::vector< VkExtensionProperties > instanceExtensions
Definition graphicCore.hpp:205
void createLogicalDevice()
std::mutex stopMutex
Definition graphicCore.hpp:200
VkPipelineLayout pipelineLayout
Definition graphicCore.hpp:219
void createTextureSampler()
VkCommandBuffer beginSingleTimeCommands()
VkDeviceMemory stagingIndexBufferMemory
Definition graphicCore.hpp:238
VkBuffer indexBuffer
Definition graphicCore.hpp:235
std::unordered_map< int, FigureDesc > figures
Definition graphicCore.hpp:246
std::vector< VkFence > inFlightFences
Definition graphicCore.hpp:226
void recreateSwapChain()
void _setTexture(uint32_t figureIndex, TextureDescriptor textureDescriptor, std::vector< glm::vec2 > texCoords)
VkPipeline graphicsPipeline
Definition graphicCore.hpp:220
void createTextureImage()
QueueFamilyIndicies findQueueFamilies(VkPhysicalDevice device)
VkImageView createImageView(VkImage image, VkFormat format, uint32_t layerCount, VkImageViewType viewType)
bool isStopped
Definition graphicCore.hpp:247
std::vector< VkSemaphore > imageAvailableSemaphores
Definition graphicCore.hpp:224
VkInstance instance
Definition graphicCore.hpp:204
uint32_t verticesCount
Definition graphicCore.hpp:249
void initWindow()
void setupDebugMessenger()
std::vector< TextureArray > textureArrays
Definition graphicCore.hpp:254
void cleanupSwapChain()
void _removeFigure(uint32_t index)
void _addTriangle(std::array< glm::vec2, 3 > positions, glm::vec3 color, uint32_t index)
std::vector< VkFramebuffer > swapChainFramebuffers
Definition graphicCore.hpp:221
void _setTranform(uint32_t index, glm::mat4 transform)
uint32_t addRectangle(glm::vec2 position, float width, float height, glm::vec3 color)
Add Rectangle method.
bool checkDeviceExtensionSupport(VkPhysicalDevice device)
std::vector< const char * > getRequiredExtensions()
void createFrameBuffers()
void endSingleTimeCommands(VkCommandBuffer commandBuffer)
void _addRectangle(glm::vec2 position, float width, float height, glm::vec3 color, uint32_t index)
static VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugUtilsMessengerEXT *pDebugMessenger)
void mainLoop()
std::vector< VkDeviceMemory > uniformBuffersMemory
Definition graphicCore.hpp:240
void pollRenderQueue()
GraphicCore(GLFWwindow *window)
Object constructor.
RenderQueue renderQueue
Definition graphicCore.hpp:251
bool isDeviceSuitable(VkPhysicalDevice device)
void pickPhysicalDevice()
void createSurface()
void drawFrame()
Camera camera
Definition graphicCore.hpp:252
static void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks *pAllocator)
TextureDescriptor addTexture(const std::string &path)
Loading texture method.
bool verticesChanged
Definition graphicCore.hpp:232
uint32_t addTriangle(std::array< glm::vec2, 3 > positions, glm::vec3 color)
Add Triangle method.
void setTexture(uint32_t figureIndex, TextureDescriptor textureDescriptor, const std::vector< glm::vec2 > &texCoords)
Set Texture method.
void updateVertexBuffer()
uint32_t indicesToDraw
Definition graphicCore.hpp:248
VkPresentModeKHR chooseSwapPresentMode(const std::vector< VkPresentModeKHR > &availablePresentModes)
VkDeviceMemory indexBufferMemory
Definition graphicCore.hpp:236
void createVertexBuffer()
void updateUniformBuffer(uint32_t currentImage)
uint32_t nextFigureHex
Definition graphicCore.hpp:250
void removeFigure(uint32_t index)
Remove Figure method.
VkBuffer stagingVertexBuffer
Definition graphicCore.hpp:233
void createDescriptorSetLayout()
VkBuffer stagingIndexBuffer
Definition graphicCore.hpp:237
VkPhysicalDevice physicalDevice
Definition graphicCore.hpp:208
VkDeviceMemory stagingVertexBufferMemory
Definition graphicCore.hpp:234
bool checkValidationLayerSupport()
std::thread graphicThread
Definition graphicCore.hpp:201
std::vector< uint16_t > indices
Definition graphicCore.hpp:245
VkDebugUtilsMessengerEXT debugMessenger
Definition graphicCore.hpp:206
std::vector< VkCommandBuffer > commandBuffers
Definition graphicCore.hpp:223
bool checkExtensionsSupport(const uint32_t extCount, const char **extToCheck)
std::vector< VkFence > imagesInFlight
Definition graphicCore.hpp:227
std::vector< VkSemaphore > renderFinishedSemaphores
Definition graphicCore.hpp:225
void createImageViews()
VkSurfaceKHR surface
Definition graphicCore.hpp:207
void copyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height, uint32_t layerCount)
void createRenderPass()
void createInstance()
VkQueue graphicsQueue
Definition graphicCore.hpp:210
VkDevice device
Definition graphicCore.hpp:209
void createTextureImageView()
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties)
void setTransform(uint32_t index, const glm::mat4 &transform)
Set transform matrix for figure.
void initVulkan()
VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR &capabilities)
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData)
void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer &buffer, VkDeviceMemory &bufferMemory)
VkDescriptorPool descriptorPool
Definition graphicCore.hpp:242
void createCommandPool()
void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t layerCount)
bool framebufferResized
Definition graphicCore.hpp:229
void addDefaultTexture()
std::vector< VkDescriptorSet > descriptorSets
Definition graphicCore.hpp:243
Definition renderQueue.hpp:63
const uint32_t WIDTH
Definition graphicCore.hpp:30
KeyStatusEnum
Definition graphicCore.hpp:46
@ KEY_RELEASED
Definition graphicCore.hpp:46
@ KEY_PRESSED
Definition graphicCore.hpp:46
const char * SHADER_DIR
Definition graphicCore.hpp:43
const int MAX_FRAMES_IN_FLIGHT
Definition graphicCore.hpp:31
const std::vector< const char * > validationLayers
Definition graphicCore.hpp:36
const size_t MAX_INDICES
Definition graphicCore.hpp:33
const uint32_t MAX_IMAGE_ARRAYS
Definition graphicCore.hpp:34
const std::vector< const char * > deviceExtensions
Definition graphicCore.hpp:38
const bool enableValidationLayers
Definition graphicCore.hpp:51
const size_t MAX_VERTICES
Definition graphicCore.hpp:32
const uint32_t HEIGHT
Definition graphicCore.hpp:29
Definition graphicCore.hpp:174
float zoom
Definition graphicCore.hpp:176
glm::vec2 position
Definition graphicCore.hpp:175
Definition graphicCore.hpp:165
glm::mat4 model
Definition graphicCore.hpp:170
uint32_t vertexCount
Definition graphicCore.hpp:167
uint32_t textureHandler
Definition graphicCore.hpp:171
size_t vertexOffset
Definition graphicCore.hpp:166
size_t firstIndex
Definition graphicCore.hpp:168
uint32_t indexCount
Definition graphicCore.hpp:169
Definition graphicCore.hpp:160
uint32_t textureHandler
Definition graphicCore.hpp:162
glm::mat4 model
Definition graphicCore.hpp:161
Definition graphicCore.hpp:142
std::optional< uint32_t > graphicFamily
Definition graphicCore.hpp:143
std::optional< uint32_t > presentFamily
Definition graphicCore.hpp:144
Definition graphicCore.hpp:149
std::vector< VkSurfaceFormatKHR > formats
Definition graphicCore.hpp:151
std::vector< VkPresentModeKHR > presentModes
Definition graphicCore.hpp:152
VkSurfaceCapabilitiesKHR capabilities
Definition graphicCore.hpp:150
Definition graphicCore.hpp:189
VkDeviceMemory imageMemory
Definition graphicCore.hpp:191
VkSampler sampler
Definition graphicCore.hpp:193
VkImageView imageView
Definition graphicCore.hpp:192
VkExtent2D extent
Definition graphicCore.hpp:195
std::vector< stbi_uc * > pixels
Definition graphicCore.hpp:196
VkImage image
Definition graphicCore.hpp:190
uint32_t layersCount
Definition graphicCore.hpp:194
Definition graphicCore.hpp:155
glm::mat4 view
Definition graphicCore.hpp:156
glm::mat4 proj
Definition graphicCore.hpp:157
Definition graphicCore.hpp:179
glm::vec2 pos
Definition graphicCore.hpp:180
glm::vec2 texCoord
Definition graphicCore.hpp:182
static std::array< VkVertexInputAttributeDescription, 3 > getAttributeDescriptions()
static VkVertexInputBindingDescription getBindingDescription()
glm::vec3 color
Definition graphicCore.hpp:181
Definition renderQueue.hpp:16