mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
Bug 1329432 - Add ImageContainerListener r=nical
This commit is contained in:
parent
e214363851
commit
9c5080bd64
@ -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);
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user