LCOV - code coverage report
Current view: top level - gfx/layers/wr - WebRenderPaintedLayer.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 0 66 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 4 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
       2             :  * This Source Code Form is subject to the terms of the Mozilla Public
       3             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       4             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
       5             : 
       6             : #include "WebRenderPaintedLayer.h"
       7             : 
       8             : #include "LayersLogging.h"
       9             : #include "mozilla/ArrayUtils.h"
      10             : #include "mozilla/layers/ImageClient.h"
      11             : #include "mozilla/layers/ScrollingLayersHelper.h"
      12             : #include "mozilla/layers/StackingContextHelper.h"
      13             : #include "mozilla/layers/WebRenderBridgeChild.h"
      14             : #include "mozilla/layers/UpdateImageHelper.h"
      15             : #include "mozilla/webrender/WebRenderTypes.h"
      16             : #include "gfxPrefs.h"
      17             : #include "gfxUtils.h"
      18             : 
      19             : namespace mozilla {
      20             : namespace layers {
      21             : 
      22             : using namespace mozilla::gfx;
      23             : 
      24             : bool
      25           0 : WebRenderPaintedLayer::SetupExternalImages()
      26             : {
      27             :   // XXX We won't keep using ContentClient for WebRenderPaintedLayer in the future and
      28             :   // there is a crash problem for ContentClient on MacOS. So replace ContentClient with
      29             :   // ImageClient. See bug 1341001.
      30             : 
      31           0 :   if (!mImageContainer) {
      32           0 :     mImageContainer = LayerManager::CreateImageContainer();
      33             :   }
      34             : 
      35           0 :   if (!mImageClient) {
      36           0 :     mImageClient = ImageClient::CreateImageClient(CompositableType::IMAGE,
      37           0 :                                                   WrBridge(),
      38           0 :                                                   TextureFlags::DEFAULT);
      39           0 :     if (!mImageClient) {
      40           0 :       return false;
      41             :     }
      42           0 :     mImageClient->Connect();
      43             :   }
      44             : 
      45           0 :   if (mExternalImageId.isNothing()) {
      46           0 :     mExternalImageId = Some(WrBridge()->AllocExternalImageIdForCompositable(mImageClient));
      47             :   }
      48             : 
      49           0 :   return true;
      50             : }
      51             : 
      52             : bool
      53           0 : WebRenderPaintedLayer::UpdateImageClient()
      54             : {
      55           0 :   MOZ_ASSERT(WrManager()->GetPaintedLayerCallback());
      56           0 :   LayerIntRegion visibleRegion = GetVisibleRegion();
      57           0 :   LayerIntRect bounds = visibleRegion.GetBounds();
      58           0 :   LayerIntSize size = bounds.Size();
      59           0 :   IntSize imageSize(size.width, size.height);
      60             : 
      61           0 :   UpdateImageHelper helper(mImageContainer, mImageClient, imageSize);
      62             : 
      63             :   {
      64           0 :     RefPtr<DrawTarget> target = helper.GetDrawTarget();
      65           0 :     if (!target) {
      66           0 :       return false;
      67             :     }
      68             : 
      69           0 :     target->ClearRect(Rect(0, 0, imageSize.width, imageSize.height));
      70           0 :     target->SetTransform(Matrix().PreTranslate(-bounds.x, -bounds.y));
      71             :     RefPtr<gfxContext> ctx =
      72           0 :         gfxContext::CreatePreservingTransformOrNull(target);
      73           0 :     MOZ_ASSERT(ctx); // already checked the target above
      74             : 
      75           0 :     WrManager()->GetPaintedLayerCallback()(this,
      76             :                                            ctx,
      77           0 :                                            visibleRegion.ToUnknownRegion(), visibleRegion.ToUnknownRegion(),
      78           0 :                                            DrawRegionClip::DRAW, nsIntRegion(), WrManager()->GetPaintedLayerCallbackData());
      79             : 
      80           0 :     if (gfxPrefs::WebRenderHighlightPaintedLayers()) {
      81           0 :       target->SetTransform(Matrix());
      82           0 :       target->FillRect(Rect(0, 0, imageSize.width, imageSize.height), ColorPattern(Color(1.0, 0.0, 0.0, 0.5)));
      83             :     }
      84             :   }
      85             : 
      86           0 :   if (!helper.UpdateImage()) {
      87           0 :     return false;
      88             :   }
      89             : 
      90           0 :   return true;
      91             : }
      92             : 
      93             : void
      94           0 : WebRenderPaintedLayer::CreateWebRenderDisplayList(wr::DisplayListBuilder& aBuilder,
      95             :                                                   const StackingContextHelper& aSc)
      96             : {
      97           0 :   ScrollingLayersHelper scroller(this, aBuilder, aSc);
      98           0 :   StackingContextHelper sc(aSc, aBuilder, this);
      99             : 
     100           0 :   LayerRect rect = Bounds();
     101           0 :   DumpLayerInfo("PaintedLayer", rect);
     102             : 
     103           0 :   WrImageKey key = GetImageKey();
     104           0 :   WrBridge()->AddWebRenderParentCommand(OpAddExternalImage(mExternalImageId.value(), key));
     105           0 :   WrManager()->AddImageKeyForDiscard(key);
     106             : 
     107           0 :   WrRect r = sc.ToRelativeWrRect(rect);
     108           0 :   aBuilder.PushImage(r, r, wr::ImageRendering::Auto, key);
     109           0 : }
     110             : 
     111             : void
     112           0 : WebRenderPaintedLayer::RenderLayer(wr::DisplayListBuilder& aBuilder,
     113             :                                    const StackingContextHelper& aSc)
     114             : {
     115           0 :   if (!SetupExternalImages()) {
     116           0 :     return;
     117             :   }
     118             : 
     119           0 :   if (GetVisibleRegion().IsEmpty()) {
     120           0 :     if (gfxPrefs::LayersDump()) {
     121           0 :       printf_stderr("PaintedLayer %p skipping\n", this->GetLayer());
     122             :     }
     123           0 :     return;
     124             :   }
     125             : 
     126           0 :   nsIntRegion regionToPaint;
     127           0 :   regionToPaint.Sub(mVisibleRegion.ToUnknownRegion(), GetValidRegion());
     128             : 
     129             :   // We have something to paint but can't. This usually happens only in
     130             :   // empty transactions
     131           0 :   if (!regionToPaint.IsEmpty() && !WrManager()->GetPaintedLayerCallback()) {
     132           0 :     WrManager()->SetTransactionIncomplete();
     133           0 :     return;
     134             :   }
     135             : 
     136           0 :   if (!regionToPaint.IsEmpty() && WrManager()->GetPaintedLayerCallback()) {
     137           0 :     if (!UpdateImageClient()) {
     138           0 :       return;
     139             :     }
     140             :   } else {
     141             :     // We have an empty transaction, just reuse the old image we had before.
     142           0 :     MOZ_ASSERT(mExternalImageId);
     143           0 :     MOZ_ASSERT(mImageContainer->HasCurrentImage());
     144           0 :     MOZ_ASSERT(GetInvalidRegion().IsEmpty());
     145             :   }
     146             : 
     147           0 :   CreateWebRenderDisplayList(aBuilder, aSc);
     148             : }
     149             : 
     150             : } // namespace layers
     151             : } // namespace mozilla

Generated by: LCOV version 1.13