Bug 1341156 - Allow WebRenderBorderLayer send ImageContainer. r=nical
MozReview-Commit-ID: Bx0Y5tjlCcE
--- 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