Skip to content

Commit e4cf8a6

Browse files
committed
Use only one intermediate image
1 parent 1cd72f3 commit e4cf8a6

File tree

1 file changed

+36
-41
lines changed

1 file changed

+36
-41
lines changed

examples/dynamicrenderingmultisampling/dynamicrenderingmultisampling.cpp

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ class VulkanExample : public VulkanExampleBase
3434
VkDescriptorSetLayout descriptorSetLayout{ VK_NULL_HANDLE };
3535

3636
// Intermediate images used for multi sampling
37-
struct RenderImage {
37+
struct Image {
3838
VkImage image{ VK_NULL_HANDLE };
3939
VkImageView view{ VK_NULL_HANDLE };
4040
VkDeviceMemory memory{ VK_NULL_HANDLE };
4141
};
42-
std::vector<RenderImage> renderImages;
43-
RenderImage depthStencilRenderImage;
42+
Image renderImage;
43+
Image depthStencilRenderImage;
4444

4545
VulkanExample() : VulkanExampleBase()
4646
{
@@ -74,11 +74,9 @@ class VulkanExample : public VulkanExampleBase
7474
vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
7575
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
7676
uniformBuffer.destroy();
77-
for (auto i = 0; i < renderImages.size(); i++) {
78-
vkDestroyImage(device, renderImages[i].image, nullptr);
79-
vkDestroyImageView(device, renderImages[i].view, nullptr);
80-
vkFreeMemory(device, renderImages[i].memory, nullptr);
81-
}
77+
vkDestroyImage(device, renderImage.image, nullptr);
78+
vkDestroyImageView(device, renderImage.view, nullptr);
79+
vkFreeMemory(device, renderImage.memory, nullptr);
8280
}
8381
}
8482

@@ -92,37 +90,34 @@ class VulkanExample : public VulkanExampleBase
9290
{
9391
// With VK_KHR_dynamic_rendering we no longer need a frame buffer, so we can so skip the sample base framebuffer setup
9492
// For multi sampling we need intermediate images that are then resolved to the final presentation image
95-
renderImages.resize(swapChain.images.size());
96-
for (auto i = 0; i < renderImages.size(); i++) {
97-
vkDestroyImage(device, renderImages[i].image, nullptr);
98-
vkDestroyImageView(device, renderImages[i].view, nullptr);
99-
vkFreeMemory(device, renderImages[i].memory, nullptr);
100-
VkImageCreateInfo renderImageCI = vks::initializers::imageCreateInfo();
101-
renderImageCI.imageType = VK_IMAGE_TYPE_2D;
102-
renderImageCI.format = swapChain.colorFormat;
103-
renderImageCI.extent = { width, height, 1 };
104-
renderImageCI.mipLevels = 1;
105-
renderImageCI.arrayLayers = 1;
106-
renderImageCI.samples = multiSampleCount;
107-
renderImageCI.tiling = VK_IMAGE_TILING_OPTIMAL;
108-
renderImageCI.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
109-
renderImageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
110-
VK_CHECK_RESULT(vkCreateImage(device, &renderImageCI, nullptr, &renderImages[i].image));
111-
VkMemoryRequirements memReqs{};
112-
vkGetImageMemoryRequirements(device, renderImages[i].image, &memReqs);
113-
VkMemoryAllocateInfo memAllloc{};
114-
memAllloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
115-
memAllloc.allocationSize = memReqs.size;
116-
memAllloc.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
117-
VK_CHECK_RESULT(vkAllocateMemory(device, &memAllloc, nullptr, &renderImages[i].memory));
118-
VK_CHECK_RESULT(vkBindImageMemory(device, renderImages[i].image, renderImages[i].memory, 0));
119-
VkImageViewCreateInfo imageViewCI = vks::initializers::imageViewCreateInfo();
120-
imageViewCI.viewType = VK_IMAGE_VIEW_TYPE_2D;
121-
imageViewCI.image = renderImages[i].image;
122-
imageViewCI.format = swapChain.colorFormat;
123-
imageViewCI.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
124-
VK_CHECK_RESULT(vkCreateImageView(device, &imageViewCI, nullptr, &renderImages[i].view));
125-
}
93+
vkDestroyImage(device, renderImage.image, nullptr);
94+
vkDestroyImageView(device, renderImage.view, nullptr);
95+
vkFreeMemory(device, renderImage.memory, nullptr);
96+
VkImageCreateInfo renderImageCI = vks::initializers::imageCreateInfo();
97+
renderImageCI.imageType = VK_IMAGE_TYPE_2D;
98+
renderImageCI.format = swapChain.colorFormat;
99+
renderImageCI.extent = { width, height, 1 };
100+
renderImageCI.mipLevels = 1;
101+
renderImageCI.arrayLayers = 1;
102+
renderImageCI.samples = multiSampleCount;
103+
renderImageCI.tiling = VK_IMAGE_TILING_OPTIMAL;
104+
renderImageCI.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
105+
renderImageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
106+
VK_CHECK_RESULT(vkCreateImage(device, &renderImageCI, nullptr, &renderImage.image));
107+
VkMemoryRequirements memReqs{};
108+
vkGetImageMemoryRequirements(device, renderImage.image, &memReqs);
109+
VkMemoryAllocateInfo memAllloc{};
110+
memAllloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
111+
memAllloc.allocationSize = memReqs.size;
112+
memAllloc.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
113+
VK_CHECK_RESULT(vkAllocateMemory(device, &memAllloc, nullptr, &renderImage.memory));
114+
VK_CHECK_RESULT(vkBindImageMemory(device, renderImage.image, renderImage.memory, 0));
115+
VkImageViewCreateInfo imageViewCI = vks::initializers::imageViewCreateInfo();
116+
imageViewCI.viewType = VK_IMAGE_VIEW_TYPE_2D;
117+
imageViewCI.image = renderImage.image;
118+
imageViewCI.format = swapChain.colorFormat;
119+
imageViewCI.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
120+
VK_CHECK_RESULT(vkCreateImageView(device, &imageViewCI, nullptr, &renderImage.view));
126121
}
127122

128123
// We need to override the default depth/stencil setup to create a depth image that supports multi sampling
@@ -191,7 +186,7 @@ class VulkanExample : public VulkanExampleBase
191186
// This set of barriers prepares the color and depth images for output
192187
vks::tools::insertImageMemoryBarrier(
193188
drawCmdBuffers[i],
194-
renderImages[i].image,
189+
renderImage.image,
195190
0,
196191
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
197192
VK_IMAGE_LAYOUT_UNDEFINED,
@@ -218,7 +213,7 @@ class VulkanExample : public VulkanExampleBase
218213
colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
219214
colorAttachment.clearValue.color = { 0.0f,0.0f,0.0f,0.0f };
220215
// When multi sampling is used, we use intermediate images to render and resolve to the swap chain images
221-
colorAttachment.imageView = renderImages[i].view;
216+
colorAttachment.imageView = renderImage.view;
222217
colorAttachment.resolveMode = VK_RESOLVE_MODE_AVERAGE_BIT;
223218
colorAttachment.resolveImageView = swapChain.imageViews[i];
224219
colorAttachment.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL;

0 commit comments

Comments
 (0)