source: opengl-game/vulkan-utils.hpp@ 5a1ace0

feature/imgui-sdl points-test
Last change on this file since 5a1ace0 was 5a1ace0, checked in by Dmitry Portnoy <dmitry.portnoy@…>, 5 years ago

In VulkanGame, add objIndex to scene objects, use it in the scene shader to index into the ssbo, and change the code that copies data to the ssbo to do so for each scene object, not just the first one

  • Property mode set to 100644
File size: 6.4 KB
Line 
1#ifndef _VULKAN_UTILS_H
2#define _VULKAN_UTILS_H
3
4#include <optional>
5#include <string>
6#include <vector>
7
8#include <vulkan/vulkan.h>
9
10#include <SDL2/SDL.h>
11#include <SDL2/SDL_image.h>
12#include <SDL2/SDL_vulkan.h>
13
14using namespace std;
15
16struct QueueFamilyIndices {
17 optional<uint32_t> graphicsFamily;
18 optional<uint32_t> presentFamily;
19
20 bool isComplete() {
21 return graphicsFamily.has_value() && presentFamily.has_value();
22 }
23};
24
25struct SwapChainSupportDetails {
26 VkSurfaceCapabilitiesKHR capabilities;
27 vector<VkSurfaceFormatKHR> formats;
28 vector<VkPresentModeKHR> presentModes;
29};
30
31struct VulkanImage {
32 VkImage image;
33 VkDeviceMemory imageMemory;
34 VkImageView imageView;
35};
36
37class VulkanUtils {
38 public:
39 static bool checkValidationLayerSupport(const vector<const char*> &validationLayers);
40
41 static VkResult createDebugUtilsMessengerEXT(VkInstance instance,
42 const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
43 const VkAllocationCallbacks* pAllocator,
44 VkDebugUtilsMessengerEXT* pDebugMessenger);
45
46 static void destroyDebugUtilsMessengerEXT(VkInstance instance,
47 VkDebugUtilsMessengerEXT debugMessenger,
48 const VkAllocationCallbacks* pAllocator);
49
50 static QueueFamilyIndices findQueueFamilies(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface);
51 static bool checkDeviceExtensionSupport(VkPhysicalDevice physicalDevice,
52 const vector<const char*>& deviceExtensions);
53 static SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice physicalDevice,
54 VkSurfaceKHR surface);
55 static VkSurfaceFormatKHR chooseSwapSurfaceFormat(const vector<VkSurfaceFormatKHR>& availableFormats);
56 static VkPresentModeKHR chooseSwapPresentMode(const vector<VkPresentModeKHR>& availablePresentModes);
57 static VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, int width, int height);
58 static VkImageView createImageView(VkDevice device, VkImage image, VkFormat format,
59 VkImageAspectFlags aspectFlags);
60 static VkFormat findSupportedFormat(VkPhysicalDevice physicalDevice, const vector<VkFormat>& candidates,
61 VkImageTiling tiling, VkFormatFeatureFlags features);
62 static void createBuffer(VkDevice device, VkPhysicalDevice physicalDevice, VkDeviceSize size,
63 VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer,
64 VkDeviceMemory& bufferMemory);
65 static uint32_t findMemoryType(VkPhysicalDevice physicalDevice, uint32_t typeFilter,
66 VkMemoryPropertyFlags properties);
67
68 static void createVulkanImageFromFile(VkDevice device, VkPhysicalDevice physicalDevice,
69 VkCommandPool commandPool, string filename, VulkanImage& image, VkQueue graphicsQueue);
70 static void createVulkanImageFromSDLTexture(VkDevice device, VkPhysicalDevice physicalDevice,
71 SDL_Texture* texture, VulkanImage& image);
72 static void populateVulkanImageFromSDLTexture(VkDevice device, VkPhysicalDevice physicalDevice,
73 VkCommandPool commandPool, SDL_Texture* texture, SDL_Renderer* renderer, VulkanImage& image,
74 VkQueue graphicsQueue);
75 static void createDepthImage(VkDevice device, VkPhysicalDevice physicalDevice, VkCommandPool commandPool,
76 VkFormat depthFormat, VkExtent2D extent, VulkanImage& image, VkQueue graphicsQueue);
77 static void createImage(VkDevice device, VkPhysicalDevice physicalDevice, uint32_t width, uint32_t height,
78 VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties,
79 VulkanImage& image);
80
81 static void transitionImageLayout(VkDevice device, VkCommandPool commandPool, VkImage image,
82 VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, VkQueue graphicsQueue);
83 static VkCommandBuffer beginSingleTimeCommands(VkDevice device, VkCommandPool commandPool);
84 static void endSingleTimeCommands(VkDevice device, VkCommandPool commandPool,
85 VkCommandBuffer commandBuffer, VkQueue graphicsQueue);
86 static void copyBufferToImage(VkDevice device, VkCommandPool commandPool, VkBuffer buffer, VkImage image,
87 uint32_t width, uint32_t height, VkQueue graphicsQueue);
88
89 template<class DataType>
90 static void copyDataToBuffer(VkDevice device, VkPhysicalDevice physicalDevice, VkCommandPool commandPool,
91 const vector<DataType>& srcData, VkBuffer dstBuffer, size_t dstVertexOffset, VkQueue graphicsQueue);
92
93 static void copyBuffer(VkDevice device, VkCommandPool commandPool, VkBuffer srcBuffer, VkBuffer dstBuffer,
94 VkDeviceSize srcOffset, VkDeviceSize dstOffset, VkDeviceSize size, VkQueue graphicsQueue);
95
96 template<class DataType>
97 static void copyDataToMemory(VkDevice device, VkDeviceMemory bufferMemory, VkDeviceSize offset,
98 const DataType& srcData);
99
100 static bool hasStencilComponent(VkFormat format);
101
102 static void destroyVulkanImage(VkDevice& device, VulkanImage& image);
103};
104
105template<class DataType>
106void VulkanUtils::copyDataToBuffer(VkDevice device, VkPhysicalDevice physicalDevice, VkCommandPool commandPool,
107 const vector<DataType>& srcData, VkBuffer dstBuffer, size_t dstVertexOffset, VkQueue graphicsQueue) {
108 VkDeviceSize srcDataSize = srcData.size() * sizeof(DataType);
109
110 VkBuffer stagingBuffer;
111 VkDeviceMemory stagingBufferMemory;
112 createBuffer(device, physicalDevice, srcDataSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
113 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
114 stagingBuffer, stagingBufferMemory);
115
116 void* data;
117 vkMapMemory(device, stagingBufferMemory, 0, srcDataSize, 0, &data);
118 memcpy(data, srcData.data(), (size_t)srcDataSize);
119 vkUnmapMemory(device, stagingBufferMemory);
120
121 copyBuffer(device, commandPool, stagingBuffer, dstBuffer, 0, dstVertexOffset * sizeof(DataType), srcDataSize,
122 graphicsQueue);
123
124 vkDestroyBuffer(device, stagingBuffer, nullptr);
125 vkFreeMemory(device, stagingBufferMemory, nullptr);
126}
127
128template<class DataType>
129void VulkanUtils::copyDataToMemory(VkDevice device, VkDeviceMemory bufferMemory, VkDeviceSize offset,
130 const DataType& srcData) {
131 void* data;
132
133 vkMapMemory(device, bufferMemory, offset * sizeof(DataType), sizeof(DataType), 0, &data);
134 memcpy(data, &srcData, sizeof(DataType));
135 vkUnmapMemory(device, bufferMemory);
136}
137
138#endif // _VULKAN_UTILS_H
Note: See TracBrowser for help on using the repository browser.