LayerManager* PuppetWidget::GetLayerManager(PLayerTransactionChild* aShadowManager, LayersBackend aBackendHint, LayerManagerPersistence aPersistence, bool* aAllowRetaining) { if (!mLayerManager) { // The backend hint is a temporary placeholder until Azure, when // all content-process layer managers will be BasicLayerManagers. #if defined(MOZ_ENABLE_D3D10_LAYER) if (mozilla::layers::LayersBackend::LAYERS_D3D10 == aBackendHint) { nsRefPtr<LayerManagerD3D10> m = new LayerManagerD3D10(this); m->AsShadowForwarder()->SetShadowManager(aShadowManager); if (m->Initialize()) { mLayerManager = m; } } #endif if (!mLayerManager) { mLayerManager = new ClientLayerManager(this); } } ShadowLayerForwarder* lf = mLayerManager->AsShadowForwarder(); if (!lf->HasShadowManager() && aShadowManager) { lf->SetShadowManager(aShadowManager); } if (aAllowRetaining) { *aAllowRetaining = true; } return mLayerManager; }
bool TabChild::InitWidget(const nsIntSize& size) { NS_ABORT_IF_FALSE(!mWidget && !mRemoteFrame, "CreateWidget twice?"); mWidget = nsIWidget::CreatePuppetWidget(this); if (!mWidget) { NS_ERROR("couldn't create fake widget"); return false; } mWidget->Create( nullptr, 0, // no parents nsIntRect(nsIntPoint(0, 0), size), nullptr, // HandleWidgetEvent nullptr // nsDeviceContext ); LayersBackend be; uint64_t id; int32_t maxTextureSize; RenderFrameChild* remoteFrame = static_cast<RenderFrameChild*>(SendPRenderFrameConstructor( &mScrolling, &be, &maxTextureSize, &id)); if (!remoteFrame) { NS_WARNING("failed to construct RenderFrame"); return false; } PLayersChild* shadowManager = nullptr; if (id != 0) { // Pushing layers transactions directly to a separate // compositor context. shadowManager = CompositorChild::Get()->SendPLayersConstructor(be, id, &be, &maxTextureSize); } else { // Pushing transactions to the parent content. shadowManager = remoteFrame->SendPLayersConstructor(); } if (!shadowManager) { NS_WARNING("failed to construct LayersChild"); // This results in |remoteFrame| being deleted. PRenderFrameChild::Send__delete__(remoteFrame); return false; } ShadowLayerForwarder* lf = mWidget->GetLayerManager(shadowManager, be)->AsShadowForwarder(); NS_ABORT_IF_FALSE(lf && lf->HasShadowManager(), "PuppetWidget should have shadow manager"); lf->SetParentBackendType(be); lf->SetMaxTextureSize(maxTextureSize); mRemoteFrame = remoteFrame; return true; }
LayerManager* PuppetWidget::GetLayerManager(PLayerTransactionChild* aShadowManager, LayersBackend aBackendHint, LayerManagerPersistence aPersistence) { if (!mLayerManager) { mLayerManager = new ClientLayerManager(this); } ShadowLayerForwarder* lf = mLayerManager->AsShadowForwarder(); if (lf && !lf->HasShadowManager() && aShadowManager) { lf->SetShadowManager(aShadowManager); } return mLayerManager; }
bool TabChild::InitWidget(const nsIntSize& size) { NS_ABORT_IF_FALSE(!mWidget && !mRemoteFrame, "CreateWidget twice?"); mWidget = nsIWidget::CreatePuppetWidget(this); if (!mWidget) { NS_ERROR("couldn't create fake widget"); return false; } mWidget->Create( nsnull, 0, // no parents nsIntRect(nsIntPoint(0, 0), size), nsnull, // HandleWidgetEvent nsnull // nsDeviceContext ); RenderFrameChild* remoteFrame = static_cast<RenderFrameChild*>(SendPRenderFrameConstructor()); if (!remoteFrame) { NS_WARNING("failed to construct RenderFrame"); return false; } NS_ABORT_IF_FALSE(0 == remoteFrame->ManagedPLayersChild().Length(), "shouldn't have a shadow manager yet"); LayerManager::LayersBackend be; PRInt32 maxTextureSize; PLayersChild* shadowManager = remoteFrame->SendPLayersConstructor(&be, &maxTextureSize); if (!shadowManager) { NS_WARNING("failed to construct LayersChild"); // This results in |remoteFrame| being deleted. PRenderFrameChild::Send__delete__(remoteFrame); return false; } ShadowLayerForwarder* lf = mWidget->GetLayerManager(shadowManager, be)->AsShadowForwarder(); NS_ABORT_IF_FALSE(lf && lf->HasShadowManager(), "PuppetWidget should have shadow manager"); lf->SetParentBackendType(be); lf->SetMaxTextureSize(maxTextureSize); mRemoteFrame = remoteFrame; return true; }