Edit

kc3-lang/angle/src/compiler/translator/tree_ops/ClampPointSize.cpp

Branch :

  • Show log

    Commit

  • Author : Shahbaz Youssefi
    Date : 2021-01-19 12:38:46
    Hash : f0286e63
    Message : Translator: Stop allocating TIntermSequence The functions that take a TIntermSequence always copy out / Swap the contents away. This change makes all TIntermSequences live on the stack instead of being newed. Bug: angleproject:5535 Change-Id: I942f1c5e57b00199d5308183f71bd9e18b0608bd Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2636679 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>

  • src/compiler/translator/tree_ops/ClampPointSize.cpp
  • //
    // 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.
    //
    // ClampPointSize.cpp: Limit the value that is written to gl_PointSize.
    //
    
    #include "compiler/translator/tree_ops/ClampPointSize.h"
    
    #include "compiler/translator/SymbolTable.h"
    #include "compiler/translator/tree_util/BuiltIn.h"
    #include "compiler/translator/tree_util/FindSymbolNode.h"
    #include "compiler/translator/tree_util/IntermNode_util.h"
    #include "compiler/translator/tree_util/RunAtTheEndOfShader.h"
    
    namespace sh
    {
    
    bool ClampPointSize(TCompiler *compiler,
                        TIntermBlock *root,
                        float maxPointSize,
                        TSymbolTable *symbolTable)
    {
        // Only clamp gl_PointSize if it's used in the shader.
        if (!FindSymbolNode(root, ImmutableString("gl_PointSize")))
        {
            return true;
        }
    
        TIntermSymbol *pointSizeNode = new TIntermSymbol(BuiltInVariable::gl_PointSize());
    
        TConstantUnion *maxPointSizeConstant = new TConstantUnion();
        maxPointSizeConstant->setFConst(maxPointSize);
        TIntermConstantUnion *maxPointSizeNode =
            new TIntermConstantUnion(maxPointSizeConstant, TType(EbtFloat, EbpHigh, EvqConst));
    
        // min(gl_PointSize, maxPointSize)
        TIntermSequence minArguments;
        minArguments.push_back(pointSizeNode->deepCopy());
        minArguments.push_back(maxPointSizeNode);
        TIntermTyped *clampedPointSize =
            CreateBuiltInFunctionCallNode("min", &minArguments, *symbolTable, 100);
    
        // gl_PointSize = min(gl_PointSize, maxPointSize)
        TIntermBinary *assignPointSize = new TIntermBinary(EOpAssign, pointSizeNode, clampedPointSize);
    
        return RunAtTheEndOfShader(compiler, root, assignPointSize, symbolTable);
    }
    
    }  // namespace sh