Bug 1339683 - Supporting send ImageContainer in the DisplayItemLayer. r=mchang r=nical
Allow to create an ImageClient for ImageContainer and send this
ImageClient to WebRender for rendering.
MozReview-Commit-ID: K14sCeAHJmD
--- a/gfx/layers/wr/WebRenderDisplayItemLayer.cpp
+++ b/gfx/layers/wr/WebRenderDisplayItemLayer.cpp
@@ -24,10 +24,45 @@ WebRenderDisplayItemLayer::RenderLayer()
mItem->CreateWebRenderCommands(mCommands, this);
}
// else we have an empty transaction and just use the
// old commands.
WrBridge()->AddWebRenderCommands(mCommands);
}
+uint64_t
+WebRenderDisplayItemLayer::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/WebRenderDisplayItemLayer.h
+++ b/gfx/layers/wr/WebRenderDisplayItemLayer.h
@@ -3,41 +3,49 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef GFX_WEBRENDERDISPLAYITEMLAYER_H
#define GFX_WEBRENDERDISPLAYITEMLAYER_H
#include "Layers.h"
#include "WebRenderLayerManager.h"
+#include "mozilla/layers/ImageClient.h"
#include "mozilla/layers/PWebRenderBridgeChild.h"
namespace mozilla {
namespace layers {
class WebRenderDisplayItemLayer : public WebRenderLayer,
public DisplayItemLayer {
public:
explicit WebRenderDisplayItemLayer(WebRenderLayerManager* aLayerManager)
: DisplayItemLayer(aLayerManager, static_cast<WebRenderLayer*>(this))
+ , mExternalImageId(0)
{
MOZ_COUNT_CTOR(WebRenderDisplayItemLayer);
}
+ uint64_t SendImageContainer(ImageContainer* aContainer);
+
protected:
virtual ~WebRenderDisplayItemLayer()
{
mCommands.Clear();
MOZ_COUNT_DTOR(WebRenderDisplayItemLayer);
}
public:
Layer* GetLayer() override { return this; }
void RenderLayer() override;
private:
nsTArray<WebRenderCommand> mCommands;
+ RefPtr<ImageClient> mImageClient;
+ RefPtr<ImageContainer> mImageContainer;
+ uint64_t mExternalImageId;
+
};
} // namespace layers
} // namespace mozilla
#endif // GFX_WEBRENDERDisplayItemLayer_H
\ No newline at end of file