// Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include #include #include namespace src_gui_vulkan_qvulkanwindow { VkCommandBuffer commandBuffer; const VkRenderPassBeginInfo *renderPassBegin = nullptr; VkSubpassContents contents; //! [0] class VulkanRenderer : public QVulkanWindowRenderer { public: VulkanRenderer(QVulkanWindow *w) : m_window(w), m_devFuncs(nullptr) { } void initResources() override { m_devFuncs = m_window->vulkanInstance()->deviceFunctions(m_window->device()); // .. } void initSwapChainResources() override { /* ... */ } void releaseSwapChainResources() override { /* ... */ } void releaseResources() override { /* ... */ } void startNextFrame() override { VkCommandBuffer cmdBuf = m_window->currentCommandBuffer(); // ... m_devFuncs->vkCmdBeginRenderPass(commandBuffer, renderPassBegin, contents); // ... m_window->frameReady(); } private: QVulkanWindow *m_window; QVulkanDeviceFunctions *m_devFuncs; }; class VulkanWindow : public QVulkanWindow { public: QVulkanWindowRenderer *createRenderer() override { return new VulkanRenderer(this); } }; int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QVulkanInstance inst; // enable the standard validation layers, when available inst.setLayers({ "VK_LAYER_KHRONOS_validation" }); if (!inst.create()) qFatal("Failed to create Vulkan instance: %d", inst.errorCode()); VulkanWindow w; w.setVulkanInstance(&inst); w.showMaximized(); return app.exec(); } //! [0] //! [1] class Renderer { void startNextFrame(); // ... VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT]; QVulkanWindow *m_window = nullptr; }; void Renderer::startNextFrame() { VkDescriptorBufferInfo &uniformBufInfo(m_uniformBufInfo[m_window->currentFrame()]); // ... } //! [1] } // src_gui_vulkan_qvulkanwindow namespace src_gui_vulkan_qvulkanwindow2 { //! [2] class Renderer { void startNextFrame(); // ... VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT]; QVulkanWindow *m_window = nullptr; }; void Renderer::startNextFrame() { const int count = m_window->concurrentFrameCount(); // for (int i = 0; i < count; ++i) // m_uniformBufInfo[i] = ... // ... } //! [2] } // src_gui_vulkan_qvulkanwindow2