@@ -79,56 +79,7 @@ void VulkanQueueRunner::DestroyDeviceObjects() {
7979 renderPasses_.Clear ();
8080}
8181
82- bool VulkanQueueRunner::CreateSwapchain (VkCommandBuffer cmdInit, VulkanBarrierBatch *barriers) {
83- VkResult res = vkGetSwapchainImagesKHR (vulkan_->GetDevice (), vulkan_->GetSwapchain (), &swapchainImageCount_, nullptr );
84- _dbg_assert_ (res == VK_SUCCESS);
85-
86- VkImage *swapchainImages = new VkImage[swapchainImageCount_];
87- res = vkGetSwapchainImagesKHR (vulkan_->GetDevice (), vulkan_->GetSwapchain (), &swapchainImageCount_, swapchainImages);
88- if (res != VK_SUCCESS) {
89- ERROR_LOG (Log::G3D, " vkGetSwapchainImagesKHR failed" );
90- delete[] swapchainImages;
91- return false ;
92- }
93-
94- for (uint32_t i = 0 ; i < swapchainImageCount_; i++) {
95- SwapchainImageData sc_buffer{};
96- sc_buffer.image = swapchainImages[i];
97-
98- VkImageViewCreateInfo color_image_view = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO };
99- color_image_view.format = vulkan_->GetSwapchainFormat ();
100- color_image_view.components .r = VK_COMPONENT_SWIZZLE_IDENTITY;
101- color_image_view.components .g = VK_COMPONENT_SWIZZLE_IDENTITY;
102- color_image_view.components .b = VK_COMPONENT_SWIZZLE_IDENTITY;
103- color_image_view.components .a = VK_COMPONENT_SWIZZLE_IDENTITY;
104- color_image_view.subresourceRange .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
105- color_image_view.subresourceRange .baseMipLevel = 0 ;
106- color_image_view.subresourceRange .levelCount = 1 ;
107- color_image_view.subresourceRange .baseArrayLayer = 0 ;
108- color_image_view.subresourceRange .layerCount = 1 ; // TODO: Investigate hw-assisted stereo.
109- color_image_view.viewType = VK_IMAGE_VIEW_TYPE_2D;
110- color_image_view.flags = 0 ;
111- color_image_view.image = sc_buffer.image ;
112-
113- // We leave the images as UNDEFINED, there's no need to pre-transition them as
114- // the backbuffer renderpass starts out with them being auto-transitioned from UNDEFINED anyway.
115- // Also, turns out it's illegal to transition un-acquired images, thanks Hans-Kristian. See #11417.
116-
117- res = vkCreateImageView (vulkan_->GetDevice (), &color_image_view, nullptr , &sc_buffer.view );
118- vulkan_->SetDebugName (sc_buffer.view , VK_OBJECT_TYPE_IMAGE_VIEW, " swapchain_view" );
119- swapchainImages_.push_back (sc_buffer);
120- _dbg_assert_ (res == VK_SUCCESS);
121- }
122- delete[] swapchainImages;
123-
124- // Must be before InitBackbufferRenderPass.
125- if (InitDepthStencilBuffer (cmdInit, barriers)) {
126- InitBackbufferFramebuffers (vulkan_->GetBackbufferWidth (), vulkan_->GetBackbufferHeight ());
127- }
128- return true ;
129- }
130-
131- bool VulkanQueueRunner::InitBackbufferFramebuffers (int width, int height) {
82+ bool VulkanQueueRunner::InitBackbufferFramebuffers (int width, int height, FrameDataShared &frameDataShared) {
13283 VkResult res;
13384 // We share the same depth buffer but have multiple color buffers, see the loop below.
13485 VkImageView attachments[2 ] = { VK_NULL_HANDLE, depth_.view };
@@ -141,10 +92,10 @@ bool VulkanQueueRunner::InitBackbufferFramebuffers(int width, int height) {
14192 fb_info.height = height;
14293 fb_info.layers = 1 ;
14394
144- framebuffers_.resize (swapchainImageCount_);
95+ framebuffers_.resize (frameDataShared. swapchainImageCount_ );
14596
146- for (uint32_t i = 0 ; i < swapchainImageCount_; i++) {
147- attachments[0 ] = swapchainImages_[i].view ;
97+ for (uint32_t i = 0 ; i < frameDataShared. swapchainImageCount_ ; i++) {
98+ attachments[0 ] = frameDataShared. swapchainImages_ [i].view ;
14899 res = vkCreateFramebuffer (vulkan_->GetDevice (), &fb_info, nullptr , &framebuffers_[i]);
149100 _dbg_assert_ (res == VK_SUCCESS);
150101 if (res != VK_SUCCESS) {
@@ -225,11 +176,6 @@ bool VulkanQueueRunner::InitDepthStencilBuffer(VkCommandBuffer cmd, VulkanBarrie
225176
226177
227178void VulkanQueueRunner::DestroyBackBuffers () {
228- for (auto &image : swapchainImages_) {
229- vulkan_->Delete ().QueueDeleteImageView (image.view );
230- }
231- swapchainImages_.clear ();
232-
233179 if (depth_.view ) {
234180 vulkan_->Delete ().QueueDeleteImageView (depth_.view );
235181 }
@@ -373,7 +319,7 @@ void VulkanQueueRunner::RunSteps(std::vector<VKRStep *> &steps, int curFrame, Fr
373319 // So only acquire once.
374320 if (!frameData.hasAcquired ) {
375321 frameData.AcquireNextImage (vulkan_);
376- SetBackbuffer (framebuffers_[frameData.curSwapchainImage ], swapchainImages_[frameData.curSwapchainImage ].image );
322+ SetBackbuffer (framebuffers_[frameData.curSwapchainImage ], frameDataShared. swapchainImages_ [frameData.curSwapchainImage ].image );
377323 }
378324
379325 if (!frameData.hasPresentCommands ) {
0 commit comments