Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1380)

Side by Side Diff: samples/android_sample/jni/android_extension.cc

Issue 11434046: Android rayshader sample. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « samples/android_sample/jni/activity_handler.h ('k') | samples/android_sample/jni/context.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 #include <android/log.h>
6 #include <EGL/egl.h>
7 #include <GLES2/gl2.h>
8 #include <GLES2/gl2ext.h>
9 #include <jni.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13
14 #include "bin/log.h"
15 #include "include/dart_api.h"
16
17 Dart_NativeFunction ResolveName(Dart_Handle name, int argc);
18
19 DART_EXPORT Dart_Handle android_extension_Init(Dart_Handle parent_library) {
20 if (Dart_IsError(parent_library)) { return parent_library; }
21
22 Dart_Handle result_code = Dart_SetNativeResolver(parent_library, ResolveName);
23 if (Dart_IsError(result_code)) return result_code;
24
25 return Dart_Null();
26 }
27
28 Dart_Handle HandleError(Dart_Handle handle) {
29 if (Dart_IsError(handle)) Dart_PropagateError(handle);
30 return handle;
31 }
32
33 void CheckGLError(const char *function) {
34 int error = glGetError();
35 if (error != GL_NO_ERROR) {
36 Log::PrintErr("ERROR!: %s returns %d", function, error);
37 }
38 }
39
40 void Log(Dart_NativeArguments arguments) {
41 Dart_EnterScope();
42 Dart_Handle whatHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
43 intptr_t length[1];
44 HandleError(Dart_StringLength(whatHandle, length));
45 uint8_t* str[1];
46 HandleError(Dart_StringToUTF8(whatHandle, &str[0], length));
47 str[0][*length] = 0;
48 Log::Print(const_cast<const GLchar*>(reinterpret_cast<GLchar*>(str[0])));
49 Dart_ExitScope();
50 }
51
52 void SystemRand(Dart_NativeArguments arguments) {
53 Dart_EnterScope();
54 Dart_Handle result = HandleError(Dart_NewInteger(rand()));
55 Dart_SetReturnValue(arguments, result);
56 Dart_ExitScope();
57 }
58
59 void SystemSrand(Dart_NativeArguments arguments) {
60 Dart_EnterScope();
61 bool success = false;
62 Dart_Handle seed_object = HandleError(Dart_GetNativeArgument(arguments, 0));
63 if (Dart_IsInteger(seed_object)) {
64 bool fits;
65 HandleError(Dart_IntegerFitsIntoInt64(seed_object, &fits));
66 if (fits) {
67 int64_t seed;
68 HandleError(Dart_IntegerToInt64(seed_object, &seed));
69 srand(static_cast<unsigned>(seed));
70 success = true;
71 }
72 }
73 Dart_SetReturnValue(arguments, HandleError(Dart_NewBoolean(success)));
74 Dart_ExitScope();
75 }
76
77 void EGLSwapBuffers(Dart_NativeArguments arguments) {
78 Log::Print("GLSwapBuffers");
79 Dart_EnterScope();
80
81 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
82 EGLSurface surface = eglGetCurrentSurface(EGL_DRAW);
83 eglSwapBuffers(display, surface);
84
85 CheckGLError("eglSwapBuffers");
86 Dart_ExitScope();
87 }
88
89 void GLAttachShader(Dart_NativeArguments arguments) {
90 Log::Print("GLAttachShader");
91 Dart_EnterScope();
92
93 Dart_Handle programHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
94 int64_t program;
95 HandleError(Dart_IntegerToInt64(programHandle, &program));
96
97 Dart_Handle shaderHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
98 int64_t shader;
99 HandleError(Dart_IntegerToInt64(shaderHandle, &shader));
100
101 glAttachShader(program, shader);
102 CheckGLError("glAttachShader");
103 Dart_ExitScope();
104 }
105
106 void GLBindBuffer(Dart_NativeArguments arguments) {
107 Log::Print("GLBindBuffer");
108 Dart_EnterScope();
109
110 Dart_Handle targetHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
111 int64_t target;
112 HandleError(Dart_IntegerToInt64(targetHandle, &target));
113
114 Dart_Handle bufferHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
115 int64_t buffer;
116 HandleError(Dart_IntegerToInt64(bufferHandle, &buffer));
117
118 glBindBuffer(target, buffer);
119 CheckGLError("glBindBuffer");
120 Dart_ExitScope();
121 }
122
123 void GLBufferData(Dart_NativeArguments arguments) {
124 Log::Print("GLBufferData");
125 Dart_EnterScope();
126
127 Dart_Handle targetHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
128 int64_t target;
129 HandleError(Dart_IntegerToInt64(targetHandle, &target));
130
131 Dart_Handle dataHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
132 intptr_t size;
133 HandleError(Dart_ListLength(dataHandle, &size));
134
135 Log::Print("Size: %d", size);
136
137 // TODO(vsm): No guarantee that this is a float!
138 float* data = reinterpret_cast<float*>(malloc(size * sizeof(float)));
139 for (int i = 0; i < size; i++) {
140 Dart_Handle elemHandle = HandleError(Dart_ListGetAt(dataHandle, i));
141 double value;
142 Dart_DoubleValue(elemHandle, &value);
143 data[i] = static_cast<float>(value);
144 Log::Print("Value[%d]: %f", i, data[i]);
145 }
146
147 Dart_Handle usageHandle = HandleError(Dart_GetNativeArgument(arguments, 2));
148 int64_t usage;
149 HandleError(Dart_IntegerToInt64(usageHandle, &usage));
150
151 glBufferData(target, size * sizeof(float), data, usage);
152 CheckGLError("glBufferData");
153 free(data);
154 Dart_ExitScope();
155 }
156
157 void GLCompileShader(Dart_NativeArguments arguments) {
158 Dart_EnterScope();
159
160 Dart_Handle shaderHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
161 int64_t shader;
162 HandleError(Dart_IntegerToInt64(shaderHandle, &shader));
163
164 Log::Print("GLCompileShader");
165 glCompileShader(shader);
166 CheckGLError("glCompileShader");
167 Dart_ExitScope();
168 }
169
170 void GLCreateBuffer(Dart_NativeArguments arguments) {
171 Log::Print("GLCreateBuffer");
172 Dart_EnterScope();
173 GLuint buffer;
174
175 glGenBuffers(1, &buffer);
176 CheckGLError("glGenBuffers");
177 Dart_Handle result = HandleError(Dart_NewInteger(buffer));
178 Dart_SetReturnValue(arguments, result);
179 Dart_ExitScope();
180 }
181
182 void GLCreateProgram(Dart_NativeArguments arguments) {
183 Log::Print("GLCreateProgram");
184 Dart_EnterScope();
185
186 int64_t program = glCreateProgram();
187 CheckGLError("glCreateProgram");
188 Dart_Handle result = HandleError(Dart_NewInteger(program));
189 Dart_SetReturnValue(arguments, result);
190 Dart_ExitScope();
191 }
192
193 void GLCreateShader(Dart_NativeArguments arguments) {
194 Dart_EnterScope();
195
196 Dart_Handle typeHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
197 int64_t type;
198 HandleError(Dart_IntegerToInt64(typeHandle, &type));
199
200 int64_t shader = glCreateShader((GLenum)type);
201 Log::Print("GLCreateShader");
202 CheckGLError("glCreateShader");
203 Dart_Handle result = HandleError(Dart_NewInteger(shader));
204 Dart_SetReturnValue(arguments, result);
205 Dart_ExitScope();
206 }
207
208 void GLDrawArrays(Dart_NativeArguments arguments) {
209 Log::Print("GLDrawArrays");
210 Dart_EnterScope();
211
212 Dart_Handle modeHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
213 int64_t mode;
214 HandleError(Dart_IntegerToInt64(modeHandle, &mode));
215
216 Dart_Handle firstHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
217 int64_t first;
218 HandleError(Dart_IntegerToInt64(firstHandle, &first));
219
220 Dart_Handle countHandle = HandleError(Dart_GetNativeArgument(arguments, 2));
221 int64_t count;
222 HandleError(Dart_IntegerToInt64(countHandle, &count));
223
224 glDrawArrays(mode, first, count);
225 CheckGLError("glDrawArrays");
226 Dart_ExitScope();
227 }
228
229 void GLEnableVertexAttribArray(Dart_NativeArguments arguments) {
230 Log::Print("GLEnableVertexAttribArray");
231 Dart_EnterScope();
232
233 Dart_Handle locationHandle =
234 HandleError(Dart_GetNativeArgument(arguments, 0));
235 int64_t location;
236 HandleError(Dart_IntegerToInt64(locationHandle, &location));
237
238 glEnableVertexAttribArray(location);
239 CheckGLError("glEnableVertexAttribArray");
240 Dart_ExitScope();
241 }
242
243 void GLGetAttribLocation(Dart_NativeArguments arguments) {
244 Log::Print("GLGetAttribLocation");
245 Dart_EnterScope();
246
247 Dart_Handle programHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
248 int64_t program;
249 HandleError(Dart_IntegerToInt64(programHandle, &program));
250
251 Dart_Handle nameHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
252 intptr_t length;
253 HandleError(Dart_StringLength(nameHandle, &length));
254 uint8_t* str;
255 HandleError(Dart_StringToUTF8(nameHandle, &str, &length));
256 str[length] = 0;
257
258 int64_t location = glGetAttribLocation(program,
259 const_cast<const GLchar*>(reinterpret_cast<GLchar*>(str)));
260 CheckGLError("glGetAttribLocation");
261 Dart_Handle result = HandleError(Dart_NewInteger(location));
262 Dart_SetReturnValue(arguments, result);
263 Dart_ExitScope();
264 }
265
266 void GLGetError(Dart_NativeArguments arguments) {
267 Log::Print("GLGetError");
268 Dart_EnterScope();
269
270 int64_t error = glGetError();
271 Dart_Handle result = HandleError(Dart_NewInteger(error));
272 Dart_SetReturnValue(arguments, result);
273 Dart_ExitScope();
274 }
275
276 void GLGetProgramParameter(Dart_NativeArguments arguments) {
277 Log::Print("GLGetProgramParameter");
278 Dart_EnterScope();
279
280 Dart_Handle programHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
281 int64_t program;
282 HandleError(Dart_IntegerToInt64(programHandle, &program));
283
284 Dart_Handle paramHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
285 int64_t param;
286 HandleError(Dart_IntegerToInt64(paramHandle, &param));
287
288 GLint value = -1;
289 glGetProgramiv(program, param, &value);
290 CheckGLError("glGetProgramiv");
291
292 Dart_Handle result = HandleError(Dart_NewInteger(value));
293 Dart_SetReturnValue(arguments, result);
294 Dart_ExitScope();
295 }
296
297 void GLGetShaderParameter(Dart_NativeArguments arguments) {
298 Log::Print("GLGetShaderParameter");
299 Dart_EnterScope();
300
301 Dart_Handle shaderHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
302 int64_t shader;
303 HandleError(Dart_IntegerToInt64(shaderHandle, &shader));
304
305 Dart_Handle paramHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
306 int64_t param;
307 HandleError(Dart_IntegerToInt64(paramHandle, &param));
308
309 GLint value = -1;
310 glGetShaderiv((GLuint)shader, (GLenum)param, &value);
311 CheckGLError("glGetShaderiv");
312
313 Dart_Handle result = HandleError(Dart_NewInteger(value));
314 Dart_SetReturnValue(arguments, result);
315 Dart_ExitScope();
316 }
317
318 void GLGetShaderInfoLog(Dart_NativeArguments arguments) {
319 Log::Print("GLGetShaderInfoLog");
320 Dart_EnterScope();
321
322 Dart_Handle shaderHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
323 int64_t shader;
324 HandleError(Dart_IntegerToInt64(shaderHandle, &shader));
325
326 GLint infoLogLength = 0;
327 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
328
329 GLchar* strInfoLog = new GLchar[infoLogLength + 1];
330 glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);
331 strInfoLog[infoLogLength] = 0;
332
333 Dart_Handle result = HandleError(Dart_NewStringFromCString(strInfoLog));
334 Dart_SetReturnValue(arguments, result);
335 Dart_ExitScope();
336 delete[] strInfoLog;
337 }
338
339 void GLGetProgramInfoLog(Dart_NativeArguments arguments) {
340 Log::Print("GLGetProgramInfoLog");
341 Dart_EnterScope();
342
343 Dart_Handle programHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
344 int64_t program;
345 HandleError(Dart_IntegerToInt64(programHandle, &program));
346
347 GLint infoLogLength;
348 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);
349
350 GLchar* strInfoLog = new GLchar[infoLogLength + 1];
351 glGetProgramInfoLog(program, infoLogLength, NULL, strInfoLog);
352 strInfoLog[infoLogLength] = 0;
353
354 Dart_Handle result = HandleError(Dart_NewStringFromCString(strInfoLog));
355 Dart_SetReturnValue(arguments, result);
356 Dart_ExitScope();
357 delete[] strInfoLog;
358 }
359
360 void GLGetUniformLocation(Dart_NativeArguments arguments) {
361 Log::Print("GLGetUniformLocation");
362 Dart_EnterScope();
363
364 Dart_Handle programHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
365 int64_t program;
366 HandleError(Dart_IntegerToInt64(programHandle, &program));
367
368 Dart_Handle nameHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
369 intptr_t length;
370 HandleError(Dart_StringLength(nameHandle, &length));
371 uint8_t* str;
372 HandleError(Dart_StringToUTF8(nameHandle, &str, &length));
373 str[length] = 0;
374
375 int64_t location = glGetUniformLocation(program,
376 const_cast<const GLchar*>(reinterpret_cast<GLchar*>(str)));
377 CheckGLError("glGetUniformLocation");
378 Dart_Handle result = HandleError(Dart_NewInteger(location));
379 Dart_SetReturnValue(arguments, result);
380 Dart_ExitScope();
381 }
382
383 void GLLinkProgram(Dart_NativeArguments arguments) {
384 Log::Print("GLLinkProgram");
385 Dart_EnterScope();
386
387 Dart_Handle programHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
388 int64_t program;
389 HandleError(Dart_IntegerToInt64(programHandle, &program));
390
391 glLinkProgram(program);
392 CheckGLError("glLinkProgram");
393 Dart_ExitScope();
394 }
395
396 void GLShaderSource(Dart_NativeArguments arguments) {
397 Log::Print("GLShaderSource");
398 Dart_EnterScope();
399
400 Dart_Handle shaderHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
401 int64_t shader;
402 HandleError(Dart_IntegerToInt64(shaderHandle, &shader));
403
404 Dart_Handle sourceHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
405 intptr_t length[1];
406 HandleError(Dart_StringLength(sourceHandle, length));
407 Log::Print("Source length is %d", length[0]);
408 uint8_t* str[1];
409 HandleError(Dart_StringToUTF8(sourceHandle, &str[0], length));
410 Log::Print("Converted length is %d", length[0]);
411 str[0][*length] = 0;
412
413 const GLchar* source =
414 const_cast<const GLchar*>(reinterpret_cast<GLchar*>(str[0]));
415 Log::Print("Source: %s", source);
416 glShaderSource(shader, 1,
417 const_cast<const GLchar**>(reinterpret_cast<GLchar**>(str)), NULL);
418 CheckGLError("glShaderSource");
419 Dart_ExitScope();
420 }
421
422 void GLUseProgram(Dart_NativeArguments arguments) {
423 Log::Print("GLUseProgram");
424 Dart_EnterScope();
425
426 Dart_Handle programHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
427 int64_t program;
428 HandleError(Dart_IntegerToInt64(programHandle, &program));
429
430 glUseProgram(program);
431 CheckGLError("glUseProgram");
432 Dart_ExitScope();
433 }
434
435 void GLUniform1i(Dart_NativeArguments arguments) {
436 Log::Print("GLUniform1i");
437 Dart_EnterScope();
438
439 Dart_Handle locationHandle =
440 HandleError(Dart_GetNativeArgument(arguments, 0));
441 int64_t location;
442 HandleError(Dart_IntegerToInt64(locationHandle, &location));
443
444 Dart_Handle v0Handle = HandleError(Dart_GetNativeArgument(arguments, 1));
445 int64_t v0;
446 HandleError(Dart_IntegerToInt64(v0Handle, &v0));
447
448 glUniform1i(location, v0);
449 CheckGLError("glUniform1i");
450 Dart_ExitScope();
451 }
452
453 void GLUniform2i(Dart_NativeArguments arguments) {
454 Log::Print("GLUniform2i");
455 Dart_EnterScope();
456
457 Dart_Handle locationHandle =
458 HandleError(Dart_GetNativeArgument(arguments, 0));
459 int64_t location;
460 HandleError(Dart_IntegerToInt64(locationHandle, &location));
461
462 Dart_Handle v0Handle = HandleError(Dart_GetNativeArgument(arguments, 1));
463 int64_t v0;
464 HandleError(Dart_IntegerToInt64(v0Handle, &v0));
465
466 Dart_Handle v1Handle = HandleError(Dart_GetNativeArgument(arguments, 2));
467 int64_t v1;
468 HandleError(Dart_IntegerToInt64(v1Handle, &v1));
469
470 glUniform2i(location, v0, v1);
471 CheckGLError("glUniform2i");
472 Dart_ExitScope();
473 }
474
475 void GLUniform3i(Dart_NativeArguments arguments) {
476 Log::Print("GLUniform3i");
477 Dart_EnterScope();
478
479 Dart_Handle locationHandle =
480 HandleError(Dart_GetNativeArgument(arguments, 0));
481 int64_t location;
482 HandleError(Dart_IntegerToInt64(locationHandle, &location));
483
484 Dart_Handle v0Handle = HandleError(Dart_GetNativeArgument(arguments, 1));
485 int64_t v0;
486 HandleError(Dart_IntegerToInt64(v0Handle, &v0));
487
488 Dart_Handle v1Handle = HandleError(Dart_GetNativeArgument(arguments, 2));
489 int64_t v1;
490 HandleError(Dart_IntegerToInt64(v1Handle, &v1));
491
492 Dart_Handle v2Handle = HandleError(Dart_GetNativeArgument(arguments, 3));
493 int64_t v2;
494 HandleError(Dart_IntegerToInt64(v2Handle, &v2));
495
496 glUniform3i(location, v0, v1, v2);
497 CheckGLError("glUniform3i");
498 Dart_ExitScope();
499 }
500
501 void GLUniform4i(Dart_NativeArguments arguments) {
502 Log::Print("GLUniform4i");
503 Dart_EnterScope();
504
505 Dart_Handle locationHandle =
506 HandleError(Dart_GetNativeArgument(arguments, 0));
507 int64_t location;
508 HandleError(Dart_IntegerToInt64(locationHandle, &location));
509
510 Dart_Handle v0Handle = HandleError(Dart_GetNativeArgument(arguments, 1));
511 int64_t v0;
512 HandleError(Dart_IntegerToInt64(v0Handle, &v0));
513
514 Dart_Handle v1Handle = HandleError(Dart_GetNativeArgument(arguments, 2));
515 int64_t v1;
516 HandleError(Dart_IntegerToInt64(v1Handle, &v1));
517
518 Dart_Handle v2Handle = HandleError(Dart_GetNativeArgument(arguments, 3));
519 int64_t v2;
520 HandleError(Dart_IntegerToInt64(v2Handle, &v2));
521
522 Dart_Handle v3Handle = HandleError(Dart_GetNativeArgument(arguments, 4));
523 int64_t v3;
524 HandleError(Dart_IntegerToInt64(v3Handle, &v3));
525
526 glUniform4i(location, v0, v1, v2, v3);
527 CheckGLError("glUniform4i");
528 Dart_ExitScope();
529 }
530
531 void GLUniform1f(Dart_NativeArguments arguments) {
532 Log::Print("GLUniform1f");
533 Dart_EnterScope();
534
535 Dart_Handle locationHandle =
536 HandleError(Dart_GetNativeArgument(arguments, 0));
537 int64_t location;
538 HandleError(Dart_IntegerToInt64(locationHandle, &location));
539
540 Dart_Handle v0Handle = HandleError(Dart_GetNativeArgument(arguments, 1));
541 double v0;
542 HandleError(Dart_DoubleValue(v0Handle, &v0));
543
544 glUniform1f(location, v0);
545 CheckGLError("glUniform1f");
546 Dart_ExitScope();
547 }
548
549 void GLUniform2f(Dart_NativeArguments arguments) {
550 Log::Print("GLUniform2f");
551 Dart_EnterScope();
552
553 Dart_Handle locationHandle =
554 HandleError(Dart_GetNativeArgument(arguments, 0));
555 int64_t location;
556 HandleError(Dart_IntegerToInt64(locationHandle, &location));
557
558 Dart_Handle v0Handle = HandleError(Dart_GetNativeArgument(arguments, 1));
559 double v0;
560 HandleError(Dart_DoubleValue(v0Handle, &v0));
561
562 Dart_Handle v1Handle = HandleError(Dart_GetNativeArgument(arguments, 2));
563 double v1;
564 HandleError(Dart_DoubleValue(v1Handle, &v1));
565
566 glUniform2f(location, v0, v1);
567 CheckGLError("glUniform2f");
568 Dart_ExitScope();
569 }
570
571 void GLUniform3f(Dart_NativeArguments arguments) {
572 Log::Print("GLUniform3f");
573 Dart_EnterScope();
574
575 Dart_Handle locationHandle =
576 HandleError(Dart_GetNativeArgument(arguments, 0));
577 int64_t location;
578 HandleError(Dart_IntegerToInt64(locationHandle, &location));
579
580 Dart_Handle v0Handle = HandleError(Dart_GetNativeArgument(arguments, 1));
581 double v0;
582 HandleError(Dart_DoubleValue(v0Handle, &v0));
583
584 Dart_Handle v1Handle = HandleError(Dart_GetNativeArgument(arguments, 2));
585 double v1;
586 HandleError(Dart_DoubleValue(v1Handle, &v1));
587
588 Dart_Handle v2Handle = HandleError(Dart_GetNativeArgument(arguments, 3));
589 double v2;
590 HandleError(Dart_DoubleValue(v2Handle, &v2));
591
592 glUniform3f(location, v0, v1, v2);
593 CheckGLError("glUniform3f");
594 Dart_ExitScope();
595 }
596
597 void GLUniform4f(Dart_NativeArguments arguments) {
598 Log::Print("GLUniform4f");
599 Dart_EnterScope();
600
601 Dart_Handle locationHandle =
602 HandleError(Dart_GetNativeArgument(arguments, 0));
603 int64_t location;
604 HandleError(Dart_IntegerToInt64(locationHandle, &location));
605
606 Dart_Handle v0Handle = HandleError(Dart_GetNativeArgument(arguments, 1));
607 double v0;
608 HandleError(Dart_DoubleValue(v0Handle, &v0));
609
610 Dart_Handle v1Handle = HandleError(Dart_GetNativeArgument(arguments, 2));
611 double v1;
612 HandleError(Dart_DoubleValue(v1Handle, &v1));
613
614 Dart_Handle v2Handle = HandleError(Dart_GetNativeArgument(arguments, 3));
615 double v2;
616 HandleError(Dart_DoubleValue(v2Handle, &v2));
617
618 Dart_Handle v3Handle = HandleError(Dart_GetNativeArgument(arguments, 4));
619 double v3;
620 HandleError(Dart_DoubleValue(v3Handle, &v3));
621
622 glUniform4f(location, v0, v1, v2, v3);
623 CheckGLError("glUniform4f");
624 Dart_ExitScope();
625 }
626
627 void GLUniform1iv(Dart_NativeArguments arguments) {
628 Log::Print("GLUniform1iv");
629 Dart_EnterScope();
630
631 Dart_Handle locationHandle =
632 HandleError(Dart_GetNativeArgument(arguments, 0));
633 int64_t location;
634 HandleError(Dart_IntegerToInt64(locationHandle, &location));
635
636 Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
637
638 if (Dart_IsList(argHandle)) {
639 int len;
640 HandleError(Dart_ListLength(argHandle, &len));
641 GLint* list = new GLint[len];
642 for (int i = 0; i < len; i++) {
643 Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
644 int64_t v;
645 HandleError(Dart_IntegerToInt64(vHandle, &v));
646 list[i] = v;
647 }
648 glUniform1iv(location, len, list);
649 delete [] list;
650 CheckGLError("glUniform1iv");
651 }
652 Dart_ExitScope();
653 }
654
655 void GLUniform2iv(Dart_NativeArguments arguments) {
656 Log::Print("GLUniform2iv");
657 Dart_EnterScope();
658
659 Dart_Handle locationHandle =
660 HandleError(Dart_GetNativeArgument(arguments, 0));
661 int64_t location;
662 HandleError(Dart_IntegerToInt64(locationHandle, &location));
663
664 Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
665
666 if (Dart_IsList(argHandle)) {
667 int len;
668 HandleError(Dart_ListLength(argHandle, &len));
669 GLint* list = new GLint[len];
670 for (int i = 0; i < len; i++) {
671 Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
672 int64_t v;
673 HandleError(Dart_IntegerToInt64(vHandle, &v));
674 list[i] = v;
675 }
676 glUniform2iv(location, len / 2, list);
677 delete [] list;
678 CheckGLError("glUniform2iv");
679 }
680 Dart_ExitScope();
681 }
682
683 void GLUniform3iv(Dart_NativeArguments arguments) {
684 Log::Print("GLUniform3iv");
685 Dart_EnterScope();
686
687 Dart_Handle locationHandle =
688 HandleError(Dart_GetNativeArgument(arguments, 0));
689 int64_t location;
690 HandleError(Dart_IntegerToInt64(locationHandle, &location));
691
692 Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
693
694 if (Dart_IsList(argHandle)) {
695 int len;
696 HandleError(Dart_ListLength(argHandle, &len));
697 GLint* list = new GLint[len];
698 for (int i = 0; i < len; i++) {
699 Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
700 int64_t v;
701 HandleError(Dart_IntegerToInt64(vHandle, &v));
702 list[i] = v;
703 }
704 glUniform3iv(location, len / 3, list);
705 delete [] list;
706 CheckGLError("glUniform3iv");
707 }
708 Dart_ExitScope();
709 }
710
711 void GLUniform4iv(Dart_NativeArguments arguments) {
712 Log::Print("GLUniform4iv");
713 Dart_EnterScope();
714
715 Dart_Handle locationHandle =
716 HandleError(Dart_GetNativeArgument(arguments, 0));
717 int64_t location;
718 HandleError(Dart_IntegerToInt64(locationHandle, &location));
719
720 Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
721
722 if (Dart_IsList(argHandle)) {
723 int len;
724 HandleError(Dart_ListLength(argHandle, &len));
725 GLint* list = new GLint[len];
726 for (int i = 0; i < len; i++) {
727 Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
728 int64_t v;
729 HandleError(Dart_IntegerToInt64(vHandle, &v));
730 list[i] = v;
731 }
732 glUniform1iv(location, len / 4, list);
733 delete [] list;
734 CheckGLError("glUniform4iv");
735 }
736 Dart_ExitScope();
737 }
738
739 void GLUniform1fv(Dart_NativeArguments arguments) {
740 Log::Print("GLUniform1fv");
741 Dart_EnterScope();
742
743 Dart_Handle locationHandle =
744 HandleError(Dart_GetNativeArgument(arguments, 0));
745 int64_t location;
746 HandleError(Dart_IntegerToInt64(locationHandle, &location));
747
748 Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
749
750 if (Dart_IsList(argHandle)) {
751 int len;
752 HandleError(Dart_ListLength(argHandle, &len));
753 GLfloat* list = new GLfloat[len];
754 for (int i = 0; i < len; i++) {
755 Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
756 double v;
757 HandleError(Dart_DoubleValue(vHandle, &v));
758 list[i] = v;
759 }
760 glUniform1fv(location, len, list);
761 delete [] list;
762 CheckGLError("glUniform1fv");
763 }
764 Dart_ExitScope();
765 }
766
767 void GLUniform2fv(Dart_NativeArguments arguments) {
768 Log::Print("GLUniform2fv");
769 Dart_EnterScope();
770
771 Dart_Handle locationHandle =
772 HandleError(Dart_GetNativeArgument(arguments, 0));
773 int64_t location;
774 HandleError(Dart_IntegerToInt64(locationHandle, &location));
775
776 Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
777
778 if (Dart_IsList(argHandle)) {
779 int len;
780 HandleError(Dart_ListLength(argHandle, &len));
781 GLfloat* list = new GLfloat[len];
782 for (int i = 0; i < len; i++) {
783 Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
784 double v;
785 HandleError(Dart_DoubleValue(vHandle, &v));
786 list[i] = v;
787 }
788 glUniform2fv(location, len / 2, list);
789 delete [] list;
790 CheckGLError("glUniform2fv");
791 }
792 Dart_ExitScope();
793 }
794
795 void GLUniform3fv(Dart_NativeArguments arguments) {
796 Log::Print("GLUniform3fv");
797 Dart_EnterScope();
798
799 Dart_Handle locationHandle =
800 HandleError(Dart_GetNativeArgument(arguments, 0));
801 int64_t location;
802 HandleError(Dart_IntegerToInt64(locationHandle, &location));
803
804 Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
805
806 if (Dart_IsList(argHandle)) {
807 int len;
808 HandleError(Dart_ListLength(argHandle, &len));
809 GLfloat* list = new GLfloat[len];
810 for (int i = 0; i < len; i++) {
811 Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
812 double v;
813 HandleError(Dart_DoubleValue(vHandle, &v));
814 list[i] = v;
815 }
816 glUniform3fv(location, len / 3, list);
817 delete [] list;
818 CheckGLError("glUniform3fv");
819 }
820 Dart_ExitScope();
821 }
822
823 void GLUniform4fv(Dart_NativeArguments arguments) {
824 Log::Print("In GLUniform4fv");
825 Dart_EnterScope();
826
827 Dart_Handle locationHandle =
828 HandleError(Dart_GetNativeArgument(arguments, 0));
829 int64_t location;
830 HandleError(Dart_IntegerToInt64(locationHandle, &location));
831
832 Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
833
834 if (Dart_IsList(argHandle)) {
835 int len;
836 HandleError(Dart_ListLength(argHandle, &len));
837 GLfloat* list = new GLfloat[len];
838 for (int i = 0; i < len; i++) {
839 Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
840 double v;
841 HandleError(Dart_DoubleValue(vHandle, &v));
842 list[i] = v;
843 }
844 glUniform4fv(location, len / 4, list);
845 delete [] list;
846 CheckGLError("glUniform4fv");
847 }
848 Dart_ExitScope();
849 }
850
851 void GLViewport(Dart_NativeArguments arguments) {
852 Log::Print("GLViewport");
853 Dart_EnterScope();
854
855 Dart_Handle xHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
856 int64_t x;
857 HandleError(Dart_IntegerToInt64(xHandle, &x));
858
859 Dart_Handle yHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
860 int64_t y;
861 HandleError(Dart_IntegerToInt64(yHandle, &y));
862
863 Dart_Handle widthHandle = HandleError(Dart_GetNativeArgument(arguments, 2));
864 int64_t width;
865 HandleError(Dart_IntegerToInt64(widthHandle, &width));
866
867 Dart_Handle heightHandle = HandleError(Dart_GetNativeArgument(arguments, 3));
868 int64_t height;
869 HandleError(Dart_IntegerToInt64(heightHandle, &height));
870
871 Log::Print("Dimensions: [%ld, %ld, %ld, %ld]", x, y, width, height);
872
873 glViewport(x, y, width, height);
874 CheckGLError("glViewPort");
875 Dart_ExitScope();
876 }
877
878 void GLVertexAttribPointer(Dart_NativeArguments arguments) {
879 Log::Print("GLVertexAttribPointer");
880 Dart_EnterScope();
881
882 Dart_Handle indexHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
883 int64_t index;
884 HandleError(Dart_IntegerToInt64(indexHandle, &index));
885
886 Dart_Handle sizeHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
887 int64_t size;
888 HandleError(Dart_IntegerToInt64(sizeHandle, &size));
889
890 Dart_Handle typeHandle = HandleError(Dart_GetNativeArgument(arguments, 2));
891 int64_t type;
892 HandleError(Dart_IntegerToInt64(typeHandle, &type));
893
894 Dart_Handle normalizedHandle =
895 HandleError(Dart_GetNativeArgument(arguments, 3));
896 bool normalized;
897 HandleError(Dart_BooleanValue(normalizedHandle, &normalized));
898
899 Dart_Handle strideHandle = HandleError(Dart_GetNativeArgument(arguments, 4));
900 int64_t stride;
901 HandleError(Dart_IntegerToInt64(strideHandle, &stride));
902
903 Dart_Handle pointerHandle = HandleError(Dart_GetNativeArgument(arguments, 5));
904 int64_t pointerValue;
905 HandleError(Dart_IntegerToInt64(pointerHandle, &pointerValue));
906 const void* pointer;
907 pointer = const_cast<const void*>(reinterpret_cast<void*>(pointerValue));
908
909 glVertexAttribPointer(index, size, type, normalized, stride, pointer);
910 CheckGLError("glVertexAttribPointer");
911 Dart_ExitScope();
912 }
913
914 void GLClearColor(Dart_NativeArguments arguments) {
915 Log::Print("GLClearColor");
916 Dart_EnterScope();
917
918 Dart_Handle redHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
919 double red;
920 HandleError(Dart_DoubleValue(redHandle, &red));
921
922 Dart_Handle greenHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
923 double green;
924 HandleError(Dart_DoubleValue(greenHandle, &green));
925
926 Dart_Handle blueHandle = HandleError(Dart_GetNativeArgument(arguments, 2));
927 double blue;
928 HandleError(Dart_DoubleValue(blueHandle, &blue));
929
930 Dart_Handle alphaHandle = HandleError(Dart_GetNativeArgument(arguments, 3));
931 double alpha;
932 HandleError(Dart_DoubleValue(alphaHandle, &alpha));
933
934 glClearColor(red, green, blue, alpha);
935 CheckGLError("glClearColor");
936 Dart_ExitScope();
937 }
938
939 void GLClearDepth(Dart_NativeArguments arguments) {
940 Log::Print("GLClearDepth");
941 Dart_EnterScope();
942
943 Dart_Handle depthHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
944 double depth;
945 HandleError(Dart_DoubleValue(depthHandle, &depth));
946
947 glClearDepthf(depth);
948 CheckGLError("glClearDepthf");
949 Dart_ExitScope();
950 }
951
952 void GLClear(Dart_NativeArguments arguments) {
953 Log::Print("GLClear");
954 Dart_EnterScope();
955 Dart_Handle maskHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
956 int64_t mask;
957 HandleError(Dart_IntegerToInt64(maskHandle, &mask));
958 glClear(mask);
959 CheckGLError("glClear");
960 Dart_ExitScope();
961 }
962
963 void GLArrayBuffer(Dart_NativeArguments arguments) {
964 Log::Print("GLArrayBuffer");
965 Dart_EnterScope();
966 Dart_Handle result = HandleError(Dart_NewInteger(GL_ARRAY_BUFFER));
967 Dart_SetReturnValue(arguments, result);
968 Dart_ExitScope();
969 }
970
971 void GLColorBufferBit(Dart_NativeArguments arguments) {
972 Log::Print("GLColorBuffer");
973 Dart_EnterScope();
974 Dart_Handle result = HandleError(Dart_NewInteger(GL_COLOR_BUFFER_BIT));
975 Dart_SetReturnValue(arguments, result);
976 Dart_ExitScope();
977 }
978
979 void GLCompileStatus(Dart_NativeArguments arguments) {
980 Log::Print("GLCompileStatus");
981 Dart_EnterScope();
982 Dart_Handle result = HandleError(Dart_NewInteger(GL_COMPILE_STATUS));
983 Dart_SetReturnValue(arguments, result);
984 Dart_ExitScope();
985 }
986
987 void GLDepthBufferBit(Dart_NativeArguments arguments) {
988 Log::Print("GLDepthBufferBit");
989 Dart_EnterScope();
990 Dart_Handle result = HandleError(Dart_NewInteger(GL_DEPTH_BUFFER_BIT));
991 Dart_SetReturnValue(arguments, result);
992 Dart_ExitScope();
993 }
994
995 void GLFloat(Dart_NativeArguments arguments) {
996 Dart_EnterScope();
997 Dart_Handle result = HandleError(Dart_NewInteger(GL_FLOAT));
998 Dart_SetReturnValue(arguments, result);
999 Dart_ExitScope();
1000 }
1001
1002 void GLFragmentShader(Dart_NativeArguments arguments) {
1003 Dart_EnterScope();
1004 Dart_Handle result = HandleError(Dart_NewInteger(GL_FRAGMENT_SHADER));
1005 Dart_SetReturnValue(arguments, result);
1006 Dart_ExitScope();
1007 }
1008
1009 void GLLinkStatus(Dart_NativeArguments arguments) {
1010 Dart_EnterScope();
1011 Dart_Handle result = HandleError(Dart_NewInteger(GL_LINK_STATUS));
1012 Dart_SetReturnValue(arguments, result);
1013 Dart_ExitScope();
1014 }
1015
1016 void GLStaticDraw(Dart_NativeArguments arguments) {
1017 Dart_EnterScope();
1018 Dart_Handle result = HandleError(Dart_NewInteger(GL_STATIC_DRAW));
1019 Dart_SetReturnValue(arguments, result);
1020 Dart_ExitScope();
1021 }
1022
1023 void GLTriangleStrip(Dart_NativeArguments arguments) {
1024 Dart_EnterScope();
1025 Dart_Handle result = HandleError(Dart_NewInteger(GL_TRIANGLE_STRIP));
1026 Dart_SetReturnValue(arguments, result);
1027 Dart_ExitScope();
1028 }
1029
1030 void GLTriangles(Dart_NativeArguments arguments) {
1031 Dart_EnterScope();
1032 Dart_Handle result = HandleError(Dart_NewInteger(GL_TRIANGLES));
1033 Dart_SetReturnValue(arguments, result);
1034 Dart_ExitScope();
1035 }
1036
1037 void GLTrue(Dart_NativeArguments arguments) {
1038 Dart_EnterScope();
1039 Dart_Handle result = HandleError(Dart_NewInteger(GL_TRUE));
1040 Dart_SetReturnValue(arguments, result);
1041 Dart_ExitScope();
1042 }
1043
1044 void GLVertexShader(Dart_NativeArguments arguments) {
1045 Dart_EnterScope();
1046 Dart_Handle result = HandleError(Dart_NewInteger(GL_VERTEX_SHADER));
1047 Dart_SetReturnValue(arguments, result);
1048 Dart_ExitScope();
1049 }
1050
1051 uint8_t* RandomArray(int seed, int length) {
1052 if (length <= 0 || length > 10000000) return NULL;
1053 uint8_t* values = reinterpret_cast<uint8_t*>(malloc(length));
1054 if (NULL == values) return NULL;
1055 srand(seed);
1056 for (int i = 0; i < length; ++i) {
1057 values[i] = rand() % 256;
1058 }
1059 return values;
1060 }
1061
1062 void WrappedRandomArray(Dart_Port dest_port_id,
1063 Dart_Port reply_port_id,
1064 Dart_CObject* message) {
1065 if (message->type == Dart_CObject::kArray &&
1066 2 == message->value.as_array.length) {
1067 // Use .as_array and .as_int32 to access the data in the Dart_CObject.
1068 Dart_CObject* param0 = message->value.as_array.values[0];
1069 Dart_CObject* param1 = message->value.as_array.values[1];
1070 if (param0->type == Dart_CObject::kInt32 &&
1071 param1->type == Dart_CObject::kInt32) {
1072 int length = param0->value.as_int32;
1073 int seed = param1->value.as_int32;
1074
1075 uint8_t* values = RandomArray(seed, length);
1076
1077 if (values != NULL) {
1078 Dart_CObject result;
1079 result.type = Dart_CObject::kUint8Array;
1080 result.value.as_byte_array.values = values;
1081 result.value.as_byte_array.length = length;
1082 Dart_PostCObject(reply_port_id, &result);
1083 free(values);
1084 // It is OK that result is destroyed when function exits.
1085 // Dart_PostCObject has copied its data.
1086 return;
1087 }
1088 }
1089 }
1090 Dart_CObject result;
1091 result.type = Dart_CObject::kNull;
1092 Dart_PostCObject(reply_port_id, &result);
1093 }
1094
1095 void RandomArrayServicePort(Dart_NativeArguments arguments) {
1096 Dart_EnterScope();
1097 Dart_SetReturnValue(arguments, Dart_Null());
1098 Dart_Port service_port =
1099 Dart_NewNativePort("RandomArrayService", WrappedRandomArray, true);
1100 if (service_port != ((Dart_Port)0)) {
1101 Dart_Handle send_port = HandleError(Dart_NewSendPort(service_port));
1102 Dart_SetReturnValue(arguments, send_port);
1103 }
1104 Dart_ExitScope();
1105 }
1106
1107
1108 struct FunctionLookup {
1109 const char* name;
1110 Dart_NativeFunction function;
1111 };
1112
1113 FunctionLookup function_list[] = {
1114 {"Log", Log},
1115 {"SystemRand", SystemRand},
1116 {"SystemSrand", SystemSrand},
1117 {"EGLSwapBuffers", EGLSwapBuffers},
1118 {"GLAttachShader", GLAttachShader},
1119 {"GLBindBuffer", GLBindBuffer},
1120 {"GLBufferData", GLBufferData},
1121 {"GLClear", GLClear},
1122 {"GLClearColor", GLClearColor},
1123 {"GLClearDepth", GLClearDepth},
1124 {"GLCompileShader", GLCompileShader},
1125 {"GLCreateBuffer", GLCreateBuffer},
1126 {"GLCreateProgram", GLCreateProgram},
1127 {"GLCreateShader", GLCreateShader},
1128 {"GLDrawArrays", GLDrawArrays},
1129 {"GLEnableVertexAttribArray", GLEnableVertexAttribArray},
1130 {"GLGetAttribLocation", GLGetAttribLocation},
1131 {"GLGetError", GLGetError},
1132 {"GLGetProgramParameter", GLGetProgramParameter},
1133 {"GLGetShaderParameter", GLGetShaderParameter},
1134 {"GLGetUniformLocation", GLGetUniformLocation},
1135 {"GLLinkProgram", GLLinkProgram},
1136 {"GLShaderSource", GLShaderSource},
1137 {"GLUniform1f", GLUniform1f},
1138 {"GLUniform2f", GLUniform2f},
1139 {"GLUniform3f", GLUniform3f},
1140 {"GLUniform4f", GLUniform4f},
1141 {"GLUniform1i", GLUniform1i},
1142 {"GLUniform2i", GLUniform2i},
1143 {"GLUniform3i", GLUniform3i},
1144 {"GLUniform4i", GLUniform4i},
1145 {"GLUniform1fv", GLUniform1fv},
1146 {"GLUniform2fv", GLUniform2fv},
1147 {"GLUniform3fv", GLUniform3fv},
1148 {"GLUniform4fv", GLUniform4fv},
1149 {"GLUniform1iv", GLUniform1iv},
1150 {"GLUniform2iv", GLUniform2iv},
1151 {"GLUniform3iv", GLUniform3iv},
1152 {"GLUniform4iv", GLUniform4iv},
1153 {"GLUseProgram", GLUseProgram},
1154 {"GLVertexAttribPointer", GLVertexAttribPointer},
1155 {"GLViewport", GLViewport},
1156 {"GLArrayBuffer", GLArrayBuffer},
1157 {"GLColorBufferBit", GLColorBufferBit},
1158 {"GLCompileStatus", GLCompileStatus},
1159 {"GLDepthBufferBit", GLDepthBufferBit},
1160 {"GLFloat", GLFloat},
1161 {"GLFragmentShader", GLFragmentShader},
1162 {"GLLinkStatus", GLLinkStatus},
1163 {"GLTriangleStrip", GLTriangleStrip},
1164 {"GLTriangles", GLTriangles},
1165 {"GLTrue", GLTrue},
1166 {"GLStaticDraw", GLStaticDraw},
1167 {"GLVertexShader", GLVertexShader},
1168 {"GLGetShaderInfoLog", GLGetShaderInfoLog},
1169 {"GLGetProgramInfoLog", GLGetProgramInfoLog},
1170 {"RandomArray_ServicePort", RandomArrayServicePort},
1171 {NULL, NULL}};
1172
1173 Dart_NativeFunction ResolveName(Dart_Handle name, int argc) {
1174 if (!Dart_IsString(name)) return NULL;
1175 Dart_NativeFunction result = NULL;
1176 Dart_EnterScope();
1177 const char* cname;
1178 HandleError(Dart_StringToCString(name, &cname));
1179 for (int i = 0; function_list[i].name != NULL; ++i) {
1180 if (strcmp(function_list[i].name, cname) == 0) {
1181 result = function_list[i].function;
1182 break;
1183 }
1184 }
1185 Dart_ExitScope();
1186 return result;
1187 }
1188
OLDNEW
« no previous file with comments | « samples/android_sample/jni/activity_handler.h ('k') | samples/android_sample/jni/context.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698