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

Commit 8889a5da authored by Ady Abraham's avatar Ady Abraham Committed by Android (Google) Code Review
Browse files

Merge changes I0317ff4d,I3bfa3749,Ica6a955e into sc-v2-dev

* changes:
  SF: cleanup RefreshRateConfigs interface
  SF: move RefreshRateOverlay to DisplayDevice
  SF: move RefreshRateConfigs to DisplayDevice
parents 528dc3c6 6b7ad65e
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -421,7 +421,7 @@ bool BufferLayer::onPostComposition(const DisplayDevice* display,
        mFrameTracker.setFrameReadyTime(desiredPresentTime);
        mFrameTracker.setFrameReadyTime(desiredPresentTime);
    }
    }


    const Fps refreshRate = mFlinger->mRefreshRateConfigs->getCurrentRefreshRate().getFps();
    const Fps refreshRate = display->refreshRateConfigs().getCurrentRefreshRate().getFps();
    const std::optional<Fps> renderRate = mFlinger->mScheduler->getFrameRateOverride(getOwnerUid());
    const std::optional<Fps> renderRate = mFlinger->mScheduler->getFrameRateOverride(getOwnerUid());
    if (presentFence->isValid()) {
    if (presentFence->isValid()) {
        mFlinger->mTimeStats->setPresentFence(layerId, mCurrentFrameNumber, presentFence,
        mFlinger->mTimeStats->setPresentFence(layerId, mCurrentFrameNumber, presentFence,
+55 −2
Original line number Original line Diff line number Diff line
@@ -40,6 +40,7 @@


#include "DisplayDevice.h"
#include "DisplayDevice.h"
#include "Layer.h"
#include "Layer.h"
#include "RefreshRateOverlay.h"
#include "SurfaceFlinger.h"
#include "SurfaceFlinger.h"


namespace android {
namespace android {
@@ -67,7 +68,8 @@ DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs& args)
        mCompositionDisplay{args.compositionDisplay},
        mCompositionDisplay{args.compositionDisplay},
        mPhysicalOrientation(args.physicalOrientation),
        mPhysicalOrientation(args.physicalOrientation),
        mSupportedModes(std::move(args.supportedModes)),
        mSupportedModes(std::move(args.supportedModes)),
        mIsPrimary(args.isPrimary) {
        mIsPrimary(args.isPrimary),
        mRefreshRateConfigs(std::move(args.refreshRateConfigs)) {
    mCompositionDisplay->editState().isSecure = args.isSecure;
    mCompositionDisplay->editState().isSecure = args.isSecure;
    mCompositionDisplay->createRenderSurface(
    mCompositionDisplay->createRenderSurface(
            compositionengine::RenderSurfaceCreationArgsBuilder()
            compositionengine::RenderSurfaceCreationArgsBuilder()
@@ -155,6 +157,12 @@ void DisplayDevice::setActiveMode(DisplayModeId id) {
    const auto mode = getMode(id);
    const auto mode = getMode(id);
    LOG_FATAL_IF(!mode, "Cannot set active mode which is not supported.");
    LOG_FATAL_IF(!mode, "Cannot set active mode which is not supported.");
    mActiveMode = mode;
    mActiveMode = mode;
    if (mRefreshRateConfigs) {
        mRefreshRateConfigs->setCurrentModeId(mActiveMode->getId());
    }
    if (mRefreshRateOverlay) {
        mRefreshRateOverlay->changeRefreshRate(mActiveMode->getFps());
    }
}
}


status_t DisplayDevice::initiateModeChange(DisplayModeId modeId,
status_t DisplayDevice::initiateModeChange(DisplayModeId modeId,
@@ -218,6 +226,9 @@ ui::Dataspace DisplayDevice::getCompositionDataSpace() const {


void DisplayDevice::setLayerStack(ui::LayerStack stack) {
void DisplayDevice::setLayerStack(ui::LayerStack stack) {
    mCompositionDisplay->setLayerStackFilter(stack, isInternal());
    mCompositionDisplay->setLayerStackFilter(stack, isInternal());
    if (mRefreshRateOverlay) {
        mRefreshRateOverlay->setLayerStack(stack);
    }
}
}


void DisplayDevice::setFlags(uint32_t flags) {
void DisplayDevice::setFlags(uint32_t flags) {
@@ -226,7 +237,11 @@ void DisplayDevice::setFlags(uint32_t flags) {


void DisplayDevice::setDisplaySize(int width, int height) {
void DisplayDevice::setDisplaySize(int width, int height) {
    LOG_FATAL_IF(!isVirtual(), "Changing the display size is supported only for virtual displays.");
    LOG_FATAL_IF(!isVirtual(), "Changing the display size is supported only for virtual displays.");
    mCompositionDisplay->setDisplaySize(ui::Size(width, height));
    const auto size = ui::Size(width, height);
    mCompositionDisplay->setDisplaySize(size);
    if (mRefreshRateOverlay) {
        mRefreshRateOverlay->setViewport(size);
    }
}
}


void DisplayDevice::setProjection(ui::Rotation orientation, Rect layerStackSpaceRect,
void DisplayDevice::setProjection(ui::Rotation orientation, Rect layerStackSpaceRect,
@@ -296,6 +311,10 @@ void DisplayDevice::dump(std::string& result) const {
    }
    }
    result.append("\n");
    result.append("\n");
    getCompositionDisplay()->dump(result);
    getCompositionDisplay()->dump(result);

    if (mRefreshRateConfigs) {
        mRefreshRateConfigs->dump(result);
    }
}
}


bool DisplayDevice::hasRenderIntent(ui::RenderIntent intent) const {
bool DisplayDevice::hasRenderIntent(ui::RenderIntent intent) const {
@@ -382,6 +401,40 @@ HdrCapabilities DisplayDevice::getHdrCapabilities() const {
                           capabilities.getDesiredMinLuminance());
                           capabilities.getDesiredMinLuminance());
}
}


void DisplayDevice::enableRefreshRateOverlay(bool enable, bool showSpinnner) {
    if (!enable) {
        mRefreshRateOverlay.reset();
        return;
    }

    const auto [lowFps, highFps] = mRefreshRateConfigs->getSupportedRefreshRateRange();
    mRefreshRateOverlay = std::make_unique<RefreshRateOverlay>(*mFlinger, lowFps.getIntValue(),
                                                               highFps.getIntValue(), showSpinnner);
    mRefreshRateOverlay->setLayerStack(getLayerStack());
    mRefreshRateOverlay->setViewport(getSize());
    mRefreshRateOverlay->changeRefreshRate(getActiveMode()->getFps());
}

bool DisplayDevice::onKernelTimerChanged(std::optional<DisplayModeId> desiredModeId,
                                         bool timerExpired) {
    if (mRefreshRateConfigs && mRefreshRateOverlay) {
        const auto newRefreshRate =
                mRefreshRateConfigs->onKernelTimerChanged(desiredModeId, timerExpired);
        if (newRefreshRate) {
            mRefreshRateOverlay->changeRefreshRate(*newRefreshRate);
            return true;
        }
    }

    return false;
}

void DisplayDevice::onInvalidate() {
    if (mRefreshRateOverlay) {
        mRefreshRateOverlay->onInvalidate();
    }
}

std::atomic<int32_t> DisplayDeviceState::sNextSequenceId(1);
std::atomic<int32_t> DisplayDeviceState::sNextSequenceId(1);


}  // namespace android
}  // namespace android
+24 −0
Original line number Original line Diff line number Diff line
@@ -44,12 +44,15 @@
#include "DisplayHardware/Hal.h"
#include "DisplayHardware/Hal.h"
#include "DisplayHardware/PowerAdvisor.h"
#include "DisplayHardware/PowerAdvisor.h"


#include "Scheduler/RefreshRateConfigs.h"

namespace android {
namespace android {


class Fence;
class Fence;
class HWComposer;
class HWComposer;
class IGraphicBufferProducer;
class IGraphicBufferProducer;
class Layer;
class Layer;
class RefreshRateOverlay;
class SurfaceFlinger;
class SurfaceFlinger;


struct CompositionInfo;
struct CompositionInfo;
@@ -193,6 +196,22 @@ public:
    // set-top boxes after a hotplug reconnect.
    // set-top boxes after a hotplug reconnect.
    DisplayModePtr getMode(DisplayModeId) const;
    DisplayModePtr getMode(DisplayModeId) const;


    // Returns the refresh rate configs for this display.
    scheduler::RefreshRateConfigs& refreshRateConfigs() const { return *mRefreshRateConfigs; }

    // Returns a shared pointer to the refresh rate configs for this display.
    // Clients can store this refresh rate configs and use it even if the DisplayDevice
    // is destroyed.
    std::shared_ptr<scheduler::RefreshRateConfigs> holdRefreshRateConfigs() const {
        return mRefreshRateConfigs;
    }

    // Enables an overlay to be displayed with the current refresh rate
    void enableRefreshRateOverlay(bool enable, bool showSpinner);
    bool isRefreshRateOverlayEnabled() const { return mRefreshRateOverlay != nullptr; }
    bool onKernelTimerChanged(std::optional<DisplayModeId>, bool timerExpired);
    void onInvalidate();

    void onVsync(nsecs_t timestamp);
    void onVsync(nsecs_t timestamp);
    nsecs_t getVsyncPeriodFromHWC() const;
    nsecs_t getVsyncPeriodFromHWC() const;
    nsecs_t getRefreshTimestamp() const;
    nsecs_t getRefreshTimestamp() const;
@@ -238,6 +257,9 @@ private:
    std::optional<DeviceProductInfo> mDeviceProductInfo;
    std::optional<DeviceProductInfo> mDeviceProductInfo;


    std::vector<ui::Hdr> mOverrideHdrTypes;
    std::vector<ui::Hdr> mOverrideHdrTypes;

    std::shared_ptr<scheduler::RefreshRateConfigs> mRefreshRateConfigs;
    std::unique_ptr<RefreshRateOverlay> mRefreshRateOverlay;
};
};


struct DisplayDeviceState {
struct DisplayDeviceState {
@@ -283,6 +305,7 @@ struct DisplayDeviceCreationArgs {
    HWComposer& hwComposer;
    HWComposer& hwComposer;
    const wp<IBinder> displayToken;
    const wp<IBinder> displayToken;
    const std::shared_ptr<compositionengine::Display> compositionDisplay;
    const std::shared_ptr<compositionengine::Display> compositionDisplay;
    std::shared_ptr<scheduler::RefreshRateConfigs> refreshRateConfigs;


    int32_t sequenceId{0};
    int32_t sequenceId{0};
    std::optional<ui::DisplayConnectionType> connectionType;
    std::optional<ui::DisplayConnectionType> connectionType;
@@ -298,6 +321,7 @@ struct DisplayDeviceCreationArgs {
            hardware::graphics::composer::hal::PowerMode::ON};
            hardware::graphics::composer::hal::PowerMode::ON};
    bool isPrimary{false};
    bool isPrimary{false};
    DisplayModes supportedModes;
    DisplayModes supportedModes;
    DisplayModeId activeModeId;
};
};


// Predicates for display lookup.
// Predicates for display lookup.
+12 −11
Original line number Original line Diff line number Diff line
@@ -175,10 +175,14 @@ std::vector<sp<GraphicBuffer>> RefreshRateOverlay::SevenSegmentDrawer::drawNumbe
    return buffers;
    return buffers;
}
}


RefreshRateOverlay::RefreshRateOverlay(SurfaceFlinger& flinger, bool showSpinner)
RefreshRateOverlay::RefreshRateOverlay(SurfaceFlinger& flinger, uint32_t lowFps, uint32_t highFps,
      : mFlinger(flinger), mClient(new Client(&mFlinger)), mShowSpinner(showSpinner) {
                                       bool showSpinner)
      : mFlinger(flinger),
        mClient(new Client(&mFlinger)),
        mShowSpinner(showSpinner),
        mLowFps(lowFps),
        mHighFps(highFps) {
    createLayer();
    createLayer();
    reset();
}
}


bool RefreshRateOverlay::createLayer() {
bool RefreshRateOverlay::createLayer() {
@@ -194,7 +198,6 @@ bool RefreshRateOverlay::createLayer() {
        return false;
        return false;
    }
    }


    Mutex::Autolock _l(mFlinger.mStateLock);
    mLayer = mClient->getLayerUser(mIBinder);
    mLayer = mClient->getLayerUser(mIBinder);
    mLayer->setFrameRate(Layer::FrameRate(Fps(0.0f), Layer::FrameRateCompatibility::NoVote));
    mLayer->setFrameRate(Layer::FrameRate(Fps(0.0f), Layer::FrameRateCompatibility::NoVote));


@@ -256,6 +259,11 @@ void RefreshRateOverlay::setViewport(ui::Size viewport) {
    mFlinger.mTransactionFlags.fetch_or(eTransactionMask);
    mFlinger.mTransactionFlags.fetch_or(eTransactionMask);
}
}


void RefreshRateOverlay::setLayerStack(uint32_t stack) {
    mLayer->setLayerStack(stack);
    mFlinger.mTransactionFlags.fetch_or(eTransactionMask);
}

void RefreshRateOverlay::changeRefreshRate(const Fps& fps) {
void RefreshRateOverlay::changeRefreshRate(const Fps& fps) {
    mCurrentFps = fps.getIntValue();
    mCurrentFps = fps.getIntValue();
    auto buffer = getOrCreateBuffers(*mCurrentFps)[mFrame];
    auto buffer = getOrCreateBuffers(*mCurrentFps)[mFrame];
@@ -281,13 +289,6 @@ void RefreshRateOverlay::onInvalidate() {
    mFlinger.mTransactionFlags.fetch_or(eTransactionMask);
    mFlinger.mTransactionFlags.fetch_or(eTransactionMask);
}
}


void RefreshRateOverlay::reset() {
    mBufferCache.clear();
    const auto range = mFlinger.mRefreshRateConfigs->getSupportedRefreshRateRange();
    mLowFps = range.min.getIntValue();
    mHighFps = range.max.getIntValue();
}

} // namespace android
} // namespace android


// TODO(b/129481165): remove the #pragma below and fix conversion issues
// TODO(b/129481165): remove the #pragma below and fix conversion issues
+4 −4
Original line number Original line Diff line number Diff line
@@ -37,12 +37,12 @@ class SurfaceFlinger;


class RefreshRateOverlay {
class RefreshRateOverlay {
public:
public:
    RefreshRateOverlay(SurfaceFlinger&, bool showSpinner);
    RefreshRateOverlay(SurfaceFlinger&, uint32_t lowFps, uint32_t highFps, bool showSpinner);


    void setLayerStack(uint32_t stack);
    void setViewport(ui::Size);
    void setViewport(ui::Size);
    void changeRefreshRate(const Fps&);
    void changeRefreshRate(const Fps&);
    void onInvalidate();
    void onInvalidate();
    void reset();


private:
private:
    class SevenSegmentDrawer {
    class SevenSegmentDrawer {
@@ -91,8 +91,8 @@ private:
    const bool mShowSpinner;
    const bool mShowSpinner;


    // Interpolate the colors between these values.
    // Interpolate the colors between these values.
    uint32_t mLowFps;
    const uint32_t mLowFps;
    uint32_t mHighFps;
    const uint32_t mHighFps;
};
};


} // namespace android
} // namespace android
Loading