Commit 1ad7ab63 authored by Miko Mynttinen's avatar Miko Mynttinen
Browse files

Bug 1549751 - Part 3: Use nsPaintedDisplayItem in WR and FLB r=mattwoodrow

Differential Revision: https://phabricator.services.mozilla.com/D30226

--HG--
extra : moz-landing-system : lando
parent 2c5cb151
Loading
Loading
Loading
Loading
+20 −13
Original line number Original line Diff line number Diff line
@@ -824,27 +824,30 @@ struct DIGroup {
        aGrouper->PaintContainerItem(this, item, bounds, children, aContext,
        aGrouper->PaintContainerItem(this, item, bounds, children, aContext,
                                     aRecorder);
                                     aRecorder);
      } else {
      } else {
        // Hit test items don't have anything to paint so skip them. Ideally we
        nsPaintedDisplayItem* paintedItem = item->AsPaintedDisplayItem();
        // would drop these items earlier...
        if (dirty && paintedItem &&
        if (dirty &&
            // Hit test items don't have anything to paint so skip them.
            // Ideally we would drop these items earlier...
            item->GetType() != DisplayItemType::TYPE_COMPOSITOR_HITTEST_INFO) {
            item->GetType() != DisplayItemType::TYPE_COMPOSITOR_HITTEST_INFO) {
          // What should the clip settting strategy be? We can set the full clip
          // What should the clip settting strategy be? We can set the full clip
          // everytime. this is probably easiest for now. An alternative would
          // everytime. this is probably easiest for now. An alternative would
          // be to put the push and the pop into separate items and let
          // be to put the push and the pop into separate items and let
          // invalidation handle it that way.
          // invalidation handle it that way.
          DisplayItemClip currentClip = item->GetClip();
          DisplayItemClip currentClip = paintedItem->GetClip();


          if (currentClip.HasClip()) {
          if (currentClip.HasClip()) {
            aContext->Save();
            aContext->Save();
            currentClip.ApplyTo(aContext, aGrouper->mAppUnitsPerDevPixel);
            currentClip.ApplyTo(aContext, aGrouper->mAppUnitsPerDevPixel);
          }
          }
          aContext->NewPath();
          aContext->NewPath();
          GP("painting %s %p-%d\n", item->Name(), item->Frame(),
          GP("painting %s %p-%d\n", paintedItem->Name(), paintedItem->Frame(),
             item->GetPerFrameKey());
             paintedItem->GetPerFrameKey());
          if (aGrouper->mDisplayListBuilder->IsPaintingToWindow()) {
          if (aGrouper->mDisplayListBuilder->IsPaintingToWindow()) {
            item->Frame()->AddStateBits(NS_FRAME_PAINTED_THEBES);
            paintedItem->Frame()->AddStateBits(NS_FRAME_PAINTED_THEBES);
          }
          }
          item->Paint(aGrouper->mDisplayListBuilder, aContext);

          paintedItem->Paint(aGrouper->mDisplayListBuilder, aContext);

          if (currentClip.HasClip()) {
          if (currentClip.HasClip()) {
            aContext->Restore();
            aContext->Restore();
          }
          }
@@ -971,9 +974,8 @@ void Grouper::PaintContainerItem(DIGroup* aGroup, nsDisplayItem* aItem,
      break;
      break;
    }
    }
    case DisplayItemType::TYPE_BLEND_CONTAINER: {
    case DisplayItemType::TYPE_BLEND_CONTAINER: {
      aContext->GetDrawTarget()->PushLayer(false, 1.0,
      aContext->GetDrawTarget()->PushLayer(false, 1.0, nullptr,
                                           nullptr, mozilla::gfx::Matrix(),
                                           mozilla::gfx::Matrix(), aItemBounds);
                                           aItemBounds);
      GP("beginGroup %s %p-%d\n", aItem->Name(), aItem->Frame(),
      GP("beginGroup %s %p-%d\n", aItem->Name(), aItem->Frame(),
         aItem->GetPerFrameKey());
         aItem->GetPerFrameKey());
      aContext->GetDrawTarget()->FlushItem(aItemBounds);
      aContext->GetDrawTarget()->FlushItem(aItemBounds);
@@ -2041,13 +2043,17 @@ static bool PaintItemByDrawTarget(nsDisplayItem* aItem, gfx::DrawTarget* aDT,
    }
    }


    default:
    default:
      if (!aItem->AsPaintedDisplayItem()) {
        break;
      }

      context->SetMatrix(context->CurrentMatrix()
      context->SetMatrix(context->CurrentMatrix()
                             .PreScale(aScale.width, aScale.height)
                             .PreScale(aScale.width, aScale.height)
                             .PreTranslate(-aOffset.x, -aOffset.y));
                             .PreTranslate(-aOffset.x, -aOffset.y));
      if (aDisplayListBuilder->IsPaintingToWindow()) {
      if (aDisplayListBuilder->IsPaintingToWindow()) {
        aItem->Frame()->AddStateBits(NS_FRAME_PAINTED_THEBES);
        aItem->Frame()->AddStateBits(NS_FRAME_PAINTED_THEBES);
      }
      }
      aItem->Paint(aDisplayListBuilder, context);
      aItem->AsPaintedDisplayItem()->Paint(aDisplayListBuilder, context);
      isInvalidated = true;
      isInvalidated = true;
      break;
      break;
  }
  }
@@ -2238,7 +2244,8 @@ WebRenderCommandBuilder::GenerateFallbackData(
          aItem, dt, offset, aDisplayListBuilder,
          aItem, dt, offset, aDisplayListBuilder,
          fallbackData->mBasicLayerManager, scale, highlight);
          fallbackData->mBasicLayerManager, scale, highlight);
      if (!isInvalidated) {
      if (!isInvalidated) {
        if (!aItem->GetBuildingRect().IsEqualInterior(fallbackData->mBuildingRect)) {
        if (!aItem->GetBuildingRect().IsEqualInterior(
                fallbackData->mBuildingRect)) {
          // The building rect has changed but we didn't see any invalidations.
          // The building rect has changed but we didn't see any invalidations.
          // We should still consider this an invalidation.
          // We should still consider this an invalidation.
          isInvalidated = true;
          isInvalidated = true;
+27 −17
Original line number Original line Diff line number Diff line
@@ -6465,7 +6465,7 @@ gfxSize FrameLayerBuilder::GetPaintedLayerScaleForFrame(nsIFrame* aFrame) {


#ifdef MOZ_DUMP_PAINTING
#ifdef MOZ_DUMP_PAINTING
static void DebugPaintItem(DrawTarget& aDrawTarget, nsPresContext* aPresContext,
static void DebugPaintItem(DrawTarget& aDrawTarget, nsPresContext* aPresContext,
                           nsDisplayItem* aItem,
                           nsPaintedDisplayItem* aItem,
                           nsDisplayListBuilder* aBuilder) {
                           nsDisplayListBuilder* aBuilder) {
  bool snap;
  bool snap;
  Rect bounds = NSRectToRect(aItem->GetBounds(aBuilder, &snap),
  Rect bounds = NSRectToRect(aItem->GetBounds(aBuilder, &snap),
@@ -6990,6 +6990,11 @@ void FrameLayerBuilder::PaintItems(std::vector<AssignedDisplayItem>& aItems,
      continue;
      continue;
    }
    }


    const bool paintAsLayer = cdi.mInactiveLayerManager;
    nsPaintedDisplayItem* paintedItem = item->AsPaintedDisplayItem();
    MOZ_ASSERT(paintAsLayer || paintedItem,
               "The display item does not support painting");

    const DisplayItemClip* itemClip = GetItemClip(item, temporaryClip);
    const DisplayItemClip* itemClip = GetItemClip(item, temporaryClip);
    bool itemPaintsOwnClip = false;
    bool itemPaintsOwnClip = false;


@@ -6998,7 +7003,8 @@ void FrameLayerBuilder::PaintItems(std::vector<AssignedDisplayItem>& aItems,
      itemClipTracker.Restore();
      itemClipTracker.Restore();


      // Check if the item supports painting with clip.
      // Check if the item supports painting with clip.
      itemPaintsOwnClip = item->CanPaintWithClip(*itemClip);
      itemPaintsOwnClip =
          paintAsLayer ? false : paintedItem->CanPaintWithClip(*itemClip);


      if (!itemPaintsOwnClip) {
      if (!itemPaintsOwnClip) {
        // Item does not support painting with clip, set the clip.
        // Item does not support painting with clip, set the clip.
@@ -7011,27 +7017,31 @@ void FrameLayerBuilder::PaintItems(std::vector<AssignedDisplayItem>& aItems,
      itemClipTracker.Restore();
      itemClipTracker.Restore();
    }
    }


    if (cdi.mInactiveLayerManager) {
    if (paintAsLayer) {
      bool saved = aDrawTarget.GetPermitSubpixelAA();
      bool saved = aDrawTarget.GetPermitSubpixelAA();
      PaintInactiveLayer(aBuilder, cdi.mInactiveLayerManager, item, aContext,
      PaintInactiveLayer(aBuilder, cdi.mInactiveLayerManager, item, aContext,
                         aContext);
                         aContext);
      aDrawTarget.SetPermitSubpixelAA(saved);
      aDrawTarget.SetPermitSubpixelAA(saved);
    } else {
      continue;
    }

    nsIFrame* frame = item->Frame();
    nsIFrame* frame = item->Frame();
    if (aBuilder->IsPaintingToWindow()) {
    if (aBuilder->IsPaintingToWindow()) {
      frame->AddStateBits(NS_FRAME_PAINTED_THEBES);
      frame->AddStateBits(NS_FRAME_PAINTED_THEBES);
    }
    }

#ifdef MOZ_DUMP_PAINTING
#ifdef MOZ_DUMP_PAINTING
    if (gfxEnv::DumpPaintItems()) {
    if (gfxEnv::DumpPaintItems()) {
        DebugPaintItem(aDrawTarget, aPresContext, item, aBuilder);
      DebugPaintItem(aDrawTarget, aPresContext, paintedItem, aBuilder);
      } else
      continue;
    }
#endif
#endif

    if (itemPaintsOwnClip) {
    if (itemPaintsOwnClip) {
      MOZ_ASSERT(itemClip);
      MOZ_ASSERT(itemClip);
        item->PaintWithClip(aBuilder, aContext, *itemClip);
      paintedItem->PaintWithClip(aBuilder, aContext, *itemClip);
    } else {
    } else {
        item->Paint(aBuilder, aContext);
      paintedItem->Paint(aBuilder, aContext);
      }
    }
    }
  }
  }