Loading services/surfaceflinger/RegionSamplingThread.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -425,7 +425,8 @@ void RegionSamplingThread::captureSample() { } bool ignored; mFlinger.captureScreenCommon(renderArea, traverseLayers, buffer, false, ignored); mFlinger.captureScreenCommon(renderArea, traverseLayers, buffer, false /* identityTransform */, true /* regionSampling */, ignored); std::vector<Descriptor> activeDescriptors; for (const auto& descriptor : descriptors) { Loading services/surfaceflinger/SurfaceFlinger.cpp +14 −6 Original line number Diff line number Diff line Loading @@ -5668,13 +5668,13 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, usage, "screenshot"); return captureScreenCommon(renderArea, traverseLayers, *outBuffer, useIdentityTransform, outCapturedSecureLayers); false /* regionSampling */, outCapturedSecureLayers); } status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, const sp<GraphicBuffer>& buffer, bool useIdentityTransform, bool useIdentityTransform, bool regionSampling, bool& outCapturedSecureLayers) { // This mutex protects syncFd and captureResult for communication of the return values from the // main thread back to this Binder thread Loading Loading @@ -5705,7 +5705,7 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, renderArea.render([&] { result = captureScreenImplLocked(renderArea, traverseLayers, buffer.get(), useIdentityTransform, forSystem, &fd, outCapturedSecureLayers); regionSampling, outCapturedSecureLayers); }); } Loading Loading @@ -5742,7 +5742,7 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, int* outSyncFd) { bool regionSampling, int* outSyncFd) { ATRACE_CALL(); const auto reqWidth = renderArea.getReqWidth(); Loading Loading @@ -5798,6 +5798,12 @@ void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, for (auto& settings : results) { settings.geometry.positionTransform = transform.asMatrix4() * settings.geometry.positionTransform; // There's no need to process blurs when we're executing region sampling, // we're just trying to understand what we're drawing, and doing so without // blurs is already a pretty good approximation. if (regionSampling) { settings.backgroundBlurRadius = 0; } } clientCompositionLayers.insert(clientCompositionLayers.end(), std::make_move_iterator(results.begin()), Loading Loading @@ -5835,7 +5841,8 @@ status_t SurfaceFlinger::captureScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, bool forSystem, int* outSyncFd, bool& outCapturedSecureLayers) { int* outSyncFd, bool regionSampling, bool& outCapturedSecureLayers) { ATRACE_CALL(); traverseLayers([&](Layer* layer) { Loading @@ -5850,7 +5857,8 @@ status_t SurfaceFlinger::captureScreenImplLocked(const RenderArea& renderArea, ALOGW("FB is protected: PERMISSION_DENIED"); return PERMISSION_DENIED; } renderScreenImplLocked(renderArea, traverseLayers, buffer, useIdentityTransform, outSyncFd); renderScreenImplLocked(renderArea, traverseLayers, buffer, useIdentityTransform, regionSampling, outSyncFd); return NO_ERROR; } Loading services/surfaceflinger/SurfaceFlinger.h +4 −3 Original line number Diff line number Diff line Loading @@ -701,19 +701,20 @@ private: void renderScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, int* outSyncFd); bool regionSampling, int* outSyncFd); status_t captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, sp<GraphicBuffer>* outBuffer, const ui::PixelFormat reqPixelFormat, bool useIdentityTransform, bool& outCapturedSecureLayers); status_t captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, const sp<GraphicBuffer>& buffer, bool useIdentityTransform, bool& outCapturedSecureLayers); bool regionSampling, bool& outCapturedSecureLayers); const sp<DisplayDevice> getDisplayByIdOrLayerStack(uint64_t displayOrLayerStack); const sp<DisplayDevice> getDisplayByLayerStack(uint64_t layerStack); status_t captureScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, bool forSystem, int* outSyncFd, bool& outCapturedSecureLayers); bool forSystem, int* outSyncFd, bool regionSampling, bool& outCapturedSecureLayers); void traverseLayersInDisplay(const sp<const DisplayDevice>& display, const LayerVector::Visitor& visitor); Loading services/surfaceflinger/tests/unittests/CompositionTest.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -231,6 +231,7 @@ void CompositionTest::captureScreenComposition() { const Rect sourceCrop(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); constexpr bool useIdentityTransform = true; constexpr bool forSystem = true; constexpr bool regionSampling = false; DisplayRenderArea renderArea(mDisplay, sourceCrop, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT, ui::Dataspace::V0_SRGB, Loading @@ -249,7 +250,7 @@ void CompositionTest::captureScreenComposition() { int fd = -1; status_t result = mFlinger.captureScreenImplLocked(renderArea, traverseLayers, mCaptureScreenBuffer.get(), useIdentityTransform, forSystem, &fd); useIdentityTransform, forSystem, &fd, regionSampling); if (fd >= 0) { close(fd); } Loading services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +5 −4 Original line number Diff line number Diff line Loading @@ -323,13 +323,14 @@ public: auto onMessageReceived(int32_t what) { return mFlinger->onMessageReceived(what, systemTime()); } auto captureScreenImplLocked( const RenderArea& renderArea, SurfaceFlinger::TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, bool forSystem, int* outSyncFd) { auto captureScreenImplLocked(const RenderArea& renderArea, SurfaceFlinger::TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, bool forSystem, int* outSyncFd, bool regionSampling) { bool ignored; return mFlinger->captureScreenImplLocked(renderArea, traverseLayers, buffer, useIdentityTransform, forSystem, outSyncFd, ignored); regionSampling, ignored); } auto traverseLayersInDisplay(const sp<const DisplayDevice>& display, Loading Loading
services/surfaceflinger/RegionSamplingThread.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -425,7 +425,8 @@ void RegionSamplingThread::captureSample() { } bool ignored; mFlinger.captureScreenCommon(renderArea, traverseLayers, buffer, false, ignored); mFlinger.captureScreenCommon(renderArea, traverseLayers, buffer, false /* identityTransform */, true /* regionSampling */, ignored); std::vector<Descriptor> activeDescriptors; for (const auto& descriptor : descriptors) { Loading
services/surfaceflinger/SurfaceFlinger.cpp +14 −6 Original line number Diff line number Diff line Loading @@ -5668,13 +5668,13 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, usage, "screenshot"); return captureScreenCommon(renderArea, traverseLayers, *outBuffer, useIdentityTransform, outCapturedSecureLayers); false /* regionSampling */, outCapturedSecureLayers); } status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, const sp<GraphicBuffer>& buffer, bool useIdentityTransform, bool useIdentityTransform, bool regionSampling, bool& outCapturedSecureLayers) { // This mutex protects syncFd and captureResult for communication of the return values from the // main thread back to this Binder thread Loading Loading @@ -5705,7 +5705,7 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, renderArea.render([&] { result = captureScreenImplLocked(renderArea, traverseLayers, buffer.get(), useIdentityTransform, forSystem, &fd, outCapturedSecureLayers); regionSampling, outCapturedSecureLayers); }); } Loading Loading @@ -5742,7 +5742,7 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, int* outSyncFd) { bool regionSampling, int* outSyncFd) { ATRACE_CALL(); const auto reqWidth = renderArea.getReqWidth(); Loading Loading @@ -5798,6 +5798,12 @@ void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, for (auto& settings : results) { settings.geometry.positionTransform = transform.asMatrix4() * settings.geometry.positionTransform; // There's no need to process blurs when we're executing region sampling, // we're just trying to understand what we're drawing, and doing so without // blurs is already a pretty good approximation. if (regionSampling) { settings.backgroundBlurRadius = 0; } } clientCompositionLayers.insert(clientCompositionLayers.end(), std::make_move_iterator(results.begin()), Loading Loading @@ -5835,7 +5841,8 @@ status_t SurfaceFlinger::captureScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, bool forSystem, int* outSyncFd, bool& outCapturedSecureLayers) { int* outSyncFd, bool regionSampling, bool& outCapturedSecureLayers) { ATRACE_CALL(); traverseLayers([&](Layer* layer) { Loading @@ -5850,7 +5857,8 @@ status_t SurfaceFlinger::captureScreenImplLocked(const RenderArea& renderArea, ALOGW("FB is protected: PERMISSION_DENIED"); return PERMISSION_DENIED; } renderScreenImplLocked(renderArea, traverseLayers, buffer, useIdentityTransform, outSyncFd); renderScreenImplLocked(renderArea, traverseLayers, buffer, useIdentityTransform, regionSampling, outSyncFd); return NO_ERROR; } Loading
services/surfaceflinger/SurfaceFlinger.h +4 −3 Original line number Diff line number Diff line Loading @@ -701,19 +701,20 @@ private: void renderScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, int* outSyncFd); bool regionSampling, int* outSyncFd); status_t captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, sp<GraphicBuffer>* outBuffer, const ui::PixelFormat reqPixelFormat, bool useIdentityTransform, bool& outCapturedSecureLayers); status_t captureScreenCommon(RenderArea& renderArea, TraverseLayersFunction traverseLayers, const sp<GraphicBuffer>& buffer, bool useIdentityTransform, bool& outCapturedSecureLayers); bool regionSampling, bool& outCapturedSecureLayers); const sp<DisplayDevice> getDisplayByIdOrLayerStack(uint64_t displayOrLayerStack); const sp<DisplayDevice> getDisplayByLayerStack(uint64_t layerStack); status_t captureScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, bool forSystem, int* outSyncFd, bool& outCapturedSecureLayers); bool forSystem, int* outSyncFd, bool regionSampling, bool& outCapturedSecureLayers); void traverseLayersInDisplay(const sp<const DisplayDevice>& display, const LayerVector::Visitor& visitor); Loading
services/surfaceflinger/tests/unittests/CompositionTest.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -231,6 +231,7 @@ void CompositionTest::captureScreenComposition() { const Rect sourceCrop(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); constexpr bool useIdentityTransform = true; constexpr bool forSystem = true; constexpr bool regionSampling = false; DisplayRenderArea renderArea(mDisplay, sourceCrop, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT, ui::Dataspace::V0_SRGB, Loading @@ -249,7 +250,7 @@ void CompositionTest::captureScreenComposition() { int fd = -1; status_t result = mFlinger.captureScreenImplLocked(renderArea, traverseLayers, mCaptureScreenBuffer.get(), useIdentityTransform, forSystem, &fd); useIdentityTransform, forSystem, &fd, regionSampling); if (fd >= 0) { close(fd); } Loading
services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +5 −4 Original line number Diff line number Diff line Loading @@ -323,13 +323,14 @@ public: auto onMessageReceived(int32_t what) { return mFlinger->onMessageReceived(what, systemTime()); } auto captureScreenImplLocked( const RenderArea& renderArea, SurfaceFlinger::TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, bool forSystem, int* outSyncFd) { auto captureScreenImplLocked(const RenderArea& renderArea, SurfaceFlinger::TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, bool forSystem, int* outSyncFd, bool regionSampling) { bool ignored; return mFlinger->captureScreenImplLocked(renderArea, traverseLayers, buffer, useIdentityTransform, forSystem, outSyncFd, ignored); regionSampling, ignored); } auto traverseLayersInDisplay(const sp<const DisplayDevice>& display, Loading