@@ -34,13 +34,13 @@ class VulkanExample : public VulkanExampleBase
34
34
VkDescriptorSetLayout descriptorSetLayout{ VK_NULL_HANDLE };
35
35
36
36
// Intermediate images used for multi sampling
37
- struct RenderImage {
37
+ struct Image {
38
38
VkImage image{ VK_NULL_HANDLE };
39
39
VkImageView view{ VK_NULL_HANDLE };
40
40
VkDeviceMemory memory{ VK_NULL_HANDLE };
41
41
};
42
- std::vector<RenderImage> renderImages ;
43
- RenderImage depthStencilRenderImage;
42
+ Image renderImage ;
43
+ Image depthStencilRenderImage;
44
44
45
45
VulkanExample () : VulkanExampleBase()
46
46
{
@@ -74,11 +74,9 @@ class VulkanExample : public VulkanExampleBase
74
74
vkDestroyPipelineLayout (device, pipelineLayout, nullptr );
75
75
vkDestroyDescriptorSetLayout (device, descriptorSetLayout, nullptr );
76
76
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 );
82
80
}
83
81
}
84
82
@@ -92,37 +90,34 @@ class VulkanExample : public VulkanExampleBase
92
90
{
93
91
// With VK_KHR_dynamic_rendering we no longer need a frame buffer, so we can so skip the sample base framebuffer setup
94
92
// 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 ));
126
121
}
127
122
128
123
// 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
191
186
// This set of barriers prepares the color and depth images for output
192
187
vks::tools::insertImageMemoryBarrier (
193
188
drawCmdBuffers[i],
194
- renderImages[i] .image ,
189
+ renderImage .image ,
195
190
0 ,
196
191
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
197
192
VK_IMAGE_LAYOUT_UNDEFINED,
@@ -218,7 +213,7 @@ class VulkanExample : public VulkanExampleBase
218
213
colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
219
214
colorAttachment.clearValue .color = { 0 .0f ,0 .0f ,0 .0f ,0 .0f };
220
215
// 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 ;
222
217
colorAttachment.resolveMode = VK_RESOLVE_MODE_AVERAGE_BIT;
223
218
colorAttachment.resolveImageView = swapChain.imageViews [i];
224
219
colorAttachment.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL;
0 commit comments