xref: /aosp_15_r20/frameworks/base/libs/hostgraphics/ADisplay.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright 2024 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 
17*d57664e9SAndroid Build Coastguard Worker #include <apex/display.h>
18*d57664e9SAndroid Build Coastguard Worker #include <utils/Errors.h>
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker namespace android::display::impl {
21*d57664e9SAndroid Build Coastguard Worker 
22*d57664e9SAndroid Build Coastguard Worker /**
23*d57664e9SAndroid Build Coastguard Worker  * Implementation of ADisplayConfig
24*d57664e9SAndroid Build Coastguard Worker  */
25*d57664e9SAndroid Build Coastguard Worker struct DisplayConfigImpl {
26*d57664e9SAndroid Build Coastguard Worker     /**
27*d57664e9SAndroid Build Coastguard Worker      * The width in pixels of the display configuration.
28*d57664e9SAndroid Build Coastguard Worker      */
29*d57664e9SAndroid Build Coastguard Worker     int32_t width{1080};
30*d57664e9SAndroid Build Coastguard Worker 
31*d57664e9SAndroid Build Coastguard Worker     /**
32*d57664e9SAndroid Build Coastguard Worker      * The height in pixels of the display configuration.
33*d57664e9SAndroid Build Coastguard Worker      */
34*d57664e9SAndroid Build Coastguard Worker 
35*d57664e9SAndroid Build Coastguard Worker     int32_t height{1920};
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker     /**
38*d57664e9SAndroid Build Coastguard Worker      * The refresh rate of the display configuration, in frames per second.
39*d57664e9SAndroid Build Coastguard Worker      */
40*d57664e9SAndroid Build Coastguard Worker     float fps{60.0};
41*d57664e9SAndroid Build Coastguard Worker 
42*d57664e9SAndroid Build Coastguard Worker     /**
43*d57664e9SAndroid Build Coastguard Worker      * The vsync offset at which surfaceflinger runs, in nanoseconds.
44*d57664e9SAndroid Build Coastguard Worker      */
45*d57664e9SAndroid Build Coastguard Worker     int64_t sfOffset{0};
46*d57664e9SAndroid Build Coastguard Worker 
47*d57664e9SAndroid Build Coastguard Worker     /**
48*d57664e9SAndroid Build Coastguard Worker      * The vsync offset at which applications run, in nanoseconds.
49*d57664e9SAndroid Build Coastguard Worker      */
50*d57664e9SAndroid Build Coastguard Worker     int64_t appOffset{0};
51*d57664e9SAndroid Build Coastguard Worker };
52*d57664e9SAndroid Build Coastguard Worker 
53*d57664e9SAndroid Build Coastguard Worker // DisplayConfigImpl allocation is not managed through C++ memory apis, so
54*d57664e9SAndroid Build Coastguard Worker // preventing calling the destructor here.
55*d57664e9SAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible<DisplayConfigImpl>::value);
56*d57664e9SAndroid Build Coastguard Worker 
57*d57664e9SAndroid Build Coastguard Worker /**
58*d57664e9SAndroid Build Coastguard Worker  * Implementation of ADisplay
59*d57664e9SAndroid Build Coastguard Worker  */
60*d57664e9SAndroid Build Coastguard Worker struct DisplayImpl {
61*d57664e9SAndroid Build Coastguard Worker     /**
62*d57664e9SAndroid Build Coastguard Worker      * The type of the display, i.e. whether it is an internal or external
63*d57664e9SAndroid Build Coastguard Worker      * display.
64*d57664e9SAndroid Build Coastguard Worker      */
65*d57664e9SAndroid Build Coastguard Worker     ADisplayType type;
66*d57664e9SAndroid Build Coastguard Worker 
67*d57664e9SAndroid Build Coastguard Worker     /**
68*d57664e9SAndroid Build Coastguard Worker      * The preferred WCG dataspace
69*d57664e9SAndroid Build Coastguard Worker      */
70*d57664e9SAndroid Build Coastguard Worker     ADataSpace wcgDataspace;
71*d57664e9SAndroid Build Coastguard Worker 
72*d57664e9SAndroid Build Coastguard Worker     /**
73*d57664e9SAndroid Build Coastguard Worker      * The preferred WCG pixel format
74*d57664e9SAndroid Build Coastguard Worker      */
75*d57664e9SAndroid Build Coastguard Worker     AHardwareBuffer_Format wcgPixelFormat;
76*d57664e9SAndroid Build Coastguard Worker 
77*d57664e9SAndroid Build Coastguard Worker     /**
78*d57664e9SAndroid Build Coastguard Worker      * The config for this display.
79*d57664e9SAndroid Build Coastguard Worker      */
80*d57664e9SAndroid Build Coastguard Worker     DisplayConfigImpl config;
81*d57664e9SAndroid Build Coastguard Worker };
82*d57664e9SAndroid Build Coastguard Worker 
83*d57664e9SAndroid Build Coastguard Worker // DisplayImpl allocation is not managed through C++ memory apis, so
84*d57664e9SAndroid Build Coastguard Worker // preventing calling the destructor here.
85*d57664e9SAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible<DisplayImpl>::value);
86*d57664e9SAndroid Build Coastguard Worker 
87*d57664e9SAndroid Build Coastguard Worker } // namespace android::display::impl
88*d57664e9SAndroid Build Coastguard Worker 
89*d57664e9SAndroid Build Coastguard Worker using namespace android;
90*d57664e9SAndroid Build Coastguard Worker using namespace android::display::impl;
91*d57664e9SAndroid Build Coastguard Worker 
92*d57664e9SAndroid Build Coastguard Worker namespace android {
93*d57664e9SAndroid Build Coastguard Worker 
ADisplay_acquirePhysicalDisplays(ADisplay *** outDisplays)94*d57664e9SAndroid Build Coastguard Worker int ADisplay_acquirePhysicalDisplays(ADisplay*** outDisplays) {
95*d57664e9SAndroid Build Coastguard Worker     // This is running on host, so there are no physical displays available.
96*d57664e9SAndroid Build Coastguard Worker     // Create 1 fake display instead.
97*d57664e9SAndroid Build Coastguard Worker     DisplayImpl** const impls =
98*d57664e9SAndroid Build Coastguard Worker             reinterpret_cast<DisplayImpl**>(malloc(sizeof(DisplayImpl*) + sizeof(DisplayImpl)));
99*d57664e9SAndroid Build Coastguard Worker     DisplayImpl* const displayData = reinterpret_cast<DisplayImpl*>(impls + 1);
100*d57664e9SAndroid Build Coastguard Worker 
101*d57664e9SAndroid Build Coastguard Worker     displayData[0] =
102*d57664e9SAndroid Build Coastguard Worker             DisplayImpl{ADisplayType::DISPLAY_TYPE_INTERNAL, ADataSpace::ADATASPACE_UNKNOWN,
103*d57664e9SAndroid Build Coastguard Worker                         AHardwareBuffer_Format::AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
104*d57664e9SAndroid Build Coastguard Worker                         DisplayConfigImpl()};
105*d57664e9SAndroid Build Coastguard Worker     impls[0] = displayData;
106*d57664e9SAndroid Build Coastguard Worker     *outDisplays = reinterpret_cast<ADisplay**>(impls);
107*d57664e9SAndroid Build Coastguard Worker     return 1;
108*d57664e9SAndroid Build Coastguard Worker }
109*d57664e9SAndroid Build Coastguard Worker 
ADisplay_release(ADisplay ** displays)110*d57664e9SAndroid Build Coastguard Worker void ADisplay_release(ADisplay** displays) {
111*d57664e9SAndroid Build Coastguard Worker     if (displays == nullptr) {
112*d57664e9SAndroid Build Coastguard Worker         return;
113*d57664e9SAndroid Build Coastguard Worker     }
114*d57664e9SAndroid Build Coastguard Worker     free(displays);
115*d57664e9SAndroid Build Coastguard Worker }
116*d57664e9SAndroid Build Coastguard Worker 
ADisplay_getMaxSupportedFps(ADisplay * display)117*d57664e9SAndroid Build Coastguard Worker float ADisplay_getMaxSupportedFps(ADisplay* display) {
118*d57664e9SAndroid Build Coastguard Worker     DisplayImpl* impl = reinterpret_cast<DisplayImpl*>(display);
119*d57664e9SAndroid Build Coastguard Worker     return impl->config.fps;
120*d57664e9SAndroid Build Coastguard Worker }
121*d57664e9SAndroid Build Coastguard Worker 
ADisplay_getDisplayType(ADisplay * display)122*d57664e9SAndroid Build Coastguard Worker ADisplayType ADisplay_getDisplayType(ADisplay* display) {
123*d57664e9SAndroid Build Coastguard Worker     return reinterpret_cast<DisplayImpl*>(display)->type;
124*d57664e9SAndroid Build Coastguard Worker }
125*d57664e9SAndroid Build Coastguard Worker 
ADisplay_getPreferredWideColorFormat(ADisplay * display,ADataSpace * outDataspace,AHardwareBuffer_Format * outPixelFormat)126*d57664e9SAndroid Build Coastguard Worker void ADisplay_getPreferredWideColorFormat(ADisplay* display, ADataSpace* outDataspace,
127*d57664e9SAndroid Build Coastguard Worker                                           AHardwareBuffer_Format* outPixelFormat) {
128*d57664e9SAndroid Build Coastguard Worker     DisplayImpl* impl = reinterpret_cast<DisplayImpl*>(display);
129*d57664e9SAndroid Build Coastguard Worker     *outDataspace = impl->wcgDataspace;
130*d57664e9SAndroid Build Coastguard Worker     *outPixelFormat = impl->wcgPixelFormat;
131*d57664e9SAndroid Build Coastguard Worker }
132*d57664e9SAndroid Build Coastguard Worker 
ADisplay_getCurrentConfig(ADisplay * display,ADisplayConfig ** outConfig)133*d57664e9SAndroid Build Coastguard Worker int ADisplay_getCurrentConfig(ADisplay* display, ADisplayConfig** outConfig) {
134*d57664e9SAndroid Build Coastguard Worker     DisplayImpl* impl = reinterpret_cast<DisplayImpl*>(display);
135*d57664e9SAndroid Build Coastguard Worker     *outConfig = reinterpret_cast<ADisplayConfig*>(&impl->config);
136*d57664e9SAndroid Build Coastguard Worker     return OK;
137*d57664e9SAndroid Build Coastguard Worker }
138*d57664e9SAndroid Build Coastguard Worker 
ADisplayConfig_getWidth(ADisplayConfig * config)139*d57664e9SAndroid Build Coastguard Worker int32_t ADisplayConfig_getWidth(ADisplayConfig* config) {
140*d57664e9SAndroid Build Coastguard Worker     return reinterpret_cast<DisplayConfigImpl*>(config)->width;
141*d57664e9SAndroid Build Coastguard Worker }
142*d57664e9SAndroid Build Coastguard Worker 
ADisplayConfig_getHeight(ADisplayConfig * config)143*d57664e9SAndroid Build Coastguard Worker int32_t ADisplayConfig_getHeight(ADisplayConfig* config) {
144*d57664e9SAndroid Build Coastguard Worker     return reinterpret_cast<DisplayConfigImpl*>(config)->height;
145*d57664e9SAndroid Build Coastguard Worker }
146*d57664e9SAndroid Build Coastguard Worker 
ADisplayConfig_getFps(ADisplayConfig * config)147*d57664e9SAndroid Build Coastguard Worker float ADisplayConfig_getFps(ADisplayConfig* config) {
148*d57664e9SAndroid Build Coastguard Worker     return reinterpret_cast<DisplayConfigImpl*>(config)->fps;
149*d57664e9SAndroid Build Coastguard Worker }
150*d57664e9SAndroid Build Coastguard Worker 
ADisplayConfig_getCompositorOffsetNanos(ADisplayConfig * config)151*d57664e9SAndroid Build Coastguard Worker int64_t ADisplayConfig_getCompositorOffsetNanos(ADisplayConfig* config) {
152*d57664e9SAndroid Build Coastguard Worker     return reinterpret_cast<DisplayConfigImpl*>(config)->sfOffset;
153*d57664e9SAndroid Build Coastguard Worker }
154*d57664e9SAndroid Build Coastguard Worker 
ADisplayConfig_getAppVsyncOffsetNanos(ADisplayConfig * config)155*d57664e9SAndroid Build Coastguard Worker int64_t ADisplayConfig_getAppVsyncOffsetNanos(ADisplayConfig* config) {
156*d57664e9SAndroid Build Coastguard Worker     return reinterpret_cast<DisplayConfigImpl*>(config)->appOffset;
157*d57664e9SAndroid Build Coastguard Worker }
158*d57664e9SAndroid Build Coastguard Worker 
159*d57664e9SAndroid Build Coastguard Worker } // namespace android
160