From 99c08b21e2ed11c9faeec3ba5e8b5e9ca118d552 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Tue, 19 Sep 2023 11:43:03 -0400 Subject: add render target vulkan items - first pass --- src/window.cpp | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/window.cpp b/src/window.cpp index c44a110..6663fb0 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -42,6 +42,10 @@ VkPresentModeKHR vkPresentModeKHR; VkExtent2D extent; VkImage *swapchainImages = nullptr; VkImageView *swapchainImageViews = nullptr; +VkImage *renderImages = nullptr; +VkImageView *renderImageViews = nullptr; +VkDeviceMemory renderImagesMemory; +VkBuffer renderImagesBuffer; VkSampler presentSampler; VkRenderPass vkRenderPass; VkDescriptorSetLayout vkDescriptorSetLayout; @@ -50,6 +54,7 @@ VkDescriptorSet presentDescriptorSets[MAX_FRAMES_IN_FLIGHT]; VkPipelineLayout pipelineLayout; VkPipeline graphicsPipeline; VkFramebuffer *swapchainFramebuffers = nullptr; +VkFramebuffer *renderImageFramebuffers = nullptr; VkCommandPool transferCommandPool; VkCommandBuffer transferCommandBuffer; VkCommandPool graphicsCommandPool; @@ -567,6 +572,71 @@ void CreateSwapchain() { vkImageViewCreateInfo.image = swapchainImages[i]; vkCreateImageView(vkDevice, &vkImageViewCreateInfo, vkAllocator, &swapchainImageViews[i]); } + + // render target items + VkImageCreateInfo renderTargetImageCI{}; + renderTargetImageCI.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + renderTargetImageCI.pNext = nullptr; + renderTargetImageCI.flags = 0; + renderTargetImageCI.imageType = VK_IMAGE_TYPE_2D; + renderTargetImageCI.format = vkSurfaceFormatKHR.format; + renderTargetImageCI.extent.width = extent.width; + renderTargetImageCI.extent.height = extent.height; + renderTargetImageCI.extent.depth = 1; + renderTargetImageCI.mipLevels = 1; + renderTargetImageCI.arrayLayers = 1; + renderTargetImageCI.samples = VK_SAMPLE_COUNT_1_BIT; + renderTargetImageCI.tiling = VK_IMAGE_TILING_OPTIMAL; + renderTargetImageCI.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | + VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + renderTargetImageCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + renderTargetImageCI.queueFamilyIndexCount = 0; + renderTargetImageCI.pQueueFamilyIndices = nullptr; + renderTargetImageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + + VkImage tmpImage; + vkCreateImage(vkDevice, &renderTargetImageCI, vkAllocator, &tmpImage); + + VkMemoryRequirements imageMemoryRequirements; + vkGetImageMemoryRequirements(vkDevice, tmpImage, &imageMemoryRequirements); + + VkDeviceSize paddedImageSize = imageMemoryRequirements.size + (imageMemoryRequirements.alignment - (imageMemoryRequirements.size % imageMemoryRequirements.alignment)); + assert(paddedImageSize % imageMemoryRequirements.alignment == 0); + + vkDestroyImage(vkDevice, tmpImage, vkAllocator); + + VkBufferCreateInfo imageBufferCI{}; + imageBufferCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + imageBufferCI.pNext = nullptr; + imageBufferCI.flags = 0; + imageBufferCI.size = paddedImageSize * MAX_FRAMES_IN_FLIGHT; + imageBufferCI.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + imageBufferCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + imageBufferCI.queueFamilyIndexCount = 0; + imageBufferCI.pQueueFamilyIndices = nullptr; + vkCreateBuffer(vkDevice, &imageBufferCI, vkAllocator, &renderImagesBuffer); + + VkMemoryAllocateInfo vkMemoryAllocateInfo{}; + vkMemoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + vkMemoryAllocateInfo.pNext = nullptr; + vkMemoryAllocateInfo.allocationSize = imageBufferCI.size; + vkMemoryAllocateInfo.memoryTypeIndex = FindMemoryTypeIndex(imageMemoryRequirements.memoryTypeBits, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + + vkAllocateMemory(vkDevice, &vkMemoryAllocateInfo, vkAllocator, &renderImagesMemory); + + vkBindBufferMemory(vkDevice, renderImagesBuffer, renderImagesMemory, 0); + + renderImages = Pke_New(MAX_FRAMES_IN_FLIGHT); + renderImageViews = Pke_New(MAX_FRAMES_IN_FLIGHT); + + for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) { + vkCreateImage(vkDevice, &renderTargetImageCI, vkAllocator, &renderImages[i]); + vkBindImageMemory(vkDevice, renderImages[i], renderImagesMemory, paddedImageSize * i); + + vkImageViewCreateInfo.image = renderImages[i]; + vkCreateImageView(vkDevice, &vkImageViewCreateInfo, vkAllocator, &renderImageViews[i]); + } } void CreateRenderPass() { @@ -860,7 +930,7 @@ void CreateGraphicsPipeline() { descriptorImageInfo[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; descriptorImageInfo[i].sampler = presentSampler; - descriptorImageInfo[i].imageView = swapchainImageViews[i]; + descriptorImageInfo[i].imageView = renderImageViews[i]; writeDescriptorSets[i].pImageInfo = &descriptorImageInfo[i]; writeDescriptorSets[i].dstSet = presentDescriptorSets[i]; } @@ -875,7 +945,9 @@ void CreateGraphicsPipeline() { void CreateFramebuffers() { assert(swapchainFramebuffers == nullptr || swapchainFramebuffers == CAFE_BABE(VkFramebuffer)); + assert(renderImageFramebuffers == nullptr || renderImageFramebuffers == CAFE_BABE(VkFramebuffer)); swapchainFramebuffers = Pke_New(swapchainLength); + renderImageFramebuffers = Pke_New(swapchainLength); VkFramebufferCreateInfo framebufferInfo; framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; @@ -897,6 +969,11 @@ void CreateFramebuffers() { if (result != VK_SUCCESS) { throw "failed to create framebuffer"; } + attachments[0] = renderImageViews[i]; + result = vkCreateFramebuffer(vkDevice, &framebufferInfo, vkAllocator, &renderImageFramebuffers[i]); + if (result != VK_SUCCESS) { + throw "failed to create render framebuffer"; + } } } @@ -1177,12 +1254,28 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { } void DestroySwapchain() { + if (renderImageFramebuffers != nullptr && renderImageFramebuffers != CAFE_BABE(VkFramebuffer)) { + for (long i = 0; i < swapchainLength; ++i) { + vkDestroyFramebuffer(vkDevice, renderImageFramebuffers[i], vkAllocator); + } + Pke_Delete(renderImageFramebuffers, swapchainLength); + } if (swapchainFramebuffers != nullptr && swapchainFramebuffers != CAFE_BABE(VkFramebuffer)) { for (long i = 0; i < swapchainLength; ++i) { vkDestroyFramebuffer(vkDevice, swapchainFramebuffers[i], vkAllocator); } Pke_Delete(swapchainFramebuffers, swapchainLength); } + if (renderImageViews!= nullptr && renderImageViews != CAFE_BABE(VkImageView)) { + for (long i = 0; i < swapchainLength; ++i) { + vkDestroyImageView(vkDevice, renderImageViews[i], vkAllocator); + vkDestroyImage(vkDevice, renderImages[i], vkAllocator); + } + Pke_Delete(renderImageViews, swapchainLength); + Pke_Delete(renderImages, swapchainLength); + vkDestroyBuffer(vkDevice, renderImagesBuffer, vkAllocator); + vkFreeMemory(vkDevice, renderImagesMemory, vkAllocator); + } if (swapchainImageViews!= nullptr && swapchainImageViews != CAFE_BABE(VkImageView)) { for (long i = 0; i < swapchainLength; ++i) { vkDestroyImageView(vkDevice, swapchainImageViews[i], vkAllocator); @@ -1194,6 +1287,9 @@ void DestroySwapchain() { swapchainImages = CAFE_BABE(VkImage); swapchainImageViews = CAFE_BABE(VkImageView); swapchainFramebuffers = CAFE_BABE(VkFramebuffer); + renderImages = CAFE_BABE(VkImage); + renderImageViews = CAFE_BABE(VkImageView); + renderImageFramebuffers = CAFE_BABE(VkFramebuffer); } void RecreateSwapchain() { -- cgit v1.2.3