src/shader.c

changeset 162
d3598c834f9b
parent 161
4c8b9c6d241f
child 163
3628cc3c0483
--- 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;
 }

mercurial