WIP(untested, compiles): Started to setup sokol callbacks
This commit is contained in:
@@ -6,7 +6,7 @@ Made becasue of the map issue with fonts during hot-reload.
|
||||
I didn't want to make the HMapZPL impl with the [dynamic] array for now to isolate the hot-reload issue (when I was diagnoising)
|
||||
|
||||
Note 2024-5-26:
|
||||
TODO(Ed): Raw_Dynamic_Array is defined within base:runtime/core.odin and exposes what we need for worst case hot-reloads.
|
||||
Raw_Dynamic_Array is defined within base:runtime/core.odin and exposes what we need for worst case hot-reloads.
|
||||
So its best to go back to regular dynamic arrays at some point.
|
||||
Note 2025-5-12:
|
||||
I can use either... so I'll just keep both
|
||||
|
||||
@@ -235,7 +235,7 @@ host_job_worker_entrypoint :: proc(worker_thread: ^SysThread)
|
||||
when SHOULD_SETUP_PROFILERS
|
||||
{
|
||||
thread_memory.spall_buffer = spall_buffer_create(thread_memory.spall_buffer_backing[:], cast(u32) thread_memory.system_ctx.id)
|
||||
host_memory.client_api.tick_lane_startup(& thread_memory)
|
||||
host_memory.client_api.job_worker_startup(& thread_memory)
|
||||
grime_set_profiler_thread_buffer(& thread_memory.spall_buffer)
|
||||
}
|
||||
jobs_enqueued := false
|
||||
@@ -246,7 +246,7 @@ host_job_worker_entrypoint :: proc(worker_thread: ^SysThread)
|
||||
host_tick := time_tick_now()
|
||||
for ; jobs_enqueued || sync_load(& host_memory.job_system.running, .Relaxed);
|
||||
{
|
||||
profile("Host Job Tick")
|
||||
// profile("Host Job Tick")
|
||||
|
||||
host_memory.client_api.jobsys_worker_tick(duration_seconds(delta_ns), delta_ns)
|
||||
|
||||
|
||||
@@ -197,7 +197,7 @@ Host handles the loop.
|
||||
(We need threads to be outside of client callstack in the event of a hot-reload)
|
||||
*/
|
||||
@export
|
||||
tick_lane :: proc(host_delta_time_ms: f64, host_delta_ns: Duration) -> (should_close: b64 = false)
|
||||
tick_lane :: proc(host_delta_time_ms: f64, host_delta_ns: Duration) -> (should_close: bool = false)
|
||||
{
|
||||
profile(#procedure)
|
||||
|
||||
@@ -207,53 +207,7 @@ tick_lane :: proc(host_delta_time_ms: f64, host_delta_ns: Duration) -> (should_c
|
||||
|
||||
profile_begin("Client Tick")
|
||||
{
|
||||
profile("Work frame")
|
||||
context.logger = to_odin_logger( & memory.client_memory.logger )
|
||||
|
||||
// TODO(Ed): Setup frame alloator
|
||||
|
||||
if thread.id == .Master_Prepper
|
||||
{
|
||||
// config := & memory.client_memory.config
|
||||
// debug := & memory.client_memory.debug
|
||||
|
||||
// debug.draw_ui_box_bounds_points = false
|
||||
// debug.draw_ui_padding_bounds = false
|
||||
// debug.draw_ui_content_bounds = false
|
||||
|
||||
// config.engine_refresh_hz = 165
|
||||
|
||||
// config.color_theme = App_Thm_Light
|
||||
// config.color_theme = App_Thm_Dusk
|
||||
// config.color_theme = App_Thm_Dark
|
||||
|
||||
// sokol_width := sokol_app.widthf()
|
||||
// sokol_height := sokol_app.heightf()
|
||||
|
||||
// window := & get_state().app_window
|
||||
// if int(window.extent.x) != int(sokol_width) || int(window.extent.y) != int(sokol_height) {
|
||||
// window.resized = true
|
||||
// window.extent.x = sokol_width * 0.5
|
||||
// window.extent.y = sokol_height * 0.5
|
||||
// log("sokol_app: Event-based frame callback triggered (detected a resize")
|
||||
// }
|
||||
}
|
||||
|
||||
// Test dispatching 64 jobs during hot_reload loop (when the above store is uncommented)
|
||||
if true
|
||||
{
|
||||
if thread.id == .Master_Prepper {
|
||||
profile("dispatching")
|
||||
for job_id := 1; job_id < JOB_TEST_NUM; job_id += 1 {
|
||||
memory.job_info_reload[job_id].id = job_id
|
||||
memory.job_reload[job_id] = make_job_raw(& memory.job_group_reload, & memory.job_info_reload[job_id], test_job, {}, "Job Test (Hot-Reload)")
|
||||
job_dispatch_single(& memory.job_reload[job_id], .Normal)
|
||||
}
|
||||
}
|
||||
should_close = true
|
||||
}
|
||||
// should_close |= update( host_delta_time_ms )
|
||||
// render()
|
||||
should_close = tick_lane_work_frame(host_delta_time_ms)
|
||||
}
|
||||
client_tick := tick_now()
|
||||
profile_end()
|
||||
@@ -266,10 +220,63 @@ tick_lane :: proc(host_delta_time_ms: f64, host_delta_ns: Duration) -> (should_c
|
||||
return sync_load(& should_close, .Acquire)
|
||||
}
|
||||
|
||||
// Note(Ed): Necessary for sokol_app_frame_callback
|
||||
tick_lane_work_frame :: proc(host_delta_time_ms: f64) -> (should_close: bool)
|
||||
{
|
||||
profile("Work frame")
|
||||
context.logger = to_odin_logger( & memory.client_memory.logger )
|
||||
|
||||
// TODO(Ed): Setup frame alloator
|
||||
|
||||
if thread.id == .Master_Prepper
|
||||
{
|
||||
// config := & memory.client_memory.config
|
||||
// debug := & memory.client_memory.debug
|
||||
|
||||
// debug.draw_ui_box_bounds_points = false
|
||||
// debug.draw_ui_padding_bounds = false
|
||||
// debug.draw_ui_content_bounds = false
|
||||
|
||||
// config.engine_refresh_hz = 165
|
||||
|
||||
// config.color_theme = App_Thm_Light
|
||||
// config.color_theme = App_Thm_Dusk
|
||||
// config.color_theme = App_Thm_Dark
|
||||
|
||||
// sokol_width := sokol_app.widthf()
|
||||
// sokol_height := sokol_app.heightf()
|
||||
|
||||
// window := & get_state().app_window
|
||||
// if int(window.extent.x) != int(sokol_width) || int(window.extent.y) != int(sokol_height) {
|
||||
// window.resized = true
|
||||
// window.extent.x = sokol_width * 0.5
|
||||
// window.extent.y = sokol_height * 0.5
|
||||
// log("sokol_app: Event-based frame callback triggered (detected a resize")
|
||||
// }
|
||||
}
|
||||
|
||||
// Test dispatching 64 jobs during hot_reload loop (when the above store is uncommented)
|
||||
if true
|
||||
{
|
||||
if thread.id == .Master_Prepper {
|
||||
profile("dispatching")
|
||||
for job_id := 1; job_id < JOB_TEST_NUM; job_id += 1 {
|
||||
memory.job_info_reload[job_id].id = job_id
|
||||
memory.job_reload[job_id] = make_job_raw(& memory.job_group_reload, & memory.job_info_reload[job_id], test_job, {}, "Job Test (Hot-Reload)")
|
||||
job_dispatch_single(& memory.job_reload[job_id], .Normal)
|
||||
}
|
||||
}
|
||||
should_close = true
|
||||
}
|
||||
// should_close |= update( host_delta_time_ms )
|
||||
// render()
|
||||
return
|
||||
}
|
||||
|
||||
@export
|
||||
jobsys_worker_tick :: proc(host_delta_time_ms: f64, host_delta_ns: Duration)
|
||||
{
|
||||
profile("Worker Tick")
|
||||
// profile("Worker Tick")
|
||||
context.logger = to_odin_logger(& memory.client_memory.logger)
|
||||
|
||||
ORDERED_PRIORITIES :: [len(JobPriority)]JobPriority{.High, .Normal, .Low}
|
||||
@@ -316,6 +323,7 @@ test_job :: proc(data: rawptr)
|
||||
|
||||
Frametime_High_Perf_Threshold_MS :: 1 / 240.0
|
||||
|
||||
// TODO(Ed): Lift this to be usable by both tick lanes and job worker threads.
|
||||
tick_lane_frametime :: proc(client_tick: ^Tick, host_delta_time_ms: f64, host_delta_ns: Duration, can_sleep := true)
|
||||
{
|
||||
profile(#procedure)
|
||||
|
||||
39
code2/sectr/engine/client_api_sokol_callbacks.odin
Normal file
39
code2/sectr/engine/client_api_sokol_callbacks.odin
Normal file
@@ -0,0 +1,39 @@
|
||||
package sectr
|
||||
|
||||
import sokol_app "thirdparty:sokol/app"
|
||||
|
||||
sokol_app_init_callback :: proc "c" () {
|
||||
context = memory.client_memory.sokol_context
|
||||
log_print("sokol_app: Confirmed initialization")
|
||||
}
|
||||
// This is being filled in but we're directly controlling the lifetime of sokol_app's execution.
|
||||
// So this will only get called during window pan or resize events (on Win32 at least)
|
||||
sokol_app_frame_callback :: proc "c" ()
|
||||
{
|
||||
profile(#procedure)
|
||||
context = memory.client_memory.sokol_context
|
||||
should_close: bool
|
||||
|
||||
sokol_width := sokol_app.widthf()
|
||||
sokol_height := sokol_app.heightf()
|
||||
|
||||
window := & memory.client_memory.app_window
|
||||
// if int(window.extent.x) != int(sokol_width) || int(window.extent.y) != int(sokol_height) {
|
||||
window.resized = true
|
||||
window.extent.x = cast(f32) i32(sokol_width * 0.5)
|
||||
window.extent.y = cast(f32) i32(sokol_height * 0.5)
|
||||
// log("sokol_app: Event-based frame callback triggered (detected a resize")
|
||||
// }
|
||||
|
||||
// sokol_app is the only good reference for a frame-time at this point.
|
||||
sokol_delta_ms := sokol_app.frame_delta()
|
||||
sokol_delta_ns := transmute(Duration) sokol_delta_ms * MS_To_NS
|
||||
|
||||
profile_begin("Client Tick")
|
||||
client_tick := tick_now()
|
||||
should_close |= tick_lane_work_frame( sokol_delta_ms )
|
||||
profile_end()
|
||||
|
||||
tick_lane_frametime( & client_tick, sokol_delta_ms, sokol_delta_ns, can_sleep = false )
|
||||
window.resized = false
|
||||
}
|
||||
@@ -8,6 +8,9 @@ Any symbol that does must be mapped from the Grime package to properly tirage it
|
||||
import "base:intrinsics"
|
||||
debug_trap :: intrinsics.debug_trap
|
||||
|
||||
import "base:runtime"
|
||||
Context :: runtime.Context
|
||||
|
||||
import "core:dynlib"
|
||||
// Only referenced in ModuleAPI
|
||||
DynLibrary :: dynlib.Library
|
||||
|
||||
@@ -55,3 +55,5 @@ CameraZoomMode :: enum u32 {
|
||||
Smooth,
|
||||
}
|
||||
|
||||
Extents2_F4 :: V2_F4
|
||||
Extents2_S4 :: V2_S4
|
||||
|
||||
@@ -49,6 +49,13 @@ AppConfig :: struct {
|
||||
text_alpha_sharpen : f32,
|
||||
}
|
||||
|
||||
AppWindow :: struct {
|
||||
extent: Extents2_F4, // Window half-size
|
||||
dpi_scale: f32, // Dots per inch scale (provided by raylib via glfw)
|
||||
ppcm: f32, // Dots per centimetre
|
||||
resized: b32, // Extent changed this frame
|
||||
}
|
||||
|
||||
FrameTime :: struct {
|
||||
sleep_is_granular : b32,
|
||||
|
||||
@@ -63,12 +70,16 @@ FrameTime :: struct {
|
||||
}
|
||||
|
||||
State :: struct {
|
||||
config: AppConfig,
|
||||
config: AppConfig,
|
||||
app_window: AppWindow,
|
||||
|
||||
// Overall frametime of the tick frame (currently main thread's)
|
||||
using frametime : FrameTime,
|
||||
|
||||
logger: Logger,
|
||||
|
||||
sokol_frame_count: i64,
|
||||
sokol_context: Context,
|
||||
}
|
||||
|
||||
ThreadState :: struct {
|
||||
|
||||
Reference in New Issue
Block a user