Loading libs/gui/LayerState.cpp +6 −5 Original line number Diff line number Diff line Loading @@ -16,8 +16,8 @@ #define LOG_TAG "LayerState" #include <apex/window.h> #include <inttypes.h> #include <cinttypes> #include <cmath> #include <android/native_window.h> #include <binder/Parcel.h> Loading @@ -25,10 +25,9 @@ #include <gui/ISurfaceComposerClient.h> #include <gui/LayerState.h> #include <private/gui/ParcelUtils.h> #include <system/window.h> #include <utils/Errors.h> #include <cmath> namespace android { using gui::FocusRequest; Loading Loading @@ -679,7 +678,9 @@ bool ValidateFrameRate(float frameRate, int8_t compatibility, int8_t changeFrame if (compatibility != ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT && compatibility != ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_FIXED_SOURCE && (!privileged || compatibility != ANATIVEWINDOW_FRAME_RATE_EXACT)) { (!privileged || (compatibility != ANATIVEWINDOW_FRAME_RATE_EXACT && compatibility != ANATIVEWINDOW_FRAME_RATE_NO_VOTE))) { ALOGE("%s failed - invalid compatibility value %d privileged: %s", functionName, compatibility, privileged ? "yes" : "no"); return false; Loading libs/nativewindow/include/apex/window.h +0 −13 Original line number Diff line number Diff line Loading @@ -39,19 +39,6 @@ enum ANativeWindowPerform { // clang-format on }; /* * Internal extension of compatibility value for ANativeWindow_setFrameRate. */ enum ANativeWindow_FrameRateCompatibilityInternal { /** * This surface belongs to an app on the High Refresh Rate Deny list, and needs the display * to operate at the exact frame rate. * * This is used internally by the platform and should not be used by apps. * @hide */ ANATIVEWINDOW_FRAME_RATE_EXACT = 100, }; /** * Prototype of the function that an ANativeWindow implementation would call * when ANativeWindow_cancelBuffer is called. Loading libs/nativewindow/include/system/window.h +18 −0 Original line number Diff line number Diff line Loading @@ -1018,6 +1018,24 @@ static inline int native_window_set_auto_prerotation(struct ANativeWindow* windo return window->perform(window, NATIVE_WINDOW_SET_AUTO_PREROTATION, autoPrerotation); } /* * Internal extension of ANativeWindow_FrameRateCompatibility. */ enum { /** * This surface belongs to an app on the High Refresh Rate Deny list, and needs the display * to operate at the exact frame rate. * * Keep in sync with Surface.java constant. */ ANATIVEWINDOW_FRAME_RATE_EXACT = 100, /** * This surface is ignored while choosing the refresh rate. */ ANATIVEWINDOW_FRAME_RATE_NO_VOTE, }; static inline int native_window_set_frame_rate(struct ANativeWindow* window, float frameRate, int8_t compatibility, int8_t changeFrameRateStrategy) { return window->perform(window, NATIVE_WINDOW_SET_FRAME_RATE, (double)frameRate, Loading services/surfaceflinger/Layer.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -2596,6 +2596,8 @@ Layer::FrameRateCompatibility Layer::FrameRate::convertCompatibility(int8_t comp return FrameRateCompatibility::ExactOrMultiple; case ANATIVEWINDOW_FRAME_RATE_EXACT: return FrameRateCompatibility::Exact; case ANATIVEWINDOW_FRAME_RATE_NO_VOTE: return FrameRateCompatibility::NoVote; default: LOG_ALWAYS_FATAL("Invalid frame rate compatibility value %d", compatibility); return FrameRateCompatibility::Default; Loading services/surfaceflinger/RefreshRateOverlay.cpp +19 −23 Original line number Diff line number Diff line Loading @@ -45,6 +45,15 @@ constexpr int kDigitSpace = 16; constexpr int kBufferWidth = 4 * kDigitWidth + 3 * kDigitSpace; constexpr int kBufferHeight = kDigitHeight; SurfaceComposerClient::Transaction createTransaction(const sp<SurfaceControl>& surface) { constexpr float kFrameRate = 0.f; constexpr int8_t kCompatibility = ANATIVEWINDOW_FRAME_RATE_NO_VOTE; constexpr int8_t kSeamlessness = ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS; return SurfaceComposerClient::Transaction().setFrameRate(surface, kFrameRate, kCompatibility, kSeamlessness); } } // namespace void RefreshRateOverlay::SevenSegmentDrawer::drawSegment(Segment segment, int left, SkColor color, Loading Loading @@ -213,12 +222,7 @@ RefreshRateOverlay::RefreshRateOverlay(FpsRange fpsRange, bool showSpinner) return; } constexpr float kFrameRate = 0.f; constexpr int8_t kCompatibility = static_cast<int8_t>(Layer::FrameRateCompatibility::NoVote); constexpr int8_t kSeamlessness = ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS; SurfaceComposerClient::Transaction() .setFrameRate(mSurfaceControl, kFrameRate, kCompatibility, kSeamlessness) createTransaction(mSurfaceControl) .setLayer(mSurfaceControl, INT32_MAX - 2) .setTrustedOverlay(mSurfaceControl, true) .apply(); Loading @@ -243,9 +247,7 @@ auto RefreshRateOverlay::getOrCreateBuffers(Fps fps) -> const Buffers& { } }(); SurfaceComposerClient::Transaction t; t.setTransform(mSurfaceControl, transform); t.apply(); createTransaction(mSurfaceControl).setTransform(mSurfaceControl, transform).apply(); BufferCache::const_iterator it = mBufferCache.find({fps.getIntValue(), transformHint}); if (it == mBufferCache.end()) { Loading Loading @@ -287,25 +289,21 @@ void RefreshRateOverlay::setViewport(ui::Size viewport) { Rect frame((3 * width) >> 4, height >> 5); frame.offsetBy(width >> 5, height >> 4); SurfaceComposerClient::Transaction t; t.setMatrix(mSurfaceControl, frame.getWidth() / static_cast<float>(kBufferWidth), 0, 0, frame.getHeight() / static_cast<float>(kBufferHeight)); t.setPosition(mSurfaceControl, frame.left, frame.top); t.apply(); createTransaction(mSurfaceControl) .setMatrix(mSurfaceControl, frame.getWidth() / static_cast<float>(kBufferWidth), 0, 0, frame.getHeight() / static_cast<float>(kBufferHeight)) .setPosition(mSurfaceControl, frame.left, frame.top) .apply(); } void RefreshRateOverlay::setLayerStack(ui::LayerStack stack) { SurfaceComposerClient::Transaction t; t.setLayerStack(mSurfaceControl, stack); t.apply(); createTransaction(mSurfaceControl).setLayerStack(mSurfaceControl, stack).apply(); } void RefreshRateOverlay::changeRefreshRate(Fps fps) { mCurrentFps = fps; const auto buffer = getOrCreateBuffers(fps)[mFrame]; SurfaceComposerClient::Transaction t; t.setBuffer(mSurfaceControl, buffer); t.apply(); createTransaction(mSurfaceControl).setBuffer(mSurfaceControl, buffer).apply(); } void RefreshRateOverlay::animate() { Loading @@ -314,9 +312,7 @@ void RefreshRateOverlay::animate() { const auto& buffers = getOrCreateBuffers(*mCurrentFps); mFrame = (mFrame + 1) % buffers.size(); const auto buffer = buffers[mFrame]; SurfaceComposerClient::Transaction t; t.setBuffer(mSurfaceControl, buffer); t.apply(); createTransaction(mSurfaceControl).setBuffer(mSurfaceControl, buffer).apply(); } } // namespace android Loading
libs/gui/LayerState.cpp +6 −5 Original line number Diff line number Diff line Loading @@ -16,8 +16,8 @@ #define LOG_TAG "LayerState" #include <apex/window.h> #include <inttypes.h> #include <cinttypes> #include <cmath> #include <android/native_window.h> #include <binder/Parcel.h> Loading @@ -25,10 +25,9 @@ #include <gui/ISurfaceComposerClient.h> #include <gui/LayerState.h> #include <private/gui/ParcelUtils.h> #include <system/window.h> #include <utils/Errors.h> #include <cmath> namespace android { using gui::FocusRequest; Loading Loading @@ -679,7 +678,9 @@ bool ValidateFrameRate(float frameRate, int8_t compatibility, int8_t changeFrame if (compatibility != ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT && compatibility != ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_FIXED_SOURCE && (!privileged || compatibility != ANATIVEWINDOW_FRAME_RATE_EXACT)) { (!privileged || (compatibility != ANATIVEWINDOW_FRAME_RATE_EXACT && compatibility != ANATIVEWINDOW_FRAME_RATE_NO_VOTE))) { ALOGE("%s failed - invalid compatibility value %d privileged: %s", functionName, compatibility, privileged ? "yes" : "no"); return false; Loading
libs/nativewindow/include/apex/window.h +0 −13 Original line number Diff line number Diff line Loading @@ -39,19 +39,6 @@ enum ANativeWindowPerform { // clang-format on }; /* * Internal extension of compatibility value for ANativeWindow_setFrameRate. */ enum ANativeWindow_FrameRateCompatibilityInternal { /** * This surface belongs to an app on the High Refresh Rate Deny list, and needs the display * to operate at the exact frame rate. * * This is used internally by the platform and should not be used by apps. * @hide */ ANATIVEWINDOW_FRAME_RATE_EXACT = 100, }; /** * Prototype of the function that an ANativeWindow implementation would call * when ANativeWindow_cancelBuffer is called. Loading
libs/nativewindow/include/system/window.h +18 −0 Original line number Diff line number Diff line Loading @@ -1018,6 +1018,24 @@ static inline int native_window_set_auto_prerotation(struct ANativeWindow* windo return window->perform(window, NATIVE_WINDOW_SET_AUTO_PREROTATION, autoPrerotation); } /* * Internal extension of ANativeWindow_FrameRateCompatibility. */ enum { /** * This surface belongs to an app on the High Refresh Rate Deny list, and needs the display * to operate at the exact frame rate. * * Keep in sync with Surface.java constant. */ ANATIVEWINDOW_FRAME_RATE_EXACT = 100, /** * This surface is ignored while choosing the refresh rate. */ ANATIVEWINDOW_FRAME_RATE_NO_VOTE, }; static inline int native_window_set_frame_rate(struct ANativeWindow* window, float frameRate, int8_t compatibility, int8_t changeFrameRateStrategy) { return window->perform(window, NATIVE_WINDOW_SET_FRAME_RATE, (double)frameRate, Loading
services/surfaceflinger/Layer.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -2596,6 +2596,8 @@ Layer::FrameRateCompatibility Layer::FrameRate::convertCompatibility(int8_t comp return FrameRateCompatibility::ExactOrMultiple; case ANATIVEWINDOW_FRAME_RATE_EXACT: return FrameRateCompatibility::Exact; case ANATIVEWINDOW_FRAME_RATE_NO_VOTE: return FrameRateCompatibility::NoVote; default: LOG_ALWAYS_FATAL("Invalid frame rate compatibility value %d", compatibility); return FrameRateCompatibility::Default; Loading
services/surfaceflinger/RefreshRateOverlay.cpp +19 −23 Original line number Diff line number Diff line Loading @@ -45,6 +45,15 @@ constexpr int kDigitSpace = 16; constexpr int kBufferWidth = 4 * kDigitWidth + 3 * kDigitSpace; constexpr int kBufferHeight = kDigitHeight; SurfaceComposerClient::Transaction createTransaction(const sp<SurfaceControl>& surface) { constexpr float kFrameRate = 0.f; constexpr int8_t kCompatibility = ANATIVEWINDOW_FRAME_RATE_NO_VOTE; constexpr int8_t kSeamlessness = ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS; return SurfaceComposerClient::Transaction().setFrameRate(surface, kFrameRate, kCompatibility, kSeamlessness); } } // namespace void RefreshRateOverlay::SevenSegmentDrawer::drawSegment(Segment segment, int left, SkColor color, Loading Loading @@ -213,12 +222,7 @@ RefreshRateOverlay::RefreshRateOverlay(FpsRange fpsRange, bool showSpinner) return; } constexpr float kFrameRate = 0.f; constexpr int8_t kCompatibility = static_cast<int8_t>(Layer::FrameRateCompatibility::NoVote); constexpr int8_t kSeamlessness = ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS; SurfaceComposerClient::Transaction() .setFrameRate(mSurfaceControl, kFrameRate, kCompatibility, kSeamlessness) createTransaction(mSurfaceControl) .setLayer(mSurfaceControl, INT32_MAX - 2) .setTrustedOverlay(mSurfaceControl, true) .apply(); Loading @@ -243,9 +247,7 @@ auto RefreshRateOverlay::getOrCreateBuffers(Fps fps) -> const Buffers& { } }(); SurfaceComposerClient::Transaction t; t.setTransform(mSurfaceControl, transform); t.apply(); createTransaction(mSurfaceControl).setTransform(mSurfaceControl, transform).apply(); BufferCache::const_iterator it = mBufferCache.find({fps.getIntValue(), transformHint}); if (it == mBufferCache.end()) { Loading Loading @@ -287,25 +289,21 @@ void RefreshRateOverlay::setViewport(ui::Size viewport) { Rect frame((3 * width) >> 4, height >> 5); frame.offsetBy(width >> 5, height >> 4); SurfaceComposerClient::Transaction t; t.setMatrix(mSurfaceControl, frame.getWidth() / static_cast<float>(kBufferWidth), 0, 0, frame.getHeight() / static_cast<float>(kBufferHeight)); t.setPosition(mSurfaceControl, frame.left, frame.top); t.apply(); createTransaction(mSurfaceControl) .setMatrix(mSurfaceControl, frame.getWidth() / static_cast<float>(kBufferWidth), 0, 0, frame.getHeight() / static_cast<float>(kBufferHeight)) .setPosition(mSurfaceControl, frame.left, frame.top) .apply(); } void RefreshRateOverlay::setLayerStack(ui::LayerStack stack) { SurfaceComposerClient::Transaction t; t.setLayerStack(mSurfaceControl, stack); t.apply(); createTransaction(mSurfaceControl).setLayerStack(mSurfaceControl, stack).apply(); } void RefreshRateOverlay::changeRefreshRate(Fps fps) { mCurrentFps = fps; const auto buffer = getOrCreateBuffers(fps)[mFrame]; SurfaceComposerClient::Transaction t; t.setBuffer(mSurfaceControl, buffer); t.apply(); createTransaction(mSurfaceControl).setBuffer(mSurfaceControl, buffer).apply(); } void RefreshRateOverlay::animate() { Loading @@ -314,9 +312,7 @@ void RefreshRateOverlay::animate() { const auto& buffers = getOrCreateBuffers(*mCurrentFps); mFrame = (mFrame + 1) % buffers.size(); const auto buffer = buffers[mFrame]; SurfaceComposerClient::Transaction t; t.setBuffer(mSurfaceControl, buffer); t.apply(); createTransaction(mSurfaceControl).setBuffer(mSurfaceControl, buffer).apply(); } } // namespace android