nsBaseWidget::AutoLayerManagerSetup::~AutoLayerManagerSetup() { BasicLayerManager* manager = static_cast<BasicLayerManager*>(mWidget->GetLayerManager()); if (manager) { NS_ASSERTION(manager->GetBackendType() == LAYERS_BASIC, "AutoLayerManagerSetup instantiated for non-basic layer backend!"); manager->SetDefaultTarget(nullptr); manager->SetDefaultTargetConfiguration(mozilla::layers::BUFFER_NONE, ROTATION_0); } }
nsBaseWidget::AutoLayerManagerSetup::AutoLayerManagerSetup( nsBaseWidget* aWidget, gfxContext* aTarget, BufferMode aDoubleBuffering, ScreenRotation aRotation) : mWidget(aWidget) { BasicLayerManager* manager = static_cast<BasicLayerManager*>(mWidget->GetLayerManager()); if (manager) { NS_ASSERTION(manager->GetBackendType() == LAYERS_BASIC, "AutoLayerManagerSetup instantiated for non-basic layer backend!"); manager->SetDefaultTarget(aTarget); manager->SetDefaultTargetConfiguration(aDoubleBuffering, aRotation); } }
LayerManager * nsWindow::GetLayerManager(PLayerTransactionChild* aShadowManager, LayersBackend aBackendHint, LayerManagerPersistence aPersistence, bool* aAllowRetaining) { if (aAllowRetaining) *aAllowRetaining = true; if (mLayerManager) { // This layer manager might be used for painting outside of DoDraw(), so we need // to set the correct rotation on it. if (mLayerManager->GetBackendType() == LAYERS_BASIC) { BasicLayerManager* manager = static_cast<BasicLayerManager*>(mLayerManager.get()); manager->SetDefaultTargetConfiguration(mozilla::layers::BUFFER_NONE, ScreenRotation(EffectiveScreenRotation())); } else if (mLayerManager->GetBackendType() == LAYERS_CLIENT) { ClientLayerManager* manager = static_cast<ClientLayerManager*>(mLayerManager.get()); manager->SetDefaultTargetConfiguration(mozilla::layers::BUFFER_NONE, ScreenRotation(EffectiveScreenRotation())); } return mLayerManager; } // Set mUseLayersAcceleration here to make it consistent with // nsBaseWidget::GetLayerManager mUseLayersAcceleration = ComputeShouldAccelerate(mUseLayersAcceleration); nsWindow *topWindow = sTopWindows[0]; if (!topWindow) { LOGW(" -- no topwindow\n"); return nullptr; } if (sUsingOMTC) { CreateCompositor(); if (mLayerManager) return mLayerManager; } if (mUseLayersAcceleration) { DebugOnly<nsIntRect> fbBounds = gScreenBounds; if (!sGLContext) { sGLContext = GLContextProvider::CreateForWindow(this); } MOZ_ASSERT(fbBounds.value == gScreenBounds); if (sGLContext) { nsRefPtr<LayerManagerOGL> layerManager = new LayerManagerOGL(this); if (layerManager->Initialize(sGLContext)) { mLayerManager = layerManager; return mLayerManager; } else { LOGW("Could not create OGL LayerManager"); } } else { LOGW("GL context was not created"); } } // Fall back to software rendering. sFramebufferOpen = Framebuffer::Open(); if (sFramebufferOpen) { LOG("Falling back to framebuffer software rendering"); } else { LOGE("Failed to mmap fb(?!?), aborting ..."); NS_RUNTIMEABORT("Can't open GL context and can't fall back on /dev/graphics/fb0 ..."); } mLayerManager = new ClientLayerManager(this); mUseLayersAcceleration = false; return mLayerManager; }