
设置->开发者选项->显示刷新频率
packages/apps/Settings/src/com/android/settings/development/ShowRefreshRatePreferenceController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| public class ShowRefreshRatePreferenceController extends DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
......
private static final int SETTING_VALUE_QUERY = 2; private static final int SETTING_VALUE_ON = 1; private static final int SETTING_VALUE_OFF = 0;
@VisibleForTesting static final String SURFACE_FLINGER_SERVICE_KEY = "SurfaceFlinger"; @VisibleForTesting static final int SURFACE_FLINGER_CODE = 1034;
private static final String SURFACE_COMPOSER_INTERFACE_KEY = "android.ui.ISurfaceComposer";
private final IBinder mSurfaceFlinger;
......
@Override public boolean onPreferenceChange(Preference preference, Object newValue) { final boolean isEnabled = (Boolean) newValue; writeShowRefreshRateSetting(isEnabled); return true; }
@Override public void updateState(Preference preference) { updateShowRefreshRateSetting(); }
......
@VisibleForTesting void updateShowRefreshRateSetting() { try { if (mSurfaceFlinger != null) { final Parcel data = Parcel.obtain(); final Parcel reply = Parcel.obtain(); data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY); data.writeInt(SETTING_VALUE_QUERY); mSurfaceFlinger.transact(SURFACE_FLINGER_CODE, data, reply, 0 ); final boolean enabled = reply.readBoolean(); ((SwitchPreference) mPreference).setChecked(enabled); reply.recycle(); data.recycle(); } } catch (RemoteException ex) { } }
@VisibleForTesting void writeShowRefreshRateSetting(boolean isEnabled) { try { if (mSurfaceFlinger != null) { final Parcel data = Parcel.obtain(); data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY); final int showRefreshRate = isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF; data.writeInt(showRefreshRate); mSurfaceFlinger.transact(SURFACE_FLINGER_CODE, data, null , 0 ); data.recycle(); } } catch (RemoteException ex) { } updateShowRefreshRateSetting(); } }
|
RefreshRateOverlay实际Layer显示刷新频率
frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| namespace { ...... status_t SurfaceFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { if (const status_t error = CheckTransactCodeCredentials(code); error != OK) { return error; }
status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags); if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) { CHECK_INTERFACE(ISurfaceComposer, data, reply); IPCThreadState* ipc = IPCThreadState::self(); const int uid = ipc->getCallingUid(); if(code == 8002) { reply->writeInt32(mScheduler->getDfrcFps()); return NO_ERROR; } if (CC_UNLIKELY(uid != AID_SYSTEM && !PermissionCache::checkCallingPermission(sHardwareTest))) { const int pid = ipc->getCallingPid(); ALOGE("Permission Denial: " "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid); return PERMISSION_DENIED; } int n; switch (code) { ...... case 1034: { auto future = mScheduler->schedule([&] { switch (n = data.readInt32()) { case 0: case 1: FTL_FAKE_GUARD(mStateLock, enableRefreshRateOverlay(static_cast<bool>(n))); break; default: { reply->writeBool( FTL_FAKE_GUARD(mStateLock, isRefreshRateOverlayEnabled())); } } });
future.wait(); return NO_ERROR; } ...... void SurfaceFlinger::enableRefreshRateOverlay(bool enable) { for (const auto& [ignored, display] : mDisplays) { if (display->isInternal() && !display->isVirtual()) { if (enable) { auto fpsRange = display->refreshRateConfigs().getSupportedRefreshRateRange(); mRefreshRateOverlay = std::make_shared<RefreshRateOverlay>(fpsRange, mRefreshRateOverlaySpinner); } else { mRefreshRateOverlay.reset(); //disable RefreshRateOverlay } display->enableRefreshRateOverlay(mRefreshRateOverlay); } } } ......
|
初始化RefreshRateOverlay
frameworks\native\services\surfaceflinger\RefreshRateOverlay.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| RefreshRateOverlay::RefreshRateOverlay(FpsRange fpsRange, bool showSpinner) : mFpsRange(fpsRange), mShowSpinner(showSpinner), mSurfaceControl(SurfaceComposerClient::getDefault() ->createSurface(String8("RefreshRateOverlay"), kBufferWidth, kBufferHeight, PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceBufferState)) { if (!mSurfaceControl) { ALOGE("%s: Failed to create buffer state layer", __func__); return; }
createTransaction(mSurfaceControl) .setLayer(mSurfaceControl, INT32_MAX - 2) .setTrustedOverlay(mSurfaceControl, true) .apply(); }
|
本文链接:
http://longzhiye.top/2023/05/14/2023-05-14/