39 auto phyDc =
m_ctx->getPhysicalDevice();
40 auto dc =
m_ctx->getDevice();
41 auto graphicsQueueFamily =
m_ctx->getGraphicsQueueFamily();
45 auto queueFamilyCount = phyDc.getQueueFamilyProperties().size();
46 for (uint32_t i = 0; i < queueFamilyCount; i++) {
47 if (phyDc.getSurfaceSupportKHR(i,
m_surface)) {
62 const vk::SurfaceFormatKHR& format,
63 vk::PresentModeKHR presentMode,
64 const vk::Extent2D& extent,
66 const vk::SurfaceCapabilitiesKHR& capabilities,
67 uint32_t graphicsQueueFamily) {
69 vk::SwapchainCreateInfoKHR createInfo{};
71 .setMinImageCount(imageCount)
72 .setImageFormat(format.format)
73 .setImageColorSpace(format.colorSpace)
74 .setImageExtent(extent)
75 .setCompositeAlpha(vk::CompositeAlphaFlagBitsKHR::eOpaque)
76 .setPreTransform(capabilities.currentTransform)
77 .setPresentMode(presentMode)
78 .setImageUsage(vk::ImageUsageFlagBits::eColorAttachment)
79 .setImageArrayLayers(1)
84 createInfo.setImageSharingMode(vk::SharingMode::eConcurrent)
85 .setQueueFamilyIndexCount(2)
86 .setPQueueFamilyIndices(queueFamilyIndices);
88 createInfo.setImageSharingMode(vk::SharingMode::eExclusive);
94 auto phyDc =
m_ctx->getPhysicalDevice();
95 auto dc =
m_ctx->getDevice();
96 auto graphicsQueueFamily =
m_ctx->getGraphicsQueueFamily();
98 auto capabilities = phyDc.getSurfaceCapabilitiesKHR(
m_surface);
99 auto formats = phyDc.getSurfaceFormatsKHR(
m_surface);
100 auto presentModes = phyDc.getSurfacePresentModesKHR(
m_surface);
107 std::clamp(
m_dstWidth, capabilities.minImageExtent.width, capabilities.maxImageExtent.width),
108 std::clamp(
m_dstHeight, capabilities.minImageExtent.height, capabilities.maxImageExtent.height)
115 auto imageCount = std::clamp(3u, capabilities.minImageCount, capabilities.maxImageCount);
117 format, presentMode, extent, imageCount, capabilities, graphicsQueueFamily
122 createInfo.setOldSwapchain(oldSwapchain);
129 dc.destroySwapchainKHR(oldSwapchain);
187 const std::vector<vk::SurfaceFormatKHR> &availableFormats) {
188 for (
const auto &availableFormat : availableFormats) {
189 if (availableFormat.format == vk::Format::eB8G8R8A8Unorm &&
190 availableFormat.colorSpace == vk::ColorSpaceKHR::eSrgbNonlinear) {
191 return availableFormat;
194 return availableFormats[0];
198 const std::vector<vk::PresentModeKHR> &availablePresentModes) {
199 for (
const auto &availablePresentMode : availablePresentModes) {
200 if (availablePresentMode == vk::PresentModeKHR::eImmediate) {
201 return availablePresentMode;
204 return vk::PresentModeKHR::eFifo;
219 auto dc =
m_ctx->getDevice();
234 using namespace std::chrono;
235 auto now = high_resolution_clock::now();
236 auto timeSinceRequest = duration_cast<milliseconds>(
241 now = high_resolution_clock::now();
242 timeSinceRequest = duration_cast<milliseconds>(
245 std::this_thread::sleep_for(std::chrono::milliseconds(5));
249 now = high_resolution_clock::now();
250 timeSinceRequest = duration_cast<milliseconds>(
269 auto dc =
m_ctx->getDevice();
271 std::vector<vk::Semaphore> semaphores;
274 semaphores.push_back(
static_cast<VK_Semaphore*
>(semaphore)->semaphore());
276 vk::PresentInfoKHR presentInfo{};
277 presentInfo.setWaitSemaphores(semaphores)
278 .setSwapchainCount(1)
284 if (result == vk::Result::eSuboptimalKHR) {
293 }
catch (vk::OutOfDateKHRError& e) {
301 }
catch (vk::SystemError& e)
303 ferr <<
"fetal error in VK_Swapchain::present()" << e.what() << std::endl;
313 auto nextResult = dc.acquireNextImageKHR(
321 if (nextResult == vk::Result::eSuboptimalKHR) {
325 }
catch (vk::OutOfDateKHRError& e) {
328 }
catch (vk::SystemError& e) {
329 ferr <<
"fetal error in VK_Swapchain::present() - acquireNextImage" << e.what() << std::endl;
341 auto dc =
m_ctx->getDevice();
348 auto nextResult = dc.acquireNextImageKHR(
355 if (nextResult == vk::Result::eSuboptimalKHR) {
362 auto nextResult = dc.acquireNextImageKHR(
371 if (nextResult == vk::Result::eSuboptimalKHR) {
375 }
catch (vk::OutOfDateKHRError& e)
400 auto dc =
m_ctx->getDevice();
void trigger(const Event &event)
uint32_t m_width
创建交换链后得到的实际大小
void * m_nativeHandle
交换链对应的surface
uint32_t m_height
创建交换链后得到的实际大小
bool m_hasRecreatedInThisFrame
std::vector< RHI::Semaphore * > m_renderFinshSemaphores
std::vector< RHI::Fence * > m_renderFinshFences
ImageRenderTarget * m_target
void setupQueueFamilies()
vk::PresentModeKHR chooseSwapPresentMode(const std::vector< vk::PresentModeKHR > &availablePresentModes)
Samples getSampleCount() const override
RHI::VK_Semaphore * m_prensentFinshSemphore
void cleanupOldResources()
void setPresentFinshSemaphore(RHI::Semaphore *semaphore) override
FCT::Image * image() const override
vk::Extent2D getExtent() const
void createImagesAndTargets()
Samples getSamples() const override
vk::SurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector< vk::SurfaceFormatKHR > &availableFormats)
static constexpr uint32_t RECREATE_DEBOUNCE_MS
uint32_t m_pendingWidth
窗口resize的时候传递的大小
void present() override
提交present命令
std::vector< RHI::Image * > m_fctImages
uint32_t getCurrentImageIndex() const
VK_Swapchain(VK_Context *ctx)
vk::SwapchainKHR m_swapchain
MutilBufferImage * m_depthStencilImage
std::chrono::high_resolution_clock::time_point m_lastRecreateRequestTime
std::vector< vk::Queue > m_presentQueues
uint32_t m_currentImageIndex
void needRecreate(int width, int height) override
用于窗口通知需要 recreate
bool processRecreate(bool waitFence=false)
void createSwapchain(uint32_t width, uint32_t height)
std::vector< vk::Image > m_images
ImageRenderTarget * target() const override
获取交换链对应的target
uint32_t m_presentQueueFamilyIndex
RHI::Semaphore * getImageAvailableSemaphore() override
用于渲染命令同步的,获取到 图像,gpu可以执行渲染命令
void enableDepthBuffer(Format format) override
启用深度模板 缓存
Format getFormat() const override
vk::SwapchainCreateInfoKHR buildSwapchainCreateInfo(const vk::SurfaceFormatKHR &format, vk::PresentModeKHR presentMode, const vk::Extent2D &extent, uint32_t imageCount, const vk::SurfaceCapabilitiesKHR &capabilities, uint32_t graphicsQueueFamily)
MutilBufferImage * m_fctImage
Format FromVkFormat(vk::Format format)