summaryrefslogtreecommitdiff
path: root/src/render/Renderer.hpp
blob: 9f2456f8856cf630824ee82e744aa203447f32e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#pragma once

#include "../defines.hpp"
#include <list>
#include "../helpers/Monitor.hpp"
#include "../helpers/Workspace.hpp"
#include "../Window.hpp"
#include "OpenGL.hpp"

struct SMonitorRule;

// TODO: add fuller damage tracking for updating only parts of a window
enum DAMAGETRACKINGMODES
{
    DAMAGE_TRACKING_INVALID = -1,
    DAMAGE_TRACKING_NONE    = 0,
    DAMAGE_TRACKING_MONITOR,
    DAMAGE_TRACKING_FULL
};

enum eRenderPassMode
{
    RENDER_PASS_ALL = 0,
    RENDER_PASS_MAIN,
    RENDER_PASS_POPUP
};

class CToplevelExportProtocolManager;
class CInputManager;
struct SSessionLockSurface;

class CHyprRenderer {
  public:
    void                renderAllClientsForMonitor(const int&, timespec*);
    void                outputMgrApplyTest(wlr_output_configuration_v1*, bool);
    void                arrangeLayersForMonitor(const int&);
    void                damageSurface(wlr_surface*, double, double);
    void                damageWindow(CWindow*);
    void                damageBox(wlr_box*);
    void                damageBox(const int& x, const int& y, const int& w, const int& h);
    void                damageRegion(pixman_region32_t*);
    void                damageMonitor(CMonitor*);
    void                damageMirrorsWith(CMonitor*, pixman_region32_t*);
    bool                applyMonitorRule(CMonitor*, SMonitorRule*, bool force = false);
    bool                shouldRenderWindow(CWindow*, CMonitor*);
    bool                shouldRenderWindow(CWindow*);
    void                ensureCursorRenderingMode();
    bool                shouldRenderCursor();
    void                calculateUVForSurface(CWindow*, wlr_surface*, bool main = false);

    bool                m_bWindowRequestedCursorHide = false;
    bool                m_bBlockSurfaceFeedback      = false;
    bool                m_bRenderingSnapshot         = false;
    CWindow*            m_pLastScanout               = nullptr;
    CMonitor*           m_pMostHzMonitor             = nullptr;

    DAMAGETRACKINGMODES damageTrackingModeFromStr(const std::string&);

    bool                attemptDirectScanout(CMonitor*);
    void                setWindowScanoutMode(CWindow*);

  private:
    void arrangeLayerArray(CMonitor*, const std::vector<std::unique_ptr<SLayerSurface>>&, bool, wlr_box*);
    void renderWorkspaceWithFullscreenWindow(CMonitor*, CWorkspace*, timespec*);
    void renderWindow(CWindow*, CMonitor*, timespec*, bool, eRenderPassMode, bool ignorePosition = false, bool ignoreAllGeometry = false);
    void renderLayer(SLayerSurface*, CMonitor*, timespec*);
    void renderSessionLockSurface(SSessionLockSurface*, CMonitor*, timespec*);
    void renderDragIcon(CMonitor*, timespec*);
    void renderIMEPopup(SIMEPopup*, CMonitor*, timespec*);

    bool m_bHasARenderedCursor = true;

    friend class CHyprOpenGLImpl;
    friend class CToplevelExportProtocolManager;
    friend class CInputManager;
};

inline std::unique_ptr<CHyprRenderer> g_pHyprRenderer;