Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8bf4487a authored by Melody Hsu's avatar Melody Hsu Committed by Android (Google) Code Review
Browse files

Merge "Revert "Refactor of screenshot code on main thread."" into main

parents 69a37091 787d302b
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -377,7 +377,7 @@ void RegionSamplingThread::captureSample() {
    constexpr bool kIsProtected = false;
    constexpr bool kIsProtected = false;


    if (const auto fenceResult =
    if (const auto fenceResult =
                mFlinger.captureScreenshot(std::move(renderAreaFuture), getLayerSnapshots, buffer,
                mFlinger.captureScreenCommon(std::move(renderAreaFuture), getLayerSnapshots, buffer,
                                             kRegionSampling, kGrayscale, kIsProtected, nullptr)
                                             kRegionSampling, kGrayscale, kIsProtected, nullptr)
                        .get();
                        .get();
        fenceResult.ok()) {
        fenceResult.ok()) {
+49 −55
Original line number Original line Diff line number Diff line
@@ -8069,19 +8069,6 @@ void SurfaceFlinger::captureLayers(const LayerCaptureArgs& args,
                        args.allowProtected, args.grayscale, captureListener);
                        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,
void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture,
                                         GetLayerSnapshotsFunction getLayerSnapshots,
                                         GetLayerSnapshotsFunction getLayerSnapshots,
                                         ui::Size bufferSize, ui::PixelFormat reqPixelFormat,
                                         ui::Size bufferSize, ui::PixelFormat reqPixelFormat,
@@ -8097,9 +8084,6 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture,
        return;
        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
    // 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.
    // 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
    // A protected layer has no implication on whether it's secure, which is explicitly set by
@@ -8107,7 +8091,18 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture,
    const bool supportsProtected = getRenderEngine().supportsProtectedContent();
    const bool supportsProtected = getRenderEngine().supportsProtectedContent();
    bool hasProtectedLayer = false;
    bool hasProtectedLayer = false;
    if (allowProtected && supportsProtected) {
    if (allowProtected && supportsProtected) {
        hasProtectedLayer = layersHasProtectedLayer(layers);
        hasProtectedLayer = mScheduler
                                    ->schedule([=]() {
                                        bool protectedLayerFound = false;
                                        auto layers = getLayerSnapshots();
                                        for (auto& [_, layerFe] : layers) {
                                            protectedLayerFound |=
                                                    (layerFe->mSnapshot->isVisible &&
                                                     layerFe->mSnapshot->hasProtectedContent);
                                        }
                                        return protectedLayerFound;
                                    })
                                    .get();
    }
    }
    const bool isProtected = hasProtectedLayer && allowProtected && supportsProtected;
    const bool isProtected = hasProtectedLayer && allowProtected && supportsProtected;
    const uint32_t usage = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_RENDER |
    const uint32_t usage = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_RENDER |
@@ -8132,19 +8127,20 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture,
            renderengine::impl::ExternalTexture>(buffer, getRenderEngine(),
            renderengine::impl::ExternalTexture>(buffer, getRenderEngine(),
                                                 renderengine::impl::ExternalTexture::Usage::
                                                 renderengine::impl::ExternalTexture::Usage::
                                                         WRITEABLE);
                                                         WRITEABLE);
    auto futureFence =
    auto fence = captureScreenCommon(std::move(renderAreaFuture), getLayerSnapshots, texture,
            captureScreenshot(std::move(renderAreaFuture), getLayerSnapshots, texture,
                                     false /* regionSampling */, grayscale, isProtected,
                              false /* regionSampling */, grayscale, isProtected, captureListener);
                                     captureListener);
    futureFence.get();
    fence.get();
}
}


ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot(
ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenCommon(
        RenderAreaFuture renderAreaFuture, GetLayerSnapshotsFunction getLayerSnapshots,
        RenderAreaFuture renderAreaFuture, GetLayerSnapshotsFunction getLayerSnapshots,
        const std::shared_ptr<renderengine::ExternalTexture>& buffer, bool regionSampling,
        const std::shared_ptr<renderengine::ExternalTexture>& buffer, bool regionSampling,
        bool grayscale, bool isProtected, const sp<IScreenCaptureListener>& captureListener) {
        bool grayscale, bool isProtected, const sp<IScreenCaptureListener>& captureListener) {
    ATRACE_CALL();
    ATRACE_CALL();


    auto takeScreenshotFn = [=, this, renderAreaFuture = std::move(renderAreaFuture)]() REQUIRES(
    auto future = mScheduler->schedule(
            [=, this, renderAreaFuture = std::move(renderAreaFuture)]() FTL_FAKE_GUARD(
                    kMainThreadContext) mutable -> ftl::SharedFuture<FenceResult> {
                    kMainThreadContext) mutable -> ftl::SharedFuture<FenceResult> {
                ScreenCaptureResults captureResults;
                ScreenCaptureResults captureResults;
                std::shared_ptr<RenderArea> renderArea = renderAreaFuture.get();
                std::shared_ptr<RenderArea> renderArea = renderAreaFuture.get();
@@ -8159,7 +8155,8 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot(


                ftl::SharedFuture<FenceResult> renderFuture;
                ftl::SharedFuture<FenceResult> renderFuture;
                renderArea->render([&]() FTL_FAKE_GUARD(kMainThreadContext) {
                renderArea->render([&]() FTL_FAKE_GUARD(kMainThreadContext) {
            renderFuture = renderScreenImpl(renderArea, getLayerSnapshots, buffer, regionSampling,
                    renderFuture =
                            renderScreenImpl(renderArea, getLayerSnapshots, buffer, regionSampling,
                                             grayscale, isProtected, captureResults);
                                             grayscale, isProtected, captureResults);
                });
                });


@@ -8175,10 +8172,7 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot(
                            .share();
                            .share();
                }
                }
                return renderFuture;
                return renderFuture;
    };
            });

    auto future =
            mScheduler->schedule(FTL_FAKE_GUARD(kMainThreadContext, std::move(takeScreenshotFn)));


    // Flatten nested futures.
    // Flatten nested futures.
    auto chain = ftl::Future(std::move(future)).then([](ftl::SharedFuture<FenceResult> future) {
    auto chain = ftl::Future(std::move(future)).then([](ftl::SharedFuture<FenceResult> future) {
+1 −5
Original line number Original line Diff line number Diff line
@@ -874,17 +874,13 @@ private:
    // Boot animation, on/off animations and screen capture
    // Boot animation, on/off animations and screen capture
    void startBootAnim();
    void startBootAnim();


    bool layersHasProtectedLayer(const std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) const;

    void captureScreenCommon(RenderAreaFuture, GetLayerSnapshotsFunction, ui::Size bufferSize,
    void captureScreenCommon(RenderAreaFuture, GetLayerSnapshotsFunction, ui::Size bufferSize,
                             ui::PixelFormat, bool allowProtected, bool grayscale,
                             ui::PixelFormat, bool allowProtected, bool grayscale,
                             const sp<IScreenCaptureListener>&);
                             const sp<IScreenCaptureListener>&);

    ftl::SharedFuture<FenceResult> captureScreenCommon(
    ftl::SharedFuture<FenceResult> captureScreenshot(
            RenderAreaFuture, GetLayerSnapshotsFunction,
            RenderAreaFuture, GetLayerSnapshotsFunction,
            const std::shared_ptr<renderengine::ExternalTexture>&, bool regionSampling,
            const std::shared_ptr<renderengine::ExternalTexture>&, bool regionSampling,
            bool grayscale, bool isProtected, const sp<IScreenCaptureListener>&);
            bool grayscale, bool isProtected, const sp<IScreenCaptureListener>&);

    ftl::SharedFuture<FenceResult> renderScreenImpl(
    ftl::SharedFuture<FenceResult> renderScreenImpl(
            std::shared_ptr<const RenderArea>, GetLayerSnapshotsFunction,
            std::shared_ptr<const RenderArea>, GetLayerSnapshotsFunction,
            const std::shared_ptr<renderengine::ExternalTexture>&, bool regionSampling,
            const std::shared_ptr<renderengine::ExternalTexture>&, bool regionSampling,