131 lines
4.4 KiB
C
131 lines
4.4 KiB
C
// ----------------------------------------------------------------------------
|
|
|
|
static void v4k_pre_init() {
|
|
window_icon(va("%s%s.png", app_path(), app_name()));
|
|
|
|
glfwPollEvents();
|
|
|
|
int i;
|
|
#pragma omp parallel for
|
|
for( i = 0; i <= 6; ++i) {
|
|
/**/ if( i == 0 ) ddraw_init();// init this on thread#0 since it will be compiling shaders, and shaders need to be compiled from the very same thread than glfwMakeContextCurrent() was set up
|
|
else if( i == 1 ) sprite_init();
|
|
else if( i == 2 ) profiler_init();
|
|
else if( i == 3 ) storage_mount("save/"), storage_read(), touch_init(); // for ems
|
|
else if( i == 4 ) audio_init(0);
|
|
else if( i == 5 ) script_init(), kit_init(), midi_init();
|
|
else if( i == 6 ) network_init();
|
|
}
|
|
|
|
// window_swap();
|
|
}
|
|
static void v4k_post_init(float refresh_rate) {
|
|
// cook cleanup
|
|
cook_stop();
|
|
|
|
vfs_reload();
|
|
|
|
// init subsystems that depend on cooked assets now
|
|
|
|
int i;
|
|
#pragma omp parallel for
|
|
for( i = 0; i <= 2; ++i ) {
|
|
if(i == 0) ui_init(); // init these on thread #0, since both will be compiling shaders, and shaders need to be compiled from the very same thread than glfwMakeContextCurrent() was set up
|
|
if(i == 0) scene_init(); // init these on thread #0, since both will be compiling shaders, and shaders need to be compiled from the very same thread than glfwMakeContextCurrent() was set up
|
|
if(i == 0) window_icon(va("%s.png", app_name()));
|
|
if(i == 1) input_init();
|
|
}
|
|
|
|
// display window
|
|
glfwShowWindow(window);
|
|
glfwGetFramebufferSize(window, &w, &h); //glfwGetWindowSize(window, &w, &h);
|
|
|
|
randset(time_ns());
|
|
boot_time = -time_ss(); // measure boot time, this is continued in window_stats()
|
|
|
|
// clean any errno setup by cooking stage
|
|
errno = 0;
|
|
|
|
hz = refresh_rate;
|
|
// t = glfwGetTime();
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
static
|
|
void v4k_quit(void) {
|
|
storage_flush();
|
|
midi_quit();
|
|
}
|
|
|
|
void v4k_init() {
|
|
do_once {
|
|
// abort run if any test suite failed
|
|
if( test_errs ) exit(-1);
|
|
|
|
// install signal handlers
|
|
ifdef(debug, trap_install());
|
|
|
|
// init panic handler
|
|
panic_oom_reserve = SYS_REALLOC(panic_oom_reserve, 1<<20); // 1MiB
|
|
|
|
// init glfw
|
|
glfw_init();
|
|
|
|
// enable ansi console
|
|
tty_init();
|
|
|
|
// chdir to root (if invoked as tcc -g -run)
|
|
// chdir(app_path());
|
|
|
|
// skip tcc argvs (if invoked as tcc file.c v4k.c -g -run) (win)
|
|
if( __argc > 1 ) if( strstr(__argv[0], "/tcc") || strstr(__argv[0], "\\tcc") ) {
|
|
__argc = 0;
|
|
}
|
|
|
|
// create or update cook.zip file
|
|
if( /* !COOK_ON_DEMAND && */ file_exist(COOK_INI) && cook_jobs() ) {
|
|
cook_start(COOK_INI, "**", 0|COOK_ASYNC|COOK_CANCELABLE );
|
|
}
|
|
|
|
atexit(v4k_quit);
|
|
}
|
|
}
|
|
|
|
// Enable more performant GPUs on laptops. Does this work into a dll?
|
|
// int NvOptimusEnablement = 1;
|
|
// int AmdPowerXpressRequestHighPerformance = 1;
|
|
|
|
#if is(linux) && is(tcc) // fixes `tcc: error: undefined symbol '__dso_handle'`
|
|
int __dso_handle; // compiled with: `tcc demo.c v4k.c -D__STDC_NO_VLA__ -lX11`
|
|
#endif
|
|
|
|
#if is(win32) && is(tcc) // fixes `tcc: error: undefined symbol '_InterlockedExchangeAdd'` when compiling with `-m64` flag
|
|
__CRT_INLINE LONG _InterlockedExchangeAdd(LONG volatile *add, LONG val) {
|
|
LONG old;
|
|
do old = *add; while( InterlockedCompareExchange(add, old + val, old) != old );
|
|
return old;
|
|
}
|
|
__CRT_INLINE LONGLONG _InterlockedExchangeAdd64(LONGLONG volatile *add, LONGLONG val) { // 64bit version, for completeness
|
|
LONGLONG old;
|
|
do old = *add; while( InterlockedCompareExchange64(add, old + val, old) != old );
|
|
return old;
|
|
}
|
|
#endif
|
|
|
|
#ifdef ZIG_CC
|
|
static int IN6_IS_ADDR_V4MAPPED(const struct in6_addr *a) { return ((a->s6_words[0]==0) && (a->s6_words[1]==0) && (a->s6_words[2]==0) && (a->s6_words[3]==0) && (a->s6_words[4]==0) && (a->s6_words[5]==0xffff)); }
|
|
const struct in6_addr in6addr_any; // = IN6ADDR_ANY_INIT;
|
|
//static const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
|
|
#endif
|
|
|
|
ifdef(retail, AUTORUN {
|
|
fclose(stderr);
|
|
fclose(stdout);
|
|
|
|
const char* null_stream = ifdef(win32, "nul:", "/dev/null");
|
|
|
|
if (!freopen(null_stream, "a", stdout)) PANIC("cannot recreate standard streams");
|
|
if (!freopen(null_stream, "a", stderr)) PANIC("cannot recreate standard streams");
|
|
} )
|