2 #include <android/system/window.h>
3 #include <android/hardware/gralloc.h>
7 #include "nativewindowbase.h"
11 #include <android/android-version.h>
13 #define TRACE(message, ...) HYBRIS_DEBUG_LOG(EGL, message, ##__VA_ARGS__)
15 BaseNativeWindowBuffer::BaseNativeWindowBuffer()
19 // done in ANativeWindowBuffer::ANativeWindowBuffer
20 // common.magic = ANDROID_NATIVE_WINDOW_MAGIC;
21 // common.version = sizeof(ANativeWindow);
22 // memset(common.reserved, 0, sizeof(window->native.common.reserved));
24 ANativeWindowBuffer::common
.decRef
= _decRef
;
25 ANativeWindowBuffer::common
.incRef
= _incRef
;
26 ANativeWindowBuffer::width
= 0;
27 ANativeWindowBuffer::height
= 0;
28 ANativeWindowBuffer::stride
= 0;
29 ANativeWindowBuffer::format
= 0;
30 ANativeWindowBuffer::usage
= 0;
31 ANativeWindowBuffer::handle
= 0;
37 BaseNativeWindowBuffer::~BaseNativeWindowBuffer()
41 ANativeWindowBuffer::common
.decRef
= NULL
;
42 ANativeWindowBuffer::common
.incRef
= NULL
;
47 void BaseNativeWindowBuffer::_decRef(struct android_native_base_t
* base
)
49 ANativeWindowBuffer
* self
= container_of(base
, ANativeWindowBuffer
, common
);
50 BaseNativeWindowBuffer
* bnwb
= static_cast<BaseNativeWindowBuffer
*>(self
) ;
52 TRACE("%p refcount = %i",bnwb
, bnwb
->refcount
- 1);
54 if (__sync_fetch_and_sub(&bnwb
->refcount
,1) == 1)
62 void BaseNativeWindowBuffer::_incRef(struct android_native_base_t
* base
)
64 ANativeWindowBuffer
* self
= container_of(base
, ANativeWindowBuffer
, common
);
65 BaseNativeWindowBuffer
* bnwb
= static_cast<BaseNativeWindowBuffer
*>(self
) ;
67 TRACE("%p refcount = %i", bnwb
, bnwb
->refcount
+ 1);
68 __sync_fetch_and_add(&bnwb
->refcount
,1);
71 ANativeWindowBuffer
* BaseNativeWindowBuffer::getNativeBuffer() const
73 return static_cast<ANativeWindowBuffer
*>(const_cast<BaseNativeWindowBuffer
*>(this));
76 BaseNativeWindow::BaseNativeWindow()
78 TRACE("this=%p or A %p", this, (ANativeWindow
*)this);
79 // done in ANativeWindow
80 // common.magic = ANDROID_NATIVE_WINDOW_MAGIC;
81 // common.version = sizeof(ANativeWindow);
82 // memset(common.reserved, 0, sizeof(window->native.common.reserved));
83 ANativeWindow::common
.decRef
= _decRef
;
84 ANativeWindow::common
.incRef
= _incRef
;
86 const_cast<uint32_t&>(ANativeWindow::flags
) = 0;
87 const_cast<float&>(ANativeWindow::xdpi
) = 0;
88 const_cast<float&>(ANativeWindow::ydpi
) = 0;
89 const_cast<int&>(ANativeWindow::minSwapInterval
) = 0;
90 const_cast<int&>(ANativeWindow::maxSwapInterval
) = 0;
92 ANativeWindow::setSwapInterval
= _setSwapInterval
;
94 #if ANDROID_VERSION_MAJOR>=4 && ANDROID_VERSION_MINOR>=2
95 ANativeWindow::lockBuffer_DEPRECATED
= &_lockBuffer_DEPRECATED
;
96 ANativeWindow::dequeueBuffer_DEPRECATED
= &_dequeueBuffer_DEPRECATED
;
97 ANativeWindow::queueBuffer_DEPRECATED
= &_queueBuffer_DEPRECATED
;
98 ANativeWindow::cancelBuffer_DEPRECATED
= &_cancelBuffer_DEPRECATED
;
99 ANativeWindow::queueBuffer
= &_queueBuffer
;
100 ANativeWindow::dequeueBuffer
= &_dequeueBuffer
;
101 ANativeWindow::cancelBuffer
= &_cancelBuffer
;
103 ANativeWindow::lockBuffer
= &_lockBuffer_DEPRECATED
;
104 ANativeWindow::dequeueBuffer
= &_dequeueBuffer_DEPRECATED
;
105 ANativeWindow::queueBuffer
= &_queueBuffer_DEPRECATED
;
106 ANativeWindow::cancelBuffer
= &_cancelBuffer_DEPRECATED
;
108 ANativeWindow::query
= &_query
;
109 ANativeWindow::perform
= &_perform
;
114 BaseNativeWindow::~BaseNativeWindow()
117 ANativeWindow::common
.decRef
= NULL
;
118 ANativeWindow::common
.incRef
= NULL
;
122 void BaseNativeWindow::_decRef(struct android_native_base_t
* base
)
124 ANativeWindow
* self
= container_of(base
, ANativeWindow
, common
);
125 BaseNativeWindow
* bnw
= static_cast<BaseNativeWindow
*>(self
);
127 TRACE("%p refcount = %i", bnw
, bnw
->refcount
- 1);
129 if (__sync_fetch_and_sub(&bnw
->refcount
,1) == 1)
135 void BaseNativeWindow::_incRef(struct android_native_base_t
* base
)
137 ANativeWindow
* self
= container_of(base
, ANativeWindow
, common
);
138 BaseNativeWindow
* bnw
= static_cast<BaseNativeWindow
*>(self
);
140 TRACE("%p refcount = %i", bnw
, bnw
->refcount
+ 1);
143 __sync_fetch_and_add(&bnw
->refcount
,1);
146 int BaseNativeWindow::_setSwapInterval(struct ANativeWindow
* window
, int interval
)
148 return static_cast<BaseNativeWindow
*>(window
)->setSwapInterval(interval
);
151 int BaseNativeWindow::_dequeueBuffer_DEPRECATED(ANativeWindow
* window
, ANativeWindowBuffer
** buffer
)
153 BaseNativeWindowBuffer
* temp
= static_cast<BaseNativeWindowBuffer
*>(*buffer
);
155 int ret
= static_cast<BaseNativeWindow
*>(window
)->dequeueBuffer(&temp
, &fenceFd
);
156 *buffer
= static_cast<ANativeWindowBuffer
*>(temp
);
160 int BaseNativeWindow::_dequeueBuffer(struct ANativeWindow
*window
, ANativeWindowBuffer
**buffer
, int *fenceFd
)
162 BaseNativeWindowBuffer
*nativeBuffer
= static_cast<BaseNativeWindowBuffer
*>(*buffer
);
163 int ret
= static_cast<BaseNativeWindow
*>(window
)->dequeueBuffer(&nativeBuffer
, fenceFd
);
164 *buffer
= static_cast<ANativeWindowBuffer
*>(nativeBuffer
);
168 int BaseNativeWindow::_queueBuffer_DEPRECATED(struct ANativeWindow
* window
, ANativeWindowBuffer
* buffer
)
170 BaseNativeWindow
*nativeWindow
= static_cast<BaseNativeWindow
*>(window
);
171 BaseNativeWindowBuffer
*nativeBuffer
= static_cast<BaseNativeWindowBuffer
*>(buffer
);
173 return nativeWindow
->queueBuffer(nativeBuffer
, -1);
176 int BaseNativeWindow::_queueBuffer(struct ANativeWindow
*window
, ANativeWindowBuffer
*buffer
, int fenceFd
)
178 BaseNativeWindow
*nativeWindow
= static_cast<BaseNativeWindow
*>(window
);
179 BaseNativeWindowBuffer
*nativeBuffer
= static_cast<BaseNativeWindowBuffer
*>(buffer
);
181 return nativeWindow
->queueBuffer(nativeBuffer
, fenceFd
);
184 int BaseNativeWindow::_cancelBuffer_DEPRECATED(struct ANativeWindow
* window
, ANativeWindowBuffer
* buffer
)
186 BaseNativeWindow
*nativeWindow
= static_cast<BaseNativeWindow
*>(window
);
187 BaseNativeWindowBuffer
*nativeBuffer
= static_cast<BaseNativeWindowBuffer
*>(buffer
);
189 return nativeWindow
->cancelBuffer(nativeBuffer
, -1);
192 int BaseNativeWindow::_cancelBuffer(struct ANativeWindow
*window
, ANativeWindowBuffer
*buffer
, int fenceFd
)
194 BaseNativeWindow
*nativeWindow
= static_cast<BaseNativeWindow
*>(window
);
195 BaseNativeWindowBuffer
*nativeBuffer
= static_cast<BaseNativeWindowBuffer
*>(buffer
);
197 return nativeWindow
->cancelBuffer(nativeBuffer
, fenceFd
);
200 int BaseNativeWindow::_lockBuffer_DEPRECATED(struct ANativeWindow
* window
, ANativeWindowBuffer
* buffer
)
202 return static_cast<BaseNativeWindow
*>(window
)->lockBuffer(static_cast<BaseNativeWindowBuffer
*>(buffer
));
205 const char *BaseNativeWindow::_native_window_operation(int what
)
208 case NATIVE_WINDOW_SET_USAGE
: return "NATIVE_WINDOW_SET_USAGE";
209 case NATIVE_WINDOW_CONNECT
: return "NATIVE_WINDOW_CONNECT";
210 case NATIVE_WINDOW_DISCONNECT
: return "NATIVE_WINDOW_DISCONNECT";
211 case NATIVE_WINDOW_SET_CROP
: return "NATIVE_WINDOW_SET_CROP";
212 case NATIVE_WINDOW_SET_BUFFER_COUNT
: return "NATIVE_WINDOW_SET_BUFFER_COUNT";
213 case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY
: return "NATIVE_WINDOW_SET_BUFFERS_GEOMETRY";
214 case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM
: return "NATIVE_WINDOW_SET_BUFFERS_TRANSFORM";
215 case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP
: return "NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP";
216 case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS
: return "NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS";
217 case NATIVE_WINDOW_SET_BUFFERS_FORMAT
: return "NATIVE_WINDOW_SET_BUFFERS_FORMAT";
218 case NATIVE_WINDOW_SET_SCALING_MODE
: return "NATIVE_WINDOW_SET_SCALING_MODE";
219 case NATIVE_WINDOW_LOCK
: return "NATIVE_WINDOW_LOCK";
220 case NATIVE_WINDOW_UNLOCK_AND_POST
: return "NATIVE_WINDOW_UNLOCK_AND_POST";
221 case NATIVE_WINDOW_API_CONNECT
: return "NATIVE_WINDOW_API_CONNECT";
222 case NATIVE_WINDOW_API_DISCONNECT
: return "NATIVE_WINDOW_API_DISCONNECT";
223 #if ANDROID_VERSION_MAJOR>=4 && ANDROID_VERSION_MINOR>=1
224 case NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS
: return "NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS";
225 case NATIVE_WINDOW_SET_POST_TRANSFORM_CROP
: return "NATIVE_WINDOW_SET_POST_TRANSFORM_CROP";
227 default: return "NATIVE_UNKNOWN_OPERATION";
230 const char *BaseNativeWindow::_native_query_operation(int what
)
233 case NATIVE_WINDOW_WIDTH
: return "NATIVE_WINDOW_WIDTH";
234 case NATIVE_WINDOW_HEIGHT
: return "NATIVE_WINDOW_HEIGHT";
235 case NATIVE_WINDOW_FORMAT
: return "NATIVE_WINDOW_FORMAT";
236 case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS
: return "NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS";
237 case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER
: return "NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER";
238 case NATIVE_WINDOW_CONCRETE_TYPE
: return "NATIVE_WINDOW_CONCRETE_TYPE";
239 case NATIVE_WINDOW_DEFAULT_WIDTH
: return "NATIVE_WINDOW_DEFAULT_WIDTH";
240 case NATIVE_WINDOW_DEFAULT_HEIGHT
: return "NATIVE_WINDOW_DEFAULT_HEIGHT";
241 case NATIVE_WINDOW_TRANSFORM_HINT
: return "NATIVE_WINDOW_TRANSFORM_HINT";
242 #if ANDROID_VERSION_MAJOR>=4 && ANDROID_VERSION_MINOR>=1
243 case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND
: return "NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND";
245 default: return "NATIVE_UNKNOWN_QUERY";
249 int BaseNativeWindow::_query(const struct ANativeWindow
* window
, int what
, int* value
)
251 TRACE("window:%p %i %s %p", window
, what
, _native_query_operation(what
), value
);
252 const BaseNativeWindow
* self
=static_cast<const BaseNativeWindow
*>(window
);
254 case NATIVE_WINDOW_WIDTH
:
255 *value
= self
->width();
257 case NATIVE_WINDOW_HEIGHT
:
258 *value
= self
->height();
260 case NATIVE_WINDOW_FORMAT
:
261 *value
= self
->format();
263 case NATIVE_WINDOW_CONCRETE_TYPE
:
264 *value
= self
->type();
266 case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER
:
267 *value
= self
->queueLength();
269 case NATIVE_WINDOW_DEFAULT_WIDTH
:
270 *value
= self
->defaultWidth();
272 case NATIVE_WINDOW_DEFAULT_HEIGHT
:
273 *value
= self
->defaultHeight();
275 case NATIVE_WINDOW_TRANSFORM_HINT
:
276 *value
= self
->transformHint();
278 case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS
:
282 TRACE("EGL error: unkown window attribute! %i", what
);
287 int BaseNativeWindow::_perform(struct ANativeWindow
* window
, int operation
, ... )
289 BaseNativeWindow
* self
= static_cast<BaseNativeWindow
*>(window
);
291 va_start(args
, operation
);
294 TRACE("operation = %s", _native_window_operation(operation
));
296 case NATIVE_WINDOW_SET_USAGE
: // 0,
298 int usage
= va_arg(args
, int);
300 return self
->setUsage(usage
);
302 case NATIVE_WINDOW_CONNECT
: // 1, /* deprecated */
305 case NATIVE_WINDOW_DISCONNECT
: // 2, /* deprecated */
308 case NATIVE_WINDOW_SET_CROP
: // 3, /* private */
311 case NATIVE_WINDOW_SET_BUFFER_COUNT
: // 4,
313 int cnt
= va_arg(args
, int);
314 TRACE("set buffer count %i", cnt
);
316 return self
->setBufferCount(cnt
);
319 case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY
: // 5, /* deprecated */
320 TRACE("set buffers geometry");
322 case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM
: // 6,
323 TRACE("set buffers transform");
325 case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP
: // 7,
326 TRACE("set buffers timestamp");
328 case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS
: // 8,
330 int width
= va_arg(args
, int);
331 int height
= va_arg(args
, int);
333 return self
->setBuffersDimensions(width
, height
);
335 case NATIVE_WINDOW_SET_BUFFERS_FORMAT
: // 9,
337 int format
= va_arg(args
, int);
339 return self
->setBuffersFormat(format
);
341 case NATIVE_WINDOW_SET_SCALING_MODE
: // 10, /* private */
342 TRACE("set scaling mode");
344 case NATIVE_WINDOW_LOCK
: // 11, /* private */
345 TRACE("window lock");
347 case NATIVE_WINDOW_UNLOCK_AND_POST
: // 12, /* private */
348 TRACE("unlock and post");
350 case NATIVE_WINDOW_API_CONNECT
: // 13, /* private */
351 TRACE("api connect");
353 case NATIVE_WINDOW_API_DISCONNECT
: // 14, /* private */
354 TRACE("api disconnect");
356 #if ANDROID_VERSION_MAJOR>=4 && ANDROID_VERSION_MINOR>=1
357 case NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS
: // 15, /* private */
358 TRACE("set buffers user dimensions");
360 case NATIVE_WINDOW_SET_POST_TRANSFORM_CROP
: // 16,
361 TRACE("set post transform crop");