Line data Source code
1 : //
2 : // Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
3 : // Use of this source code is governed by a BSD-style license that can be
4 : // found in the LICENSE file.
5 : //
6 :
7 : #ifndef COMPILER_TRANSLATOR_EMULATE_PRECISION_H_
8 : #define COMPILER_TRANSLATOR_EMULATE_PRECISION_H_
9 :
10 : #include "common/angleutils.h"
11 : #include "compiler/translator/Compiler.h"
12 : #include "compiler/translator/InfoSink.h"
13 : #include "compiler/translator/IntermNode.h"
14 : #include "GLSLANG/ShaderLang.h"
15 :
16 : // This class gathers all compound assignments from the AST and can then write
17 : // the functions required for their precision emulation. This way there is no
18 : // need to write a huge number of variations of the emulated compound assignment
19 : // to every translated shader with emulation enabled.
20 :
21 : namespace sh
22 : {
23 :
24 0 : class EmulatePrecision : public TLValueTrackingTraverser
25 : {
26 : public:
27 : EmulatePrecision(const TSymbolTable &symbolTable, int shaderVersion);
28 :
29 : void visitSymbol(TIntermSymbol *node) override;
30 : bool visitBinary(Visit visit, TIntermBinary *node) override;
31 : bool visitUnary(Visit visit, TIntermUnary *node) override;
32 : bool visitAggregate(Visit visit, TIntermAggregate *node) override;
33 : bool visitDeclaration(Visit visit, TIntermDeclaration *node) override;
34 :
35 : void writeEmulationHelpers(TInfoSinkBase &sink,
36 : const int shaderVersion,
37 : const ShShaderOutput outputLanguage);
38 :
39 : static bool SupportedInLanguage(const ShShaderOutput outputLanguage);
40 :
41 : private:
42 : struct TypePair
43 : {
44 0 : TypePair(const char *l, const char *r)
45 0 : : lType(l), rType(r) { }
46 :
47 : const char *lType;
48 : const char *rType;
49 : };
50 :
51 : struct TypePairComparator
52 : {
53 0 : bool operator() (const TypePair& l, const TypePair& r) const
54 : {
55 0 : if (l.lType == r.lType)
56 0 : return l.rType < r.rType;
57 0 : return l.lType < r.lType;
58 : }
59 : };
60 :
61 : typedef std::set<TypePair, TypePairComparator> EmulationSet;
62 : EmulationSet mEmulateCompoundAdd;
63 : EmulationSet mEmulateCompoundSub;
64 : EmulationSet mEmulateCompoundMul;
65 : EmulationSet mEmulateCompoundDiv;
66 :
67 : bool mDeclaringVariables;
68 : };
69 :
70 : } // namespace sh
71 :
72 : #endif // COMPILER_TRANSLATOR_EMULATE_PRECISION_H_
|