xref: /aosp_15_r20/frameworks/base/libs/hwui/DeviceInfo.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker #ifndef DEVICEINFO_H
17*d57664e9SAndroid Build Coastguard Worker #define DEVICEINFO_H
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include <SkColorSpace.h>
20*d57664e9SAndroid Build Coastguard Worker #include <SkImageInfo.h>
21*d57664e9SAndroid Build Coastguard Worker #include <SkRefCnt.h>
22*d57664e9SAndroid Build Coastguard Worker #include <android/data_space.h>
23*d57664e9SAndroid Build Coastguard Worker 
24*d57664e9SAndroid Build Coastguard Worker #include <mutex>
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker #include "Properties.h"
27*d57664e9SAndroid Build Coastguard Worker #include "utils/Macros.h"
28*d57664e9SAndroid Build Coastguard Worker 
29*d57664e9SAndroid Build Coastguard Worker namespace android {
30*d57664e9SAndroid Build Coastguard Worker namespace uirenderer {
31*d57664e9SAndroid Build Coastguard Worker 
32*d57664e9SAndroid Build Coastguard Worker namespace renderthread {
33*d57664e9SAndroid Build Coastguard Worker     class RenderThread;
34*d57664e9SAndroid Build Coastguard Worker }
35*d57664e9SAndroid Build Coastguard Worker 
36*d57664e9SAndroid Build Coastguard Worker class DeviceInfo {
37*d57664e9SAndroid Build Coastguard Worker     PREVENT_COPY_AND_ASSIGN(DeviceInfo);
38*d57664e9SAndroid Build Coastguard Worker 
39*d57664e9SAndroid Build Coastguard Worker public:
40*d57664e9SAndroid Build Coastguard Worker     static DeviceInfo* get();
getWidth()41*d57664e9SAndroid Build Coastguard Worker     static int32_t getWidth() { return get()->mWidth; }
getHeight()42*d57664e9SAndroid Build Coastguard Worker     static int32_t getHeight() { return get()->mHeight; }
43*d57664e9SAndroid Build Coastguard Worker     // Gets the density in density-independent pixels
getDensity()44*d57664e9SAndroid Build Coastguard Worker     static float getDensity() { return sDensity.load(); }
getVsyncPeriod()45*d57664e9SAndroid Build Coastguard Worker     static int64_t getVsyncPeriod() { return get()->mVsyncPeriod; }
getCompositorOffset()46*d57664e9SAndroid Build Coastguard Worker     static int64_t getCompositorOffset() { return get()->getCompositorOffsetInternal(); }
getAppOffset()47*d57664e9SAndroid Build Coastguard Worker     static int64_t getAppOffset() { return get()->mAppVsyncOffsetNanos; }
48*d57664e9SAndroid Build Coastguard Worker     // Sets the density in density-independent pixels
setDensity(float density)49*d57664e9SAndroid Build Coastguard Worker     static void setDensity(float density) { sDensity.store(density); }
setWidth(int32_t width)50*d57664e9SAndroid Build Coastguard Worker     static void setWidth(int32_t width) { get()->mWidth = width; }
setHeight(int32_t height)51*d57664e9SAndroid Build Coastguard Worker     static void setHeight(int32_t height) { get()->mHeight = height; }
setRefreshRate(float refreshRate)52*d57664e9SAndroid Build Coastguard Worker     static void setRefreshRate(float refreshRate) {
53*d57664e9SAndroid Build Coastguard Worker         get()->mVsyncPeriod = static_cast<int64_t>(1000000000 / refreshRate);
54*d57664e9SAndroid Build Coastguard Worker     }
setPresentationDeadlineNanos(int64_t deadlineNanos)55*d57664e9SAndroid Build Coastguard Worker     static void setPresentationDeadlineNanos(int64_t deadlineNanos) {
56*d57664e9SAndroid Build Coastguard Worker         get()->mPresentationDeadlineNanos = deadlineNanos;
57*d57664e9SAndroid Build Coastguard Worker     }
setAppVsyncOffsetNanos(int64_t offsetNanos)58*d57664e9SAndroid Build Coastguard Worker     static void setAppVsyncOffsetNanos(int64_t offsetNanos) {
59*d57664e9SAndroid Build Coastguard Worker         get()->mAppVsyncOffsetNanos = offsetNanos;
60*d57664e9SAndroid Build Coastguard Worker     }
61*d57664e9SAndroid Build Coastguard Worker     static void setWideColorDataspace(ADataSpace dataspace);
62*d57664e9SAndroid Build Coastguard Worker 
63*d57664e9SAndroid Build Coastguard Worker     static void setSupportFp16ForHdr(bool supportFp16ForHdr);
isSupportFp16ForHdr()64*d57664e9SAndroid Build Coastguard Worker     static bool isSupportFp16ForHdr() {
65*d57664e9SAndroid Build Coastguard Worker         if (!Properties::hdr10bitPlus) {
66*d57664e9SAndroid Build Coastguard Worker             return false;
67*d57664e9SAndroid Build Coastguard Worker         }
68*d57664e9SAndroid Build Coastguard Worker 
69*d57664e9SAndroid Build Coastguard Worker         return get()->mSupportFp16ForHdr;
70*d57664e9SAndroid Build Coastguard Worker     };
71*d57664e9SAndroid Build Coastguard Worker 
72*d57664e9SAndroid Build Coastguard Worker     static void setSupportRgba10101010ForHdr(bool supportRgba10101010ForHdr);
isSupportRgba10101010ForHdr()73*d57664e9SAndroid Build Coastguard Worker     static bool isSupportRgba10101010ForHdr() {
74*d57664e9SAndroid Build Coastguard Worker         if (!Properties::hdr10bitPlus) {
75*d57664e9SAndroid Build Coastguard Worker             return false;
76*d57664e9SAndroid Build Coastguard Worker         }
77*d57664e9SAndroid Build Coastguard Worker 
78*d57664e9SAndroid Build Coastguard Worker         return get()->mSupportRgba10101010ForHdr;
79*d57664e9SAndroid Build Coastguard Worker     };
80*d57664e9SAndroid Build Coastguard Worker 
81*d57664e9SAndroid Build Coastguard Worker     static void setSupportMixedColorSpaces(bool supportMixedColorSpaces);
isSupportMixedColorSpaces()82*d57664e9SAndroid Build Coastguard Worker     static bool isSupportMixedColorSpaces() { return get()->mSupportMixedColorSpaces; };
83*d57664e9SAndroid Build Coastguard Worker 
84*d57664e9SAndroid Build Coastguard Worker     // this value is only valid after the GPU has been initialized and there is a valid graphics
85*d57664e9SAndroid Build Coastguard Worker     // context or if you are using the HWUI_NULL_GPU
86*d57664e9SAndroid Build Coastguard Worker     int maxTextureSize() const;
hasMaxTextureSize()87*d57664e9SAndroid Build Coastguard Worker     bool hasMaxTextureSize() const { return mMaxTextureSize > 0; }
getWideColorSpace()88*d57664e9SAndroid Build Coastguard Worker     sk_sp<SkColorSpace> getWideColorSpace() const { return mWideColorSpace; }
getWideColorType()89*d57664e9SAndroid Build Coastguard Worker     SkColorType getWideColorType() {
90*d57664e9SAndroid Build Coastguard Worker         static std::once_flag kFlag;
91*d57664e9SAndroid Build Coastguard Worker         // lazily update display info from SF here, so that the call is performed by RenderThread.
92*d57664e9SAndroid Build Coastguard Worker         std::call_once(kFlag, [&, this]() { updateDisplayInfo(); });
93*d57664e9SAndroid Build Coastguard Worker         return mWideColorType;
94*d57664e9SAndroid Build Coastguard Worker     }
95*d57664e9SAndroid Build Coastguard Worker 
96*d57664e9SAndroid Build Coastguard Worker     // This method should be called whenever the display refresh rate changes.
97*d57664e9SAndroid Build Coastguard Worker     void onRefreshRateChanged(int64_t vsyncPeriod);
98*d57664e9SAndroid Build Coastguard Worker 
99*d57664e9SAndroid Build Coastguard Worker private:
100*d57664e9SAndroid Build Coastguard Worker     friend class renderthread::RenderThread;
101*d57664e9SAndroid Build Coastguard Worker     static void setMaxTextureSize(int maxTextureSize);
102*d57664e9SAndroid Build Coastguard Worker     void updateDisplayInfo();
getCompositorOffsetInternal()103*d57664e9SAndroid Build Coastguard Worker     int64_t getCompositorOffsetInternal() const {
104*d57664e9SAndroid Build Coastguard Worker         // Assume that SF takes around a millisecond to latch buffers after
105*d57664e9SAndroid Build Coastguard Worker         // waking up
106*d57664e9SAndroid Build Coastguard Worker         return mVsyncPeriod - (mPresentationDeadlineNanos - 1000000);
107*d57664e9SAndroid Build Coastguard Worker     }
108*d57664e9SAndroid Build Coastguard Worker 
109*d57664e9SAndroid Build Coastguard Worker     DeviceInfo();
110*d57664e9SAndroid Build Coastguard Worker     ~DeviceInfo() = default;
111*d57664e9SAndroid Build Coastguard Worker 
112*d57664e9SAndroid Build Coastguard Worker     int mMaxTextureSize;
113*d57664e9SAndroid Build Coastguard Worker     sk_sp<SkColorSpace> mWideColorSpace = SkColorSpace::MakeSRGB();
114*d57664e9SAndroid Build Coastguard Worker     bool mSupportFp16ForHdr = false;
115*d57664e9SAndroid Build Coastguard Worker     bool mSupportRgba10101010ForHdr = false;
116*d57664e9SAndroid Build Coastguard Worker     bool mSupportMixedColorSpaces = false;
117*d57664e9SAndroid Build Coastguard Worker     SkColorType mWideColorType = SkColorType::kN32_SkColorType;
118*d57664e9SAndroid Build Coastguard Worker     int mDisplaysSize = 0;
119*d57664e9SAndroid Build Coastguard Worker     int mPhysicalDisplayIndex = -1;
120*d57664e9SAndroid Build Coastguard Worker     int32_t mWidth = 1080;
121*d57664e9SAndroid Build Coastguard Worker     int32_t mHeight = 1920;
122*d57664e9SAndroid Build Coastguard Worker     int64_t mVsyncPeriod = 16666666;
123*d57664e9SAndroid Build Coastguard Worker     // Magically corresponds with an sf offset of 0 for a sane default.
124*d57664e9SAndroid Build Coastguard Worker     int64_t mPresentationDeadlineNanos = 17666666;
125*d57664e9SAndroid Build Coastguard Worker     int64_t mAppVsyncOffsetNanos = 0;
126*d57664e9SAndroid Build Coastguard Worker 
127*d57664e9SAndroid Build Coastguard Worker     // Density is not retrieved from the ADisplay apis, so this may potentially
128*d57664e9SAndroid Build Coastguard Worker     // be called on multiple threads.
129*d57664e9SAndroid Build Coastguard Worker     // Unit is density-independent pixels
130*d57664e9SAndroid Build Coastguard Worker     static std::atomic<float> sDensity;
131*d57664e9SAndroid Build Coastguard Worker };
132*d57664e9SAndroid Build Coastguard Worker 
133*d57664e9SAndroid Build Coastguard Worker } /* namespace uirenderer */
134*d57664e9SAndroid Build Coastguard Worker } /* namespace android */
135*d57664e9SAndroid Build Coastguard Worker 
136*d57664e9SAndroid Build Coastguard Worker #endif /* DEVICEINFO_H */
137