/** * Following UpdateSurface(), mTexture on context this->gl() should contain the data we want, * unless mDelayedUpdates is true because of a too-large surface. */ void CanvasLayerOGL::UpdateSurface() { if (!IsDirty()) return; Painted(); if (mDestroyed || mDelayedUpdates) { return; } #if defined(GL_PROVIDER_GLX) if (mPixmap) { return; } #endif gfxASurface* updatedSurface = nullptr; gfxImageSurface* temporarySurface = nullptr; bool nothingToShow = false; if (mGLContext) { SharedSurface* surf = mGLContext->RequestFrame(); if (surf) { mLayerProgram = surf->HasAlpha() ? RGBALayerProgramType : RGBXLayerProgramType; switch (surf->Type()) { case SharedSurfaceType::Basic: { SharedSurface_Basic* readbackSurf = SharedSurface_Basic::Cast(surf); updatedSurface = readbackSurf->GetData(); break; } case SharedSurfaceType::GLTextureShare: { SharedSurface_GLTexture* textureSurf = SharedSurface_GLTexture::Cast(surf); mTexture = textureSurf->Texture(); break; } #ifdef XP_MACOSX case SharedSurfaceType::IOSurface: { SharedSurface_IOSurface *ioSurf = SharedSurface_IOSurface::Cast(surf); mTexture = ioSurf->Texture(); mTextureTarget = ioSurf->TextureTarget(); mLayerProgram = ioSurf->HasAlpha() ? RGBARectLayerProgramType : RGBXRectLayerProgramType; break; } #endif default: MOZ_CRASH("Unacceptable SharedSurface type."); } } else { nothingToShow = true; } } else if (mCanvasSurface) { #ifdef XP_MACOSX if (mDrawTarget && mDrawTarget->GetNativeSurface(gfx::NATIVE_SURFACE_CGCONTEXT_ACCELERATED)) { if (!mTexture) { mTexture = MakeIOSurfaceTexture((CGContextRef)mDrawTarget->GetNativeSurface( gfx::NATIVE_SURFACE_CGCONTEXT_ACCELERATED), gl()); mTextureTarget = LOCAL_GL_TEXTURE_RECTANGLE_ARB; mLayerProgram = RGBARectLayerProgramType; } mDrawTarget->Flush(); return; } #endif updatedSurface = mCanvasSurface; } else { MOZ_CRASH("Unhandled canvas layer type."); } if (updatedSurface) { mOGLManager->MakeCurrent(); gfx::SurfaceFormat format = gl()->UploadSurfaceToTexture(updatedSurface, mBounds, mUploadTexture, true,//false, nsIntPoint(0, 0)); mLayerProgram = ShaderProgramFromSurfaceFormat(format); mTexture = mUploadTexture; if (temporarySurface) delete temporarySurface; } MOZ_ASSERT(mTexture || nothingToShow); }