Bug 1581240 - Add an API to retrieve the collected frames from WebRender r=mstange

Differential Revision: https://phabricator.services.mozilla.com/D47816
This commit is contained in:
Barret Rennie
2019-11-06 20:48:47 +00:00
parent f9a7e00ba6
commit 95061f2e33
6 changed files with 92 additions and 0 deletions

View File

@@ -1035,6 +1035,11 @@ WebRenderBridgeParent::WriteCollectedFrames() {
return Api(wr::RenderRoot::Default)->WriteCollectedFrames();
}
RefPtr<wr::WebRenderAPI::GetCollectedFramesPromise>
WebRenderBridgeParent::GetCollectedFrames() {
return Api(wr::RenderRoot::Default)->GetCollectedFrames();
}
CompositorBridgeParent* WebRenderBridgeParent::GetRootCompositorBridgeParent()
const {
if (!mCompositorBridge) {

View File

@@ -305,6 +305,14 @@ class WebRenderBridgeParent final
void RequestScreenPixels(UiCompositorControllerParent* aController);
void MaybeCaptureScreenPixels();
#endif
/**
* Return the frames collected by the |WebRenderCompositionRecorder| encoded
* as data URIs.
*
* If there is not currently a recorder, this is a no-op and the promise will
* be rejected.
*/
RefPtr<wr::WebRenderAPI::GetCollectedFramesPromise> GetCollectedFrames();
private:
class ScheduleSharedSurfaceRelease;

View File

@@ -269,6 +269,34 @@ void RenderThread::WriteCollectedFramesForWindow(wr::WindowId aWindowId) {
}
}
Maybe<layers::CollectedFrames> RenderThread::GetCollectedFramesForWindow(
wr::WindowId aWindowId) {
MOZ_ASSERT(IsInRenderThread());
RendererOGL* renderer = GetRenderer(aWindowId);
MOZ_ASSERT(renderer);
auto it = mCompositionRecorders.find(aWindowId);
MOZ_DIAGNOSTIC_ASSERT(
it != mCompositionRecorders.end(),
"Attempted to get frames from a window that was not recording.");
Maybe<layers::CollectedFrames> maybeFrames;
if (it != mCompositionRecorders.end()) {
maybeFrames.emplace(it->second->GetCollectedFrames());
if (renderer) {
wr_renderer_release_composition_recorder_structures(
renderer->GetRenderer());
}
mCompositionRecorders.erase(it);
}
return maybeFrames;
}
void RenderThread::HandleFrameOneDoc(wr::WindowId aWindowId, bool aRender) {
if (mHasShutdown) {
return;

View File

@@ -16,6 +16,7 @@
#include "mozilla/gfx/Point.h"
#include "mozilla/MozPromise.h"
#include "mozilla/DataMutex.h"
#include "mozilla/Maybe.h"
#include "mozilla/webrender/webrender_ffi.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/webrender/WebRenderTypes.h"
@@ -271,6 +272,9 @@ class RenderThread final {
void WriteCollectedFramesForWindow(wr::WindowId aWindowId);
Maybe<layers::CollectedFrames> GetCollectedFramesForWindow(
wr::WindowId aWindowId);
private:
explicit RenderThread(base::Thread* aThread);

View File

@@ -650,6 +650,42 @@ WebRenderAPI::WriteCollectedFrames() {
return promise;
}
RefPtr<WebRenderAPI::GetCollectedFramesPromise>
WebRenderAPI::GetCollectedFrames() {
class GetCollectedFramesEvent final : public RendererEvent {
public:
explicit GetCollectedFramesEvent() {
MOZ_COUNT_CTOR(GetCollectedFramesEvent);
}
~GetCollectedFramesEvent() { MOZ_COUNT_DTOR(GetCollectedFramesEvent); };
void Run(RenderThread& aRenderThread, WindowId aWindowId) override {
Maybe<layers::CollectedFrames> frames =
aRenderThread.GetCollectedFramesForWindow(aWindowId);
if (frames) {
mPromise.Resolve(std::move(*frames), __func__);
} else {
mPromise.Reject(NS_ERROR_UNEXPECTED, __func__);
}
}
RefPtr<WebRenderAPI::GetCollectedFramesPromise> GetPromise() {
return mPromise.Ensure(__func__);
}
private:
MozPromiseHolder<WebRenderAPI::GetCollectedFramesPromise> mPromise;
};
auto event = MakeUnique<GetCollectedFramesEvent>();
auto promise = event->GetPromise();
RunOnRenderThread(std::move(event));
return promise;
}
void TransactionBuilder::Clear() { wr_resource_updates_clear(mTxn); }
void TransactionBuilder::Notify(wr::Checkpoint aWhen,

View File

@@ -270,6 +270,8 @@ class WebRenderAPI final {
UniquePtr<layers::WebRenderCompositionRecorder> aRecorder);
typedef MozPromise<bool, nsresult, true> WriteCollectedFramesPromise;
typedef MozPromise<layers::CollectedFrames, nsresult, true>
GetCollectedFramesPromise;
/**
* Write the frames collected by the |WebRenderCompositionRecorder| to disk.
@@ -278,6 +280,15 @@ class WebRenderAPI final {
*/
RefPtr<WriteCollectedFramesPromise> WriteCollectedFrames();
/**
* Return the frames collected by the |WebRenderCompositionRecorder| encoded
* as data URIs.
*
* If there is not currently a recorder, this is a no-op and the promise will
* be rejected.
*/
RefPtr<GetCollectedFramesPromise> GetCollectedFrames();
protected:
WebRenderAPI(wr::DocumentHandle* aHandle, wr::WindowId aId,
uint32_t aMaxTextureSize, bool aUseANGLE, bool aUseDComp,