sync singular build data struct during prep
This commit is contained in:
parent
1532549ffa
commit
905cb50e33
@ -539,6 +539,12 @@ GPU_D12_Pipeline *GPU_D12_PipelineFromDesc(GPU_D12_PipelineDesc desc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ok)
|
||||||
|
{
|
||||||
|
/* TOOD: Don't panic */
|
||||||
|
Panic(error_str);
|
||||||
|
}
|
||||||
|
|
||||||
pipeline->pso = pso;
|
pipeline->pso = pso;
|
||||||
pipeline->error = error_str;
|
pipeline->error = error_str;
|
||||||
pipeline->ok = ok;
|
pipeline->ok = ok;
|
||||||
|
|||||||
382
src/meta/meta.c
382
src/meta/meta.c
@ -339,11 +339,139 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- Parse meta layers
|
//- Prep
|
||||||
|
|
||||||
|
String shader_store_name = Lit("ShadersStore");
|
||||||
|
String c_out_file = F_GetFull(perm, StringF(perm, "%F_gen_c.c", FmtString(cmdline.leaf_layer_name)));
|
||||||
|
String gpu_out_file = F_GetFull(perm, StringF(perm, "%F_gen_gpu.hlsl", FmtString(cmdline.leaf_layer_name)));
|
||||||
|
|
||||||
|
Enum(ShaderEntryKind)
|
||||||
|
{
|
||||||
|
ShaderEntryKind_VS,
|
||||||
|
ShaderEntryKind_PS,
|
||||||
|
ShaderEntryKind_CS,
|
||||||
|
};
|
||||||
|
|
||||||
|
Struct(ShaderEntry)
|
||||||
|
{
|
||||||
|
ShaderEntry *next;
|
||||||
|
ShaderEntryKind kind;
|
||||||
|
String name;
|
||||||
|
};
|
||||||
|
|
||||||
|
Struct(ArcInfoEntry)
|
||||||
|
{
|
||||||
|
ArcInfoEntry *next;
|
||||||
|
String dir_path;
|
||||||
|
String store_name;
|
||||||
|
String out_path;
|
||||||
|
};
|
||||||
|
|
||||||
|
Struct(GpuComp)
|
||||||
|
{
|
||||||
|
String output;
|
||||||
|
i32 return_code;
|
||||||
|
};
|
||||||
|
|
||||||
|
Struct(ResComp)
|
||||||
|
{
|
||||||
|
String obj_file;
|
||||||
|
String output;
|
||||||
|
i32 return_code;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ## Phase 1
|
||||||
|
*
|
||||||
|
* <Parse layers> <Generate C> <Generate HLSL>
|
||||||
|
*
|
||||||
|
* <FULL BARRIER> -------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* ## Phase 2
|
||||||
|
*
|
||||||
|
* <C compile oscmd> <shader compile oscmds>
|
||||||
|
* |
|
||||||
|
* <FULL BARRIER> -------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* ## Phase 3
|
||||||
|
* <shader resource arcs> <embedded resource arcs>
|
||||||
|
* | |
|
||||||
|
* <FULL BARRIER> -------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* ## Phase 4
|
||||||
|
* <shader resource oscmd> <embedded resource oscmds>
|
||||||
|
* <FULL BARRIER> -------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* ## Phase 5
|
||||||
|
*
|
||||||
|
* <link oscmd>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* TODO: Dispatch OS Cmds asynchronously rather than synchronously waiting on each lane */
|
||||||
|
|
||||||
|
Struct(BuildData)
|
||||||
|
{
|
||||||
|
M_Layer flattened;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
M_ErrorList errors;
|
||||||
|
} cgen;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
M_ErrorList errors;
|
||||||
|
ShaderEntry *first_shader_entry;
|
||||||
|
ShaderEntry *last_shader_entry;
|
||||||
|
u64 shader_entries_count;
|
||||||
|
} gpugen;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
String obj_file;
|
||||||
|
String output;
|
||||||
|
i32 return_code;
|
||||||
|
} ccomp;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
GpuComp *array;
|
||||||
|
u32 count;
|
||||||
|
} gpucomps;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
M_ErrorList errors;
|
||||||
|
ArcInfoEntry *first_arc_entry;
|
||||||
|
ArcInfoEntry *last_arc_entry;
|
||||||
|
u64 arc_entries_count;
|
||||||
|
} arcinfogen;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ResComp *array;
|
||||||
|
u32 count;
|
||||||
|
} rescomps;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
String output;
|
||||||
|
i32 return_code;
|
||||||
|
} link;
|
||||||
|
};
|
||||||
|
|
||||||
|
BuildData *build = 0;
|
||||||
|
if (lane->idx == 0)
|
||||||
|
{
|
||||||
|
build = PushStruct(perm, BuildData);
|
||||||
|
}
|
||||||
|
WaveSyncBroadcast(lane, 0, &build);
|
||||||
|
|
||||||
i32 ret = 0;
|
i32 ret = 0;
|
||||||
|
|
||||||
M_Layer flattened = ZI;
|
//////////////////////////////
|
||||||
|
//- Parse meta layers
|
||||||
|
|
||||||
if (lane->idx == 0 && !ret)
|
if (lane->idx == 0 && !ret)
|
||||||
{
|
{
|
||||||
//- Lex layers
|
//- Lex layers
|
||||||
@ -364,52 +492,19 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
{
|
{
|
||||||
StringList starting_layer_names = ZI;
|
StringList starting_layer_names = ZI;
|
||||||
PushStringToList(perm, &starting_layer_names, cmdline.leaf_layer_name);
|
PushStringToList(perm, &starting_layer_names, cmdline.leaf_layer_name);
|
||||||
flattened = M_GetFlattenedEntries(perm, parsed, starting_layer_names);
|
build->flattened = M_GetFlattenedEntries(perm, parsed, starting_layer_names);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WaveSyncBroadcast(lane, 0, &flattened);
|
|
||||||
if (!ret) ret = flattened.errors.count > 0;
|
WaveSync(lane);
|
||||||
|
if (!ret) ret = build->flattened.errors.count > 0;
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- Prep
|
//- Generate C & HLSL files
|
||||||
|
|
||||||
/*
|
|
||||||
* ## Phase 1
|
|
||||||
*
|
|
||||||
* <C compile oscmd> <shader compile oscmds>
|
|
||||||
* |
|
|
||||||
* <FULL BARRIER> -------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* ## Phase 2
|
|
||||||
* <shader resource arcs> <embedded resource arcs>
|
|
||||||
* | |
|
|
||||||
* <FULL BARRIER> -------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* ## Phase 3
|
|
||||||
* <shader resource oscmd> <embedded resource oscmds>
|
|
||||||
* <FULL BARRIER> -------------------------------------------------------------
|
|
||||||
*
|
|
||||||
* ## Phase 4
|
|
||||||
*
|
|
||||||
* <link oscmd>
|
|
||||||
*/
|
|
||||||
|
|
||||||
String shader_store_name = Lit("ShadersStore");
|
|
||||||
String c_out_file = F_GetFull(perm, StringF(perm, "%F_gen_c.c", FmtString(cmdline.leaf_layer_name)));
|
|
||||||
String gpu_out_file = F_GetFull(perm, StringF(perm, "%F_gen_gpu.hlsl", FmtString(cmdline.leaf_layer_name)));
|
|
||||||
|
|
||||||
/* TODO: Dispatch OS Cmds asynchronously rather than synchronously waiting on each lane */
|
|
||||||
|
|
||||||
//////////////////////////////
|
|
||||||
//- Generate final C file
|
|
||||||
|
|
||||||
Struct(CGenData)
|
|
||||||
{
|
|
||||||
M_ErrorList errors;
|
|
||||||
};
|
|
||||||
CGenData cgen = ZI;
|
|
||||||
|
|
||||||
if (lane->idx == 0 && !ret)
|
if (lane->idx == 0 && !ret)
|
||||||
|
{
|
||||||
|
/* Generate C file */
|
||||||
{
|
{
|
||||||
String c_out_file = F_GetFull(perm, StringF(perm, "%F_gen_c.c", FmtString(cmdline.leaf_layer_name)));
|
String c_out_file = F_GetFull(perm, StringF(perm, "%F_gen_c.c", FmtString(cmdline.leaf_layer_name)));
|
||||||
StringList c_store_lines = ZI;
|
StringList c_store_lines = ZI;
|
||||||
@ -417,7 +512,7 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
StringList c_include_lines = ZI;
|
StringList c_include_lines = ZI;
|
||||||
StringList c_startup_lines = ZI;
|
StringList c_startup_lines = ZI;
|
||||||
{
|
{
|
||||||
for (M_Entry *entry = flattened.first; entry->valid; entry = entry->next)
|
for (M_Entry *entry = build->flattened.first; entry->valid; entry = entry->next)
|
||||||
{
|
{
|
||||||
M_EntryKind kind = entry->kind;
|
M_EntryKind kind = entry->kind;
|
||||||
M_Token *entry_tok = entry->name_token;
|
M_Token *entry_tok = entry->name_token;
|
||||||
@ -444,12 +539,12 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
String err = StringF(perm, "Directory '%F' not found", FmtString(full));
|
String err = StringF(perm, "Directory '%F' not found", FmtString(full));
|
||||||
M_PushError(perm, &cgen.errors, arg1_tok, err);
|
M_PushError(perm, &build->cgen.errors, arg1_tok, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
M_PushError(perm, &cgen.errors, entry_tok, Lit("Expected resource store & directory name"));
|
M_PushError(perm, &build->cgen.errors, entry_tok, Lit("Expected resource store & directory name"));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case M_EntryKind_VertexShader:
|
case M_EntryKind_VertexShader:
|
||||||
@ -469,7 +564,7 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
M_PushError(perm, &cgen.errors, entry_tok, Lit("Expected shader name"));
|
M_PushError(perm, &build->cgen.errors, entry_tok, Lit("Expected shader name"));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case M_EntryKind_IncludeC:
|
case M_EntryKind_IncludeC:
|
||||||
@ -488,12 +583,12 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
String err = StringF(perm, "File '%F' not found", FmtString(full));
|
String err = StringF(perm, "File '%F' not found", FmtString(full));
|
||||||
M_PushError(perm, &cgen.errors, arg0_tok, err);
|
M_PushError(perm, &build->cgen.errors, arg0_tok, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
M_PushError(perm, &cgen.errors, entry_tok, Lit("Expected file name"));
|
M_PushError(perm, &build->cgen.errors, entry_tok, Lit("Expected file name"));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case M_EntryKind_Startup:
|
case M_EntryKind_Startup:
|
||||||
@ -506,13 +601,13 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
M_PushError(perm, &cgen.errors, entry_tok, Lit("Expected startup function name"));
|
M_PushError(perm, &build->cgen.errors, entry_tok, Lit("Expected startup function name"));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cgen.errors.count == 0)
|
if (build->cgen.errors.count == 0)
|
||||||
{
|
{
|
||||||
StringList c_out_lines = ZI;
|
StringList c_out_lines = ZI;
|
||||||
PushStringToList(perm, &c_out_lines, Lit("// Auto generated file"));
|
PushStringToList(perm, &c_out_lines, Lit("// Auto generated file"));
|
||||||
@ -571,24 +666,8 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
F_ClearWrite(c_out_file, c_out);
|
F_ClearWrite(c_out_file, c_out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WaveSyncBroadcast(lane, 0, &cgen);
|
|
||||||
if (!ret) ret = cgen.errors.count > 0;
|
|
||||||
|
|
||||||
//////////////////////////////
|
/* Generate HLSL file */
|
||||||
//- Generate final HLSL file
|
|
||||||
|
|
||||||
Enum(ShaderEntryKind) { ShaderEntryKind_VS, ShaderEntryKind_PS, ShaderEntryKind_CS, };
|
|
||||||
Struct(ShaderEntry) { ShaderEntry *next; ShaderEntryKind kind; String name; };
|
|
||||||
Struct(GpuGenData)
|
|
||||||
{
|
|
||||||
M_ErrorList errors;
|
|
||||||
ShaderEntry *first_shader_entry;
|
|
||||||
ShaderEntry *last_shader_entry;
|
|
||||||
u64 shader_entries_count;
|
|
||||||
};
|
|
||||||
GpuGenData gpugen = ZI;
|
|
||||||
|
|
||||||
if (lane->idx == 0 && !ret)
|
|
||||||
{
|
{
|
||||||
/* Clear shader store */
|
/* Clear shader store */
|
||||||
OS_Mkdir(shader_store_name);
|
OS_Mkdir(shader_store_name);
|
||||||
@ -616,7 +695,7 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
{
|
{
|
||||||
StringList gpu_include_lines = ZI;
|
StringList gpu_include_lines = ZI;
|
||||||
{
|
{
|
||||||
for (M_Entry *entry = flattened.first; entry->valid; entry = entry->next)
|
for (M_Entry *entry = build->flattened.first; entry->valid; entry = entry->next)
|
||||||
{
|
{
|
||||||
M_EntryKind kind = entry->kind;
|
M_EntryKind kind = entry->kind;
|
||||||
M_Token *entry_tok = entry->name_token;
|
M_Token *entry_tok = entry->name_token;
|
||||||
@ -641,12 +720,12 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
String err = StringF(perm, "File '%F' not found", FmtString(full));
|
String err = StringF(perm, "File '%F' not found", FmtString(full));
|
||||||
M_PushError(perm, &gpugen.errors, arg0_tok, err);
|
M_PushError(perm, &build->gpugen.errors, arg0_tok, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
M_PushError(perm, &gpugen.errors, entry_tok, Lit("Expected file name"));
|
M_PushError(perm, &build->gpugen.errors, entry_tok, Lit("Expected file name"));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case M_EntryKind_VertexShader:
|
case M_EntryKind_VertexShader:
|
||||||
@ -663,18 +742,18 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
ShaderEntry *e = PushStruct(perm, ShaderEntry);
|
ShaderEntry *e = PushStruct(perm, ShaderEntry);
|
||||||
e->kind = shader_kind;
|
e->kind = shader_kind;
|
||||||
e->name = shader_name;
|
e->name = shader_name;
|
||||||
SllQueuePush(gpugen.first_shader_entry, gpugen.last_shader_entry, e);
|
SllQueuePush(build->gpugen.first_shader_entry, build->gpugen.last_shader_entry, e);
|
||||||
++gpugen.shader_entries_count;
|
++build->gpugen.shader_entries_count;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
M_PushError(perm, &gpugen.errors, entry_tok, Lit("Expected shader name"));
|
M_PushError(perm, &build->gpugen.errors, entry_tok, Lit("Expected shader name"));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (gpugen.errors.count == 0)
|
if (build->gpugen.errors.count == 0)
|
||||||
{
|
{
|
||||||
StringList gpu_out_lines = ZI;
|
StringList gpu_out_lines = ZI;
|
||||||
PushStringToList(perm, &gpu_out_lines, Lit("// Auto generated file"));
|
PushStringToList(perm, &gpu_out_lines, Lit("// Auto generated file"));
|
||||||
@ -702,58 +781,48 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WaveSyncBroadcast(lane, 0, &gpugen);
|
|
||||||
if (!ret) ret = gpugen.errors.count > 0;
|
build->gpucomps.count = build->gpugen.shader_entries_count;
|
||||||
|
build->gpucomps.array = PushStructs(perm, GpuComp, build->gpucomps.count);
|
||||||
|
}
|
||||||
|
|
||||||
|
WaveSync(lane);
|
||||||
|
if (!ret) ret = build->cgen.errors.count > 0;
|
||||||
|
if (!ret) ret = build->gpugen.errors.count > 0;
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- Compile C & Shaders
|
//- Compile C & Shaders
|
||||||
|
|
||||||
Struct(CComp)
|
|
||||||
{
|
|
||||||
String obj_file;
|
|
||||||
String output;
|
|
||||||
i32 return_code;
|
|
||||||
};
|
|
||||||
CComp ccomp = ZI;
|
|
||||||
|
|
||||||
Struct(GpuComp)
|
|
||||||
{
|
|
||||||
String output;
|
|
||||||
i32 return_code;
|
|
||||||
};
|
|
||||||
u32 gpucomps_count = gpugen.shader_entries_count;
|
|
||||||
GpuComp *gpucomps = PushStructs(perm, GpuComp, gpucomps_count);
|
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
{
|
{
|
||||||
/* Compile C */
|
/* Compile C */
|
||||||
u64 ccomp_task_idx = 0;
|
u64 ccomp_task_idx = 0;
|
||||||
if (lane->idx == WaveLaneIdxFromTaskIdx(lane, ccomp_task_idx))
|
if (lane->idx == WaveLaneIdxFromTaskIdx(lane, ccomp_task_idx))
|
||||||
{
|
{
|
||||||
ccomp.obj_file = StringF(perm, "%F_gen_c.obj", FmtString(cmdline.leaf_layer_name));
|
build->ccomp.obj_file = StringF(perm, "%F_gen_c.obj", FmtString(cmdline.leaf_layer_name));
|
||||||
String cmd = StringF(perm,
|
String cmd = StringF(perm,
|
||||||
"cl.exe /c %F -Fo:%F %F %F %F %F",
|
"cl.exe /c %F -Fo:%F %F %F %F %F",
|
||||||
FmtString(c_out_file),
|
FmtString(c_out_file),
|
||||||
FmtString(ccomp.obj_file),
|
FmtString(build->ccomp.obj_file),
|
||||||
FmtString(StringFromList(perm, cp.flags_msvc, Lit(" "))),
|
FmtString(StringFromList(perm, cp.flags_msvc, Lit(" "))),
|
||||||
FmtString(StringFromList(perm, cp.compiler_only_flags_msvc, Lit(" "))),
|
FmtString(StringFromList(perm, cp.compiler_only_flags_msvc, Lit(" "))),
|
||||||
FmtString(StringFromList(perm, cp.warnings_msvc, Lit(" "))),
|
FmtString(StringFromList(perm, cp.warnings_msvc, Lit(" "))),
|
||||||
FmtString(StringFromList(perm, cp.defs, Lit(" "))));
|
FmtString(StringFromList(perm, cp.defs, Lit(" "))));
|
||||||
OS_CommandResult cmd_result = OS_RunCommand(perm, cmd);
|
OS_CommandResult cmd_result = OS_RunCommand(perm, cmd);
|
||||||
String cmd_output = TrimWhitespace(cmd_result.output);
|
String cmd_output = TrimWhitespace(cmd_result.output);
|
||||||
ccomp.output = cmd_output;
|
build->ccomp.output = cmd_output;
|
||||||
ccomp.return_code = cmd_result.code;
|
build->ccomp.return_code = cmd_result.code;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compile shaders */
|
/* Compile shaders */
|
||||||
u32 gpucomp_idx = 0;
|
u32 gpucomp_idx = 0;
|
||||||
for (ShaderEntry *e = gpugen.first_shader_entry; e; e = e->next)
|
for (ShaderEntry *e = build->gpugen.first_shader_entry; e; e = e->next)
|
||||||
{
|
{
|
||||||
/* NOTE: Using gpucomp_idx + 1 as task index for parralelism w/ C compilation */
|
/* NOTE: Using gpucomp_idx + 1 as task index for parralelism w/ C compilation */
|
||||||
u64 gpucomp_task_idx = gpucomp_idx + 1;
|
u64 gpucomp_task_idx = gpucomp_idx + 1;
|
||||||
if (lane->idx == WaveLaneIdxFromTaskIdx(lane, gpucomp_task_idx))
|
if (lane->idx == WaveLaneIdxFromTaskIdx(lane, gpucomp_task_idx))
|
||||||
{
|
{
|
||||||
GpuComp *gpucomp = &gpucomps[gpucomp_idx];
|
GpuComp *gpucomp = &build->gpucomps.array[gpucomp_idx];
|
||||||
String out_file = StringF(perm, "%F/%F", FmtString(shader_store_name), FmtString(e->name));
|
String out_file = StringF(perm, "%F/%F", FmtString(shader_store_name), FmtString(e->name));
|
||||||
String target = e->kind == ShaderEntryKind_VS ? Lit("vs_6_6")
|
String target = e->kind == ShaderEntryKind_VS ? Lit("vs_6_6")
|
||||||
: e->kind == ShaderEntryKind_PS ? Lit("ps_6_6")
|
: e->kind == ShaderEntryKind_PS ? Lit("ps_6_6")
|
||||||
@ -779,31 +848,21 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
++gpucomp_idx;
|
++gpucomp_idx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WaveSyncBroadcast(lane, 0, &ccomp);
|
|
||||||
WaveSyncBroadcast(lane, 0, &gpucomps);
|
WaveSync(lane);
|
||||||
if (!ret) ret = ccomp.return_code;
|
if (!ret) ret = build->ccomp.return_code;
|
||||||
for (u32 i = 0; i < gpucomps_count; ++i)
|
for (u32 i = 0; i < build->gpucomps.count; ++i)
|
||||||
{
|
{
|
||||||
if (!ret) ret = gpucomps[i].return_code;
|
if (!ret) ret = build->gpucomps.array[i].return_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- Gather resource archive info
|
//- Gather resource archive info
|
||||||
|
|
||||||
Struct(ArcInfoEntry) { ArcInfoEntry *next; String dir_path; String store_name; String out_path; };
|
|
||||||
Struct(ArcInfoGen)
|
|
||||||
{
|
|
||||||
M_ErrorList errors;
|
|
||||||
ArcInfoEntry *first_arc_entry;
|
|
||||||
ArcInfoEntry *last_arc_entry;
|
|
||||||
u64 arc_entries_count;
|
|
||||||
};
|
|
||||||
ArcInfoGen arcinfogen = ZI;
|
|
||||||
|
|
||||||
if (lane->idx == 0 && !ret)
|
if (lane->idx == 0 && !ret)
|
||||||
{
|
{
|
||||||
/* Gather archives from embedded dirs */
|
/* Gather archives from embedded dirs */
|
||||||
for (M_Entry *entry = flattened.first; entry->valid; entry = entry->next)
|
for (M_Entry *entry = build->flattened.first; entry->valid; entry = entry->next)
|
||||||
{
|
{
|
||||||
M_EntryKind kind = entry->kind;
|
M_EntryKind kind = entry->kind;
|
||||||
M_Token *entry_tok = entry->name_token;
|
M_Token *entry_tok = entry->name_token;
|
||||||
@ -827,18 +886,18 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
arc->store_name = store_name;
|
arc->store_name = store_name;
|
||||||
arc->dir_path = full;
|
arc->dir_path = full;
|
||||||
arc->out_path = StringF(perm, "%F.arc", FmtString(store_name));
|
arc->out_path = StringF(perm, "%F.arc", FmtString(store_name));
|
||||||
SllQueuePush(arcinfogen.first_arc_entry, arcinfogen.last_arc_entry, arc);
|
SllQueuePush(build->arcinfogen.first_arc_entry, build->arcinfogen.last_arc_entry, arc);
|
||||||
++arcinfogen.arc_entries_count;
|
++build->arcinfogen.arc_entries_count;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
String err = StringF(perm, "Directory '%F' not found", FmtString(full));
|
String err = StringF(perm, "Directory '%F' not found", FmtString(full));
|
||||||
M_PushError(perm, &arcinfogen.errors, arg1_tok, err);
|
M_PushError(perm, &build->arcinfogen.errors, arg1_tok, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
M_PushError(perm, &arcinfogen.errors, entry_tok, Lit("Expected resource store & directory name"));
|
M_PushError(perm, &build->arcinfogen.errors, entry_tok, Lit("Expected resource store & directory name"));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
@ -849,19 +908,26 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
arc->store_name = shader_store_name;
|
arc->store_name = shader_store_name;
|
||||||
arc->dir_path = F_GetFullCrossPlatform(perm, shader_store_name);
|
arc->dir_path = F_GetFullCrossPlatform(perm, shader_store_name);
|
||||||
arc->out_path = StringF(perm, "%F.arc", FmtString(shader_store_name));
|
arc->out_path = StringF(perm, "%F.arc", FmtString(shader_store_name));
|
||||||
SllQueuePush(arcinfogen.first_arc_entry, arcinfogen.last_arc_entry, arc);
|
SllQueuePush(build->arcinfogen.first_arc_entry, build->arcinfogen.last_arc_entry, arc);
|
||||||
++arcinfogen.arc_entries_count;
|
++build->arcinfogen.arc_entries_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
build->rescomps.count = build->arcinfogen.arc_entries_count;
|
||||||
|
build->rescomps.array = PushStructs(perm, ResComp, build->rescomps.count);
|
||||||
}
|
}
|
||||||
WaveSyncBroadcast(lane, 0, &arcinfogen);
|
|
||||||
if (!ret) ret = arcinfogen.errors.count > 0;
|
WaveSync(lane);
|
||||||
|
if (!ret) ret = build->arcinfogen.errors.count > 0;
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- Generate resource archives
|
//- Generate resource archives
|
||||||
|
|
||||||
if (lane->idx == 0 && !ret)
|
if (!ret)
|
||||||
{
|
{
|
||||||
for (ArcInfoEntry *entry = arcinfogen.first_arc_entry; entry; entry = entry->next)
|
u32 task_idx = 0;
|
||||||
|
for (ArcInfoEntry *entry = build->arcinfogen.first_arc_entry; entry; entry = entry->next)
|
||||||
|
{
|
||||||
|
if (lane->idx == WaveLaneIdxFromTaskIdx(lane, task_idx))
|
||||||
{
|
{
|
||||||
String dir_path = entry->dir_path;
|
String dir_path = entry->dir_path;
|
||||||
String store_name = entry->store_name;
|
String store_name = entry->store_name;
|
||||||
@ -965,29 +1031,24 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
F_ClearWrite(arc_path, arc_contents);
|
F_ClearWrite(arc_path, arc_contents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
++task_idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
WaveSync(lane);
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- Compile resource archives
|
//- Compile resource archives
|
||||||
|
|
||||||
Struct(ResComp)
|
|
||||||
{
|
|
||||||
String obj_file;
|
|
||||||
String output;
|
|
||||||
i32 return_code;
|
|
||||||
};
|
|
||||||
u32 rescomps_count = arcinfogen.arc_entries_count;
|
|
||||||
ResComp *rescomps = PushStructs(perm, ResComp, rescomps_count);
|
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
{
|
{
|
||||||
if (IsPlatformWindows)
|
if (IsPlatformWindows)
|
||||||
{
|
{
|
||||||
i32 rescomp_idx = 0;
|
i32 rescomp_idx = 0;
|
||||||
for (ArcInfoEntry *entry = arcinfogen.first_arc_entry; entry; entry = entry->next)
|
for (ArcInfoEntry *entry = build->arcinfogen.first_arc_entry; entry; entry = entry->next)
|
||||||
{
|
{
|
||||||
if (lane->idx == WaveLaneIdxFromTaskIdx(lane, rescomp_idx))
|
if (lane->idx == WaveLaneIdxFromTaskIdx(lane, rescomp_idx))
|
||||||
{
|
{
|
||||||
ResComp *rescomp = &rescomps[rescomp_idx];
|
ResComp *rescomp = &build->rescomps.array[rescomp_idx];
|
||||||
|
|
||||||
String arc_path = entry->out_path;
|
String arc_path = entry->out_path;
|
||||||
|
|
||||||
@ -1021,25 +1082,19 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* TODO: Compile object files using .incbin on non-windows platforms */
|
/* TODO: Compile object files using .incbin on non-windows platforms */
|
||||||
Panic(Lit("Non-windows embedded format not implemented"));
|
Panic(Lit("Embedded format not implemented for this platform"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
WaveSyncBroadcast(lane, 0, &rescomps);
|
|
||||||
for (u32 i = 0; i < rescomps_count; ++i)
|
WaveSync(lane);
|
||||||
|
for (u32 i = 0; i < build->rescomps.count; ++i)
|
||||||
{
|
{
|
||||||
if (!ret) ret = rescomps[i].return_code;
|
if (!ret) ret = build->rescomps.array[i].return_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- Link
|
//- Link
|
||||||
|
|
||||||
Struct(Link)
|
|
||||||
{
|
|
||||||
String output;
|
|
||||||
i32 return_code;
|
|
||||||
};
|
|
||||||
Link link = ZI;
|
|
||||||
|
|
||||||
if (lane->idx == 0 && !ret)
|
if (lane->idx == 0 && !ret)
|
||||||
{
|
{
|
||||||
String exe_file = StringF(perm, "%F.exe", FmtString(cmdline.leaf_layer_name));
|
String exe_file = StringF(perm, "%F.exe", FmtString(cmdline.leaf_layer_name));
|
||||||
@ -1055,10 +1110,10 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
String obj_files_str = ZI;
|
String obj_files_str = ZI;
|
||||||
{
|
{
|
||||||
StringList obj_files = ZI;
|
StringList obj_files = ZI;
|
||||||
PushStringToList(perm, &obj_files, ccomp.obj_file);
|
PushStringToList(perm, &obj_files, build->ccomp.obj_file);
|
||||||
for (u64 rescomp_idx = 0; rescomp_idx < rescomps_count; ++rescomp_idx)
|
for (u64 rescomp_idx = 0; rescomp_idx < build->rescomps.count; ++rescomp_idx)
|
||||||
{
|
{
|
||||||
ResComp *rescomp = &rescomps[rescomp_idx];
|
ResComp *rescomp = &build->rescomps.array[rescomp_idx];
|
||||||
PushStringToList(perm, &obj_files, rescomp->obj_file);
|
PushStringToList(perm, &obj_files, rescomp->obj_file);
|
||||||
}
|
}
|
||||||
obj_files_str = StringFromList(perm, obj_files, Lit(" "));
|
obj_files_str = StringFromList(perm, obj_files, Lit(" "));
|
||||||
@ -1071,13 +1126,14 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
FmtString(StringFromList(perm, cp.flags_msvc, Lit(" "))),
|
FmtString(StringFromList(perm, cp.flags_msvc, Lit(" "))),
|
||||||
FmtString(StringFromList(perm, cp.linker_only_flags_msvc, Lit(" "))));
|
FmtString(StringFromList(perm, cp.linker_only_flags_msvc, Lit(" "))));
|
||||||
OS_CommandResult result = OS_RunCommand(perm, cmd);
|
OS_CommandResult result = OS_RunCommand(perm, cmd);
|
||||||
link.output = TrimWhitespace(result.output);
|
build->link.output = TrimWhitespace(result.output);
|
||||||
link.return_code = result.code;
|
build->link.return_code = result.code;
|
||||||
i64 link_elapsed_ns = TimeNs() - start_ns;
|
i64 link_elapsed_ns = TimeNs() - start_ns;
|
||||||
// EchoLine(StringF(perm, ">>>>> Linked in %Fs", FmtFloat(SecondsFromNs(link_elapsed_ns))));
|
// EchoLine(StringF(perm, ">>>>> Linked in %Fs", FmtFloat(SecondsFromNs(link_elapsed_ns))));
|
||||||
}
|
}
|
||||||
WaveSyncBroadcast(lane, 0, &link);
|
|
||||||
if (!ret) ret = link.return_code;
|
WaveSync(lane);
|
||||||
|
if (!ret) ret = build->link.return_code;
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
//- Process output & errors
|
//- Process output & errors
|
||||||
@ -1087,9 +1143,9 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
String gpucomp_output = ZI;
|
String gpucomp_output = ZI;
|
||||||
{
|
{
|
||||||
StringList gpucomp_outputs = ZI;
|
StringList gpucomp_outputs = ZI;
|
||||||
for (u32 gpucomp_idx = 0; gpucomp_idx < gpucomps_count; ++gpucomp_idx)
|
for (u32 gpucomp_idx = 0; gpucomp_idx < build->gpucomps.count; ++gpucomp_idx)
|
||||||
{
|
{
|
||||||
GpuComp *gpucomp = &gpucomps[gpucomp_idx];
|
GpuComp *gpucomp = &build->gpucomps.array[gpucomp_idx];
|
||||||
PushStringToList(perm, &gpucomp_outputs, gpucomp->output);
|
PushStringToList(perm, &gpucomp_outputs, gpucomp->output);
|
||||||
}
|
}
|
||||||
gpucomp_output = StringFromList(perm, gpucomp_outputs, Lit("\n"));
|
gpucomp_output = StringFromList(perm, gpucomp_outputs, Lit("\n"));
|
||||||
@ -1097,21 +1153,21 @@ void BuildEntryPoint(WaveLaneCtx *lane, void *udata)
|
|||||||
String rescomp_output = ZI;
|
String rescomp_output = ZI;
|
||||||
{
|
{
|
||||||
StringList rescomp_outputs = ZI;
|
StringList rescomp_outputs = ZI;
|
||||||
for (u32 rescomp_idx = 0; rescomp_idx < rescomps_count; ++rescomp_idx)
|
for (u32 rescomp_idx = 0; rescomp_idx < build->rescomps.count; ++rescomp_idx)
|
||||||
{
|
{
|
||||||
ResComp *rescomp = &rescomps[rescomp_idx];
|
ResComp *rescomp = &build->rescomps.array[rescomp_idx];
|
||||||
PushStringToList(perm, &rescomp_outputs, rescomp->output);
|
PushStringToList(perm, &rescomp_outputs, rescomp->output);
|
||||||
}
|
}
|
||||||
rescomp_output = StringFromList(perm, rescomp_outputs, Lit("\n"));
|
rescomp_output = StringFromList(perm, rescomp_outputs, Lit("\n"));
|
||||||
}
|
}
|
||||||
EchoLineOrNothing(StringFromMetaErrors(perm, flattened.errors));
|
EchoLineOrNothing(StringFromMetaErrors(perm, build->flattened.errors));
|
||||||
EchoLineOrNothing(StringFromMetaErrors(perm, cgen.errors));
|
EchoLineOrNothing(StringFromMetaErrors(perm, build->cgen.errors));
|
||||||
EchoLineOrNothing(StringFromMetaErrors(perm, gpugen.errors));
|
EchoLineOrNothing(StringFromMetaErrors(perm, build->gpugen.errors));
|
||||||
EchoLineOrNothing(ccomp.output);
|
EchoLineOrNothing(build->ccomp.output);
|
||||||
EchoLineOrNothing(gpucomp_output);
|
EchoLineOrNothing(gpucomp_output);
|
||||||
EchoLineOrNothing(StringFromMetaErrors(perm, arcinfogen.errors));
|
EchoLineOrNothing(StringFromMetaErrors(perm, build->arcinfogen.errors));
|
||||||
EchoLineOrNothing(rescomp_output);
|
EchoLineOrNothing(rescomp_output);
|
||||||
EchoLineOrNothing(link.output);
|
EchoLineOrNothing(build->link.output);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user