// // 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. const TIntermSymbol *glPointSize = FindSymbolNode(root, ImmutableString("gl_PointSize")); if (glPointSize == nullptr) { return true; } TIntermTyped *pointSizeNode = glPointSize->deepCopy(); 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