Thanks to the new `ShaderCreateInfo` we now include source files without any modification. This let us query which are the source files passed to the `print_log` function. The log will now include a file with row and column number which is interpreted as a link in most IDE. DEBUG_CONTEXT_LINES will add more lines around the error lines for more context. This is also useful if the error line is imprecise (because of driver bugs) and the reported line is not sufficient to know the location of the error. The DEBUG_DEPENDENCIES option will display the list of included files in the shader sources. Note that it will not print generated source. This commit also fixes some issues with unhelpful logs, bogus row & column numbers, other error format, and bug if row was 0.
97 lines
3.3 KiB
C++
97 lines
3.3 KiB
C++
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2021 Blender Foundation.
|
|
* All rights reserved.
|
|
*/
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*/
|
|
|
|
#include "gl_shader.hh"
|
|
|
|
#include "GPU_platform.h"
|
|
|
|
namespace blender::gpu {
|
|
|
|
char *GLLogParser::parse_line(char *log_line, GPULogItem &log_item)
|
|
{
|
|
/* Skip ERROR: or WARNING:. */
|
|
log_line = skip_severity_prefix(log_line, log_item);
|
|
log_line = skip_separators(log_line, "(: ");
|
|
|
|
/* Parse error line & char numbers. */
|
|
if (at_number(log_line)) {
|
|
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])) {
|
|
log_item.cursor.column = parse_number(error_line_number_end + 1, &log_line);
|
|
}
|
|
else {
|
|
log_line = error_line_number_end;
|
|
}
|
|
/* There can be a 3rd number (case of mesa driver). */
|
|
if (at_any(log_line, "(:") && at_number(&log_line[1])) {
|
|
log_item.cursor.source = log_item.cursor.row;
|
|
log_item.cursor.row = log_item.cursor.column;
|
|
log_item.cursor.column = parse_number(log_line + 1, &error_line_number_end);
|
|
log_line = error_line_number_end;
|
|
}
|
|
}
|
|
|
|
if ((log_item.cursor.row != -1) && (log_item.cursor.column != -1)) {
|
|
if (GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_ANY, GPU_DRIVER_OFFICIAL) ||
|
|
GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_MAC, GPU_DRIVER_OFFICIAL)) {
|
|
/* 0:line */
|
|
log_item.cursor.row = log_item.cursor.column;
|
|
log_item.cursor.column = -1;
|
|
}
|
|
else if (GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_UNIX, GPU_DRIVER_OFFICIAL) &&
|
|
/* WORKAROUND(@fclem): Both Mesa and amdgpu-pro are reported as official. */
|
|
StringRefNull(GPU_platform_version()).find(" Mesa ") == -1) {
|
|
/* source:row */
|
|
log_item.cursor.source = log_item.cursor.row;
|
|
log_item.cursor.row = log_item.cursor.column;
|
|
log_item.cursor.column = -1;
|
|
log_item.source_base_row = true;
|
|
}
|
|
else {
|
|
/* line:char */
|
|
}
|
|
}
|
|
|
|
log_line = skip_separators(log_line, ":) ");
|
|
|
|
/* Skip to message. Avoid redundant info. */
|
|
log_line = skip_severity_keyword(log_line, log_item);
|
|
log_line = skip_separators(log_line, ":) ");
|
|
|
|
return log_line;
|
|
}
|
|
|
|
char *GLLogParser::skip_severity_prefix(char *log_line, GPULogItem &log_item)
|
|
{
|
|
return skip_severity(log_line, log_item, "ERROR", "WARNING");
|
|
}
|
|
|
|
char *GLLogParser::skip_severity_keyword(char *log_line, GPULogItem &log_item)
|
|
{
|
|
return skip_severity(log_line, log_item, "error", "warning");
|
|
}
|
|
|
|
} // namespace blender::gpu
|