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