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

Commit c5545d52 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Allow latch unsignaled if there are no flag changes

Instead of checking the change flags, check if the value
of the flags changed instead.

Change-Id: I0999609666ff78a3af8ba55c88835a9a5a74e8bc
Test: presubmit
Fixes: 340362109
parent 5ad607e9
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -588,23 +588,22 @@ bool RequestedLayerState::isSimpleBufferUpdate(const layer_state_t& s) const {

    const uint64_t deniedFlags = layer_state_t::eProducerDisconnect | layer_state_t::eLayerChanged |
            layer_state_t::eRelativeLayerChanged | layer_state_t::eTransparentRegionChanged |
            layer_state_t::eFlagsChanged | layer_state_t::eBlurRegionsChanged |
            layer_state_t::eLayerStackChanged | layer_state_t::eReparent |
            layer_state_t::eBlurRegionsChanged | layer_state_t::eLayerStackChanged |
            layer_state_t::eReparent |
            (FlagManager::getInstance().latch_unsignaled_with_auto_refresh_changed()
                     ? 0
                     : layer_state_t::eAutoRefreshChanged);
                     : (layer_state_t::eAutoRefreshChanged | layer_state_t::eFlagsChanged));
    if (s.what & deniedFlags) {
        ATRACE_FORMAT_INSTANT("%s: false [has denied flags 0x%" PRIx64 "]", __func__,
                              s.what & deniedFlags);
        return false;
    }

    bool changedFlags = diff(s);
    static constexpr auto deniedChanges = layer_state_t::ePositionChanged |
            layer_state_t::eAlphaChanged | layer_state_t::eColorTransformChanged |
            layer_state_t::eBackgroundColorChanged | layer_state_t::eMatrixChanged |
            layer_state_t::eCornerRadiusChanged | layer_state_t::eBackgroundBlurRadiusChanged |
            layer_state_t::eBufferTransformChanged |
    const uint64_t changedFlags = diff(s);
    const uint64_t deniedChanges = layer_state_t::ePositionChanged | layer_state_t::eAlphaChanged |
            layer_state_t::eColorTransformChanged | layer_state_t::eBackgroundColorChanged |
            layer_state_t::eMatrixChanged | layer_state_t::eCornerRadiusChanged |
            layer_state_t::eBackgroundBlurRadiusChanged | layer_state_t::eBufferTransformChanged |
            layer_state_t::eTransformToDisplayInverseChanged | layer_state_t::eCropChanged |
            layer_state_t::eDataspaceChanged | layer_state_t::eHdrMetadataChanged |
            layer_state_t::eSidebandStreamChanged | layer_state_t::eColorSpaceAgnosticChanged |
@@ -612,10 +611,13 @@ bool RequestedLayerState::isSimpleBufferUpdate(const layer_state_t& s) const {
            layer_state_t::eTrustedOverlayChanged | layer_state_t::eStretchChanged |
            layer_state_t::eBufferCropChanged | layer_state_t::eDestinationFrameChanged |
            layer_state_t::eDimmingEnabledChanged | layer_state_t::eExtendedRangeBrightnessChanged |
            layer_state_t::eDesiredHdrHeadroomChanged;
            layer_state_t::eDesiredHdrHeadroomChanged |
            (FlagManager::getInstance().latch_unsignaled_with_auto_refresh_changed()
                     ? layer_state_t::eFlagsChanged
                     : 0);
    if (changedFlags & deniedChanges) {
        ATRACE_FORMAT_INSTANT("%s: false [has denied changes flags 0x%" PRIx64 "]", __func__,
                              s.what & deniedChanges);
                              changedFlags & deniedChanges);
        return false;
    }

+37 −0
Original line number Diff line number Diff line
@@ -592,4 +592,41 @@ TEST_F(LayerLifecycleManagerTest, layerSecureChangesSetsVisibilityChangeFlag) {
    mLifecycleManager.commitChanges();
}

TEST_F(LayerLifecycleManagerTest, isSimpleBufferUpdate) {
    auto layer = rootLayer(1);

    // no buffer changes
    EXPECT_FALSE(layer->isSimpleBufferUpdate({}));

    {
        layer_state_t state;
        state.what = layer_state_t::eBufferChanged;
        EXPECT_TRUE(layer->isSimpleBufferUpdate(state));
    }

    {
        layer_state_t state;
        state.what = layer_state_t::eReparent | layer_state_t::eBufferChanged;
        EXPECT_FALSE(layer->isSimpleBufferUpdate(state));
    }

    {
        layer_state_t state;
        state.what = layer_state_t::ePositionChanged | layer_state_t::eBufferChanged;
        state.x = 9;
        state.y = 10;
        EXPECT_FALSE(layer->isSimpleBufferUpdate(state));
    }

    {
        layer->x = 9;
        layer->y = 10;
        layer_state_t state;
        state.what = layer_state_t::ePositionChanged | layer_state_t::eBufferChanged;
        state.x = 9;
        state.y = 10;
        EXPECT_TRUE(layer->isSimpleBufferUpdate(state));
    }
}

} // namespace android::surfaceflinger::frontend