Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit 4170fd9

Browse files
author
Kris Taeleman
committed
Bug 1547737 - Make RecvRequestScreenPixels work with WR. r=jnicol
Differential Revision: https://phabricator.services.mozilla.com/D49492 --HG-- extra : moz-landing-system : lando
1 parent 80894b3 commit 4170fd9

3 files changed

Lines changed: 65 additions & 0 deletions

File tree

gfx/layers/ipc/UiCompositorControllerParent.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "mozilla/layers/CompositorThread.h"
1515
#include "mozilla/layers/LayerManagerComposite.h"
1616
#include "mozilla/layers/UiCompositorControllerMessageTypes.h"
17+
#include "mozilla/layers/WebRenderBridgeParent.h"
1718
#include "mozilla/gfx/Types.h"
1819
#include "mozilla/Move.h"
1920
#include "mozilla/Unused.h"
@@ -175,6 +176,9 @@ UiCompositorControllerParent::RecvRequestScreenPixels() {
175176
state->mLayerManager->RequestScreenPixels(this);
176177
state->mParent->Invalidate();
177178
state->mParent->ScheduleComposition();
179+
} else if (state && state->mWrBridge) {
180+
state->mWrBridge->RequestScreenPixels(this);
181+
state->mWrBridge->ScheduleForcedGenerateFrame();
178182
}
179183
#endif // defined(MOZ_WIDGET_ANDROID)
180184

gfx/layers/wr/WebRenderBridgeParent.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,9 @@ WebRenderBridgeParent::WebRenderBridgeParent(
333333
mWrEpoch{0},
334334
mIdNamespace(aApis[0]->GetNamespace()),
335335
mRenderRootRectMutex("WebRenderBridgeParent::mRenderRootRectMutex"),
336+
#if defined(MOZ_WIDGET_ANDROID)
337+
mScreenPixelsTarget(nullptr),
338+
#endif
336339
mPaused(false),
337340
mDestroyed(false),
338341
mReceivedDisplayList(false),
@@ -1717,6 +1720,49 @@ void WebRenderBridgeParent::FlushFramePresentation() {
17171720
mApis[wr::RenderRoot::Default]->WaitFlushed();
17181721
}
17191722

1723+
#if defined(MOZ_WIDGET_ANDROID)
1724+
void WebRenderBridgeParent::RequestScreenPixels(
1725+
UiCompositorControllerParent* aController) {
1726+
mScreenPixelsTarget = aController;
1727+
}
1728+
1729+
void WebRenderBridgeParent::MaybeCaptureScreenPixels() {
1730+
if (!mScreenPixelsTarget) {
1731+
return;
1732+
}
1733+
1734+
if (mDestroyed) {
1735+
return;
1736+
}
1737+
MOZ_ASSERT(!mPaused);
1738+
1739+
// This function should only get called in the root WRBP.
1740+
MOZ_ASSERT(IsRootWebRenderBridgeParent());
1741+
1742+
SurfaceFormat format = SurfaceFormat::R8G8B8A8; // On android we use RGBA8
1743+
auto client_size = mWidget->GetClientSize();
1744+
size_t buffer_size =
1745+
client_size.width * client_size.height * BytesPerPixel(format);
1746+
1747+
ipc::Shmem mem;
1748+
if (!mScreenPixelsTarget->AllocPixelBuffer(buffer_size, &mem)) {
1749+
// Failed to alloc shmem, Just bail out.
1750+
return;
1751+
}
1752+
1753+
IntSize size(client_size.width, client_size.height);
1754+
1755+
mApis[wr::RenderRoot::Default]->Readback(
1756+
TimeStamp::Now(), size, format,
1757+
Range<uint8_t>(mem.get<uint8_t>(), buffer_size));
1758+
1759+
Unused << mScreenPixelsTarget->SendScreenPixels(
1760+
std::move(mem), ScreenIntSize(client_size.width, client_size.height));
1761+
1762+
mScreenPixelsTarget = nullptr;
1763+
}
1764+
#endif
1765+
17201766
mozilla::ipc::IPCResult WebRenderBridgeParent::RecvGetSnapshot(
17211767
PTextureParent* aTexture) {
17221768
if (mDestroyed) {
@@ -2357,6 +2403,10 @@ void WebRenderBridgeParent::MaybeGenerateFrame(VsyncId aId,
23572403
}
23582404
wr::WebRenderAPI::SendTransactions(mApis, generateFrameTxns);
23592405

2406+
#if defined(MOZ_WIDGET_ANDROID)
2407+
MaybeCaptureScreenPixels();
2408+
#endif
2409+
23602410
mMostRecentComposite = TimeStamp::Now();
23612411
}
23622412

gfx/layers/wr/WebRenderBridgeParent.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,14 @@ class WebRenderBridgeParent final
298298
*/
299299
void WriteCollectedFrames();
300300

301+
#if defined(MOZ_WIDGET_ANDROID)
302+
/**
303+
* Request a screengrab for android
304+
*/
305+
void RequestScreenPixels(UiCompositorControllerParent* aController);
306+
void MaybeCaptureScreenPixels();
307+
#endif
308+
301309
private:
302310
class ScheduleSharedSurfaceRelease;
303311

@@ -548,6 +556,9 @@ class WebRenderBridgeParent final
548556
wr::NonDefaultRenderRootArray<ScreenRect> mRenderRootRects;
549557

550558
Maybe<wr::RenderRoot> mRenderRoot;
559+
#if defined(MOZ_WIDGET_ANDROID)
560+
UiCompositorControllerParent* mScreenPixelsTarget;
561+
#endif
551562
bool mPaused;
552563
bool mDestroyed;
553564
bool mReceivedDisplayList;

0 commit comments

Comments
 (0)