tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

BuiltInFunctionEmulator.h (2605B)


      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_