diff --git a/src/meta/meta.c b/src/meta/meta.c index 539c2da9..457324ff 100644 --- a/src/meta/meta.c +++ b/src/meta/meta.c @@ -985,23 +985,58 @@ void M_BuildEntryPoint(WaveLaneCtx *lane) { String gpu_obj_output = Zi; { - M_GpuObj *disp_obj = 0; + b32 ok = 1; + StringList success_gpu_obj_outputs = Zi; + StringList error_gpu_obj_outputs = Zi; for (u32 gpu_obj_idx = 0; gpu_obj_idx < M.gpu_objs.count; ++gpu_obj_idx) { M_GpuObj *gpu_obj = &M.gpu_objs.array[gpu_obj_idx]; - if (!disp_obj || TrimWhitespace(disp_obj->output).len == 0 || gpu_obj->return_code != 0) + String output = TrimWhitespace(gpu_obj->output); + b32 obj_errored = gpu_obj->return_code != 0; + if (obj_errored) { - disp_obj = gpu_obj; + ok = 0; + } + if (output.len > 0) + { + String msg = output; + if (!StringContains(msg, Lit("In file"))) + { + // If error message is missing "In file" then it may have + // failed to even find the entry point, meaning we should + // include the name of the shader in the error message for + // clarification. + msg = StringF( + perm, + "Error compiling shader \"%F\"\n%F", + FmtString(gpu_obj->name), + FmtString(output) + ); + } + if (obj_errored) + { + if (error_gpu_obj_outputs.count == 0) + { + PushStringToList(perm, &error_gpu_obj_outputs, msg); + } + } + else + { + PushStringToList(perm, &success_gpu_obj_outputs, msg); + } } } - if (disp_obj) + if (ok) { - gpu_obj_output = StringF( - perm, - "%F\n%F", - FmtString(disp_obj->name), - FmtString(TrimWhitespace(disp_obj->output)) - ); + gpu_obj_output = StringFromList(perm, success_gpu_obj_outputs, Lit("\n")); + } + else + { + gpu_obj_output = StringFromList(perm, error_gpu_obj_outputs, Lit("\n")); + if (TrimWhitespace(gpu_obj_output).len == 0) + { + gpu_obj_output = Lit("Unknown error compiling shaders"); + } } } String embed_obj_output = Zi;