already_AddRefed<ThebesLayer> BasicLayerManager::CreateThebesLayer() { NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); nsRefPtr<ThebesLayer> layer = new BasicThebesLayer(this); return layer.forget(); }
already_AddRefed<DisplayItemLayer> BasicLayerManager::CreateDisplayItemLayer() { NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); RefPtr<DisplayItemLayer> layer = new BasicDisplayItemLayer(this); return layer.forget(); }
already_AddRefed<ShadowColorLayer> BasicShadowLayerManager::CreateShadowColorLayer() { NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); nsRefPtr<ShadowColorLayer> layer = new BasicShadowColorLayer(this); return layer.forget(); }
already_AddRefed<PaintedLayer> ClientLayerManager::CreatePaintedLayerWithHint(PaintedLayerCreationHint aHint) { NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); // The non-tiling ContentClient requires CrossProcessSemaphore which // isn't implemented for OSX. #ifdef XP_MACOSX if (true) { #else if (gfxPrefs::LayersTilesEnabled()) { #endif RefPtr<ClientTiledPaintedLayer> layer = new ClientTiledPaintedLayer(this, aHint); CREATE_SHADOW(Painted); return layer.forget(); } else { RefPtr<ClientPaintedLayer> layer = new ClientPaintedLayer(this, aHint); CREATE_SHADOW(Painted); return layer.forget(); } } void ClientPaintedLayer::PrintInfo(std::stringstream& aStream, const char* aPrefix) { PaintedLayer::PrintInfo(aStream, aPrefix); if (mContentClient) { aStream << "\n"; nsAutoCString pfx(aPrefix); pfx += " "; mContentClient->PrintInfo(aStream, pfx.get()); } }
already_AddRefed<ThebesLayer> ClientLayerManager::CreateThebesLayerWithHint(ThebesLayerCreationHint aHint) { NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); if ( #ifdef MOZ_B2G aHint == SCROLLABLE && #endif gfxPrefs::LayersTilesEnabled() && (AsShadowForwarder()->GetCompositorBackendType() == LayersBackend::LAYERS_OPENGL || AsShadowForwarder()->GetCompositorBackendType() == LayersBackend::LAYERS_D3D9 || AsShadowForwarder()->GetCompositorBackendType() == LayersBackend::LAYERS_D3D11)) { if (gfxPrefs::LayersUseSimpleTiles()) { nsRefPtr<SimpleClientTiledThebesLayer> layer = new SimpleClientTiledThebesLayer(this); CREATE_SHADOW(Thebes); return layer.forget(); } else { nsRefPtr<ClientTiledThebesLayer> layer = new ClientTiledThebesLayer(this); CREATE_SHADOW(Thebes); return layer.forget(); } } else { nsRefPtr<ClientThebesLayer> layer = new ClientThebesLayer(this); CREATE_SHADOW(Thebes); return layer.forget(); } }
void ClientLayerManager::Mutated(Layer* aLayer) { LayerManager::Mutated(aLayer); NS_ASSERTION(InConstruction() || InDrawing(), "wrong phase"); mForwarder->Mutated(Hold(aLayer)); }
already_AddRefed<CanvasLayer> ClientLayerManager::CreateCanvasLayer() { NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); nsRefPtr<ClientCanvasLayer> layer = new ClientCanvasLayer(this); CREATE_SHADOW(Canvas); return layer.forget(); }
already_AddRefed<ColorLayer> BasicShadowLayerManager::CreateColorLayer() { NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); nsRefPtr<BasicShadowableColorLayer> layer = new BasicShadowableColorLayer(this); MAYBE_CREATE_SHADOW(Color); return layer.forget(); }
bool ClientLayerManager::EndTransactionInternal(DrawPaintedLayerCallback aCallback, void* aCallbackData, EndTransactionFlags) { PROFILER_LABEL("ClientLayerManager", "EndTransactionInternal", js::ProfileEntry::Category::GRAPHICS); #ifdef MOZ_LAYERS_HAVE_LOG MOZ_LAYERS_LOG((" ----- (beginning paint)")); Log(); #endif profiler_tracing("Paint", "Rasterize", TRACING_INTERVAL_START); NS_ASSERTION(InConstruction(), "Should be in construction phase"); mPhase = PHASE_DRAWING; ClientLayer* root = ClientLayer::ToClientLayer(GetRoot()); mTransactionIncomplete = false; // Apply pending tree updates before recomputing effective // properties. GetRoot()->ApplyPendingUpdatesToSubtree(); mPaintedLayerCallback = aCallback; mPaintedLayerCallbackData = aCallbackData; GetRoot()->ComputeEffectiveTransforms(Matrix4x4()); root->RenderLayer(); if (!mRepeatTransaction && !GetRoot()->GetInvalidRegion().IsEmpty()) { GetRoot()->Mutated(); } if (!mIsRepeatTransaction) { mAnimationReadyTime = TimeStamp::Now(); GetRoot()->StartPendingAnimations(mAnimationReadyTime); } mPaintedLayerCallback = nullptr; mPaintedLayerCallbackData = nullptr; // Go back to the construction phase if the transaction isn't complete. // Layout will update the layer tree and call EndTransaction(). mPhase = mTransactionIncomplete ? PHASE_CONSTRUCTION : PHASE_NONE; NS_ASSERTION(!aCallback || !mTransactionIncomplete, "If callback is not null, transaction must be complete"); if (gfxPlatform::GetPlatform()->DidRenderingDeviceReset()) { FrameLayerBuilder::InvalidateAllLayers(this); } return !mTransactionIncomplete; }
already_AddRefed<ThebesLayer> ClientLayerManager::CreateThebesLayer() { NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); if (Preferences::GetBool("layers.force-tiles") && GetCompositorBackendType() == LAYERS_OPENGL) { nsRefPtr<ClientTiledThebesLayer> layer = new ClientTiledThebesLayer(this); CREATE_SHADOW(Thebes); return layer.forget(); } else { nsRefPtr<ClientThebesLayer> layer = new ClientThebesLayer(this); CREATE_SHADOW(Thebes); return layer.forget(); } }
bool ClientLayerManager::EndTransactionInternal(DrawThebesLayerCallback aCallback, void* aCallbackData, EndTransactionFlags) { PROFILER_LABEL("ClientLayerManager", "EndTransactionInternal"); #ifdef MOZ_LAYERS_HAVE_LOG MOZ_LAYERS_LOG((" ----- (beginning paint)")); Log(); #endif profiler_tracing("Paint", "Rasterize", TRACING_INTERVAL_START); NS_ASSERTION(InConstruction(), "Should be in construction phase"); mPhase = PHASE_DRAWING; ClientLayer* root = ClientLayer::ToClientLayer(GetRoot()); mTransactionIncomplete = false; // Apply pending tree updates before recomputing effective // properties. GetRoot()->ApplyPendingUpdatesToSubtree(); mThebesLayerCallback = aCallback; mThebesLayerCallbackData = aCallbackData; GetRoot()->ComputeEffectiveTransforms(Matrix4x4()); root->RenderLayer(); if (!mRepeatTransaction && !GetRoot()->GetInvalidRegion().IsEmpty()) { GetRoot()->Mutated(); } mThebesLayerCallback = nullptr; mThebesLayerCallbackData = nullptr; // Go back to the construction phase if the transaction isn't complete. // Layout will update the layer tree and call EndTransaction(). mPhase = mTransactionIncomplete ? PHASE_CONSTRUCTION : PHASE_NONE; NS_ASSERTION(!aCallback || !mTransactionIncomplete, "If callback is not null, transaction must be complete"); return !mTransactionIncomplete; }
void ClientLayerManager::SetRoot(Layer* aLayer) { if (mRoot != aLayer) { // Have to hold the old root and its children in order to // maintain the same view of the layer tree in this process as // the parent sees. Otherwise layers can be destroyed // mid-transaction and bad things can happen (v. bug 612573) if (mRoot) { Hold(mRoot); } mForwarder->SetRoot(Hold(aLayer)); NS_ASSERTION(aLayer, "Root can't be null"); NS_ASSERTION(aLayer->Manager() == this, "Wrong manager"); NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); mRoot = aLayer; } }
already_AddRefed<ThebesLayer> ClientLayerManager::CreateThebesLayer() { NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); #ifdef FORCE_BASICTILEDTHEBESLAYER if (GetCompositorBackendType() == LAYERS_OPENGL) { nsRefPtr<ClientTiledThebesLayer> layer = new ClientTiledThebesLayer(this); CREATE_SHADOW(Thebes); return layer.forget(); } else #endif { nsRefPtr<ClientThebesLayer> layer = new ClientThebesLayer(this); CREATE_SHADOW(Thebes); return layer.forget(); } }
already_AddRefed<ThebesLayer> BasicShadowLayerManager::CreateThebesLayer() { NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); #ifdef FORCE_BASICTILEDTHEBESLAYER if (HasShadowManager() && GetCompositorBackendType() == LAYERS_OPENGL) { // BasicTiledThebesLayer doesn't support main // thread compositing so only return this layer // type if we have a shadow manager. nsRefPtr<BasicTiledThebesLayer> layer = new BasicTiledThebesLayer(this); MAYBE_CREATE_SHADOW(Thebes); return layer.forget(); } else #endif { nsRefPtr<BasicShadowableThebesLayer> layer = new BasicShadowableThebesLayer(this); MAYBE_CREATE_SHADOW(Thebes); return layer.forget(); } }
bool ClientLayerManager::EndTransactionInternal(DrawPaintedLayerCallback aCallback, void* aCallbackData, EndTransactionFlags) { PaintTelemetry::AutoRecord record(PaintTelemetry::Metric::Rasterization); AutoProfilerTracing tracing("Paint", "Rasterize"); Maybe<TimeStamp> startTime; if (gfxPrefs::LayersDrawFPS()) { startTime = Some(TimeStamp::Now()); } #ifdef WIN32 if (aCallbackData) { // Content processes don't get OnPaint called. So update here whenever we // may do Thebes drawing. gfxDWriteFont::UpdateClearTypeUsage(); } #endif AUTO_PROFILER_LABEL("ClientLayerManager::EndTransactionInternal", GRAPHICS); #ifdef MOZ_LAYERS_HAVE_LOG MOZ_LAYERS_LOG((" ----- (beginning paint)")); Log(); #endif NS_ASSERTION(InConstruction(), "Should be in construction phase"); mPhase = PHASE_DRAWING; ClientLayer* root = ClientLayer::ToClientLayer(GetRoot()); mTransactionIncomplete = false; // Apply pending tree updates before recomputing effective // properties. GetRoot()->ApplyPendingUpdatesToSubtree(); mPaintedLayerCallback = aCallback; mPaintedLayerCallbackData = aCallbackData; GetRoot()->ComputeEffectiveTransforms(Matrix4x4()); // Skip the painting if the device is in device-reset status. if (!gfxPlatform::GetPlatform()->DidRenderingDeviceReset()) { if (gfxPrefs::AlwaysPaint() && XRE_IsContentProcess()) { TimeStamp start = TimeStamp::Now(); root->RenderLayer(); mLastPaintTime = TimeStamp::Now() - start; } else { root->RenderLayer(); } } else { gfxCriticalNote << "LayerManager::EndTransaction skip RenderLayer()."; } if (!mRepeatTransaction && !GetRoot()->GetInvalidRegion().IsEmpty()) { GetRoot()->Mutated(); } if (!mIsRepeatTransaction) { mAnimationReadyTime = TimeStamp::Now(); GetRoot()->StartPendingAnimations(mAnimationReadyTime); } mPaintedLayerCallback = nullptr; mPaintedLayerCallbackData = nullptr; // Go back to the construction phase if the transaction isn't complete. // Layout will update the layer tree and call EndTransaction(). mPhase = mTransactionIncomplete ? PHASE_CONSTRUCTION : PHASE_NONE; NS_ASSERTION(!aCallback || !mTransactionIncomplete, "If callback is not null, transaction must be complete"); if (gfxPlatform::GetPlatform()->DidRenderingDeviceReset()) { FrameLayerBuilder::InvalidateAllLayers(this); } if (startTime) { PaintTiming& pt = mForwarder->GetPaintTiming(); pt.rasterMs() = (TimeStamp::Now() - startTime.value()).ToMilliseconds(); } return !mTransactionIncomplete; }