diff -r 4c8b9c6d241f -r d3598c834f9b src/shader.c --- a/src/shader.c Sat Jun 21 22:10:54 2025 +0200 +++ b/src/shader.c Sun Jun 22 11:15:53 2025 +0200 @@ -155,19 +155,27 @@ AscShaderProgram *prog = cxZallocDefault(mem_size); unsigned shader[2]; unsigned n = 0; + bool shader_compile_error = false; + // TODO: clean up this pp mess by introducing proper nested structs if (codes.vtx) { - shader[n++] = asc_shader_compile(GL_VERTEX_SHADER, codes.vtx, codes.vtx_pp, codes.vtx_pp_list, codes.vtx_pp_list_select); + shader[n] = asc_shader_compile(GL_VERTEX_SHADER, codes.vtx, codes.vtx_pp, codes.vtx_pp_list, codes.vtx_pp_list_select); + shader_compile_error |= shader[n] == 0; + n++; } if (codes.frag) { - shader[n++] = asc_shader_compile(GL_FRAGMENT_SHADER, codes.frag, codes.frag_pp, codes.frag_pp_list, codes.frag_pp_list_select); + shader[n] = asc_shader_compile(GL_FRAGMENT_SHADER, codes.frag, codes.frag_pp, codes.frag_pp_list, codes.frag_pp_list_select); + shader_compile_error |= shader[n] == 0; + n++; } - if (asc_shader_link(shader, n, prog)) { + if (shader_compile_error || asc_shader_link(shader, n, prog)) { cxFreeDefault(prog); prog = NULL; } for (unsigned i = 0; i < n; i++) { - asc_dprintf("Delete shader: %u", shader[i]); - glDeleteShader(shader[i]); + if (shader[i] > 0) { + asc_dprintf("Delete shader: %u", shader[i]); + glDeleteShader(shader[i]); + } } return prog; }