Hyprland/src/render/Renderer.hpp

140 lines
6.8 KiB
C++
Raw Normal View History

2022-03-17 20:22:29 +01:00
#pragma once
#include "../defines.hpp"
2022-03-19 14:37:40 +01:00
#include <list>
#include "../helpers/Monitor.hpp"
2022-04-05 20:49:15 +02:00
#include "OpenGL.hpp"
#include "Renderbuffer.hpp"
2023-05-01 03:49:41 +02:00
#include "../helpers/Timer.hpp"
2023-07-19 20:09:49 +02:00
#include "../helpers/Region.hpp"
2022-03-17 20:22:29 +01:00
2022-04-19 19:01:23 +02:00
struct SMonitorRule;
class CWorkspace;
2024-03-20 02:44:51 +01:00
class CWindow;
class CInputPopup;
2022-04-19 19:01:23 +02:00
2022-04-14 16:43:29 +02:00
// TODO: add fuller damage tracking for updating only parts of a window
enum DAMAGETRACKINGMODES {
2022-04-14 16:43:29 +02:00
DAMAGE_TRACKING_INVALID = -1,
DAMAGE_TRACKING_NONE = 0,
2022-04-14 16:43:29 +02:00
DAMAGE_TRACKING_MONITOR,
DAMAGE_TRACKING_FULL
};
enum eRenderPassMode {
RENDER_PASS_ALL = 0,
RENDER_PASS_MAIN,
RENDER_PASS_POPUP
};
enum eRenderMode {
RENDER_MODE_NORMAL = 0,
RENDER_MODE_FULL_FAKE = 1,
RENDER_MODE_TO_BUFFER = 2,
RENDER_MODE_TO_BUFFER_READ_ONLY = 3,
};
class CToplevelExportProtocolManager;
2023-01-26 11:39:06 +01:00
class CInputManager;
2023-02-03 12:58:55 +01:00
struct SSessionLockSurface;
2022-03-17 20:22:29 +01:00
class CHyprRenderer {
public:
CHyprRenderer();
void renderMonitor(CMonitor* pMonitor);
void outputMgrApplyTest(wlr_output_configuration_v1*, bool);
void arrangeLayersForMonitor(const int&);
2023-06-11 21:52:13 +02:00
void damageSurface(wlr_surface*, double, double, double scale = 1.0);
void damageWindow(CWindow*);
void damageBox(CBox*);
void damageBox(const int& x, const int& y, const int& w, const int& h);
2023-07-19 20:09:49 +02:00
void damageRegion(const CRegion&);
void damageMonitor(CMonitor*);
2023-07-19 20:09:49 +02:00
void damageMirrorsWith(CMonitor*, const CRegion&);
bool applyMonitorRule(CMonitor*, SMonitorRule*, bool force = false);
bool shouldRenderWindow(CWindow*, CMonitor*, CWorkspace*);
bool shouldRenderWindow(CWindow*);
void ensureCursorRenderingMode();
bool shouldRenderCursor();
void setCursorHidden(bool hide);
void calculateUVForSurface(CWindow*, wlr_surface*, bool main = false, const Vector2D& projSize = {}, bool fixMisalignedFSV1 = false);
std::tuple<float, float, float> getRenderTimes(CMonitor* pMonitor); // avg max min
void renderLockscreen(CMonitor* pMonitor, timespec* now, const CBox& geometry);
2023-07-19 20:09:49 +02:00
void setOccludedForBackLayers(CRegion& region, CWorkspace* pWorkspace);
void setOccludedForMainWorkspace(CRegion& region, CWorkspace* pWorkspace); // TODO: merge occlusion methods
2023-07-20 14:11:05 +02:00
bool canSkipBackBufferClear(CMonitor* pMonitor);
void recheckSolitaryForMonitor(CMonitor* pMonitor);
void setCursorSurface(wlr_surface* surf, int hotspotX, int hotspotY, bool force = false);
void setCursorFromName(const std::string& name, bool force = false);
void renderSoftwareCursors(CMonitor* pMonitor, const CRegion& damage, std::optional<Vector2D> overridePos = {});
void onRenderbufferDestroy(CRenderbuffer* rb);
CRenderbuffer* getCurrentRBO();
bool isNvidia();
2023-11-30 02:18:55 +01:00
void makeEGLCurrent();
void unsetEGL();
2024-02-19 19:17:32 +01:00
// if RENDER_MODE_NORMAL, provided damage will be written to.
// otherwise, it will be the one used.
2023-11-30 02:18:55 +01:00
bool beginRender(CMonitor* pMonitor, CRegion& damage, eRenderMode mode = RENDER_MODE_NORMAL, wlr_buffer* buffer = nullptr, CFramebuffer* fb = nullptr);
void endRender();
2022-06-26 13:43:32 +02:00
bool m_bBlockSurfaceFeedback = false;
bool m_bRenderingSnapshot = false;
CWindow* m_pLastScanout = nullptr;
CMonitor* m_pMostHzMonitor = nullptr;
bool m_bDirectScanoutBlocked = false;
bool m_bSoftwareCursorsLocked = false;
2022-04-14 16:43:29 +02:00
2023-04-16 15:48:38 +02:00
DAMAGETRACKINGMODES
damageTrackingModeFromStr(const std::string&);
2022-03-17 20:22:29 +01:00
bool attemptDirectScanout(CMonitor*);
void setWindowScanoutMode(CWindow*);
void initiateManualCrash();
bool m_bCrashingInProgress = false;
float m_fCrashingDistort = 0.5f;
wl_event_source* m_pCrashingLoop = nullptr;
2023-04-04 15:49:58 +02:00
std::vector<std::unique_ptr<STearingController>> m_vTearingControllers;
2022-11-05 13:50:47 +01:00
CTimer m_tRenderTimer;
2023-05-01 03:49:41 +02:00
struct {
int hotspotX;
int hotspotY;
std::optional<wlr_surface*> surf = nullptr;
std::string name;
} m_sLastCursorData;
private:
void arrangeLayerArray(CMonitor*, const std::vector<std::unique_ptr<SLayerSurface>>&, bool, CBox*);
void renderWorkspaceWindowsFullscreen(CMonitor*, CWorkspace*, timespec*); // renders workspace windows (fullscreen) (tiled, floating, pinned, but no special)
void renderWorkspaceWindows(CMonitor*, CWorkspace*, timespec*); // renders workspace windows (no fullscreen) (tiled, floating, pinned, but no special)
void renderWindow(CWindow*, CMonitor*, timespec*, bool, eRenderPassMode, bool ignorePosition = false, bool ignoreAllGeometry = false);
void renderLayer(SLayerSurface*, CMonitor*, timespec*, bool popups = false);
void renderSessionLockSurface(SSessionLockSurface*, CMonitor*, timespec*);
void renderDragIcon(CMonitor*, timespec*);
2024-03-24 17:08:25 +01:00
void renderIMEPopup(CInputPopup*, CMonitor*, timespec*);
void renderWorkspace(CMonitor* pMonitor, CWorkspace* pWorkspace, timespec* now, const CBox& geometry);
void renderAllClientsForWorkspace(CMonitor* pMonitor, CWorkspace* pWorkspace, timespec* now, const Vector2D& translate = {0, 0}, const float& scale = 1.f);
bool m_bCursorHidden = false;
bool m_bCursorHasSurface = false;
CRenderbuffer* m_pCurrentRenderbuffer = nullptr;
wlr_buffer* m_pCurrentWlrBuffer = nullptr;
eRenderMode m_eRenderMode = RENDER_MODE_NORMAL;
bool m_bNvidia = false;
CRenderbuffer* getOrCreateRenderbuffer(wlr_buffer* buffer, uint32_t fmt);
std::vector<std::unique_ptr<CRenderbuffer>> m_vRenderbuffers;
2022-04-05 20:49:15 +02:00
friend class CHyprOpenGLImpl;
friend class CToplevelExportProtocolManager;
2023-01-26 11:39:06 +01:00
friend class CInputManager;
2022-03-17 20:22:29 +01:00
};
inline std::unique_ptr<CHyprRenderer> g_pHyprRenderer;