Bug 1275314 - Allow flushing in-progress checkerboard reports in the GPU process as well. r=dvander

MozReview-Commit-ID: CXLzkiloHW
This commit is contained in:
Kartikaya Gupta 2016-10-15 08:45:02 -04:00
Родитель 76e61ea656
Коммит e6f4f137d8
9 изменённых файлов: 64 добавлений и 4 удалений

Просмотреть файл

@ -123,6 +123,17 @@ GPUChild::RecvInitCrashReporter(Shmem&& aShmem)
return true; return true;
} }
bool
GPUChild::RecvNotifyUiObservers(const nsCString& aTopic)
{
nsCOMPtr<nsIObserverService> obsSvc = mozilla::services::GetObserverService();
MOZ_ASSERT(obsSvc);
if (obsSvc) {
obsSvc->NotifyObservers(nullptr, aTopic.get(), nullptr);
}
return true;
}
void void
GPUChild::ActorDestroy(ActorDestroyReason aWhy) GPUChild::ActorDestroy(ActorDestroyReason aWhy)
{ {

Просмотреть файл

@ -40,6 +40,7 @@ public:
bool RecvInitCrashReporter(Shmem&& shmem) override; bool RecvInitCrashReporter(Shmem&& shmem) override;
void ActorDestroy(ActorDestroyReason aWhy) override; void ActorDestroy(ActorDestroyReason aWhy) override;
bool RecvGraphicsError(const nsCString& aError) override; bool RecvGraphicsError(const nsCString& aError) override;
bool RecvNotifyUiObservers(const nsCString& aTopic) override;
static void Destroy(UniquePtr<GPUChild>&& aChild); static void Destroy(UniquePtr<GPUChild>&& aChild);

Просмотреть файл

@ -305,6 +305,17 @@ GPUParent::RecvAddLayerTreeIdMapping(const uint64_t& aLayersId, const ProcessId&
return true; return true;
} }
bool
GPUParent::RecvNotifyGpuObservers(const nsCString& aTopic)
{
nsCOMPtr<nsIObserverService> obsSvc = mozilla::services::GetObserverService();
MOZ_ASSERT(obsSvc);
if (obsSvc) {
obsSvc->NotifyObservers(nullptr, aTopic.get(), nullptr);
}
return true;
}
void void
GPUParent::ActorDestroy(ActorDestroyReason aWhy) GPUParent::ActorDestroy(ActorDestroyReason aWhy)
{ {

Просмотреть файл

@ -47,6 +47,7 @@ public:
bool RecvDeallocateLayerTreeId(const uint64_t& aLayersId) override; bool RecvDeallocateLayerTreeId(const uint64_t& aLayersId) override;
bool RecvGetDeviceStatus(GPUDeviceData* aOutStatus) override; bool RecvGetDeviceStatus(GPUDeviceData* aOutStatus) override;
bool RecvAddLayerTreeIdMapping(const uint64_t& aLayersId, const ProcessId& aOwnerId) override; bool RecvAddLayerTreeIdMapping(const uint64_t& aLayersId, const ProcessId& aOwnerId) override;
bool RecvNotifyGpuObservers(const nsCString& aTopic) override;
void ActorDestroy(ActorDestroyReason aWhy) override; void ActorDestroy(ActorDestroyReason aWhy) override;

Просмотреть файл

@ -740,5 +740,16 @@ GPUProcessManager::RemoveListener(GPUProcessListener* aListener)
mListeners.RemoveElement(aListener); mListeners.RemoveElement(aListener);
} }
bool
GPUProcessManager::NotifyGpuObservers(const char* aTopic)
{
if (!mGPUChild) {
return false;
}
nsCString topic(aTopic);
mGPUChild->SendNotifyGpuObservers(topic);
return true;
}
} // namespace gfx } // namespace gfx
} // namespace mozilla } // namespace mozilla

Просмотреть файл

