GPU: ShaderLog: Add more const correctness & notes supports
The metal shader compiler can produce `note` reports. Treat them as warnings.
This commit is contained in:
@@ -34,7 +34,7 @@ namespace blender::gpu {
|
||||
#define DEBUG_DEPENDENCIES 0
|
||||
|
||||
void Shader::print_log(Span<const char *> sources,
|
||||
char *log,
|
||||
const char *log,
|
||||
const char *stage,
|
||||
const bool error,
|
||||
GPULogParser *parser)
|
||||
@@ -80,7 +80,7 @@ void Shader::print_log(Span<const char *> sources,
|
||||
sources_end_line.append(0);
|
||||
}
|
||||
|
||||
char *log_line = log, *line_end;
|
||||
const char *log_line = log, *line_end;
|
||||
|
||||
LogCursor previous_location;
|
||||
|
||||
@@ -223,6 +223,9 @@ void Shader::print_log(Span<const char *> sources,
|
||||
else if (log_item.severity == Severity::Error) {
|
||||
BLI_dynstr_appendf(dynstr, "%s%s%s: ", warn_col, "Warning", info_col);
|
||||
}
|
||||
else if (log_item.severity == Severity::Note) {
|
||||
BLI_dynstr_appendf(dynstr, "%s%s%s: ", warn_col, "Note", info_col);
|
||||
}
|
||||
/* Print the error itself. */
|
||||
BLI_dynstr_append(dynstr, info_col);
|
||||
BLI_dynstr_nappend(dynstr, log_line, (line_end + 1) - log_line);
|
||||
@@ -237,7 +240,8 @@ void Shader::print_log(Span<const char *> sources,
|
||||
CLG_Severity severity = error ? CLG_SEVERITY_ERROR : CLG_SEVERITY_WARN;
|
||||
|
||||
if (((LOG.type->flag & CLG_FLAG_USE) && (LOG.type->level >= 0)) ||
|
||||
(severity >= CLG_SEVERITY_WARN)) {
|
||||
(severity >= CLG_SEVERITY_WARN))
|
||||
{
|
||||
const char *_str = BLI_dynstr_get_cstring(dynstr);
|
||||
CLG_log_str(LOG.type, severity, this->name, stage, _str);
|
||||
MEM_freeN((void *)_str);
|
||||
@@ -246,10 +250,11 @@ void Shader::print_log(Span<const char *> sources,
|
||||
BLI_dynstr_free(dynstr);
|
||||
}
|
||||
|
||||
char *GPULogParser::skip_severity(char *log_line,
|
||||
GPULogItem &log_item,
|
||||
const char *error_msg,
|
||||
const char *warning_msg) const
|
||||
const char *GPULogParser::skip_severity(const char *log_line,
|
||||
GPULogItem &log_item,
|
||||
const char *error_msg,
|
||||
const char *warning_msg,
|
||||
const char *note_msg) const
|
||||
{
|
||||
if (STREQLEN(log_line, error_msg, strlen(error_msg))) {
|
||||
log_line += strlen(error_msg);
|
||||
@@ -259,10 +264,14 @@ char *GPULogParser::skip_severity(char *log_line,
|
||||
log_line += strlen(warning_msg);
|
||||
log_item.severity = Severity::Warning;
|
||||
}
|
||||
else if (STREQLEN(log_line, note_msg, strlen(note_msg))) {
|
||||
log_line += strlen(note_msg);
|
||||
log_item.severity = Severity::Note;
|
||||
}
|
||||
return log_line;
|
||||
}
|
||||
|
||||
char *GPULogParser::skip_separators(char *log_line, const StringRef separators) const
|
||||
const char *GPULogParser::skip_separators(const char *log_line, const StringRef separators) const
|
||||
{
|
||||
while (at_any(log_line, separators)) {
|
||||
log_line++;
|
||||
@@ -270,9 +279,9 @@ char *GPULogParser::skip_separators(char *log_line, const StringRef separators)
|
||||
return log_line;
|
||||
}
|
||||
|
||||
char *GPULogParser::skip_until(char *log_line, char stop_char) const
|
||||
const char *GPULogParser::skip_until(const char *log_line, char stop_char) const
|
||||
{
|
||||
char *cursor = log_line;
|
||||
const char *cursor = log_line;
|
||||
while (!ELEM(cursor[0], '\n', '\0')) {
|
||||
if (cursor[0] == stop_char) {
|
||||
return cursor;
|
||||
@@ -292,9 +301,9 @@ bool GPULogParser::at_any(const char *log_line, const StringRef chars) const
|
||||
return chars.find(log_line[0]) != StringRef::not_found;
|
||||
}
|
||||
|
||||
int GPULogParser::parse_number(const char *log_line, char **r_new_position) const
|
||||
int GPULogParser::parse_number(const char *log_line, const char **r_new_position) const
|
||||
{
|
||||
return int(strtol(log_line, r_new_position, 10));
|
||||
return int(strtol(log_line, const_cast<char **>(r_new_position), 10));
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
@@ -97,8 +97,11 @@ class Shader {
|
||||
static void set_framebuffer_srgb_target(int use_srgb_to_linear);
|
||||
|
||||
protected:
|
||||
void print_log(
|
||||
Span<const char *> sources, char *log, const char *stage, bool error, GPULogParser *parser);
|
||||
void print_log(Span<const char *> sources,
|
||||
const char *log,
|
||||
const char *stage,
|
||||
bool error,
|
||||
GPULogParser *parser);
|
||||
};
|
||||
|
||||
/* Syntactic sugar. */
|
||||
@@ -119,6 +122,7 @@ enum class Severity {
|
||||
Unknown,
|
||||
Warning,
|
||||
Error,
|
||||
Note,
|
||||
};
|
||||
|
||||
struct LogCursor {
|
||||
@@ -135,18 +139,19 @@ struct GPULogItem {
|
||||
|
||||
class GPULogParser {
|
||||
public:
|
||||
virtual char *parse_line(char *log_line, GPULogItem &log_item) = 0;
|
||||
virtual const char *parse_line(const char *log_line, GPULogItem &log_item) = 0;
|
||||
|
||||
protected:
|
||||
char *skip_severity(char *log_line,
|
||||
GPULogItem &log_item,
|
||||
const char *error_msg,
|
||||
const char *warning_msg) const;
|
||||
char *skip_separators(char *log_line, const StringRef separators) const;
|
||||
char *skip_until(char *log_line, char stop_char) const;
|
||||
const char *skip_severity(const char *log_line,
|
||||
GPULogItem &log_item,
|
||||
const char *error_msg,
|
||||
const char *warning_msg,
|
||||
const char *note_msg) const;
|
||||
const char *skip_separators(const char *log_line, const StringRef separators) const;
|
||||
const char *skip_until(const char *log_line, char stop_char) const;
|
||||
bool at_number(const char *log_line) const;
|
||||
bool at_any(const char *log_line, const StringRef chars) const;
|
||||
int parse_number(const char *log_line, char **r_new_position) const;
|
||||
int parse_number(const char *log_line, const char **r_new_position) const;
|
||||
|
||||
MEM_CXX_CLASS_ALLOC_FUNCS("GPULogParser");
|
||||
};
|
||||
|
||||
@@ -95,11 +95,11 @@ class GLShader : public Shader {
|
||||
|
||||
class GLLogParser : public GPULogParser {
|
||||
public:
|
||||
char *parse_line(char *log_line, GPULogItem &log_item) override;
|
||||
const char *parse_line(const char *log_line, GPULogItem &log_item) override;
|
||||
|
||||
protected:
|
||||
char *skip_severity_prefix(char *log_line, GPULogItem &log_item);
|
||||
char *skip_severity_keyword(char *log_line, GPULogItem &log_item);
|
||||
const char *skip_severity_prefix(const char *log_line, GPULogItem &log_item);
|
||||
const char *skip_severity_keyword(const char *log_line, GPULogItem &log_item);
|
||||
|
||||
MEM_CXX_CLASS_ALLOC_FUNCS("GLLogParser");
|
||||
};
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
namespace blender::gpu {
|
||||
|
||||
char *GLLogParser::parse_line(char *log_line, GPULogItem &log_item)
|
||||
const char *GLLogParser::parse_line(const char *log_line, GPULogItem &log_item)
|
||||
{
|
||||
/* Skip ERROR: or WARNING:. */
|
||||
log_line = skip_severity_prefix(log_line, log_item);
|
||||
@@ -19,7 +19,7 @@ char *GLLogParser::parse_line(char *log_line, GPULogItem &log_item)
|
||||
|
||||
/* Parse error line & char numbers. */
|
||||
if (at_number(log_line)) {
|
||||
char *error_line_number_end;
|
||||
const char *error_line_number_end;
|
||||
log_item.cursor.row = parse_number(log_line, &error_line_number_end);
|
||||
/* Try to fetch the error character (not always available). */
|
||||
if (at_any(error_line_number_end, "(:") && at_number(&error_line_number_end[1])) {
|
||||
@@ -70,14 +70,14 @@ char *GLLogParser::parse_line(char *log_line, GPULogItem &log_item)
|
||||
return log_line;
|
||||
}
|
||||
|
||||
char *GLLogParser::skip_severity_prefix(char *log_line, GPULogItem &log_item)
|
||||
const char *GLLogParser::skip_severity_prefix(const char *log_line, GPULogItem &log_item)
|
||||
{
|
||||
return skip_severity(log_line, log_item, "ERROR", "WARNING");
|
||||
return skip_severity(log_line, log_item, "ERROR", "WARNING", "NOTE");
|
||||
}
|
||||
|
||||
char *GLLogParser::skip_severity_keyword(char *log_line, GPULogItem &log_item)
|
||||
const char *GLLogParser::skip_severity_keyword(const char *log_line, GPULogItem &log_item)
|
||||
{
|
||||
return skip_severity(log_line, log_item, "error", "warning");
|
||||
return skip_severity(log_line, log_item, "error", "warning", "note");
|
||||
}
|
||||
|
||||
} // namespace blender::gpu
|
||||
|
||||
@@ -11,14 +11,14 @@
|
||||
|
||||
namespace blender::gpu {
|
||||
|
||||
char *VKLogParser::parse_line(char *log_line, GPULogItem &log_item)
|
||||
const char *VKLogParser::parse_line(const char *log_line, GPULogItem &log_item)
|
||||
{
|
||||
log_line = skip_name(log_line);
|
||||
log_line = skip_separators(log_line, ":");
|
||||
|
||||
/* Parse error line & char numbers. */
|
||||
if (at_number(log_line)) {
|
||||
char *error_line_number_end;
|
||||
const char *error_line_number_end;
|
||||
log_item.cursor.row = parse_number(log_line, &error_line_number_end);
|
||||
log_line = error_line_number_end;
|
||||
}
|
||||
@@ -31,14 +31,14 @@ char *VKLogParser::parse_line(char *log_line, GPULogItem &log_item)
|
||||
return log_line;
|
||||
}
|
||||
|
||||
char *VKLogParser::skip_name(char *log_line)
|
||||
const char *VKLogParser::skip_name(const char *log_line)
|
||||
{
|
||||
return skip_until(log_line, ':');
|
||||
}
|
||||
|
||||
char *VKLogParser::skip_severity_keyword(char *log_line, GPULogItem &log_item)
|
||||
const char *VKLogParser::skip_severity_keyword(const char *log_line, GPULogItem &log_item)
|
||||
{
|
||||
return skip_severity(log_line, log_item, "error", "warning");
|
||||
return skip_severity(log_line, log_item, "error", "warning", "note");
|
||||
}
|
||||
|
||||
} // namespace blender::gpu
|
||||
|
||||
@@ -7,10 +7,10 @@ namespace blender::gpu {
|
||||
|
||||
class VKLogParser : public GPULogParser {
|
||||
public:
|
||||
char *parse_line(char *log_line, GPULogItem &log_item) override;
|
||||
const char *parse_line(const char *log_line, GPULogItem &log_item) override;
|
||||
|
||||
protected:
|
||||
char *skip_name(char *log_line);
|
||||
char *skip_severity_keyword(char *log_line, GPULogItem &log_item);
|
||||
const char *skip_name(const char *log_line);
|
||||
const char *skip_severity_keyword(const char *log_line, GPULogItem &log_item);
|
||||
};
|
||||
} // namespace blender::gpu
|
||||
|
||||
Reference in New Issue
Block a user