summaryrefslogtreecommitdiff
path: root/src/render/OpenGL.cpp
diff options
context:
space:
mode:
authorscorpion-26 <dev.scorpion26@gmail.com>2023-03-05 15:05:30 +0100
committerGitHub <noreply@github.com>2023-03-05 14:05:30 +0000
commitde5f1b2a833a59d3b0375f24675d27cea99e56d1 (patch)
tree5c299606df594c758c8dd462680de4ac2a41d42d /src/render/OpenGL.cpp
parentdc7d783d1439b92b16bfe1851c2b699e7c7267e0 (diff)
Optionally expose time to screen shaders (#1700)
* Optionally expose time to screen shaders Since that collides with damage tracking, it will only be done, when damage tracking is disabled, meaning this comes at no cost for everyone not using time. * Rename m_Timer to m_tGlobalTimer
Diffstat (limited to 'src/render/OpenGL.cpp')
-rw-r--r--src/render/OpenGL.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp
index 6a9baedf..7caf8ad1 100644
--- a/src/render/OpenGL.cpp
+++ b/src/render/OpenGL.cpp
@@ -31,6 +31,8 @@ CHyprOpenGLImpl::CHyprOpenGLImpl() {
pixman_region32_init(&m_rOriginalDamageRegion);
RASSERT(eglMakeCurrent(wlr_egl_get_display(g_pCompositor->m_sWLREGL), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT), "Couldn't unset current EGL!");
+
+ m_tGlobalTimer.reset();
}
GLuint CHyprOpenGLImpl::createProgram(const std::string& vert, const std::string& frag, bool dynamic) {
@@ -310,8 +312,15 @@ void CHyprOpenGLImpl::applyScreenShader(const std::string& path) {
return;
}
- m_sFinalScreenShader.proj = glGetUniformLocation(m_sFinalScreenShader.program, "proj");
- m_sFinalScreenShader.tex = glGetUniformLocation(m_sFinalScreenShader.program, "tex");
+ m_sFinalScreenShader.proj = glGetUniformLocation(m_sFinalScreenShader.program, "proj");
+ m_sFinalScreenShader.tex = glGetUniformLocation(m_sFinalScreenShader.program, "tex");
+ m_sFinalScreenShader.time = glGetUniformLocation(m_sFinalScreenShader.program, "time");
+ if (m_sFinalScreenShader.time != -1 && g_pConfigManager->getInt("debug:damage_tracking") != 0) {
+ // The screen shader uses the "time" uniform
+ // Since the screen shader could change every frame, damage tracking *needs* to be disabled
+ g_pConfigManager->addParseError("Screen shader: Screen shader uses uniform 'time', which requires debug:damage_tracking to be switched off.\n"
+ "WARNING: Disabling damage tracking will *massively* increase GPU utilization!");
+ }
m_sFinalScreenShader.texAttrib = glGetAttribLocation(m_sFinalScreenShader.program, "texcoord");
m_sFinalScreenShader.posAttrib = glGetAttribLocation(m_sFinalScreenShader.program, "pos");
}
@@ -523,6 +532,14 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(const CTexture& tex, wlr_b
glUniformMatrix3fv(shader->proj, 1, GL_FALSE, glMatrix);
#endif
glUniform1i(shader->tex, 0);
+
+ if (usingFinalShader && g_pConfigManager->getInt("debug:damage_tracking") == 0) {
+ glUniform1f(shader->time, m_tGlobalTimer.getSeconds());
+ } else if (usingFinalShader) {
+ // Don't let time be unitialised
+ glUniform1f(shader->time, 0.f);
+ }
+
if (!usingFinalShader) {
glUniform1f(shader->alpha, alpha);
glUniform1i(shader->discardOpaque, (int)discardOpaque);