nuclear@4: /* XXX this might become partly auto-generated in the future */ nuclear@4: #include nuclear@4: #include nuclear@4: #include "vr_impl.h" nuclear@4: nuclear@4: struct vr_module *vr_module_libovr(void); nuclear@10: struct vr_module *vr_module_openhmd(void); nuclear@4: struct vr_module *vr_module_null(void); nuclear@4: nuclear@4: static struct vr_module *modules; nuclear@4: static int num_modules, modules_max_size; nuclear@4: nuclear@4: static int *active_modules; nuclear@4: static int num_act_modules, act_modules_max_size; nuclear@4: nuclear@4: nuclear@4: void vr_init_modules(void) nuclear@4: { nuclear@4: struct vr_module *m; nuclear@4: nuclear@4: vr_clear_modules(); nuclear@4: nuclear@4: if((m = vr_module_libovr())) { nuclear@4: vr_register_module(m); nuclear@4: } nuclear@4: nuclear@10: if((m = vr_module_openhmd())) { nuclear@10: vr_register_module(m); nuclear@10: } nuclear@10: nuclear@4: if((m = vr_module_null())) { nuclear@4: vr_register_module(m); nuclear@4: } nuclear@4: } nuclear@4: nuclear@4: void vr_clear_modules(void) nuclear@4: { nuclear@4: free(modules); nuclear@4: free(active_modules); nuclear@4: modules = 0; nuclear@4: num_modules = modules_max_size = 0; nuclear@4: active_modules = 0; nuclear@4: num_act_modules = act_modules_max_size = 0; nuclear@4: } nuclear@4: nuclear@4: void vr_register_module(struct vr_module *mod) nuclear@4: { nuclear@4: if(num_modules >= modules_max_size) { nuclear@4: int newsz = modules_max_size ? modules_max_size * 2 : 2; nuclear@4: struct vr_module *newmods = realloc(modules, newsz * sizeof *newmods); nuclear@4: if(!newmods) { nuclear@4: fprintf(stderr, "failed to resize modules array up to %d\n", newsz); nuclear@4: return; nuclear@4: } nuclear@4: modules = newmods; nuclear@4: modules_max_size = newsz; nuclear@4: } nuclear@4: modules[num_modules++] = *mod; nuclear@4: } nuclear@4: nuclear@4: int vr_get_num_modules(void) nuclear@4: { nuclear@4: return num_modules; nuclear@4: } nuclear@4: nuclear@4: struct vr_module *vr_get_module(int idx) nuclear@4: { nuclear@4: return modules + idx; nuclear@4: } nuclear@4: nuclear@4: void vr_activate_module(int idx) nuclear@4: { nuclear@4: if(num_act_modules >= act_modules_max_size) { nuclear@4: int newsz = act_modules_max_size ? act_modules_max_size * 2 : 2; nuclear@4: int *newact = realloc(active_modules, newsz * sizeof *newact); nuclear@4: if(!newact) { nuclear@4: fprintf(stderr, "failed to resize active modules array up to %d\n", newsz); nuclear@4: return; nuclear@4: } nuclear@4: active_modules = newact; nuclear@4: act_modules_max_size = newsz; nuclear@4: } nuclear@4: active_modules[num_act_modules++] = idx; nuclear@4: } nuclear@4: nuclear@4: int vr_get_num_active_modules(void) nuclear@4: { nuclear@4: return num_act_modules; nuclear@4: } nuclear@4: nuclear@4: struct vr_module *vr_get_active_module(int idx) nuclear@4: { nuclear@4: return modules + active_modules[idx]; nuclear@4: }