@ -128,6 +128,10 @@ public:
void AddListener(GPUProcessListener* aListener); void AddListener(GPUProcessListener* aListener);
void RemoveListener(GPUProcessListener* aListener); void RemoveListener(GPUProcessListener* aListener);
// Send a message to the GPU process observer service to broadcast. Returns
// true if the message was sent, false if not.
bool NotifyGpuObservers(const char* aTopic);
// Returns access to the PGPU protocol if a GPU process is present. // Returns access to the PGPU protocol if a GPU process is present.
GPUChild* GetGPUChild() { GPUChild* GetGPUChild() {
return mGPUChild; return mGPUChild;

Просмотреть файл

@ -68,6 +68,10 @@ parent:
// one is available (i.e., Init has completed). // one is available (i.e., Init has completed).
sync GetDeviceStatus() returns (GPUDeviceData status); sync GetDeviceStatus() returns (GPUDeviceData status);
// Have a message be broadcasted to the GPU process by the GPU process
// observer service.
async NotifyGpuObservers(nsCString aTopic);
child: child:
// Sent when the GPU process has initialized devices. This occurs once, after // Sent when the GPU process has initialized devices. This occurs once, after
// Init(). // Init().
@ -80,6 +84,10 @@ child:
async GraphicsError(nsCString aError); async GraphicsError(nsCString aError);
async InitCrashReporter(Shmem shmem); async InitCrashReporter(Shmem shmem);
// Have a message be broadcasted to the UI process by the UI process
// observer service.
async NotifyUiObservers(nsCString aTopic);
}; };
} // namespace gfx } // namespace gfx

Просмотреть файл

@ -14,6 +14,7 @@
#include "InputData.h" // for InputData, etc #include "InputData.h" // for InputData, etc
#include "Layers.h" // for Layer, etc #include "Layers.h" // for Layer, etc
#include "mozilla/dom/Touch.h" // for Touch #include "mozilla/dom/Touch.h" // for Touch
#include "mozilla/gfx/GPUParent.h" // for GPUParent
#include "mozilla/gfx/Logging.h" // for gfx::TreeLog #include "mozilla/gfx/Logging.h" // for gfx::TreeLog
#include "mozilla/gfx/Point.h" // for Point #include "mozilla/gfx/Point.h" // for Point
#include "mozilla/layers/APZThreadUtils.h" // for AssertOnCompositorThread, etc #include "mozilla/layers/APZThreadUtils.h" // for AssertOnCompositorThread, etc
@ -138,10 +139,17 @@ APZCTreeManager::CheckerboardFlushObserver::Observe(nsISupports* aSubject,
} }
}); });
} }
MOZ_ASSERT(XRE_IsParentProcess()); if (XRE_IsGPUProcess()) {
nsCOMPtr<nsIObserverService> obsSvc = mozilla::services::GetObserverService(); if (gfx::GPUParent* gpu = gfx::GPUParent::GetSingleton()) {
if (obsSvc) { nsCString topic("APZ:FlushActiveCheckerboard:Done");
obsSvc->NotifyObservers(nullptr, "APZ:FlushActiveCheckerboard:Done", nullptr); Unused << gpu->SendNotifyUiObservers(topic);
}
} else {
MOZ_ASSERT(XRE_IsParentProcess());
nsCOMPtr<nsIObserverService> obsSvc = mozilla::services::GetObserverService();
if (obsSvc) {
obsSvc->NotifyObservers(nullptr, "APZ:FlushActiveCheckerboard:Done", nullptr);
}
} }
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -13,6 +13,7 @@
#include "mozilla/Unused.h" #include "mozilla/Unused.h"
#include "mozilla/dom/CheckerboardReportServiceBinding.h" // for dom::CheckerboardReports #include "mozilla/dom/CheckerboardReportServiceBinding.h" // for dom::CheckerboardReports
#include "mozilla/gfx/GPUParent.h" #include "mozilla/gfx/GPUParent.h"
#include "mozilla/gfx/GPUProcessManager.h"
#include "nsContentUtils.h" // for nsContentUtils #include "nsContentUtils.h" // for nsContentUtils
#include "nsXULAppAPI.h" #include "nsXULAppAPI.h"
@ -211,6 +212,10 @@ void
CheckerboardReportService::FlushActiveReports() CheckerboardReportService::FlushActiveReports()
{ {
MOZ_ASSERT(XRE_IsParentProcess()); MOZ_ASSERT(XRE_IsParentProcess());
gfx::GPUProcessManager* gpu = gfx::GPUProcessManager::Get();
if (gpu && gpu->NotifyGpuObservers("APZ:FlushActiveCheckerboard")) {
return;
}
nsCOMPtr<nsIObserverService> obsSvc = mozilla::services::GetObserverService(); nsCOMPtr<nsIObserverService> obsSvc = mozilla::services::GetObserverService();
MOZ_ASSERT(obsSvc); MOZ_ASSERT(obsSvc);