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:
Bob Owen 2016-07-18 09:54:01 +01:00
parent b4d3a89f33
commit b2b638175c
2 changed files with 33 additions and 9 deletions

View File

@ -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

View File

@ -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