/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef GFX_ENV_H #define GFX_ENV_H #include "mozilla/Attributes.h" #include "nsDebug.h" #include "prenv.h" #include #include // To register the check for an environment variable existence (and not empty), // add a line in this file using the DECL_GFX_ENV macro. // // For example this line in the .h: // DECL_GFX_ENV(MOZ_GL_SPEW); // means that you can call e.g. // if (gfxEnv::MOZ_GL_SPEW()) { ... } // if (gfxEnv::MOZ_GL_SPEW().as_str == "2") { ... } // and that the value will be checked only once, first time we call it, then // cached. struct EnvVal { std::string_view as_str; static auto From(const char* const raw) { auto ret = EnvVal{}; ret.as_str = std::string_view{}; // Empty string counts as missing. if (raw) { ret.as_str = raw; } return ret; } MOZ_IMPLICIT operator bool() const { return !as_str.empty(); // Warning, this means ENV=0" -> true! } }; class gfxEnv final { public: gfxEnv() = delete; static EnvVal Uncached(const char* name) { const auto raw = PR_GetEnv(name); const auto ret = EnvVal::From(raw); if (ret && ret.as_str == "0") { auto msg = std::stringstream{}; msg << name << "=" << ret.as_str << " -> true!"; NS_WARNING(msg.str().c_str()); } return ret; } #define DECL_GFX_ENV(Name) \ static const EnvVal& Name() { \ static const auto cached = Uncached(#Name); \ return cached; \ } // This is where DECL_GFX_ENV for each of the environment variables should go. // We will keep these in an alphabetical order by the environment variable, // to make it easier to see if a method accessing an entry already exists. // Just insert yours in the list. // OpenGL shader debugging in OGLShaderProgram, in DEBUG only DECL_GFX_ENV(MOZ_DEBUG_SHADERS) // Disabling the crash guard in DriverCrashGuard DECL_GFX_ENV(MOZ_DISABLE_CRASH_GUARD) DECL_GFX_ENV(MOZ_FORCE_CRASH_GUARD_NIGHTLY) // We force present to work around some Windows bugs - disable that if this // environment variable is set. DECL_GFX_ENV(MOZ_DISABLE_FORCE_PRESENT) // Together with paint dumping, only when MOZ_DUMP_PAINTING is defined. // Dumping compositor textures is broken pretty badly. For example, // on Linux it crashes TextureHost::GetAsSurface() returns null. // Expect to have to fix things like this if you turn it on. // Meanwhile, content-side texture dumping // (conditioned on DebugDumpPainting()) is a good replacement. DECL_GFX_ENV(MOZ_DUMP_COMPOSITOR_TEXTURES) // Dump GLBlitHelper shader source text. DECL_GFX_ENV(MOZ_DUMP_GLBLITHELPER) // Paint dumping, only when MOZ_DUMP_PAINTING is defined. DECL_GFX_ENV(MOZ_DUMP_PAINT) DECL_GFX_ENV(MOZ_DUMP_PAINT_ITEMS) DECL_GFX_ENV(MOZ_DUMP_PAINT_TO_FILE) // Force gfxDevCrash to use MOZ_CRASH in Beta and Release DECL_GFX_ENV(MOZ_GFX_CRASH_MOZ_CRASH) // Force gfxDevCrash to use telemetry in Nightly and Aurora DECL_GFX_ENV(MOZ_GFX_CRASH_TELEMETRY) // Debugging in GLContext DECL_GFX_ENV(MOZ_GL_DEBUG) DECL_GFX_ENV(MOZ_GL_DEBUG_VERBOSE) DECL_GFX_ENV(MOZ_GL_DEBUG_ABORT_ON_ERROR) DECL_GFX_ENV(MOZ_GL_RELEASE_ASSERT_CONTEXT_OWNERSHIP) DECL_GFX_ENV(MOZ_EGL_RELEASE_ASSERT_CONTEXT_OWNERSHIP) // Count GL extensions DECL_GFX_ENV(MOZ_GL_DUMP_EXTS) // Very noisy GLContext and GLContextProviderEGL DECL_GFX_ENV(MOZ_GL_SPEW) // Do extra work before and after each GLX call in GLContextProviderGLX DECL_GFX_ENV(MOZ_GLX_DEBUG) // GL compositing on Windows DECL_GFX_ENV(MOZ_LAYERS_PREFER_EGL) // Offscreen GL context for main layer manager DECL_GFX_ENV(MOZ_LAYERS_PREFER_OFFSCREEN) // WebGL workarounds DECL_GFX_ENV(MOZ_WEBGL_WORKAROUND_FIRST_AFFECTS_INSTANCE_ID) // WARNING: // For readability reasons, please make sure that you've added your new envvar // to the list above in alphabetical order. // Please do not just append it to the end of the list! #undef DECL_GFX_ENV }; #endif /* GFX_ENV_H */