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"
2025-01-17 15:21:35 +00:00
# include "../desktop/LayerSurface.hpp"
2022-04-05 20:49:15 +02:00
# include "OpenGL.hpp"
2023-11-24 10:54:21 +00:00
# include "Renderbuffer.hpp"
2025-04-16 01:37:48 +01:00
# include "../helpers/time/Timer.hpp"
2024-06-19 16:20:06 +02:00
# include "../helpers/math/Math.hpp"
2025-04-16 01:37:48 +01:00
# include "../helpers/time/Time.hpp"
2022-03-17 20:22:29 +01:00
2022-04-19 19:01:23 +02:00
struct SMonitorRule ;
2024-02-29 13:03:38 +00:00
class CWorkspace ;
2024-03-20 01:44:51 +00:00
class CWindow ;
2024-03-24 15:38:10 -05:00
class CInputPopup ;
2024-07-21 13:09:54 +02:00
class IHLBuffer ;
2024-08-30 17:37:52 +02:00
class CEventLoopTimer ;
2022-04-19 19:01:23 +02:00
2024-12-07 18:51:18 +01:00
enum eDamageTrackingModes : int8_t {
2022-04-14 16:43:29 +02:00
DAMAGE_TRACKING_INVALID = - 1 ,
2022-12-16 17:17:31 +00:00
DAMAGE_TRACKING_NONE = 0 ,
2022-04-14 16:43:29 +02:00
DAMAGE_TRACKING_MONITOR ,
2024-12-07 18:51:18 +01:00
DAMAGE_TRACKING_FULL ,
2022-04-14 16:43:29 +02:00
} ;
2024-12-07 18:51:18 +01:00
enum eRenderPassMode : uint8_t {
2022-07-12 09:49:56 +02:00
RENDER_PASS_ALL = 0 ,
RENDER_PASS_MAIN ,
RENDER_PASS_POPUP
} ;
2024-12-07 18:51:18 +01:00
enum eRenderMode : uint8_t {
2023-11-30 10:14:35 +00:00
RENDER_MODE_NORMAL = 0 ,
RENDER_MODE_FULL_FAKE = 1 ,
RENDER_MODE_TO_BUFFER = 2 ,
RENDER_MODE_TO_BUFFER_READ_ONLY = 3 ,
2023-11-24 10:54:21 +00:00
} ;
2022-12-05 17:05:15 +00:00
class CToplevelExportProtocolManager ;
2023-01-26 10:39:06 +00:00
class CInputManager ;
2023-02-03 11:58:55 +00:00
struct SSessionLockSurface ;
2022-12-05 17:05:15 +00:00
2024-08-06 14:52:19 +01:00
struct SExplicitSyncSettings {
bool explicitEnabled = false , explicitKMSEnabled = false ;
} ;
2022-03-17 20:22:29 +01:00
class CHyprRenderer {
2022-12-16 17:17:31 +00:00
public :
2023-09-28 21:48:33 +01:00
CHyprRenderer ( ) ;
2024-06-13 12:08:02 +02:00
~ CHyprRenderer ( ) ;
2023-09-28 21:48:33 +01:00
2024-10-19 23:03:29 +01:00
void renderMonitor ( PHLMONITOR pMonitor ) ;
2024-10-05 00:52:53 +01:00
void arrangeLayersForMonitor ( const MONITORID & ) ;
void damageSurface ( SP < CWLSurfaceResource > , double , double , double scale = 1.0 ) ;
void damageWindow ( PHLWINDOW , bool forceFull = false ) ;
2025-01-26 15:05:34 +00:00
void damageBox ( const CBox & , bool skipFrameSchedule = false ) ;
2024-10-05 00:52:53 +01:00
void damageBox ( const int & x , const int & y , const int & w , const int & h ) ;
void damageRegion ( const CRegion & ) ;
2024-10-19 23:03:29 +01:00
void damageMonitor ( PHLMONITOR ) ;
void damageMirrorsWith ( PHLMONITOR , const CRegion & ) ;
bool shouldRenderWindow ( PHLWINDOW , PHLMONITOR ) ;
2024-10-05 00:52:53 +01:00
bool shouldRenderWindow ( PHLWINDOW ) ;
void ensureCursorRenderingMode ( ) ;
bool shouldRenderCursor ( ) ;
void setCursorHidden ( bool hide ) ;
2024-10-26 02:06:13 +01:00
void calculateUVForSurface ( PHLWINDOW , SP < CWLSurfaceResource > , PHLMONITOR pMonitor , bool main = false , const Vector2D & projSize = { } , const Vector2D & projSizeUnscaled = { } ,
2024-10-05 00:52:53 +01:00
bool fixMisalignedFSV1 = false ) ;
2024-10-19 23:03:29 +01:00
std : : tuple < float , float , float > getRenderTimes ( PHLMONITOR pMonitor ) ; // avg max min
2025-04-16 01:37:48 +01:00
void renderLockscreen ( PHLMONITOR pMonitor , const Time : : steady_tp & now , const CBox & geometry ) ;
2024-10-19 23:03:29 +01:00
void recheckSolitaryForMonitor ( PHLMONITOR pMonitor ) ;
2024-06-08 10:07:59 +02:00
void setCursorSurface ( SP < CWLSurface > surf , int hotspotX , int hotspotY , bool force = false ) ;
2023-12-20 21:40:44 +01:00
void setCursorFromName ( const std : : string & name , bool force = false ) ;
2023-11-24 10:54:21 +00:00
void onRenderbufferDestroy ( CRenderbuffer * rb ) ;
2024-07-21 13:09:54 +02:00
SP < CRenderbuffer > getCurrentRBO ( ) ;
2023-11-25 17:45:08 +00:00
bool isNvidia ( ) ;
2023-11-30 01:18:55 +00:00
void makeEGLCurrent ( ) ;
void unsetEGL ( ) ;
2025-02-13 12:09:25 +01:00
SExplicitSyncSettings getExplicitSyncSettings ( SP < Aquamarine : : IOutput > output ) ;
2024-08-30 17:37:52 +02:00
void addWindowToRenderUnfocused ( PHLWINDOW window ) ;
2024-12-22 17:12:09 +01:00
void makeWindowSnapshot ( PHLWINDOW ) ;
void makeRawWindowSnapshot ( PHLWINDOW , CFramebuffer * ) ;
void makeLayerSnapshot ( PHLLS ) ;
void renderSnapshot ( PHLWINDOW ) ;
void renderSnapshot ( PHLLS ) ;
2023-11-24 10:54:21 +00:00
2024-02-19 18:17:32 +00:00
// if RENDER_MODE_NORMAL, provided damage will be written to.
// otherwise, it will be the one used.
2024-10-19 23:03:29 +01:00
bool beginRender ( PHLMONITOR pMonitor , CRegion & damage , eRenderMode mode = RENDER_MODE_NORMAL , SP < IHLBuffer > buffer = { } , CFramebuffer * fb = nullptr , bool simple = false ) ;
void endRender ( ) ;
2022-06-26 13:43:32 +02:00
2024-10-19 23:03:29 +01:00
bool m_bBlockSurfaceFeedback = false ;
bool m_bRenderingSnapshot = false ;
2024-12-07 18:51:18 +01:00
PHLMONITORREF m_pMostHzMonitor ;
bool m_bDirectScanoutBlocked = false ;
2022-03-17 20:22:29 +01:00
2024-10-26 02:06:13 +01:00
void setSurfaceScanoutMode ( SP < CWLSurfaceResource > surface , PHLMONITOR monitor ) ; // nullptr monitor resets
2024-07-21 13:09:54 +02:00
void initiateManualCrash ( ) ;
2023-09-28 21:48:33 +01:00
2024-07-21 13:09:54 +02:00
bool m_bCrashingInProgress = false ;
float m_fCrashingDistort = 0.5f ;
wl_event_source * m_pCrashingLoop = nullptr ;
wl_event_source * m_pCursorTicker = nullptr ;
2023-04-04 14:49:58 +01:00
2024-07-21 13:09:54 +02:00
CTimer m_tRenderTimer ;
std : : vector < SP < CWLSurfaceResource > > explicitPresented ;
2023-05-01 02:49:41 +01:00
2023-10-29 18:09:05 +00:00
struct {
2024-12-07 18:51:18 +01:00
int hotspotX = 0 ;
int hotspotY = 0 ;
2024-06-08 10:07:59 +02:00
std : : optional < SP < CWLSurface > > surf ;
std : : string name ;
2023-10-29 18:09:05 +00:00
} m_sLastCursorData ;
2024-12-22 17:12:09 +01:00
CRenderPass m_sRenderPass = { } ;
2022-12-16 17:17:31 +00:00
private :
2025-04-16 01:37:48 +01:00
void arrangeLayerArray ( PHLMONITOR , const std : : vector < PHLLSREF > & , bool , CBox * ) ;
void renderWorkspaceWindowsFullscreen ( PHLMONITOR , PHLWORKSPACE , const Time : : steady_tp & ) ; // renders workspace windows (fullscreen) (tiled, floating, pinned, but no special)
void renderWorkspaceWindows ( PHLMONITOR , PHLWORKSPACE , const Time : : steady_tp & ) ; // renders workspace windows (no fullscreen) (tiled, floating, pinned, but no special)
void renderWindow ( PHLWINDOW , PHLMONITOR , const Time : : steady_tp & , bool , eRenderPassMode , bool ignorePosition = false , bool standalone = false ) ;
2025-04-25 16:38:31 +02:00
void renderLayer ( PHLLS , PHLMONITOR , const Time : : steady_tp & , bool popups = false , bool lockscreen = false ) ;
2025-04-16 01:37:48 +01:00
void renderSessionLockSurface ( WP < SSessionLockSurface > , PHLMONITOR , const Time : : steady_tp & ) ;
void renderDragIcon ( PHLMONITOR , const Time : : steady_tp & ) ;
void renderIMEPopup ( CInputPopup * , PHLMONITOR , const Time : : steady_tp & ) ;
void renderWorkspace ( PHLMONITOR pMonitor , PHLWORKSPACE pWorkspace , const Time : : steady_tp & now , const CBox & geometry ) ;
void sendFrameEventsToWorkspace ( PHLMONITOR pMonitor , PHLWORKSPACE pWorkspace , const Time : : steady_tp & now ) ; // sends frame displayed events but doesn't actually render anything
void renderAllClientsForWorkspace ( PHLMONITOR pMonitor , PHLWORKSPACE pWorkspace , const Time : : steady_tp & now , const Vector2D & translate = { 0 , 0 } , const float & scale = 1.f ) ;
void renderSessionLockMissing ( PHLMONITOR pMonitor ) ;
bool commitPendingAndDoExplicitSync ( PHLMONITOR pMonitor ) ;
bool m_bCursorHidden = false ;
bool m_bCursorHasSurface = false ;
SP < CRenderbuffer > m_pCurrentRenderbuffer = nullptr ;
SP < Aquamarine : : IBuffer > m_pCurrentBuffer = nullptr ;
eRenderMode m_eRenderMode = RENDER_MODE_NORMAL ;
bool m_bNvidia = false ;
2023-11-25 17:45:08 +00:00
2024-03-28 02:04:30 +00:00
struct {
bool hiddenOnTouch = false ;
bool hiddenOnTimeout = false ;
bool hiddenOnKeyboard = false ;
} m_sCursorHiddenConditions ;
2024-07-21 13:09:54 +02:00
SP < CRenderbuffer > getOrCreateRenderbuffer ( SP < Aquamarine : : IBuffer > buffer , uint32_t fmt ) ;
std : : vector < SP < CRenderbuffer > > m_vRenderbuffers ;
2024-08-30 17:37:52 +02:00
std : : vector < PHLWINDOWREF > m_vRenderUnfocused ;
SP < CEventLoopTimer > m_tRenderUnfocusedTimer ;
2022-04-05 20:49:15 +02:00
friend class CHyprOpenGLImpl ;
2024-07-27 10:02:02 -05:00
friend class CToplevelExportFrame ;
2023-01-26 10:39:06 +00:00
friend class CInputManager ;
2024-05-05 22:18:10 +01:00
friend class CPointerManager ;
2024-08-06 14:52:19 +01:00
friend class CMonitor ;
2022-03-17 20:22:29 +01:00
} ;
2025-01-23 21:55:41 +01:00
inline UP < CHyprRenderer > g_pHyprRenderer ;