Hash :
798c5200
Author :
Date :
2021-07-31T22:17:48
Translator: Make precise-ness a property of AST nodes Instead of creating a "set of precise nodes", the nodes themselves are marked precise. This change is preparation for another change that overhauls precision propagation through the nodes, and which would also be storing the promoted precision in the nodes. Bug: angleproject:4889 Change-Id: Ieec8864be5cd2e95ed6fb4d90b367946d9f33fa1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3065569 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#ifndef COMPILER_TRANSLATOR_VALIDATEAST_H_
#define COMPILER_TRANSLATOR_VALIDATEAST_H_
#include "compiler/translator/BaseTypes.h"
#include "compiler/translator/Common.h"
namespace sh
{
class TDiagnostics;
class TIntermNode;
// The following options (stored in Compiler) tell the validator what to validate. Some validations
// are conditional to certain passes.
struct ValidateASTOptions
{
// TODO: add support for the flags marked with TODO. http://anglebug.com/2733
// Check that every node always has only one parent,
bool validateSingleParent = true;
// Check that all symbols reference TVariables that have been declared. For built-ins, this
// makes sure that the same GLSL built-in uses the same TVariable consistently.
bool validateVariableReferences = true;
// Whether validateVariableReferences should also include specialization constants. Their
// declaration is output after their usage is discovered, so this is disabled until then.
bool validateSpecConstReferences = false;
// Check that TIntermUnary and TIntermAggregate nodes with a built-in op reference a function
// with said op.
bool validateBuiltInOps = true;
// Check that all EOpCallFunctionInAST have their corresponding function definitions in the AST,
// with matching symbol ids. There should also be at least a prototype declaration before the
// function is called.
bool validateFunctionCall = true;
// Check that EOpCallInternalRawFunction is not used. This OP is deprecated and needs to be
// removed. http://anglebug.com/6059
bool validateNoRawFunctionCalls = true;
// Check that there are no null nodes where they are not allowed, for example as children of
// TIntermDeclaration or TIntermBlock.
bool validateNullNodes = true;
// Check that symbols that reference variables have consistent qualifiers and symbol ids with
// the variable declaration. The following needs to be validated:
//
// Implemented:
//
// - Function parameters having one of EvqParam* qualifiers.
// - gl_ClipDistance, gl_CullDistance and gl_LastFragData are correctly qualified even when
// redeclared in the shader.
//
// TODO:
//
// - Function-local variables must have the EvqTemporary qualifier.
// - Symbol references and declarations have identical qualifiers.
bool validateQualifiers = true;
// Check that the nodes are consistent w.r.t the precision of the operands involved.
bool validatePrecision = true; // TODO
// Check that variable declarations that can't have initializers don't have initializers
// (varyings, uniforms for example).
bool validateInitializers = true; // TODO
// Check that there is only one TFunction with each function name referenced in the nodes (no
// two TFunctions with the same name, taking internal/non-internal namespaces into account).
bool validateUniqueFunctions = true; // TODO
// Check that references to structs are matched with the corresponding struct declaration. This
// is only done for references to structs inside other struct or interface blocks declarations,
// as validateVariableReferences already ensures other references to the struct match the
// declaration.
bool validateStructUsage = true;
// Check that expression nodes have the correct type considering their operand(s). The
// following validation is possible:
//
// Implemented:
//
// - Binary node that indexes T[] should have type T
//
// TODO:
//
// - Function calls (including built-ins) have the same return type in the node and function.
// - Unary and binary operators have the correct type based on operands
// - Swizzle result has same type as the operand except for vector size
// - Ternary operator has the same type as the operands
bool validateExpressionTypes = true;
// If SeparateDeclarations has been run, check for the absence of multi declarations as well.
bool validateMultiDeclarations = false;
// Once set, disallows any further transformations on the tree. Used before AST post-processing
// which requires that the tree remains unmodified.
bool validateNoMoreTransformations = false;
};
// Check for errors and output error messages on the context.
// Returns true if there are no errors.
bool ValidateAST(TIntermNode *root, TDiagnostics *diagnostics, const ValidateASTOptions &options);
} // namespace sh
#endif // COMPILER_TRANSLATOR_VALIDATESWITCH_H_