diff --git a/.gitignore b/.gitignore
index ca6169a..c29ce1e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,4 @@ vc140.pdb
build
**/*.dll
+data/test.out
diff --git a/HandmadeHero.10x b/HandmadeHero.10x
index 227eb7d..40db348 100644
--- a/HandmadeHero.10x
+++ b/HandmadeHero.10x
@@ -8,8 +8,8 @@
true
false
false
- pwsh $(WorkspaceDirectory)/scripts/build.ps1 msvc
- pwsh $(WorkspaceDirectory)/scripts/clean; $(WorkspaceDirectory)scripts/build msvc
+ pwsh $(WorkspaceDirectory)/scripts/build.ps1 msvc dev debug
+ pwsh $(WorkspaceDirectory)/scripts/clean.ps1; $(WorkspaceDirectory)scripts/build.ps1 msvc dev debug
pwsh $(WorkspaceDirectory)/scripts/clean.ps1
@@ -21,8 +21,9 @@
false
- Debug
- Release
+ Dev Optimzied
+ Dev
+ Optimized
x64
@@ -41,6 +42,8 @@
UNICODE
_UNICODE
GEN_TIME
+ Build_Debug
+ Build_Development
diff --git a/docs/Day 016.md b/docs/Day 016.md
new file mode 100644
index 0000000..b1644cc
--- /dev/null
+++ b/docs/Day 016.md
@@ -0,0 +1,3 @@
+# Day 16
+
+Finding out about the linker's map file was nice.
diff --git a/project/engine.cpp b/project/engine.cpp
index 2fe426f..aee9068 100644
--- a/project/engine.cpp
+++ b/project/engine.cpp
@@ -17,10 +17,10 @@ using GetSoundSampleValueFn = s16( EngineState* state, SoundBuffer* sound_buffer
internal s16
square_wave_sample_value( EngineState* state, SoundBuffer* sound_buffer )
{
- s16 sample_value = (sound_buffer->RunningSampleIndex / (state->WavePeriod / 2) ) % 2 ?
+ s32 sample_value = (sound_buffer->RunningSampleIndex / (state->WavePeriod / 2) ) % 2 ?
state->ToneVolume : - state->ToneVolume;
- return sample_value;
+ return scast(s16, sample_value);
}
internal s16
@@ -30,7 +30,7 @@ sine_wave_sample_value( EngineState* state, SoundBuffer* sound_buffer )
// time = TAU * (f32)sound_buffer->RunningSampleIndex / (f32)SoundTest_WavePeriod;
f32 sine_value = sinf( time );
- s16 sample_value = scast(u16, sine_value * state->ToneVolume);
+ s16 sample_value = scast(s16, sine_value * scast(f32, state->ToneVolume));
time += TAU * 1.0f / scast(f32, state->WavePeriod );
return sample_value;
@@ -40,7 +40,7 @@ internal void
output_sound( EngineState* state, SoundBuffer* sound_buffer, GetSoundSampleValueFn* get_sample_value )
{
s16* sample_out = sound_buffer->Samples;
- for ( u32 sample_index = 0; sample_index < sound_buffer->NumSamples; ++ sample_index )
+ for ( s32 sample_index = 0; sample_index < sound_buffer->NumSamples; ++ sample_index )
{
s16 sample_value = get_sample_value( state, sound_buffer );
sound_buffer->RunningSampleIndex++;
@@ -97,7 +97,7 @@ render_weird_graident(OffscreenBuffer* buffer, u32 x_offset, u32 y_offset )
#endif
- *pixel++ = (red << 16) | (green << 8) | blue;
+ *pixel++ = u32(red << 16) | u32(green << 8) | blue;
}
wildcard += 0.5375f;
row += buffer->Pitch;
@@ -120,8 +120,7 @@ shutdown()
}
// TODO : I rather expose the back_buffer and sound_buffer using getters for access in any function.
-internal void
-update_and_render( InputState* input, OffscreenBuffer* back_buffer, SoundBuffer* sound_buffer, Memory* memory )
+void update_and_render( InputState* input, OffscreenBuffer* back_buffer, SoundBuffer* sound_buffer, Memory* memory )
{
// Graphics & Input Test
local_persist u32 x_offset = 0;
@@ -178,8 +177,8 @@ update_and_render( InputState* input, OffscreenBuffer* back_buffer, SoundBuffer*
y_offset += pad->DPad.Down.State;
y_offset -= pad->DPad.Up.State;
- x_offset += pad->Stick.Left.X.End;
- y_offset += pad->Stick.Left.Y.End;
+ x_offset += scast(u32, pad->Stick.Left.X.End);
+ y_offset += scast(u32, pad->Stick.Left.Y.End);
if ( pad->Triangle.State )
{
@@ -211,17 +210,17 @@ update_and_render( InputState* input, OffscreenBuffer* back_buffer, SoundBuffer*
// TODO(Ed) : Add rumble test
}
}
- else if ( controller->XPad )
+ if ( controller->XPad )
{
XInputPadState* pad = controller->XPad;
x_offset += pad->DPad.Right.State;
x_offset -= pad->DPad.Left.State;
- y_offset += pad->DPad.Down.State;
- y_offset -= pad->DPad.Up.State;
+ y_offset -= pad->DPad.Down.State;
+ y_offset += pad->DPad.Up.State;
- x_offset += pad->Stick.Left.X.End;
- y_offset += pad->Stick.Left.Y.End;
+ x_offset += scast(u32, pad->Stick.Left.X.End);
+ y_offset += scast(u32, pad->Stick.Left.Y.End);
if ( pad->Y.State )
{
@@ -253,6 +252,44 @@ update_and_render( InputState* input, OffscreenBuffer* back_buffer, SoundBuffer*
// TODO(Ed) : Add rumble test
}
}
+ if ( controller->Keyboard )
+ {
+ KeyboardState* keyboard = controller->Keyboard;
+
+ x_offset += keyboard->D.State;
+ x_offset -= keyboard->A.State;
+ y_offset += keyboard->W.State;
+ y_offset -= keyboard->S.State;
+
+ if ( keyboard->Esc.State )
+ {
+ // TODO : Add exit game
+ }
+
+ if ( keyboard->Space.State )
+ {
+ wave_switch ^= true;
+ }
+
+ if ( keyboard->Up.State )
+ {
+ state->ToneVolume += 10;
+ }
+ if ( keyboard->Down.State )
+ {
+ state->ToneVolume -= 10;
+ }
+ if ( keyboard->Left.State )
+ {
+ state->WaveToneHz -= 1;
+ state->WavePeriod = sound_buffer->SamplesPerSecond / state->WaveToneHz;
+ }
+ if ( keyboard->Right.State )
+ {
+ state->WaveToneHz += 1;
+ state->WavePeriod = sound_buffer->SamplesPerSecond / state->WaveToneHz;
+ }
+ }
// TODO(Ed) : Allow sample offsets here for more robust platform options
if ( ! wave_switch )
diff --git a/project/engine.h b/project/engine.h
index 52f1eb2..9ee6320 100644
--- a/project/engine.h
+++ b/project/engine.h
@@ -50,6 +50,7 @@ struct SoundBuffer
u32 RunningSampleIndex;
s32 SamplesPerSecond;
s32 NumSamples;
+ char _PAD_[4];
};
struct DigitalBtn
@@ -76,10 +77,18 @@ struct AnalogStick
struct KeyboardState
{
+ DigitalBtn Q;
+ DigitalBtn E;
DigitalBtn W;
DigitalBtn A;
DigitalBtn S;
DigitalBtn D;
+ DigitalBtn Esc;
+ DigitalBtn Up;
+ DigitalBtn Down;
+ DigitalBtn Left;
+ DigitalBtn Right;
+ DigitalBtn Space;
};
struct MousesState
diff --git a/project/platform/handmade_win32.cpp b/project/platform/handmade_win32.cpp
index fa2f96a..e2497cf 100644
--- a/project/platform/handmade_win32.cpp
+++ b/project/platform/handmade_win32.cpp
@@ -17,7 +17,7 @@
- GetKeyboardLayout (for French keyboards, international WASD support)
*/
-#if __clang__
+#ifdef __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-const-variable"
#pragma clang diagnostic ignored "-Wswitch"
@@ -77,11 +77,12 @@ global bool Running;
struct OffscreenBuffer
{
BITMAPINFO Info;
+ char _PAD_[4];
void* Memory; // Lets use directly mess with the "pixel's memory buffer"
- u32 Width;
- u32 Height;
- u32 Pitch;
- u32 BytesPerPixel;
+ s32 Width;
+ s32 Height;
+ s32 Pitch;
+ s32 BytesPerPixel;
};
struct WinDimensions
@@ -115,7 +116,6 @@ global s16* SoundBufferSamples;
#if Build_Debug
-internal
void debug_file_free_content( Debug_FileContent* content )
{
if ( content->Data)
@@ -125,7 +125,6 @@ void debug_file_free_content( Debug_FileContent* content )
}
}
-internal
Debug_FileContent debug_file_read_content( char* file_path )
{
Debug_FileContent result {};
@@ -165,7 +164,6 @@ Debug_FileContent debug_file_read_content( char* file_path )
return result;
}
-internal
b32 debug_file_write_content( char* file_path, u32 content_size, void* content_memory )
{
HANDLE file_handle = CreateFileA( file_path
@@ -202,12 +200,15 @@ init_sound(HWND window_handle, s32 samples_per_second, s32 buffer_size )
}
// Get direct sound object
+#pragma warning( push )
+#pragma warning( disable: 4191 )
direct_sound_create = rcast( DirectSoundCreateFn*, GetProcAddress( sound_library, "DirectSoundCreate" ));
if ( ! ensure( direct_sound_create, "Failed to get direct_sound_create_procedure" ) )
{
// TOOD : Diagnostic
return;
}
+#pragma warning( pop )
LPDIRECTSOUND direct_sound;
if ( ! SUCCEEDED(direct_sound_create( 0, & direct_sound, 0 )) )
@@ -223,7 +224,7 @@ init_sound(HWND window_handle, s32 samples_per_second, s32 buffer_size )
wave_format {};
wave_format.wFormatTag = WAVE_FORMAT_PCM; /* format type */
wave_format.nChannels = 2; /* number of channels (i.e. mono, stereo...) */
- wave_format.nSamplesPerSec = samples_per_second; /* sample rate */
+ wave_format.nSamplesPerSec = scast(u32, samples_per_second); /* sample rate */
wave_format.wBitsPerSample = 16; /* number of bits per sample of mono data */
wave_format.nBlockAlign = wave_format.nChannels * wave_format.wBitsPerSample / 8 ; /* block size of data */
wave_format.nAvgBytesPerSec = wave_format.nSamplesPerSec * wave_format.nBlockAlign; /* for buffer estimation */
@@ -453,88 +454,6 @@ main_window_callback(
}
break;
- case WM_SYSKEYDOWN:
- case WM_SYSKEYUP:
- case WM_KEYDOWN:
- case WM_KEYUP:
- {
- u32 vk_code = w_param;
- b32 is_down = (l_param >> 31) == 0;
- b32 was_down = (l_param >> 30);
- b32 alt_down = (l_param & (1 << 29));
-
- switch ( vk_code )
- {
- case 'Q':
- {
- OutputDebugStringA( "Q\n" );
- }
- break;
- case 'E':
- {
- OutputDebugStringA( "E\n" );
- }
- break;
- case 'W':
- {
- OutputDebugStringA( "W\n" );
- }
- break;
- case 'A':
- {
- OutputDebugStringA( "A\n" );
- }
- break;
- case 'S':
- {
- OutputDebugStringA( "S\n" );
- }
- break;
- case 'D':
- {
- OutputDebugStringA( "D\n" );
- }
- break;
- case VK_ESCAPE:
- {
- OutputDebugStringA( "Escape\n" );
- }
- break;
- case VK_UP:
- {
- OutputDebugStringA( "Up\n" );
- }
- break;
- case VK_DOWN:
- {
- OutputDebugStringA( "Down\n" );
- }
- break;
- case VK_LEFT:
- {
- OutputDebugStringA( "Left\n" );
- }
- break;
- case VK_RIGHT:
- {
- OutputDebugStringA( "Right\n" );
- }
- break;
- case VK_SPACE:
- {
- OutputDebugStringA( "Space\n" );
- }
- break;
- case VK_F4:
- {
- if ( alt_down )
- Running = false;
- }
- break;
- }
- }
- break;
-
case WM_PAINT:
{
PAINTSTRUCT info;
@@ -576,6 +495,13 @@ input_process_digital_btn( engine::DigitalBtn* old_state, engine::DigitalBtn* ne
#undef had_transition
}
+internal void
+input_process_keyboard_key( engine::DigitalBtn* key, b32 is_down )
+{
+ key->State = is_down;
+ key->HalfTransitions += is_down;
+}
+
NS_PLATFORM_END
int CALLBACK
@@ -672,7 +598,7 @@ WinMain(
}
}
- WinDimensions dimensions = get_window_dimensions( window_handle );
+ // WinDimensions dimensions = get_window_dimensions( window_handle );
resize_dib_section( &BackBuffer, 1280, 720 );
SoundOutput sound_output;
@@ -709,6 +635,10 @@ WinMain(
engine::InputState input {};
+ engine::KeyboardState keyboard;
+ input.Controllers[0].Keyboard = & keyboard;
+ // Important: Assuming keyboard always connected for now, and assigning to first controller.
+
using EngineXInputPadStates = engine::XInputPadState[ Max_Controllers ];
EngineXInputPadStates xpad_states[2];
EngineXInputPadStates* old_xpads = & xpad_states[0];
@@ -754,9 +684,11 @@ WinMain(
Running = true;
while( Running )
{
+ keyboard = {};
+
// Window Management
{
- if ( PeekMessageW( & window_msg_info, 0, 0, 0, PM_Remove_Messages_From_Queue ) )
+ while ( PeekMessageW( & window_msg_info, 0, 0, 0, PM_Remove_Messages_From_Queue ) )
{
if ( window_msg_info.message == WM_QUIT )
{
@@ -764,8 +696,96 @@ WinMain(
Running = false;
}
- TranslateMessage( & window_msg_info );
- DispatchMessageW( & window_msg_info );
+
+ // Keyboard input handling
+ switch (window_msg_info.message)
+ {
+ case WM_SYSKEYDOWN:
+ case WM_SYSKEYUP:
+ case WM_KEYDOWN:
+ case WM_KEYUP:
+ {
+ WPARAM vk_code = window_msg_info.wParam;
+ b32 is_down = scast(b32, (window_msg_info.lParam >> 31) == 0 );
+ b32 was_down = scast(b32, (window_msg_info.lParam >> 30) );
+ b32 alt_down = scast(b32, (window_msg_info.lParam & (1 << 29)) );
+
+ switch ( vk_code )
+ {
+ case 'Q':
+ {
+ input_process_keyboard_key( & keyboard.Q, is_down );
+ }
+ break;
+ case 'E':
+ {
+ input_process_keyboard_key( & keyboard.E, is_down );
+ }
+ break;
+ case 'W':
+ {
+ input_process_keyboard_key( & keyboard.W, is_down );
+ }
+ break;
+ case 'A':
+ {
+ input_process_keyboard_key( & keyboard.A, is_down );
+ }
+ break;
+ case 'S':
+ {
+ input_process_keyboard_key( & keyboard.S, is_down );
+ }
+ break;
+ case 'D':
+ {
+ input_process_keyboard_key( & keyboard.D, is_down );
+ }
+ break;
+ case VK_ESCAPE:
+ {
+ input_process_keyboard_key( & keyboard.Esc, is_down );
+ }
+ break;
+ case VK_UP:
+ {
+ input_process_keyboard_key( & keyboard.Up, is_down );
+ }
+ break;
+ case VK_DOWN:
+ {
+ input_process_keyboard_key( & keyboard.Down, is_down );
+ }
+ break;
+ case VK_LEFT:
+ {
+ input_process_keyboard_key( & keyboard.Left, is_down );
+ }
+ break;
+ case VK_RIGHT:
+ {
+ input_process_keyboard_key( & keyboard.Right, is_down );
+ }
+ break;
+ case VK_SPACE:
+ {
+ input_process_keyboard_key( & keyboard.Space, is_down );
+ }
+ break;
+ case VK_F4:
+ {
+ if ( alt_down )
+ Running = false;
+ }
+ break;
+ }
+ }
+ break;
+
+ default:
+ TranslateMessage( & window_msg_info );
+ DispatchMessageW( & window_msg_info );
+ }
}
}
@@ -901,8 +921,8 @@ WinMain(
b32 sound_is_valid = false;
DWORD ds_play_cursor;
DWORD ds_write_cursor;
- DWORD byte_to_lock;
- DWORD bytes_to_write;
+ DWORD byte_to_lock = 0;
+ DWORD bytes_to_write = 0;
if ( SUCCEEDED( DS_SecondaryBuffer->GetCurrentPosition( & ds_play_cursor, & ds_write_cursor ) ))
{
@@ -971,10 +991,10 @@ WinMain(
#define MS_PER_SECOND 1000
#define MegaCycles_Per_Second (1000 * 1000)
u64 cycles_elapsed = end_cycle_count - last_cycle_time;
- s32 mega_cycles_elapsed = cycles_elapsed / MegaCycles_Per_Second;
+ u64 mega_cycles_elapsed = cycles_elapsed / MegaCycles_Per_Second;
u64 frame_time_elapsed = frame_cycle_time_end - last_frame_time;
- u32 ms_per_frame = MS_PER_SECOND * frame_time_elapsed / perf_counter_frequency;
- u32 fps = perf_counter_frequency / frame_time_elapsed;
+ u32 ms_per_frame = scast(u32, MS_PER_SECOND * frame_time_elapsed / perf_counter_frequency);
+ u32 fps = scast(u32, perf_counter_frequency / frame_time_elapsed);
// char ms_timing_debug[256] {};
// wsprintfA( ms_timing_debug, "%d ms\n" "FPS: %d\n" "mega cycles: %d\n", ms_per_frame, fps, mega_cycles_elapsed );
diff --git a/project/platform/jsl.h b/project/platform/jsl.h
index 056fc10..577bc95 100644
--- a/project/platform/jsl.h
+++ b/project/platform/jsl.h
@@ -1,12 +1,19 @@
// Joyshock grime wrapper
-#if __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wreturn-type-c-linkage"
+#include "grime.h"
+
+#ifdef COMPILER_CLANG
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wreturn-type-c-linkage"
+#elif COMPILER_MSVC
+# pragma warning( push )
+# pragma warning( disable: 4820 )
#endif
#include "JoyShockLibrary/JoyShockLibrary.h"
-#if __clang__
-#pragma clang diagnostic pop
+#ifdef COMPILER_CLANG
+# pragma clang diagnostic pop
+#elif COMPILER_MSVC
+# pragma warning( pop )
#endif
\ No newline at end of file
diff --git a/project/platform/math_constants.h b/project/platform/math_constants.h
index 1fce625..e80e69e 100644
--- a/project/platform/math_constants.h
+++ b/project/platform/math_constants.h
@@ -14,7 +14,7 @@
# define TAU_OVER_4 1.570796326794896619231321691639751442f
# define TAU_OVER_8 0.785398163397448309615660845819875721f
-# define E 2.71828182845904523536f
+# define Euler 2.71828182845904523536f
# define SQRT_TWO 1.41421356237309504880168872420969808f
# define SQRT_THREE 1.73205080756887729352744634150587236f
# define SQRT_FIVE 2.23606797749978969640917366873127623f
diff --git a/project/platform/platform.h b/project/platform/platform.h
index 75b9834..d0792bf 100644
--- a/project/platform/platform.h
+++ b/project/platform/platform.h
@@ -4,6 +4,16 @@
*/
#pragma once
+
+#pragma warning( disable: 4201 ) // Support for non-standard nameless struct or union extesnion
+#pragma warning( disable: 4100 ) // Support for unreferenced formal parameters
+#pragma warning( disable: 4800 ) // Support implicit conversion to bools
+#pragma warning( disable: 4365 ) // Support for signed/unsigned mismatch auto-conversion
+#pragma warning( disable: 4189 ) // Support for unused variables
+#pragma warning( disable: 4514 ) // Support for unused inline functions
+#pragma warning( disable: 4505 ) // Support for unused static functions
+#pragma warning( disable: 5045 ) // Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
+
#include "grime.h"
#include "macros.h"
#include "generics.h"
@@ -22,8 +32,9 @@ NS_PLATFORM_BEGIN
struct Debug_FileContent
{
- u32 Size;
void* Data;
+ u32 Size;
+ char _PAD_[4];
};
void debug_file_free_content ( Debug_FileContent* file_content );
diff --git a/project/platform/win32.h b/project/platform/win32.h
index cea9628..5ce2223 100644
--- a/project/platform/win32.h
+++ b/project/platform/win32.h
@@ -3,11 +3,15 @@
*/
#pragma once
+#pragma warning( push )
+#pragma warning( disable: 5105 )
+#pragma warning( disable: 4820 )
#define WIN32_LEAN_AND_MEAN
#include
#include
#include
#include
+#pragma warning( pop )
// #include "windows/windows_base.h"
// #include "windows/window.h"
@@ -146,8 +150,11 @@ xinput_load_library_bindings()
{
HMODULE xinput_lib = LoadLibraryA( XINPUT_DLL_A );
+#pragma warning( push )
+#pragma warning( disable: 4191 )
xinput_get_state = rcast( XInputGetStateFn*, GetProcAddress( xinput_lib, "XInputGetState" ));
xinput_set_state = rcast( XInputSetStateFn*, GetProcAddress( xinput_lib, "XInputSetState" ));
+#pragma warning( pop )
}
#pragma endregion XInput
diff --git a/scripts/build.ps1 b/scripts/build.ps1
index 42edb21..18f44bc 100644
--- a/scripts/build.ps1
+++ b/scripts/build.ps1
@@ -131,6 +131,7 @@ if ( $vendor -match "clang" )
$flag_library = '-l'
$flag_library_path = '-L'
$flag_linker = '-Wl,'
+ $flag_link_mapfile = '-Map'
$flag_link_win_subsystem_console = '/SUBSYSTEM:CONSOLE'
$flag_link_win_subsystem_windows = '/SUBSYSTEM:WINDOWS'
$flag_link_win_machine_32 = '/MACHINE:X86'
@@ -141,6 +142,7 @@ if ( $vendor -match "clang" )
$flag_no_optimization = '-O0'
$flag_optimize_fast = '-O2'
$flag_optimize_size = '-O1'
+ $flag_optimize_intrinsics = '-Oi'
$flag_path_output = '-o'
$flag_preprocess_non_intergrated = '-no-integrated-cpp'
$flag_profiling_debug = '-fdebug-info-for-profiling'
@@ -149,7 +151,7 @@ if ( $vendor -match "clang" )
$flag_target_arch = '-target'
$flag_wall = '-Wall'
$flag_warning = '-W'
- $flag_warning_as_error = '-Werror'
+ $flag_warnings_as_errors = '-Werror'
$flag_win_nologo = '/nologo'
$ignore_warning_ms_include = 'no-microsoft-include'
@@ -175,6 +177,7 @@ if ( $vendor -match "clang" )
$object = $executable -replace '\.exe', '.obj'
$pdb = $executable -replace '\.exe', '.pdb'
+ $map = $executable -replace '\.exe', '.map'
$compiler_args += @(
$flag_no_color_diagnostics,
@@ -213,6 +216,7 @@ if ( $vendor -match "clang" )
if ( $debug ) {
$linker_args += $flag_link_win_debug
$linker_args += $flag_link_win_pdb + $pdb
+ $linker_args += $flag_link_mapfile + $map
}
$libraries | ForEach-Object {
@@ -241,7 +245,7 @@ if ( $vendor -match "msvc" )
$flag_compile = '/c'
$flag_debug = '/Zi'
$flag_define = '/D'
- $flag_exceptions_disabled = '/EHs-c-'
+ $flag_exceptions_disabled = '/EHsc-'
$flag_RTTI_disabled = '/GR-'
$flag_include = '/I'
$flag_full_src_path = '/FC'
@@ -249,6 +253,8 @@ if ( $vendor -match "msvc" )
$flag_dll = '/LD'
$flag_dll_debug = '/LDd'
$flag_linker = '/link'
+ $flag_link_mapfile = '/MAP:'
+ $flag_link_optimize_references = '/OPT:REF'
$flag_link_win_debug = '/DEBUG'
$flag_link_win_pdb = '/PDB:'
$flag_link_win_machine_32 = '/MACHINE:X86'
@@ -263,6 +269,7 @@ if ( $vendor -match "msvc" )
$flag_no_optimization = '/Od'
$flag_optimize_fast = '/O2'
$flag_optimize_size = '/O1'
+ $flag_optimize_intrinsics = '/Oi'
$flag_optimized_debug = '/Zo'
$flag_out_name = '/OUT:'
$flag_path_interm = '/Fo'
@@ -271,6 +278,8 @@ if ( $vendor -match "msvc" )
$flag_preprocess_conform = '/Zc:preprocessor'
$flag_set_stack_size = '/F'
$flag_syntax_only = '/Zs'
+ $flag_wall = '/Wall'
+ $flag_warnings_as_errors = '/WX'
# This works because this project uses a single unit to build
function build-simple
@@ -280,13 +289,14 @@ if ( $vendor -match "msvc" )
$object = $executable -replace '\.exe', '.obj'
$pdb = $executable -replace '\.exe', '.pdb'
+ $map = $executable -replace '\.exe', '.map'
$compiler_args += @(
$flag_nologo,
# $flag_all_cpp,
- # $flag_exceptions_disabled,
- # ( $flag_define + '_HAS_EXCEPTIONS=0' ),
- # $flag_RTTI_disabled,
+ $flag_exceptions_disabled,
+ ( $flag_define + '_HAS_EXCEPTIONS=0' ),
+ $flag_RTTI_disabled,
$flag_preprocess_conform,
$flag_full_src_path,
( $flag_path_interm + $path_build + '\' ),
@@ -328,6 +338,7 @@ if ( $vendor -match "msvc" )
if ( $debug ) {
$linker_args += $flag_link_win_debug
$linker_args += $flag_link_win_pdb + $pdb
+ $linker_args += $flag_link_mapfile + $map
}
else {
}
@@ -417,6 +428,11 @@ $compiler_args = @(
($flag_define + 'UNICODE'),
($flag_define + '_UNICODE')
# ($flag_set_stack_size + $stack_size)
+ $flag_wall
+ $flag_warnings_as_errors
+ $flag_optimize_intrinsics
+
+ ($flag_define + 'Build_DLL=0' )
)
if ( $dev ) {
@@ -434,6 +450,7 @@ $linker_args = @(
$lib_jsl,
$flag_link_win_subsystem_windows
+ $flag_link_optimize_references
)
build-simple $includes $compiler_args $linker_args $unit $executable
diff --git a/scripts/handmade.rdbg b/scripts/handmade.rdbg
index 7e83307..49d1ca7 100644
Binary files a/scripts/handmade.rdbg and b/scripts/handmade.rdbg differ