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

Commit d88f807e authored by Leon Scroggins III's avatar Leon Scroggins III Committed by Android Build Coastguard Worker
Browse files

Move rotation flags to SF

The rotation flags are typically only used for a camera preview, which
wants to avoid changing its orientation and flicker during rotation.
Prior to this CL, the rotation flags were tied to the primary display,
meaning that if the camera preview was on another display, the rotation
flags may not be up to date. For example, if the primary display is off,
its flags will not be updated on rotation.

Ideally, the flags should be based on the display where the preview will
be shown, but this is a much larger architectural change, tracked in
b/259407931.

As a temporary workaround, associate the flags with the active display.
Store the flags in SurfaceFlinger, which knows when the active display
changes. Update when the active display switches to a different display
or when the active display rotates, matching the behavior of
mActiveDisplayTransformHint, which seems similar but is different. Store
the flags as a static variable so that LayerFE can access it. LayerFE
does not have a way to access the actual SurfaceFlinger object, and it
should not.

Access to the new flags is safe because it is only read or written from
the main thread.

Bug: 269685949
Bug: 259407931
Test: ActiveDisplayRotationFlagsTest
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:9550c0945ee72bdda05972f70255e7a6b5c46c29)
Merged-In: I5532e140a603be222cb3ea1ae563638317c1d745
Change-Id: I5532e140a603be222cb3ea1ae563638317c1d745
parent 3dee0d02
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -50,8 +50,6 @@ namespace android {

namespace hal = hardware::graphics::composer::hal;

ui::Transform::RotationFlags DisplayDevice::sPrimaryDisplayRotationFlags = ui::Transform::ROT_0;

DisplayDeviceCreationArgs::DisplayDeviceCreationArgs(
        const sp<SurfaceFlinger>& flinger, HWComposer& hwComposer, const wp<IBinder>& displayToken,
        std::shared_ptr<compositionengine::Display> compositionDisplay)
@@ -282,10 +280,6 @@ void DisplayDevice::setProjection(ui::Rotation orientation, Rect layerStackSpace
                                  Rect orientedDisplaySpaceRect) {
    mOrientation = orientation;

    if (isPrimary()) {
        sPrimaryDisplayRotationFlags = ui::Transform::toRotationFlags(orientation);
    }

    // We need to take care of display rotation for globalTransform for case if the panel is not
    // installed aligned with device orientation.
    const auto transformOrientation = orientation + mPhysicalOrientation;
@@ -326,10 +320,6 @@ std::optional<float> DisplayDevice::getStagedBrightness() const {
    return mStagedBrightness;
}

ui::Transform::RotationFlags DisplayDevice::getPrimaryDisplayRotationFlags() {
    return sPrimaryDisplayRotationFlags;
}

void DisplayDevice::dump(utils::Dumper& dumper) const {
    using namespace std::string_view_literals;

+0 −4
Original line number Diff line number Diff line
@@ -109,8 +109,6 @@ public:
    ui::Rotation getPhysicalOrientation() const { return mPhysicalOrientation; }
    ui::Rotation getOrientation() const { return mOrientation; }

    static ui::Transform::RotationFlags getPrimaryDisplayRotationFlags();

    std::optional<float> getStagedBrightness() const REQUIRES(kMainThreadContext);
    ui::Transform::RotationFlags getTransformHint() const;
    const ui::Transform& getTransform() const;
@@ -274,8 +272,6 @@ private:
    const ui::Rotation mPhysicalOrientation;
    ui::Rotation mOrientation = ui::ROTATION_0;

    static ui::Transform::RotationFlags sPrimaryDisplayRotationFlags;

    // Allow nullopt as initial power mode.
    using TracedPowerMode = TracedOrdinal<hardware::graphics::composer::hal::PowerMode>;
    std::optional<TracedPowerMode> mPowerMode;
+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ struct DisplayInfo {
    ui::Transform transform;
    bool receivesInput;
    bool isSecure;
    // TODO(b/238781169) can eliminate once sPrimaryDisplayRotationFlags is removed.
    // TODO(b/259407931): can eliminate once SurfaceFlinger::sActiveDisplayRotationFlags is removed.
    bool isPrimary;
    bool isVirtual;
    ui::Transform::RotationFlags rotationFlags;
+1 −0
Original line number Diff line number Diff line
@@ -667,6 +667,7 @@ void LayerSnapshotBuilder::resetRelativeState(LayerSnapshot& snapshot) {
    snapshot.relativeLayerMetadata.mMap.clear();
}

// TODO (b/259407931): Remove.
uint32_t getPrimaryDisplayRotationFlags(
        const display::DisplayMap<ui::LayerStack, frontend::DisplayInfo>& displays) {
    for (auto& [_, display] : displays) {
+2 −2
Original line number Diff line number Diff line
@@ -2977,7 +2977,7 @@ bool Layer::updateGeometry() {
    if (mDrawingState.bufferTransform & ui::Transform::ROT_90) {
        std::swap(bufferWidth, bufferHeight);
    }
    uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags();
    uint32_t invTransform = SurfaceFlinger::getActiveDisplayRotationFlags();
    if (mDrawingState.transformToDisplayInverse) {
        if (invTransform & ui::Transform::ROT_90) {
            std::swap(bufferWidth, bufferHeight);
@@ -3304,7 +3304,7 @@ Rect Layer::getBufferSize(const State& /*s*/) const {
    }

    if (getTransformToDisplayInverse()) {
        uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags();
        uint32_t invTransform = SurfaceFlinger::getActiveDisplayRotationFlags();
        if (invTransform & ui::Transform::ROT_90) {
            std::swap(bufWidth, bufHeight);
        }
Loading