Loading services/surfaceflinger/RegionSamplingThread.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -377,7 +377,7 @@ void RegionSamplingThread::captureSample() { constexpr bool kIsProtected = false; if (const auto fenceResult = mFlinger.captureScreenCommon(std::move(renderAreaFuture), getLayerSnapshots, buffer, mFlinger.captureScreenshot(std::move(renderAreaFuture), getLayerSnapshots, buffer, kRegionSampling, kGrayscale, kIsProtected, nullptr) .get(); fenceResult.ok()) { Loading services/surfaceflinger/SurfaceFlinger.cpp +55 −49 Original line number Diff line number Diff line Loading @@ -8063,6 +8063,19 @@ void SurfaceFlinger::captureLayers(const LayerCaptureArgs& args, args.allowProtected, args.grayscale, captureListener); } bool SurfaceFlinger::layersHasProtectedLayer( const std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) const { bool protectedLayerFound = false; for (auto& [_, layerFe] : layers) { protectedLayerFound |= (layerFe->mSnapshot->isVisible && layerFe->mSnapshot->hasProtectedContent); if (protectedLayerFound) { break; } } return protectedLayerFound; } void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture, GetLayerSnapshotsFunction getLayerSnapshots, ui::Size bufferSize, ui::PixelFormat reqPixelFormat, Loading @@ -8078,6 +8091,9 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture, return; } // Snapshots must be taken from the main thread. auto layers = mScheduler->schedule([=]() { return getLayerSnapshots(); }).get(); // Loop over all visible layers to see whether there's any protected layer. A protected layer is // typically a layer with DRM contents, or have the GRALLOC_USAGE_PROTECTED set on the buffer. // A protected layer has no implication on whether it's secure, which is explicitly set by Loading @@ -8085,18 +8101,7 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture, const bool supportsProtected = getRenderEngine().supportsProtectedContent(); bool hasProtectedLayer = false; if (allowProtected && supportsProtected) { hasProtectedLayer = mScheduler ->schedule([=]() { bool protectedLayerFound = false; auto layers = getLayerSnapshots(); for (auto& [_, layerFe] : layers) { protectedLayerFound |= (layerFe->mSnapshot->isVisible && layerFe->mSnapshot->hasProtectedContent); } return protectedLayerFound; }) .get(); hasProtectedLayer = layersHasProtectedLayer(layers); } const bool isProtected = hasProtectedLayer && allowProtected && supportsProtected; const uint32_t usage = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_RENDER | Loading @@ -8121,20 +8126,19 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture, renderengine::impl::ExternalTexture>(buffer, getRenderEngine(), renderengine::impl::ExternalTexture::Usage:: WRITEABLE); auto fence = captureScreenCommon(std::move(renderAreaFuture), getLayerSnapshots, texture, false /* regionSampling */, grayscale, isProtected, captureListener); fence.get(); auto futureFence = captureScreenshot(std::move(renderAreaFuture), getLayerSnapshots, texture, false /* regionSampling */, grayscale, isProtected, captureListener); futureFence.get(); } ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenCommon( ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot( RenderAreaFuture renderAreaFuture, GetLayerSnapshotsFunction getLayerSnapshots, const std::shared_ptr<renderengine::ExternalTexture>& buffer, bool regionSampling, bool grayscale, bool isProtected, const sp<IScreenCaptureListener>& captureListener) { ATRACE_CALL(); auto future = mScheduler->schedule( [=, this, renderAreaFuture = std::move(renderAreaFuture)]() FTL_FAKE_GUARD( auto takeScreenshotFn = [=, this, renderAreaFuture = std::move(renderAreaFuture)]() REQUIRES( kMainThreadContext) mutable -> ftl::SharedFuture<FenceResult> { ScreenCaptureResults captureResults; std::shared_ptr<RenderArea> renderArea = renderAreaFuture.get(); Loading @@ -8149,8 +8153,7 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenCommon( ftl::SharedFuture<FenceResult> renderFuture; renderArea->render([&]() FTL_FAKE_GUARD(kMainThreadContext) { renderFuture = renderScreenImpl(renderArea, getLayerSnapshots, buffer, regionSampling, renderFuture = renderScreenImpl(renderArea, getLayerSnapshots, buffer, regionSampling, grayscale, isProtected, captureResults); }); Loading @@ -8166,7 +8169,10 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenCommon( .share(); } return renderFuture; }); }; auto future = mScheduler->schedule(FTL_FAKE_GUARD(kMainThreadContext, std::move(takeScreenshotFn))); // Flatten nested futures. auto chain = ftl::Future(std::move(future)).then([](ftl::SharedFuture<FenceResult> future) { Loading services/surfaceflinger/SurfaceFlinger.h +5 −1 Original line number Diff line number Diff line Loading @@ -874,13 +874,17 @@ private: // Boot animation, on/off animations and screen capture void startBootAnim(); bool layersHasProtectedLayer(const std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) const; void captureScreenCommon(RenderAreaFuture, GetLayerSnapshotsFunction, ui::Size bufferSize, ui::PixelFormat, bool allowProtected, bool grayscale, const sp<IScreenCaptureListener>&); ftl::SharedFuture<FenceResult> captureScreenCommon( ftl::SharedFuture<FenceResult> captureScreenshot( RenderAreaFuture, GetLayerSnapshotsFunction, const std::shared_ptr<renderengine::ExternalTexture>&, bool regionSampling, bool grayscale, bool isProtected, const sp<IScreenCaptureListener>&); ftl::SharedFuture<FenceResult> renderScreenImpl( std::shared_ptr<const RenderArea>, GetLayerSnapshotsFunction, const std::shared_ptr<renderengine::ExternalTexture>&, bool regionSampling, Loading Loading
services/surfaceflinger/RegionSamplingThread.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -377,7 +377,7 @@ void RegionSamplingThread::captureSample() { constexpr bool kIsProtected = false; if (const auto fenceResult = mFlinger.captureScreenCommon(std::move(renderAreaFuture), getLayerSnapshots, buffer, mFlinger.captureScreenshot(std::move(renderAreaFuture), getLayerSnapshots, buffer, kRegionSampling, kGrayscale, kIsProtected, nullptr) .get(); fenceResult.ok()) { Loading
services/surfaceflinger/SurfaceFlinger.cpp +55 −49 Original line number Diff line number Diff line Loading @@ -8063,6 +8063,19 @@ void SurfaceFlinger::captureLayers(const LayerCaptureArgs& args, args.allowProtected, args.grayscale, captureListener); } bool SurfaceFlinger::layersHasProtectedLayer( const std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) const { bool protectedLayerFound = false; for (auto& [_, layerFe] : layers) { protectedLayerFound |= (layerFe->mSnapshot->isVisible && layerFe->mSnapshot->hasProtectedContent); if (protectedLayerFound) { break; } } return protectedLayerFound; } void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture, GetLayerSnapshotsFunction getLayerSnapshots, ui::Size bufferSize, ui::PixelFormat reqPixelFormat, Loading @@ -8078,6 +8091,9 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture, return; } // Snapshots must be taken from the main thread. auto layers = mScheduler->schedule([=]() { return getLayerSnapshots(); }).get(); // Loop over all visible layers to see whether there's any protected layer. A protected layer is // typically a layer with DRM contents, or have the GRALLOC_USAGE_PROTECTED set on the buffer. // A protected layer has no implication on whether it's secure, which is explicitly set by Loading @@ -8085,18 +8101,7 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture, const bool supportsProtected = getRenderEngine().supportsProtectedContent(); bool hasProtectedLayer = false; if (allowProtected && supportsProtected) { hasProtectedLayer = mScheduler ->schedule([=]() { bool protectedLayerFound = false; auto layers = getLayerSnapshots(); for (auto& [_, layerFe] : layers) { protectedLayerFound |= (layerFe->mSnapshot->isVisible && layerFe->mSnapshot->hasProtectedContent); } return protectedLayerFound; }) .get(); hasProtectedLayer = layersHasProtectedLayer(layers); } const bool isProtected = hasProtectedLayer && allowProtected && supportsProtected; const uint32_t usage = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_RENDER | Loading @@ -8121,20 +8126,19 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture, renderengine::impl::ExternalTexture>(buffer, getRenderEngine(), renderengine::impl::ExternalTexture::Usage:: WRITEABLE); auto fence = captureScreenCommon(std::move(renderAreaFuture), getLayerSnapshots, texture, false /* regionSampling */, grayscale, isProtected, captureListener); fence.get(); auto futureFence = captureScreenshot(std::move(renderAreaFuture), getLayerSnapshots, texture, false /* regionSampling */, grayscale, isProtected, captureListener); futureFence.get(); } ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenCommon( ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot( RenderAreaFuture renderAreaFuture, GetLayerSnapshotsFunction getLayerSnapshots, const std::shared_ptr<renderengine::ExternalTexture>& buffer, bool regionSampling, bool grayscale, bool isProtected, const sp<IScreenCaptureListener>& captureListener) { ATRACE_CALL(); auto future = mScheduler->schedule( [=, this, renderAreaFuture = std::move(renderAreaFuture)]() FTL_FAKE_GUARD( auto takeScreenshotFn = [=, this, renderAreaFuture = std::move(renderAreaFuture)]() REQUIRES( kMainThreadContext) mutable -> ftl::SharedFuture<FenceResult> { ScreenCaptureResults captureResults; std::shared_ptr<RenderArea> renderArea = renderAreaFuture.get(); Loading @@ -8149,8 +8153,7 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenCommon( ftl::SharedFuture<FenceResult> renderFuture; renderArea->render([&]() FTL_FAKE_GUARD(kMainThreadContext) { renderFuture = renderScreenImpl(renderArea, getLayerSnapshots, buffer, regionSampling, renderFuture = renderScreenImpl(renderArea, getLayerSnapshots, buffer, regionSampling, grayscale, isProtected, captureResults); }); Loading @@ -8166,7 +8169,10 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenCommon( .share(); } return renderFuture; }); }; auto future = mScheduler->schedule(FTL_FAKE_GUARD(kMainThreadContext, std::move(takeScreenshotFn))); // Flatten nested futures. auto chain = ftl::Future(std::move(future)).then([](ftl::SharedFuture<FenceResult> future) { Loading
services/surfaceflinger/SurfaceFlinger.h +5 −1 Original line number Diff line number Diff line Loading @@ -874,13 +874,17 @@ private: // Boot animation, on/off animations and screen capture void startBootAnim(); bool layersHasProtectedLayer(const std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) const; void captureScreenCommon(RenderAreaFuture, GetLayerSnapshotsFunction, ui::Size bufferSize, ui::PixelFormat, bool allowProtected, bool grayscale, const sp<IScreenCaptureListener>&); ftl::SharedFuture<FenceResult> captureScreenCommon( ftl::SharedFuture<FenceResult> captureScreenshot( RenderAreaFuture, GetLayerSnapshotsFunction, const std::shared_ptr<renderengine::ExternalTexture>&, bool regionSampling, bool grayscale, bool isProtected, const sp<IScreenCaptureListener>&); ftl::SharedFuture<FenceResult> renderScreenImpl( std::shared_ptr<const RenderArea>, GetLayerSnapshotsFunction, const std::shared_ptr<renderengine::ExternalTexture>&, bool regionSampling, Loading