File indexing completed on 2024-05-12 05:32:08

0001 /*
0002     SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include "core/graphicsbuffer.h"
0010 #include "core/output.h"
0011 #include "scene/item.h"
0012 
0013 #include <deque>
0014 
0015 namespace KWin
0016 {
0017 
0018 class SurfacePixmap;
0019 class Window;
0020 
0021 /**
0022  * The SurfaceItem class represents a surface with some contents.
0023  */
0024 class KWIN_EXPORT SurfaceItem : public Item
0025 {
0026     Q_OBJECT
0027 
0028 public:
0029     QSizeF destinationSize() const;
0030     void setDestinationSize(const QSizeF &size);
0031 
0032     QRectF bufferSourceBox() const;
0033     void setBufferSourceBox(const QRectF &box);
0034 
0035     OutputTransform bufferTransform() const;
0036     void setBufferTransform(OutputTransform transform);
0037 
0038     QSize bufferSize() const;
0039     void setBufferSize(const QSize &size);
0040 
0041     QRegion mapFromBuffer(const QRegion &region) const;
0042 
0043     void addDamage(const QRegion &region);
0044     void resetDamage();
0045     QRegion damage() const;
0046 
0047     void discardPixmap();
0048     void updatePixmap();
0049     void destroyPixmap();
0050 
0051     SurfacePixmap *pixmap() const;
0052     SurfacePixmap *previousPixmap() const;
0053 
0054     void referencePreviousPixmap();
0055     void unreferencePreviousPixmap();
0056 
0057     virtual ContentType contentType() const;
0058 
0059     virtual void freeze();
0060 
0061     std::chrono::nanoseconds frameTimeEstimation() const;
0062 
0063 Q_SIGNALS:
0064     void damaged();
0065 
0066 protected:
0067     explicit SurfaceItem(Scene *scene, Item *parent = nullptr);
0068 
0069     virtual std::unique_ptr<SurfacePixmap> createPixmap() = 0;
0070     void preprocess() override;
0071     WindowQuadList buildQuads() const override;
0072 
0073     QRegion m_damage;
0074     OutputTransform m_bufferToSurfaceTransform;
0075     OutputTransform m_surfaceToBufferTransform;
0076     QRectF m_bufferSourceBox;
0077     QSize m_bufferSize;
0078     QSizeF m_destinationSize;
0079     std::unique_ptr<SurfacePixmap> m_pixmap;
0080     std::unique_ptr<SurfacePixmap> m_previousPixmap;
0081     int m_referencePixmapCounter = 0;
0082     std::deque<std::chrono::nanoseconds> m_lastDamageTimeDiffs;
0083     std::optional<std::chrono::steady_clock::time_point> m_lastDamage;
0084     std::chrono::nanoseconds m_frameTimeEstimation = std::chrono::days(1000);
0085 };
0086 
0087 class KWIN_EXPORT SurfaceTexture
0088 {
0089 public:
0090     virtual ~SurfaceTexture();
0091 
0092     virtual bool isValid() const = 0;
0093 };
0094 
0095 class KWIN_EXPORT SurfacePixmap : public QObject
0096 {
0097     Q_OBJECT
0098 
0099 public:
0100     explicit SurfacePixmap(std::unique_ptr<SurfaceTexture> &&texture, QObject *parent = nullptr);
0101 
0102     GraphicsBuffer *buffer() const;
0103     void setBuffer(GraphicsBuffer *buffer);
0104 
0105     GraphicsBufferOrigin bufferOrigin() const;
0106     void setBufferOrigin(GraphicsBufferOrigin origin);
0107 
0108     SurfaceTexture *texture() const;
0109 
0110     bool hasAlphaChannel() const;
0111     QSize size() const;
0112 
0113     bool isDiscarded() const;
0114     void markAsDiscarded();
0115 
0116     virtual void create() = 0;
0117     virtual void update();
0118 
0119     virtual bool isValid() const = 0;
0120 
0121 protected:
0122     GraphicsBufferRef m_bufferRef;
0123     GraphicsBufferOrigin m_bufferOrigin = GraphicsBufferOrigin::TopLeft;
0124     QSize m_size;
0125     bool m_hasAlphaChannel = false;
0126 
0127 private:
0128     std::unique_ptr<SurfaceTexture> m_texture;
0129     bool m_isDiscarded = false;
0130 };
0131 
0132 } // namespace KWin