Bug 1329432 - Add ImageContainerListener r=nical

This commit is contained in:
sotaro 2017-01-14 07:51:40 +09:00
parent e214363851
commit 9c5080bd64
3 changed files with 63 additions and 3 deletions

View File

@ -97,6 +97,32 @@ BufferRecycleBin::ClearRecycledBuffers()
mRecycledBufferSize = 0;
}
ImageContainerListener::ImageContainerListener(ImageContainer* aImageContainer)
: mLock("mozilla.layers.ImageContainerListener.mLock")
, mImageContainer(aImageContainer)
{
}
ImageContainerListener::~ImageContainerListener()
{
}
void
ImageContainerListener::NotifyComposite(const ImageCompositeNotification& aNotification)
{
MutexAutoLock lock(mLock);
if (mImageContainer) {
mImageContainer->NotifyComposite(aNotification);
}
}
void
ImageContainerListener::ClearImageContainer()
{
MutexAutoLock lock(mLock);
mImageContainer = nullptr;
}
void
ImageContainer::EnsureImageClient(bool aCreate)
{
@ -111,6 +137,7 @@ ImageContainer::EnsureImageClient(bool aCreate)
mImageClient = imageBridge->CreateImageClient(CompositableType::IMAGE, this);
if (mImageClient) {
mAsyncContainerID = mImageClient->GetAsyncID();
mNotifyCompositeListener = new ImageContainerListener(this);
}
}
}
@ -146,6 +173,9 @@ ImageContainer::ImageContainer(uint64_t aAsyncContainerID)
ImageContainer::~ImageContainer()
{
if (mNotifyCompositeListener) {
mNotifyCompositeListener->ClearImageContainer();
}
if (mAsyncContainerID) {
if (RefPtr<ImageBridgeChild> imageBridge = ImageBridgeChild::GetSingleton()) {
imageBridge->ForgetImageContainer(mAsyncContainerID);

View File

@ -145,6 +145,7 @@ namespace layers {
class ImageClient;
class ImageCompositeNotification;
class ImageContainer;
class ImageContainerChild;
class PImageContainerChild;
class SharedPlanarYCbCrImage;
@ -323,6 +324,24 @@ protected:
const gfx::IntSize& aScaleHint,
BufferRecycleBin *aRecycleBin);
};
// Used to notify ImageContainer::NotifyComposite()
class ImageContainerListener final {
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ImageContainerListener)
public:
explicit ImageContainerListener(ImageContainer* aImageContainer);
void NotifyComposite(const ImageCompositeNotification& aNotification);
void ClearImageContainer();
private:
typedef mozilla::Mutex Mutex;
~ImageContainerListener();
Mutex mLock;
ImageContainer* mImageContainer;
};
/**
* A class that manages Images for an ImageLayer. The only reason
@ -566,6 +585,11 @@ public:
PImageContainerChild* GetPImageContainerChild();
ImageContainerListener* GetImageContainerListener()
{
return mNotifyCompositeListener;
}
/**
* Main thread only.
*/
@ -632,6 +656,8 @@ private:
// mFrameIDsNotYetComposited
ProducerID mCurrentProducerID;
RefPtr<ImageContainerListener> mNotifyCompositeListener;
static mozilla::Atomic<uint32_t> sGenerationCounter;
};

View File

@ -1105,13 +1105,17 @@ mozilla::ipc::IPCResult
ImageBridgeChild::RecvDidComposite(InfallibleTArray<ImageCompositeNotification>&& aNotifications)
{
for (auto& n : aNotifications) {
RefPtr<ImageContainer> imageContainer;
RefPtr<ImageContainerListener> listener;
{
MutexAutoLock lock(mContainerMapLock);
ImageContainer* imageContainer;
imageContainer = mImageContainers.Get(n.asyncCompositableID());
if (imageContainer) {
listener = imageContainer->GetImageContainerListener();
}
}
if (imageContainer) {
imageContainer->NotifyComposite(n);
if (listener) {
listener->NotifyComposite(n);
}
}
return IPC_OK();