28 VkPhysicalDevice physicalDevice;
30 VkQueue graphicsQueue;
32 VmaAllocator allocator;
35 VkSwapchainKHR swapchain= VK_NULL_HANDLE;
36 std::vector<VkImage> swapchainImages;
37 VkFormat swapchainImageFormat;
38 VkExtent2D swapchainExtent;
39 std::vector<VkImageView> swapchainImageViews;
41 VkImage depthImage = VK_NULL_HANDLE;
42 VmaAllocation depthAllocation = VK_NULL_HANDLE;
43 VkImageView depthImageView = VK_NULL_HANDLE;
46 VkImage lowResColorImage = VK_NULL_HANDLE;
47 VmaAllocation lowResColorAlloc = VK_NULL_HANDLE;
48 VkImageView lowResColorView = VK_NULL_HANDLE;
50 VkImage compositeImage = VK_NULL_HANDLE;
51 VmaAllocation compositeAlloc = VK_NULL_HANDLE;
52 VkImageView compositeView = VK_NULL_HANDLE;
54 VkImage uiImage = VK_NULL_HANDLE;
55 VmaAllocation uiAlloc = VK_NULL_HANDLE;
56 VkImageView uiView = VK_NULL_HANDLE;
57 VkFormat lowResColorFormat = VK_FORMAT_UNDEFINED;
59 VkImage accumImage = VK_NULL_HANDLE;
60 VmaAllocation accumAlloc = VK_NULL_HANDLE;
61 VkImageView accumView = VK_NULL_HANDLE;
63 VkImage revealImage = VK_NULL_HANDLE;
64 VmaAllocation revealAlloc = VK_NULL_HANDLE;
65 VkImageView revealView = VK_NULL_HANDLE;
67 VkImage gameViewImage = VK_NULL_HANDLE;
68 VmaAllocation gameViewAlloc = VK_NULL_HANDLE;
69 VkImageView gameViewView = VK_NULL_HANDLE;
71 VkImage colorLutImage = VK_NULL_HANDLE;
72 VmaAllocation colorLutAllocation = VK_NULL_HANDLE;
73 VkImageView colorLutView = VK_NULL_HANDLE;
75 VkPipelineLayout pipelineLayout;
77 std::vector<VkCommandPool> commandPools;
78 std::vector<VkCommandBuffer> commandBuffers;
80 VkCommandPool singleTimePool;
85 VkCommandBufferAllocateInfo allocInfo{};
86 allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
87 allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
88 allocInfo.commandPool = singleTimePool;
89 allocInfo.commandBufferCount = 1;
91 VkCommandBuffer commandBuffer;
92 vkAllocateCommandBuffers(device, &allocInfo, &commandBuffer);
94 VkCommandBufferBeginInfo beginInfo{};
95 beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
96 beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
98 vkBeginCommandBuffer(commandBuffer, &beginInfo);
105 vkEndCommandBuffer(commandBuffer);
107 VkSubmitInfo submitInfo{};
108 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
109 submitInfo.commandBufferCount = 1;
110 submitInfo.pCommandBuffers = &commandBuffer;
112 vkQueueSubmit(graphicsQueue, 1, &submitInfo, VK_NULL_HANDLE);
113 vkQueueWaitIdle(graphicsQueue);
115 vkFreeCommandBuffers(device, singleTimePool, 1, &commandBuffer);
118 uint32_t graphicsQueueFamily;
119 uint32_t presentQueueFamily;
147 VkDescriptorSetLayout descriptorSetLayout = VK_NULL_HANDLE;
148 VkDescriptorSetLayout uboDescriptorSetLayout = VK_NULL_HANDLE;
149 VkDescriptorSetLayout textureDescriptorSetLayout = VK_NULL_HANDLE;
150 VkDescriptorSetLayout screenDescriptorSetLayout = VK_NULL_HANDLE;
151 VkDescriptorSetLayout particleDescriptorSetLayout = VK_NULL_HANDLE;
158 SDL_LogError(SDL_LOG_CATEGORY_ERROR,
159 "Invalid frame index %u (MAX_FRAMES_IN_FLIGHT: %u)",
170 if (imageIndex >= swapchainImages.size()) {
171 SDL_LogError(SDL_LOG_CATEGORY_ERROR,
172 "Invalid image index %u (swapchain image count: %zu)",
173 imageIndex, swapchainImages.size());
183 "imageAvailableSemaphores size mismatch");
185 "renderFinishedSemaphores size mismatch");
187 "inFlightFences size mismatch");
189 "commandPools size mismatch");
191 "commandBuffers size mismatch");
194 vex_map<std::string, uint32_t> textureIndices;
195 uint32_t nextTextureIndex = 0;
197 std::queue<uint32_t> recycledTextureIndices;
199 glm::uvec2 currentRenderResolution;
203 bool supportsMultiDraw =
false;
204 bool supportsIndirectDraw =
false;
205 bool supportsBindlessTextures =
false;
206 bool supportsShaderDrawParameters =
false;
208 VkDescriptorSetLayout bindlessDescriptorSetLayout = VK_NULL_HANDLE;
209 VkDescriptorPool bindlessDescriptorPool = VK_NULL_HANDLE;
210 VkDescriptorSet bindlessDescriptorSet = VK_NULL_HANDLE;
212 uint32_t maxDrawIndirectCount = 1;
213 uint32_t maxMultiDrawCount = 1;
214 bool requestSwapchainRecreation =
false;
216 uint32_t vulkanVersion = 0;
Struct holding all vulkan data, like device, surface, swapchain, images, views, and more.
uint32_t currentImageIndex
Current swapchain image index (acquired from vkAcquireNextImageKHR).
uint32_t MAX_FRAMES_IN_FLIGHT
Maximum frames in flight (triple-buffering).
VkCommandBuffer beginSingleTimeCommands()
Function to begin single time command, used for stuff like creating vulkan image when loading texture...
bool isValidFrameIndex(uint32_t frameIndex) const
Validates a frame index against MAX_FRAMES_IN_FLIGHT.
std::vector< VkSemaphore > imageAvailableSemaphores
Synchronization semaphores - must be sized to MAX_FRAMES_IN_FLIGHT.
bool isValidImageIndex(uint32_t imageIndex) const
Validates an image index against swapchain image count.
std::vector< VkFence > inFlightFences
In-flight fences - must be sized to MAX_FRAMES_IN_FLIGHT.
void validateSyncObjectSizes() const
Asserts that all frame-dependent synchronization vectors are properly sized.
uint32_t currentFrame
Current frame index for triple-buffering.
void endSingleTimeCommands(VkCommandBuffer commandBuffer)
Function to end single time command.
std::vector< VkSemaphore > renderFinishedSemaphores
Render finished semaphores - must be sized to MAX_FRAMES_IN_FLIGHT.