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