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:
Clément Foucault
2023-05-03 18:58:27 +02:00
parent b0c7e83805
commit e39c3c600c
6 changed files with 53 additions and 39 deletions

View File

@@ -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));
}
/** \} */

View File

@@ -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");
};

View File

@@ -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");
};

View File

@@ -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

View File

@@ -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

View File

@@ -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