| // |
| // Copyright (c) 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_autogen.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 |
| { |
| |
| void ClampPointSize(TIntermBlock *root, float maxPointSize, TSymbolTable *symbolTable) |
| { |
| // Only clamp gl_PointSize if it's used in the shader. |
| if (!FindSymbolNode(root, ImmutableString("gl_PointSize"))) |
| { |
| return; |
| } |
| |
| 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 = new TIntermSequence(); |
| 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); |
| |
| RunAtTheEndOfShader(root, assignPointSize, symbolTable); |
| } |
| |
| } // namespace sh |