summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/window.cpp98
1 files changed, 97 insertions, 1 deletions
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<VkImage>(MAX_FRAMES_IN_FLIGHT);
+ renderImageViews = Pke_New<VkImageView>(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<VkFramebuffer>(swapchainLength);
+ renderImageFramebuffers = Pke_New<VkFramebuffer>(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<VkFramebuffer>(renderImageFramebuffers, swapchainLength);
+ }
if (swapchainFramebuffers != nullptr && swapchainFramebuffers != CAFE_BABE(VkFramebuffer)) {
for (long i = 0; i < swapchainLength; ++i) {
vkDestroyFramebuffer(vkDevice, swapchainFramebuffers[i], vkAllocator);
}
Pke_Delete<VkFramebuffer>(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<VkImageView>(renderImageViews, swapchainLength);
+ Pke_Delete<VkImage>(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() {