Commit d6122704e8c2380cd036721957ac7914ec6b8dad

capehill 2022-03-26T12:40:08

Initialize compile status variable and check also program link status

diff --git a/test/testshader.c b/test/testshader.c
index 2cee7d9..9e81bf5 100644
--- a/test/testshader.c
+++ b/test/testshader.c
@@ -126,7 +126,7 @@ static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
 
 static SDL_bool CompileShader(GLhandleARB shader, const char *source)
 {
-    GLint status;
+    GLint status = 0;
 
     glShaderSourceARB(shader, 1, &source, NULL);
     glCompileShaderARB(shader);
@@ -147,6 +147,31 @@ static SDL_bool CompileShader(GLhandleARB shader, const char *source)
     }
 }
 
+static SDL_bool LinkProgram(ShaderData *data)
+{
+    GLint status = 0;
+
+    glAttachObjectARB(data->program, data->vert_shader);
+    glAttachObjectARB(data->program, data->frag_shader);
+    glLinkProgramARB(data->program);
+
+    glGetObjectParameterivARB(data->program, GL_OBJECT_LINK_STATUS_ARB, &status);
+    if (status == 0) {
+        GLint length;
+        char *info;
+
+        glGetObjectParameterivARB(data->program, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
+        info = SDL_stack_alloc(char, length+1);
+        glGetInfoLogARB(data->program, length, NULL, info);
+        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to link program:\n%s", info);
+        SDL_stack_free(info);
+
+        return SDL_FALSE;
+    } else {
+        return SDL_TRUE;
+    }
+}
+
 static SDL_bool CompileShaderProgram(ShaderData *data)
 {
     const int num_tmus_bound = 4;
@@ -171,9 +196,9 @@ static SDL_bool CompileShaderProgram(ShaderData *data)
     }
 
     /* ... and in the darkness bind them */
-    glAttachObjectARB(data->program, data->vert_shader);
-    glAttachObjectARB(data->program, data->frag_shader);
-    glLinkProgramARB(data->program);
+    if (!LinkProgram(data)) {
+        return SDL_FALSE;
+    }
 
     /* Set up some uniform variables */
     glUseProgramObjectARB(data->program);