Edit

kc3-lang/angle/src/compiler/translator/tree_util/IntermNode_util.h

Branch :

  • Show log

    Commit

  • Author : Le Hoang Quyen
    Date : 2020-04-21 01:50:00
    Hash : dadd1986
    Message : Implement GL_APPLE_clip_distance - Built-in variable gl_ClipDistance has been added to compiler. - Desktop GL: gl_ClipDistance is supported since GL 3.0. Enable/Disable each gl_ClipDistances[i] works out of the box via glEnable(). - Vulkan/Metal: Use uniform variable to control writing to each gl_ClipDistance. One bit flag controls one element in the gl_ClipDistance array. The writing to the disabled element in vertex shader will be ignored, and turned into zero assignment instead. - Direct3D/Mobile GL: Not implemented yet. - Added ClipDistanceTest to gl_tests and compiler unittests. - GL_APPLE_clip_distance is a subset of GL_EXT_clip_cull_distance, so GL_EXT_clip_cull_distance could be implemented in future if needed. Bug: angleproject:4452 Change-Id: I571ac8b56826989808a680226a04bec4cf59988e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2084324 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/compiler/translator/tree_util/IntermNode_util.h
  • //
    // Copyright 2017 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.
    //
    // IntermNode_util.h: High-level utilities for creating AST nodes and node hierarchies. Mostly meant
    // to be used in AST transforms.
    
    #ifndef COMPILER_TRANSLATOR_INTERMNODEUTIL_H_
    #define COMPILER_TRANSLATOR_INTERMNODEUTIL_H_
    
    #include "compiler/translator/IntermNode.h"
    #include "compiler/translator/tree_util/FindFunction.h"
    
    namespace sh
    {
    
    class TSymbolTable;
    class TVariable;
    
    TIntermFunctionPrototype *CreateInternalFunctionPrototypeNode(const TFunction &func);
    TIntermFunctionDefinition *CreateInternalFunctionDefinitionNode(const TFunction &func,
                                                                    TIntermBlock *functionBody);
    
    TIntermTyped *CreateZeroNode(const TType &type);
    TIntermConstantUnion *CreateFloatNode(float value);
    TIntermConstantUnion *CreateIndexNode(int index);
    TIntermConstantUnion *CreateUIntNode(unsigned int value);
    TIntermConstantUnion *CreateBoolNode(bool value);
    
    TVariable *CreateTempVariable(TSymbolTable *symbolTable, const TType *type);
    TVariable *CreateTempVariable(TSymbolTable *symbolTable, const TType *type, TQualifier qualifier);
    
    TIntermSymbol *CreateTempSymbolNode(const TVariable *tempVariable);
    TIntermDeclaration *CreateTempDeclarationNode(const TVariable *tempVariable);
    TIntermDeclaration *CreateTempInitDeclarationNode(const TVariable *tempVariable,
                                                      TIntermTyped *initializer);
    TIntermBinary *CreateTempAssignmentNode(const TVariable *tempVariable, TIntermTyped *rightNode);
    
    TVariable *DeclareTempVariable(TSymbolTable *symbolTable,
                                   const TType *type,
                                   TQualifier qualifier,
                                   TIntermDeclaration **declarationOut);
    TVariable *DeclareTempVariable(TSymbolTable *symbolTable,
                                   TIntermTyped *initializer,
                                   TQualifier qualifier,
                                   TIntermDeclaration **declarationOut);
    const TVariable *DeclareInterfaceBlock(TIntermBlock *root,
                                           TSymbolTable *symbolTable,
                                           TFieldList *fieldList,
                                           TQualifier qualifier,
                                           const TMemoryQualifier &memoryQualifier,
                                           uint32_t arraySize,
                                           const ImmutableString &blockTypeName,
                                           const ImmutableString &blockVariableName);
    
    // If the input node is nullptr, return nullptr.
    // If the input node is a block node, return it.
    // If the input node is not a block node, put it inside a block node and return that.
    TIntermBlock *EnsureBlock(TIntermNode *node);
    
    // Should be called from inside Compiler::compileTreeImpl() where the global level is in scope.
    TIntermSymbol *ReferenceGlobalVariable(const ImmutableString &name,
                                           const TSymbolTable &symbolTable);
    
    // Note: this can't access desktop GLSL built-ins. Those can only be accessed directly through
    // BuiltIn.h.
    TIntermSymbol *ReferenceBuiltInVariable(const ImmutableString &name,
                                            const TSymbolTable &symbolTable,
                                            int shaderVersion);
    
    TIntermTyped *CreateBuiltInFunctionCallNode(const char *name,
                                                TIntermSequence *arguments,
                                                const TSymbolTable &symbolTable,
                                                int shaderVersion);
    
    inline void GetSwizzleIndex(TVector<int> *indexOut) {}
    
    template <typename T, typename... ArgsT>
    void GetSwizzleIndex(TVector<int> *indexOut, T arg, ArgsT... args)
    {
        indexOut->push_back(arg);
        GetSwizzleIndex(indexOut, args...);
    }
    
    template <typename... ArgsT>
    TIntermSwizzle *CreateSwizzle(TIntermTyped *reference, ArgsT... args)
    {
        TVector<int> swizzleIndex;
        GetSwizzleIndex(&swizzleIndex, args...);
        return new TIntermSwizzle(reference, swizzleIndex);
    }
    
    }  // namespace sh
    
    #endif  // COMPILER_TRANSLATOR_INTERMNODEUTIL_H_