153 |
153 |
154 void *asc_shader_create(AscShaderCodes codes, size_t mem_size) { |
154 void *asc_shader_create(AscShaderCodes codes, size_t mem_size) { |
155 AscShaderProgram *prog = cxZallocDefault(mem_size); |
155 AscShaderProgram *prog = cxZallocDefault(mem_size); |
156 unsigned shader[2]; |
156 unsigned shader[2]; |
157 unsigned n = 0; |
157 unsigned n = 0; |
|
158 bool shader_compile_error = false; |
|
159 // TODO: clean up this pp mess by introducing proper nested structs |
158 if (codes.vtx) { |
160 if (codes.vtx) { |
159 shader[n++] = asc_shader_compile(GL_VERTEX_SHADER, codes.vtx, codes.vtx_pp, codes.vtx_pp_list, codes.vtx_pp_list_select); |
161 shader[n] = asc_shader_compile(GL_VERTEX_SHADER, codes.vtx, codes.vtx_pp, codes.vtx_pp_list, codes.vtx_pp_list_select); |
|
162 shader_compile_error |= shader[n] == 0; |
|
163 n++; |
160 } |
164 } |
161 if (codes.frag) { |
165 if (codes.frag) { |
162 shader[n++] = asc_shader_compile(GL_FRAGMENT_SHADER, codes.frag, codes.frag_pp, codes.frag_pp_list, codes.frag_pp_list_select); |
166 shader[n] = asc_shader_compile(GL_FRAGMENT_SHADER, codes.frag, codes.frag_pp, codes.frag_pp_list, codes.frag_pp_list_select); |
163 } |
167 shader_compile_error |= shader[n] == 0; |
164 if (asc_shader_link(shader, n, prog)) { |
168 n++; |
|
169 } |
|
170 if (shader_compile_error || asc_shader_link(shader, n, prog)) { |
165 cxFreeDefault(prog); |
171 cxFreeDefault(prog); |
166 prog = NULL; |
172 prog = NULL; |
167 } |
173 } |
168 for (unsigned i = 0; i < n; i++) { |
174 for (unsigned i = 0; i < n; i++) { |
169 asc_dprintf("Delete shader: %u", shader[i]); |
175 if (shader[i] > 0) { |
170 glDeleteShader(shader[i]); |
176 asc_dprintf("Delete shader: %u", shader[i]); |
|
177 glDeleteShader(shader[i]); |
|
178 } |
171 } |
179 } |
172 return prog; |
180 return prog; |
173 } |
181 } |
174 |
182 |
175 void asc_shader_use(const AscShaderProgram *shader, const AscCamera *camera) { |
183 void asc_shader_use(const AscShaderProgram *shader, const AscCamera *camera) { |