Bug 1898142 - Deliver image usage type to WebRenderImageHost r=gfx-reviewers,lsalzman

Adds ImageUsageType to ImageClient and ImageContainer to identify user of Image at WebRenderImageHost.

Some ImageContainers are used only for allocating Image. Only following types calls ImageContainer::SetCurrentImages().
- ImageUsageType::Canvas
- ImageUsageType::OffscreenCanvas
- ImageUsageType::VideoFrameContainer

Differential Revision: https://phabricator.services.mozilla.com/D211147
This commit is contained in:
sotaro
2024-05-22 23:03:22 +00:00
parent 9b59018fd8
commit 1f80fb5b98
20 changed files with 103 additions and 49 deletions

View File

@@ -92,7 +92,9 @@ void OffscreenCanvasDisplayHelper::UpdateContext(
OffscreenCanvas* aOffscreenCanvas, RefPtr<ThreadSafeWorkerRef>&& aWorkerRef, OffscreenCanvas* aOffscreenCanvas, RefPtr<ThreadSafeWorkerRef>&& aWorkerRef,
CanvasContextType aType, const Maybe<int32_t>& aChildId) { CanvasContextType aType, const Maybe<int32_t>& aChildId) {
RefPtr<layers::ImageContainer> imageContainer = RefPtr<layers::ImageContainer> imageContainer =
MakeRefPtr<layers::ImageContainer>(layers::ImageContainer::ASYNCHRONOUS); MakeRefPtr<layers::ImageContainer>(
layers::ImageUsageType::OffscreenCanvas,
layers::ImageContainer::ASYNCHRONOUS);
MutexAutoLock lock(mMutex); MutexAutoLock lock(mMutex);

View File

@@ -6278,7 +6278,8 @@ VideoFrameContainer* HTMLMediaElement::GetVideoFrameContainer() {
} }
mVideoFrameContainer = new VideoFrameContainer( mVideoFrameContainer = new VideoFrameContainer(
this, MakeAndAddRef<ImageContainer>(ImageContainer::ASYNCHRONOUS)); this, MakeAndAddRef<ImageContainer>(ImageUsageType::VideoFrameContainer,
ImageContainer::ASYNCHRONOUS));
return mVideoFrameContainer; return mVideoFrameContainer;
} }

View File

