Initialize compile status variable and check also program link status
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
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);