summaryrefslogtreecommitdiff
path: root/src/render/OpenGL.cpp
diff options
context:
space:
mode:
authorjill <oatmealine@disroot.org>2024-03-21 17:46:23 +0300
committerGitHub <noreply@github.com>2024-03-21 14:46:23 +0000
commitee00cb1dd87115f7c2b0fb41268e88050f28e7ed (patch)
tree3b533b901814fb2cb296460a2cf64daf032109fe /src/render/OpenGL.cpp
parent4c796683c05a0eaccc14aae8875f06972f9f3c5e (diff)
opengl: report shader compilation errors from screen_shader (#5138)
* opengl: report shader compilation errors from screen_shader * opengl: prefer .data() * opengl: move shader error logging to logError * opengl: quick glGetShaderiv -> glGetProgramiv fix * opengl: typo fix * opengl: format fixes * opengl: minor compile fixes * opengl: logError -> logShaderError
Diffstat (limited to 'src/render/OpenGL.cpp')
-rw-r--r--src/render/OpenGL.cpp28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp
index d34a90b0..df03e8e9 100644
--- a/src/render/OpenGL.cpp
+++ b/src/render/OpenGL.cpp
@@ -59,6 +59,23 @@ CHyprOpenGLImpl::CHyprOpenGLImpl() {
m_tGlobalTimer.reset();
}
+void CHyprOpenGLImpl::logShaderError(const GLuint& shader, bool program) {
+ GLint maxLength = 0;
+ if (program)
+ glGetProgramiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
+ else
+ glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
+
+ std::vector<GLchar> errorLog(maxLength);
+ if (program)
+ glGetProgramInfoLog(shader, maxLength, &maxLength, errorLog.data());
+ else
+ glGetShaderInfoLog(shader, maxLength, &maxLength, errorLog.data());
+ std::string errorStr(errorLog.begin(), errorLog.end());
+
+ g_pConfigManager->addParseError((program ? "Screen shader parser: Error linking program:" : "Screen shader parser: Error compiling shader: ") + errorStr);
+}
+
GLuint CHyprOpenGLImpl::createProgram(const std::string& vert, const std::string& frag, bool dynamic) {
auto vertCompiled = compileShader(GL_VERTEX_SHADER, vert, dynamic);
if (dynamic) {
@@ -89,8 +106,10 @@ GLuint CHyprOpenGLImpl::createProgram(const std::string& vert, const std::string
GLint ok;
glGetProgramiv(prog, GL_LINK_STATUS, &ok);
if (dynamic) {
- if (ok == GL_FALSE)
+ if (ok == GL_FALSE) {
+ logShaderError(prog, true);
return 0;
+ }
} else {
RASSERT(ok != GL_FALSE, "createProgram() failed! GL_LINK_STATUS not OK!");
}
@@ -108,9 +127,12 @@ GLuint CHyprOpenGLImpl::compileShader(const GLuint& type, std::string src, bool
GLint ok;
glGetShaderiv(shader, GL_COMPILE_STATUS, &ok);
+
if (dynamic) {
- if (ok == GL_FALSE)
+ if (ok == GL_FALSE) {
+ logShaderError(shader, false);
return 0;
+ }
} else {
RASSERT(ok != GL_FALSE, "compileShader() failed! GL_COMPILE_STATUS not OK!");
}
@@ -550,7 +572,7 @@ void CHyprOpenGLImpl::applyScreenShader(const std::string& path) {
m_sFinalScreenShader.program = createProgram(fragmentShader.starts_with("#version 320 es") ? TEXVERTSRC320 : TEXVERTSRC, fragmentShader, true);
if (!m_sFinalScreenShader.program) {
- g_pConfigManager->addParseError("Screen shader parser: Screen shader parse failed");
+ // Error will have been sent by now by the underlying cause
return;
}