gecko-dev/gfx/thebes/gfxEnv.h
Kelsey Gilbert 0e8cb19c1c Bug 1779800 - Fix WebGL instancing in some cases on Mac. r=gfx-reviewers,lsalzman
This reverts the code that would collapse DrawElements to DrawArrays in some cases,
because it was not a correct transform in some cases.

Instead, we need to *always* keep around a cpu copy of the index buffer,
so that we can figure out how many fakeAttrib0 verts we need.

Finally, in order to correct for the bug where Mac offsets the base instance by `first` in DrawArrays,
we need to (temporarily) patch vertexAttribPointer offsets for any call with non-zero `first`.
(This can be disabled via MOZ_WEBGL_WORKAROUND_FIRST_AFFECTS_INSTANCE_ID=0)

Differential Revision: https://phabricator.services.mozilla.com/D157169
2022-09-15 00:47:03 +00:00

140 lines
4.2 KiB
C++

/* -*- 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 <sstream>
#include <string_view>
// 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 */