1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #include "VideoBridgeParent.h"
8 #include "CompositorThread.h"
9 #include "mozilla/ipc/Endpoint.h"
10 #include "mozilla/layers/TextureHost.h"
11 #include "mozilla/layers/VideoBridgeUtils.h"
12 
13 namespace mozilla {
14 namespace layers {
15 
16 using namespace mozilla::ipc;
17 using namespace mozilla::gfx;
18 
19 static VideoBridgeParent* sVideoBridgeFromRddProcess;
20 static VideoBridgeParent* sVideoBridgeFromGpuProcess;
21 
VideoBridgeParent(VideoBridgeSource aSource)22 VideoBridgeParent::VideoBridgeParent(VideoBridgeSource aSource)
23     : mCompositorThreadHolder(CompositorThreadHolder::GetSingleton()),
24       mClosed(false) {
25   mSelfRef = this;
26   switch (aSource) {
27     default:
28       MOZ_CRASH("Unhandled case");
29     case VideoBridgeSource::RddProcess:
30       sVideoBridgeFromRddProcess = this;
31       break;
32     case VideoBridgeSource::GpuProcess:
33       sVideoBridgeFromGpuProcess = this;
34       break;
35   }
36 }
37 
~VideoBridgeParent()38 VideoBridgeParent::~VideoBridgeParent() {
39   if (sVideoBridgeFromRddProcess == this) {
40     sVideoBridgeFromRddProcess = nullptr;
41   }
42   if (sVideoBridgeFromGpuProcess == this) {
43     sVideoBridgeFromGpuProcess = nullptr;
44   }
45 }
46 
47 /* static */
Open(Endpoint<PVideoBridgeParent> && aEndpoint,VideoBridgeSource aSource)48 void VideoBridgeParent::Open(Endpoint<PVideoBridgeParent>&& aEndpoint,
49                              VideoBridgeSource aSource) {
50   RefPtr<VideoBridgeParent> parent = new VideoBridgeParent(aSource);
51 
52   CompositorThread()->Dispatch(
53       NewRunnableMethod<Endpoint<PVideoBridgeParent>&&>(
54           "gfx::layers::VideoBridgeParent::Bind", parent,
55           &VideoBridgeParent::Bind, std::move(aEndpoint)));
56 }
57 
Bind(Endpoint<PVideoBridgeParent> && aEndpoint)58 void VideoBridgeParent::Bind(Endpoint<PVideoBridgeParent>&& aEndpoint) {
59   if (!aEndpoint.Bind(this)) {
60     // We can't recover from this.
61     MOZ_CRASH("Failed to bind VideoBridgeParent to endpoint");
62   }
63 }
64 
65 /* static */
GetSingleton(const Maybe<VideoBridgeSource> & aSource)66 VideoBridgeParent* VideoBridgeParent::GetSingleton(
67     const Maybe<VideoBridgeSource>& aSource) {
68   MOZ_ASSERT(aSource.isSome());
69   switch (aSource.value()) {
70     default:
71       MOZ_CRASH("Unhandled case");
72     case VideoBridgeSource::RddProcess:
73       MOZ_ASSERT(sVideoBridgeFromRddProcess);
74       return sVideoBridgeFromRddProcess;
75     case VideoBridgeSource::GpuProcess:
76       MOZ_ASSERT(sVideoBridgeFromGpuProcess);
77       return sVideoBridgeFromGpuProcess;
78   }
79 }
80 
LookupTexture(uint64_t aSerial)81 TextureHost* VideoBridgeParent::LookupTexture(uint64_t aSerial) {
82   MOZ_DIAGNOSTIC_ASSERT(CompositorThread() &&
83                         CompositorThread()->IsOnCurrentThread());
84   return TextureHost::AsTextureHost(mTextureMap[aSerial]);
85 }
86 
ActorDestroy(ActorDestroyReason aWhy)87 void VideoBridgeParent::ActorDestroy(ActorDestroyReason aWhy) {
88   // Can't alloc/dealloc shmems from now on.
89   mClosed = true;
90 }
91 
ActorDealloc()92 void VideoBridgeParent::ActorDealloc() {
93   mCompositorThreadHolder = nullptr;
94   mSelfRef = nullptr;
95 }
96 
AllocPTextureParent(const SurfaceDescriptor & aSharedData,const ReadLockDescriptor & aReadLock,const LayersBackend & aLayersBackend,const TextureFlags & aFlags,const uint64_t & aSerial)97 PTextureParent* VideoBridgeParent::AllocPTextureParent(
98     const SurfaceDescriptor& aSharedData, const ReadLockDescriptor& aReadLock,
99     const LayersBackend& aLayersBackend, const TextureFlags& aFlags,
100     const uint64_t& aSerial) {
101   PTextureParent* parent = TextureHost::CreateIPDLActor(
102       this, aSharedData, aReadLock, aLayersBackend, aFlags, aSerial, Nothing());
103 
104   if (!parent) {
105     return nullptr;
106   }
107 
108   mTextureMap[aSerial] = parent;
109   return parent;
110 }
111 
DeallocPTextureParent(PTextureParent * actor)112 bool VideoBridgeParent::DeallocPTextureParent(PTextureParent* actor) {
113   mTextureMap.erase(TextureHost::GetTextureSerial(actor));
114   return TextureHost::DestroyIPDLActor(actor);
115 }
116 
SendAsyncMessage(const nsTArray<AsyncParentMessageData> & aMessage)117 void VideoBridgeParent::SendAsyncMessage(
118     const nsTArray<AsyncParentMessageData>& aMessage) {
119   MOZ_ASSERT(false, "AsyncMessages not supported");
120 }
121 
AllocShmem(size_t aSize,ipc::SharedMemory::SharedMemoryType aType,ipc::Shmem * aShmem)122 bool VideoBridgeParent::AllocShmem(size_t aSize,
123                                    ipc::SharedMemory::SharedMemoryType aType,
124                                    ipc::Shmem* aShmem) {
125   if (mClosed) {
126     return false;
127   }
128   return PVideoBridgeParent::AllocShmem(aSize, aType, aShmem);
129 }
130 
AllocUnsafeShmem(size_t aSize,ipc::SharedMemory::SharedMemoryType aType,ipc::Shmem * aShmem)131 bool VideoBridgeParent::AllocUnsafeShmem(
132     size_t aSize, ipc::SharedMemory::SharedMemoryType aType,
133     ipc::Shmem* aShmem) {
134   if (mClosed) {
135     return false;
136   }
137   return PVideoBridgeParent::AllocUnsafeShmem(aSize, aType, aShmem);
138 }
139 
DeallocShmem(ipc::Shmem & aShmem)140 bool VideoBridgeParent::DeallocShmem(ipc::Shmem& aShmem) {
141   if (mClosed) {
142     return false;
143   }
144   return PVideoBridgeParent::DeallocShmem(aShmem);
145 }
146 
IsSameProcess() const147 bool VideoBridgeParent::IsSameProcess() const {
148   return OtherPid() == base::GetCurrentProcId();
149 }
150 
NotifyNotUsed(PTextureParent * aTexture,uint64_t aTransactionId)151 void VideoBridgeParent::NotifyNotUsed(PTextureParent* aTexture,
152                                       uint64_t aTransactionId) {}
153 
154 }  // namespace layers
155 }  // namespace mozilla
156