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

Commit 7584c6a6 authored by Patrick Williams's avatar Patrick Williams
Browse files

SF: refactor renderScreenImpl to use CompositionEngine

Bug: 238643986
Test: presubmits
Test: go/wm-smoke

Change-Id: I6dbbcd5ce5070ec1d801dca55b5bb89fafe839cb
parent c7edc680
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -189,6 +189,7 @@ filegroup {
        "Scheduler/VsyncConfiguration.cpp",
        "Scheduler/VsyncModulator.cpp",
        "Scheduler/VsyncSchedule.cpp",
        "ScreenCaptureOutput.cpp",
        "StartPropertySetThread.cpp",
        "SurfaceFlinger.cpp",
        "SurfaceFlingerDefaultFactory.cpp",
+2 −0
Original line number Diff line number Diff line
@@ -134,9 +134,11 @@ protected:
    void applyCompositionStrategy(const std::optional<DeviceRequestedChanges>&) override{};
    bool getSkipColorTransform() const override;
    compositionengine::Output::FrameFences presentAndGetFrameFences() override;
    virtual renderengine::DisplaySettings generateClientCompositionDisplaySettings() const;
    std::vector<LayerFE::LayerSettings> generateClientCompositionRequests(
          bool supportsProtectedContent, ui::Dataspace outputDataspace,
          std::vector<LayerFE*> &outLayerFEs) override;
    virtual bool layerNeedsFiltering(const OutputLayer*) const;
    void appendRegionFlashRequests(const Region&, std::vector<LayerFE::LayerSettings>&) override;
    void setExpensiveRenderingExpected(bool enabled) override;
    void setHintSessionGpuFence(std::unique_ptr<FenceTime>&& gpuFence) override;
+47 −35
Original line number Diff line number Diff line
@@ -1226,40 +1226,8 @@ std::optional<base::unique_fd> Output::composeSurfaces(

    ALOGV("hasClientComposition");

    renderengine::DisplaySettings clientCompositionDisplay;
    clientCompositionDisplay.physicalDisplay = outputState.framebufferSpace.getContent();
    clientCompositionDisplay.clip = outputState.layerStackSpace.getContent();
    clientCompositionDisplay.orientation =
            ui::Transform::toRotationFlags(outputState.displaySpace.getOrientation());
    clientCompositionDisplay.outputDataspace = mDisplayColorProfile->hasWideColorGamut()
            ? outputState.dataspace
            : ui::Dataspace::UNKNOWN;

    // If we have a valid current display brightness use that, otherwise fall back to the
    // display's max desired
    clientCompositionDisplay.currentLuminanceNits = outputState.displayBrightnessNits > 0.f
            ? outputState.displayBrightnessNits
            : mDisplayColorProfile->getHdrCapabilities().getDesiredMaxLuminance();
    clientCompositionDisplay.maxLuminance =
            mDisplayColorProfile->getHdrCapabilities().getDesiredMaxLuminance();
    clientCompositionDisplay.targetLuminanceNits =
            outputState.clientTargetBrightness * outputState.displayBrightnessNits;
    clientCompositionDisplay.dimmingStage = outputState.clientTargetDimmingStage;
    clientCompositionDisplay.renderIntent =
            static_cast<aidl::android::hardware::graphics::composer3::RenderIntent>(
                    outputState.renderIntent);

    // Compute the global color transform matrix.
    clientCompositionDisplay.colorTransform = outputState.colorTransformMatrix;
    for (auto& info : outputState.borderInfoList) {
        renderengine::BorderRenderInfo borderInfo;
        borderInfo.width = info.width;
        borderInfo.color = info.color;
        borderInfo.combinedRegion = info.combinedRegion;
        clientCompositionDisplay.borderInfoList.emplace_back(std::move(borderInfo));
    }
    clientCompositionDisplay.deviceHandlesColorTransform =
            outputState.usesDeviceComposition || getSkipColorTransform();
    renderengine::DisplaySettings clientCompositionDisplay =
            generateClientCompositionDisplaySettings();

    // Generate the client composition requests for the layers on this output.
    auto& renderEngine = getCompositionEngine().getRenderEngine();
@@ -1350,6 +1318,46 @@ std::optional<base::unique_fd> Output::composeSurfaces(
    return base::unique_fd(fence->dup());
}

renderengine::DisplaySettings Output::generateClientCompositionDisplaySettings() const {
    const auto& outputState = getState();

    renderengine::DisplaySettings clientCompositionDisplay;
    clientCompositionDisplay.physicalDisplay = outputState.framebufferSpace.getContent();
    clientCompositionDisplay.clip = outputState.layerStackSpace.getContent();
    clientCompositionDisplay.orientation =
            ui::Transform::toRotationFlags(outputState.displaySpace.getOrientation());
    clientCompositionDisplay.outputDataspace = mDisplayColorProfile->hasWideColorGamut()
            ? outputState.dataspace
            : ui::Dataspace::UNKNOWN;

    // If we have a valid current display brightness use that, otherwise fall back to the
    // display's max desired
    clientCompositionDisplay.currentLuminanceNits = outputState.displayBrightnessNits > 0.f
            ? outputState.displayBrightnessNits
            : mDisplayColorProfile->getHdrCapabilities().getDesiredMaxLuminance();
    clientCompositionDisplay.maxLuminance =
            mDisplayColorProfile->getHdrCapabilities().getDesiredMaxLuminance();
    clientCompositionDisplay.targetLuminanceNits =
            outputState.clientTargetBrightness * outputState.displayBrightnessNits;
    clientCompositionDisplay.dimmingStage = outputState.clientTargetDimmingStage;
    clientCompositionDisplay.renderIntent =
            static_cast<aidl::android::hardware::graphics::composer3::RenderIntent>(
                    outputState.renderIntent);

    // Compute the global color transform matrix.
    clientCompositionDisplay.colorTransform = outputState.colorTransformMatrix;
    for (auto& info : outputState.borderInfoList) {
        renderengine::BorderRenderInfo borderInfo;
        borderInfo.width = info.width;
        borderInfo.color = info.color;
        borderInfo.combinedRegion = info.combinedRegion;
        clientCompositionDisplay.borderInfoList.emplace_back(std::move(borderInfo));
    }
    clientCompositionDisplay.deviceHandlesColorTransform =
            outputState.usesDeviceComposition || getSkipColorTransform();
    return clientCompositionDisplay;
}

std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests(
      bool supportsProtectedContent, ui::Dataspace outputDataspace, std::vector<LayerFE*>& outLayerFEs) {
    std::vector<LayerFE::LayerSettings> clientCompositionLayers;
@@ -1415,7 +1423,7 @@ std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests(
                                             Enabled);
                compositionengine::LayerFE::ClientCompositionTargetSettings
                        targetSettings{.clip = clip,
                                       .needsFiltering = layer->needsFiltering() ||
                                       .needsFiltering = layerNeedsFiltering(layer) ||
                                               outputState.needsFiltering,
                                       .isSecure = outputState.isSecure,
                                       .supportsProtectedContent = supportsProtectedContent,
@@ -1446,6 +1454,10 @@ std::vector<LayerFE::LayerSettings> Output::generateClientCompositionRequests(
    return clientCompositionLayers;
}

bool Output::layerNeedsFiltering(const compositionengine::OutputLayer* layer) const {
    return layer->needsFiltering();
}

void Output::appendRegionFlashRequests(
        const Region& flashRegion, std::vector<LayerFE::LayerSettings>& clientCompositionLayers) {
    if (flashRegion.isEmpty()) {
+6 −0
Original line number Diff line number Diff line
@@ -3499,6 +3499,12 @@ const compositionengine::LayerFECompositionState* Layer::getCompositionState() c
    return mSnapshot.get();
}

sp<LayerFE> Layer::copyCompositionEngineLayerFE() const {
    auto result = mFlinger->getFactory().createLayerFE(mLayerFE->getDebugName());
    result->mSnapshot = std::make_unique<LayerSnapshot>(*mSnapshot);
    return result;
}

void Layer::useSurfaceDamage() {
    if (mFlinger->mForceFullDamage) {
        surfaceDamageRegion = Region::INVALID_REGION;
+1 −0
Original line number Diff line number Diff line
@@ -323,6 +323,7 @@ public:
    ui::Dataspace getRequestedDataSpace() const;

    virtual sp<LayerFE> getCompositionEngineLayerFE() const;
    virtual sp<LayerFE> copyCompositionEngineLayerFE() const;

    const LayerSnapshot* getLayerSnapshot() const;
    LayerSnapshot* editLayerSnapshot();
Loading