diff options
author | Miguel Costa <miguel.costa@qt.io> | 2018-06-26 16:56:45 +0200 |
---|---|---|
committer | Andre de la Rocha <andre.rocha@qt.io> | 2018-10-13 21:36:35 +0000 |
commit | 0a7aebadfbb3534284546aa3ca8612314c08f136 (patch) | |
tree | e94ee33ae3bb9b96fc3047c6455d47ac4920bfbf /src/3rdparty/angle/src/compiler/translator/BuiltInFunctionEmulator.h | |
parent | 656e89f875ad2008ca16cc673b687a22daa294c9 (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.h | 192 |
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 ¶m); - bool SetFunctionCalled(TOperator op, const TType ¶m1, const TType ¶m2); - bool SetFunctionCalled(TOperator op, const TType ¶m1, const TType ¶m2, const TType ¶m3); - - 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 ¶m); + bool setFunctionCalled(TOperator op, const TType ¶m1, const TType ¶m2); + bool setFunctionCalled(TOperator op, + const TType ¶m1, + const TType ¶m2, + const TType ¶m3); + bool setFunctionCalled(TOperator op, + const TType ¶m1, + const TType ¶m2, + const TType ¶m3, + const TType ¶m4); + + 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_ |