blob: b68a88c92854688c2f86cc82a465afaa8deea623 [file] [log] [blame]
Ady Abraham03b02dd2019-03-21 15:40:11 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Dominik Laskowski20134642020-04-20 22:36:44 -070016
Ady Abraham03b02dd2019-03-21 15:40:11 -070017#pragma once
18
Dominik Laskowskif6b4ba62021-11-09 12:46:10 -080019#include <SkColor.h>
Dominik Laskowski8c4356c2022-03-21 08:19:54 -070020#include <vector>
Dominik Laskowskif6b4ba62021-11-09 12:46:10 -080021
Ady Abraham0aa373a2022-11-22 13:56:50 -080022#include <ftl/flags.h>
Dominik Laskowski8c4356c2022-03-21 08:19:54 -070023#include <ftl/small_map.h>
Dominik Laskowski29fa1462021-04-27 15:51:50 -070024#include <ui/LayerStack.h>
Dominik Laskowski20134642020-04-20 22:36:44 -070025#include <ui/Size.h>
Dominik Laskowski8c4356c2022-03-21 08:19:54 -070026#include <ui/Transform.h>
Dominik Laskowski20134642020-04-20 22:36:44 -070027#include <utils/StrongPointer.h>
28
Dominik Laskowskif6b4ba62021-11-09 12:46:10 -080029#include <scheduler/Fps.h>
Ady Abraham03b02dd2019-03-21 15:40:11 -070030
Dominik Laskowski8c4356c2022-03-21 08:19:54 -070031class SkCanvas;
32
Ady Abraham03b02dd2019-03-21 15:40:11 -070033namespace android {
34
Dominik Laskowski20134642020-04-20 22:36:44 -070035class GraphicBuffer;
chaviw70aa7572021-09-22 12:27:57 -050036class SurfaceControl;
Ady Abraham3649ea82022-07-08 16:04:02 -070037class SurfaceFlinger;
38
39// Helper class to delete the SurfaceControl on a helper thread as
40// SurfaceControl assumes its destruction happens without SurfaceFlinger::mStateLock held.
41class SurfaceControlHolder {
42public:
43 explicit SurfaceControlHolder(sp<SurfaceControl> sc) : mSurfaceControl(std::move(sc)){};
44 ~SurfaceControlHolder();
45
46 const sp<SurfaceControl>& get() const { return mSurfaceControl; }
47
48private:
49 sp<SurfaceControl> mSurfaceControl;
50};
Dominik Laskowski20134642020-04-20 22:36:44 -070051
Ady Abraham03b02dd2019-03-21 15:40:11 -070052class RefreshRateOverlay {
53public:
Ady Abraham0aa373a2022-11-22 13:56:50 -080054 enum class Features {
55 Spinner = 1 << 0,
56 RenderRate = 1 << 1,
Yifei Zhangcfb7bb32023-01-12 16:17:14 -080057 ShowInMiddle = 1 << 2,
Ady Abraham0aa373a2022-11-22 13:56:50 -080058 };
59
60 RefreshRateOverlay(FpsRange, ftl::Flags<Features>);
Ady Abraham03b02dd2019-03-21 15:40:11 -070061
Dominik Laskowski29fa1462021-04-27 15:51:50 -070062 void setLayerStack(ui::LayerStack);
Dominik Laskowski20134642020-04-20 22:36:44 -070063 void setViewport(ui::Size);
Ady Abraham0aa373a2022-11-22 13:56:50 -080064 void changeRefreshRate(Fps, Fps);
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -070065 void animate();
Ady Abraham03b02dd2019-03-21 15:40:11 -070066
67private:
Dominik Laskowski8c4356c2022-03-21 08:19:54 -070068 using Buffers = std::vector<sp<GraphicBuffer>>;
69
Ady Abraham2cb8b622019-12-02 18:55:33 -080070 class SevenSegmentDrawer {
71 public:
Ady Abraham0aa373a2022-11-22 13:56:50 -080072 static Buffers draw(int displayFps, int renderFps, SkColor, ui::Transform::RotationFlags,
73 ftl::Flags<Features>);
Ady Abraham2cb8b622019-12-02 18:55:33 -080074
75 private:
rnlee756005b2021-05-27 10:46:36 -070076 enum class Segment { Upper, UpperLeft, UpperRight, Middle, LowerLeft, LowerRight, Bottom };
Ady Abraham2cb8b622019-12-02 18:55:33 -080077
Dominik Laskowski8c4356c2022-03-21 08:19:54 -070078 static void drawSegment(Segment, int left, SkColor, SkCanvas&);
79 static void drawDigit(int digit, int left, SkColor, SkCanvas&);
Ady Abraham0aa373a2022-11-22 13:56:50 -080080 static void drawNumber(int number, int left, SkColor, SkCanvas&);
Ady Abraham2cb8b622019-12-02 18:55:33 -080081 };
82
Ady Abraham0aa373a2022-11-22 13:56:50 -080083 const Buffers& getOrCreateBuffers(Fps, Fps);
chaviw70aa7572021-09-22 12:27:57 -050084
Dominik Laskowski8c4356c2022-03-21 08:19:54 -070085 struct Key {
Ady Abraham0aa373a2022-11-22 13:56:50 -080086 int displayFps;
87 int renderFps;
Dominik Laskowski8c4356c2022-03-21 08:19:54 -070088 ui::Transform::RotationFlags flags;
Ady Abraham03b02dd2019-03-21 15:40:11 -070089
Ady Abraham0aa373a2022-11-22 13:56:50 -080090 bool operator==(Key other) const {
91 return displayFps == other.displayFps && renderFps == other.renderFps &&
92 flags == other.flags;
93 }
Dominik Laskowski8c4356c2022-03-21 08:19:54 -070094 };
Ady Abraham03b02dd2019-03-21 15:40:11 -070095
Dominik Laskowski8c4356c2022-03-21 08:19:54 -070096 using BufferCache = ftl::SmallMap<Key, Buffers, 9>;
97 BufferCache mBufferCache;
Ady Abraham29d0da32020-07-16 18:39:33 -070098
Ady Abraham0aa373a2022-11-22 13:56:50 -080099 std::optional<Fps> mDisplayFps;
100 std::optional<Fps> mRenderFps;
Dominik Laskowski8c4356c2022-03-21 08:19:54 -0700101 size_t mFrame = 0;
102
103 const FpsRange mFpsRange; // For color interpolation.
Ady Abraham0aa373a2022-11-22 13:56:50 -0800104 const ftl::Flags<Features> mFeatures;
Marin Shalamanovf7f6b3c2020-12-09 13:19:38 +0100105
Ady Abraham3649ea82022-07-08 16:04:02 -0700106 const std::unique_ptr<SurfaceControlHolder> mSurfaceControl;
Ady Abraham03b02dd2019-03-21 15:40:11 -0700107};
108
Dominik Laskowski20134642020-04-20 22:36:44 -0700109} // namespace android