From 0e8d347c6a99c2729eb5d32cfc70f4fb2755f940 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Wed, 22 Mar 2023 16:26:16 +0100 Subject: [PATCH] Remove hellovulkanwindow example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The idea being that hellovulkantriangle demonstrates the same things. As a getting started tutorial hellovulkanwindow is the ideal example, but then again QVulkanWindow is not something we want to promote much in Qt 6. Some of the docs are moved to hellovulkantriangle. Pick-to: 6.5 Change-Id: Icbfff70b4a4c7e4c0863a937f3c16038c0b03fbe Reviewed-by: Christian Strømme --- examples/vulkan/CMakeLists.txt | 1 - .../vulkan/doc/images/hellovulkanwindow.png | Bin 2736 -> 0 bytes .../vulkan/doc/src/hellovulkantriangle.qdoc | 43 ++++++++++ .../vulkan/doc/src/hellovulkanwindow.qdoc | 78 ----------------- examples/vulkan/hellovulkantriangle/main.cpp | 7 +- .../vulkan/hellovulkanwindow/CMakeLists.txt | 36 -------- .../hellovulkanwindow/hellovulkanwindow.cpp | 81 ------------------ .../hellovulkanwindow/hellovulkanwindow.h | 35 -------- .../hellovulkanwindow/hellovulkanwindow.pro | 6 -- examples/vulkan/hellovulkanwindow/main.cpp | 33 ------- examples/vulkan/vulkan.pro | 3 +- 11 files changed, 50 insertions(+), 273 deletions(-) delete mode 100644 examples/vulkan/doc/images/hellovulkanwindow.png delete mode 100644 examples/vulkan/doc/src/hellovulkanwindow.qdoc delete mode 100644 examples/vulkan/hellovulkanwindow/CMakeLists.txt delete mode 100644 examples/vulkan/hellovulkanwindow/hellovulkanwindow.cpp delete mode 100644 examples/vulkan/hellovulkanwindow/hellovulkanwindow.h delete mode 100644 examples/vulkan/hellovulkanwindow/hellovulkanwindow.pro delete mode 100644 examples/vulkan/hellovulkanwindow/main.cpp diff --git a/examples/vulkan/CMakeLists.txt b/examples/vulkan/CMakeLists.txt index b6f1dfc9138..96c801c7e78 100644 --- a/examples/vulkan/CMakeLists.txt +++ b/examples/vulkan/CMakeLists.txt @@ -1,7 +1,6 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -qt_internal_add_example(hellovulkanwindow) qt_internal_add_example(hellovulkantriangle) if(TARGET Qt6::Widgets) qt_internal_add_example(hellovulkanwidget) diff --git a/examples/vulkan/doc/images/hellovulkanwindow.png b/examples/vulkan/doc/images/hellovulkanwindow.png deleted file mode 100644 index c55029312ce17d85cd862c43235ac14baaeb80f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2736 zcmeHJYgEz)6#rAUSx!8zm6eh^Yt6Gm<&28N)E=6tQmyGD#sC1c?UO-xxRPH1V1ui>%Mri0;MtM$6h8ul_km-l{W@{C4!W8VXdW3G{GPZP6_^jrSFGD-H=AQz;JVYxWn;?N`Mh($o?Ls~ z=tWGyTf`fwF+dCkV~^j5Ky))7 zQ>lU8Fae(*Ex&@nWLlo&b!LIHLk(eepcTEDY#^;1SmlYE&GD}Y6YbN^bnAB%EE*2= z%0tD~%y)BiQtP;#Da;d$pZCN4#P;_ArbL%m{)-Q8WXVg^HD zdlqhEy_B9-BI{<5HB&A6kQH@0#jyP1Hl2smONWXb)5}}*9pZ-J7IdQ@U(n+e^Ij~4 z;13nF- zZmX?<*>RRtACSM*l6EkN=vabX32U@CjV6?{&!C6)^tRG!%;ZhiK~$Mi+<@^U);2V1 z9!)~&Q~p>QVyz^ArKxl%eabqT<8nL@n21D8CWjaYwF2+UFg7MSj!D zr~!3Z0%!XP;odjq7);p(cq!Pwkh%r!)OuX};f1JS0T+I-f*^Z7MgAzA6SNQ`y6@A= zo1@vHN*zr+Or=^P*+PN9(FInPtRL%1|d`gDc1X=Lpg zbj>a}g|^-AdG!2!=gt%qw?cWiQ*zWM*a?BxYIqE9BsNyLB+h{Q|Em#n2ZF~!m)Wfy z{(ImSgE#~NaZX@)(rr~`G!y?NPp3YW<)U(^)VFdJcx}sCpiyKFJV32E?CS=ckQ)Q; zFvz#e9l-Z^qnl4a;NIut=O%pKgwN;jf6@do-U!eRod0MW`6U-ECA|t;{W1Y}S8o^g I(F;j`0mUMNF8}}l diff --git a/examples/vulkan/doc/src/hellovulkantriangle.qdoc b/examples/vulkan/doc/src/hellovulkantriangle.qdoc index 71d451c63a6..52f4fcd6cf3 100644 --- a/examples/vulkan/doc/src/hellovulkantriangle.qdoc +++ b/examples/vulkan/doc/src/hellovulkantriangle.qdoc @@ -14,6 +14,49 @@ \image hellovulkantriangle.png + \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 hellovulkantriangle/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 hellovulkantriangle/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. + + 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 hellovulkantriangle/main.cpp 2 + + \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(). To get continuous updates, the example simply invokes + QWindow::requestUpdate() in order to schedule a repaint. + The example also demonstrates multisample antialiasing. Based on the supported sample counts reported by QVulkanWindow::supportedSampleCounts() the example chooses between 8x, 4x, or no multisampling. Once configured diff --git a/examples/vulkan/doc/src/hellovulkanwindow.qdoc b/examples/vulkan/doc/src/hellovulkanwindow.qdoc deleted file mode 100644 index 4b944572651..00000000000 --- a/examples/vulkan/doc/src/hellovulkanwindow.qdoc +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only - -/*! - \example hellovulkanwindow - \meta installpath vulkan - \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 -*/ diff --git a/examples/vulkan/hellovulkantriangle/main.cpp b/examples/vulkan/hellovulkantriangle/main.cpp index 35ab28f2356..3bf45e6b3a7 100644 --- a/examples/vulkan/hellovulkantriangle/main.cpp +++ b/examples/vulkan/hellovulkantriangle/main.cpp @@ -8,11 +8,13 @@ Q_LOGGING_CATEGORY(lcVk, "qt.vulkan") +//! [2] class VulkanWindow : public QVulkanWindow { public: QVulkanWindowRenderer *createRenderer() override; }; +//! [2] QVulkanWindowRenderer *VulkanWindow::createRenderer() { @@ -25,17 +27,20 @@ int main(int argc, char *argv[]) QLoggingCategory::setFilterRules(QStringLiteral("qt.vulkan=true")); +//! [0] QVulkanInstance inst; inst.setLayers({ "VK_LAYER_KHRONOS_validation" }); - if (!inst.create()) qFatal("Failed to create Vulkan instance: %d", inst.errorCode()); +//! [0] +//! [1] VulkanWindow w; w.setVulkanInstance(&inst); w.resize(1024, 768); w.show(); +//! [1] return app.exec(); } diff --git a/examples/vulkan/hellovulkanwindow/CMakeLists.txt b/examples/vulkan/hellovulkanwindow/CMakeLists.txt deleted file mode 100644 index 21f54d22eba..00000000000 --- a/examples/vulkan/hellovulkanwindow/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: BSD-3-Clause - -cmake_minimum_required(VERSION 3.16) -project(hellovulkanwindow LANGUAGES CXX) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/vulkan/hellovulkanwindow") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui) - -qt_standard_project_setup() - -qt_add_executable(hellovulkanwindow - hellovulkanwindow.cpp hellovulkanwindow.h - main.cpp -) - -set_target_properties(hellovulkanwindow PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(hellovulkanwindow PRIVATE - Qt6::Core - Qt6::Gui -) - -install(TARGETS hellovulkanwindow - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/vulkan/hellovulkanwindow/hellovulkanwindow.cpp b/examples/vulkan/hellovulkanwindow/hellovulkanwindow.cpp deleted file mode 100644 index fba3a475477..00000000000 --- a/examples/vulkan/hellovulkanwindow/hellovulkanwindow.cpp +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include "hellovulkanwindow.h" -#include - -//! [0] -QVulkanWindowRenderer *VulkanWindow::createRenderer() -{ - return new VulkanRenderer(this); -} - -VulkanRenderer::VulkanRenderer(QVulkanWindow *w) - : m_window(w) -{ -} -//! [0] - -//! [1] -void VulkanRenderer::initResources() -{ - qDebug("initResources"); - - m_devFuncs = m_window->vulkanInstance()->deviceFunctions(m_window->device()); -} -//! [1] - -void VulkanRenderer::initSwapChainResources() -{ - qDebug("initSwapChainResources"); -} - -void VulkanRenderer::releaseSwapChainResources() -{ - qDebug("releaseSwapChainResources"); -} - -void VulkanRenderer::releaseResources() -{ - qDebug("releaseResources"); -} - -//! [2] -void VulkanRenderer::startNextFrame() -{ - m_green += 0.005f; - if (m_green > 1.0f) - m_green = 0.0f; - - VkClearColorValue clearColor = {{ 0.0f, m_green, 0.0f, 1.0f }}; - VkClearDepthStencilValue clearDS = { 1.0f, 0 }; - VkClearValue clearValues[2]; - memset(clearValues, 0, sizeof(clearValues)); - clearValues[0].color = clearColor; - clearValues[1].depthStencil = clearDS; - - VkRenderPassBeginInfo rpBeginInfo; - memset(&rpBeginInfo, 0, sizeof(rpBeginInfo)); - rpBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - rpBeginInfo.renderPass = m_window->defaultRenderPass(); - rpBeginInfo.framebuffer = m_window->currentFramebuffer(); - const QSize sz = m_window->swapChainImageSize(); - rpBeginInfo.renderArea.extent.width = sz.width(); - rpBeginInfo.renderArea.extent.height = sz.height(); - rpBeginInfo.clearValueCount = 2; - rpBeginInfo.pClearValues = clearValues; - VkCommandBuffer cmdBuf = m_window->currentCommandBuffer(); - m_devFuncs->vkCmdBeginRenderPass(cmdBuf, &rpBeginInfo, VK_SUBPASS_CONTENTS_INLINE); - - // Do nothing else. We will just clear to green, changing the component on - // every invocation. This also helps verifying the rate to which the thread - // is throttled to. (The elapsed time between startNextFrame calls should - // typically be around 16 ms. Note that rendering is 2 frames ahead of what - // is displayed.) - - m_devFuncs->vkCmdEndRenderPass(cmdBuf); - - m_window->frameReady(); - m_window->requestUpdate(); // render continuously, throttled by the presentation rate -} -//! [2] diff --git a/examples/vulkan/hellovulkanwindow/hellovulkanwindow.h b/examples/vulkan/hellovulkanwindow/hellovulkanwindow.h deleted file mode 100644 index ee203fb6156..00000000000 --- a/examples/vulkan/hellovulkanwindow/hellovulkanwindow.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#ifndef HELLOVULKANWINDOW_H -#define HELLOVULKANWINDOW_H - -#include - -//! [0] -class VulkanRenderer : public QVulkanWindowRenderer -{ -public: - VulkanRenderer(QVulkanWindow *w); - - void initResources() override; - void initSwapChainResources() override; - void releaseSwapChainResources() override; - void releaseResources() override; - - void startNextFrame() override; - -private: - QVulkanWindow *m_window; - QVulkanDeviceFunctions *m_devFuncs; - float m_green = 0; -}; - -class VulkanWindow : public QVulkanWindow -{ -public: - QVulkanWindowRenderer *createRenderer() override; -}; -//! [0] - -#endif // HELLOVULKANWINDOW_H diff --git a/examples/vulkan/hellovulkanwindow/hellovulkanwindow.pro b/examples/vulkan/hellovulkanwindow/hellovulkanwindow.pro deleted file mode 100644 index 8f7d9494e2f..00000000000 --- a/examples/vulkan/hellovulkanwindow/hellovulkanwindow.pro +++ /dev/null @@ -1,6 +0,0 @@ -HEADERS += hellovulkanwindow.h -SOURCES += hellovulkanwindow.cpp main.cpp - -# install -target.path = $$[QT_INSTALL_EXAMPLES]/vulkan/hellovulkanwindow -INSTALLS += target diff --git a/examples/vulkan/hellovulkanwindow/main.cpp b/examples/vulkan/hellovulkanwindow/main.cpp deleted file mode 100644 index 46393b1cdbd..00000000000 --- a/examples/vulkan/hellovulkanwindow/main.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2017 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause - -#include -#include -#include -#include "hellovulkanwindow.h" - -Q_LOGGING_CATEGORY(lcVk, "qt.vulkan") - -int main(int argc, char *argv[]) -{ - QGuiApplication app(argc, argv); - - QLoggingCategory::setFilterRules(QStringLiteral("qt.vulkan=true")); - -//! [0] - QVulkanInstance inst; - inst.setLayers({ "VK_LAYER_KHRONOS_validation" }); - if (!inst.create()) - qFatal("Failed to create Vulkan instance: %d", inst.errorCode()); -//! [0] - -//! [1] - VulkanWindow w; - w.setVulkanInstance(&inst); - - w.resize(1024, 768); - w.show(); -//! [1] - - return app.exec(); -} diff --git a/examples/vulkan/vulkan.pro b/examples/vulkan/vulkan.pro index b810cb96fca..4fe4dfda786 100644 --- a/examples/vulkan/vulkan.pro +++ b/examples/vulkan/vulkan.pro @@ -1,7 +1,6 @@ TEMPLATE = subdirs -SUBDIRS = hellovulkanwindow \ - hellovulkantriangle +SUBDIRS = hellovulkantriangle qtHaveModule(widgets) { SUBDIRS += hellovulkanwidget