--- a/dom/canvas/WebGLContext.cpp
+++ b/dom/canvas/WebGLContext.cpp
@@ -565,50 +565,49 @@ BaseCaps(const WebGLContextOptions& opti
}
////////////////////////////////////////
static already_AddRefed<gl::GLContext>
CreateGLWithEGL(const gl::SurfaceCaps& caps, gl::CreateContextFlags flags,
WebGLContext* webgl)
{
- RefPtr<GLContext> gl;
-#ifndef XP_MACOSX // Mac doesn't have GLContextProviderEGL.
- gfx::IntSize dummySize(16, 16);
- gl = gl::GLContextProviderEGL::CreateOffscreen(dummySize, caps,
+ const gfx::IntSize dummySize(16, 16);
+ RefPtr<GLContext> gl = gl::GLContextProviderEGL::CreateOffscreen(dummySize, caps,
flags);
+
+ if (gl && gl->IsANGLE()) {
+ gl = nullptr;
+ }
+
if (!gl) {
webgl->GenerateWarning("Error during EGL OpenGL init.");
return nullptr;
}
- if (gl->IsANGLE())
- return nullptr;
-#endif // XP_MACOSX
return gl.forget();
}
static already_AddRefed<GLContext>
CreateGLWithANGLE(const gl::SurfaceCaps& caps, gl::CreateContextFlags flags,
WebGLContext* webgl)
{
- RefPtr<GLContext> gl;
+ const gfx::IntSize dummySize(16, 16);
+ RefPtr<GLContext> gl = gl::GLContextProviderEGL::CreateOffscreen(dummySize, caps,
+ flags);
- gfx::IntSize dummySize(16, 16);
- gl = gl::GLContextProviderEGL::CreateOffscreen(dummySize, caps, flags);
+ if (gl && !gl->IsANGLE()) {
+ gl = nullptr;
+ }
+
if (!gl) {
webgl->GenerateWarning("Error during ANGLE OpenGL init.");
return nullptr;
}
- if (!gl->IsANGLE()) {
- MOZ_CRASH("Should only be ANGLE.");
- return nullptr;
- }
-
return gl.forget();
}
static already_AddRefed<gl::GLContext>
CreateGLWithDefault(const gl::SurfaceCaps& caps, gl::CreateContextFlags flags,
WebGLContext* webgl)
{
nsCOMPtr<nsIGfxInfo> gfxInfo = services::GetGfxInfo();
@@ -616,41 +615,42 @@ CreateGLWithDefault(const gl::SurfaceCap
if (!(flags & CreateContextFlags::FORCE_ENABLE_HARDWARE) &&
IsFeatureInBlacklist(gfxInfo, nsIGfxInfo::FEATURE_WEBGL_OPENGL))
{
webgl->GenerateWarning("Refused to create native OpenGL context because of"
" blacklisting.");
return nullptr;
}
- gfx::IntSize dummySize(16, 16);
+ const gfx::IntSize dummySize(16, 16);
RefPtr<GLContext> gl = gl::GLContextProvider::CreateOffscreen(dummySize, caps, flags);
+
+ if (gl && gl->IsANGLE()) {
+ gl = nullptr;
+ }
+
if (!gl) {
webgl->GenerateWarning("Error during native OpenGL init.");
return nullptr;
}
- if (gl->IsANGLE())
- return nullptr;
-
return gl.forget();
}
////////////////////////////////////////
bool
WebGLContext::CreateAndInitGLWith(FnCreateGL_T fnCreateGL,
const gl::SurfaceCaps& baseCaps,
gl::CreateContextFlags flags)
{
- MOZ_ASSERT(!gl);
-
std::queue<gl::SurfaceCaps> fallbackCaps;
PopulateCapFallbackQueue(baseCaps, &fallbackCaps);
+ MOZ_RELEASE_ASSERT(!gl);
gl = nullptr;
while (!fallbackCaps.empty()) {
gl::SurfaceCaps& caps = fallbackCaps.front();
gl = fnCreateGL(caps, flags, this);
if (gl)
break;
@@ -665,55 +665,39 @@ WebGLContext::CreateAndInitGLWith(FnCrea
}
return true;
}
bool
WebGLContext::CreateAndInitGL(bool forceEnabled)
{
- bool preferEGL = PR_GetEnv("MOZ_WEBGL_PREFER_EGL");
+ const bool useEGL = PR_GetEnv("MOZ_WEBGL_PREFER_EGL");
+
+ bool useANGLE = false;
+#ifdef XP_WIN
+ const bool disableANGLE = (gfxPrefs::WebGLDisableANGLE() ||
+ PR_GetEnv("MOZ_WEBGL_FORCE_OPENGL"));
+ useANGLE = !disableANGLE;
+#endif
gl::CreateContextFlags flags = gl::CreateContextFlags::NONE;
if (forceEnabled) flags |= gl::CreateContextFlags::FORCE_ENABLE_HARDWARE;
if (!IsWebGL2()) flags |= gl::CreateContextFlags::REQUIRE_COMPAT_PROFILE;
if (IsWebGL2()) flags |= gl::CreateContextFlags::PREFER_ES3;
const gl::SurfaceCaps baseCaps = BaseCaps(mOptions, this);
- MOZ_ASSERT(!gl);
-
- if (preferEGL) {
- if (CreateAndInitGLWith(CreateGLWithEGL, baseCaps, flags))
- return true;
- }
-
- MOZ_ASSERT(!gl);
+ if (useEGL)
+ return CreateAndInitGLWith(CreateGLWithEGL, baseCaps, flags);
-#ifdef XP_WIN
- const bool disableANGLE = (gfxPrefs::WebGLDisableANGLE() ||
- PR_GetEnv("MOZ_WEBGL_FORCE_OPENGL"));
- if (!disableANGLE) {
- if (CreateAndInitGLWith(CreateGLWithANGLE, baseCaps, flags))
- return true;
+ if (useANGLE)
+ return CreateAndInitGLWith(CreateGLWithANGLE, baseCaps, flags);
- // Don't fallback to WGL.
- return false;
- }
-#endif
-
- MOZ_ASSERT(!gl);
-
- if (CreateAndInitGLWith(CreateGLWithDefault, baseCaps, flags))
- return true;
-
- MOZ_ASSERT(!gl);
- gl = nullptr;
-
- return false;
+ return CreateAndInitGLWith(CreateGLWithDefault, baseCaps, flags);
}
// Fallback for resizes:
bool
WebGLContext::ResizeBackbuffer(uint32_t requestedWidth,
uint32_t requestedHeight)
{
uint32_t width = requestedWidth;