RendererScreenshotGrabber.cpp (3185B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "RendererScreenshotGrabber.h" 8 9 #include "RendererOGL.h" 10 11 #include "mozilla/gfx/2D.h" 12 13 using mozilla::layers::ProfilerScreenshots; 14 15 namespace mozilla { 16 namespace wr { 17 18 RendererScreenshotGrabber::RendererScreenshotGrabber() { 19 mMaxScreenshotSize = ProfilerScreenshots::ScreenshotSize(); 20 } 21 22 void RendererScreenshotGrabber::MaybeGrabScreenshot( 23 RendererOGL* aRendererOGL, const gfx::IntSize& aWindowSize) { 24 bool isEnabled = 25 ProfilerScreenshots::IsEnabled() && aRendererOGL->EnsureAsyncScreenshot(); 26 27 if (isEnabled) { 28 if (!mProfilerScreenshots) { 29 mProfilerScreenshots = new ProfilerScreenshots(); 30 } 31 32 GrabScreenshot(aRendererOGL->GetRenderer(), aWindowSize); 33 } else if (mProfilerScreenshots) { 34 Destroy(aRendererOGL->GetRenderer()); 35 } 36 } 37 38 void RendererScreenshotGrabber::MaybeProcessQueue(RendererOGL* aRendererOGL) { 39 bool isEnabled = 40 ProfilerScreenshots::IsEnabled() && aRendererOGL->EnsureAsyncScreenshot(); 41 42 if (isEnabled) { 43 if (!mProfilerScreenshots) { 44 mProfilerScreenshots = new ProfilerScreenshots(); 45 } 46 47 ProcessQueue(aRendererOGL->GetRenderer()); 48 } else if (mProfilerScreenshots) { 49 Destroy(aRendererOGL->GetRenderer()); 50 } 51 } 52 53 void RendererScreenshotGrabber::Destroy(Renderer* aRenderer) { 54 mQueue.Clear(); 55 mCurrentFrameQueueItem = Nothing(); 56 mProfilerScreenshots = nullptr; 57 58 wr_renderer_release_profiler_structures(aRenderer); 59 } 60 61 void RendererScreenshotGrabber::GrabScreenshot( 62 Renderer* aRenderer, const gfx::IntSize& aWindowSize) { 63 gfx::IntSize screenshotSize; 64 65 AsyncScreenshotHandle handle = wr_renderer_get_screenshot_async( 66 aRenderer, 0, 0, aWindowSize.width, aWindowSize.height, 67 mMaxScreenshotSize.width, mMaxScreenshotSize.height, ImageFormat::BGRA8, 68 &screenshotSize.width, &screenshotSize.height); 69 70 mCurrentFrameQueueItem = Some(QueueItem{ 71 TimeStamp::Now(), 72 handle, 73 screenshotSize, 74 aWindowSize, 75 }); 76 } 77 78 void RendererScreenshotGrabber::ProcessQueue(Renderer* aRenderer) { 79 for (const auto& item : mQueue) { 80 mProfilerScreenshots->SubmitScreenshot( 81 item.mWindowSize, item.mScreenshotSize, item.mTimeStamp, 82 [&item, aRenderer](gfx::DataSourceSurface* aTargetSurface) { 83 gfx::DataSourceSurface::ScopedMap map(aTargetSurface, 84 gfx::DataSourceSurface::WRITE); 85 int32_t destStride = map.GetStride(); 86 87 bool success = wr_renderer_map_and_recycle_screenshot( 88 aRenderer, item.mHandle, map.GetData(), 89 destStride * aTargetSurface->GetSize().height, destStride); 90 91 return success; 92 }); 93 } 94 95 mQueue.Clear(); 96 97 if (mCurrentFrameQueueItem) { 98 mQueue.AppendElement(*mCurrentFrameQueueItem); 99 mCurrentFrameQueueItem = Nothing(); 100 } 101 } 102 103 } // namespace wr 104 } // namespace mozilla