Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/compiler/translator/BuiltInFunctionEmulator.h
1693 views
1
//
2
// Copyright 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
82