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:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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) {}
|
||||||
|
|||||||
@@ -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 &&
|
||||||
|
|||||||
@@ -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.");
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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(); }
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user