Skip to content
This repository has been archived by the owner on Aug 4, 2022. It is now read-only.

Commit

Permalink
Bug 1561179 - P5: Remove separate VideoBridgeChild Singletons. r=matt…
Browse files Browse the repository at this point in the history
…woodrow

Combine sVideoBridgeToParentProcess and sVideoBridgeToGPUProcess into one
sVideoBridge. Each producing process, GPU or RDD, is only ever started with one
VideoBridgeChild endpoint. This is enough to get RemoteVideoDecoders in RDD
process to start using GPU memory to send video to compositor over PVideoBridge.

Differential Revision: https://phabricator.services.mozilla.com/D50402
  • Loading branch information
djg committed Nov 4, 2019
1 parent 5ee438f commit c3cb13c
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 43 deletions.
2 changes: 1 addition & 1 deletion dom/media/ipc/RemoteDecoderManagerParent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ bool RemoteDecoderManagerParent::CreateVideoBridgeToOtherProcess(
}

RefPtr<Runnable> task = NewRunnableFunction(
"gfx::VideoBridgeChild::Open", &VideoBridgeChild::OpenToParentProcess,
"gfx::VideoBridgeChild::Open", &VideoBridgeChild::Open,
std::move(aEndpoint));
sRemoteDecoderManagerParentThread->Dispatch(task.forget(),
NS_DISPATCH_NORMAL);
Expand Down
9 changes: 2 additions & 7 deletions dom/media/ipc/RemoteVideoDecoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,15 @@ class KnowsCompositorVideo : public layers::KnowsCompositor {
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(KnowsCompositorVideo, override)

layers::TextureForwarder* GetTextureForwarder() override {
return mTextureFactoryIdentifier.mParentProcessType == GeckoProcessType_GPU
? VideoBridgeChild::GetSingletonToGPUProcess()
: VideoBridgeChild::GetSingletonToParentProcess();
return VideoBridgeChild::GetSingleton();
}
layers::LayersIPCActor* GetLayersIPCActor() override {
return GetTextureForwarder();
}

static already_AddRefed<KnowsCompositorVideo> TryCreateForIdentifier(
const layers::TextureFactoryIdentifier& aIdentifier) {
VideoBridgeChild* child =
(aIdentifier.mParentProcessType == GeckoProcessType_GPU)
? VideoBridgeChild::GetSingletonToGPUProcess()
: VideoBridgeChild::GetSingletonToParentProcess();
VideoBridgeChild* child = VideoBridgeChild::GetSingleton();
if (!child) {
return nullptr;
}
Expand Down
43 changes: 12 additions & 31 deletions gfx/layers/ipc/VideoBridgeChild.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@
namespace mozilla {
namespace layers {

StaticRefPtr<VideoBridgeChild> sVideoBridgeToParentProcess;
StaticRefPtr<VideoBridgeChild> sVideoBridgeToGPUProcess;
StaticRefPtr<VideoBridgeChild> sVideoBridge;

/* static */
void VideoBridgeChild::StartupForGPUProcess() {
Expand All @@ -23,39 +22,27 @@ void VideoBridgeChild::StartupForGPUProcess() {
base::GetCurrentProcId(), &parentPipe,
&childPipe);

VideoBridgeChild::OpenToGPUProcess(std::move(childPipe));
VideoBridgeChild::Open(std::move(childPipe));
VideoBridgeParent::Open(std::move(parentPipe), VideoBridgeSource::GpuProcess);
}

void VideoBridgeChild::OpenToParentProcess(
Endpoint<PVideoBridgeChild>&& aEndpoint) {
sVideoBridgeToParentProcess = new VideoBridgeChild();
void VideoBridgeChild::Open(Endpoint<PVideoBridgeChild>&& aEndpoint) {
// TODO(djg): This is for testing and probably incorrect. What happens when
// the IPC fails and is rebound?
MOZ_ASSERT(!sVideoBridge);
sVideoBridge = new VideoBridgeChild();

if (!aEndpoint.Bind(sVideoBridgeToParentProcess)) {
// We can't recover from this.
MOZ_CRASH("Failed to bind VideoBridgeChild to endpoint");
}
}

void VideoBridgeChild::OpenToGPUProcess(
Endpoint<PVideoBridgeChild>&& aEndpoint) {
sVideoBridgeToGPUProcess = new VideoBridgeChild();

if (!aEndpoint.Bind(sVideoBridgeToGPUProcess)) {
if (!aEndpoint.Bind(sVideoBridge)) {
// We can't recover from this.
MOZ_CRASH("Failed to bind VideoBridgeChild to endpoint");
}
}

/* static */
void VideoBridgeChild::Shutdown() {
if (sVideoBridgeToParentProcess) {
sVideoBridgeToParentProcess->Close();
sVideoBridgeToParentProcess = nullptr;
}
if (sVideoBridgeToGPUProcess) {
sVideoBridgeToGPUProcess->Close();
sVideoBridgeToGPUProcess = nullptr;
if (sVideoBridge) {
sVideoBridge->Close();
sVideoBridge = nullptr;
}
}

Expand All @@ -66,13 +53,7 @@ VideoBridgeChild::VideoBridgeChild()

VideoBridgeChild::~VideoBridgeChild() {}

VideoBridgeChild* VideoBridgeChild::GetSingletonToParentProcess() {
return sVideoBridgeToParentProcess;
}

VideoBridgeChild* VideoBridgeChild::GetSingletonToGPUProcess() {
return sVideoBridgeToGPUProcess;
}
VideoBridgeChild* VideoBridgeChild::GetSingleton() { return sVideoBridge; }

bool VideoBridgeChild::AllocUnsafeShmem(
size_t aSize, ipc::SharedMemory::SharedMemoryType aType,
Expand Down
6 changes: 2 additions & 4 deletions gfx/layers/ipc/VideoBridgeChild.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ class VideoBridgeChild final : public PVideoBridgeChild,
static void StartupForGPUProcess();
static void Shutdown();

static VideoBridgeChild* GetSingletonToParentProcess();
static VideoBridgeChild* GetSingletonToGPUProcess();
static VideoBridgeChild* GetSingleton();

// PVideoBridgeChild
PTextureChild* AllocPTextureChild(const SurfaceDescriptor& aSharedData,
Expand Down Expand Up @@ -66,8 +65,7 @@ class VideoBridgeChild final : public PVideoBridgeChild,

bool CanSend() { return mCanSend; }

static void OpenToParentProcess(Endpoint<PVideoBridgeChild>&& aEndpoint);
static void OpenToGPUProcess(Endpoint<PVideoBridgeChild>&& aEndpoint);
static void Open(Endpoint<PVideoBridgeChild>&& aEndpoint);

private:
VideoBridgeChild();
Expand Down

0 comments on commit c3cb13c

Please sign in to comment.