1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2023 Google LLC
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker #include "ANativeWindowAndroid.h"
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
9*61046927SAndroid Build Coastguard Worker #include <android/native_window.h>
10*61046927SAndroid Build Coastguard Worker #include <system/window.h>
11*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker namespace gfxstream {
14*61046927SAndroid Build Coastguard Worker
isValid(EGLNativeWindowType window)15*61046927SAndroid Build Coastguard Worker bool ANativeWindowHelperAndroid::isValid(EGLNativeWindowType window) {
16*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
17*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<ANativeWindow*>(window);
18*61046927SAndroid Build Coastguard Worker return anw->common.magic == ANDROID_NATIVE_WINDOW_MAGIC;
19*61046927SAndroid Build Coastguard Worker #else
20*61046927SAndroid Build Coastguard Worker (void)window;
21*61046927SAndroid Build Coastguard Worker return false;
22*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
23*61046927SAndroid Build Coastguard Worker }
24*61046927SAndroid Build Coastguard Worker
isValid(EGLClientBuffer buffer)25*61046927SAndroid Build Coastguard Worker bool ANativeWindowHelperAndroid::isValid(EGLClientBuffer buffer) {
26*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
27*61046927SAndroid Build Coastguard Worker auto* anwb = reinterpret_cast<ANativeWindowBuffer*>(buffer);
28*61046927SAndroid Build Coastguard Worker if (anwb->common.magic != ANDROID_NATIVE_BUFFER_MAGIC) {
29*61046927SAndroid Build Coastguard Worker return false;
30*61046927SAndroid Build Coastguard Worker }
31*61046927SAndroid Build Coastguard Worker if (anwb->common.version != sizeof(android_native_buffer_t)) {
32*61046927SAndroid Build Coastguard Worker return false;
33*61046927SAndroid Build Coastguard Worker }
34*61046927SAndroid Build Coastguard Worker if (anwb->handle == nullptr) {
35*61046927SAndroid Build Coastguard Worker return false;
36*61046927SAndroid Build Coastguard Worker }
37*61046927SAndroid Build Coastguard Worker return true;
38*61046927SAndroid Build Coastguard Worker #else
39*61046927SAndroid Build Coastguard Worker (void)buffer;
40*61046927SAndroid Build Coastguard Worker return false;
41*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
42*61046927SAndroid Build Coastguard Worker }
43*61046927SAndroid Build Coastguard Worker
acquire(EGLNativeWindowType window)44*61046927SAndroid Build Coastguard Worker void ANativeWindowHelperAndroid::acquire(EGLNativeWindowType window) {
45*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
46*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<ANativeWindow*>(window);
47*61046927SAndroid Build Coastguard Worker ANativeWindow_acquire(anw);
48*61046927SAndroid Build Coastguard Worker #else
49*61046927SAndroid Build Coastguard Worker (void)window;
50*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
51*61046927SAndroid Build Coastguard Worker }
52*61046927SAndroid Build Coastguard Worker
release(EGLNativeWindowType window)53*61046927SAndroid Build Coastguard Worker void ANativeWindowHelperAndroid::release(EGLNativeWindowType window) {
54*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
55*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<ANativeWindow*>(window);
56*61046927SAndroid Build Coastguard Worker ANativeWindow_release(anw);
57*61046927SAndroid Build Coastguard Worker #else
58*61046927SAndroid Build Coastguard Worker (void)window;
59*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
60*61046927SAndroid Build Coastguard Worker }
61*61046927SAndroid Build Coastguard Worker
acquire(EGLClientBuffer buffer)62*61046927SAndroid Build Coastguard Worker void ANativeWindowHelperAndroid::acquire(EGLClientBuffer buffer) {
63*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
64*61046927SAndroid Build Coastguard Worker auto* anwb = reinterpret_cast<ANativeWindowBuffer*>(buffer);
65*61046927SAndroid Build Coastguard Worker anwb->incStrong(anwb);
66*61046927SAndroid Build Coastguard Worker #else
67*61046927SAndroid Build Coastguard Worker (void)buffer;
68*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
69*61046927SAndroid Build Coastguard Worker }
70*61046927SAndroid Build Coastguard Worker
release(EGLClientBuffer buffer)71*61046927SAndroid Build Coastguard Worker void ANativeWindowHelperAndroid::release(EGLClientBuffer buffer) {
72*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
73*61046927SAndroid Build Coastguard Worker auto* anwb = reinterpret_cast<ANativeWindowBuffer*>(buffer);
74*61046927SAndroid Build Coastguard Worker anwb->decStrong(anwb);
75*61046927SAndroid Build Coastguard Worker #else
76*61046927SAndroid Build Coastguard Worker (void)buffer;
77*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
78*61046927SAndroid Build Coastguard Worker }
79*61046927SAndroid Build Coastguard Worker
getConsumerUsage(EGLNativeWindowType window,int * usage)80*61046927SAndroid Build Coastguard Worker int ANativeWindowHelperAndroid::getConsumerUsage(EGLNativeWindowType window, int* usage) {
81*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
82*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<ANativeWindow*>(window);
83*61046927SAndroid Build Coastguard Worker return anw->query(anw, NATIVE_WINDOW_CONSUMER_USAGE_BITS, usage);
84*61046927SAndroid Build Coastguard Worker #else
85*61046927SAndroid Build Coastguard Worker (void)window;
86*61046927SAndroid Build Coastguard Worker (void)usage;
87*61046927SAndroid Build Coastguard Worker return -1;
88*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
89*61046927SAndroid Build Coastguard Worker }
90*61046927SAndroid Build Coastguard Worker
setUsage(EGLNativeWindowType window,int usage)91*61046927SAndroid Build Coastguard Worker void ANativeWindowHelperAndroid::setUsage(EGLNativeWindowType window, int usage) {
92*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
93*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<ANativeWindow*>(window);
94*61046927SAndroid Build Coastguard Worker ANativeWindow_setUsage(anw, usage);
95*61046927SAndroid Build Coastguard Worker #else
96*61046927SAndroid Build Coastguard Worker (void)window;
97*61046927SAndroid Build Coastguard Worker (void)usage;
98*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
99*61046927SAndroid Build Coastguard Worker }
100*61046927SAndroid Build Coastguard Worker
getWidth(EGLNativeWindowType window)101*61046927SAndroid Build Coastguard Worker int ANativeWindowHelperAndroid::getWidth(EGLNativeWindowType window) {
102*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
103*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<ANativeWindow*>(window);
104*61046927SAndroid Build Coastguard Worker return ANativeWindow_getWidth(anw);
105*61046927SAndroid Build Coastguard Worker #else
106*61046927SAndroid Build Coastguard Worker (void)window;
107*61046927SAndroid Build Coastguard Worker return -1;
108*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
109*61046927SAndroid Build Coastguard Worker }
110*61046927SAndroid Build Coastguard Worker
getHeight(EGLNativeWindowType window)111*61046927SAndroid Build Coastguard Worker int ANativeWindowHelperAndroid::getHeight(EGLNativeWindowType window) {
112*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
113*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<ANativeWindow*>(window);
114*61046927SAndroid Build Coastguard Worker return ANativeWindow_getHeight(anw);
115*61046927SAndroid Build Coastguard Worker #else
116*61046927SAndroid Build Coastguard Worker (void)window;
117*61046927SAndroid Build Coastguard Worker return -1;
118*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
119*61046927SAndroid Build Coastguard Worker }
120*61046927SAndroid Build Coastguard Worker
getWidth(EGLClientBuffer buffer)121*61046927SAndroid Build Coastguard Worker int ANativeWindowHelperAndroid::getWidth(EGLClientBuffer buffer) {
122*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
123*61046927SAndroid Build Coastguard Worker auto* anwb = reinterpret_cast<ANativeWindowBuffer*>(buffer);
124*61046927SAndroid Build Coastguard Worker return anwb->width;
125*61046927SAndroid Build Coastguard Worker #else
126*61046927SAndroid Build Coastguard Worker (void)buffer;
127*61046927SAndroid Build Coastguard Worker return -1;
128*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
129*61046927SAndroid Build Coastguard Worker }
130*61046927SAndroid Build Coastguard Worker
getHeight(EGLClientBuffer buffer)131*61046927SAndroid Build Coastguard Worker int ANativeWindowHelperAndroid::getHeight(EGLClientBuffer buffer) {
132*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
133*61046927SAndroid Build Coastguard Worker auto* anwb = reinterpret_cast<ANativeWindowBuffer*>(buffer);
134*61046927SAndroid Build Coastguard Worker return anwb->height;
135*61046927SAndroid Build Coastguard Worker #else
136*61046927SAndroid Build Coastguard Worker (void)buffer;
137*61046927SAndroid Build Coastguard Worker return -1;
138*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
139*61046927SAndroid Build Coastguard Worker }
140*61046927SAndroid Build Coastguard Worker
getFormat(EGLClientBuffer buffer,Gralloc * gralloc)141*61046927SAndroid Build Coastguard Worker int ANativeWindowHelperAndroid::getFormat(EGLClientBuffer buffer, Gralloc* gralloc) {
142*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
143*61046927SAndroid Build Coastguard Worker auto* anb = reinterpret_cast<ANativeWindowBuffer*>(buffer);
144*61046927SAndroid Build Coastguard Worker return gralloc->getFormat(anb->handle);
145*61046927SAndroid Build Coastguard Worker #else
146*61046927SAndroid Build Coastguard Worker (void)buffer;
147*61046927SAndroid Build Coastguard Worker (void)gralloc;
148*61046927SAndroid Build Coastguard Worker return -1;
149*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
150*61046927SAndroid Build Coastguard Worker }
151*61046927SAndroid Build Coastguard Worker
setSwapInterval(EGLNativeWindowType window,int interval)152*61046927SAndroid Build Coastguard Worker void ANativeWindowHelperAndroid::setSwapInterval(EGLNativeWindowType window, int interval) {
153*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
154*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<ANativeWindow*>(window);
155*61046927SAndroid Build Coastguard Worker anw->setSwapInterval(anw, interval);
156*61046927SAndroid Build Coastguard Worker #else
157*61046927SAndroid Build Coastguard Worker (void)window;
158*61046927SAndroid Build Coastguard Worker (void)interval;
159*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
160*61046927SAndroid Build Coastguard Worker }
161*61046927SAndroid Build Coastguard Worker
queueBuffer(EGLNativeWindowType window,EGLClientBuffer buffer,int fence)162*61046927SAndroid Build Coastguard Worker int ANativeWindowHelperAndroid::queueBuffer(EGLNativeWindowType window, EGLClientBuffer buffer,
163*61046927SAndroid Build Coastguard Worker int fence) {
164*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
165*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<ANativeWindow*>(window);
166*61046927SAndroid Build Coastguard Worker auto* anb = reinterpret_cast<ANativeWindowBuffer*>(buffer);
167*61046927SAndroid Build Coastguard Worker return ANativeWindow_queueBuffer(anw, anb, fence);
168*61046927SAndroid Build Coastguard Worker #else
169*61046927SAndroid Build Coastguard Worker (void)window;
170*61046927SAndroid Build Coastguard Worker (void)buffer;
171*61046927SAndroid Build Coastguard Worker (void)fence;
172*61046927SAndroid Build Coastguard Worker return -1;
173*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
174*61046927SAndroid Build Coastguard Worker }
175*61046927SAndroid Build Coastguard Worker
dequeueBuffer(EGLNativeWindowType window,EGLClientBuffer * buffer,int * fence)176*61046927SAndroid Build Coastguard Worker int ANativeWindowHelperAndroid::dequeueBuffer(EGLNativeWindowType window, EGLClientBuffer* buffer,
177*61046927SAndroid Build Coastguard Worker int* fence) {
178*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
179*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<ANativeWindow*>(window);
180*61046927SAndroid Build Coastguard Worker auto* anb = reinterpret_cast<ANativeWindowBuffer**>(buffer);
181*61046927SAndroid Build Coastguard Worker return ANativeWindow_dequeueBuffer(anw, anb, fence);
182*61046927SAndroid Build Coastguard Worker #else
183*61046927SAndroid Build Coastguard Worker (void)window;
184*61046927SAndroid Build Coastguard Worker (void)buffer;
185*61046927SAndroid Build Coastguard Worker (void)fence;
186*61046927SAndroid Build Coastguard Worker return -1;
187*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
188*61046927SAndroid Build Coastguard Worker }
189*61046927SAndroid Build Coastguard Worker
cancelBuffer(EGLNativeWindowType window,EGLClientBuffer buffer)190*61046927SAndroid Build Coastguard Worker int ANativeWindowHelperAndroid::cancelBuffer(EGLNativeWindowType window, EGLClientBuffer buffer) {
191*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
192*61046927SAndroid Build Coastguard Worker auto* anw = reinterpret_cast<ANativeWindow*>(window);
193*61046927SAndroid Build Coastguard Worker auto* anb = reinterpret_cast<ANativeWindowBuffer*>(buffer);
194*61046927SAndroid Build Coastguard Worker return ANativeWindow_cancelBuffer(anw, anb, -1);
195*61046927SAndroid Build Coastguard Worker #else
196*61046927SAndroid Build Coastguard Worker (void)window;
197*61046927SAndroid Build Coastguard Worker (void)buffer;
198*61046927SAndroid Build Coastguard Worker return -1;
199*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
200*61046927SAndroid Build Coastguard Worker }
201*61046927SAndroid Build Coastguard Worker
getHostHandle(EGLClientBuffer buffer,Gralloc * gralloc)202*61046927SAndroid Build Coastguard Worker int ANativeWindowHelperAndroid::getHostHandle(EGLClientBuffer buffer, Gralloc* gralloc) {
203*61046927SAndroid Build Coastguard Worker #if defined(__ANDROID__)
204*61046927SAndroid Build Coastguard Worker auto* anb = reinterpret_cast<ANativeWindowBuffer*>(buffer);
205*61046927SAndroid Build Coastguard Worker return gralloc->getHostHandle(anb->handle);
206*61046927SAndroid Build Coastguard Worker #else
207*61046927SAndroid Build Coastguard Worker (void)buffer;
208*61046927SAndroid Build Coastguard Worker (void)gralloc;
209*61046927SAndroid Build Coastguard Worker return -1;
210*61046927SAndroid Build Coastguard Worker #endif // defined(__ANDROID__)
211*61046927SAndroid Build Coastguard Worker }
212*61046927SAndroid Build Coastguard Worker
createPlatformANativeWindowHelper()213*61046927SAndroid Build Coastguard Worker ANativeWindowHelper* createPlatformANativeWindowHelper() {
214*61046927SAndroid Build Coastguard Worker return new ANativeWindowHelperAndroid();
215*61046927SAndroid Build Coastguard Worker }
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker } // namespace gfxstream
218