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
12namespace sh
13{
14
15class TIntermNode;
16class TFunction;
17class TSymbolUniqueId;
18
19using 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//
26class 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