CompositorParent* MetroWidget::NewCompositorParent(int aSurfaceWidth, int aSurfaceHeight) { CompositorParent *compositor = nsBaseWidget::NewCompositorParent(aSurfaceWidth, aSurfaceHeight); if (ShouldUseAPZC()) { mRootLayerTreeId = compositor->RootLayerTreeId(); mController = new APZController(); mController->SetWidgetListener(mWidgetListener); CompositorParent::SetControllerForLayerTree(mRootLayerTreeId, mController); APZController::sAPZC = CompositorParent::GetAPZCTreeManager(compositor->RootLayerTreeId()); APZController::sAPZC->SetDPI(GetDPI()); nsresult rv; nsCOMPtr<nsIObserverService> observerService = do_GetService("@mozilla.org/observer-service;1", &rv); if (NS_SUCCEEDED(rv)) { observerService->AddObserver(this, "apzc-scroll-offset-changed", false); observerService->AddObserver(this, "Metro:ZoomToRect", false); } } return compositor; }
CompositorParent* MetroWidget::NewCompositorParent(int aSurfaceWidth, int aSurfaceHeight) { CompositorParent *compositor = nsBaseWidget::NewCompositorParent(aSurfaceWidth, aSurfaceHeight); if (ShouldUseAPZC()) { CompositorParent::SetControllerForLayerTree(compositor->RootLayerTreeId(), this); MetroWidget::sAPZC = CompositorParent::GetAPZCTreeManager(compositor->RootLayerTreeId()); } return compositor; }
bool ScheduleComposition(const T& op) { CompositableHost* comp = AsCompositable(op); uint64_t id = comp->GetCompositorID(); if (!comp || !id) { return false; } CompositorParent* cp = CompositorParent::GetCompositor(id); if (!cp) { return false; } cp->ScheduleComposition(); return true; }
bool ScheduleComposition(const T& op) { CompositableParent* comp = static_cast<CompositableParent*>(op.compositableParent()); if (!comp || !comp->GetCompositorID()) { return false; } CompositorParent* cp = CompositorParent::GetCompositor(comp->GetCompositorID()); if (!cp) { return false; } cp->ScheduleComposition(); return true; }
bool ImageContainerParent::RecvPublishImage(const SharedImage& aImage) { SharedImage *copy = new SharedImage(aImage); SharedImage *prevImage = SwapSharedImage(mID, copy); PRUint32 compositorID = GetCompositorIDForImage(mID); CompositorParent* compositor = CompositorParent::GetCompositor(compositorID); if (compositor) { compositor->ScheduleComposition(); } if (prevImage && !mStop) { SendReturnImage(*prevImage); delete prevImage; } return true; }
bool CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation& aEdit, EditReplyVector& replyv) { switch (aEdit.type()) { case CompositableOperation::TOpCreatedSingleBuffer: { MOZ_LAYERS_LOG(("[ParentSide] Created single buffer")); const OpCreatedSingleBuffer& op = aEdit.get_OpCreatedSingleBuffer(); CompositableParent* compositableParent = static_cast<CompositableParent*>(op.compositableParent()); TextureParent* textureParent = static_cast<TextureParent*>(op.bufferParent()); textureParent->EnsureTextureHost(op.descriptor().type()); textureParent->GetTextureHost()->SetBuffer(new SurfaceDescriptor(op.descriptor()), compositableParent->GetCompositableManager()); ContentHostBase* content = static_cast<ContentHostBase*>(compositableParent->GetCompositableHost()); content->SetTextureHosts(textureParent->GetTextureHost()); break; } case CompositableOperation::TOpCreatedDoubleBuffer: { MOZ_LAYERS_LOG(("[ParentSide] Created double buffer")); const OpCreatedDoubleBuffer& op = aEdit.get_OpCreatedDoubleBuffer(); CompositableParent* compositableParent = static_cast<CompositableParent*>(op.compositableParent()); TextureParent* frontParent = static_cast<TextureParent*>(op.frontParent()); TextureParent* backParent = static_cast<TextureParent*>(op.backParent()); frontParent->EnsureTextureHost(op.frontDescriptor().type()); backParent->EnsureTextureHost(op.backDescriptor().type()); frontParent->GetTextureHost()->SetBuffer(new SurfaceDescriptor(op.frontDescriptor()), compositableParent->GetCompositableManager()); backParent->GetTextureHost()->SetBuffer(new SurfaceDescriptor(op.backDescriptor()), compositableParent->GetCompositableManager()); ContentHostBase* content = static_cast<ContentHostBase*>(compositableParent->GetCompositableHost()); content->SetTextureHosts(frontParent->GetTextureHost(), backParent->GetTextureHost()); break; } case CompositableOperation::TOpDestroyThebesBuffer: { MOZ_LAYERS_LOG(("[ParentSide] Created double buffer")); const OpDestroyThebesBuffer& op = aEdit.get_OpDestroyThebesBuffer(); CompositableParent* compositableParent = static_cast<CompositableParent*>(op.compositableParent()); ContentHostBase* content = static_cast<ContentHostBase*>(compositableParent->GetCompositableHost()); content->DestroyTextures(); break; } case CompositableOperation::TOpPaintTexture: { MOZ_LAYERS_LOG(("[ParentSide] Paint Texture X")); const OpPaintTexture& op = aEdit.get_OpPaintTexture(); TextureParent* textureParent = static_cast<TextureParent*>(op.textureParent()); CompositableHost* compositable = textureParent->GetCompositableHost(); Layer* layer = GetLayerFromOpPaint(op); ShadowLayer* shadowLayer = layer ? layer->AsShadowLayer() : nullptr; if (shadowLayer) { Compositor* compositor = static_cast<LayerManagerComposite*>(layer->Manager())->GetCompositor(); compositable->SetCompositor(compositor); compositable->SetLayer(layer); } else { // if we reach this branch, it most likely means that async textures // are coming in before we had time to attach the conmpositable to a // layer. Don't panic, it is okay in this case. it should not be // happening continuously, though. } if (layer) { RenderTraceInvalidateStart(layer, "FF00FF", layer->GetVisibleRegion().GetBounds()); } const SurfaceDescriptor& descriptor = op.image(); textureParent->EnsureTextureHost(descriptor.type()); MOZ_ASSERT(textureParent->GetTextureHost()); SurfaceDescriptor newBack; bool shouldRecomposite = compositable->Update(op.image(), &newBack); if (IsSurfaceDescriptorValid(newBack)) { replyv.push_back(OpTextureSwap(op.textureParent(), nullptr, newBack)); } if (shouldRecomposite && textureParent->GetCompositorID()) { CompositorParent* cp = CompositorParent::GetCompositor(textureParent->GetCompositorID()); if (cp) { cp->ScheduleComposition(); } } if (layer) { RenderTraceInvalidateEnd(layer, "FF00FF"); } break; } case CompositableOperation::TOpPaintTextureRegion: { MOZ_LAYERS_LOG(("[ParentSide] Paint ThebesLayer")); const OpPaintTextureRegion& op = aEdit.get_OpPaintTextureRegion(); CompositableParent* compositableParent = static_cast<CompositableParent*>(op.compositableParent()); CompositableHost* compositable = compositableParent->GetCompositableHost(); ShadowThebesLayer* thebes = static_cast<ShadowThebesLayer*>(compositable->GetLayer()); const ThebesBufferData& bufferData = op.bufferData(); RenderTraceInvalidateStart(thebes, "FF00FF", op.updatedRegion().GetBounds()); nsIntRegion frontUpdatedRegion; compositable->UpdateThebes(bufferData, op.updatedRegion(), thebes->GetValidRegion(), &frontUpdatedRegion); replyv.push_back( OpContentBufferSwap(compositableParent, nullptr, frontUpdatedRegion)); RenderTraceInvalidateEnd(thebes, "FF00FF"); break; } case CompositableOperation::TOpUpdatePictureRect: { const OpUpdatePictureRect& op = aEdit.get_OpUpdatePictureRect(); CompositableHost* compositable = static_cast<CompositableParent*>(op.compositableParent())->GetCompositableHost(); MOZ_ASSERT(compositable); compositable->SetPictureRect(op.picture()); break; } default: { MOZ_ASSERT(false, "bad type"); } } return true; }