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

Commit a6b297ee authored by Sally Qi's avatar Sally Qi Committed by Android (Google) Code Review
Browse files

Merge "Revert^2 "[Lut backend] Fix a bug where we were passing a nullptr to...

Merge "Revert^2 "[Lut backend] Fix a bug where we were passing a nullptr to the HWC when we wanted to clear the LUTs."" into main
parents 4acf1432 b0f29dc1
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -118,7 +118,8 @@ public:
    // isPeekingThrough specifies whether this layer will be shown through a
    // hole punch in a layer above it.
    virtual void writeStateToHWC(bool includeGeometry, bool skipLayer, uint32_t z,
                                 bool zIsOverridden, bool isPeekingThrough) = 0;
                                 bool zIsOverridden, bool isPeekingThrough,
                                 bool isLutSupported) = 0;

    // Updates the cursor position with the HWC
    virtual void writeCursorPositionToHWC() const = 0;
+1 −1
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ public:
                                const std::optional<std::vector<std::optional<LutProperties>>>
                                        properties = std::nullopt) override;
    void writeStateToHWC(bool includeGeometry, bool skipLayer, uint32_t z, bool zIsOverridden,
                         bool isPeekingThrough) override;
                         bool isPeekingThrough, bool hasLutsProperties) override;
    void writeCursorPositionToHWC() const override;

    HWC2::Layer* getHwcLayer() const override;
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ public:
                (bool, bool, ui::Transform::RotationFlags,
                 (const std::optional<std::vector<std::optional<
                          aidl::android::hardware::graphics::composer3::LutProperties>>>)));
    MOCK_METHOD5(writeStateToHWC, void(bool, bool, uint32_t, bool, bool));
    MOCK_METHOD(void, writeStateToHWC, (bool, bool, uint32_t, bool, bool, bool));
    MOCK_CONST_METHOD0(writeCursorPositionToHWC, void());

    MOCK_CONST_METHOD0(getHwcLayer, HWC2::Layer*());
+6 −2
Original line number Diff line number Diff line
@@ -909,6 +909,9 @@ void Output::writeCompositionState(const compositionengine::CompositionRefreshAr

    applyPictureProfile();

    auto* properties = getOverlaySupport();
    bool hasLutsProperties = properties && properties->lutProperties.has_value();

    compositionengine::OutputLayer* peekThroughLayer = nullptr;
    sp<GraphicBuffer> previousOverride = nullptr;
    bool includeGeometry = refreshArgs.updatingGeometryThisFrame;
@@ -940,7 +943,7 @@ void Output::writeCompositionState(const compositionengine::CompositionRefreshAr
                    includeGeometry = true;
                    constexpr bool isPeekingThrough = true;
                    peekThroughLayer->writeStateToHWC(includeGeometry, false, z++, overrideZ,
                                                      isPeekingThrough);
                                                      isPeekingThrough, hasLutsProperties);
                    outputLayerHash ^= android::hashCombine(
                            reinterpret_cast<uint64_t>(&peekThroughLayer->getLayerFE()),
                            z, includeGeometry, overrideZ, isPeekingThrough,
@@ -952,7 +955,8 @@ void Output::writeCompositionState(const compositionengine::CompositionRefreshAr
        }

        constexpr bool isPeekingThrough = false;
        layer->writeStateToHWC(includeGeometry, skipLayer, z++, overrideZ, isPeekingThrough);
        layer->writeStateToHWC(includeGeometry, skipLayer, z++, overrideZ, isPeekingThrough,
                               hasLutsProperties);
        if (!skipLayer) {
            outputLayerHash ^= android::hashCombine(
                    reinterpret_cast<uint64_t>(&layer->getLayerFE()),
+26 −23
Original line number Diff line number Diff line
@@ -449,7 +449,8 @@ void OutputLayer::commitPictureProfileToCompositionState() {
}

void OutputLayer::writeStateToHWC(bool includeGeometry, bool skipLayer, uint32_t z,
                                  bool zIsOverridden, bool isPeekingThrough) {
                                  bool zIsOverridden, bool isPeekingThrough,
                                  bool hasLutsProperties) {
    const auto& state = getState();
    // Skip doing this if there is no HWC interface
    if (!state.hwc) {
@@ -491,8 +492,9 @@ void OutputLayer::writeStateToHWC(bool includeGeometry, bool skipLayer, uint32_t

    writeCompositionTypeToHWC(hwcLayer.get(), requestedCompositionType, isPeekingThrough,
                              skipLayer);

    if (hasLutsProperties) {
        writeLutToHWC(hwcLayer.get(), *outputIndependentState);
    }

    if (requestedCompositionType == Composition::SOLID_COLOR) {
        writeSolidColorStateToHWC(hwcLayer.get(), *outputIndependentState);
@@ -589,9 +591,10 @@ void OutputLayer::writeOutputIndependentGeometryStateToHWC(

void OutputLayer::writeLutToHWC(HWC2::Layer* hwcLayer,
                                const LayerFECompositionState& outputIndependentState) {
    if (!outputIndependentState.luts) {
        return;
    }
    Luts luts;
    // if outputIndependentState.luts is nullptr, it means we want to clear the LUTs
    // and we pass an empty Luts object to the HWC.
    if (outputIndependentState.luts) {
        auto& lutFileDescriptor = outputIndependentState.luts->getLutFileDescriptor();
        auto lutOffsets = outputIndependentState.luts->offsets;
        auto& lutProperties = outputIndependentState.luts->lutProperties;
@@ -599,18 +602,18 @@ void OutputLayer::writeLutToHWC(HWC2::Layer* hwcLayer,
        std::vector<LutProperties> aidlProperties;
        aidlProperties.reserve(lutProperties.size());
        for (size_t i = 0; i < lutOffsets.size(); i++) {
        LutProperties properties;
        properties.dimension = static_cast<LutProperties::Dimension>(lutProperties[i].dimension);
        properties.size = lutProperties[i].size;
        properties.samplingKeys = {
                static_cast<LutProperties::SamplingKey>(lutProperties[i].samplingKey)};
        aidlProperties.emplace_back(properties);
            aidlProperties.emplace_back(
                    LutProperties{.dimension = static_cast<LutProperties::Dimension>(
                                          lutProperties[i].dimension),
                                  .size = lutProperties[i].size,
                                  .samplingKeys = {static_cast<LutProperties::SamplingKey>(
                                          lutProperties[i].samplingKey)}});
        }

    Luts luts;
        luts.pfd = ndk::ScopedFileDescriptor(dup(lutFileDescriptor.get()));
        luts.offsets = lutOffsets;
        luts.lutProperties = std::move(aidlProperties);
    }

    switch (auto error = hwcLayer->setLuts(luts)) {
        case hal::Error::NONE:
Loading