1 | // |
2 | // Copyright (c) 2011 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_BUILTINFUNCTIONEMULATOR_H_ |
8 | #define COMPILER_TRANSLATOR_BUILTINFUNCTIONEMULATOR_H_ |
9 | |
10 | #include "compiler/translator/InfoSink.h" |
11 | |
12 | namespace sh |
13 | { |
14 | |
15 | class TIntermNode; |
16 | class TFunction; |
17 | class TSymbolUniqueId; |
18 | |
19 | using BuiltinQueryFunc = const char *(int); |
20 | |
21 | // |
22 | // This class decides which built-in functions need to be replaced with the emulated ones. It can be |
23 | // used to work around driver bugs or implement functions that are not natively implemented on a |
24 | // specific platform. |
25 | // |
26 | class BuiltInFunctionEmulator |
27 | { |
28 | public: |
29 | BuiltInFunctionEmulator(); |
30 | |
31 | void markBuiltInFunctionsForEmulation(TIntermNode *root); |
32 | |
33 | void cleanup(); |
34 | |
35 | // "name" gets written as "name_emu". |
36 | static void WriteEmulatedFunctionName(TInfoSinkBase &out, const char *name); |
37 | |
38 | bool isOutputEmpty() const; |
39 | |
40 | // Output function emulation definition. This should be before any other shader source. |
41 | void outputEmulatedFunctions(TInfoSinkBase &out) const; |
42 | |
43 | // Add functions that need to be emulated. |
44 | void addEmulatedFunction(const TSymbolUniqueId &uniqueId, |
45 | const char *emulatedFunctionDefinition); |
46 | |
47 | void addEmulatedFunctionWithDependency(const TSymbolUniqueId &dependency, |
48 | const TSymbolUniqueId &uniqueId, |
49 | const char *emulatedFunctionDefinition); |
50 | |
51 | void addFunctionMap(BuiltinQueryFunc queryFunc); |
52 | |
53 | private: |
54 | class BuiltInFunctionEmulationMarker; |
55 | |
56 | // Records that a function is called by the shader and might need to be emulated. If the |
57 | // function is not in mEmulatedFunctions, this becomes a no-op. Returns true if the function |
58 | // call needs to be replaced with an emulated one. |
59 | bool setFunctionCalled(const TFunction *function); |
60 | bool setFunctionCalled(int uniqueId); |
61 | |
62 | const char *findEmulatedFunction(int uniqueId) const; |
63 | |
64 | // Map from function unique id to emulated function definition |
65 | std::map<int, std::string> mEmulatedFunctions; |
66 | |
67 | // Map from dependent functions to their dependencies. This structure allows each function to |
68 | // have at most one dependency. |
69 | std::map<int, int> mFunctionDependencies; |
70 | |
71 | // Called function ids |
72 | std::vector<int> mFunctions; |
73 | |
74 | // Constexpr function tables. |
75 | std::vector<BuiltinQueryFunc *> mQueryFunctions; |
76 | }; |
77 | |
78 | } // namespace sh |
79 | |
80 | #endif // COMPILER_TRANSLATOR_BUILTINFUNCTIONEMULATOR_H_ |
81 | |