symbols for engine module are now generated into a header

Started to to use gencpp to codegen.

Now instead of loading the symbol table file made by the build script I can just have it get directly compiled.
This commit is contained in:
2023-09-28 20:22:15 -04:00
parent d76163ae84
commit 2f6e60d472
15 changed files with 187 additions and 126 deletions

View File

@ -0,0 +1,4 @@
# Project Code Generation
This directory contains metaprograms that generate code for the project.
Any code generated will be put into `*.gen.cpp` files within a gen folder for the respective module the metaprogram is generating for.

View File

@ -9,9 +9,11 @@ using namespace gen;
int gen_main()
{
gen::init();
log_fmt("Generating code for Handmade Hero\n");
log_fmt("Generating code for Handmade Hero: Engine Module\n");
log_fmt("Generaton finished for Handmade Hero\n");
log_fmt("Generaton finished for Handmade Hero: Engine Module\n");
// gen::deinit();
return 0;
}

View File

@ -0,0 +1,101 @@
#if GEN_TIME
#define GEN_DEFINE_LIBRARY_CODE_CONSTANTS
#define GEN_IMPLEMENTATION
#define GEN_BENCHMARK
#define GEN_ENFORCE_STRONG_CODE_TYPES
#include "dependencies/gen.hpp"
using namespace gen;
#include "platform/platform_engine_api.hpp"
constexpr StrC fname_handmade_engine_symbols = txt("handmade_engine.symbols");
String get_symbol_from_module_table( FileContents symbol_table, u32 symbol_ID )
{
struct Token
{
char const* Ptr;
u32 Len;
};
Token tokens[256] = {};
char const* scanner = rcast( char const*, symbol_table.data );
u32 left = symbol_table.size;
u32 line = 0;
while ( left )
{
if ( *scanner == '\n' || *scanner == '\r' )
{
++ scanner;
-- left;
}
else
{
tokens[line].Ptr = scanner;
while ( left && *scanner != '\r' && *scanner != '\n' )
{
-- left;
++ scanner;
++ tokens[line].Len;
}
if ( line == symbol_ID )
{
String result = String::make_length( GlobalAllocator, tokens[line].Ptr, tokens[line].Len );
return result;
}
++ line;
}
}
return {};
}
int gen_main()
{
gen::init();
log_fmt("Generating code for Handmade Hero: Platfom Module\n");
FileContents symbol_table = file_read_contents( GlobalAllocator, true, fname_handmade_engine_symbols );
#pragma push_macro("str_ascii")
#undef str_ascii
Builder builder = Builder::open( "engine_symbol_table.hpp" );
builder.print( pragma_once );
builder.print( def_include( txt("platform/platform.hpp") ) );
builder.print( fmt_newline );
builder.print_fmt( "NS_ENGINE_BEGIN\n\n" );
StrC symbol_on_module_load = get_symbol_from_module_table( symbol_table, engine::ModuleAPI::Sym_OnModuleReload );
StrC symbol_startup = get_symbol_from_module_table( symbol_table, engine::ModuleAPI::Sym_Startup );
StrC symbol_shutdown = get_symbol_from_module_table( symbol_table, engine::ModuleAPI::Sym_Shutdown );
StrC symbol_update_and_render = get_symbol_from_module_table( symbol_table, engine::ModuleAPI::Sym_UpdateAndRender );
StrC symbol_update_audio = get_symbol_from_module_table( symbol_table, engine::ModuleAPI::Sym_UpdateAudio );
builder.print( parse_variable( token_fmt( "symbol", symbol_on_module_load, stringize(
constexpr const Str symbol_on_module_load = str_ascii("<symbol>");
))));
builder.print( parse_variable( token_fmt( "symbol", symbol_startup, stringize(
constexpr const Str symbol_startup = str_ascii("<symbol>");
))));
builder.print( parse_variable( token_fmt( "symbol", symbol_shutdown, stringize(
constexpr const Str symbol_shutdown = str_ascii("<symbol>");
))));
builder.print( parse_variable( token_fmt( "symbol", symbol_update_and_render, stringize(
constexpr const Str symbol_update_and_render = str_ascii("<symbol>");
))));
builder.print( parse_variable( token_fmt( "symbol", symbol_update_audio, stringize(
constexpr const Str symbol_update_audio = str_ascii("<symbol>");
))));
builder.print_fmt( "\nNS_ENGINE_END" );
builder.print( fmt_newline );
builder.write();
#pragma pop_macro("str_ascii")
log_fmt("Generaton finished for Handmade Hero: Platform Module\n");
// gen::deinit();
return 0;
}
#endif

View File

@ -23056,7 +23056,7 @@ internal CodeVar parse_variable()
// Ignore const specifiers, they're handled by the type
if ( spec == ESpecifier::Const )
continue;
break;
specs_found[ NumSpecifiers ] = spec;
NumSpecifiers++;

3
project/gen/Readme.md Normal file
View File

@ -0,0 +1,3 @@
# Universal Generated Code
This is for generated code used for multiple modules.

View File

