Hash :
b8d6f8aa
Author :
Date :
2021-07-22T22:31:29
Translator: Facilitate integration in FireFox Instead of relying on is_apple to build workarounds applied on apple hardware, a new build argument is added for this purpose. This allows FireFox to more easily include these files in their build system (which builds every workaround on every platform). The workarounds are reorganized too and moved from tree_ops/gl/mac to tree_ops/apple. RewriteRowMajorMatrices is moved there too as it's now used by both gl and metal. This workaround is large, and removing it from non-apple builds improves binary size (~40KB on Linux). Bug: angleproject:6188 Change-Id: I8e1dab44d0235bb6b8341d53721bdd0d157d46c6 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3047385 Reviewed-by: Jeff Gilbert <jgilbert@mozilla.com> Reviewed-by: Yuly Novikov <ynovikov@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
//
// Copyright 2016 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.
//
#include "compiler/translator/tree_ops/apple/RewriteUnaryMinusOperatorFloat.h"
#include "compiler/translator/tree_util/IntermNode_util.h"
#include "compiler/translator/tree_util/IntermTraverse.h"
namespace sh
{
namespace
{
class Traverser : public TIntermTraverser
{
public:
ANGLE_NO_DISCARD static bool Apply(TCompiler *compiler, TIntermNode *root);
private:
Traverser();
bool visitUnary(Visit visit, TIntermUnary *node) override;
void nextIteration();
bool mFound = false;
};
// static
bool Traverser::Apply(TCompiler *compiler, TIntermNode *root)
{
Traverser traverser;
do
{
traverser.nextIteration();
root->traverse(&traverser);
if (traverser.mFound)
{
if (!traverser.updateTree(compiler, root))
{
return false;
}
}
} while (traverser.mFound);
return true;
}
Traverser::Traverser() : TIntermTraverser(true, false, false) {}
void Traverser::nextIteration()
{
mFound = false;
}
bool Traverser::visitUnary(Visit visit, TIntermUnary *node)
{
if (mFound)
{
return false;
}
// Detect if the current operator is unary minus operator.
if (node->getOp() != EOpNegative)
{
return true;
}
// Detect if the current operand is a float variable.
TIntermTyped *fValue = node->getOperand();
if (!fValue->getType().isScalarFloat())
{
return true;
}
// 0.0 - float
TIntermTyped *zero = CreateZeroNode(fValue->getType());
zero->setLine(fValue->getLine());
TIntermBinary *sub = new TIntermBinary(EOpSub, zero, fValue);
sub->setLine(fValue->getLine());
queueReplacement(sub, OriginalNode::IS_DROPPED);
mFound = true;
return false;
}
} // anonymous namespace
bool RewriteUnaryMinusOperatorFloat(TCompiler *compiler, TIntermNode *root)
{
return Traverser::Apply(compiler, root);
}
} // namespace sh