mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 04:15:43 +00:00
Bug 1252877 Part 1: Allow ImageContainer to act as a proxy for another async ImageConatiner. r=mattwoodrow
MozReview-Commit-ID: BeUFWZOwkvh
This commit is contained in:
parent
b4d3a89f33
commit
b2b638175c
@ -208,11 +208,28 @@ ImageContainer::ImageContainer(Mode flag)
|
||||
break;
|
||||
}
|
||||
}
|
||||
mAsyncContainerID = mImageClient ? mImageClient->GetAsyncID()
|
||||
: sInvalidAsyncContainerId;
|
||||
}
|
||||
|
||||
ImageContainer::ImageContainer(uint64_t aAsyncContainerID)
|
||||
: mReentrantMonitor("ImageContainer.mReentrantMonitor"),
|
||||
mGenerationCounter(++sGenerationCounter),
|
||||
mPaintCount(0),
|
||||
mDroppedImageCount(0),
|
||||
mImageFactory(nullptr),
|
||||
mRecycleBin(nullptr),
|
||||
mImageClient(nullptr),
|
||||
mAsyncContainerID(aAsyncContainerID),
|
||||
mCurrentProducerID(-1),
|
||||
mIPDLChild(nullptr)
|
||||
{
|
||||
MOZ_ASSERT(mAsyncContainerID != sInvalidAsyncContainerId);
|
||||
}
|
||||
|
||||
ImageContainer::~ImageContainer()
|
||||
{
|
||||
if (IsAsync()) {
|
||||
if (mIPDLChild) {
|
||||
mIPDLChild->ForgetImageContainer();
|
||||
ImageBridgeChild::DispatchReleaseImageClient(mImageClient, mIPDLChild);
|
||||
}
|
||||
@ -332,7 +349,7 @@ ImageContainer::SetCurrentImages(const nsTArray<NonOwningImage>& aImages)
|
||||
{
|
||||
MOZ_ASSERT(!aImages.IsEmpty());
|
||||
ReentrantMonitorAutoEnter mon(mReentrantMonitor);
|
||||
if (IsAsync()) {
|
||||
if (mImageClient) {
|
||||
ImageBridgeChild::DispatchImageClientUpdate(mImageClient, this);
|
||||
}
|
||||
SetCurrentImageInternal(aImages);
|
||||
@ -341,7 +358,7 @@ ImageContainer::SetCurrentImages(const nsTArray<NonOwningImage>& aImages)
|
||||
void
|
||||
ImageContainer::ClearAllImages()
|
||||
{
|
||||
if (IsAsync()) {
|
||||
if (mImageClient) {
|
||||
// Let ImageClient release all TextureClients. This doesn't return
|
||||
// until ImageBridge has called ClearCurrentImageFromImageBridge.
|
||||
ImageBridgeChild::FlushAllImages(mImageClient, this);
|
||||
@ -385,17 +402,13 @@ ImageContainer::SetCurrentImagesInTransaction(const nsTArray<NonOwningImage>& aI
|
||||
|
||||
bool ImageContainer::IsAsync() const
|
||||
{
|
||||
return mImageClient != nullptr;
|
||||
return mAsyncContainerID != sInvalidAsyncContainerId;
|
||||
}
|
||||
|
||||
uint64_t ImageContainer::GetAsyncContainerID() const
|
||||
{
|
||||
NS_ASSERTION(IsAsync(),"Shared image ID is only relevant to async ImageContainers");
|
||||
if (IsAsync()) {
|
||||
return mImageClient->GetAsyncID();
|
||||
} else {
|
||||
return 0; // zero is always an invalid AsyncID
|
||||
}
|
||||
return mAsyncContainerID;
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -359,8 +359,17 @@ public:
|
||||
|
||||
enum Mode { SYNCHRONOUS = 0x0, ASYNCHRONOUS = 0x01 };
|
||||
|
||||
static const uint64_t sInvalidAsyncContainerId = 0;
|
||||
|
||||
explicit ImageContainer(ImageContainer::Mode flag = SYNCHRONOUS);
|
||||
|
||||
/**
|
||||
* Create ImageContainer just to hold another ASYNCHRONOUS ImageContainer's
|
||||
* async container ID.
|
||||
* @param aAsyncContainerID async container ID for which we are a proxy
|
||||
*/
|
||||
explicit ImageContainer(uint64_t aAsyncContainerID);
|
||||
|
||||
typedef uint32_t FrameID;
|
||||
typedef uint32_t ProducerID;
|
||||
|
||||
@ -627,6 +636,8 @@ private:
|
||||
// asynchronusly using the ImageBridge IPDL protocol.
|
||||
ImageClient* mImageClient;
|
||||
|
||||
uint64_t mAsyncContainerID;
|
||||
|
||||
nsTArray<FrameID> mFrameIDsNotYetComposited;
|
||||
// ProducerID for last current image(s), including the frames in
|
||||
// mFrameIDsNotYetComposited
|
||||
|
Loading…
Reference in New Issue
Block a user