Bug 1341156 - Allow WebRenderBorderLayer send ImageContainer. r=nical draft
authorMorris Tseng <mtseng@mozilla.com>
Thu, 23 Feb 2017 16:51:54 +0800
changeset 490712 2f84c893866133e4d4214b04242ee5ae6dccb2fe
parent 490711 bd9daf63fe5f8704fc52410eadf94c2995af1c79
child 490713 ecba8e80babfdcdd6f2e262c2d08c9ce2f886464
push id47204
push userbmo:mtseng@mozilla.com
push dateWed, 01 Mar 2017 07:32:07 +0000
reviewersnical
bugs1341156
milestone54.0a1
Bug 1341156 - Allow WebRenderBorderLayer send ImageContainer. r=nical MozReview-Commit-ID: Bx0Y5tjlCcE
gfx/layers/wr/WebRenderBorderLayer.cpp
gfx/layers/wr/WebRenderBorderLayer.h
--- a/gfx/layers/wr/WebRenderBorderLayer.cpp
+++ b/gfx/layers/wr/WebRenderBorderLayer.cpp
@@ -4,16 +4,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "WebRenderBorderLayer.h"
 
 #include "gfxPrefs.h"
 #include "LayersLogging.h"
 #include "mozilla/gfx/Rect.h"
 #include "mozilla/webrender/webrender_ffi.h"
+#include "mozilla/layers/ImageClient.h"
 #include "mozilla/layers/WebRenderBridgeChild.h"
 #include "mozilla/webrender/WebRenderTypes.h"
 
 namespace mozilla {
 namespace layers {
 
 using namespace mozilla::gfx;
 
@@ -70,10 +71,45 @@ WebRenderBorderLayer::RenderLayer()
                      wr::ToWrBorderSide(mColors[0], mBorderStyles[0]),
                      wr::ToWrBorderSide(mColors[1], mBorderStyles[1]),
                      wr::ToWrBorderSide(mColors[2], mBorderStyles[2]),
                      wr::ToWrBorderSide(mColors[3], mBorderStyles[3]),
                      wr::ToWrBorderRadius(mCorners[0], mCorners[1], mCorners[3], mCorners[2]))));
   WrBridge()->AddWebRenderCommand(OpDPPopStackingContext());
 }
 
+uint64_t
+WebRenderBorderLayer::SendImageContainer(ImageContainer* aContainer)
+{
+  if (mImageContainer != aContainer) {
+    AutoLockImage autoLock(aContainer);
+    Image* image = autoLock.GetImage();
+    if (!image) {
+      return 0;
+    }
+
+    if (!mImageClient) {
+      mImageClient = ImageClient::CreateImageClient(CompositableType::IMAGE,
+                                                    WrBridge(),
+                                                    TextureFlags::DEFAULT);
+      if (!mImageClient) {
+        return 0;
+      }
+      mImageClient->Connect();
+    }
+
+    if (!mExternalImageId) {
+      MOZ_ASSERT(mImageClient);
+      mExternalImageId = WrBridge()->AllocExternalImageIdForCompositable(mImageClient);
+    }
+    MOZ_ASSERT(mExternalImageId);
+
+    if (mImageClient && !mImageClient->UpdateImage(aContainer, /* unused */0)) {
+      return 0;
+    }
+    mImageContainer = aContainer;
+  }
+
+  return mExternalImageId;
+}
+
 } // namespace layers
 } // namespace mozilla
--- a/gfx/layers/wr/WebRenderBorderLayer.h
+++ b/gfx/layers/wr/WebRenderBorderLayer.h
@@ -12,27 +12,37 @@
 namespace mozilla {
 namespace layers {
 
 class WebRenderBorderLayer : public WebRenderLayer,
                              public BorderLayer {
 public:
   explicit WebRenderBorderLayer(WebRenderLayerManager* aLayerManager)
     : BorderLayer(aLayerManager, static_cast<WebRenderLayer*>(this))
+    , mImageClient(nullptr)
+    , mImageContainer(nullptr)
+    , mExternalImageId(0)
   {
     MOZ_COUNT_CTOR(WebRenderBorderLayer);
   }
 
 protected:
   virtual ~WebRenderBorderLayer()
   {
     MOZ_COUNT_DTOR(WebRenderBorderLayer);
   }
 
 public:
   Layer* GetLayer() override { return this; }
   void RenderLayer() override;
+
+  uint64_t SendImageContainer(ImageContainer* aContainer);
+
+protected:
+  RefPtr<ImageClient> mImageClient;
+  RefPtr<ImageContainer> mImageContainer;
+  uint64_t mExternalImageId;
 };
 
 } // namespace layers
 } // namespace mozilla
 
 #endif // GFX_WEBRENDERBORDERLAYER_H