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

Commit ab89d814 authored by Wenhui Yang's avatar Wenhui Yang
Browse files

Fix the input info missing for SurfaceView

Layer snapshots with buffers but without inputinfo were not sent to input or other window info listeners. This was due to a bug in how we checked to see if the layer needed an input info. FIx this to send SurfaceView layers to window info listeners.

Fixes: 365167765
Test: LayerSnapshotTest
Test: LayerLifecycleManagerTest
Flag: EXEMPT bugfix
Change-Id: I49e5d1e503af860a8324cc8b36589748ca2b7a25
parent 45833f21
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -139,9 +139,9 @@ sp<Surface> SurfaceControl::generateSurfaceLocked()
    uint32_t ignore;
    auto flags = mCreateFlags & (ISurfaceComposerClient::eCursorWindow |
                                 ISurfaceComposerClient::eOpaque);
    mBbqChild = mClient->createSurface(String8("bbq-wrapper"), 0, 0, mFormat,
    mBbqChild = mClient->createSurface(String8::format("[BBQ] %s", mName.c_str()), 0, 0, mFormat,
                                       flags, mHandle, {}, &ignore);
    mBbq = sp<BLASTBufferQueue>::make("bbq-adapter", mBbqChild, mWidth, mHeight, mFormat);
    mBbq = sp<BLASTBufferQueue>::make("[BBQ]" + mName, mBbqChild, mWidth, mHeight, mFormat);

    // This surface is always consumed by SurfaceFlinger, so the
    // producerControlledByApp value doesn't matter; using false.
+2 −20
Original line number Diff line number Diff line
@@ -279,24 +279,6 @@ void updateVisibility(LayerSnapshot& snapshot, bool visible) {
          snapshot.getDebugString().c_str());
}

bool needsInputInfo(const LayerSnapshot& snapshot, const RequestedLayerState& requested) {
    if (requested.potentialCursor) {
        return false;
    }

    if (snapshot.inputInfo.token != nullptr) {
        return true;
    }

    if (snapshot.hasBufferOrSidebandStream()) {
        return true;
    }

    return requested.windowInfoHandle &&
            requested.windowInfoHandle->getInfo()->inputConfig.test(
                    gui::WindowInfo::InputConfig::NO_INPUT_CHANNEL);
}

void updateMetadata(LayerSnapshot& snapshot, const RequestedLayerState& requested,
                    const LayerSnapshotBuilder::Args& args) {
    snapshot.metadata.clear();
@@ -1162,7 +1144,7 @@ void LayerSnapshotBuilder::updateInput(LayerSnapshot& snapshot,
    }

    updateVisibility(snapshot, snapshot.isVisible);
    if (!needsInputInfo(snapshot, requested)) {
    if (!requested.needsInputInfo()) {
        return;
    }

@@ -1172,7 +1154,7 @@ void LayerSnapshotBuilder::updateInput(LayerSnapshot& snapshot,
    bool noValidDisplay = !displayInfoOpt.has_value();
    auto displayInfo = displayInfoOpt.value_or(sDefaultInfo);

    if (!requested.windowInfoHandle) {
    if (!requested.hasInputInfo()) {
        snapshot.inputInfo.inputConfig = InputConfig::NO_INPUT_CHANNEL;
    }
    fillInputFrameInfo(snapshot.inputInfo, displayInfo.transform, snapshot);
+20 −0
Original line number Diff line number Diff line
@@ -62,6 +62,8 @@ RequestedLayerState::RequestedLayerState(const LayerCreationArgs& args)
    metadata.merge(args.metadata);
    changes |= RequestedLayerState::Changes::Metadata;
    handleAlive = true;
    // TODO: b/305254099 remove once we don't pass invisible windows to input
    windowInfoHandle = nullptr;
    if (parentId != UNASSIGNED_LAYER_ID) {
        canBeRoot = false;
    }
@@ -553,6 +555,24 @@ bool RequestedLayerState::hasInputInfo() const {
            windowInfo->inputConfig.test(gui::WindowInfo::InputConfig::NO_INPUT_CHANNEL);
}

bool RequestedLayerState::needsInputInfo() const {
    if (potentialCursor) {
        return false;
    }

    if ((sidebandStream != nullptr) || (externalTexture != nullptr)) {
        return true;
    }

    if (!windowInfoHandle) {
        return false;
    }

    const auto windowInfo = windowInfoHandle->getInfo();
    return windowInfo->token != nullptr ||
            windowInfo->inputConfig.test(gui::WindowInfo::InputConfig::NO_INPUT_CHANNEL);
}

bool RequestedLayerState::hasBlur() const {
    return backgroundBlurRadius > 0 || blurRegions.size() > 0;
}
+1 −0
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ struct RequestedLayerState : layer_state_t {
    aidl::android::hardware::graphics::composer3::Composition getCompositionType() const;
    bool hasValidRelativeParent() const;
    bool hasInputInfo() const;
    bool needsInputInfo() const;
    bool hasBlur() const;
    bool hasFrameUpdate() const;
    bool hasReadyFrame() const;
+10 −0
Original line number Diff line number Diff line
@@ -619,4 +619,14 @@ TEST_F(LayerLifecycleManagerTest, isSimpleBufferUpdate) {
    }
}

TEST_F(LayerLifecycleManagerTest, testInputInfoOfRequestedLayerState) {
    // By default the layer has no buffer, so it doesn't need an input info
    EXPECT_FALSE(getRequestedLayerState(mLifecycleManager, 111)->needsInputInfo());

    setBuffer(111);
    mLifecycleManager.commitChanges();

    EXPECT_TRUE(getRequestedLayerState(mLifecycleManager, 111)->needsInputInfo());
}

} // namespace android::surfaceflinger::frontend
Loading