Skip to content

Commit 1ba4cb4

Browse files
committed
GPU Vulkan Display: minor optimization: reuse resources from old swapChain when creating new one
1 parent 38ce09c commit 1ba4cb4

2 files changed

Lines changed: 15 additions & 10 deletions

File tree

‎GPU/GPUTracking/display/backend/GPUDisplayBackendVulkan.cxx‎

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ void GPUDisplayBackendVulkan::clearTextureSampler()
769769

770770
// ---------------------------- VULKAN SWAPCHAIN MANAGEMENT ----------------------------
771771

772-
void GPUDisplayBackendVulkan::createSwapChain(bool forScreenshot, bool forMixing)
772+
void GPUDisplayBackendVulkan::createSwapChain(bool forScreenshot, bool forMixing, vk::SwapchainKHR oldSwapChain)
773773
{
774774
mDownsampleFactor = getDownsampleFactor(forScreenshot);
775775
mDownsampleFSAA = mDownsampleFactor != 1;
@@ -805,14 +805,17 @@ void GPUDisplayBackendVulkan::createSwapChain(bool forScreenshot, bool forMixing
805805
swapCreateInfo.compositeAlpha = vk::CompositeAlphaFlagBitsKHR::eOpaque;
806806
swapCreateInfo.presentMode = mPresentMode;
807807
swapCreateInfo.clipped = true;
808-
swapCreateInfo.oldSwapchain = VkSwapchainKHR(VK_NULL_HANDLE);
808+
swapCreateInfo.oldSwapchain = oldSwapChain;
809809
if (mSwapchainImageReadable) {
810810
swapCreateInfo.imageUsage |= vk::ImageUsageFlagBits::eTransferSrc;
811811
}
812812
if (mDownsampleFSAA) {
813813
swapCreateInfo.imageUsage |= vk::ImageUsageFlagBits::eTransferDst;
814814
}
815815
mSwapChain = mDevice.createSwapchainKHR(swapCreateInfo, nullptr);
816+
if (oldSwapChain) {
817+
mDevice.destroySwapchainKHR(oldSwapChain, nullptr);
818+
}
816819

817820
mSwapChainImages = mDevice.getSwapchainImagesKHR(mSwapChain);
818821
uint32_t oldFramesInFlight = mFramesInFlight, oldImageCount = mImageCount;
@@ -841,10 +844,12 @@ void GPUDisplayBackendVulkan::createSwapChain(bool forScreenshot, bool forMixing
841844
}
842845
}
843846

844-
void GPUDisplayBackendVulkan::clearSwapChain()
847+
void GPUDisplayBackendVulkan::clearSwapChain(bool keepSwapChain)
845848
{
846849
clearVector(mSwapChainImageViews, [&](auto& x) { mDevice.destroyImageView(x, nullptr); });
847-
mDevice.destroySwapchainKHR(mSwapChain, nullptr);
850+
if (!keepSwapChain) {
851+
mDevice.destroySwapchainKHR(mSwapChain, nullptr);
852+
}
848853
}
849854

850855
void GPUDisplayBackendVulkan::recreateRendering(bool forScreenshot, bool forMixing)
@@ -856,8 +861,8 @@ void GPUDisplayBackendVulkan::recreateRendering(bool forScreenshot, bool forMixi
856861
if (needUpdateOffscreenBuffers) {
857862
clearOffscreenBuffers();
858863
if (needUpdateSwapChain) {
859-
clearSwapChain();
860-
createSwapChain(forScreenshot, forMixing);
864+
clearSwapChain(true);
865+
createSwapChain(forScreenshot, forMixing, mSwapChain);
861866
}
862867
createOffscreenBuffers(forScreenshot, forMixing);
863868
}

‎GPU/GPUTracking/display/backend/GPUDisplayBackendVulkan.h‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class GPUDisplayBackendVulkan : public GPUDisplayBackend
9999
void startFillCommandBuffer(vk::CommandBuffer& commandBuffer, uint32_t imageIndex, bool toMixBuffer = false);
100100
void endFillCommandBuffer(vk::CommandBuffer& commandBuffer);
101101
vk::CommandBuffer getSingleTimeCommandBuffer();
102-
void waitTimeline(uint64_t value); // Wait until the timeline semaphore reached value, 0 = nothing to wait for
102+
void waitTimeline(uint64_t value);
103103
template <class... Args>
104104
uint64_t queueSubmit(uint64_t* timelineSignalValue, Args&&... args); // Submit under mQueueMutex; if timelineSignalValue (the entry in pSignalSemaphoreValues) is set, write the next timeline value there first. Returns the current timeline value
105105
void submitSingleTimeCommandBuffer(vk::CommandBuffer commandBuffer);
@@ -114,7 +114,7 @@ class GPUDisplayBackendVulkan : public GPUDisplayBackend
114114
void createCommandBuffers();
115115
void createSemaphores();
116116
void createUniformLayoutsAndBuffers();
117-
void createSwapChain(bool forScreenshot = false, bool forMixing = false);
117+
void createSwapChain(bool forScreenshot = false, bool forMixing = false, vk::SwapchainKHR oldSwapChain = {});
118118
void createOffscreenBuffers(bool forScreenshot = false, bool forMixing = false);
119119
void createPipeline();
120120
void clearDevice();
@@ -124,7 +124,7 @@ class GPUDisplayBackendVulkan : public GPUDisplayBackend
124124
void clearSemaphores();
125125
void clearUniformLayoutsAndBuffers();
126126
void clearOffscreenBuffers();
127-
void clearSwapChain();
127+
void clearSwapChain(bool keepSwapChain = false);
128128
void clearPipeline();
129129
void recreateRendering(bool forScreenshot = false, bool forMixing = false);
130130
void needRecordCommandBuffers();
@@ -175,7 +175,7 @@ class GPUDisplayBackendVulkan : public GPUDisplayBackend
175175
std::vector<vk::CommandBuffer> mCommandBuffersText;
176176
std::vector<vk::CommandBuffer> mCommandBuffersTexture;
177177
std::vector<vk::CommandBuffer> mCommandBuffersMix;
178-
std::vector<vk::CommandBuffer> mCommandBuffersPresent; // Pre-recorded per swapchain image: transition to ePresentSrcKHR, last in every frame
178+
std::vector<vk::CommandBuffer> mCommandBuffersPresent;
179179
std::vector<vk::CommandBufferSubmitInfo> mFrameCommandBuffers; // All command buffers of the current frame, submitted as one batch, ordered by barriers
180180
std::vector<bool> mCommandBufferUpToDate;
181181
std::vector<vk::Semaphore> mImageAvailableSemaphore;

0 commit comments

Comments
 (0)