void job_clean(Job *j) { int i; for (i = 0;i < j->number_of_programs; i++) program_clean(j->program[i]); free(j->program); free(j); return; }
void program_exit(struct program **prog) { struct program *ptr = *prog; if (!ptr) return; program_clean(ptr); free(ptr); *prog = NULL; }
int program_make(struct program *prog, struct shader **shader, int num) { int i; GLchar log[256] = "nil"; GLsizei len = 0; GLint res = GL_FALSE; if (!prog) { errno = EFAULT; return -1; } timeinit(); prog->id = glCreateProgram(); if (prog->id == 0) { glerr("glCreateProgram() failed"); return -1; } prog->shader = shader; prog->shader_num = num; for (i = 0; i < num; i++) { if (make_shader(shader[i]) < 0) { _err("shader %s failed\n", shader[i]->name); goto err; } glAttachShader(prog->id, shader[i]->id); } timestart(); glLinkProgram(prog->id); glGetProgramiv(prog->id, GL_LINK_STATUS, &res); if (res != GL_TRUE) { _err("failed to link program\n"); goto err; } timestop("program %d linked\n", prog->id); return prog->id; err: if (prog->id > 0) { glGetProgramInfoLog(prog->id, sizeof (log), &len, log); _msg("len: %d, log: %s\n", len, log); } program_clean(prog); return -1; }
int main(int argc, char **argv) { Program program; Program *p = &program; #ifdef RICH_OUTPUT initscr(); raw(); keypad(stdscr, TRUE); noecho(); #endif program_init(p); program_load_system(p, "./programs/divide.sys"); program_load_code(p, "./programs/divide.tis"); #ifdef RICH_OUTPUT output_program(p); int code = getch(); while (code != 'q') { program_tick(p); clear(); output_program(p); refresh(); code = getch(); } #else int all_blocked_count = 0; while (all_blocked_count < 5) { int all_blocked = program_tick(p); if (all_blocked) { all_blocked_count++; } else { all_blocked_count = 0; } } #endif #ifdef RICH_OUTPUT endwin(); #endif program_clean(p); }