diff options
Diffstat (limited to 'gfx/angle/checkout/src/compiler/translator/tree_ops/ClampPointSize.cpp')
-rw-r--r-- | gfx/angle/checkout/src/compiler/translator/tree_ops/ClampPointSize.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/compiler/translator/tree_ops/ClampPointSize.cpp b/gfx/angle/checkout/src/compiler/translator/tree_ops/ClampPointSize.cpp new file mode 100644 index 0000000000..db006989e9 --- /dev/null +++ b/gfx/angle/checkout/src/compiler/translator/tree_ops/ClampPointSize.cpp @@ -0,0 +1,52 @@ +// +// 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 |