10
10
#include " ../helpers/MiscFunctions.hpp"
11
11
#include " ../config/ConfigValue.hpp"
12
12
#include " ../config/ConfigManager.hpp"
13
+ #include " ../managers/PointerManager.hpp"
13
14
#include " ../desktop/LayerSurface.hpp"
14
15
#include " ../protocols/LayerShell.hpp"
15
16
#include " ../protocols/core/Compositor.hpp"
@@ -1224,9 +1225,10 @@ void CHyprOpenGLImpl::applyScreenShader(const std::string& path) {
1224
1225
return ;
1225
1226
}
1226
1227
1227
- m_finalScreenShader.uniformLocations [SHADER_PROJ] = glGetUniformLocation (m_finalScreenShader.program , " proj" );
1228
- m_finalScreenShader.uniformLocations [SHADER_TEX] = glGetUniformLocation (m_finalScreenShader.program , " tex" );
1229
- m_finalScreenShader.uniformLocations [SHADER_TIME] = glGetUniformLocation (m_finalScreenShader.program , " time" );
1228
+ m_finalScreenShader.uniformLocations [SHADER_POINTER] = glGetUniformLocation (m_finalScreenShader.program , " pointer_position" );
1229
+ m_finalScreenShader.uniformLocations [SHADER_PROJ] = glGetUniformLocation (m_finalScreenShader.program , " proj" );
1230
+ m_finalScreenShader.uniformLocations [SHADER_TEX] = glGetUniformLocation (m_finalScreenShader.program , " tex" );
1231
+ m_finalScreenShader.uniformLocations [SHADER_TIME] = glGetUniformLocation (m_finalScreenShader.program , " time" );
1230
1232
if (m_finalScreenShader.uniformLocations [SHADER_TIME] != -1 )
1231
1233
m_finalScreenShader.initialTime = m_globalTimer.getSeconds ();
1232
1234
m_finalScreenShader.uniformLocations [SHADER_WL_OUTPUT] = glGetUniformLocation (m_finalScreenShader.program , " wl_output" );
@@ -1241,6 +1243,12 @@ void CHyprOpenGLImpl::applyScreenShader(const std::string& path) {
1241
1243
}
1242
1244
m_finalScreenShader.uniformLocations [SHADER_TEX_ATTRIB] = glGetAttribLocation (m_finalScreenShader.program , " texcoord" );
1243
1245
m_finalScreenShader.uniformLocations [SHADER_POS_ATTRIB] = glGetAttribLocation (m_finalScreenShader.program , " pos" );
1246
+ if (m_finalScreenShader.uniformLocations [SHADER_POINTER] != -1 && *PDT != 0 && !g_pHyprRenderer->m_crashingInProgress ) {
1247
+ // The screen shader uses the "pointer_position" uniform
1248
+ // Since the screen shader could change every frame, damage tracking *needs* to be disabled
1249
+ g_pConfigManager->addParseError (" Screen shader: Screen shader uses uniform 'pointerPosition', which requires debug:damage_tracking to be switched off.\n "
1250
+ " WARNING: Disabling damage tracking will *massively* increase GPU utilization!" );
1251
+ }
1244
1252
m_finalScreenShader.createVao ();
1245
1253
}
1246
1254
@@ -1600,6 +1608,14 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP<CTexture> tex, const CB
1600
1608
shader->setUniformFloat2 (SHADER_FULL_SIZE, m_renderData.pMonitor ->m_pixelSize .x , m_renderData.pMonitor ->m_pixelSize .y );
1601
1609
}
1602
1610
1611
+ if (usingFinalShader && *PDT == 0 ) {
1612
+ PHLMONITORREF pMonitor = m_renderData.pMonitor ;
1613
+ Vector2D p = ((g_pInputManager->getMouseCoordsInternal () - pMonitor->m_position ) * pMonitor->m_scale );
1614
+ p = p.transform (wlTransformToHyprutils (pMonitor->m_transform ), pMonitor->m_pixelSize );
1615
+ shader->setUniformFloat2 (SHADER_POINTER, p.x / pMonitor->m_pixelSize .x , p.y / pMonitor->m_pixelSize .y );
1616
+ } else if (usingFinalShader)
1617
+ shader->setUniformFloat2 (SHADER_POINTER, 0 .f , 0 .f );
1618
+
1603
1619
if (CRASHING) {
1604
1620
shader->setUniformFloat (SHADER_DISTORT, g_pHyprRenderer->m_crashingDistort );
1605
1621
shader->setUniformFloat2 (SHADER_FULL_SIZE, m_renderData.pMonitor ->m_pixelSize .x , m_renderData.pMonitor ->m_pixelSize .y );
0 commit comments