summaryrefslogtreecommitdiffstats
path: root/gfx/angle/src/compiler/translator/ASTMetadataHLSL.h
blob: f8ed5af4a59b9a4b564226a813bcc9fd42f50ca9 (plain)
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
//
// Copyright (c) 2002-2015 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.
//

// Defines analyses of the AST needed for HLSL generation

#ifndef COMPILER_TRANSLATOR_ASTMETADATAHLSL_H_
#define COMPILER_TRANSLATOR_ASTMETADATAHLSL_H_

#include <set>
#include <vector>

namespace sh
{

class CallDAG;
class TIntermNode;
class TIntermIfElse;
class TIntermLoop;

struct ASTMetadataHLSL
{
    ASTMetadataHLSL()
        : mUsesGradient(false),
          mCalledInDiscontinuousLoop(false),
          mHasGradientLoopInCallGraph(false),
          mNeedsLod0(false)
    {
    }

    // Here "something uses a gradient" means here that it either contains a
    // gradient operation, or a call to a function that uses a gradient.
    bool hasGradientInCallGraph(TIntermLoop *node);
    bool hasGradientLoop(TIntermIfElse *node);

    // Does the function use a gradient.
    bool mUsesGradient;

    // Even if usesGradient is true, some control flow might not use a gradient
    // so we store the set of all gradient-using control flows.
    std::set<TIntermNode*> mControlFlowsContainingGradient;

    // Remember information about the discontinuous loops and which functions
    // are called in such loops.
    bool mCalledInDiscontinuousLoop;
    bool mHasGradientLoopInCallGraph;
    std::set<TIntermLoop*> mDiscontinuousLoops;
    std::set<TIntermIfElse *> mIfsContainingGradientLoop;

    // Will we need to generate a Lod0 version of the function.
    bool mNeedsLod0;
};

typedef std::vector<ASTMetadataHLSL> MetadataList;

// Return the AST analysis result, in the order defined by the call DAG
MetadataList CreateASTMetadataHLSL(TIntermNode *root, const CallDAG &callDag);

}  // namespace sh

#endif // COMPILER_TRANSLATOR_ASTMETADATAHLSL_H_