summaryrefslogtreecommitdiffstats
path: root/gfx/webrender_bindings/RendererScreenshotGrabber.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/webrender_bindings/RendererScreenshotGrabber.h')
-rw-r--r--gfx/webrender_bindings/RendererScreenshotGrabber.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/gfx/webrender_bindings/RendererScreenshotGrabber.h b/gfx/webrender_bindings/RendererScreenshotGrabber.h
new file mode 100644
index 0000000000..81f11a392d
--- /dev/null
+++ b/gfx/webrender_bindings/RendererScreenshotGrabber.h
@@ -0,0 +1,101 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_layers_RendererScreenshotGrabber_h
+#define mozilla_layers_RendererScreenshotGrabber_h
+
+#include "mozilla/TimeStamp.h"
+#include "mozilla/UniquePtr.h"
+#include "mozilla/gfx/Point.h"
+#include "mozilla/layers/ProfilerScreenshots.h"
+#include "mozilla/webrender/webrender_ffi.h"
+#include "nsTArray.h"
+
+namespace mozilla {
+namespace wr {
+
+struct Renderer;
+class RendererOGL;
+
+/**
+ * Used by |RendererOGL| to grab screenshots from WebRender and submit them to
+ * the Gecko profiler.
+ *
+ * If the profiler is not running or the screenshots feature is disabled, no
+ * work will be done.
+ */
+class RendererScreenshotGrabber final {
+ public:
+ RendererScreenshotGrabber();
+
+ /**
+ * Grab a screenshot from WebRender if we are profiling and screenshots are
+ * enabled.
+ *
+ * The captured screenshot will not be mapped until the second call to
+ * |MaybeProcessQueue| after this call to |MaybeGrabScreenshot|.
+ */
+ void MaybeGrabScreenshot(RendererOGL* aRendererOGL,
+ const gfx::IntSize& aWindowSize);
+
+ /**
+ * Process the screenshots pending in the queue if we are profiling and
+ * screenshots are enabled.
+ */
+ void MaybeProcessQueue(RendererOGL* aRenderer);
+
+ private:
+ /**
+ * Drop all our allocated memory when we are no longer profiling.
+ *
+ * This will also instruct WebRender to drop all its Gecko profiler
+ * associated memory.
+ */
+ void Destroy(Renderer* aRenderer);
+
+ /**
+ * Actually grab a screenshot from WebRender.
+ */
+ void GrabScreenshot(Renderer* aRenderer, const gfx::IntSize& aWindowSize);
+
+ /**
+ * Process the screenshots pending in the queue.
+ */
+ void ProcessQueue(Renderer* aRenderer);
+
+ struct QueueItem {
+ mozilla::TimeStamp mTimeStamp;
+ AsyncScreenshotHandle mHandle;
+ gfx::IntSize mScreenshotSize;
+ gfx::IntSize mWindowSize;
+ };
+
+ /**
+ * The maximum size for screenshots, as dictated by
+ * |ProfilerScrenshots::ScreenshotSize|.
+ */
+ gfx::IntSize mMaxScreenshotSize;
+
+ /**
+ * The queue of screenshots waiting to be processed and submitted.
+ */
+ nsTArray<QueueItem> mQueue;
+
+ /**
+ * The queue item for the current frame. This will be inserted into the queue
+ * after a call to |MaybeProcessQueue| so it will be not be processed until
+ * the next frame.
+ */
+ Maybe<QueueItem> mCurrentFrameQueueItem;
+
+ /**
+ * Our handle to the profiler screenshots object.
+ */
+ RefPtr<mozilla::layers::ProfilerScreenshots> mProfilerScreenshots;
+};
+
+} // namespace wr
+} // namespace mozilla
+
+#endif // mozilla_layers_RendererScreenshotGrabber_h