diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp index 80352a8fe470..50793d5771c0 100644 --- a/dom/canvas/CanvasRenderingContext2D.cpp +++ b/dom/canvas/CanvasRenderingContext2D.cpp @@ -1022,8 +1022,10 @@ CanvasRenderingContext2D::Redraw(const mgfx::Rect &r) void CanvasRenderingContext2D::DidRefresh() { - SkiaGLGlue* glue = gfxPlatform::GetPlatform()->GetSkiaGLGlue(); - if (glue) { + if (IsTargetValid() && SkiaGLTex()) { + SkiaGLGlue* glue = gfxPlatform::GetPlatform()->GetSkiaGLGlue(); + MOZ_ASSERT(glue); + auto gl = glue->GetGLContext(); gl->FlushIfHeavyGLCallsSinceLastFlush(); } @@ -4823,6 +4825,14 @@ CanvasRenderingContext2D::CreateImageData(JSContext* cx, static uint8_t g2DContextLayerUserData; + +uint32_t +CanvasRenderingContext2D::SkiaGLTex() const +{ + MOZ_ASSERT(IsTargetValid()); + return (uint32_t)(uintptr_t)mTarget->GetNativeSurface(NativeSurfaceType::OPENGL_TEXTURE); +} + already_AddRefed CanvasRenderingContext2D::GetCanvasLayer(nsDisplayListBuilder* aBuilder, CanvasLayer *aOldLayer, @@ -4854,9 +4864,11 @@ CanvasRenderingContext2D::GetCanvasLayer(nsDisplayListBuilder* aBuilder, CanvasLayer::Data data; - SkiaGLGlue* glue = gfxPlatform::GetPlatform()->GetSkiaGLGlue(); - GLuint skiaGLTex = (GLuint)(uintptr_t)mTarget->GetNativeSurface(NativeSurfaceType::OPENGL_TEXTURE); - if (glue && skiaGLTex) { + GLuint skiaGLTex = SkiaGLTex(); + if (skiaGLTex) { + SkiaGLGlue* glue = gfxPlatform::GetPlatform()->GetSkiaGLGlue(); + MOZ_ASSERT(glue); + data.mGLContext = glue->GetGLContext(); data.mFrontbufferGLTex = skiaGLTex; } else { @@ -4898,11 +4910,14 @@ CanvasRenderingContext2D::GetCanvasLayer(nsDisplayListBuilder* aBuilder, data.mSize = nsIntSize(mWidth, mHeight); data.mHasAlpha = !mOpaque; - SkiaGLGlue* glue = gfxPlatform::GetPlatform()->GetSkiaGLGlue(); - GLuint skiaGLTex = (GLuint)(uintptr_t)mTarget->GetNativeSurface(NativeSurfaceType::OPENGL_TEXTURE); - if (glue && skiaGLTex) { + GLuint skiaGLTex = SkiaGLTex(); + if (skiaGLTex) { canvasLayer->SetPreTransactionCallback( CanvasRenderingContext2DUserData::PreTransactionCallback, userData); + + SkiaGLGlue* glue = gfxPlatform::GetPlatform()->GetSkiaGLGlue(); + MOZ_ASSERT(glue); + data.mGLContext = glue->GetGLContext(); data.mFrontbufferGLTex = skiaGLTex; } else { diff --git a/dom/canvas/CanvasRenderingContext2D.h b/dom/canvas/CanvasRenderingContext2D.h index ab14dc8081f3..bfe8d83fd326 100644 --- a/dom/canvas/CanvasRenderingContext2D.h +++ b/dom/canvas/CanvasRenderingContext2D.h @@ -698,7 +698,9 @@ protected: /** * Check if the target is valid after calling EnsureTarget. */ - bool IsTargetValid() { return mTarget != sErrorTarget && mTarget != nullptr; } + bool IsTargetValid() const { + return mTarget != sErrorTarget && mTarget != nullptr; + } /** * Returns the surface format this canvas should be allocated using. Takes @@ -764,6 +766,8 @@ protected: // sErrorTarget. mozilla::RefPtr mTarget; + uint32_t SkiaGLTex() const; + /** * Flag to avoid duplicate calls to InvalidateFrame. Set to true whenever * Redraw is called, reset to false when Render is called.