summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/compiler/translator/BuiltInFunctionEmulator.h
diff options
context:
space:
mode:
authorMiguel Costa <miguel.costa@qt.io>2018-06-26 16:56:45 +0200
committerAndre de la Rocha <andre.rocha@qt.io>2018-10-13 21:36:35 +0000
commit0a7aebadfbb3534284546aa3ca8612314c08f136 (patch)
treee94ee33ae3bb9b96fc3047c6455d47ac4920bfbf /src/3rdparty/angle/src/compiler/translator/BuiltInFunctionEmulator.h
parent656e89f875ad2008ca16cc673b687a22daa294c9 (diff)
Update ANGLE to chromium/3280
Change-Id: I0802c0d7486f772d361f87a544d6c5af937f4ca1 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'src/3rdparty/angle/src/compiler/translator/BuiltInFunctionEmulator.h')
-rw-r--r--src/3rdparty/angle/src/compiler/translator/BuiltInFunctionEmulator.h192
1 files changed, 145 insertions, 47 deletions
diff --git a/src/3rdparty/angle/src/compiler/translator/BuiltInFunctionEmulator.h b/src/3rdparty/angle/src/compiler/translator/BuiltInFunctionEmulator.h
index 6976edfd57..5f15f66224 100644
--- a/src/3rdparty/angle/src/compiler/translator/BuiltInFunctionEmulator.h
+++ b/src/3rdparty/angle/src/compiler/translator/BuiltInFunctionEmulator.h
@@ -9,77 +9,175 @@
#include "compiler/translator/InfoSink.h"
#include "compiler/translator/IntermNode.h"
+#include "compiler/translator/ParamType.h"
+
+namespace sh
+{
+
+struct MiniFunctionId
+{
+ constexpr MiniFunctionId(TOperator op = EOpNull,
+ ParamType paramType1 = ParamType::Void,
+ ParamType paramType2 = ParamType::Void,
+ ParamType paramType3 = ParamType::Void,
+ ParamType paramType4 = ParamType::Void)
+ : op(op),
+ paramType1(paramType1),
+ paramType2(paramType2),
+ paramType3(paramType3),
+ paramType4(paramType4)
+ {
+ }
+
+ TOperator op;
+ ParamType paramType1;
+ ParamType paramType2;
+ ParamType paramType3;
+ ParamType paramType4;
+};
+
+class FunctionId final
+{
+ public:
+ FunctionId();
+ FunctionId(TOperator op, const TType *param);
+ FunctionId(TOperator op, const TType *param1, const TType *param2);
+ FunctionId(TOperator op, const TType *param1, const TType *param2, const TType *param3);
+ FunctionId(TOperator op,
+ const TType *param1,
+ const TType *param2,
+ const TType *param3,
+ const TType *param4);
+
+ FunctionId(const FunctionId &) = default;
+ FunctionId &operator=(const FunctionId &) = default;
+
+ bool operator==(const FunctionId &other) const;
+ bool operator<(const FunctionId &other) const;
+
+ FunctionId getCopy() const;
+
+ private:
+ friend bool operator==(const MiniFunctionId &miniId, const FunctionId &functionId);
+ TOperator mOp;
+
+ // The memory that these TType objects use is freed by PoolAllocator. The
+ // BuiltInFunctionEmulator's lifetime can extend until after the memory pool is freed, but
+ // that's not an issue since this class never destructs these objects.
+ const TType *mParam1;
+ const TType *mParam2;
+ const TType *mParam3;
+ const TType *mParam4;
+};
+
+inline bool operator==(ParamType paramType, const TType *type)
+{
+ return SameParamType(paramType, type->getBasicType(), type->getNominalSize(),
+ type->getSecondarySize());
+}
+
+inline bool operator==(const MiniFunctionId &miniId, const FunctionId &functionId)
+{
+ return miniId.op == functionId.mOp && miniId.paramType1 == functionId.mParam1 &&
+ miniId.paramType2 == functionId.mParam2 && miniId.paramType3 == functionId.mParam3 &&
+ miniId.paramType4 == functionId.mParam4;
+}
+
+using BuiltinQueryFunc = const char *(const FunctionId &);
//
-// This class decides which built-in functions need to be replaced with the
-// emulated ones.
-// It can be used to work around driver bugs or implement functions that are
-// not natively implemented on a specific platform.
+// This class decides which built-in functions need to be replaced with the emulated ones. It can be
+// used to work around driver bugs or implement functions that are not natively implemented on a
+// specific platform.
//
class BuiltInFunctionEmulator
{
public:
BuiltInFunctionEmulator();
- void MarkBuiltInFunctionsForEmulation(TIntermNode *root);
+ void markBuiltInFunctionsForEmulation(TIntermNode *root);
- void Cleanup();
+ void cleanup();
- // "name(" becomes "webgl_name_emu(".
- static TString GetEmulatedFunctionName(const TString &name);
+ // "name" gets written as "name_emu".
+ static void WriteEmulatedFunctionName(TInfoSinkBase &out, const char *name);
- bool IsOutputEmpty() const;
+ bool isOutputEmpty() const;
- // Output function emulation definition. This should be before any other
- // shader source.
- void OutputEmulatedFunctions(TInfoSinkBase &out) const;
+ // Output function emulation definition. This should be before any other shader source.
+ void outputEmulatedFunctions(TInfoSinkBase &out) const;
// Add functions that need to be emulated.
- void addEmulatedFunction(TOperator op, const TType *param, const char *emulatedFunctionDefinition);
- void addEmulatedFunction(TOperator op, const TType *param1, const TType *param2,
- const char *emulatedFunctionDefinition);
- void addEmulatedFunction(TOperator op, const TType *param1, const TType *param2, const TType *param3,
- const char *emulatedFunctionDefinition);
+ FunctionId addEmulatedFunction(TOperator op,
+ const TType *param,
+ const char *emulatedFunctionDefinition);
+ FunctionId addEmulatedFunction(TOperator op,
+ const TType *param1,
+ const TType *param2,
+ const char *emulatedFunctionDefinition);
+ FunctionId addEmulatedFunction(TOperator op,
+ const TType *param1,
+ const TType *param2,
+ const TType *param3,
+ const char *emulatedFunctionDefinition);
+ FunctionId addEmulatedFunction(TOperator op,
+ const TType *param1,
+ const TType *param2,
+ const TType *param3,
+ const TType *param4,
+ const char *emulatedFunctionDefinition);
+
+ FunctionId addEmulatedFunctionWithDependency(const FunctionId &dependency,
+ TOperator op,
+ const TType *param1,
+ const TType *param2,
+ const char *emulatedFunctionDefinition);
+ FunctionId addEmulatedFunctionWithDependency(const FunctionId &dependency,
+ TOperator op,
+ const TType *param1,
+ const TType *param2,
+ const TType *param3,
+ const TType *param4,
+ const char *emulatedFunctionDefinition);
+
+ void addFunctionMap(BuiltinQueryFunc queryFunc);
private:
class BuiltInFunctionEmulationMarker;
- // Records that a function is called by the shader and might need to be
- // emulated. If the function is not in mEmulatedFunctions, this becomes a
- // no-op. Returns true if the function call needs to be replaced with an
- // emulated one.
- bool SetFunctionCalled(TOperator op, const TType &param);
- bool SetFunctionCalled(TOperator op, const TType &param1, const TType &param2);
- bool SetFunctionCalled(TOperator op, const TType &param1, const TType &param2, const TType &param3);
-
- class FunctionId {
- public:
- FunctionId(TOperator op, const TType *param);
- FunctionId(TOperator op, const TType *param1, const TType *param2);
- FunctionId(TOperator op, const TType *param1, const TType *param2, const TType *param3);
-
- bool operator==(const FunctionId &other) const;
- bool operator<(const FunctionId &other) const;
-
- FunctionId getCopy() const;
- private:
- TOperator mOp;
-
- // The memory that these TType objects use is freed by PoolAllocator. The BuiltInFunctionEmulator's lifetime
- // can extend until after the memory pool is freed, but that's not an issue since this class never destructs
- // these objects.
- const TType *mParam1;
- const TType *mParam2;
- const TType *mParam3;
- };
-
- bool SetFunctionCalled(const FunctionId &functionId);
+ // Records that a function is called by the shader and might need to be emulated. If the
+ // function is not in mEmulatedFunctions, this becomes a no-op. Returns true if the function
+ // call needs to be replaced with an emulated one.
+ bool setFunctionCalled(TOperator op, const TType &param);
+ bool setFunctionCalled(TOperator op, const TType &param1, const TType &param2);
+ bool setFunctionCalled(TOperator op,
+ const TType &param1,
+ const TType &param2,
+ const TType &param3);
+ bool setFunctionCalled(TOperator op,
+ const TType &param1,
+ const TType &param2,
+ const TType &param3,
+ const TType &param4);
+
+ bool setFunctionCalled(const FunctionId &functionId);
+
+ const char *findEmulatedFunction(const FunctionId &functionId) const;
// Map from function id to emulated function definition
std::map<FunctionId, std::string> mEmulatedFunctions;
+ // Map from dependent functions to their dependencies. This structure allows each function to
+ // have at most one dependency.
+ std::map<FunctionId, FunctionId> mFunctionDependencies;
+
// Called function ids
std::vector<FunctionId> mFunctions;
+
+ // Constexpr function tables.
+ std::vector<BuiltinQueryFunc *> mQueryFunctions;
};
+} // namespace sh
+
#endif // COMPILER_TRANSLATOR_BUILTINFUNCTIONEMULATOR_H_