// Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifndef WINDOW_H #define WINDOW_H #include #include #include class RhiWindow : public QWindow { public: RhiWindow(QRhi::Implementation graphicsApi); QString graphicsApiName() const; void releaseSwapChain(); protected: virtual void customInit() = 0; virtual void customRender() = 0; // destruction order matters to a certain degree: the fallbackSurface must // outlive the rhi, the rhi must outlive all other resources. The resources // need no special order when destroying. #if QT_CONFIG(opengl) std::unique_ptr m_fallbackSurface; #endif std::unique_ptr m_rhi; //! [swapchain-data] std::unique_ptr m_sc; std::unique_ptr m_ds; std::unique_ptr m_rp; //! [swapchain-data] bool m_hasSwapChain = false; QMatrix4x4 m_viewProjection; private: void init(); void resizeSwapChain(); void render(); void exposeEvent(QExposeEvent *) override; bool event(QEvent *) override; QRhi::Implementation m_graphicsApi; bool m_initialized = false; bool m_notExposed = false; bool m_newlyExposed = false; }; class HelloWindow : public RhiWindow { public: HelloWindow(QRhi::Implementation graphicsApi); void customInit() override; void customRender() override; private: void ensureFullscreenTexture(const QSize &pixelSize, QRhiResourceUpdateBatch *u); std::unique_ptr m_vbuf; std::unique_ptr m_ubuf; std::unique_ptr m_texture; std::unique_ptr m_sampler; std::unique_ptr m_colorTriSrb; std::unique_ptr m_colorPipeline; std::unique_ptr m_fullscreenQuadSrb; std::unique_ptr m_fullscreenQuadPipeline; QRhiResourceUpdateBatch *m_initialUpdates = nullptr; float m_rotation = 0; float m_opacity = 1; int m_opacityDir = -1; }; #endif