blob: 4006cce9579947ae26d3e592d8a8b7fd78c3a844 [file] [log] [blame]
//
// Copyright 2020 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_MSL_ASTHELPERS_H_
#define COMPILER_TRANSLATOR_MSL_ASTHELPERS_H_
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include "common/span.h"
#include "compiler/translator/Name.h"
#include "compiler/translator/msl/IdGen.h"
#include "compiler/translator/msl/SymbolEnv.h"
namespace sh
{
// Creates a variable for a struct type.
const TVariable &CreateStructTypeVariable(TSymbolTable &symbolTable, const TStructure &structure);
// Creates a variable for a struct instance.
const TVariable &CreateInstanceVariable(
TSymbolTable &symbolTable,
const TStructure &structure,
const Name &name,
TQualifier qualifier = TQualifier::EvqTemporary,
const angle::Span<const unsigned int> *arraySizes = nullptr);
// The input sequence should be discarded from AST after this is called.
TIntermSequence &CloneSequenceAndPrepend(const TIntermSequence &seq, TIntermNode &node);
// Appends parameters from `src` function to `dest` function.
void AddParametersFrom(TFunction &dest, const TFunction &src);
// Clones a function.
const TFunction &CloneFunction(TSymbolTable &symbolTable, IdGen &idGen, const TFunction &oldFunc);
// Clones a function and prepends the provided extr parameter.
// If `idGen` is null, the original function must be discarded from the AST.
const TFunction &CloneFunctionAndPrependParam(TSymbolTable &symbolTable,
IdGen *idGen,
const TFunction &oldFunc,
const TVariable &newParam);
// Clones a function and prepends the provided two parameters.
// If `idGen` is null, the original function must be discarded from the AST.
const TFunction &CloneFunctionAndPrependTwoParams(TSymbolTable &symbolTable,
IdGen *idGen,
const TFunction &oldFunc,
const TVariable &newParam1,
const TVariable &newParam2);
// Clones a function and appends the provided extra parameters.
// If `idGen` is null, the original function must be discarded from the AST.
const TFunction &CloneFunctionAndAppendParams(TSymbolTable &symbolTable,
IdGen *idGen,
const TFunction &oldFunc,
const std::vector<const TVariable *> &newParam);
// Clones a function and changes its return type.
// If `idGen` is null, the original function must be discarded from the AST.
const TFunction &CloneFunctionAndChangeReturnType(TSymbolTable &symbolTable,
IdGen *idGen,
const TFunction &oldFunc,
const TStructure &newReturn);
// Gets the argument of a function call at the given index.
TIntermTyped &GetArg(const TIntermAggregate &call, size_t index);
// Sets the argument of a function call at the given index.
void SetArg(TIntermAggregate &call, size_t index, TIntermTyped &arg);
// Accesses a field for the given node with the given field name.
// The node must be a struct instance.
TIntermBinary &AccessField(const TVariable &structInstanceVar, const Name &field);
// Accesses a field for the given node with the given field name.
// The node must be a struct instance.
TIntermBinary &AccessField(TIntermTyped &object, const Name &field);
// Accesses a field for the given node by its field index.
// The node must be a struct instance.
TIntermBinary &AccessFieldByIndex(TIntermTyped &object, int index);
// Accesses an element by index for the given node.
// The node must be an array, vector, or matrix.
TIntermBinary &AccessIndex(TIntermTyped &indexableNode, int index);
// Accesses an element by index for the given node if `index` is non-null.
// Returns the original node if `index` is null.
// The node must be an array, vector, or matrix if `index` is non-null.
TIntermTyped &AccessIndex(TIntermTyped &node, const int *index);
// Returns a subvector based on the input slice range.
// This returns the original node if the slice is an identity for the node.
TIntermTyped &SubVector(TIntermTyped &vectorNode, int begin, int end);
// Matches scalar bool, int, uint32_t, float.
bool IsScalarBasicType(const TType &type);
// Matches vector bool, int, uint32_t, float.
bool IsVectorBasicType(const TType &type);
// Matches bool, int, uint32_t, float.
// Type does not need to be a scalar.
bool HasScalarBasicType(const TType &type);
// Matches bool, int, uint32_t, float.
bool HasScalarBasicType(TBasicType type);
// Clones a type.
TType &CloneType(const TType &type);
// Clones a type and drops all array dimensions.
TType &InnermostType(const TType &type);
// Creates a vector type by dropping the columns off of a matrix type.
TType &DropColumns(const TType &matrixType);
// Creates a type by dropping the outer dimension off of an array type.
TType &DropOuterDimension(const TType &arrayType);
// Creates a scalar or vector type by changing the dimensions of a vector type.
TType &SetVectorDim(const TType &type, int newDim);
// Creates a matrix type by changing the row dimensions of a matrix type.
TType &SetMatrixRowDim(const TType &matrixType, int newDim);
// Returns true iff the structure directly contains a field with matrix type.
bool HasMatrixField(const TStructure &structure);
// Returns true iff the structure directly contains a field with array type.
bool HasArrayField(const TStructure &structure);
// Coerces `fromNode` to `toType` by a constructor call of `toType` if their types differ.
// Vector and matrix dimensions are retained.
// Array types are not allowed.
TIntermTyped &CoerceSimple(TBasicType toBasicType,
TIntermTyped &fromNode,
bool needsExplicitBoolCast);
// Coerces `fromNode` to `toType` by a constructor call of `toType` if their types differ.
// Vector and matrix dimensions must coincide between to and from.
// Array types are not allowed.
TIntermTyped &CoerceSimple(const TType &toType, TIntermTyped &fromNode, bool needsExplicitBoolCast);
TIntermTyped &AsType(SymbolEnv &symbolEnv, const TType &toType, TIntermTyped &fromNode);
} // namespace sh
#endif // COMPILER_TRANSLATOR_MSL_ASTHELPERS_H_