Imported Upstream version 0.1.0+git20131207+e452e83
[deb_libhybris.git] / hybris / egl / platforms / common / nativewindowbase.cpp
1 #include <string.h>
2 #include <android/system/window.h>
3 #include <android/hardware/gralloc.h>
4 #include "support.h"
5 #include <stdarg.h>
6
7 #include "nativewindowbase.h"
8
9 #include "logging.h"
10
11 #include <android/android-version.h>
12
13 #define TRACE(message, ...) HYBRIS_DEBUG_LOG(EGL, message, ##__VA_ARGS__)
14
15 BaseNativeWindowBuffer::BaseNativeWindowBuffer()
16 {
17 TRACE("%p", this);
18
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));
23
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;
32
33 refcount = 0;
34 }
35
36
37 BaseNativeWindowBuffer::~BaseNativeWindowBuffer()
38 {
39 TRACE("%p", this);
40
41 ANativeWindowBuffer::common.decRef = NULL;
42 ANativeWindowBuffer::common.incRef = NULL;
43 refcount = 0;
44 }
45
46
47 void BaseNativeWindowBuffer::_decRef(struct android_native_base_t* base)
48 {
49 ANativeWindowBuffer* self = container_of(base, ANativeWindowBuffer, common);
50 BaseNativeWindowBuffer* bnwb = static_cast<BaseNativeWindowBuffer*>(self) ;
51
52 TRACE("%p refcount = %i",bnwb, bnwb->refcount - 1);
53
54 if (__sync_fetch_and_sub(&bnwb->refcount,1) == 1)
55 {
56 delete bnwb;
57 }
58 }
59
60
61
62 void BaseNativeWindowBuffer::_incRef(struct android_native_base_t* base)
63 {
64 ANativeWindowBuffer* self = container_of(base, ANativeWindowBuffer, common);
65 BaseNativeWindowBuffer* bnwb= static_cast<BaseNativeWindowBuffer*>(self) ;
66
67 TRACE("%p refcount = %i", bnwb, bnwb->refcount + 1);
68 __sync_fetch_and_add(&bnwb->refcount,1);
69 }
70
71 ANativeWindowBuffer* BaseNativeWindowBuffer::getNativeBuffer() const
72 {
73 return static_cast<ANativeWindowBuffer*>(const_cast<BaseNativeWindowBuffer*>(this));
74 }
75
76 BaseNativeWindow::BaseNativeWindow()
77 {
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;
85
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;
91
92 ANativeWindow::setSwapInterval = _setSwapInterval;
93
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;
102 #else
103 ANativeWindow::lockBuffer = &_lockBuffer_DEPRECATED;
104 ANativeWindow::dequeueBuffer = &_dequeueBuffer_DEPRECATED;
105 ANativeWindow::queueBuffer = &_queueBuffer_DEPRECATED;
106 ANativeWindow::cancelBuffer = &_cancelBuffer_DEPRECATED;
107 #endif
108 ANativeWindow::query = &_query;
109 ANativeWindow::perform = &_perform;
110
111 refcount = 0;
112 }
113
114 BaseNativeWindow::~BaseNativeWindow()
115 {
116 TRACE("");
117 ANativeWindow::common.decRef = NULL;
118 ANativeWindow::common.incRef = NULL;
119 refcount = 0;
120 }
121
122 void BaseNativeWindow::_decRef(struct android_native_base_t* base)
123 {
124 ANativeWindow* self = container_of(base, ANativeWindow, common);
125 BaseNativeWindow* bnw = static_cast<BaseNativeWindow*>(self);
126
127 TRACE("%p refcount = %i", bnw, bnw->refcount - 1);
128
129 if (__sync_fetch_and_sub(&bnw->refcount,1) == 1)
130 {
131 delete bnw;
132 }
133 }
134
135 void BaseNativeWindow::_incRef(struct android_native_base_t* base)
136 {
137 ANativeWindow* self = container_of(base, ANativeWindow, common);
138 BaseNativeWindow* bnw = static_cast<BaseNativeWindow*>(self);
139
140 TRACE("%p refcount = %i", bnw, bnw->refcount + 1);
141
142
143 __sync_fetch_and_add(&bnw->refcount,1);
144 }
145
146 int BaseNativeWindow::_setSwapInterval(struct ANativeWindow* window, int interval)
147 {
148 return static_cast<BaseNativeWindow*>(window)->setSwapInterval(interval);
149 }
150
151 int BaseNativeWindow::_dequeueBuffer_DEPRECATED(ANativeWindow* window, ANativeWindowBuffer** buffer)
152 {
153 BaseNativeWindowBuffer* temp = static_cast<BaseNativeWindowBuffer*>(*buffer);
154 int fenceFd = -1;
155 int ret = static_cast<BaseNativeWindow*>(window)->dequeueBuffer(&temp, &fenceFd);
156 *buffer = static_cast<ANativeWindowBuffer*>(temp);
157 return ret;
158 }
159
160 int BaseNativeWindow::_dequeueBuffer(struct ANativeWindow *window, ANativeWindowBuffer **buffer, int *fenceFd)
161 {
162 BaseNativeWindowBuffer *nativeBuffer = static_cast<BaseNativeWindowBuffer*>(*buffer);
163 int ret = static_cast<BaseNativeWindow*>(window)->dequeueBuffer(&nativeBuffer, fenceFd);
164 *buffer = static_cast<ANativeWindowBuffer*>(nativeBuffer);
165 return ret;
166 }
167
168 int BaseNativeWindow::_queueBuffer_DEPRECATED(struct ANativeWindow* window, ANativeWindowBuffer* buffer)
169 {
170 BaseNativeWindow *nativeWindow = static_cast<BaseNativeWindow*>(window);
171 BaseNativeWindowBuffer *nativeBuffer = static_cast<BaseNativeWindowBuffer*>(buffer);
172
173 return nativeWindow->queueBuffer(nativeBuffer, -1);
174 }
175
176 int BaseNativeWindow::_queueBuffer(struct ANativeWindow *window, ANativeWindowBuffer *buffer, int fenceFd)
177 {
178 BaseNativeWindow *nativeWindow = static_cast<BaseNativeWindow*>(window);
179 BaseNativeWindowBuffer *nativeBuffer = static_cast<BaseNativeWindowBuffer*>(buffer);
180
181 return nativeWindow->queueBuffer(nativeBuffer, fenceFd);
182 }
183
184 int BaseNativeWindow::_cancelBuffer_DEPRECATED(struct ANativeWindow* window, ANativeWindowBuffer* buffer)
185 {
186 BaseNativeWindow *nativeWindow = static_cast<BaseNativeWindow*>(window);
187 BaseNativeWindowBuffer *nativeBuffer = static_cast<BaseNativeWindowBuffer*>(buffer);
188
189 return nativeWindow->cancelBuffer(nativeBuffer, -1);
190 }
191
192 int BaseNativeWindow::_cancelBuffer(struct ANativeWindow *window, ANativeWindowBuffer *buffer, int fenceFd)
193 {
194 BaseNativeWindow *nativeWindow = static_cast<BaseNativeWindow*>(window);
195 BaseNativeWindowBuffer *nativeBuffer = static_cast<BaseNativeWindowBuffer*>(buffer);
196
197 return nativeWindow->cancelBuffer(nativeBuffer, fenceFd);
198 }
199
200 int BaseNativeWindow::_lockBuffer_DEPRECATED(struct ANativeWindow* window, ANativeWindowBuffer* buffer)
201 {
202 return static_cast<BaseNativeWindow*>(window)->lockBuffer(static_cast<BaseNativeWindowBuffer*>(buffer));
203 }
204
205 const char *BaseNativeWindow::_native_window_operation(int what)
206 {
207 switch (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";
226 #endif
227 default: return "NATIVE_UNKNOWN_OPERATION";
228 }
229 }
230 const char *BaseNativeWindow::_native_query_operation(int what)
231 {
232 switch (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";
244 #endif
245 default: return "NATIVE_UNKNOWN_QUERY";
246 }
247 }
248
249 int BaseNativeWindow::_query(const struct ANativeWindow* window, int what, int* value)
250 {
251 TRACE("window:%p %i %s %p", window, what, _native_query_operation(what), value);
252 const BaseNativeWindow* self=static_cast<const BaseNativeWindow*>(window);
253 switch (what) {
254 case NATIVE_WINDOW_WIDTH:
255 *value = self->width();
256 return NO_ERROR;
257 case NATIVE_WINDOW_HEIGHT:
258 *value = self->height();
259 return NO_ERROR;
260 case NATIVE_WINDOW_FORMAT:
261 *value = self->format();
262 return NO_ERROR;
263 case NATIVE_WINDOW_CONCRETE_TYPE:
264 *value = self->type();
265 return NO_ERROR;
266 case NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER:
267 *value = self->queueLength();
268 return NO_ERROR;
269 case NATIVE_WINDOW_DEFAULT_WIDTH:
270 *value = self->defaultWidth();
271 return NO_ERROR;
272 case NATIVE_WINDOW_DEFAULT_HEIGHT:
273 *value = self->defaultHeight();
274 return NO_ERROR;
275 case NATIVE_WINDOW_TRANSFORM_HINT:
276 *value = self->transformHint();
277 return NO_ERROR;
278 case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS:
279 *value = 1;
280 return NO_ERROR;
281 }
282 TRACE("EGL error: unkown window attribute! %i", what);
283 *value = 0;
284 return BAD_VALUE;
285 }
286
287 int BaseNativeWindow::_perform(struct ANativeWindow* window, int operation, ... )
288 {
289 BaseNativeWindow* self = static_cast<BaseNativeWindow*>(window);
290 va_list args;
291 va_start(args, operation);
292
293 // FIXME
294 TRACE("operation = %s", _native_window_operation(operation));
295 switch(operation) {
296 case NATIVE_WINDOW_SET_USAGE : // 0,
297 {
298 int usage = va_arg(args, int);
299 va_end(args);
300 return self->setUsage(usage);
301 }
302 case NATIVE_WINDOW_CONNECT : // 1, /* deprecated */
303 TRACE("connect");
304 break;
305 case NATIVE_WINDOW_DISCONNECT : // 2, /* deprecated */
306 TRACE("disconnect");
307 break;
308 case NATIVE_WINDOW_SET_CROP : // 3, /* private */
309 TRACE("set crop");
310 break;
311 case NATIVE_WINDOW_SET_BUFFER_COUNT : // 4,
312 {
313 int cnt = va_arg(args, int);
314 TRACE("set buffer count %i", cnt);
315 va_end(args);
316 return self->setBufferCount(cnt);
317 break;
318 }
319 case NATIVE_WINDOW_SET_BUFFERS_GEOMETRY : // 5, /* deprecated */
320 TRACE("set buffers geometry");
321 break;
322 case NATIVE_WINDOW_SET_BUFFERS_TRANSFORM : // 6,
323 TRACE("set buffers transform");
324 break;
325 case NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP : // 7,
326 TRACE("set buffers timestamp");
327 break;
328 case NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS : // 8,
329 {
330 int width = va_arg(args, int);
331 int height = va_arg(args, int);
332 va_end(args);
333 return self->setBuffersDimensions(width, height);
334 }
335 case NATIVE_WINDOW_SET_BUFFERS_FORMAT : // 9,
336 {
337 int format = va_arg(args, int);
338 va_end(args);
339 return self->setBuffersFormat(format);
340 }
341 case NATIVE_WINDOW_SET_SCALING_MODE : // 10, /* private */
342 TRACE("set scaling mode");
343 break;
344 case NATIVE_WINDOW_LOCK : // 11, /* private */
345 TRACE("window lock");
346 break;
347 case NATIVE_WINDOW_UNLOCK_AND_POST : // 12, /* private */
348 TRACE("unlock and post");
349 break;
350 case NATIVE_WINDOW_API_CONNECT : // 13, /* private */
351 TRACE("api connect");
352 break;
353 case NATIVE_WINDOW_API_DISCONNECT : // 14, /* private */
354 TRACE("api disconnect");
355 break;
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");
359 break;
360 case NATIVE_WINDOW_SET_POST_TRANSFORM_CROP : // 16,
361 TRACE("set post transform crop");
362 break;
363 #endif
364 }
365 va_end(args);
366 return NO_ERROR;
367 }