@@ -44,8 +44,8 @@ void VideoFrame::TakeFrom(VideoFrame* aFrame) {
/* static */ /* static */
already_AddRefed<Image> VideoFrame::CreateBlackImage( already_AddRefed<Image> VideoFrame::CreateBlackImage(
const gfx::IntSize& aSize) { const gfx::IntSize& aSize) {
RefPtr<ImageContainer> container = RefPtr<ImageContainer> container = MakeAndAddRef<ImageContainer>(
MakeAndAddRef<ImageContainer>(ImageContainer::ASYNCHRONOUS); ImageUsageType::BlackImage, ImageContainer::ASYNCHRONOUS);
RefPtr<PlanarYCbCrImage> image = container->CreatePlanarYCbCrImage(); RefPtr<PlanarYCbCrImage> image = container->CreatePlanarYCbCrImage();
if (!image) { if (!image) {
return nullptr; return nullptr;

View File

@@ -152,7 +152,9 @@ RemoteVideoDecoderParent::RemoteVideoDecoderParent(
IPCResult RemoteVideoDecoderParent::RecvConstruct( IPCResult RemoteVideoDecoderParent::RecvConstruct(
ConstructResolver&& aResolver) { ConstructResolver&& aResolver) {
auto imageContainer = MakeRefPtr<layers::ImageContainer>(); auto imageContainer = MakeRefPtr<layers::ImageContainer>(
layers::ImageUsageType::RemoteVideoDecoder,
layers::ImageContainer::SYNCHRONOUS);
if (mKnowsCompositor && XRE_IsRDDProcess()) { if (mKnowsCompositor && XRE_IsRDDProcess()) {
// Ensure to allocate recycle allocator // Ensure to allocate recycle allocator
imageContainer->EnsureRecycleAllocatorForRDD(mKnowsCompositor); imageContainer->EnsureRecycleAllocatorForRDD(mKnowsCompositor);

View File

@@ -51,6 +51,7 @@ DecoderAgent::DecoderAgent(Id aId, UniquePtr<TrackInfo>&& aInfo)
mOwnerThread(GetCurrentSerialEventTarget()), mOwnerThread(GetCurrentSerialEventTarget()),
mPDMFactory(MakeRefPtr<PDMFactory>()), mPDMFactory(MakeRefPtr<PDMFactory>()),
mImageContainer(MakeAndAddRef<layers::ImageContainer>( mImageContainer(MakeAndAddRef<layers::ImageContainer>(
layers::ImageUsageType::WebCodecs,
layers::ImageContainer::ASYNCHRONOUS)), layers::ImageContainer::ASYNCHRONOUS)),
mDecoder(nullptr), mDecoder(nullptr),
mState(State::Unconfigured) { mState(State::Unconfigured) {

View File

@@ -299,7 +299,7 @@ nsresult MediaEngineFakeVideoSource::Start() {
if (!mImageContainer) { if (!mImageContainer) {
mImageContainer = MakeAndAddRef<layers::ImageContainer>( mImageContainer = MakeAndAddRef<layers::ImageContainer>(
layers::ImageContainer::ASYNCHRONOUS); layers::ImageUsageType::Webrtc, layers::ImageContainer::ASYNCHRONOUS);
} }
// Start timer for subsequent frames // Start timer for subsequent frames

View File

@@ -202,7 +202,7 @@ void MediaEngineRemoteVideoSource::SetTrack(const RefPtr<MediaTrack>& aTrack,
if (!mImageContainer) { if (!mImageContainer) {
mImageContainer = MakeAndAddRef<layers::ImageContainer>( mImageContainer = MakeAndAddRef<layers::ImageContainer>(
layers::ImageContainer::ASYNCHRONOUS); layers::ImageUsageType::Webrtc, layers::ImageContainer::ASYNCHRONOUS);
} }
{ {

View File

@@ -20,6 +20,7 @@ WebrtcMediaDataDecoder::WebrtcMediaDataDecoder(nsACString& aCodecMimeType,
mTaskQueue(TaskQueue::Create(do_AddRef(mThreadPool), mTaskQueue(TaskQueue::Create(do_AddRef(mThreadPool),
"WebrtcMediaDataDecoder::mTaskQueue")), "WebrtcMediaDataDecoder::mTaskQueue")),
mImageContainer(MakeAndAddRef<layers::ImageContainer>( mImageContainer(MakeAndAddRef<layers::ImageContainer>(
layers::ImageUsageType::Webrtc,
layers::ImageContainer::ASYNCHRONOUS)), layers::ImageContainer::ASYNCHRONOUS)),
mFactory(new PDMFactory()), mFactory(new PDMFactory()),
mTrackType(TrackInfo::kUndefinedTrack), mTrackType(TrackInfo::kUndefinedTrack),

View File

@@ -1398,8 +1398,8 @@ class MediaPipelineReceiveVideo::PipelineListener
PipelineListener(RefPtr<SourceMediaTrack> aSource, TrackingId aTrackingId, PipelineListener(RefPtr<SourceMediaTrack> aSource, TrackingId aTrackingId,
PrincipalHandle aPrincipalHandle, PrincipalPrivacy aPrivacy) PrincipalHandle aPrincipalHandle, PrincipalPrivacy aPrivacy)
: GenericReceiveListener(std::move(aSource), std::move(aTrackingId)), : GenericReceiveListener(std::move(aSource), std::move(aTrackingId)),
mImageContainer( mImageContainer(MakeAndAddRef<ImageContainer>(
MakeAndAddRef<ImageContainer>(ImageContainer::ASYNCHRONOUS)), ImageUsageType::Webrtc, ImageContainer::ASYNCHRONOUS)),
mMutex("MediaPipelineReceiveVideo::PipelineListener::mMutex"), mMutex("MediaPipelineReceiveVideo::PipelineListener::mMutex"),
mPrincipalHandle(std::move(aPrincipalHandle)), mPrincipalHandle(std::move(aPrincipalHandle)),
mPrivacy(aPrivacy) {} mPrivacy(aPrivacy) {}

View File

@@ -148,6 +148,20 @@ enum class CompositableType : uint8_t {
COUNT COUNT
}; };
enum class ImageUsageType : uint8_t {
UNKNOWN,
WebRenderImageData,
WebRenderFallbackData,
Canvas,
OffscreenCanvas,
VideoFrameContainer,
RemoteVideoDecoder,
BlackImage,
Webrtc,
WebCodecs,
COUNT
};
/** /**
* Sent from the compositor to the content-side LayerManager, includes * Sent from the compositor to the content-side LayerManager, includes
* properties of the compositor and should (in the future) include information * properties of the compositor and should (in the future) include information
@@ -223,15 +237,19 @@ struct TextureFactoryIdentifier {
*/ */
struct TextureInfo { struct TextureInfo {
CompositableType mCompositableType; CompositableType mCompositableType;
ImageUsageType mUsageType;
TextureFlags mTextureFlags; TextureFlags mTextureFlags;
TextureInfo() TextureInfo()
: mCompositableType(CompositableType::UNKNOWN), : mCompositableType(CompositableType::UNKNOWN),
mUsageType(ImageUsageType::UNKNOWN),
mTextureFlags(TextureFlags::NO_FLAGS) {} mTextureFlags(TextureFlags::NO_FLAGS) {}
explicit TextureInfo(CompositableType aType, TextureInfo(CompositableType aType, ImageUsageType aUsageType,
TextureFlags aTextureFlags = TextureFlags::DEFAULT) TextureFlags aTextureFlags)
: mCompositableType(aType), mTextureFlags(aTextureFlags) {} : mCompositableType(aType),
mUsageType(aUsageType),
mTextureFlags(aTextureFlags) {}
bool operator==(const TextureInfo& aOther) const { bool operator==(const TextureInfo& aOther) const {
return mCompositableType == aOther.mCompositableType && return mCompositableType == aOther.mCompositableType &&

View File

@@ -163,30 +163,32 @@ void ImageContainer::EnsureImageClient() {
} }
RefPtr<ImageBridgeChild> imageBridge = ImageBridgeChild::GetSingleton(); RefPtr<ImageBridgeChild> imageBridge = ImageBridgeChild::GetSingleton();
if (imageBridge) { if (!imageBridge) {
mImageClient = return;
imageBridge->CreateImageClient(CompositableType::IMAGE, this); }
if (mImageClient) {
mAsyncContainerHandle = mImageClient->GetAsyncHandle(); mImageClient = imageBridge->CreateImageClient(CompositableType::IMAGE, this);
} else { if (mImageClient) {
// It's okay to drop the async container handle since the ImageBridgeChild mAsyncContainerHandle = mImageClient->GetAsyncHandle();
// is going to die anyway. } else {
mAsyncContainerHandle = CompositableHandle(); // It's okay to drop the async container handle since the ImageBridgeChild
} // is going to die anyway.
mAsyncContainerHandle = CompositableHandle();
} }
} }
ImageContainer::ImageContainer(Mode flag) ImageContainer::ImageContainer(ImageUsageType aUsageType, Mode aFlag)
: mRecursiveMutex("ImageContainer.mRecursiveMutex"), : mUsageType(aUsageType),
mIsAsync(aFlag == ASYNCHRONOUS),
mRecursiveMutex("ImageContainer.mRecursiveMutex"),
mGenerationCounter(++sGenerationCounter), mGenerationCounter(++sGenerationCounter),
mPaintCount(0), mPaintCount(0),
mDroppedImageCount(0), mDroppedImageCount(0),
mImageFactory(new ImageFactory()), mImageFactory(new ImageFactory()),
mRotation(VideoRotation::kDegree_0), mRotation(VideoRotation::kDegree_0),
mRecycleBin(new BufferRecycleBin()), mRecycleBin(new BufferRecycleBin()),
mIsAsync(flag == ASYNCHRONOUS),
mCurrentProducerID(-1) { mCurrentProducerID(-1) {
if (flag == ASYNCHRONOUS) { if (aFlag == ASYNCHRONOUS) {
mNotifyCompositeListener = new ImageContainerListener(this); mNotifyCompositeListener = new ImageContainerListener(this);
EnsureImageClient(); EnsureImageClient();
} }
@@ -350,6 +352,10 @@ void ImageContainer::ClearImagesFromImageBridge() {
void ImageContainer::SetCurrentImages(const nsTArray<NonOwningImage>& aImages) { void ImageContainer::SetCurrentImages(const nsTArray<NonOwningImage>& aImages) {
AUTO_PROFILER_LABEL("ImageContainer::SetCurrentImages", GRAPHICS); AUTO_PROFILER_LABEL("ImageContainer::SetCurrentImages", GRAPHICS);
MOZ_ASSERT(!aImages.IsEmpty()); MOZ_ASSERT(!aImages.IsEmpty());
MOZ_ASSERT(mUsageType == ImageUsageType::Canvas ||
mUsageType == ImageUsageType::OffscreenCanvas ||
mUsageType == ImageUsageType::VideoFrameContainer);
RecursiveMutexAutoLock lock(mRecursiveMutex); RecursiveMutexAutoLock lock(mRecursiveMutex);
if (mIsAsync) { if (mIsAsync) {
if (RefPtr<ImageBridgeChild> imageBridge = if (RefPtr<ImageBridgeChild> imageBridge =
@@ -399,6 +405,9 @@ void ImageContainer::SetCurrentImageInTransaction(Image* aImage) {
void ImageContainer::SetCurrentImagesInTransaction( void ImageContainer::SetCurrentImagesInTransaction(
const nsTArray<NonOwningImage>& aImages) { const nsTArray<NonOwningImage>& aImages) {
MOZ_ASSERT(!mIsAsync);
MOZ_ASSERT(mUsageType == ImageUsageType::WebRenderFallbackData);
NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
NS_ASSERTION(!HasImageClient(), NS_ASSERTION(!HasImageClient(),
"Should use async image transfer with ImageBridge."); "Should use async image transfer with ImageBridge.");

View File

@@ -324,7 +324,7 @@ class ImageContainer final : public SupportsThreadSafeWeakPtr<ImageContainer> {
static const uint64_t sInvalidAsyncContainerId = 0; static const uint64_t sInvalidAsyncContainerId = 0;
explicit ImageContainer(ImageContainer::Mode flag = SYNCHRONOUS); ImageContainer(ImageUsageType aUsageType, ImageContainer::Mode aFlag);
~ImageContainer(); ~ImageContainer();
@@ -579,6 +579,9 @@ class ImageContainer final : public SupportsThreadSafeWeakPtr<ImageContainer> {
void DropImageClient(); void DropImageClient();
const ImageUsageType mUsageType;
const bool mIsAsync;
private: private:
typedef mozilla::RecursiveMutex RecursiveMutex; typedef mozilla::RecursiveMutex RecursiveMutex;
@@ -655,7 +658,6 @@ class ImageContainer final : public SupportsThreadSafeWeakPtr<ImageContainer> {
// than asynchronusly using the ImageBridge IPDL protocol. // than asynchronusly using the ImageBridge IPDL protocol.
RefPtr<ImageClient> mImageClient MOZ_GUARDED_BY(mRecursiveMutex); RefPtr<ImageClient> mImageClient MOZ_GUARDED_BY(mRecursiveMutex);
const bool mIsAsync;
CompositableHandle mAsyncContainerHandle MOZ_GUARDED_BY(mRecursiveMutex); CompositableHandle mAsyncContainerHandle MOZ_GUARDED_BY(mRecursiveMutex);
// ProducerID for last current image(s) // ProducerID for last current image(s)

View File

@@ -54,7 +54,8 @@ class CanvasClient final : public CompositableClient {
} }
TextureInfo GetTextureInfo() const override { TextureInfo GetTextureInfo() const override {
return TextureInfo(CompositableType::IMAGE, mTextureFlags); return TextureInfo(CompositableType::IMAGE, ImageUsageType::Canvas,
mTextureFlags);
} }
void OnDetach() override { Clear(); } void OnDetach() override { Clear(); }

View File

@@ -40,13 +40,13 @@ using namespace mozilla::gfx;
/* static */ /* static */
already_AddRefed<ImageClient> ImageClient::CreateImageClient( already_AddRefed<ImageClient> ImageClient::CreateImageClient(
CompositableType aCompositableHostType, CompositableForwarder* aForwarder, CompositableType aCompositableHostType, ImageUsageType aUsageType,
TextureFlags aFlags) { CompositableForwarder* aForwarder, TextureFlags aFlags) {
RefPtr<ImageClient> result = nullptr; RefPtr<ImageClient> result = nullptr;
switch (aCompositableHostType) { switch (aCompositableHostType) {
case CompositableType::IMAGE: case CompositableType::IMAGE:
result = result = new ImageClientSingle(aForwarder, aFlags,
new ImageClientSingle(aForwarder, aFlags, CompositableType::IMAGE); CompositableType::IMAGE, aUsageType);
break; break;
case CompositableType::UNKNOWN: case CompositableType::UNKNOWN:
result = nullptr; result = nullptr;
@@ -66,11 +66,13 @@ void ImageClient::RemoveTexture(TextureClient* aTexture) {
ImageClientSingle::ImageClientSingle(CompositableForwarder* aFwd, ImageClientSingle::ImageClientSingle(CompositableForwarder* aFwd,
TextureFlags aFlags, TextureFlags aFlags,
CompositableType aType) CompositableType aType,
: ImageClient(aFwd, aFlags, aType) {} ImageUsageType aUsageType)
: ImageClient(aFwd, aFlags, aType, aUsageType) {}
TextureInfo ImageClientSingle::GetTextureInfo() const { TextureInfo ImageClientSingle::GetTextureInfo() const {
return TextureInfo(CompositableType::IMAGE); return TextureInfo(CompositableType::IMAGE, mUsageType,
TextureFlags::DEFAULT);
} }
void ImageClientSingle::FlushAllImages() { void ImageClientSingle::FlushAllImages() {
@@ -270,9 +272,10 @@ bool ImageClientSingle::AddTextureClient(TextureClient* aTexture) {
void ImageClientSingle::OnDetach() { mBuffers.Clear(); } void ImageClientSingle::OnDetach() { mBuffers.Clear(); }
ImageClient::ImageClient(CompositableForwarder* aFwd, TextureFlags aFlags, ImageClient::ImageClient(CompositableForwarder* aFwd, TextureFlags aFlags,
CompositableType aType) CompositableType aType, ImageUsageType aUsageType)
: CompositableClient(aFwd, aFlags), : CompositableClient(aFwd, aFlags),
mType(aType), mType(aType),
mUsageType(aUsageType),
mLastUpdateGenerationCounter(0) {} mLastUpdateGenerationCounter(0) {}
} // namespace layers } // namespace layers

View File

@@ -41,8 +41,8 @@ class ImageClient : public CompositableClient {
* host. * host.
*/ */
static already_AddRefed<ImageClient> CreateImageClient( static already_AddRefed<ImageClient> CreateImageClient(
CompositableType aImageHostType, CompositableForwarder* aFwd, CompositableType aImageHostType, ImageUsageType aUsageType,
TextureFlags aFlags); CompositableForwarder* aFwd, TextureFlags aFlags);
virtual ~ImageClient() = default; virtual ~ImageClient() = default;
@@ -72,11 +72,13 @@ class ImageClient : public CompositableClient {
virtual RefPtr<TextureClient> GetForwardedTexture() { return nullptr; } virtual RefPtr<TextureClient> GetForwardedTexture() { return nullptr; }
CompositableType mType;
ImageUsageType mUsageType;
protected: protected:
ImageClient(CompositableForwarder* aFwd, TextureFlags aFlags, ImageClient(CompositableForwarder* aFwd, TextureFlags aFlags,
CompositableType aType); CompositableType aType, ImageUsageType aUsageType);
CompositableType mType;
uint32_t mLastUpdateGenerationCounter; uint32_t mLastUpdateGenerationCounter;
}; };
@@ -86,7 +88,7 @@ class ImageClient : public CompositableClient {
class ImageClientSingle : public ImageClient { class ImageClientSingle : public ImageClient {
public: public:
ImageClientSingle(CompositableForwarder* aFwd, TextureFlags aFlags, ImageClientSingle(CompositableForwarder* aFwd, TextureFlags aFlags,
CompositableType aType); CompositableType aType, ImageUsageType aUsageType);
bool UpdateImage(ImageContainer* aContainer) override; bool UpdateImage(ImageContainer* aContainer) override;

View File

@@ -100,9 +100,9 @@ class CompositableHost {
virtual uint32_t GetDroppedFrames() { return 0; } virtual uint32_t GetDroppedFrames() { return 0; }
const TextureInfo mTextureInfo;
protected: protected:
protected:
TextureInfo mTextureInfo;
AsyncCompositableRef mAsyncRef; AsyncCompositableRef mAsyncRef;
}; };

View File

@@ -681,8 +681,8 @@ RefPtr<ImageClient> ImageBridgeChild::CreateImageClientNow(
return nullptr; return nullptr;
} }
RefPtr<ImageClient> client = RefPtr<ImageClient> client = ImageClient::CreateImageClient(
ImageClient::CreateImageClient(aType, this, TextureFlags::NO_FLAGS); aType, aImageContainer->mUsageType, this, TextureFlags::NO_FLAGS);
MOZ_ASSERT(client, "failed to create ImageClient"); MOZ_ASSERT(client, "failed to create ImageClient");
if (client) { if (client) {
client->Connect(aImageContainer); client->Connect(aImageContainer);

View File

@@ -668,11 +668,13 @@ struct ParamTraits<mozilla::layers::TextureInfo> {
static void Write(MessageWriter* aWriter, const paramType& aParam) { static void Write(MessageWriter* aWriter, const paramType& aParam) {
WriteParam(aWriter, aParam.mCompositableType); WriteParam(aWriter, aParam.mCompositableType);
WriteParam(aWriter, aParam.mUsageType);
WriteParam(aWriter, aParam.mTextureFlags); WriteParam(aWriter, aParam.mTextureFlags);
} }
static bool Read(MessageReader* aReader, paramType* aResult) { static bool Read(MessageReader* aReader, paramType* aResult) {
return ReadParam(aReader, &aResult->mCompositableType) && return ReadParam(aReader, &aResult->mCompositableType) &&
ReadParam(aReader, &aResult->mUsageType) &&
ReadParam(aReader, &aResult->mTextureFlags); ReadParam(aReader, &aResult->mTextureFlags);
} }
}; };
@@ -684,6 +686,13 @@ struct ParamTraits<mozilla::layers::CompositableType>
mozilla::layers::CompositableType::UNKNOWN, mozilla::layers::CompositableType::UNKNOWN,
mozilla::layers::CompositableType::COUNT> {}; mozilla::layers::CompositableType::COUNT> {};
template <>
struct ParamTraits<mozilla::layers::ImageUsageType>
: public ContiguousEnumSerializer<mozilla::layers::ImageUsageType,
mozilla::layers::ImageUsageType::UNKNOWN,
mozilla::layers::ImageUsageType::COUNT> {
};
template <> template <>
struct ParamTraits<mozilla::layers::ScrollableLayerGuid> { struct ParamTraits<mozilla::layers::ScrollableLayerGuid> {
typedef mozilla::layers::ScrollableLayerGuid paramType; typedef mozilla::layers::ScrollableLayerGuid paramType;

View File

@@ -2633,7 +2633,8 @@ WebRenderCommandBuilder::GenerateFallbackData(
imageData->CreateImageClientIfNeeded(); imageData->CreateImageClientIfNeeded();
RefPtr<ImageClient> imageClient = imageData->GetImageClient(); RefPtr<ImageClient> imageClient = imageData->GetImageClient();
RefPtr<ImageContainer> imageContainer = MakeAndAddRef<ImageContainer>(); RefPtr<ImageContainer> imageContainer = MakeAndAddRef<ImageContainer>(
ImageUsageType::WebRenderFallbackData, ImageContainer::SYNCHRONOUS);
{ {
UpdateImageHelper helper(imageContainer, imageClient, UpdateImageHelper helper(imageContainer, imageClient,

View File

@@ -235,7 +235,8 @@ void WebRenderImageData::CreateAsyncImageWebRenderCommands(
void WebRenderImageData::CreateImageClientIfNeeded() { void WebRenderImageData::CreateImageClientIfNeeded() {
if (!mImageClient) { if (!mImageClient) {
mImageClient = ImageClient::CreateImageClient( mImageClient = ImageClient::CreateImageClient(
CompositableType::IMAGE, WrBridge(), TextureFlags::DEFAULT); CompositableType::IMAGE, ImageUsageType::WebRenderImageData, WrBridge(),
TextureFlags::DEFAULT);
if (!mImageClient) { if (!mImageClient) {
return; return;
} }
@@ -399,7 +400,8 @@ void WebRenderCanvasData::SetImageContainer(ImageContainer* aImageContainer) {
ImageContainer* WebRenderCanvasData::GetImageContainer() { ImageContainer* WebRenderCanvasData::GetImageContainer() {
if (!mContainer) { if (!mContainer) {
mContainer = MakeAndAddRef<ImageContainer>(); mContainer = MakeAndAddRef<ImageContainer>(ImageUsageType::Canvas,
ImageContainer::SYNCHRONOUS);
} }
return mContainer; return mContainer;
} }