Bug 1438631. Use a similar drawtarget when painting masks. r=mstange draft
authorJeff Muizelaar <jmuizelaar@mozilla.com>
Thu, 15 Feb 2018 14:43:52 -0500
changeset 756185 dfc6a03b066fe22aea5ba46a1013078383e26a07
parent 755918 0db116b21ac09675a37a4904fa75777b6bc19b3d
push id99411
push userbmo:jmuizelaar@mozilla.com
push dateFri, 16 Feb 2018 15:30:14 +0000
reviewersmstange
bugs1438631
milestone60.0a1
Bug 1438631. Use a similar drawtarget when painting masks. r=mstange Avoiding an offscreen drawtarget will avoid using Direct2D with webrender, let us record the masking operation, and also give us OMTP.
gfx/2d/RecordedEvent.h
gfx/2d/RecordedEventImpl.h
layout/svg/nsSVGMaskFrame.cpp
--- a/gfx/2d/RecordedEvent.h
+++ b/gfx/2d/RecordedEvent.h
@@ -254,16 +254,17 @@ public:
     CREATESIMILARDRAWTARGET,
     CREATECLIPPEDDRAWTARGET,
     FONTDATA,
     FONTDESC,
     PUSHLAYER,
     POPLAYER,
     UNSCALEDFONTCREATION,
     UNSCALEDFONTDESTRUCTION,
+    INTOLUMINANCE,
   };
   static const uint32_t kTotalEventTypes = RecordedEvent::FILTERNODESETINPUT + 1;
 
   virtual ~RecordedEvent() {}
 
   static std::string GetEventName(EventType aType);
 
   /**
--- a/gfx/2d/RecordedEventImpl.h
+++ b/gfx/2d/RecordedEventImpl.h
@@ -900,17 +900,17 @@ private:
   template<class S>
   MOZ_IMPLICIT RecordedSnapshot(S &aStream);
 };
 
 class RecordedIntoLuminanceSource : public RecordedEventDerived<RecordedIntoLuminanceSource> {
 public:
   RecordedIntoLuminanceSource(ReferencePtr aRefPtr, DrawTarget *aDT,
                               LuminanceType aLuminanceType, float aOpacity)
-    : RecordedEventDerived(SNAPSHOT), mRefPtr(aRefPtr), mDT(aDT),
+    : RecordedEventDerived(INTOLUMINANCE), mRefPtr(aRefPtr), mDT(aDT),
       mLuminanceType(aLuminanceType), mOpacity(aOpacity)
   {
   }
 
   virtual bool PlayEvent(Translator *aTranslator) const override;
 
   template<class S> void Record(S &aStream) const;
   virtual void OutputSimpleEventInfo(std::stringstream &aStringStream) const override;
@@ -2795,17 +2795,17 @@ RecordedIntoLuminanceSource::Record(S &a
   WriteElement(aStream, mRefPtr);
   WriteElement(aStream, mDT);
   WriteElement(aStream, mLuminanceType);
   WriteElement(aStream, mOpacity);
 }
 
 template<class S>
 RecordedIntoLuminanceSource::RecordedIntoLuminanceSource(S &aStream)
-  : RecordedEventDerived(SNAPSHOT)
+  : RecordedEventDerived(INTOLUMINANCE)
 {
   ReadElement(aStream, mRefPtr);
   ReadElement(aStream, mDT);
   ReadElement(aStream, mLuminanceType);
   ReadElement(aStream, mOpacity);
 }
 
 inline void
@@ -3408,17 +3408,18 @@ RecordedFilterNodeSetInput::OutputSimple
     f(FILTERNODESETINPUT, RecordedFilterNodeSetInput); \
     f(CREATESIMILARDRAWTARGET, RecordedCreateSimilarDrawTarget); \
     f(CREATECLIPPEDDRAWTARGET, RecordedCreateClippedDrawTarget); \
     f(FONTDATA, RecordedFontData); \
     f(FONTDESC, RecordedFontDescriptor); \
     f(PUSHLAYER, RecordedPushLayer); \
     f(POPLAYER, RecordedPopLayer); \
     f(UNSCALEDFONTCREATION, RecordedUnscaledFontCreation); \
-    f(UNSCALEDFONTDESTRUCTION, RecordedUnscaledFontDestruction);
+    f(UNSCALEDFONTDESTRUCTION, RecordedUnscaledFontDestruction); \
+    f(INTOLUMINANCE, RecordedIntoLuminanceSource);
 
 template<class S>
 RecordedEvent *
 RecordedEvent::LoadEvent(S &aStream, EventType aType)
 {
   switch (aType) {
     FOR_EACH_EVENT(LOAD_EVENT_TYPE)
   default:
--- a/layout/svg/nsSVGMaskFrame.cpp
+++ b/layout/svg/nsSVGMaskFrame.cpp
@@ -83,20 +83,20 @@ nsSVGMaskFrame::GetMaskForMaskedFrame(Ma
     maskType = StyleSVGReset()->mMaskType;
   } else {
     maskType = aParams.maskMode == NS_STYLE_MASK_MODE_LUMINANCE
                ? NS_STYLE_MASK_TYPE_LUMINANCE : NS_STYLE_MASK_TYPE_ALPHA;
   }
 
   RefPtr<DrawTarget> maskDT;
   if (maskType == NS_STYLE_MASK_TYPE_LUMINANCE) {
-    maskDT = gfxPlatform::GetPlatform()->CreateOffscreenContentDrawTarget(
+    maskDT = context->GetDrawTarget()->CreateSimilarDrawTarget(
                maskSurfaceSize, SurfaceFormat::B8G8R8A8);
   } else {
-    maskDT = gfxPlatform::GetPlatform()->CreateOffscreenContentDrawTarget(
+    maskDT = context->GetDrawTarget()->CreateSimilarDrawTarget(
                maskSurfaceSize, SurfaceFormat::A8);
   }
 
   if (!maskDT || !maskDT->IsValid()) {
     return nullptr;
   }
 
   Matrix maskSurfaceMatrix =