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