void ClientLayerManager::HandleMemoryPressure() { if (mRoot) { HandleMemoryPressureLayer(mRoot); } if (GetCompositorBridgeChild()) { GetCompositorBridgeChild()->HandleMemoryPressure(); } }
void ClientLayerManager::WaitOnTransactionProcessed() { CompositorBridgeChild* remoteRenderer = GetCompositorBridgeChild(); if (remoteRenderer) { remoteRenderer->SendWaitOnTransactionProcessed(); } }
void ClientLayerManager::ClearCachedResources(Layer* aSubtree) { if (mDestroyed) { // ClearCachedResource was already called by ClientLayerManager::Destroy return; } MOZ_ASSERT(!HasShadowManager() || !aSubtree); mForwarder->ClearCachedResources(); if (aSubtree) { ClearLayer(aSubtree); } else if (mRoot) { ClearLayer(mRoot); } if (GetCompositorBridgeChild()) { GetCompositorBridgeChild()->ClearTexturePool(); } }
bool ClientLayerManager::BeginTransactionWithTarget(gfxContext* aTarget) { // Wait for any previous async paints to complete before starting to paint again. GetCompositorBridgeChild()->FlushAsyncPaints(); MOZ_ASSERT(mForwarder, "ClientLayerManager::BeginTransaction without forwarder"); if (!mForwarder->IPCOpen()) { gfxCriticalNote << "ClientLayerManager::BeginTransaction with IPC channel down. GPU process may have died."; return false; } if (XRE_IsContentProcess() && mForwarder->DeviceCanReset() && mDeviceResetSequenceNumber != CompositorBridgeChild::Get()->DeviceResetSequenceNumber()) { // The compositor has informed this process that a device reset occurred, // but it has not finished informing each TabChild of its new // TextureFactoryIdentifier. Until then, it's illegal to paint. Note that // it is also illegal to request a new TIF synchronously, because we're // not guaranteed the UI process has finished acquiring new compositors // for each widget. // // Note that we only do this for accelerated backends, since we do not // perform resets on basic compositors. gfxCriticalNote << "Discarding a paint since a device reset has not yet been acknowledged."; return false; } mInTransaction = true; mTransactionStart = TimeStamp::Now(); #ifdef MOZ_LAYERS_HAVE_LOG MOZ_LAYERS_LOG(("[----- BeginTransaction")); Log(); #endif NS_ASSERTION(!InTransaction(), "Nested transactions not allowed"); mPhase = PHASE_CONSTRUCTION; MOZ_ASSERT(mKeepAlive.IsEmpty(), "uncommitted txn?"); // If the last transaction was incomplete (a failed DoEmptyTransaction), // don't signal a new transaction to ShadowLayerForwarder. Carry on adding // to the previous transaction. dom::ScreenOrientationInternal orientation; if (dom::TabChild* window = mWidget->GetOwningTabChild()) { orientation = window->GetOrientation(); } else { hal::ScreenConfiguration currentConfig; hal::GetCurrentScreenConfiguration(¤tConfig); orientation = currentConfig.orientation(); } LayoutDeviceIntRect targetBounds = mWidget->GetNaturalBounds(); targetBounds.x = targetBounds.y = 0; mForwarder->BeginTransaction(targetBounds.ToUnknownRect(), mTargetRotation, orientation); // If we're drawing on behalf of a context with async pan/zoom // enabled, then the entire buffer of painted layers might be // composited (including resampling) asynchronously before we get // a chance to repaint, so we have to ensure that it's all valid // and not rotated. // // Desktop does not support async zoom yet, so we ignore this for those // platforms. #if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_UIKIT) if (mWidget && mWidget->GetOwningTabChild()) { mCompositorMightResample = AsyncPanZoomEnabled(); } #endif // If we have a non-default target, we need to let our shadow manager draw // to it. This will happen at the end of the transaction. if (aTarget && XRE_IsParentProcess()) { mShadowTarget = aTarget; } else { NS_ASSERTION(!aTarget, "Content-process ClientLayerManager::BeginTransactionWithTarget not supported"); } // If this is a new paint, increment the paint sequence number. if (!mIsRepeatTransaction) { // Increment the paint sequence number even if test logging isn't // enabled in this process; it may be enabled in the parent process, // and the parent process expects unique sequence numbers. ++mPaintSequenceNumber; if (gfxPrefs::APZTestLoggingEnabled()) { mApzTestData.StartNewPaint(mPaintSequenceNumber); } } return true; }