| // |
| // 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 minPointSize, |
| 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 *minPointSizeConstant = new TConstantUnion(); |
| TConstantUnion *maxPointSizeConstant = new TConstantUnion(); |
| minPointSizeConstant->setFConst(minPointSize); |
| maxPointSizeConstant->setFConst(maxPointSize); |
| TIntermConstantUnion *minPointSizeNode = |
| new TIntermConstantUnion(minPointSizeConstant, TType(EbtFloat, EbpHigh, EvqConst)); |
| TIntermConstantUnion *maxPointSizeNode = |
| new TIntermConstantUnion(maxPointSizeConstant, TType(EbtFloat, EbpHigh, EvqConst)); |
| |
| // clamp(gl_PointSize, minPointSize, maxPointSize) |
| TIntermSequence clampArguments; |
| clampArguments.push_back(pointSizeNode->deepCopy()); |
| clampArguments.push_back(minPointSizeNode); |
| clampArguments.push_back(maxPointSizeNode); |
| TIntermTyped *clampedPointSize = |
| CreateBuiltInFunctionCallNode("clamp", &clampArguments, *symbolTable, 100); |
| |
| // gl_PointSize = clamp(gl_PointSize, minPointSize, maxPointSize) |
| TIntermBinary *assignPointSize = new TIntermBinary(EOpAssign, pointSizeNode, clampedPointSize); |
| |
| return RunAtTheEndOfShader(compiler, root, assignPointSize, symbolTable); |
| } |
| |
| } // namespace sh |