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

Commit c1f8d178 authored by Alec Mouri's avatar Alec Mouri Committed by Automerger Merge Worker
Browse files

Merge "Only apply early offsets when transaction has been applied" into rvc-dev am: 6ac57abe

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/11761255

Change-Id: Ie755c040fc61e9b84b27fe36f15eb0c3b7267e12
parents 81fdf1b8 6ac57abe
Loading
Loading
Loading
Loading
+13 −3
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@
#include <cutils/properties.h>
#include <cutils/properties.h>
#include <utils/Trace.h>
#include <utils/Trace.h>


#include <chrono>
#include <cinttypes>
#include <cinttypes>
#include <mutex>
#include <mutex>


@@ -52,6 +53,7 @@ void VSyncModulator::setPhaseOffsets(const OffsetsConfig& config) {
void VSyncModulator::setTransactionStart(Scheduler::TransactionStart transactionStart) {
void VSyncModulator::setTransactionStart(Scheduler::TransactionStart transactionStart) {
    if (transactionStart == Scheduler::TransactionStart::EARLY) {
    if (transactionStart == Scheduler::TransactionStart::EARLY) {
        mRemainingEarlyFrameCount = MIN_EARLY_FRAME_COUNT_TRANSACTION;
        mRemainingEarlyFrameCount = MIN_EARLY_FRAME_COUNT_TRANSACTION;
        mEarlyTxnStartTime = std::chrono::steady_clock::now();
    }
    }


    // An early transaction stays an early transaction.
    // An early transaction stays an early transaction.
@@ -64,6 +66,7 @@ void VSyncModulator::setTransactionStart(Scheduler::TransactionStart transaction
}
}


void VSyncModulator::onTransactionHandled() {
void VSyncModulator::onTransactionHandled() {
    mTxnAppliedTime = std::chrono::steady_clock::now();
    if (mTransactionStart == Scheduler::TransactionStart::NORMAL) return;
    if (mTransactionStart == Scheduler::TransactionStart::NORMAL) return;
    mTransactionStart = Scheduler::TransactionStart::NORMAL;
    mTransactionStart = Scheduler::TransactionStart::NORMAL;
    updateOffsets();
    updateOffsets();
@@ -87,10 +90,17 @@ void VSyncModulator::onRefreshRateChangeCompleted() {


void VSyncModulator::onRefreshed(bool usedRenderEngine) {
void VSyncModulator::onRefreshed(bool usedRenderEngine) {
    bool updateOffsetsNeeded = false;
    bool updateOffsetsNeeded = false;

    // Apply a 1ms margin to account for potential data races
    // This might make us stay in early offsets for one
    // additional frame but it's better to be conservative here.
    static const constexpr std::chrono::nanoseconds kMargin = 1ms;
    if ((mEarlyTxnStartTime.load() + kMargin) < mTxnAppliedTime.load()) {
        if (mRemainingEarlyFrameCount > 0) {
        if (mRemainingEarlyFrameCount > 0) {
            mRemainingEarlyFrameCount--;
            mRemainingEarlyFrameCount--;
            updateOffsetsNeeded = true;
            updateOffsetsNeeded = true;
        }
        }
    }
    if (usedRenderEngine) {
    if (usedRenderEngine) {
        mRemainingRenderEngineUsageCount = MIN_EARLY_GL_FRAME_COUNT_TRANSACTION;
        mRemainingRenderEngineUsageCount = MIN_EARLY_GL_FRAME_COUNT_TRANSACTION;
        updateOffsetsNeeded = true;
        updateOffsetsNeeded = true;
+3 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


#pragma once
#pragma once


#include <chrono>
#include <mutex>
#include <mutex>


#include "Scheduler.h"
#include "Scheduler.h"
@@ -110,6 +111,8 @@ private:
    std::atomic<bool> mRefreshRateChangePending = false;
    std::atomic<bool> mRefreshRateChangePending = false;
    std::atomic<int> mRemainingEarlyFrameCount = 0;
    std::atomic<int> mRemainingEarlyFrameCount = 0;
    std::atomic<int> mRemainingRenderEngineUsageCount = 0;
    std::atomic<int> mRemainingRenderEngineUsageCount = 0;
    std::atomic<std::chrono::steady_clock::time_point> mEarlyTxnStartTime = {};
    std::atomic<std::chrono::steady_clock::time_point> mTxnAppliedTime = {};


    bool mTraceDetailedInfo = false;
    bool mTraceDetailedInfo = false;
};
};