/* SPDX-FileCopyrightText: 2021 Vlad Zahorodnii SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once #include "core/rendertarget.h" #include "effect/globals.h" #include "utils/filedescriptor.h" #include #include #include namespace KWin { class GraphicsBuffer; class Output; class OverlayWindow; class OutputLayer; class SurfacePixmap; class SurfacePixmapX11; class SurfaceTexture; class PresentationFeedback; class RenderLoop; class DrmDevice; class SyncTimeline; class PresentationFeedback { public: explicit PresentationFeedback() = default; PresentationFeedback(const PresentationFeedback ©) = delete; PresentationFeedback(PresentationFeedback &&move) = default; virtual ~PresentationFeedback() = default; virtual void presented(std::chrono::nanoseconds refreshCycleDuration, std::chrono::nanoseconds timestamp, PresentationMode mode) = 0; }; struct RenderTimeSpan { std::chrono::steady_clock::time_point start = std::chrono::steady_clock::time_point{std::chrono::nanoseconds::zero()}; std::chrono::steady_clock::time_point end = std::chrono::steady_clock::time_point{std::chrono::nanoseconds::zero()}; RenderTimeSpan operator|(const RenderTimeSpan &other) const; }; class KWIN_EXPORT RenderTimeQuery { public: virtual ~RenderTimeQuery() = default; virtual std::optional query() = 0; }; class KWIN_EXPORT CpuRenderTimeQuery : public RenderTimeQuery { public: /** * marks the start of the query */ explicit CpuRenderTimeQuery(); void end(); std::optional query() override; private: const std::chrono::steady_clock::time_point m_start; std::optional m_end; }; class KWIN_EXPORT OutputFrame { public: explicit OutputFrame(RenderLoop *loop, std::chrono::nanoseconds refreshDuration); ~OutputFrame(); void presented(std::chrono::nanoseconds timestamp, PresentationMode mode); void addFeedback(std::unique_ptr &&feedback); void setContentType(ContentType type); std::optional contentType() const; void setPresentationMode(PresentationMode mode); PresentationMode presentationMode() const; void setDamage(const QRegion ®ion); QRegion damage() const; void addRenderTimeQuery(std::unique_ptr &&query); std::chrono::steady_clock::time_point targetPageflipTime() const; std::chrono::nanoseconds refreshDuration() const; std::chrono::nanoseconds predictedRenderTime() const; private: std::optional queryRenderTime() const; const QPointer m_loop; const std::chrono::nanoseconds m_refreshDuration; const std::chrono::steady_clock::time_point m_targetPageflipTime; const std::chrono::nanoseconds m_predictedRenderTime; std::vector> m_feedbacks; std::optional m_contentType; PresentationMode m_presentationMode = PresentationMode::VSync; QRegion m_damage; std::vector> m_renderTimeQueries; bool m_presented = false; }; /** * The RenderBackend class is the base class for all rendering backends. */ class KWIN_EXPORT RenderBackend : public QObject { Q_OBJECT public: virtual CompositingType compositingType() const = 0; virtual OverlayWindow *overlayWindow() const; virtual bool checkGraphicsReset(); virtual OutputLayer *primaryLayer(Output *output) = 0; virtual OutputLayer *cursorLayer(Output *output); virtual bool present(Output *output, const std::shared_ptr &frame) = 0; virtual void repairPresentation(Output *output); virtual DrmDevice *drmDevice() const; virtual bool testImportBuffer(GraphicsBuffer *buffer); virtual QHash> supportedFormats() const; virtual std::unique_ptr createSurfaceTextureX11(SurfacePixmapX11 *pixmap); virtual std::unique_ptr createSurfaceTextureWayland(SurfacePixmap *pixmap); }; } // namespace KWin