1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
/**
* Common jobs that get run
*/
#pragma once
#include "defines.h"
#include "logos/threadpool.h"
#include "render_types.h"
#include "str.h"
typedef struct Task {
char* debug_name;
void* params;
bool is_done;
} Task;
// Macro : give Params and Result structs and it creates a function that knows
// correct sizes
typedef struct Task_ModelLoad_Params {
Str8 filepath; // filepath to the model on disk
} Task_ModelLoad_Params;
typedef struct Task_ModelLoad_Result {
Model model;
} Task_ModelLoad_Result;
// Internally it will allocate data for each
static bool Task_ModelLoad_Typed(
Task_ModelLoad_Params* params,
Task_ModelLoad_Result* result,
tpool_task_start run_task,
tpool_task_on_complete on_success,
tpool_task_on_complete on_failure
) {
threadpool_add_task(pool, , tpool_task_on_complete on_success, tpool_task_on_complete on_fail, bool buffer_result_for_main_thread, void *param_data, u32 param_data_size, u32 result_data_size)
}
// do task
// success
void model_load_success(task_globals* globals, void* result) {
Task_ModelLoad_Result* load_res = result;
// push into render -> renderables ?
}
// fail
// we can define our custom task here that wraps the more verbose function pointers
static Task Task_ModelLoad(
Task_ModelLoad_Params* params,
Task_ModelLoad_Result* result
) {
Task task;
task.debug_name = "Load Model";
task.params = params;
Task_ModelLoad_Typed(params, result, tpool_task_start run_task, tpool_task_on_complete on_success, tpool_task_on_complete on_failure)
return task;
}
|