Shader: Error fixes
This commit is contained in:
parent
8784ec9b47
commit
447cdfddc9
|
|
@ -36,7 +36,7 @@ namespace Nz::ShaderLang
|
|||
#include <Nazara/Shader/ShaderLangErrorList.hpp>
|
||||
};
|
||||
|
||||
class Error : public std::exception
|
||||
class NAZARA_SHADER_API Error : public std::exception
|
||||
{
|
||||
public:
|
||||
inline Error(SourceLocation sourceLocation, ErrorCategory errorCategory, ErrorType errorType) noexcept;
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ namespace Nz::ShaderAst
|
|||
{
|
||||
if (index < availableIndices.GetSize())
|
||||
{
|
||||
if (!availableIndices.Test(index))
|
||||
if (!availableIndices.Test(index) && !preregisteredIndices.UnboundedTest(index))
|
||||
throw ShaderLang::AstAlreadyUsedIndexPreregisterError{ sourceLocation, index };
|
||||
}
|
||||
else if (index >= availableIndices.GetSize())
|
||||
|
|
@ -1258,16 +1258,16 @@ namespace Nz::ShaderAst
|
|||
{
|
||||
if (member.cond.HasValue())
|
||||
{
|
||||
ComputeExprValue(member.cond, node.sourceLocation);
|
||||
ComputeExprValue(member.cond, member.sourceLocation);
|
||||
if (member.cond.IsResultingValue() && !member.cond.GetResultingValue())
|
||||
continue;
|
||||
}
|
||||
|
||||
if (member.builtin.HasValue())
|
||||
ComputeExprValue(member.builtin, node.sourceLocation);
|
||||
ComputeExprValue(member.builtin, member.sourceLocation);
|
||||
|
||||
if (member.locationIndex.HasValue())
|
||||
ComputeExprValue(member.locationIndex, node.sourceLocation);
|
||||
ComputeExprValue(member.locationIndex, member.sourceLocation);
|
||||
|
||||
if (member.builtin.HasValue() && member.locationIndex.HasValue())
|
||||
throw ShaderLang::CompilerStructFieldBuiltinLocationError{ member.sourceLocation };
|
||||
|
|
@ -2097,7 +2097,9 @@ namespace Nz::ShaderAst
|
|||
|
||||
if (attribute.IsExpression())
|
||||
{
|
||||
std::optional<ConstantValue> value = ComputeConstantValue(*attribute.GetExpression());
|
||||
auto& expr = *attribute.GetExpression();
|
||||
|
||||
std::optional<ConstantValue> value = ComputeConstantValue(expr);
|
||||
if (!value)
|
||||
return ValidationResult::Unresolved;
|
||||
|
||||
|
|
@ -2109,13 +2111,13 @@ namespace Nz::ShaderAst
|
|||
if (std::holds_alternative<Int32>(*value) && std::is_same_v<T, UInt32>)
|
||||
attribute = static_cast<UInt32>(std::get<Int32>(*value));
|
||||
else
|
||||
throw ShaderLang::CompilerAttributeUnexpectedTypeError{ sourceLocation };
|
||||
throw ShaderLang::CompilerAttributeUnexpectedTypeError{ expr.sourceLocation };
|
||||
}
|
||||
else
|
||||
attribute = std::get<T>(*value);
|
||||
}
|
||||
else
|
||||
throw ShaderLang::CompilerAttributeUnexpectedExpressionError{ sourceLocation };
|
||||
throw ShaderLang::CompilerAttributeUnexpectedExpressionError{ expr.sourceLocation };
|
||||
}
|
||||
|
||||
return ValidationResult::Validated;
|
||||
|
|
@ -2129,6 +2131,8 @@ namespace Nz::ShaderAst
|
|||
|
||||
if (attribute.IsExpression())
|
||||
{
|
||||
auto& expr = *attribute.GetExpression();
|
||||
|
||||
std::optional<ConstantValue> value = ComputeConstantValue(*attribute.GetExpression());
|
||||
if (!value)
|
||||
{
|
||||
|
|
@ -2144,13 +2148,13 @@ namespace Nz::ShaderAst
|
|||
if (std::holds_alternative<Int32>(*value) && std::is_same_v<T, UInt32>)
|
||||
targetAttribute = static_cast<UInt32>(std::get<Int32>(*value));
|
||||
else
|
||||
throw ShaderLang::CompilerAttributeUnexpectedTypeError{ sourceLocation };
|
||||
throw ShaderLang::CompilerAttributeUnexpectedTypeError{ expr.sourceLocation };
|
||||
}
|
||||
else
|
||||
targetAttribute = std::get<T>(*value);
|
||||
}
|
||||
else
|
||||
throw ShaderLang::CompilerAttributeUnexpectedExpressionError{ sourceLocation };
|
||||
throw ShaderLang::CompilerAttributeUnexpectedExpressionError{ expr.sourceLocation };
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -81,9 +81,15 @@ namespace Nz::ShaderLang
|
|||
};
|
||||
|
||||
UInt32 currentLine = 1;
|
||||
std::size_t lastLineFeed = 0;
|
||||
std::size_t lineStartPos = 0;
|
||||
std::vector<Token> tokens;
|
||||
|
||||
auto HandleNewLine = [&]
|
||||
{
|
||||
currentLine++;
|
||||
lineStartPos = currentPos + 1;
|
||||
};
|
||||
|
||||
std::shared_ptr<const std::string> currentFile;
|
||||
if (!filePath.empty())
|
||||
currentFile = std::make_shared<std::string>(filePath);
|
||||
|
|
@ -93,7 +99,7 @@ namespace Nz::ShaderLang
|
|||
char c = Peek(0);
|
||||
|
||||
Token token;
|
||||
token.location.startColumn = SafeCast<UInt32>(currentPos - lastLineFeed) + 1;
|
||||
token.location.startColumn = SafeCast<UInt32>(currentPos - lineStartPos) + 1;
|
||||
token.location.startLine = currentLine;
|
||||
token.location.file = currentFile;
|
||||
|
||||
|
|
@ -113,11 +119,8 @@ namespace Nz::ShaderLang
|
|||
break; //< Ignore blank spaces
|
||||
|
||||
case '\n':
|
||||
{
|
||||
currentLine++;
|
||||
lastLineFeed = currentPos;
|
||||
HandleNewLine();
|
||||
break;
|
||||
}
|
||||
|
||||
case '-':
|
||||
{
|
||||
|
|
@ -170,10 +173,7 @@ namespace Nz::ShaderLang
|
|||
}
|
||||
}
|
||||
else if (next == '\n')
|
||||
{
|
||||
currentLine++;
|
||||
lastLineFeed = currentPos + 1;
|
||||
}
|
||||
HandleNewLine();
|
||||
}
|
||||
while (next != -1);
|
||||
}
|
||||
|
|
@ -225,7 +225,7 @@ namespace Nz::ShaderLang
|
|||
currentPos++;
|
||||
}
|
||||
|
||||
token.location.endColumn = SafeCast<UInt32>(currentPos - lastLineFeed) + 1;
|
||||
token.location.endColumn = SafeCast<UInt32>(currentPos - lineStartPos) + 1;
|
||||
token.location.endLine = currentLine;
|
||||
|
||||
if (floatingPoint)
|
||||
|
|
@ -417,7 +417,7 @@ namespace Nz::ShaderLang
|
|||
case '\0':
|
||||
case '\n':
|
||||
case '\r':
|
||||
token.location.endColumn = SafeCast<UInt32>(currentPos - lastLineFeed) + 1;
|
||||
token.location.endColumn = SafeCast<UInt32>(currentPos - lineStartPos) + 1;
|
||||
token.location.endLine = currentLine;
|
||||
throw LexerUnfinishedStringError{ token.location };
|
||||
|
||||
|
|
@ -433,7 +433,7 @@ namespace Nz::ShaderLang
|
|||
case '"': character = '"'; break;
|
||||
case '\\': character = '\\'; break;
|
||||
default:
|
||||
token.location.endColumn = SafeCast<UInt32>(currentPos - lastLineFeed) + 1;
|
||||
token.location.endColumn = SafeCast<UInt32>(currentPos - lineStartPos) + 1;
|
||||
token.location.endLine = currentLine;
|
||||
throw LexerUnrecognizedCharError{ token.location };
|
||||
}
|
||||
|
|
@ -476,7 +476,7 @@ namespace Nz::ShaderLang
|
|||
}
|
||||
else
|
||||
{
|
||||
token.location.endColumn = SafeCast<UInt32>(currentPos - lastLineFeed) + 1;
|
||||
token.location.endColumn = SafeCast<UInt32>(currentPos - lineStartPos) + 1;
|
||||
token.location.endLine = currentLine;
|
||||
throw LexerUnrecognizedTokenError{ token.location };
|
||||
}
|
||||
|
|
@ -485,7 +485,7 @@ namespace Nz::ShaderLang
|
|||
|
||||
if (tokenType)
|
||||
{
|
||||
token.location.endColumn = SafeCast<UInt32>(currentPos - lastLineFeed) + 1;
|
||||
token.location.endColumn = SafeCast<UInt32>(currentPos - lineStartPos) + 1;
|
||||
token.location.endLine = currentLine;
|
||||
token.type = *tokenType;
|
||||
|
||||
|
|
|
|||
|
|
@ -1195,8 +1195,10 @@ namespace Nz::ShaderLang
|
|||
// Function call
|
||||
SourceLocation closingLocation;
|
||||
auto parameters = ParseExpressionList(TokenType::ClosingParenthesis, &closingLocation);
|
||||
|
||||
const SourceLocation& lhsLoc = lhs->sourceLocation;
|
||||
lhs = ShaderBuilder::CallFunction(std::move(lhs), std::move(parameters));
|
||||
lhs->sourceLocation = SourceLocation::BuildFromTo(token.location, closingLocation);
|
||||
lhs->sourceLocation = SourceLocation::BuildFromTo(lhsLoc, closingLocation);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -1208,8 +1210,9 @@ namespace Nz::ShaderLang
|
|||
SourceLocation closingLocation;
|
||||
auto parameters = ParseExpressionList(TokenType::ClosingSquareBracket, &closingLocation);
|
||||
|
||||
const SourceLocation& lhsLoc = lhs->sourceLocation;
|
||||
lhs = ShaderBuilder::AccessIndex(std::move(lhs), std::move(parameters));
|
||||
lhs->sourceLocation = SourceLocation::BuildFromTo(token.location, closingLocation);
|
||||
lhs->sourceLocation = SourceLocation::BuildFromTo(lhsLoc, closingLocation);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -184,6 +184,7 @@ if is_plat("windows") then
|
|||
add_cxxflags("/bigobj", "/permissive-", "/Zc:__cplusplus", "/Zc:externConstexpr", "/Zc:inline", "/Zc:lambda", "/Zc:preprocessor", "/Zc:referenceBinding", "/Zc:strictStrings", "/Zc:throwingNew")
|
||||
add_cxflags("/w44062") -- Enable warning: switch case not handled
|
||||
add_cxflags("/wd4251") -- Disable warning: class needs to have dll-interface to be used by clients of class blah blah blah
|
||||
add_cxflags("/wd4275") -- Disable warning: DLL-interface class 'class_1' used as base for DLL-interface blah
|
||||
elseif is_plat("mingw") then
|
||||
add_cxflags("-Og", "-Wa,-mbig-obj")
|
||||
add_ldflags("-Wa,-mbig-obj")
|
||||
|
|
|
|||
Loading…
Reference in New Issue