| /**************************************************************************** |
| ** |
| ** Copyright (C) 2017 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the documentation of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:FDL$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU Free Documentation License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Free |
| ** Documentation License version 1.3 as published by the Free Software |
| ** Foundation and appearing in the file included in the packaging of |
| ** this file. Please review the following information to ensure |
| ** the GNU Free Documentation License version 1.3 requirements |
| ** will be met: https://www.gnu.org/licenses/fdl-1.3.html. |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| /*! |
| \example hellovulkanwindow |
| \title Hello Vulkan Window Example |
| \ingroup examples-vulkan |
| \brief Shows the basics of using QVulkanWindow. |
| |
| The \e{Hello Vulkan Window Example} shows the basics of using QVulkanWindow |
| in order to display rendering with the Vulkan graphics API on systems that |
| support this. |
| |
| \image hellovulkanwindow.png |
| |
| In this example there will be no actual rendering: it simply begins and |
| ends a render pass, which results in clearing the buffers to a fixed value. |
| The color buffer clear value changes on every frame. |
| |
| \section1 Startup |
| |
| Each Qt application using Vulkan will have to have a \c{Vulkan instance} |
| which encapsulates application-level state and initializes a Vulkan library. |
| |
| A QVulkanWindow must always be associated with a QVulkanInstance and hence |
| the example performs instance creation before the window. The |
| QVulkanInstance object must also outlive the window. |
| |
| \snippet hellovulkanwindow/main.cpp 0 |
| |
| The example enables validation layers, when supported. When the requested |
| layers are not present, the request will be ignored. Additional layers and |
| extensions can be enabled in a similar manner. |
| |
| \snippet hellovulkanwindow/main.cpp 1 |
| |
| Once the instance is ready, it is time to create a window. Note that \c w |
| lives on the stack and is declared after \c inst. |
| |
| \section1 The QVulkanWindow Subclass |
| |
| To add custom functionality to a QVulkanWindow, subclassing is used. This |
| follows the existing patterns from QOpenGLWindow and QOpenGLWidget. |
| However, QVulkanWindow utilizes a separate QVulkanWindowRenderer object. |
| This resembles QQuickFramebufferObject, and allows better separation of the |
| functions that are supposed to be reimplemented. |
| |
| \snippet hellovulkanwindow/hellovulkanwindow.h 0 |
| |
| The QVulkanWindow subclass reimplements the factory function |
| QVulkanWindow::createRenderer(). This simply returns a new instance of the |
| QVulkanWindowRenderer subclass. In order to be able to access various |
| Vulkan resources via the window object, a pointer to the window is passed |
| and stored via the constructor. |
| |
| \snippet hellovulkanwindow/hellovulkanwindow.cpp 0 |
| |
| Graphics resource creation and destruction is typically done in one of the |
| init - resource functions. |
| |
| \snippet hellovulkanwindow/hellovulkanwindow.cpp 1 |
| |
| \section1 The Actual Rendering |
| |
| QVulkanWindow subclasses queue their draw calls in their reimplementation |
| of QVulkanWindowRenderer::startNextFrame(). Once done, they are required to |
| call back QVulkanWindow::frameReady(). The example has no asynchronous |
| command generation, so the frameReady() call is made directly from |
| startNextFrame(). |
| |
| \snippet hellovulkanwindow/hellovulkanwindow.cpp 2 |
| |
| To get continuous updates, the example simply invokes |
| QWindow::requestUpdate() in order to schedule a repaint. |
| |
| \include examples-run.qdocinc |
| */ |