Remove oc_scratch()/oc_scratch_next() in favour of safer oc_scratch_begin()/oc_scratch_end()

This commit is contained in:
Martin Fouilleul 2023-09-13 18:10:47 +02:00
parent a0f9ab5f85
commit 8cd571f923
25 changed files with 203 additions and 146 deletions

View File

@ -287,6 +287,7 @@ int check_collision(oc_rect block)
ORCA_EXPORT void oc_on_frame_refresh(void) ORCA_EXPORT void oc_on_frame_refresh(void)
{ {
oc_arena_scope scratch = oc_scratch_begin();
f32 aspect = frameSize.x / frameSize.y; f32 aspect = frameSize.x / frameSize.y;
if(leftDown) if(leftDown)
@ -422,7 +423,7 @@ ORCA_EXPORT void oc_on_frame_refresh(void)
oc_rounded_rectangle_stroke(r.x, r.y, r.w, r.h, 4); oc_rounded_rectangle_stroke(r.x, r.y, r.w, r.h, 4);
int fontSize = 18; int fontSize = 18;
oc_str8 text = oc_str8_pushf(oc_scratch(), "%d", blockHealth[i]); oc_str8 text = oc_str8_pushf(scratch.arena, "%d", blockHealth[i]);
oc_rect textRect = oc_font_text_metrics(font, fontSize, text).ink; oc_rect textRect = oc_font_text_metrics(font, fontSize, text).ink;
oc_vec2 textPos = { oc_vec2 textPos = {
@ -457,7 +458,7 @@ ORCA_EXPORT void oc_on_frame_refresh(void)
// draw score text // draw score text
{ {
oc_move_to(20, 20); oc_move_to(20, 20);
oc_str8 text = oc_str8_pushf(oc_scratch(), "Destroy all %d blocks to win! Current score: %d", NUM_BLOCKS_TO_WIN, score); oc_str8 text = oc_str8_pushf(scratch.arena, "Destroy all %d blocks to win! Current score: %d", NUM_BLOCKS_TO_WIN, score);
oc_vec2 textPos = { 20, 20 }; oc_vec2 textPos = { 20, 20 };
oc_matrix_multiply_push(flip_y_at(textPos)); oc_matrix_multiply_push(flip_y_at(textPos));
{ {
@ -474,5 +475,5 @@ ORCA_EXPORT void oc_on_frame_refresh(void)
oc_render(canvas); oc_render(canvas);
oc_surface_present(surface); oc_surface_present(surface);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }

View File

@ -25,13 +25,15 @@ ORCA_EXPORT void oc_on_init(void)
//NOTE: load font //NOTE: load font
{ {
oc_arena_scope scratch = oc_scratch_begin();
oc_file file = oc_file_open(OC_STR8("/OpenSansLatinSubset.ttf"), OC_FILE_ACCESS_READ, 0); oc_file file = oc_file_open(OC_STR8("/OpenSansLatinSubset.ttf"), OC_FILE_ACCESS_READ, 0);
if(oc_file_last_error(file) != OC_IO_OK) if(oc_file_last_error(file) != OC_IO_OK)
{ {
oc_log_error("Couldn't open file OpenSansLatinSubset.ttf\n"); oc_log_error("Couldn't open file OpenSansLatinSubset.ttf\n");
} }
u64 size = oc_file_size(file); u64 size = oc_file_size(file);
char* buffer = (char*)oc_arena_push(oc_scratch(), size); char* buffer = (char*)oc_arena_push(scratch.arena, size);
oc_file_read(file, size, buffer); oc_file_read(file, size, buffer);
oc_file_close(file); oc_file_close(file);
oc_unicode_range ranges[5] = { OC_UNICODE_BASIC_LATIN, oc_unicode_range ranges[5] = { OC_UNICODE_BASIC_LATIN,
@ -41,9 +43,10 @@ ORCA_EXPORT void oc_on_init(void)
OC_UNICODE_SPECIALS }; OC_UNICODE_SPECIALS };
font = oc_font_create_from_memory(oc_str8_from_buffer(size, buffer), 5, ranges); font = oc_font_create_from_memory(oc_str8_from_buffer(size, buffer), 5, ranges);
oc_scratch_end(scratch);
} }
oc_arena_clear(oc_scratch());
oc_arena_init(&textArena); oc_arena_init(&textArena);
} }
@ -82,6 +85,8 @@ void widget_end_view(void)
ORCA_EXPORT void oc_on_frame_refresh(void) ORCA_EXPORT void oc_on_frame_refresh(void)
{ {
oc_arena_scope scratch = oc_scratch_begin();
oc_ui_style defaultStyle = { .font = font }; oc_ui_style defaultStyle = { .font = font };
oc_ui_style_mask defaultMask = OC_UI_STYLE_FONT; oc_ui_style_mask defaultMask = OC_UI_STYLE_FONT;
@ -285,7 +290,7 @@ ORCA_EXPORT void oc_on_frame_refresh(void)
.size.height = { OC_UI_SIZE_TEXT } }, .size.height = { OC_UI_SIZE_TEXT } },
OC_UI_STYLE_SIZE); OC_UI_STYLE_SIZE);
static oc_str8 text = { 0 }; static oc_str8 text = { 0 };
oc_ui_text_box_result res = oc_ui_text_box("textbox", oc_scratch(), text); oc_ui_text_box_result res = oc_ui_text_box("textbox", scratch.arena, text);
if(res.changed) if(res.changed)
{ {
oc_arena_clear(&textArena); oc_arena_clear(&textArena);
@ -368,5 +373,5 @@ ORCA_EXPORT void oc_on_frame_refresh(void)
oc_render(canvas); oc_render(canvas);
oc_surface_present(surface); oc_surface_present(surface);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }

View File

@ -41,14 +41,17 @@ int main()
} }
//NOTE: create atlas //NOTE: create atlas
oc_arena_scope scratch = oc_scratch_begin();
oc_arena permanentArena = { 0 }; oc_arena permanentArena = { 0 };
oc_arena_init(&permanentArena); oc_arena_init(&permanentArena);
oc_rect_atlas* atlas = oc_rect_atlas_create(&permanentArena, 16000, 16000); oc_rect_atlas* atlas = oc_rect_atlas_create(&permanentArena, 16000, 16000);
oc_image atlasImage = oc_image_create(surface, 16000, 16000); oc_image atlasImage = oc_image_create(surface, 16000, 16000);
oc_str8 path1 = oc_path_executable_relative(oc_scratch(), OC_STR8("../../../sketches/resources/triceratops.png")); oc_str8 path1 = oc_path_executable_relative(scratch.arena, OC_STR8("../../../sketches/resources/triceratops.png"));
oc_str8 path2 = oc_path_executable_relative(oc_scratch(), OC_STR8("../../../sketches/resources/Top512.png")); oc_str8 path2 = oc_path_executable_relative(scratch.arena, OC_STR8("../../../sketches/resources/Top512.png"));
oc_image_region image1 = oc_image_atlas_alloc_from_file(atlas, atlasImage, path1, false); oc_image_region image1 = oc_image_atlas_alloc_from_file(atlas, atlasImage, path1, false);
oc_image_region image2 = oc_image_atlas_alloc_from_file(atlas, atlasImage, path2, false); oc_image_region image2 = oc_image_atlas_alloc_from_file(atlas, atlasImage, path2, false);
@ -57,11 +60,14 @@ int main()
oc_window_bring_to_front(window); oc_window_bring_to_front(window);
oc_window_focus(window); oc_window_focus(window);
oc_scratch_end(scratch);
while(!oc_should_quit()) while(!oc_should_quit())
{ {
scratch = oc_scratch_begin();
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
switch(event->type) switch(event->type)
{ {
@ -89,7 +95,7 @@ int main()
oc_render(canvas); oc_render(canvas);
oc_surface_present(surface); oc_surface_present(surface);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }
oc_image_atlas_recycle(atlas, image1); oc_image_atlas_recycle(atlas, image1);

View File

@ -51,10 +51,11 @@ int main()
while(!oc_should_quit()) while(!oc_should_quit())
{ {
f64 startTime = oc_clock_time(OC_CLOCK_MONOTONIC); f64 startTime = oc_clock_time(OC_CLOCK_MONOTONIC);
oc_arena_scope* scratch = oc_scratch_begin();
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
switch(event->type) switch(event->type)
{ {
@ -182,7 +183,8 @@ int main()
oc_render(canvas); oc_render(canvas);
oc_surface_present(surface); oc_surface_present(surface);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
frameTime = oc_clock_time(OC_CLOCK_MONOTONIC) - startTime; frameTime = oc_clock_time(OC_CLOCK_MONOTONIC) - startTime;
} }

View File

@ -42,23 +42,28 @@ int main()
} }
//NOTE: create image //NOTE: create image
oc_str8 imagePath = oc_path_executable_relative(oc_scratch(), OC_STR8("../../resources/triceratops.png")); oc_arena_scope* scratch = oc_scratch_begin();
oc_str8 imagePath = oc_path_executable_relative(scratch.arena, OC_STR8("../../resources/triceratops.png"));
oc_image image = oc_image_create_from_file(surface, imagePath, false); oc_image image = oc_image_create_from_file(surface, imagePath, false);
oc_vec2 imageSize = oc_image_size(image); oc_vec2 imageSize = oc_image_size(image);
oc_str8 imagePath2 = oc_path_executable_relative(oc_scratch(), OC_STR8("../../resources/Top512.png")); oc_str8 imagePath2 = oc_path_executable_relative(scratch.arena, OC_STR8("../../resources/Top512.png"));
oc_image image2 = oc_image_create_from_file(surface, imagePath2, false); oc_image image2 = oc_image_create_from_file(surface, imagePath2, false);
oc_vec2 imageSize2 = oc_image_size(image2); oc_vec2 imageSize2 = oc_image_size(image2);
oc_scratch_end(scratch);
// start app // start app
oc_window_bring_to_front(window); oc_window_bring_to_front(window);
oc_window_focus(window); oc_window_focus(window);
while(!oc_should_quit()) while(!oc_should_quit())
{ {
scratch = oc_scratch_begin();
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
switch(event->type) switch(event->type)
{ {
@ -104,7 +109,7 @@ int main()
oc_render(canvas); oc_render(canvas);
oc_surface_present(surface); oc_surface_present(surface);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }
oc_image_destroy(image); oc_image_destroy(image);

View File

@ -23,9 +23,10 @@ int main()
while(!oc_should_quit()) while(!oc_should_quit())
{ {
oc_arena_scope* scratch = oc_scratch_begin();
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
switch(event->type) switch(event->type)
{ {
@ -60,7 +61,7 @@ int main()
break; break;
} }
} }
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }
oc_terminate(); oc_terminate();
return (0); return (0);

View File

@ -58,11 +58,12 @@ int main()
while(!oc_should_quit()) while(!oc_should_quit())
{ {
oc_arena_scope* scratch = oc_scratch_begin();
f64 startTime = oc_clock_time(OC_CLOCK_MONOTONIC); f64 startTime = oc_clock_time(OC_CLOCK_MONOTONIC);
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
switch(event->type) switch(event->type)
{ {
@ -120,7 +121,7 @@ int main()
oc_surface_present(surface1); oc_surface_present(surface1);
oc_surface_present(surface2); oc_surface_present(surface2);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }
oc_canvas_destroy(canvas1); oc_canvas_destroy(canvas1);

View File

@ -64,13 +64,15 @@ static const char* TEST_STRING =
oc_font create_font(const char* path) oc_font create_font(const char* path)
{ {
//NOTE(martin): create font //NOTE(martin): create font
oc_str8 fontPath = oc_path_executable_relative(oc_scratch(), OC_STR8(path)); oc_arena_scope* scratch = oc_scratch_begin()
char* fontPathCString = oc_str8_to_cstring(oc_scratch(), fontPath); oc_str8 fontPath = oc_path_executable_relative(scratch.arena, OC_STR8(path));
char* fontPathCString = oc_str8_to_cstring(scratch.arena, fontPath);
FILE* fontFile = fopen(fontPathCString, "r"); FILE* fontFile = fopen(fontPathCString, "r");
if(!fontFile) if(!fontFile)
{ {
oc_log_error("Could not load font file '%s'\n", fontPathCString); oc_log_error("Could not load font file '%s'\n", fontPathCString);
oc_scratch_end(scratch);
return (oc_font_nil()); return (oc_font_nil());
} }
unsigned char* fontData = 0; unsigned char* fontData = 0;
@ -89,7 +91,7 @@ oc_font create_font(const char* path)
oc_font font = oc_font_create_from_memory(oc_str8_from_buffer(fontDataSize, (char*)fontData), 5, ranges); oc_font font = oc_font_create_from_memory(oc_str8_from_buffer(fontDataSize, (char*)fontData), 5, ranges);
free(fontData); free(fontData);
oc_scratch_end(scratch);
return (font); return (font);
} }
@ -167,10 +169,11 @@ int main()
while(!oc_should_quit()) while(!oc_should_quit())
{ {
f64 startFrameTime = oc_clock_time(OC_CLOCK_MONOTONIC); f64 startFrameTime = oc_clock_time(OC_CLOCK_MONOTONIC);
oc_arena_scope* scratch = oc_scratch_begin();
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
oc_input_process_event(&inputState, event); oc_input_process_event(&inputState, event);
@ -250,7 +253,7 @@ int main()
*/ */
oc_matrix_multiply_push((oc_mat2x3){ zoom, 0, 0, oc_matrix_multiply_push((oc_mat2x3){ zoom, 0, 0,
0, zoom, 0 }); 0, zoom, 0 });
oc_set_color_rgba(1, 1, 1, 1); oc_set_color_rgba(1, 1, 1, 1);
oc_clear(); oc_clear();
@ -294,7 +297,7 @@ int main()
oc_set_font_size(14); oc_set_font_size(14);
oc_move_to(10, contentRect.h - 10 - lineHeights[fontIndex]); oc_move_to(10, contentRect.h - 10 - lineHeights[fontIndex]);
oc_str8 text = oc_str8_pushf(oc_scratch(), oc_str8 text = oc_str8_pushf(scratch.arena,
"Test program: %i glyphs, frame time = %fs, fps = %f", "Test program: %i glyphs, frame time = %fs, fps = %f",
glyphCount, glyphCount,
frameTime, frameTime,
@ -322,7 +325,7 @@ int main()
(endFrameTime - startPresentTime) * 1000); (endFrameTime - startPresentTime) * 1000);
oc_input_next_frame(&inputState); oc_input_next_frame(&inputState);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }
for(int i = 0; i < FONT_COUNT; i++) for(int i = 0; i < FONT_COUNT; i++)

View File

@ -18,8 +18,10 @@ i32 render_thread(void* user)
{ {
while(!oc_should_quit()) while(!oc_should_quit())
{ {
oc_arena_scope* scratch = oc_scratch_begin();
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
switch(event->type) switch(event->type)
{ {
@ -47,7 +49,7 @@ i32 render_thread(void* user)
oc_surface_present(surface); oc_surface_present(surface);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }
return (0); return (0);
} }

View File

@ -25,9 +25,10 @@ int main()
while(!oc_should_quit()) while(!oc_should_quit())
{ {
oc_arena_scope* scratch = oc_scratch_begin();
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
switch(event->type) switch(event->type)
{ {
@ -121,7 +122,7 @@ int main()
break; break;
} }
} }
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }
oc_terminate(); oc_terminate();

View File

@ -18,13 +18,15 @@
oc_font create_font() oc_font create_font()
{ {
//NOTE(martin): create font //NOTE(martin): create font
oc_str8 fontPath = oc_path_executable_relative(oc_scratch(), OC_STR8("../../resources/OpenSansLatinSubset.ttf")); oc_arena_scope* scratch = oc_scratch_begin();
char* fontPathCString = oc_str8_to_cstring(oc_scratch(), fontPath); oc_str8 fontPath = oc_path_executable_relative(scratch.arena, OC_STR8("../../resources/OpenSansLatinSubset.ttf"));
char* fontPathCString = oc_str8_to_cstring(scratch.arena, fontPath);
FILE* fontFile = fopen(fontPathCString, "r"); FILE* fontFile = fopen(fontPathCString, "r");
if(!fontFile) if(!fontFile)
{ {
oc_log_error("Could not load font file '%s': %s\n", fontPathCString, strerror(errno)); oc_log_error("Could not load font file '%s': %s\n", fontPathCString, strerror(errno));
oc_scratch_end(scratch);
return (oc_font_nil()); return (oc_font_nil());
} }
unsigned char* fontData = 0; unsigned char* fontData = 0;
@ -43,7 +45,7 @@ oc_font create_font()
oc_font font = oc_font_create_from_memory(oc_str8_from_buffer(fontDataSize, (char*)fontData), 5, ranges); oc_font font = oc_font_create_from_memory(oc_str8_from_buffer(fontDataSize, (char*)fontData), 5, ranges);
free(fontData); free(fontData);
oc_scratch_end(scratch);
return (font); return (font);
} }
@ -87,10 +89,11 @@ int main()
while(!oc_should_quit()) while(!oc_should_quit())
{ {
f64 startTime = oc_clock_time(OC_CLOCK_MONOTONIC); f64 startTime = oc_clock_time(OC_CLOCK_MONOTONIC);
oc_arena_scope* scratch = oc_scratch_begin();
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
switch(event->type) switch(event->type)
{ {
@ -185,7 +188,7 @@ int main()
oc_set_font_size(12); oc_set_font_size(12);
oc_move_to(50, 600 - 50); oc_move_to(50, 600 - 50);
oc_str8 text = oc_str8_pushf(oc_scratch(), oc_str8 text = oc_str8_pushf(scratch.arena,
"Orca vector graphics test program (frame time = %fs, fps = %f)...", "Orca vector graphics test program (frame time = %fs, fps = %f)...",
frameTime, frameTime,
1. / frameTime); 1. / frameTime);
@ -200,7 +203,7 @@ int main()
oc_render(canvas); oc_render(canvas);
oc_surface_present(surface); oc_surface_present(surface);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
frameTime = oc_clock_time(OC_CLOCK_MONOTONIC) - startTime; frameTime = oc_clock_time(OC_CLOCK_MONOTONIC) - startTime;
} }

View File

@ -120,8 +120,6 @@ void update_and_render(app_data* app)
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
oc_surface_present(app->surface); oc_surface_present(app->surface);
oc_arena_clear(oc_scratch());
} }
i32 render(void* user) i32 render(void* user)
@ -169,14 +167,16 @@ i32 render(void* user)
while(!oc_should_quit()) while(!oc_should_quit())
{ {
oc_arena_scope* scratch = oc_scratch_begin();
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
process_event(app, *event); process_event(app, *event);
} }
update_and_render(app); update_and_render(app);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }
return (0); return (0);

View File

@ -20,13 +20,15 @@
oc_font create_font() oc_font create_font()
{ {
//NOTE(martin): create font //NOTE(martin): create font
oc_str8 fontPath = oc_path_executable_relative(oc_scratch(), OC_STR8("../../resources/OpenSansLatinSubset.ttf")); oc_arena_scope* scratch = oc_scratch_begin();
char* fontPathCString = oc_str8_to_cstring(oc_scratch(), fontPath); oc_str8 fontPath = oc_path_executable_relative(scratch.arena, OC_STR8("../../resources/OpenSansLatinSubset.ttf"));
char* fontPathCString = oc_str8_to_cstring(scratch.arena, fontPath);
FILE* fontFile = fopen(fontPathCString, "r"); FILE* fontFile = fopen(fontPathCString, "r");
if(!fontFile) if(!fontFile)
{ {
oc_log_error("Could not load font file '%s': %s\n", fontPathCString, strerror(errno)); oc_log_error("Could not load font file '%s': %s\n", fontPathCString, strerror(errno));
oc_scratch_end(scratch);
return (oc_font_nil()); return (oc_font_nil());
} }
unsigned char* fontData = 0; unsigned char* fontData = 0;
@ -45,7 +47,7 @@ oc_font create_font()
oc_font font = oc_font_create_from_memory(oc_str8_from_buffer(fontDataSize, (char*)fontData), 5, ranges); oc_font font = oc_font_create_from_memory(oc_str8_from_buffer(fontDataSize, (char*)fontData), 5, ranges);
free(fontData); free(fontData);
oc_scratch_end(scratch);
return (font); return (font);
} }
@ -96,11 +98,12 @@ int main()
while(!oc_should_quit()) while(!oc_should_quit())
{ {
oc_arena_scope* scratch = oc_scratch_begin();
f64 startTime = oc_clock_time(OC_CLOCK_MONOTONIC); f64 startTime = oc_clock_time(OC_CLOCK_MONOTONIC);
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
oc_input_process_event(&inputState, event); oc_input_process_event(&inputState, event);
@ -203,7 +206,7 @@ int main()
oc_clear(); oc_clear();
oc_matrix_multiply_push((oc_mat2x3){ zoom, 0, startX, oc_matrix_multiply_push((oc_mat2x3){ zoom, 0, startX,
0, zoom, startY }); 0, zoom, startY });
draw_tiger(singlePath, singlePathIndex); draw_tiger(singlePath, singlePathIndex);
@ -221,7 +224,7 @@ int main()
oc_set_font_size(12); oc_set_font_size(12);
oc_move_to(50, 600 - 50); oc_move_to(50, 600 - 50);
oc_str8 text = oc_str8_pushf(oc_scratch(), oc_str8 text = oc_str8_pushf(scratch.arena,
"Orca vector graphics test program (frame time = %fs, fps = %f)...", "Orca vector graphics test program (frame time = %fs, fps = %f)...",
frameTime, frameTime,
1. / frameTime); 1. / frameTime);
@ -236,7 +239,9 @@ int main()
oc_surface_present(surface); oc_surface_present(surface);
oc_input_next_frame(&inputState); oc_input_next_frame(&inputState);
oc_arena_clear(oc_scratch());
oc_scratch_end(scratch);
frameTime = oc_clock_time(OC_CLOCK_MONOTONIC) - startTime; frameTime = oc_clock_time(OC_CLOCK_MONOTONIC) - startTime;
} }

View File

@ -120,9 +120,10 @@ int main()
while(!oc_should_quit()) while(!oc_should_quit())
{ {
oc_arena_scope* scratch = oc_scratch_begin();
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
switch(event->type) switch(event->type)
{ {
@ -163,7 +164,7 @@ int main()
oc_surface_present(surface); oc_surface_present(surface);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }
oc_terminate(); oc_terminate();

View File

@ -109,9 +109,10 @@ int main()
while(!oc_should_quit()) while(!oc_should_quit())
{ {
oc_arena_scope* scratch = oc_scratch_begin();
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
switch(event->type) switch(event->type)
{ {
@ -150,7 +151,7 @@ int main()
oc_surface_present(surface); oc_surface_present(surface);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
} }
oc_surface_destroy(surface); oc_surface_destroy(surface);

View File

@ -36,8 +36,10 @@ int main()
//NOTE(martin): load the library //NOTE(martin): load the library
id<MTLDevice> device = MTLCreateSystemDefaultDevice(); id<MTLDevice> device = MTLCreateSystemDefaultDevice();
oc_str8 shaderPath = oc_path_executable_relative(oc_scratch(), OC_STR8("triangle_shader.metallib")); oc_arena_scope* scratch = oc_scratch_begin();
const char* shaderPathCString = oc_str8_to_cstring(oc_scratch(), shaderPath);
oc_str8 shaderPath = oc_path_executable_relative(scratch.arena, OC_STR8("triangle_shader.metallib"));
const char* shaderPathCString = oc_str8_to_cstring(scratch.arena, shaderPath);
NSString* metalFileName = [[NSString alloc] initWithCString:shaderPathCString encoding:NSUTF8StringEncoding]; NSString* metalFileName = [[NSString alloc] initWithCString:shaderPathCString encoding:NSUTF8StringEncoding];
NSError* err = 0; NSError* err = 0;
id<MTLLibrary> library = [device newLibraryWithFile:metalFileName error:&err]; id<MTLLibrary> library = [device newLibraryWithFile:metalFileName error:&err];
@ -67,6 +69,7 @@ int main()
return (-1); return (-1);
} }
oc_scratch_end(scrathc);
// start app // start app
oc_window_bring_to_front(window); oc_window_bring_to_front(window);
@ -74,9 +77,10 @@ int main()
while(!oc_should_quit()) while(!oc_should_quit())
{ {
scratch = oc_scratch_begin();
oc_pump_events(0); oc_pump_events(0);
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0) while((event = oc_next_event(scratch.arena)) != 0)
{ {
switch(event->type) switch(event->type)
{ {
@ -89,8 +93,6 @@ int main()
default: default:
break; break;
} }
oc_arena_clear(oc_scratch());
} }
vector_uint2 viewportSize; vector_uint2 viewportSize;
@ -116,6 +118,8 @@ int main()
[encoder endEncoding]; [encoder endEncoding];
oc_surface_present(surface); oc_surface_present(surface);
oc_scratch_end(scratch);
} }
oc_terminate(); oc_terminate();

View File

@ -152,13 +152,15 @@ void debug_print_styles(oc_ui_box* box, int indent)
oc_font create_font() oc_font create_font()
{ {
//NOTE(martin): create font //NOTE(martin): create font
oc_str8 fontPath = oc_path_executable_relative(oc_scratch(), OC_STR8("../../resources/OpenSansLatinSubset.ttf")); oc_arena_scope scratch = oc_scratch_begin();
char* fontPathCString = oc_str8_to_cstring(oc_scratch(), fontPath); oc_str8 fontPath = oc_path_executable_relative(scratch.arena, OC_STR8("../../resources/OpenSansLatinSubset.ttf"));
char* fontPathCString = oc_str8_to_cstring(scratch.arena, fontPath);
FILE* fontFile = fopen(fontPathCString, "r"); FILE* fontFile = fopen(fontPathCString, "r");
if(!fontFile) if(!fontFile)
{ {
oc_log_error("Could not load font file '%s': %s\n", fontPathCString, strerror(errno)); oc_log_error("Could not load font file '%s': %s\n", fontPathCString, strerror(errno));
oc_scratch_end(scratch);
return (oc_font_nil()); return (oc_font_nil());
} }
unsigned char* fontData = 0; unsigned char* fontData = 0;
@ -178,6 +180,7 @@ oc_font create_font()
oc_font font = oc_font_create_from_memory(oc_str8_from_buffer(fontDataSize, (char*)fontData), 5, ranges); oc_font font = oc_font_create_from_memory(oc_str8_from_buffer(fontDataSize, (char*)fontData), 5, ranges);
free(fontData); free(fontData);
oc_scratch_end(scratch);
return (font); return (font);
} }
@ -240,7 +243,7 @@ int main()
while(!oc_should_quit()) while(!oc_should_quit())
{ {
oc_arena* scratch = oc_scratch(); oc_arena_scope scratch = oc_scratch_begin();
bool printDebugStyle = false; bool printDebugStyle = false;
@ -545,7 +548,7 @@ int main()
.size.height = { OC_UI_SIZE_TEXT } }, .size.height = { OC_UI_SIZE_TEXT } },
OC_UI_STYLE_SIZE); OC_UI_STYLE_SIZE);
static oc_str8 text = { 0 }; static oc_str8 text = { 0 };
oc_ui_text_box_result res = oc_ui_text_box("textbox", oc_scratch(), text); oc_ui_text_box_result res = oc_ui_text_box("textbox", scratch.arena, text);
if(res.changed) if(res.changed)
{ {
oc_arena_clear(&textArena); oc_arena_clear(&textArena);
@ -559,7 +562,7 @@ int main()
widget_view("Test") widget_view("Test")
{ {
oc_ui_pattern pattern = { 0 }; oc_ui_pattern pattern = { 0 };
oc_ui_pattern_push(oc_scratch(), &pattern, (oc_ui_selector){ .kind = OC_UI_SEL_TEXT, .text = OC_STR8("panel") }); oc_ui_pattern_push(scratch.arena, &pattern, (oc_ui_selector){ .kind = OC_UI_SEL_TEXT, .text = OC_STR8("panel") });
oc_ui_style_match_after(pattern, &(oc_ui_style){ .bgColor = { 0.3, 0.3, 1, 1 } }, OC_UI_STYLE_BG_COLOR); oc_ui_style_match_after(pattern, &(oc_ui_style){ .bgColor = { 0.3, 0.3, 1, 1 } }, OC_UI_STYLE_BG_COLOR);
static int selected = 0; static int selected = 0;
@ -634,7 +637,7 @@ int main()
oc_render(canvas); oc_render(canvas);
oc_surface_present(surface); oc_surface_present(surface);
oc_arena_clear(scratch); oc_scratch_end(scratch);
} }
oc_surface_destroy(surface); oc_surface_destroy(surface);

View File

@ -1484,8 +1484,13 @@ oc_canvas_backend* oc_mtl_canvas_backend_create(oc_mtl_surface* surface)
@autoreleasepool @autoreleasepool
{ {
//NOTE: load metal library //NOTE: load metal library
oc_str8 shaderPath = oc_path_executable_relative(oc_scratch(), OC_STR8("mtl_renderer.metallib")); oc_arena_scope scratch = oc_scratch_begin();
oc_str8 shaderPath = oc_path_executable_relative(scratch.arena, OC_STR8("mtl_renderer.metallib"));
NSString* metalFileName = [[NSString alloc] initWithBytes:shaderPath.ptr length:shaderPath.len encoding:NSUTF8StringEncoding]; NSString* metalFileName = [[NSString alloc] initWithBytes:shaderPath.ptr length:shaderPath.len encoding:NSUTF8StringEncoding];
oc_scratch_end(scratch);
NSError* err = 0; NSError* err = 0;
id<MTLLibrary> library = [surface->device newLibraryWithFile:metalFileName error:&err]; id<MTLLibrary> library = [surface->device newLibraryWithFile:metalFileName error:&err];
if(err != nil) if(err != nil)

View File

@ -86,14 +86,14 @@ void platform_log_push(oc_log_output* output,
_Noreturn void oc_abort_ext(const char* file, const char* function, int line, const char* fmt, ...) _Noreturn void oc_abort_ext(const char* file, const char* function, int line, const char* fmt, ...)
{ {
oc_arena* scratch = oc_scratch(); oc_arena_scope scratch = oc_scratch_begin();
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
oc_str8 note = oc_str8_pushfv(scratch, fmt, ap); oc_str8 note = oc_str8_pushfv(scratch.arena, fmt, ap);
va_end(ap); va_end(ap);
oc_str8 msg = oc_str8_pushf(scratch, oc_str8 msg = oc_str8_pushf(scratch.arena,
"Fatal error in function %s() in file \"%s\", line %i:\n%.*s\n", "Fatal error in function %s() in file \"%s\", line %i:\n%.*s\n",
function, function,
file, file,
@ -104,7 +104,7 @@ _Noreturn void oc_abort_ext(const char* file, const char* function, int line, co
oc_log_error(msg.ptr); oc_log_error(msg.ptr);
oc_str8_list options = { 0 }; oc_str8_list options = { 0 };
oc_str8_list_push(scratch, &options, OC_STR8("OK")); oc_str8_list_push(scratch.arena, &options, OC_STR8("OK"));
oc_alert_popup(OC_STR8("Fatal Error"), msg, options); oc_alert_popup(OC_STR8("Fatal Error"), msg, options);
@ -114,14 +114,14 @@ _Noreturn void oc_abort_ext(const char* file, const char* function, int line, co
_Noreturn void oc_assert_fail(const char* file, const char* function, int line, const char* src, const char* fmt, ...) _Noreturn void oc_assert_fail(const char* file, const char* function, int line, const char* src, const char* fmt, ...)
{ {
oc_arena* scratch = oc_scratch(); oc_arena_scope scratch = oc_scratch_begin();
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
oc_str8 note = oc_str8_pushfv(scratch, fmt, ap); oc_str8 note = oc_str8_pushfv(scratch.arena, fmt, ap);
va_end(ap); va_end(ap);
oc_str8 msg = oc_str8_pushf(scratch, oc_str8 msg = oc_str8_pushf(scratch.arena,
"Assertion failed in function %s() in file \"%s\", line %i:\n%s\nNote: %.*s\n", "Assertion failed in function %s() in file \"%s\", line %i:\n%s\nNote: %.*s\n",
function, function,
file, file,
@ -132,7 +132,7 @@ _Noreturn void oc_assert_fail(const char* file, const char* function, int line,
oc_log_error(msg.ptr); oc_log_error(msg.ptr);
oc_str8_list options = { 0 }; oc_str8_list options = { 0 };
oc_str8_list_push(scratch, &options, OC_STR8("OK")); oc_str8_list_push(scratch.arena, &options, OC_STR8("OK"));
oc_alert_popup(OC_STR8("Assertion Failed"), msg, options); oc_alert_popup(OC_STR8("Assertion Failed"), msg, options);

View File

@ -50,13 +50,13 @@ static oc_log_output oc_logDefaultOutput = { .kind = ORCA_LOG_OUTPUT_CONSOLE };
oc_log_output* OC_LOG_DEFAULT_OUTPUT = &oc_logDefaultOutput; oc_log_output* OC_LOG_DEFAULT_OUTPUT = &oc_logDefaultOutput;
void ORCA_IMPORT(oc_bridge_log)(oc_log_level level, void ORCA_IMPORT(oc_bridge_log)(oc_log_level level,
int fileLen, int fileLen,
const char* file, const char* file,
int functionLen, int functionLen,
const char* function, const char* function,
int line, int line,
int msgLen, int msgLen,
const char* msg); const char* msg);
void platform_log_push(oc_log_output* output, void platform_log_push(oc_log_output* output,
oc_log_level level, oc_log_level level,
@ -66,20 +66,19 @@ void platform_log_push(oc_log_output* output,
const char* fmt, const char* fmt,
va_list ap) va_list ap)
{ {
oc_arena* scratch = oc_scratch(); oc_arena_scope scratch = oc_scratch_begin();
oc_arena_scope tmp = oc_arena_scope_begin(scratch);
oc_stbsp_context ctx = { .arena = scratch, oc_stbsp_context ctx = { .arena = scratch.arena,
.list = { 0 } }; .list = { 0 } };
char buf[STB_SPRINTF_MIN]; char buf[STB_SPRINTF_MIN];
stbsp_vsprintfcb(oc_stbsp_callback, &ctx, buf, fmt, ap); stbsp_vsprintfcb(oc_stbsp_callback, &ctx, buf, fmt, ap);
oc_str8 string = oc_str8_list_join(scratch, ctx.list); oc_str8 string = oc_str8_list_join(scratch.arena, ctx.list);
oc_bridge_log(level, strlen(file), file, strlen(function), function, line, oc_str8_ip(string)); oc_bridge_log(level, strlen(file), file, strlen(function), function, line, oc_str8_ip(string));
oc_arena_scope_end(tmp); oc_scratch_end(scratch);
} }
//---------------------------------------------------------------- //----------------------------------------------------------------

View File

@ -21,32 +21,37 @@
oc_font orca_font_create(const char* resourcePath) oc_font orca_font_create(const char* resourcePath)
{ {
//NOTE(martin): create default fonts //NOTE(martin): create default fonts
oc_str8 fontPath = oc_path_executable_relative(oc_scratch(), OC_STR8(resourcePath)); oc_arena_scope scratch = oc_scratch_begin();
oc_str8 fontPath = oc_path_executable_relative(scratch.arena, OC_STR8(resourcePath));
oc_font font = oc_font_nil();
FILE* fontFile = fopen(fontPath.ptr, "r"); FILE* fontFile = fopen(fontPath.ptr, "r");
if(!fontFile) if(!fontFile)
{ {
oc_log_error("Could not load font file '%s': %s\n", fontPath.ptr, strerror(errno)); oc_log_error("Could not load font file '%s': %s\n", fontPath.ptr, strerror(errno));
return (oc_font_nil());
} }
char* fontData = 0; else
fseek(fontFile, 0, SEEK_END); {
u32 fontDataSize = ftell(fontFile); char* fontData = 0;
rewind(fontFile); fseek(fontFile, 0, SEEK_END);
fontData = malloc(fontDataSize); u32 fontDataSize = ftell(fontFile);
fread(fontData, 1, fontDataSize, fontFile); rewind(fontFile);
fclose(fontFile); fontData = malloc(fontDataSize);
fread(fontData, 1, fontDataSize, fontFile);
fclose(fontFile);
oc_unicode_range ranges[5] = { OC_UNICODE_BASIC_LATIN, oc_unicode_range ranges[5] = { OC_UNICODE_BASIC_LATIN,
OC_UNICODE_C1_CONTROLS_AND_LATIN_1_SUPPLEMENT, OC_UNICODE_C1_CONTROLS_AND_LATIN_1_SUPPLEMENT,
OC_UNICODE_LATIN_EXTENDED_A, OC_UNICODE_LATIN_EXTENDED_A,
OC_UNICODE_LATIN_EXTENDED_B, OC_UNICODE_LATIN_EXTENDED_B,
OC_UNICODE_SPECIALS }; OC_UNICODE_SPECIALS };
oc_font font = oc_font_create_from_memory(oc_str8_from_buffer(fontDataSize, fontData), 5, ranges); font = oc_font_create_from_memory(oc_str8_from_buffer(fontDataSize, fontData), 5, ranges);
free(fontData);
free(fontData);
}
oc_scratch_end(scratch);
return (font); return (font);
} }
@ -301,6 +306,8 @@ void debug_overlay_toggle(oc_debug_overlay* overlay)
void log_entry_ui(oc_debug_overlay* overlay, log_entry* entry) void log_entry_ui(oc_debug_overlay* overlay, log_entry* entry)
{ {
oc_arena_scope scratch = oc_scratch_begin();
static const char* levelNames[] = { "Error: ", "Warning: ", "Info: " }; static const char* levelNames[] = { "Error: ", "Warning: ", "Info: " };
static const oc_color levelColors[] = { { 0.8, 0, 0, 1 }, static const oc_color levelColors[] = { { 0.8, 0, 0, 1 },
{ 1, 0.5, 0, 1 }, { 1, 0.5, 0, 1 },
@ -325,7 +332,7 @@ void log_entry_ui(oc_debug_overlay* overlay, log_entry* entry)
| OC_UI_STYLE_LAYOUT_MARGINS | OC_UI_STYLE_LAYOUT_MARGINS
| OC_UI_STYLE_BG_COLOR); | OC_UI_STYLE_BG_COLOR);
oc_str8 key = oc_str8_pushf(oc_scratch(), "%ull", entry->recordIndex); oc_str8 key = oc_str8_pushf(scratch.arena, "%ull", entry->recordIndex);
oc_ui_container_str8(key, OC_UI_FLAG_DRAW_BACKGROUND) oc_ui_container_str8(key, OC_UI_FLAG_DRAW_BACKGROUND)
{ {
@ -343,7 +350,7 @@ void log_entry_ui(oc_debug_overlay* overlay, log_entry* entry)
| OC_UI_STYLE_FONT); | OC_UI_STYLE_FONT);
oc_ui_label(levelNames[entry->level]); oc_ui_label(levelNames[entry->level]);
oc_str8 loc = oc_str8_pushf(oc_scratch(), oc_str8 loc = oc_str8_pushf(scratch.arena,
"%.*s() in %.*s:%i:", "%.*s() in %.*s:%i:",
oc_str8_ip(entry->file), oc_str8_ip(entry->file),
oc_str8_ip(entry->function), oc_str8_ip(entry->function),
@ -352,6 +359,7 @@ void log_entry_ui(oc_debug_overlay* overlay, log_entry* entry)
} }
oc_ui_label_str8(entry->msg); oc_ui_label_str8(entry->msg);
} }
oc_scratch_end(scratch);
} }
char m3_type_to_tag(M3ValueType type) char m3_type_to_tag(M3ValueType type)
@ -399,8 +407,10 @@ i32 orca_runloop(void* user)
oc_wasm_env_init(&app->env); oc_wasm_env_init(&app->env);
//NOTE: loads wasm module //NOTE: loads wasm module
oc_arena_scope scratch = oc_scratch_begin();
const char* bundleNameCString = "module"; const char* bundleNameCString = "module";
oc_str8 modulePath = oc_path_executable_relative(oc_scratch(), OC_STR8("../app/wasm/module.wasm")); oc_str8 modulePath = oc_path_executable_relative(scratch.arena, OC_STR8("../app/wasm/module.wasm"));
FILE* file = fopen(modulePath.ptr, "rb"); FILE* file = fopen(modulePath.ptr, "rb");
if(!file) if(!file)
@ -437,7 +447,7 @@ i32 orca_runloop(void* user)
} }
m3_SetModuleName(app->env.m3Module, bundleNameCString); m3_SetModuleName(app->env.m3Module, bundleNameCString);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
//NOTE: bind orca APIs //NOTE: bind orca APIs
{ {
@ -522,7 +532,9 @@ i32 orca_runloop(void* user)
//NOTE: preopen the app local root dir //NOTE: preopen the app local root dir
{ {
oc_str8 localRootPath = oc_path_executable_relative(oc_scratch(), OC_STR8("../app/data")); scratch = oc_scratch_begin();
oc_str8 localRootPath = oc_path_executable_relative(scratch.arena, OC_STR8("../app/data"));
oc_io_req req = { .op = OC_IO_OPEN_AT, oc_io_req req = { .op = OC_IO_OPEN_AT,
.open.rights = OC_FILE_ACCESS_READ | OC_FILE_ACCESS_WRITE, .open.rights = OC_FILE_ACCESS_READ | OC_FILE_ACCESS_WRITE,
@ -530,6 +542,8 @@ i32 orca_runloop(void* user)
.buffer = localRootPath.ptr }; .buffer = localRootPath.ptr };
oc_io_cmp cmp = oc_io_wait_single_req_for_table(&req, &app->fileTable); oc_io_cmp cmp = oc_io_wait_single_req_for_table(&req, &app->fileTable);
app->rootDir = cmp.handle; app->rootDir = cmp.handle;
oc_scratch_end(scratch);
} }
IM3Function* exports = app->env.exports; IM3Function* exports = app->env.exports;
@ -561,8 +575,10 @@ i32 orca_runloop(void* user)
while(!app->quit) while(!app->quit)
{ {
scratch = oc_scratch_begin();
oc_event* event = 0; oc_event* event = 0;
while((event = oc_next_event(oc_scratch())) != 0)
while((event = oc_next_event(scratch.arena)) != 0)
{ {
if(app->debugOverlay.show) if(app->debugOverlay.show)
{ {
@ -571,7 +587,6 @@ i32 orca_runloop(void* user)
if(exports[OC_EXPORT_RAW_EVENT]) if(exports[OC_EXPORT_RAW_EVENT])
{ {
oc_arena_scope scratch = oc_scratch_begin();
oc_event* clipboardEvent = oc_runtime_clipboard_process_event_begin(&__orcaApp.clipboard, scratch.arena, event); oc_event* clipboardEvent = oc_runtime_clipboard_process_event_begin(&__orcaApp.clipboard, scratch.arena, event);
oc_event* events[2]; oc_event* events[2];
u64 eventsCount; u64 eventsCount;
@ -605,7 +620,6 @@ i32 orca_runloop(void* user)
} }
oc_runtime_clipboard_process_event_end(&__orcaApp.clipboard); oc_runtime_clipboard_process_event_end(&__orcaApp.clipboard);
oc_scratch_end(scratch);
} }
switch(event->type) switch(event->type)
@ -818,8 +832,8 @@ i32 orca_runloop(void* user)
// and we need to change that to size according to its parent (whereas the default is sizing according // and we need to change that to size according to its parent (whereas the default is sizing according
// to its children) // to its children)
oc_ui_pattern pattern = { 0 }; oc_ui_pattern pattern = { 0 };
oc_ui_pattern_push(oc_scratch(), &pattern, (oc_ui_selector){ .kind = OC_UI_SEL_OWNER }); oc_ui_pattern_push(scratch.arena, &pattern, (oc_ui_selector){ .kind = OC_UI_SEL_OWNER });
oc_ui_pattern_push(oc_scratch(), &pattern, (oc_ui_selector){ .kind = OC_UI_SEL_TEXT, .text = OC_STR8("contents") }); oc_ui_pattern_push(scratch.arena, &pattern, (oc_ui_selector){ .kind = OC_UI_SEL_TEXT, .text = OC_STR8("contents") });
oc_ui_style_match_after(pattern, &(oc_ui_style){ .size.width = { OC_UI_SIZE_PARENT, 1 } }, OC_UI_STYLE_SIZE_WIDTH); oc_ui_style_match_after(pattern, &(oc_ui_style){ .size.width = { OC_UI_SIZE_PARENT, 1 } }, OC_UI_STYLE_SIZE_WIDTH);
oc_ui_box* panel = oc_ui_box_lookup("log view"); oc_ui_box* panel = oc_ui_box_lookup("log view");
@ -877,7 +891,7 @@ i32 orca_runloop(void* user)
oc_render(app->debugOverlay.canvas); oc_render(app->debugOverlay.canvas);
oc_surface_present(app->debugOverlay.surface); oc_surface_present(app->debugOverlay.surface);
oc_arena_clear(oc_scratch()); oc_scratch_end(scratch);
#if OC_PLATFORM_WINDOWS #if OC_PLATFORM_WINDOWS
//NOTE(martin): on windows we set all surfaces to non-synced, and do a single "manual" wait here. //NOTE(martin): on windows we set all surfaces to non-synced, and do a single "manual" wait here.

View File

@ -216,40 +216,34 @@ static oc_arena* oc_scratch_at_index(int index)
return (scratch); return (scratch);
} }
oc_arena* oc_scratch()
{
return (oc_scratch_at_index(0));
}
ORCA_API oc_arena* oc_scratch_next(oc_arena* used)
{
oc_arena* res = 0;
if((used >= __scratchPool)
&& (used - __scratchPool < OC_SCRATCH_POOL_SIZE))
{
u64 index = used - __scratchPool;
if(index + 1 < OC_SCRATCH_POOL_SIZE)
{
res = oc_scratch_at_index(index + 1);
}
}
else
{
res = oc_scratch_at_index(0);
}
return (res);
}
ORCA_API oc_arena_scope oc_scratch_begin(void) ORCA_API oc_arena_scope oc_scratch_begin(void)
{ {
oc_arena* scratch = oc_scratch(); oc_arena* scratch = oc_scratch_at_index(0);
oc_arena_scope scope = oc_arena_scope_begin(scratch); oc_arena_scope scope = oc_arena_scope_begin(scratch);
return (scope); return (scope);
} }
ORCA_API oc_arena_scope oc_scratch_begin_next(oc_arena* used) ORCA_API oc_arena_scope oc_scratch_begin_next(oc_arena* used)
{ {
oc_arena* scratch = oc_scratch_next(used); oc_arena_scope scope = { 0 };
oc_arena_scope scope = oc_arena_scope_begin(scratch); oc_arena* arena = 0;
if((used >= __scratchPool)
&& (used - __scratchPool < OC_SCRATCH_POOL_SIZE))
{
u64 index = used - __scratchPool;
if(index + 1 < OC_SCRATCH_POOL_SIZE)
{
arena = oc_scratch_at_index(index + 1);
}
}
else
{
arena = oc_scratch_at_index(0);
}
OC_ASSERT(arena);
scope = oc_arena_scope_begin(arena);
return (scope); return (scope);
} }

View File

@ -96,8 +96,6 @@ ORCA_API void oc_pool_clear(oc_pool* pool);
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
//NOTE(martin): per-thread implicit scratch arena //NOTE(martin): per-thread implicit scratch arena
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
ORCA_API oc_arena* oc_scratch();
ORCA_API oc_arena* oc_scratch_next(oc_arena* used);
ORCA_API oc_arena_scope oc_scratch_begin(void); ORCA_API oc_arena_scope oc_scratch_begin(void);
ORCA_API oc_arena_scope oc_scratch_begin_next(oc_arena* used); ORCA_API oc_arena_scope oc_scratch_begin_next(oc_arena* used);

View File

@ -12,7 +12,8 @@ int main(int argc, char** argv)
{ {
oc_init(); oc_init();
oc_str8 path = oc_path_executable_relative(oc_scratch(), OC_STR8("../")); oc_arena_scope* scratch = oc_scratch_begin();
oc_str8 path = oc_path_executable_relative(scratch.arena, OC_STR8("../"));
oc_file dir = oc_file_open(path, OC_FILE_ACCESS_READ, 0); oc_file dir = oc_file_open(path, OC_FILE_ACCESS_READ, 0);
oc_file_dialog_desc desc = { oc_file_dialog_desc desc = {
@ -24,9 +25,9 @@ int main(int argc, char** argv)
.startPath = OC_STR8(".."), .startPath = OC_STR8(".."),
}; };
oc_str8_list_push(oc_scratch(), &desc.filters, OC_STR8("txt")); oc_str8_list_push(scratch.arena, &desc.filters, OC_STR8("txt"));
oc_file_dialog_result res = oc_file_dialog(oc_scratch(), &desc); oc_file_dialog_result res = oc_file_dialog(scratch.arena, &desc);
if(res.button == OC_FILE_DIALOG_CANCEL) if(res.button == OC_FILE_DIALOG_CANCEL)
{ {

View File

@ -19,7 +19,9 @@ int main(int argc, char** argv)
.okLabel = OC_STR8("Select") .okLabel = OC_STR8("Select")
}; };
oc_str8_list_push(oc_scratch(), &desc.filters, OC_STR8("txt")); oc_arena_scope* scratch = oc_scratch_begin();
oc_str8_list_push(scratch.arena, &desc.filters, OC_STR8("txt"));
oc_file file = oc_file_open_with_dialog(OC_FILE_ACCESS_READ, 0, &desc); oc_file file = oc_file_open_with_dialog(OC_FILE_ACCESS_READ, 0, &desc);
if(oc_file_is_nil(file)) if(oc_file_is_nil(file))