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:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user