2017-07-18 23:17:40 +00:00
/*
* Mr . 4 th Dimention - Allen Webster
*
* 18.07 .2017
*
* Shared logic for 4 coder initialization .
*
*/
// TOP
2017-07-18 23:41:28 +00:00
internal void
2019-08-16 15:01:17 +00:00
memory_init ( Arena * scratch ) {
2017-07-18 23:17:40 +00:00
# if defined(FRED_INTERNAL)
2019-06-01 23:58:28 +00:00
# if ARCH_64BIT
2017-07-18 23:17:40 +00:00
void * bases [ ] = { ( void * ) TB ( 1 ) , ( void * ) TB ( 2 ) , } ;
2019-06-01 23:58:28 +00:00
# else
2018-12-17 04:31:04 +00:00
void * bases [ ] = { ( void * ) MB ( 96 ) , ( void * ) MB ( 512 ) , } ;
2017-07-18 23:17:40 +00:00
# endif
# else
void * bases [ ] = { ( void * ) 0 , ( void * ) 0 , } ;
# endif
2018-12-17 04:31:04 +00:00
memory_vars . vars_memory_size = MB ( 128 ) ;
2017-07-18 23:17:40 +00:00
memory_vars . vars_memory = system_memory_allocate_extended ( bases [ 0 ] , memory_vars . vars_memory_size ) ;
memory_vars . target_memory_size = MB ( 512 ) ;
memory_vars . target_memory = system_memory_allocate_extended ( bases [ 1 ] , memory_vars . target_memory_size ) ;
2018-12-17 04:31:04 +00:00
memory_vars . user_memory_size = MB ( 32 ) ;
2017-07-18 23:17:40 +00:00
memory_vars . user_memory = system_memory_allocate_extended ( 0 , memory_vars . user_memory_size ) ;
memory_vars . debug_memory_size = MB ( 512 ) ;
memory_vars . debug_memory = system_memory_allocate_extended ( 0 , memory_vars . debug_memory_size ) ;
2017-11-11 00:58:47 +00:00
i32 render_memsize = MB ( 1 ) ;
2019-07-25 07:17:01 +00:00
target . arena = make_arena_system ( & sysfunc ) ;
2017-07-18 23:17:40 +00:00
b32 alloc_success = true ;
2019-07-25 07:17:01 +00:00
if ( memory_vars . vars_memory = = 0 | | memory_vars . target_memory = = 0 | | memory_vars . user_memory = = 0 ) {
2017-07-18 23:17:40 +00:00
alloc_success = false ;
}
2017-07-18 23:41:28 +00:00
if ( ! alloc_success ) {
char msg [ ] = " Could not allocate sufficient memory. Please make sure you have atleast 512Mb of RAM free. (This requirement will be relaxed in the future). " ;
2019-08-16 15:01:17 +00:00
system_error_box ( scratch , msg ) ;
2017-07-18 23:41:28 +00:00
}
2017-07-18 23:17:40 +00:00
}
2017-07-19 00:19:38 +00:00
internal void
2019-08-16 15:01:17 +00:00
load_app_code ( Arena * scratch ) {
2017-07-19 00:19:38 +00:00
App_Get_Functions * get_funcs = 0 ;
2019-08-16 15:01:17 +00:00
if ( system_load_library ( scratch , & libraries . app_code , " 4ed_app " , LoadLibrary_BinaryDirectory ) ) {
2017-07-19 00:19:38 +00:00
get_funcs = ( App_Get_Functions * ) system_get_proc ( & libraries . app_code , " app_get_functions " ) ;
}
else {
char msg [ ] = " Could not load '4ed_app. " DLL " '. This file should be in the same directory as the main '4ed' executable. " ;
2019-08-16 15:01:17 +00:00
system_error_box ( scratch , msg ) ;
2017-07-19 00:19:38 +00:00
}
if ( get_funcs ! = 0 ) {
app = get_funcs ( ) ;
}
else {
char msg [ ] = " Failed to get application code from '4ed_app. " DLL " '. " ;
2019-08-16 15:01:17 +00:00
system_error_box ( scratch , msg ) ;
2017-07-19 00:19:38 +00:00
}
}
2017-07-19 16:33:12 +00:00
global char custom_fail_version_msg [ ] = " Failed to load custom code due to missing version information or a version mismatch. Try rebuilding with buildsuper. " ;
global char custom_fail_missing_get_bindings_msg [ ] = " Failed to load custom code due to missing 'get_bindings' symbol. Try rebuilding with buildsuper. " ;
internal void
2019-08-16 15:01:17 +00:00
load_custom_code ( Arena * scratch ) {
2017-07-19 16:33:12 +00:00
local_persist char * default_file = " custom_4coder " ;
local_persist Load_Library_Location locations [ ] = {
LoadLibrary_CurrentDirectory ,
LoadLibrary_BinaryDirectory ,
} ;
2018-11-20 08:18:54 +00:00
char * custom_files [ 3 ] = { } ;
2017-07-19 16:33:12 +00:00
if ( plat_settings . custom_dll ! = 0 ) {
custom_files [ 0 ] = plat_settings . custom_dll ;
if ( ! plat_settings . custom_dll_is_strict ) {
custom_files [ 1 ] = default_file ;
}
}
else {
custom_files [ 0 ] = default_file ;
}
char success_file [ 4096 ] ;
b32 has_library = false ;
for ( u32 i = 0 ; custom_files [ i ] ! = 0 & & ! has_library ; + + i ) {
char * file = custom_files [ i ] ;
for ( u32 j = 0 ; j < ArrayCount ( locations ) & & ! has_library ; + + j ) {
2019-08-16 15:01:17 +00:00
if ( system_load_library ( scratch , & libraries . custom , file , locations [ j ] , success_file , sizeof ( success_file ) ) ) {
2017-07-19 16:33:12 +00:00
has_library = true ;
success_file [ sizeof ( success_file ) - 1 ] = 0 ;
}
}
}
if ( ! has_library ) {
2019-08-16 15:01:17 +00:00
system_error_box ( scratch , " Did not find a library for the custom layer. " ) ;
2017-07-19 16:33:12 +00:00
}
custom_api . get_alpha_4coder_version = ( _Get_Version_Function * )
system_get_proc ( & libraries . custom , " get_alpha_4coder_version " ) ;
if ( custom_api . get_alpha_4coder_version = = 0 | | custom_api . get_alpha_4coder_version ( MAJOR , MINOR , PATCH ) = = 0 ) {
2019-08-16 15:01:17 +00:00
system_error_box ( scratch , custom_fail_version_msg ) ;
2017-07-19 16:33:12 +00:00
}
custom_api . get_bindings = ( Get_Binding_Data_Function * )
system_get_proc ( & libraries . custom , " get_bindings " ) ;
if ( custom_api . get_bindings = = 0 ) {
2019-08-16 15:01:17 +00:00
system_error_box ( scratch , custom_fail_missing_get_bindings_msg ) ;
2017-07-19 16:33:12 +00:00
}
2019-07-21 18:16:34 +00:00
//LOGF("Loaded custom file: %s\n", success_file);
2017-07-19 16:33:12 +00:00
}
2017-07-19 20:07:50 +00:00
internal void
2019-07-24 07:41:40 +00:00
read_command_line ( Arena * scratch , i32 argc , char * * argv ) {
Temp_Memory temp = begin_temp ( scratch ) ;
String_Const_u8 curdir = sysfunc . get_current_path ( scratch ) ;
2019-06-01 23:58:28 +00:00
curdir = string_mod_replace_character ( curdir , ' \\ ' , ' / ' ) ;
2017-07-19 20:07:50 +00:00
char * * files = 0 ;
i32 * file_count = 0 ;
app . read_command_line ( & sysfunc , & memory_vars , curdir , & plat_settings , & files , & file_count , argc , argv ) ;
2019-08-16 15:01:17 +00:00
sysshared_filter_real_files ( scratch , files , file_count ) ;
2019-07-24 07:41:40 +00:00
end_temp ( temp ) ;
2017-07-19 20:07:50 +00:00
}
2017-07-18 23:17:40 +00:00
// BOTTOM