mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 21:58:31 +09:00
[Fix] (Link, Async): carry the resolved gl_PointSize capture request into the SPIR-V handoff and let a deferred verdict name its own severity - the demotion read the request off a reflection slice phase A never fills it into, so its forced carrier was dead code, and its decline reason replayed at a level no shipped build keeps
This commit is contained in:
@@ -95,11 +95,13 @@ namespace MobileGL::MG_Util::Async {
|
||||
// which means std::terminate for the whole process. Every job boundary contains
|
||||
// it and reports the job as Cancelled; the joining GL thread then sees a node
|
||||
// that produced no result, which is the same shape as an abandoned node.
|
||||
diagnostics.logLines.push_back(std::format("Job body threw: {}", e.what()));
|
||||
diagnostics.logLines.push_back(
|
||||
{MOBILEGL_LOG_LEVEL_DEBUG, std::format("Job body threw: {}", e.what())});
|
||||
TryTransition(JobState::Running, JobState::Cancelled);
|
||||
return;
|
||||
} catch (...) {
|
||||
diagnostics.logLines.emplace_back("Job body threw a non-std exception");
|
||||
diagnostics.logLines.push_back(
|
||||
{MOBILEGL_LOG_LEVEL_DEBUG, String("Job body threw a non-std exception")});
|
||||
TryTransition(JobState::Running, JobState::Cancelled);
|
||||
return;
|
||||
}
|
||||
@@ -162,10 +164,27 @@ namespace MobileGL::MG_Util::Async {
|
||||
"being written");
|
||||
|
||||
if (!node.diagnostics.logLines.empty()) {
|
||||
Vector<String> lines;
|
||||
Vector<DeferredLogLine> lines;
|
||||
lines.swap(node.diagnostics.logLines);
|
||||
for (const String& line : lines) {
|
||||
MGLOG_D("%s", line.c_str());
|
||||
for (const DeferredLogLine& line : lines) {
|
||||
// Per-line severity, because a shipped build compiles MGLOG_D away entirely
|
||||
// and a verdict that only this channel records would vanish with it. The
|
||||
// levels are the compile-time constants, so a suppressed one costs nothing
|
||||
// beyond the string the worker already built.
|
||||
switch (line.level) {
|
||||
case MOBILEGL_LOG_LEVEL_INFO:
|
||||
MGLOG_I("%s", line.text.c_str());
|
||||
break;
|
||||
case MOBILEGL_LOG_LEVEL_WARN:
|
||||
MGLOG_W("%s", line.text.c_str());
|
||||
break;
|
||||
case MOBILEGL_LOG_LEVEL_ERROR:
|
||||
MGLOG_E("%s", line.text.c_str());
|
||||
break;
|
||||
default:
|
||||
MGLOG_D("%s", line.text.c_str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#pragma once
|
||||
#include <Includes.h>
|
||||
#include <MG_Util/Types.h>
|
||||
#include <MG_Util/Debug/Log.h>
|
||||
#include <MG_State/GLState/ErrorState/ErrorCode.h>
|
||||
#include <MG_State/GLState/ErrorState/ErrorInfo.h>
|
||||
|
||||
@@ -35,9 +36,25 @@ namespace MobileGL::MG_Util::Async {
|
||||
UniquePtr<ErrorInfo> info;
|
||||
};
|
||||
|
||||
// One line of worker-side MGLOG text, with the severity the join replays it at.
|
||||
//
|
||||
// DEBUG is the default and stays the default: nearly every deferred line is per-program
|
||||
// trace that a shipped build compiles out, which is the whole reason this channel could
|
||||
// be a plain string vector for as long as it was. A line a SHIPPED build has to show -
|
||||
// the reason a repair refused, which no other surface records - has to name its level
|
||||
// here, or it is formatted on the worker and then thrown away at replay under the INFO
|
||||
// level every device and CI build pins. Callers that sit on a repeated path latch at
|
||||
// the SOURCE (a per-call-site atomic, exactly what MGLOG_*_ONCE does): the replay below
|
||||
// is one shared site for every job in the tree, so a latch there would silence
|
||||
// unrelated lines.
|
||||
struct DeferredLogLine {
|
||||
Int level = MOBILEGL_LOG_LEVEL_DEBUG;
|
||||
String text;
|
||||
};
|
||||
|
||||
struct JobDiagnostics {
|
||||
Vector<DeferredError> errors; // replayed, in ascending `sequence`, by the join
|
||||
Vector<String> logLines; // worker-side MGLOG text, flushed in order by the join
|
||||
Vector<DeferredError> errors; // replayed, in ascending `sequence`, by the join
|
||||
Vector<DeferredLogLine> logLines; // worker-side MGLOG text, flushed in order by the join
|
||||
};
|
||||
|
||||
// The scheduling primitive every asynchronous compile and link is built on. A node owns
|
||||
|
||||
Reference in New Issue
Block a user