src/shader.c

changeset 162
d3598c834f9b
parent 161
4c8b9c6d241f
child 163
3628cc3c0483
equal deleted inserted replaced
161:4c8b9c6d241f 162:d3598c834f9b
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) {

mercurial