Hash :
e53c98ba
Author :
Date :
2014-02-03T11:57:13
Add work-around for D3D9 shader compiler bug. With certain selection statements with a vertex input in the condition and side-effects in the else-block, we'd run in to a D3D9 compiler bug which would cause incorrect results. We can work around this bug in D3D9 by selectively rewriting these statements to use an 'else if' clause instead of 'else'. BUG=322794 Change-Id: I93c96fb201ff4959c00d9a36321faac7e0343278 Reviewed-on: https://chromium-review.googlesource.com/184681 Reviewed-by: Nicolas Capens <nicolascapens@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Tested-by: Jamie Madill <jmadill@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
//
// Copyright (c) 2002-2013 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.
//
// NodeSearch.h: Utilities for searching translator node graphs
//
#ifndef TRANSLATOR_NODESEARCH_H_
#define TRANSLATOR_NODESEARCH_H_
#include "compiler/translator/intermediate.h"
namespace sh
{
template <class Parent>
class NodeSearchTraverser : public TIntermTraverser
{
public:
NodeSearchTraverser()
: mFound(false)
{}
bool found() const { return mFound; }
static bool search(TIntermNode *node)
{
Parent searchTraverser;
node->traverse(&searchTraverser);
return searchTraverser.found();
}
protected:
bool mFound;
};
class FindDiscard : public NodeSearchTraverser<FindDiscard>
{
public:
virtual bool visitBranch(Visit visit, TIntermBranch *node)
{
switch (node->getFlowOp())
{
case EOpKill:
mFound = true;
break;
default: break;
}
return !mFound;
}
};
class FindSideEffectRewriting : public NodeSearchTraverser<FindSideEffectRewriting>
{
public:
virtual bool visitBinary(Visit visit, TIntermBinary *node)
{
switch (node->getOp())
{
case EOpLogicalOr:
case EOpLogicalAnd:
if (node->getRight()->hasSideEffects())
{
mFound = true;
}
break;
default: break;
}
return !mFound;
}
};
}
#endif // TRANSLATOR_NODESEARCH_H_