Skip to content

Commit

Permalink
OpenGL2: Fix shader error logs.
Browse files Browse the repository at this point in the history
  • Loading branch information
SmileTheory committed Aug 5, 2016
1 parent 29ac117 commit 5252e28
Showing 1 changed file with 53 additions and 42 deletions.
95 changes: 53 additions & 42 deletions code/renderergl2/tr_glsl.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,70 +148,86 @@ static uniformInfo_t uniformsInfo[] =
{ "u_CubeMapInfo", GLSL_VEC4 },
};

typedef enum
{
GLSL_PRINTLOG_PROGRAM_INFO,
GLSL_PRINTLOG_SHADER_INFO,
GLSL_PRINTLOG_SHADER_SOURCE
}
glslPrintLog_t;

static void GLSL_PrintInfoLog(GLuint program, qboolean developerOnly)
static void GLSL_PrintLog(GLuint programOrShader, glslPrintLog_t type, qboolean developerOnly)
{
char *msg;
static char msgPart[1024];
int maxLength = 0;
int i;
int printLevel = developerOnly ? PRINT_DEVELOPER : PRINT_ALL;

qglGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
switch (type)
{
case GLSL_PRINTLOG_PROGRAM_INFO:
ri.Printf(printLevel, "Program info log:\n");
qglGetProgramiv(programOrShader, GL_INFO_LOG_LENGTH, &maxLength);
break;

case GLSL_PRINTLOG_SHADER_INFO:
ri.Printf(printLevel, "Shader info log:\n");
qglGetShaderiv(programOrShader, GL_INFO_LOG_LENGTH, &maxLength);
break;

case GLSL_PRINTLOG_SHADER_SOURCE:
ri.Printf(printLevel, "Shader source:\n");
qglGetShaderiv(programOrShader, GL_SHADER_SOURCE_LENGTH, &maxLength);
break;
}

if (maxLength <= 0)
{
ri.Printf(printLevel, "No compile log.\n");
ri.Printf(printLevel, "None.\n");
return;
}

ri.Printf(printLevel, "compile log:\n");

if (maxLength < 1023)
msg = msgPart;
else
msg = ri.Malloc(maxLength);

switch (type)
{
qglGetProgramInfoLog(program, maxLength, &maxLength, msgPart);
case GLSL_PRINTLOG_PROGRAM_INFO:
qglGetProgramInfoLog(programOrShader, maxLength, &maxLength, msg);
break;

case GLSL_PRINTLOG_SHADER_INFO:
qglGetShaderInfoLog(programOrShader, maxLength, &maxLength, msg);
break;

case GLSL_PRINTLOG_SHADER_SOURCE:
qglGetShaderSource(programOrShader, maxLength, &maxLength, msg);
break;
}

if (maxLength < 1023)
{
msgPart[maxLength + 1] = '\0';

ri.Printf(printLevel, "%s\n", msgPart);
}
else
{
msg = ri.Malloc(maxLength);

qglGetProgramInfoLog(program, maxLength, &maxLength, msg);

for(i = 0; i < maxLength; i += 1024)
for(i = 0; i < maxLength; i += 1023)
{
Q_strncpyz(msgPart, msg + i, sizeof(msgPart));

ri.Printf(printLevel, "%s\n", msgPart);
ri.Printf(printLevel, "%s", msgPart);
}

ri.Free(msg);
}
}
ri.Printf(printLevel, "\n");

static void GLSL_PrintShaderSource(GLuint shader)
{
char *msg;
static char msgPart[1024];
int maxLength = 0;
int i;

qglGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &maxLength);

msg = ri.Malloc(maxLength);

qglShaderSource(shader, 1, (const GLchar **)&msg, &maxLength);

for(i = 0; i < maxLength; i += 1024)
{
Q_strncpyz(msgPart, msg + i, sizeof(msgPart));
ri.Printf(PRINT_ALL, "%s\n", msgPart);
ri.Free(msg);
}

ri.Free(msg);
}

static void GLSL_GetShaderHeader( GLenum shaderType, const GLchar *extra, char *dest, int size )
Expand Down Expand Up @@ -365,15 +381,12 @@ static int GLSL_CompileGPUShader(GLuint program, GLuint *prevShader, const GLcha
qglGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
if(!compiled)
{
GLSL_PrintShaderSource(shader);
GLSL_PrintInfoLog(shader, qfalse);
GLSL_PrintLog(shader, GLSL_PRINTLOG_SHADER_SOURCE, qfalse);
GLSL_PrintLog(shader, GLSL_PRINTLOG_SHADER_INFO, qfalse);
ri.Error(ERR_DROP, "Couldn't compile shader");
return 0;
}

//GLSL_PrintInfoLog(shader, qtrue);
//GLSL_PrintShaderSource(shader);

if (*prevShader)
{
qglDetachShader(program, *prevShader);
Expand Down Expand Up @@ -460,8 +473,7 @@ static void GLSL_LinkProgram(GLuint program)
qglGetProgramiv(program, GL_LINK_STATUS, &linked);
if(!linked)
{
GLSL_PrintInfoLog(program, qfalse);
ri.Printf(PRINT_ALL, "\n");
GLSL_PrintLog(program, GLSL_PRINTLOG_PROGRAM_INFO, qfalse);
ri.Error(ERR_DROP, "shaders failed to link");
}
}
Expand All @@ -475,8 +487,7 @@ static void GLSL_ValidateProgram(GLuint program)
qglGetProgramiv(program, GL_VALIDATE_STATUS, &validated);
if(!validated)
{
GLSL_PrintInfoLog(program, qfalse);
ri.Printf(PRINT_ALL, "\n");
GLSL_PrintLog(program, GLSL_PRINTLOG_PROGRAM_INFO, qfalse);
ri.Error(ERR_DROP, "shaders failed to validate");
}
}
Expand Down

0 comments on commit 5252e28

Please sign in to comment.