/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef gfx_layers_ipc_ImageBridgeParent_h_ #define gfx_layers_ipc_ImageBridgeParent_h_ #include // for size_t #include // for uint32_t, uint64_t #include "CompositableTransactionParent.h" #include "ImageContainerParent.h" #include "mozilla/Assertions.h" // for MOZ_ASSERT_HELPER2 #include "mozilla/Attributes.h" // for override #include "mozilla/ipc/ProtocolUtils.h" #include "mozilla/ipc/SharedMemory.h" // for SharedMemory, etc #include "mozilla/layers/CompositorThread.h" #include "mozilla/layers/PImageBridgeParent.h" #include "nsISupportsImpl.h" #include "nsTArrayForwardDeclare.h" // for InfallibleTArray class MessageLoop; namespace base { class Thread; } // namespace base namespace mozilla { namespace ipc { class Shmem; } // namespace ipc namespace layers { /** * ImageBridgeParent is the manager Protocol of ImageContainerParent. * It's purpose is mainly to setup the IPDL connection. Most of the * interesting stuff is in ImageContainerParent. */ class ImageBridgeParent final : public PImageBridgeParent, public CompositableParentManager, public ShmemAllocator { public: typedef InfallibleTArray EditArray; typedef InfallibleTArray OpDestroyArray; typedef InfallibleTArray EditReplyArray; protected: ImageBridgeParent(MessageLoop* aLoop, ProcessId aChildProcessId); public: ~ImageBridgeParent(); /** * Creates the globals of ImageBridgeParent. */ static void Setup(); static ImageBridgeParent* CreateSameProcess(); static bool CreateForGPUProcess(Endpoint&& aEndpoint); static bool CreateForContent(Endpoint&& aEndpoint); virtual ShmemAllocator* AsShmemAllocator() override { return this; } virtual void ActorDestroy(ActorDestroyReason aWhy) override; // CompositableParentManager virtual void SendAsyncMessage(const InfallibleTArray& aMessage) override; virtual void NotifyNotUsed(PTextureParent* aTexture, uint64_t aTransactionId) override; virtual base::ProcessId GetChildProcessId() override { return OtherPid(); } // PImageBridge virtual bool RecvImageBridgeThreadId(const PlatformThreadId& aThreadId) override; virtual bool RecvUpdate(EditArray&& aEdits, OpDestroyArray&& aToDestroy, const uint64_t& aFwdTransactionId, EditReplyArray* aReply) override; virtual bool RecvUpdateNoSwap(EditArray&& aEdits, OpDestroyArray&& aToDestroy, const uint64_t& aFwdTransactionId) override; PCompositableParent* AllocPCompositableParent(const TextureInfo& aInfo, PImageContainerParent* aImageContainer, uint64_t*) override; bool DeallocPCompositableParent(PCompositableParent* aActor) override; virtual PTextureParent* AllocPTextureParent(const SurfaceDescriptor& aSharedData, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, const uint64_t& aSerial) override; virtual bool DeallocPTextureParent(PTextureParent* actor) override; PMediaSystemResourceManagerParent* AllocPMediaSystemResourceManagerParent() override; bool DeallocPMediaSystemResourceManagerParent(PMediaSystemResourceManagerParent* aActor) override; virtual PImageContainerParent* AllocPImageContainerParent() override; virtual bool DeallocPImageContainerParent(PImageContainerParent* actor) override; // Shutdown step 1 virtual bool RecvWillClose() override; MessageLoop* GetMessageLoop() const { return mMessageLoop; } // ShmemAllocator virtual bool AllocShmem(size_t aSize, ipc::SharedMemory::SharedMemoryType aType, ipc::Shmem* aShmem) override; virtual bool AllocUnsafeShmem(size_t aSize, ipc::SharedMemory::SharedMemoryType aType, ipc::Shmem* aShmem) override; virtual void DeallocShmem(ipc::Shmem& aShmem) override; virtual bool IsSameProcess() const override; static RefPtr GetInstance(ProcessId aId); static bool NotifyImageComposites(nsTArray& aNotifications); virtual bool UsesImageBridge() const override { return true; } virtual bool IPCOpen() const override { return !mClosed; } protected: void OnChannelConnected(int32_t pid) override; void Bind(Endpoint&& aEndpoint); private: void DeferredDestroy(); MessageLoop* mMessageLoop; // This keeps us alive until ActorDestroy(), at which point we do a // deferred destruction of ourselves. RefPtr mSelfRef; bool mSetChildThreadPriority; bool mClosed; /** * Map of all living ImageBridgeParent instances */ static std::map sImageBridges; RefPtr mCompositorThreadHolder; }; } // namespace layers } // namespace mozilla #endif // gfx_layers_ipc_ImageBridgeParent_h_