|
@@ -8,9 +8,11 @@
|
|
|
|
|
|
typedef struct {
|
|
typedef struct {
|
|
VkSwapchainKHR handle;
|
|
VkSwapchainKHR handle;
|
|
- size_t amount;
|
|
|
|
|
|
+ u32 amount;
|
|
VkImage* images;
|
|
VkImage* images;
|
|
VkImageView* imageViews;
|
|
VkImageView* imageViews;
|
|
|
|
+ VkCommandPool commandPool;
|
|
|
|
+ VkCommandBuffer* commandsBuffers;
|
|
} Swapchain;
|
|
} Swapchain;
|
|
|
|
|
|
typedef struct {
|
|
typedef struct {
|
|
@@ -397,13 +399,41 @@ static bool checkPresentationSupport() {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool initCommandBuffers() {
|
|
|
|
+ VkCommandPoolCreateInfo info = {
|
|
|
|
+ .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
|
|
|
|
+ .queueFamilyIndex = vk.graphicsFamily};
|
|
|
|
+ VK_ASSERT(vkCreateCommandPool(vk.device, &info, nullptr,
|
|
|
|
+ &vk.swapchain.commandPool));
|
|
|
|
+ vk.swapchain.commandsBuffers =
|
|
|
|
+ coreAllocate(sizeof(VkCommandBuffer) * vk.swapchain.amount);
|
|
|
|
+ VkCommandBufferAllocateInfo a = {
|
|
|
|
+ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
|
|
|
|
+ .commandPool = vk.swapchain.commandPool,
|
|
|
|
+ .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
|
|
|
|
+ .commandBufferCount = vk.swapchain.amount};
|
|
|
|
+ VK_ASSERT(
|
|
|
|
+ vkAllocateCommandBuffers(vk.device, &a, vk.swapchain.commandsBuffers));
|
|
|
|
+ return false;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void destroyCommandBuffers() {
|
|
|
|
+ if(vk.swapchain.commandPool != VK_NULL_HANDLE && vk.swapchain.amount > 0) {
|
|
|
|
+ vkFreeCommandBuffers(vk.device, vk.swapchain.commandPool,
|
|
|
|
+ vk.swapchain.amount, vk.swapchain.commandsBuffers);
|
|
|
|
+ }
|
|
|
|
+ coreFree(vk.swapchain.commandsBuffers);
|
|
|
|
+ vkDestroyCommandPool(vk.device, vk.swapchain.commandPool, nullptr);
|
|
|
|
+}
|
|
|
|
+
|
|
bool initVulkan() {
|
|
bool initVulkan() {
|
|
vk.width = 400;
|
|
vk.width = 400;
|
|
vk.height = 300;
|
|
vk.height = 300;
|
|
return initInstance() || initDebugging() || initSurface() ||
|
|
return initInstance() || initDebugging() || initSurface() ||
|
|
initPhysicalDevice() || initDevice() || checkPresentationSupport() ||
|
|
initPhysicalDevice() || initDevice() || checkPresentationSupport() ||
|
|
initSwapchain() || initSwapchainImages() ||
|
|
initSwapchain() || initSwapchainImages() ||
|
|
- initSemaphore(&vk.semaphore) || initSemaphore(&vk.renderSemaphore);
|
|
|
|
|
|
+ initSemaphore(&vk.semaphore) || initSemaphore(&vk.renderSemaphore) ||
|
|
|
|
+ initCommandBuffers();
|
|
}
|
|
}
|
|
|
|
|
|
void destroyVulkan(void) {
|
|
void destroyVulkan(void) {
|
|
@@ -412,6 +442,7 @@ void destroyVulkan(void) {
|
|
vkDestroySwapchainKHR(vk.device, vk.swapchain.handle, nullptr);
|
|
vkDestroySwapchainKHR(vk.device, vk.swapchain.handle, nullptr);
|
|
destroySemaphore(vk.semaphore);
|
|
destroySemaphore(vk.semaphore);
|
|
destroySemaphore(vk.renderSemaphore);
|
|
destroySemaphore(vk.renderSemaphore);
|
|
|
|
+ destroyCommandBuffers();
|
|
}
|
|
}
|
|
vkDestroyDevice(vk.device, nullptr);
|
|
vkDestroyDevice(vk.device, nullptr);
|
|
if(vk.instance != VK_NULL_HANDLE) {
|
|
if(vk.instance != VK_NULL_HANDLE) {
|