@ -0,0 +1,17 @@
#pragma once
#include "platform/platform.hpp"
NS_ENGINE_BEGIN
constexpr
Str const symbol_on_module_load = str_ascii("?on_module_reload@engine@@YAXPEAUMemory@1@PEAUModuleAPI@platform@@@Z");
constexpr
Str const symbol_startup = str_ascii("?startup@engine@@YAXPEAUMemory@1@PEAUModuleAPI@platform@@@Z");
constexpr
Str const symbol_shutdown = str_ascii("?shutdown@engine@@YAXPEAUMemory@1@PEAUModuleAPI@platform@@@Z");
constexpr
Str const symbol_update_and_render = str_ascii("?update_and_render@engine@@YAXPEAUInputState@1@PEAUOffscreenBuffer@1@PEAUMemory@1@PEAUModuleAPI@platform@@@Z");
constexpr
Str const symbol_update_audio = str_ascii("?update_audio@engine@@YAXPEAUAudioBuffer@1@PEAUMemory@1@PEAUModuleAPI@platform@@@Z");
NS_ENGINE_END

View File

@ -53,51 +53,6 @@ struct File
u32 Size;
};
// TODO(Ed): This also assumes the symbol name is always within size of the provided buffer, needs to fail if not.
// Note: This is a temporary solution until there is more infrastructure for the engine to use.
void get_symbol_from_module_table( File symbol_table, u32 symbol_ID, char* symbol_name )
{
struct Token
{
char const* Ptr;
u32 Len;
};
Token tokens[256] = {};
s32 idx = 0;
char const* scanner = rcast( char const*, symbol_table.Data );
u32 left = symbol_table.Size;
while ( left )
{
if ( *scanner == '\n' || *scanner == '\r' )
{
++ scanner;
-- left;
}
else
{
tokens[idx].Ptr = scanner;
while ( left && *scanner != '\r' && *scanner != '\n' )
{
-- left;
++ scanner;
++ tokens[idx].Len;
}
++ idx;
}
}
Token& token = tokens[symbol_ID];
while ( token.Len -- )
{
*symbol_name = *token.Ptr;
++ symbol_name;
++ token.Ptr;
}
*symbol_name = '\0';
}
#pragma region Settings Exposure
// Exposing specific properties for user configuration in settings

View File

@ -26,6 +26,8 @@
#include "engine/engine.hpp"
#include "platform_engine_api.hpp"
#include "gen/engine_symbol_table.hpp"
#if 1
// TODO(Ed): Redo these macros properly later.
@ -1086,39 +1088,12 @@ engine::ModuleAPI load_engine_module_api()
return {};
}
constexpr Str fname_handmade_engine_symbols = str_ascii("handmade_engine.symbols");
StrFixed< S16_MAX > path_handmade_engine_symbols { 0, {} };
path_handmade_engine_symbols.concat( Path_Binaries, fname_handmade_engine_symbols );
File symbol_table {};
symbol_table.Path = path_handmade_engine_symbols;
if ( file_read_content( & symbol_table ), symbol_table.Size == 0 )
{
fatal( "Failed to load symbol table for handmade engine module!" );
return {};
}
// TODO(Ed) : Clean this up later when Casey makes strings. (If he doesn't we'll do it)
char symbol_on_module_reload[256];
char symboL_startup[256];
char symboL_shutdown[256];
char symboL_update_and_render[256];
char symbol_update_audio[256];
get_symbol_from_module_table( symbol_table, ModuleAPI::Sym_OnModuleReload, symbol_on_module_reload );
get_symbol_from_module_table( symbol_table, ModuleAPI::Sym_Startup, symboL_startup );
get_symbol_from_module_table( symbol_table, ModuleAPI::Sym_Shutdown, symboL_shutdown );
get_symbol_from_module_table( symbol_table, ModuleAPI::Sym_UpdateAndRender, symboL_update_and_render );
get_symbol_from_module_table( symbol_table, ModuleAPI::Sym_UpdateAudio, symbol_update_audio );
file_close( & symbol_table );
engine::ModuleAPI engine_api {};
engine_api.on_module_reload = get_procedure_from_library< engine::OnModuleRelaodFn > ( Lib_Handmade_Engine, symbol_on_module_reload );
engine_api.startup = get_procedure_from_library< engine::StartupFn > ( Lib_Handmade_Engine, symboL_startup );
engine_api.shutdown = get_procedure_from_library< engine::ShutdownFn > ( Lib_Handmade_Engine, symboL_shutdown );
engine_api.update_and_render = get_procedure_from_library< engine::UpdateAndRenderFn >( Lib_Handmade_Engine, symboL_update_and_render );
engine_api.update_audio = get_procedure_from_library< engine::UpdateAudioFn > ( Lib_Handmade_Engine, symbol_update_audio );
engine_api.on_module_reload = get_procedure_from_library< engine::OnModuleRelaodFn > ( Lib_Handmade_Engine, engine::symbol_on_module_load );
engine_api.startup = get_procedure_from_library< engine::StartupFn > ( Lib_Handmade_Engine, engine::symbol_startup );
engine_api.shutdown = get_procedure_from_library< engine::ShutdownFn > ( Lib_Handmade_Engine, engine::symbol_shutdown );
engine_api.update_and_render = get_procedure_from_library< engine::UpdateAndRenderFn >( Lib_Handmade_Engine, engine::symbol_update_and_render );
engine_api.update_audio = get_procedure_from_library< engine::UpdateAudioFn > ( Lib_Handmade_Engine, engine::symbol_update_audio );
engine_api.IsValid =
engine_api.on_module_reload