/****************************************************************************
**
** 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
*/
