Hash :
ab918821
Author :
Date :
2017-07-14T17:03:42
Clamp point size to maximum point size from the API on NVIDIA NVIDIA OpenGL drivers have a bug where the point size range is being reported incorrectly - it appears the core GL driver incorrectly gives the range for smooth points, when it should be giving the range for aliased points. Clamp the actual point size to the maximum point size reported from the API so that the GLES spec is followed. The same workaround seems to be necessary also on Android. The issue was revealed by the trybots, and has not been fully diagnosed though. The newly added test fails on AMD OpenGL. As a part of this change, the existing tests in PointSpritesTest are refactored to use gl_raii. BUG=chromium:740560 TEST=angle_end2end_tests Change-Id: Ic4a66c9ea16f5ae76beb3bb6577716d10c3b226e Reviewed-on: https://chromium-review.googlesource.com/574598 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
//
// 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/ClampPointSize.h"
#include "compiler/translator/FindSymbolNode.h"
#include "compiler/translator/IntermNode_util.h"
#include "compiler/translator/RunAtTheEndOfShader.h"
#include "compiler/translator/SymbolTable.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, TString("gl_PointSize"), EbtFloat))
{
return;
}
TIntermSymbol *pointSizeNode = ReferenceBuiltInVariable("gl_PointSize", *symbolTable, 100);
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