LCOV - code coverage report
Current view: top level - gfx/config - gfxConfig.h (source / functions) Hit Total Coverage
Test: output.info Lines: 4 5 80.0 %
Date: 2017-07-14 16:53:18 Functions: 2 3 66.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /* vim: set sts=2 ts=8 sw=2 tw=99 et: */
       3             : /* This Source Code Form is subject to the terms of the Mozilla Public
       4             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       5             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
       6             : #ifndef mozilla_gfx_config_gfxConfig_h
       7             : #define mozilla_gfx_config_gfxConfig_h
       8             : 
       9             : #include <functional>
      10             : #include "gfxFeature.h"
      11             : #include "gfxFallback.h"
      12             : #include "mozilla/Assertions.h"
      13             : 
      14             : namespace mozilla {
      15             : namespace gfx {
      16             : 
      17             : // Defined in GraphicsMessages.ipdlh.
      18             : class FeatureChange;
      19             : 
      20             : // Manages the history and state of a graphics feature. The flow of a feature
      21             : // is:
      22             : //   - A default value, set by all.js, gfxPrefs, or gfxPlatform.
      23             : //   - A user value, set by an external value or user pref.
      24             : //   - An environment value, determined by system/hardware factors or nsIGfxInfo.
      25             : //   - A runtime value, determined by any failures encountered after enabling
      26             : //     the feature.
      27             : //
      28             : // Each state change for a feature is recorded in this class.
      29           3 : class gfxConfig
      30             : {
      31             : public:
      32             :   // Return the full state history of a feature.
      33             :   static FeatureState& GetFeature(Feature aFeature);
      34             : 
      35             :   // Query whether a parameter is enabled, taking into account any user or
      36             :   // runtime overrides. The algorithm works as follow:
      37             :   //
      38             :   //  1. If a runtime decision disabled the feature, return false.
      39             :   //  2. If the user force-enabled the feature, return true.
      40             :   //  3. If the environment disabled the feature, return false.
      41             :   //  4. If the user specified a decision, return it.
      42             :   //  5. Return the base setting for the feature.
      43             :   static bool IsEnabled(Feature aFeature);
      44             : 
      45             :   // Query the history of a parameter. ForcedOnByUser returns whether or not
      46             :   // the user specifically used a "force" preference to enable the parameter.
      47             :   // IsDisabledByDefault returns whether or not the initial status of the
      48             :   // feature, before adding user prefs and runtime decisions, was disabled.
      49             :   static bool IsForcedOnByUser(Feature aFeature);
      50             : 
      51             :   // This returns true if the feature was disabled by default, or was never
      52             :   // initialized to begin with.
      53             :   static bool IsDisabledByDefault(Feature aFeature);
      54             : 
      55             :   // Query the status value of a parameter. This is computed similar to
      56             :   // IsEnabled:
      57             :   //
      58             :   //  1. If a runtime failure was set, return it.
      59             :   //  2. If the user force-enabled the feature, return ForceEnabled.
      60             :   //  3. If an environment status was set, return it.
      61             :   //  4. If a user status was set, return it.
      62             :   //  5. Return the default status.
      63             :   static FeatureStatus GetValue(Feature aFeature);
      64             : 
      65             :   // Reset the entire state of a feature.
      66             :   static void Reset(Feature aFeature);
      67             : 
      68             :   // Initialize the base value of a parameter. The return value is aEnable.
      69             :   static bool SetDefault(Feature aFeature,
      70             :                          bool aEnable,
      71             :                          FeatureStatus aDisableStatus,
      72             :                          const char* aDisableMessage);
      73             :   static void DisableByDefault(Feature aFeature,
      74             :                                FeatureStatus aDisableStatus,
      75             :                                const char* aDisableMessage,
      76             :                                const nsACString& aFailureId = EmptyCString());
      77             :   static void EnableByDefault(Feature aFeature);
      78             : 
      79             :   // Inherit a computed value from another process.
      80             :   static void Inherit(Feature aFeature, FeatureStatus aStatus);
      81             : 
      82             :   // Set a environment status that overrides both the default and user
      83             :   // statuses; this should be used to disable features based on system
      84             :   // or hardware problems that can be determined up-front. The only
      85             :   // status that can override this decision is the user force-enabling
      86             :   // the feature.
      87             :   static void Disable(Feature aFeature,
      88             :                       FeatureStatus aStatus,
      89             :                       const char* aMessage,
      90             :                       const nsACString& aFailureId = EmptyCString());
      91             : 
      92             :   // Given a preference name, infer the default value and whether or not the
      93             :   // user has changed it. |aIsEnablePref| specifies whether or not the pref
      94             :   // is intended to enable a feature (true), or disable it (false).
      95             :   static void SetDefaultFromPref(Feature aFeature,
      96             :                                  const char* aPrefName,
      97             :                                  bool aIsEnablePref,
      98             :                                  bool aDefaultValue);
      99             : 
     100             :   // Disable a parameter based on a runtime decision. This permanently
     101             :   // disables the feature, since runtime decisions override all other
     102             :   // decisions.
     103             :   static void SetFailed(Feature aFeature,
     104             :                         FeatureStatus aStatus,
     105             :                         const char* aMessage,
     106           0 :                         const nsACString& aFailureId = EmptyCString());
     107             : 
     108             :   // Force a feature to be disabled permanently. This is the same as
     109             :   // SetFailed(), but the name may be clearer depending on the context.
     110             :   static void ForceDisable(Feature aFeature,
     111             :                            FeatureStatus aStatus,
     112             :                            const char* aMessage,
     113             :                            const nsACString& aFailureId = EmptyCString())
     114             :   {
     115             :     SetFailed(aFeature, aStatus, aMessage, aFailureId);
     116             :   }
     117             : 
     118             :   // Convenience helpers for SetFailed().
     119             :   static bool MaybeSetFailed(Feature aFeature,
     120             :                              bool aEnable,
     121             :                              FeatureStatus aDisableStatus,
     122             :                              const char* aDisableMessage,
     123             :                              const nsACString& aFailureId = EmptyCString())
     124             :   {
     125             :     if (!aEnable) {
     126             :       SetFailed(aFeature, aDisableStatus, aDisableMessage, aFailureId);
     127             :       return false;
     128             :     }
     129             :     return true;
     130             :   }
     131             : 
     132             :   // Convenience helper for SetFailed().
     133             :   static bool MaybeSetFailed(Feature aFeature,
     134             :                              FeatureStatus aStatus,
     135             :                              const char* aDisableMessage,
     136             :                              const nsACString& aFailureId = EmptyCString())
     137             :   {
     138             :     return MaybeSetFailed(
     139             :       aFeature,
     140             :       (aStatus != FeatureStatus::Available &&
     141             :        aStatus != FeatureStatus::ForceEnabled),
     142             :       aStatus,
     143             :       aDisableMessage, aFailureId);
     144             :   }
     145             : 
     146             :   // Re-enables a feature that was previously disabled, by attaching it to a
     147             :   // fallback. The fallback inherits the message that was used for disabling
     148             :   // the feature. This can be used, for example, when D3D11 fails at runtime
     149             :   // but we acquire a second, successful device with WARP.
     150             :   static void Reenable(Feature aFeature, Fallback aFallback);
     151             : 
     152             :   // Same as SetDefault, except if the feature already has a default value
     153             :   // set, the new value will be set as a runtime value. This is useful for
     154             :   // when the base value can change (for example, via an update from the
     155             :   // parent process).
     156             :   static bool InitOrUpdate(Feature aFeature,
     157             :                            bool aEnable,
     158             :                            FeatureStatus aDisableStatus,
     159             :                            const char* aDisableMessage);
     160             : 
     161             :   // Set a user status that overrides the base value (but not runtime value)
     162             :   // of a parameter.
     163             :   static void UserEnable(Feature aFeature, const char* aMessage);
     164             :   static void UserForceEnable(Feature aFeature, const char* aMessage);
     165             :   static void UserDisable(Feature aFeature, const char* aMessage, const nsACString& aFailureId = EmptyCString());
     166             : 
     167             :   // Query whether a fallback has been toggled.
     168             :   static bool UseFallback(Fallback aFallback);
     169             : 
     170             :   // Add a log entry denoting that a given fallback had to be used. This can
     171             :   // be called from any thread in the UI or GPU process.
     172             :   static void EnableFallback(Fallback aFallback, const char* aMessage);
     173             : 
     174             :   // Run a callback for each initialized FeatureState.
     175             :   typedef std::function<void(const char* aName,
     176             :                              const char* aDescription,
     177             :                              FeatureState& aFeature)> FeatureIterCallback;
     178             :   static void ForEachFeature(const FeatureIterCallback& aCallback);
     179             : 
     180             :   // Run a callback for each enabled fallback.
     181             :   typedef std::function<void(const char* aName, const char* aMsg)> 
     182             :     FallbackIterCallback;
     183             :   static void ForEachFallback(const FallbackIterCallback& aCallback);
     184             : 
     185             :   // Get the most descriptive failure id message for this feature.
     186             :   static const nsCString& GetFailureId(Feature aFeature);
     187             : 
     188             :   static void ImportChange(Feature aFeature, const FeatureChange& aChange);
     189             : 
     190             :   static void Init();
     191             :   static void Shutdown();
     192             : 
     193             : private:
     194             :   void ForEachFallbackImpl(const FallbackIterCallback& aCallback);
     195             : 
     196             : private:
     197          25 :   FeatureState& GetState(Feature aFeature) {
     198          25 :     MOZ_ASSERT(size_t(aFeature) < kNumFeatures);
     199          25 :     return mFeatures[size_t(aFeature)];
     200             :   }
     201             :   const FeatureState& GetState(Feature aFeature) const {
     202             :     MOZ_ASSERT(size_t(aFeature) < kNumFeatures);
     203             :     return mFeatures[size_t(aFeature)];
     204             :   }
     205             : 
     206             :   bool UseFallbackImpl(Fallback aFallback) const;
     207             :   void EnableFallbackImpl(Fallback aFallback, const char* aMessage);
     208             : 
     209             : private:
     210             :   static const size_t kNumFeatures = size_t(Feature::NumValues);
     211             :   static const size_t kNumFallbacks = size_t(Fallback::NumValues);
     212             : 
     213             : private:
     214             :   FeatureState mFeatures[kNumFeatures];
     215             :   uint64_t mFallbackBits;
     216             : 
     217             : private:
     218             :   struct FallbackLogEntry {
     219             :     Fallback mFallback;
     220             :     char mMessage[80];
     221             :   };
     222             : 
     223             :   FallbackLogEntry mFallbackLog[kNumFallbacks];
     224             :   size_t mNumFallbackLogEntries;
     225             : };
     226             : 
     227             : } // namespace gfx
     228             : } // namespace mozilla
     229             : 
     230             : #endif // mozilla_gfx_config_gfxConfig_h

Generated by: LCOV version 1.13