gfx/layers/ipc/LayerTransactionParent.cpp

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     2  * vim: sw=2 ts=8 et :
     3  */
     4 /* This Source Code Form is subject to the terms of the Mozilla Public
     5  * License, v. 2.0. If a copy of the MPL was not distributed with this
     6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     8 #include "LayerTransactionParent.h"
     9 #include <vector>                       // for vector
    10 #include "CompositableHost.h"           // for CompositableParent, Get, etc
    11 #include "ImageLayers.h"                // for ImageLayer
    12 #include "Layers.h"                     // for Layer, ContainerLayer, etc
    13 #include "ShadowLayerParent.h"          // for ShadowLayerParent
    14 #include "gfx3DMatrix.h"                // for gfx3DMatrix
    15 #include "gfxPoint3D.h"                 // for gfxPoint3D
    16 #include "CompositableTransactionParent.h"  // for EditReplyVector
    17 #include "ShadowLayersManager.h"        // for ShadowLayersManager
    18 #include "mozilla/gfx/BasePoint3D.h"    // for BasePoint3D
    19 #include "mozilla/layers/CanvasLayerComposite.h"
    20 #include "mozilla/layers/ColorLayerComposite.h"
    21 #include "mozilla/layers/Compositor.h"  // for Compositor
    22 #include "mozilla/layers/ContainerLayerComposite.h"
    23 #include "mozilla/layers/ImageLayerComposite.h"
    24 #include "mozilla/layers/LayerManagerComposite.h"
    25 #include "mozilla/layers/LayersMessages.h"  // for EditReply, etc
    26 #include "mozilla/layers/LayersSurfaces.h"  // for PGrallocBufferParent
    27 #include "mozilla/layers/LayersTypes.h"  // for MOZ_LAYERS_LOG
    28 #include "mozilla/layers/PCompositableParent.h"
    29 #include "mozilla/layers/PLayerParent.h"  // for PLayerParent
    30 #include "mozilla/layers/ThebesLayerComposite.h"
    31 #include "mozilla/mozalloc.h"           // for operator delete, etc
    32 #include "nsCoord.h"                    // for NSAppUnitsToFloatPixels
    33 #include "nsDebug.h"                    // for NS_RUNTIMEABORT
    34 #include "nsDeviceContext.h"            // for AppUnitsPerCSSPixel
    35 #include "nsISupportsImpl.h"            // for Layer::Release, etc
    36 #include "nsLayoutUtils.h"              // for nsLayoutUtils
    37 #include "nsMathUtils.h"                // for NS_round
    38 #include "nsPoint.h"                    // for nsPoint
    39 #include "nsTArray.h"                   // for nsTArray, nsTArray_Impl, etc
    40 #include "GeckoProfiler.h"
    41 #include "mozilla/layers/TextureHost.h"
    42 #include "mozilla/layers/AsyncCompositionManager.h"
    43 #include "mozilla/layers/AsyncPanZoomController.h"
    45 typedef std::vector<mozilla::layers::EditReply> EditReplyVector;
    47 using mozilla::layout::RenderFrameParent;
    49 namespace mozilla {
    50 namespace layers {
    52 class PGrallocBufferParent;
    54 //--------------------------------------------------
    55 // Convenience accessors
    56 static ShadowLayerParent*
    57 cast(const PLayerParent* in)
    58 {
    59   return const_cast<ShadowLayerParent*>(
    60     static_cast<const ShadowLayerParent*>(in));
    61 }
    63 template<class OpCreateT>
    64 static ShadowLayerParent*
    65 AsLayerComposite(const OpCreateT& op)
    66 {
    67   return cast(op.layerParent());
    68 }
    70 static ShadowLayerParent*
    71 AsLayerComposite(const OpSetRoot& op)
    72 {
    73   return cast(op.rootParent());
    74 }
    76 static ShadowLayerParent*
    77 ShadowContainer(const OpInsertAfter& op)
    78 {
    79   return cast(op.containerParent());
    80 }
    81 static ShadowLayerParent*
    82 ShadowChild(const OpInsertAfter& op)
    83 {
    84   return cast(op.childLayerParent());
    85 }
    86 static ShadowLayerParent*
    87 ShadowAfter(const OpInsertAfter& op)
    88 {
    89   return cast(op.afterParent());
    90 }
    92 static ShadowLayerParent*
    93 ShadowContainer(const OpPrependChild& op)
    94 {
    95   return cast(op.containerParent());
    96 }
    97 static ShadowLayerParent*
    98 ShadowChild(const OpPrependChild& op)
    99 {
   100   return cast(op.childLayerParent());
   101 }
   103 static ShadowLayerParent*
   104 ShadowContainer(const OpRemoveChild& op)
   105 {
   106   return cast(op.containerParent());
   107 }
   108 static ShadowLayerParent*
   109 ShadowChild(const OpRemoveChild& op)
   110 {
   111   return cast(op.childLayerParent());
   112 }
   114 static ShadowLayerParent*
   115 ShadowContainer(const OpRepositionChild& op)
   116 {
   117   return cast(op.containerParent());
   118 }
   119 static ShadowLayerParent*
   120 ShadowChild(const OpRepositionChild& op)
   121 {
   122   return cast(op.childLayerParent());
   123 }
   124 static ShadowLayerParent*
   125 ShadowAfter(const OpRepositionChild& op)
   126 {
   127   return cast(op.afterParent());
   128 }
   130 static ShadowLayerParent*
   131 ShadowContainer(const OpRaiseToTopChild& op)
   132 {
   133   return cast(op.containerParent());
   134 }
   135 static ShadowLayerParent*
   136 ShadowChild(const OpRaiseToTopChild& op)
   137 {
   138   return cast(op.childLayerParent());
   139 }
   141 //--------------------------------------------------
   142 // LayerTransactionParent
   143 LayerTransactionParent::LayerTransactionParent(LayerManagerComposite* aManager,
   144                                                ShadowLayersManager* aLayersManager,
   145                                                uint64_t aId)
   146   : mLayerManager(aManager)
   147   , mShadowLayersManager(aLayersManager)
   148   , mId(aId)
   149   , mDestroyed(false)
   150   , mIPCOpen(false)
   151 {
   152   MOZ_COUNT_CTOR(LayerTransactionParent);
   153 }
   155 LayerTransactionParent::~LayerTransactionParent()
   156 {
   157   MOZ_COUNT_DTOR(LayerTransactionParent);
   158 }
   160 void
   161 LayerTransactionParent::Destroy()
   162 {
   163   mDestroyed = true;
   164   for (size_t i = 0; i < ManagedPLayerParent().Length(); ++i) {
   165     ShadowLayerParent* slp =
   166       static_cast<ShadowLayerParent*>(ManagedPLayerParent()[i]);
   167     slp->Destroy();
   168   }
   169 }
   171 LayersBackend
   172 LayerTransactionParent::GetCompositorBackendType() const
   173 {
   174   return mLayerManager->GetBackendType();
   175 }
   177 /* virtual */
   178 bool
   179 LayerTransactionParent::RecvUpdateNoSwap(const InfallibleTArray<Edit>& cset,
   180                                          const TargetConfig& targetConfig,
   181                                          const bool& isFirstPaint,
   182                                          const bool& scheduleComposite)
   183 {
   184   return RecvUpdate(cset, targetConfig, isFirstPaint, scheduleComposite, nullptr);
   185 }
   187 bool
   188 LayerTransactionParent::RecvUpdate(const InfallibleTArray<Edit>& cset,
   189                                    const TargetConfig& targetConfig,
   190                                    const bool& isFirstPaint,
   191                                    const bool& scheduleComposite,
   192                                    InfallibleTArray<EditReply>* reply)
   193 {
   194   profiler_tracing("Paint", "Composite", TRACING_INTERVAL_START);
   195   PROFILER_LABEL("LayerTransactionParent", "RecvUpdate");
   196 #ifdef COMPOSITOR_PERFORMANCE_WARNING
   197   TimeStamp updateStart = TimeStamp::Now();
   198 #endif
   200   MOZ_LAYERS_LOG(("[ParentSide] received txn with %d edits", cset.Length()));
   202   if (mDestroyed || !layer_manager() || layer_manager()->IsDestroyed()) {
   203     return true;
   204   }
   206   if (mLayerManager && mLayerManager->GetCompositor() &&
   207       !targetConfig.naturalBounds().IsEmpty()) {
   208     mLayerManager->GetCompositor()->SetScreenRotation(targetConfig.rotation());
   209   }
   211   // Clear fence handles used in previsou transaction.
   212   ClearPrevFenceHandles();
   214   EditReplyVector replyv;
   216   {
   217     AutoResolveRefLayers resolve(mShadowLayersManager->GetCompositionManager(this));
   218     layer_manager()->BeginTransaction();
   219   }
   221   for (EditArray::index_type i = 0; i < cset.Length(); ++i) {
   222     const Edit& edit = cset[i];
   224     switch (edit.type()) {
   225     // Create* ops
   226     case Edit::TOpCreateThebesLayer: {
   227       MOZ_LAYERS_LOG(("[ParentSide] CreateThebesLayer"));
   229       nsRefPtr<ThebesLayerComposite> layer =
   230         layer_manager()->CreateThebesLayerComposite();
   231       AsLayerComposite(edit.get_OpCreateThebesLayer())->Bind(layer);
   232       break;
   233     }
   234     case Edit::TOpCreateContainerLayer: {
   235       MOZ_LAYERS_LOG(("[ParentSide] CreateContainerLayer"));
   237       nsRefPtr<ContainerLayer> layer = layer_manager()->CreateContainerLayerComposite();
   238       AsLayerComposite(edit.get_OpCreateContainerLayer())->Bind(layer);
   239       break;
   240     }
   241     case Edit::TOpCreateImageLayer: {
   242       MOZ_LAYERS_LOG(("[ParentSide] CreateImageLayer"));
   244       nsRefPtr<ImageLayerComposite> layer =
   245         layer_manager()->CreateImageLayerComposite();
   246       AsLayerComposite(edit.get_OpCreateImageLayer())->Bind(layer);
   247       break;
   248     }
   249     case Edit::TOpCreateColorLayer: {
   250       MOZ_LAYERS_LOG(("[ParentSide] CreateColorLayer"));
   252       nsRefPtr<ColorLayerComposite> layer = layer_manager()->CreateColorLayerComposite();
   253       AsLayerComposite(edit.get_OpCreateColorLayer())->Bind(layer);
   254       break;
   255     }
   256     case Edit::TOpCreateCanvasLayer: {
   257       MOZ_LAYERS_LOG(("[ParentSide] CreateCanvasLayer"));
   259       nsRefPtr<CanvasLayerComposite> layer =
   260         layer_manager()->CreateCanvasLayerComposite();
   261       AsLayerComposite(edit.get_OpCreateCanvasLayer())->Bind(layer);
   262       break;
   263     }
   264     case Edit::TOpCreateRefLayer: {
   265       MOZ_LAYERS_LOG(("[ParentSide] CreateRefLayer"));
   267       nsRefPtr<RefLayerComposite> layer =
   268         layer_manager()->CreateRefLayerComposite();
   269       AsLayerComposite(edit.get_OpCreateRefLayer())->Bind(layer);
   270       break;
   271     }
   273     // Attributes
   274     case Edit::TOpSetLayerAttributes: {
   275       MOZ_LAYERS_LOG(("[ParentSide] SetLayerAttributes"));
   277       const OpSetLayerAttributes& osla = edit.get_OpSetLayerAttributes();
   278       ShadowLayerParent* layerParent = AsLayerComposite(osla);
   279       Layer* layer = layerParent->AsLayer();
   280       if (!layer) {
   281         return false;
   282       }
   283       const LayerAttributes& attrs = osla.attrs();
   285       const CommonLayerAttributes& common = attrs.common();
   286       layer->SetVisibleRegion(common.visibleRegion());
   287       layer->SetEventRegions(common.eventRegions());
   288       layer->SetContentFlags(common.contentFlags());
   289       layer->SetOpacity(common.opacity());
   290       layer->SetClipRect(common.useClipRect() ? &common.clipRect() : nullptr);
   291       layer->SetBaseTransform(common.transform().value());
   292       layer->SetPostScale(common.postXScale(), common.postYScale());
   293       layer->SetIsFixedPosition(common.isFixedPosition());
   294       layer->SetFixedPositionAnchor(common.fixedPositionAnchor());
   295       layer->SetFixedPositionMargins(common.fixedPositionMargin());
   296       if (common.isStickyPosition()) {
   297         layer->SetStickyPositionData(common.stickyScrollContainerId(),
   298                                      common.stickyScrollRangeOuter(),
   299                                      common.stickyScrollRangeInner());
   300       }
   301       layer->SetScrollbarData(common.scrollbarTargetContainerId(),
   302         static_cast<Layer::ScrollDirection>(common.scrollbarDirection()));
   303       if (PLayerParent* maskLayer = common.maskLayerParent()) {
   304         layer->SetMaskLayer(cast(maskLayer)->AsLayer());
   305       } else {
   306         layer->SetMaskLayer(nullptr);
   307       }
   308       layer->SetAnimations(common.animations());
   309       layer->SetInvalidRegion(common.invalidRegion());
   311       typedef SpecificLayerAttributes Specific;
   312       const SpecificLayerAttributes& specific = attrs.specific();
   313       switch (specific.type()) {
   314       case Specific::Tnull_t:
   315         break;
   317       case Specific::TThebesLayerAttributes: {
   318         MOZ_LAYERS_LOG(("[ParentSide]   thebes layer"));
   320         ThebesLayerComposite* thebesLayer = layerParent->AsThebesLayerComposite();
   321         if (!thebesLayer) {
   322           return false;
   323         }
   324         const ThebesLayerAttributes& attrs =
   325           specific.get_ThebesLayerAttributes();
   327         thebesLayer->SetValidRegion(attrs.validRegion());
   329         break;
   330       }
   331       case Specific::TContainerLayerAttributes: {
   332         MOZ_LAYERS_LOG(("[ParentSide]   container layer"));
   334         ContainerLayerComposite* containerLayer = layerParent->AsContainerLayerComposite();
   335         if (!containerLayer) {
   336           return false;
   337         }
   338         const ContainerLayerAttributes& attrs =
   339           specific.get_ContainerLayerAttributes();
   340         containerLayer->SetFrameMetrics(attrs.metrics());
   341         containerLayer->SetScrollHandoffParentId(attrs.scrollParentId());
   342         containerLayer->SetPreScale(attrs.preXScale(), attrs.preYScale());
   343         containerLayer->SetInheritedScale(attrs.inheritedXScale(), attrs.inheritedYScale());
   344         break;
   345       }
   346       case Specific::TColorLayerAttributes: {
   347         MOZ_LAYERS_LOG(("[ParentSide]   color layer"));
   349         ColorLayerComposite* colorLayer = layerParent->AsColorLayerComposite();
   350         if (!colorLayer) {
   351           return false;
   352         }
   353         colorLayer->SetColor(specific.get_ColorLayerAttributes().color().value());
   354         colorLayer->SetBounds(specific.get_ColorLayerAttributes().bounds());
   355         break;
   356       }
   357       case Specific::TCanvasLayerAttributes: {
   358         MOZ_LAYERS_LOG(("[ParentSide]   canvas layer"));
   360         CanvasLayerComposite* canvasLayer = layerParent->AsCanvasLayerComposite();
   361         if (!canvasLayer) {
   362           return false;
   363         }
   364         canvasLayer->SetFilter(specific.get_CanvasLayerAttributes().filter());
   365         canvasLayer->SetBounds(specific.get_CanvasLayerAttributes().bounds());
   366         break;
   367       }
   368       case Specific::TRefLayerAttributes: {
   369         MOZ_LAYERS_LOG(("[ParentSide]   ref layer"));
   371         RefLayerComposite* refLayer = layerParent->AsRefLayerComposite();
   372         if (!refLayer) {
   373           return false;
   374         }
   375         refLayer->SetReferentId(specific.get_RefLayerAttributes().id());
   376         break;
   377       }
   378       case Specific::TImageLayerAttributes: {
   379         MOZ_LAYERS_LOG(("[ParentSide]   image layer"));
   381         ImageLayerComposite* imageLayer = layerParent->AsImageLayerComposite();
   382         if (!imageLayer) {
   383           return false;
   384         }
   385         const ImageLayerAttributes& attrs = specific.get_ImageLayerAttributes();
   386         imageLayer->SetFilter(attrs.filter());
   387         imageLayer->SetScaleToSize(attrs.scaleToSize(), attrs.scaleMode());
   388         break;
   389       }
   390       default:
   391         NS_RUNTIMEABORT("not reached");
   392       }
   393       break;
   394     }
   395     case Edit::TOpSetDiagnosticTypes: {
   396       mLayerManager->GetCompositor()->SetDiagnosticTypes(
   397         edit.get_OpSetDiagnosticTypes().diagnostics());
   398       break;
   399     }
   400     // Tree ops
   401     case Edit::TOpSetRoot: {
   402       MOZ_LAYERS_LOG(("[ParentSide] SetRoot"));
   404       Layer* newRoot = AsLayerComposite(edit.get_OpSetRoot())->AsLayer();
   405       if (!newRoot) {
   406         return false;
   407       }
   408       if (newRoot->GetParent()) {
   409         // newRoot is not a root!
   410         return false;
   411       }
   412       mRoot = newRoot;
   413       break;
   414     }
   415     case Edit::TOpInsertAfter: {
   416       MOZ_LAYERS_LOG(("[ParentSide] InsertAfter"));
   418       const OpInsertAfter& oia = edit.get_OpInsertAfter();
   419       Layer* child = ShadowChild(oia)->AsLayer();
   420       if (!child) {
   421         return false;
   422       }
   423       ContainerLayerComposite* container = ShadowContainer(oia)->AsContainerLayerComposite();
   424       if (!container ||
   425           !container->InsertAfter(child, ShadowAfter(oia)->AsLayer()))
   426       {
   427         return false;
   428       }
   429       break;
   430     }
   431     case Edit::TOpPrependChild: {
   432       MOZ_LAYERS_LOG(("[ParentSide] PrependChild"));
   434       const OpPrependChild& oac = edit.get_OpPrependChild();
   435       Layer* child = ShadowChild(oac)->AsLayer();
   436       if (!child) {
   437         return false;
   438       }
   439       ContainerLayerComposite* container = ShadowContainer(oac)->AsContainerLayerComposite();
   440       if (!container ||
   441           !container->InsertAfter(child, nullptr))
   442       {
   443         return false;
   444       }
   445       break;
   446     }
   447     case Edit::TOpRemoveChild: {
   448       MOZ_LAYERS_LOG(("[ParentSide] RemoveChild"));
   450       const OpRemoveChild& orc = edit.get_OpRemoveChild();
   451       Layer* childLayer = ShadowChild(orc)->AsLayer();
   452       if (!childLayer) {
   453         return false;
   454       }
   455       ContainerLayerComposite* container = ShadowContainer(orc)->AsContainerLayerComposite();
   456       if (!container ||
   457           !container->RemoveChild(childLayer))
   458       {
   459         return false;
   460       }
   461       break;
   462     }
   463     case Edit::TOpRepositionChild: {
   464       MOZ_LAYERS_LOG(("[ParentSide] RepositionChild"));
   466       const OpRepositionChild& orc = edit.get_OpRepositionChild();
   467       Layer* child = ShadowChild(orc)->AsLayer();
   468       if (!child) {
   469         return false;
   470       }
   471       ContainerLayerComposite* container = ShadowContainer(orc)->AsContainerLayerComposite();
   472       if (!container ||
   473           !container->RepositionChild(child, ShadowAfter(orc)->AsLayer()))
   474       {
   475         return false;
   476       }
   477       break;
   478     }
   479     case Edit::TOpRaiseToTopChild: {
   480       MOZ_LAYERS_LOG(("[ParentSide] RaiseToTopChild"));
   482       const OpRaiseToTopChild& rtc = edit.get_OpRaiseToTopChild();
   483       Layer* child = ShadowChild(rtc)->AsLayer();
   484       if (!child) {
   485         return false;
   486       }
   487       ContainerLayerComposite* container = ShadowContainer(rtc)->AsContainerLayerComposite();
   488       if (!container ||
   489           !container->RepositionChild(child, nullptr))
   490       {
   491         return false;
   492       }
   493       break;
   494     }
   495     case Edit::TCompositableOperation: {
   496       if (!ReceiveCompositableUpdate(edit.get_CompositableOperation(),
   497                                 replyv)) {
   498         return false;
   499       }
   500       break;
   501     }
   502     case Edit::TOpAttachCompositable: {
   503       const OpAttachCompositable& op = edit.get_OpAttachCompositable();
   504       CompositableHost* host = CompositableHost::FromIPDLActor(op.compositableParent());
   505       if (!Attach(cast(op.layerParent()), host, false)) {
   506         return false;
   507       }
   508       host->SetCompositorID(mLayerManager->GetCompositor()->GetCompositorID());
   509       break;
   510     }
   511     case Edit::TOpAttachAsyncCompositable: {
   512       const OpAttachAsyncCompositable& op = edit.get_OpAttachAsyncCompositable();
   513       PCompositableParent* compositableParent = CompositableMap::Get(op.containerID());
   514       if (!compositableParent) {
   515         NS_ERROR("CompositableParent not found in the map");
   516         return false;
   517       }
   518       CompositableHost* host = CompositableHost::FromIPDLActor(compositableParent);
   519       if (!Attach(cast(op.layerParent()), host, true)) {
   520         return false;
   521       }
   523       host->SetCompositorID(mLayerManager->GetCompositor()->GetCompositorID());
   524       break;
   525     }
   526     default:
   527       NS_RUNTIMEABORT("not reached");
   528     }
   529   }
   531   {
   532     AutoResolveRefLayers resolve(mShadowLayersManager->GetCompositionManager(this));
   533     layer_manager()->EndTransaction(nullptr, nullptr, LayerManager::END_NO_IMMEDIATE_REDRAW);
   534   }
   536   if (reply) {
   537     reply->SetCapacity(replyv.size());
   538     if (replyv.size() > 0) {
   539       reply->AppendElements(&replyv.front(), replyv.size());
   540     }
   541   }
   543   // Ensure that any pending operations involving back and front
   544   // buffers have completed, so that neither process stomps on the
   545   // other's buffer contents.
   546   LayerManagerComposite::PlatformSyncBeforeReplyUpdate();
   548   mShadowLayersManager->ShadowLayersUpdated(this, targetConfig, isFirstPaint, scheduleComposite);
   550 #ifdef COMPOSITOR_PERFORMANCE_WARNING
   551   int compositeTime = (int)(mozilla::TimeStamp::Now() - updateStart).ToMilliseconds();
   552   if (compositeTime > 15) {
   553     printf_stderr("Compositor: Layers update took %i ms (blocking gecko).\n", compositeTime);
   554   }
   555 #endif
   557   return true;
   558 }
   560 bool
   561 LayerTransactionParent::RecvSetTestSampleTime(const TimeStamp& aTime)
   562 {
   563   return mShadowLayersManager->SetTestSampleTime(this, aTime);
   564 }
   566 bool
   567 LayerTransactionParent::RecvLeaveTestMode()
   568 {
   569   mShadowLayersManager->LeaveTestMode(this);
   570   return true;
   571 }
   573 bool
   574 LayerTransactionParent::RecvGetOpacity(PLayerParent* aParent,
   575                                        float* aOpacity)
   576 {
   577   if (mDestroyed || !layer_manager() || layer_manager()->IsDestroyed()) {
   578     return false;
   579   }
   581   Layer* layer = cast(aParent)->AsLayer();
   582   if (!layer) {
   583     return false;
   584   }
   586   *aOpacity = layer->GetLocalOpacity();
   587   return true;
   588 }
   590 bool
   591 LayerTransactionParent::RecvGetAnimationTransform(PLayerParent* aParent,
   592                                                   MaybeTransform* aTransform)
   593 {
   594   if (mDestroyed || !layer_manager() || layer_manager()->IsDestroyed()) {
   595     return false;
   596   }
   598   Layer* layer = cast(aParent)->AsLayer();
   599   if (!layer) {
   600     return false;
   601   }
   603   // This method is specific to transforms applied by animation.
   604   // This is because this method uses the information stored with an animation
   605   // such as the origin of the reference frame corresponding to the layer, to
   606   // recover the untranslated transform from the shadow transform. For
   607   // transforms that are not set by animation we don't have this information
   608   // available.
   609   if (!layer->AsLayerComposite()->GetShadowTransformSetByAnimation()) {
   610     *aTransform = mozilla::void_t();
   611     return true;
   612   }
   614   // The following code recovers the untranslated transform
   615   // from the shadow transform by undoing the translations in
   616   // AsyncCompositionManager::SampleValue.
   618   gfx3DMatrix transform;
   619   gfx::To3DMatrix(layer->AsLayerComposite()->GetShadowTransform(), transform);
   620   if (ContainerLayer* c = layer->AsContainerLayer()) {
   621     // Undo the scale transform applied by AsyncCompositionManager::SampleValue
   622     transform.ScalePost(1.0f/c->GetInheritedXScale(),
   623                         1.0f/c->GetInheritedYScale(),
   624                         1.0f);
   625   }
   626   float scale = 1;
   627   gfxPoint3D scaledOrigin;
   628   gfxPoint3D transformOrigin;
   629   for (uint32_t i=0; i < layer->GetAnimations().Length(); i++) {
   630     if (layer->GetAnimations()[i].data().type() == AnimationData::TTransformData) {
   631       const TransformData& data = layer->GetAnimations()[i].data().get_TransformData();
   632       scale = data.appUnitsPerDevPixel();
   633       scaledOrigin =
   634         gfxPoint3D(NS_round(NSAppUnitsToFloatPixels(data.origin().x, scale)),
   635                    NS_round(NSAppUnitsToFloatPixels(data.origin().y, scale)),
   636                    0.0f);
   637       double cssPerDev =
   638         double(nsDeviceContext::AppUnitsPerCSSPixel()) / double(scale);
   639       transformOrigin = data.transformOrigin() * cssPerDev;
   640       break;
   641     }
   642   }
   644   // Undo the translation to the origin of the reference frame applied by
   645   // AsyncCompositionManager::SampleValue
   646   transform.Translate(-scaledOrigin);
   648   // Undo the rebasing applied by
   649   // nsDisplayTransform::GetResultingTransformMatrixInternal
   650   transform = nsLayoutUtils::ChangeMatrixBasis(-scaledOrigin - transformOrigin,
   651                                                transform);
   653   // Convert to CSS pixels (this undoes the operations performed by
   654   // nsStyleTransformMatrix::ProcessTranslatePart which is called from
   655   // nsDisplayTransform::GetResultingTransformMatrix)
   656   double devPerCss =
   657     double(scale) / double(nsDeviceContext::AppUnitsPerCSSPixel());
   658   transform._41 *= devPerCss;
   659   transform._42 *= devPerCss;
   660   transform._43 *= devPerCss;
   662   *aTransform = transform;
   663   return true;
   664 }
   666 bool
   667 LayerTransactionParent::RecvSetAsyncScrollOffset(PLayerParent* aLayer,
   668                                                  const int32_t& aX, const int32_t& aY)
   669 {
   670   if (mDestroyed || !layer_manager() || layer_manager()->IsDestroyed()) {
   671     return false;
   672   }
   674   Layer* layer = cast(aLayer)->AsLayer();
   675   if (!layer) {
   676     return false;
   677   }
   678   ContainerLayer* containerLayer = layer->AsContainerLayer();
   679   if (!containerLayer) {
   680     return false;
   681   }
   682   AsyncPanZoomController* controller = containerLayer->GetAsyncPanZoomController();
   683   if (!controller) {
   684     return false;
   685   }
   686   controller->SetTestAsyncScrollOffset(CSSPoint(aX, aY));
   687   return true;
   688 }
   690 bool
   691 LayerTransactionParent::Attach(ShadowLayerParent* aLayerParent,
   692                                CompositableHost* aCompositable,
   693                                bool aIsAsync)
   694 {
   695   if (!aCompositable) {
   696     return false;
   697   }
   699   Layer* baselayer = aLayerParent->AsLayer();
   700   if (!baselayer) {
   701     return false;
   702   }
   703   LayerComposite* layer = baselayer->AsLayerComposite();
   704   if (!layer) {
   705     return false;
   706   }
   708   Compositor* compositor
   709     = static_cast<LayerManagerComposite*>(aLayerParent->AsLayer()->Manager())->GetCompositor();
   711   if (!layer->SetCompositableHost(aCompositable)) {
   712     // not all layer types accept a compositable, see bug 967824
   713     return false;
   714   }
   715   aCompositable->Attach(aLayerParent->AsLayer(),
   716                         compositor,
   717                         aIsAsync
   718                           ? CompositableHost::ALLOW_REATTACH
   719                             | CompositableHost::KEEP_ATTACHED
   720                           : CompositableHost::NO_FLAGS);
   721   return true;
   722 }
   724 bool
   725 LayerTransactionParent::RecvClearCachedResources()
   726 {
   727   if (mRoot) {
   728     // NB: |mRoot| here is the *child* context's root.  In this parent
   729     // context, it's just a subtree root.  We need to scope the clear
   730     // of resources to exactly that subtree, so we specify it here.
   731     mLayerManager->ClearCachedResources(mRoot);
   732   }
   733   return true;
   734 }
   736 bool
   737 LayerTransactionParent::RecvForceComposite()
   738 {
   739   mShadowLayersManager->ForceComposite(this);
   740   return true;
   741 }
   744 PGrallocBufferParent*
   745 LayerTransactionParent::AllocPGrallocBufferParent(const IntSize& aSize,
   746                                                   const uint32_t& aFormat,
   747                                                   const uint32_t& aUsage,
   748                                                   MaybeMagicGrallocBufferHandle* aOutHandle)
   749 {
   750 #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
   751   return GrallocBufferActor::Create(aSize, aFormat, aUsage, aOutHandle);
   752 #else
   753   NS_RUNTIMEABORT("No gralloc buffers for you");
   754   return nullptr;
   755 #endif
   756 }
   758 bool
   759 LayerTransactionParent::DeallocPGrallocBufferParent(PGrallocBufferParent* actor)
   760 {
   761 #ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
   762   delete actor;
   763   return true;
   764 #else
   765   NS_RUNTIMEABORT("Um, how did we get here?");
   766   return false;
   767 #endif
   768 }
   770 PLayerParent*
   771 LayerTransactionParent::AllocPLayerParent()
   772 {
   773   return new ShadowLayerParent();
   774 }
   776 bool
   777 LayerTransactionParent::DeallocPLayerParent(PLayerParent* actor)
   778 {
   779   delete actor;
   780   return true;
   781 }
   783 PCompositableParent*
   784 LayerTransactionParent::AllocPCompositableParent(const TextureInfo& aInfo)
   785 {
   786   return CompositableHost::CreateIPDLActor(this, aInfo, 0);
   787 }
   789 bool
   790 LayerTransactionParent::DeallocPCompositableParent(PCompositableParent* aActor)
   791 {
   792   return CompositableHost::DestroyIPDLActor(aActor);
   793 }
   795 PTextureParent*
   796 LayerTransactionParent::AllocPTextureParent(const SurfaceDescriptor& aSharedData,
   797                                             const TextureFlags& aFlags)
   798 {
   799   return TextureHost::CreateIPDLActor(this, aSharedData, aFlags);
   800 }
   802 bool
   803 LayerTransactionParent::DeallocPTextureParent(PTextureParent* actor)
   804 {
   805   return TextureHost::DestroyIPDLActor(actor);
   806 }
   808 bool LayerTransactionParent::IsSameProcess() const
   809 {
   810   return OtherProcess() == ipc::kInvalidProcessHandle;
   811 }
   813 } // namespace layers
   814 } // namespace mozilla

mercurial