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

Side by Side Diff: runtime/embedders/openglui/common/extension.cc

Issue 11883013: Refactored OpenGL embedder that works on Android, Mac or Linux. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 11 months 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
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 "embedders/openglui/common/extension.h"
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10
11 #include "embedders/openglui/common/log.h"
12 #include "embedders/openglui/common/opengl.h"
13 #include "include/dart_api.h"
14
15 Dart_Handle HandleError(Dart_Handle handle) {
16 if (Dart_IsError(handle)) Dart_PropagateError(handle);
17 return handle;
18 }
19
20 void CheckGLError(const char *function) {
21 int error = glGetError();
22 if (error != GL_NO_ERROR) {
23 if (error == GL_INVALID_ENUM) {
24 LOGE("%s: An unacceptable value is given for an enumerated argument.",
25 function);
26 } else if (error == GL_INVALID_VALUE) {
27 LOGE("%s: A numeric argument is out of range.", function);
28 } else if (error == GL_INVALID_OPERATION) {
29 LOGE("%s: The specified operation is not allowed in the current state.",
30 function);
31 } else if (error == GL_INVALID_FRAMEBUFFER_OPERATION) {
32 LOGE("%s: The framebuffer object is not complete.", function);
33 } else if (error == GL_OUT_OF_MEMORY) {
34 LOGE("%s: There is not enough memory left to execute the command.",
35 function);
36 } else {
37 LOGE("ERROR!: %s returns %d", function, error);
38 }
39 }
40 }
41
42 const char* GetArgAsString(Dart_NativeArguments arguments, int idx) {
43 Dart_Handle whatHandle = HandleError(Dart_GetNativeArgument(arguments, idx));
44 uint8_t* str;
45 intptr_t length;
46 HandleError(Dart_StringLength(whatHandle, &length));
47 HandleError(Dart_StringToUTF8(whatHandle, &str, &length));
48 str[length] = 0;
49 return const_cast<const char*>(reinterpret_cast<char*>(str));
50 }
51
52 double GetArgAsDouble(Dart_NativeArguments arguments, int index) {
53 Dart_Handle handle = HandleError(Dart_GetNativeArgument(arguments, index));
54 if (Dart_IsDouble(handle)) {
55 double v;
56 HandleError(Dart_DoubleValue(handle, &v));
57 return v;
58 }
59 if (Dart_IsInteger(handle)) {
60 int64_t v;
61 HandleError(Dart_IntegerToInt64(handle, &v));
62 return static_cast<double>(v);
63 }
64 LOGE("Argument at index %d has non-numeric type", index);
65 Dart_ThrowException(Dart_NewStringFromCString("Numeric argument expected."));
66 return 0;
67 }
68
69 int64_t GetArgAsInt(Dart_NativeArguments arguments, int index) {
70 Dart_Handle handle = HandleError(Dart_GetNativeArgument(arguments, index));
71 if (Dart_IsDouble(handle)) {
72 double v;
73 HandleError(Dart_DoubleValue(handle, &v));
74 return static_cast<int64_t>(v);
75 }
76 if (Dart_IsInteger(handle)) {
77 int64_t v;
78 HandleError(Dart_IntegerToInt64(handle, &v));
79 return v;
80 }
81 LOGE("Argument at index %d has non-numeric type", index);
82 Dart_ThrowException(Dart_NewStringFromCString("Numeric argument expected."));
83 return 0;
84 }
85
86 bool GetArgAsBool(Dart_NativeArguments arguments, int index) {
87 Dart_Handle handle = HandleError(Dart_GetNativeArgument(arguments, index));
88 if (Dart_IsBoolean(handle)) {
89 bool v;
90 HandleError(Dart_BooleanValue(handle, &v));
91 return v;
92 }
93 LOGI("Argument at index %d has non-Boolean type", index);
94 Dart_ThrowException(Dart_NewStringFromCString("Boolean argument expected."));
95 return false;
96 }
97
98 GLint* GetArgsAsGLintList(Dart_NativeArguments arguments, int index,
99 int* len_out) {
100 Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, index));
101 if (Dart_IsList(argHandle)) {
102 intptr_t len;
103 HandleError(Dart_ListLength(argHandle, &len));
104 GLint* list = new GLint[len];
105 for (int i = 0; i < len; i++) {
106 Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
107 int64_t v;
108 HandleError(Dart_IntegerToInt64(vHandle, &v));
109 list[i] = v;
110 }
111 *len_out = len;
112 return list;
113 }
114 LOGI("Argument at index %d has non-List type", index);
115 Dart_ThrowException(Dart_NewStringFromCString("List argument expected."));
116 return NULL;
117 }
118
119 GLfloat* GetArgsAsFloatList(Dart_NativeArguments arguments, int index,
120 int* len_out) {
121 Dart_Handle locationHandle =
122 HandleError(Dart_GetNativeArgument(arguments, 0));
123 int64_t location;
124 HandleError(Dart_IntegerToInt64(locationHandle, &location));
125
126 Dart_Handle argHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
127
128 if (Dart_IsList(argHandle)) {
129 intptr_t len;
130 HandleError(Dart_ListLength(argHandle, &len));
131 GLfloat* list = new GLfloat[len];
132 for (int i = 0; i < len; i++) {
133 Dart_Handle vHandle = Dart_ListGetAt(argHandle, i);
134 double v;
135 HandleError(Dart_DoubleValue(vHandle, &v));
136 list[i] = v;
137 }
138 *len_out = len;
139 return list;
140 }
141 LOGI("Argument at index %d has non-List type", index);
142 Dart_ThrowException(Dart_NewStringFromCString("List argument expected."));
143 return NULL;
144 }
145
146 void SetBoolReturnValue(Dart_NativeArguments arguments, bool b) {
147 Dart_Handle result = HandleError(Dart_NewBoolean(b));
148 Dart_SetReturnValue(arguments, result);
149 }
150
151 void SetIntReturnValue(Dart_NativeArguments arguments, int v) {
152 Dart_Handle result = HandleError(Dart_NewInteger(v));
153 Dart_SetReturnValue(arguments, result);
154 }
155
156 void SetStringReturnValue(Dart_NativeArguments arguments, const char* s) {
157 Dart_Handle result = HandleError(Dart_NewStringFromCString(s));
158 Dart_SetReturnValue(arguments, result);
159 }
160
161 void Log(Dart_NativeArguments arguments) {
162 Dart_EnterScope();
163 LOGI("%s", GetArgAsString(arguments, 0));
164 Dart_ExitScope();
165 }
166
167 void LogError(Dart_NativeArguments arguments) {
168 Dart_EnterScope();
169 LOGE("%s", GetArgAsString(arguments, 0));
170 Dart_ExitScope();
171 }
172
173 void SystemRand(Dart_NativeArguments arguments) {
174 Dart_EnterScope();
175 SetIntReturnValue(arguments, rand());
176 Dart_ExitScope();
177 }
178
179 void SystemSrand(Dart_NativeArguments arguments) {
180 Dart_EnterScope();
181 bool success = false;
182 Dart_Handle seed_object = HandleError(Dart_GetNativeArgument(arguments, 0));
183 if (Dart_IsInteger(seed_object)) {
184 bool fits;
185 HandleError(Dart_IntegerFitsIntoInt64(seed_object, &fits));
186 if (fits) {
187 int64_t seed;
188 HandleError(Dart_IntegerToInt64(seed_object, &seed));
189 srand(static_cast<unsigned>(seed));
190 success = true;
191 }
192 }
193 SetBoolReturnValue(arguments, success);
194 Dart_ExitScope();
195 }
196
197 void SwapBuffers(Dart_NativeArguments arguments) {
198 LOGI("SwapBuffers");
199 Dart_EnterScope();
200 GLSwapBuffers();
201 CheckGLError("GLSwapBuffers");
202 Dart_ExitScope();
203 }
204
205 void GLAttachShader(Dart_NativeArguments arguments) {
206 LOGI("GLAttachShader");
207 Dart_EnterScope();
208
209 int64_t program = GetArgAsInt(arguments, 0);
210 int64_t shader = GetArgAsInt(arguments, 1);
211
212 glAttachShader(program, shader);
213 CheckGLError("glAttachShader");
214 Dart_ExitScope();
215 }
216
217 void GLBindBuffer(Dart_NativeArguments arguments) {
218 LOGI("GLBindBuffer");
219 Dart_EnterScope();
220
221 int64_t target = GetArgAsInt(arguments, 0);
222 int64_t buffer = GetArgAsInt(arguments, 1);
223
224 glBindBuffer(target, buffer);
225 CheckGLError("glBindBuffer");
226 Dart_ExitScope();
227 }
228
229 void GLBufferData(Dart_NativeArguments arguments) {
230 LOGI("GLBufferData");
231 Dart_EnterScope();
232
233 int64_t target = GetArgAsInt(arguments, 0);
234
235 Dart_Handle dataHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
236 intptr_t size;
237 HandleError(Dart_ListLength(dataHandle, &size));
238
239 LOGI("Size: %d", static_cast<int>(size));
240
241 // TODO(vsm): No guarantee that this is a float!
242 float* data = new float[size];
243 for (int i = 0; i < size; i++) {
244 Dart_Handle elemHandle = HandleError(Dart_ListGetAt(dataHandle, i));
245 double value;
246 Dart_DoubleValue(elemHandle, &value);
247 data[i] = static_cast<float>(value);
248 LOGI("Value[%d]: %f", i, data[i]);
249 }
250
251 Dart_Handle usageHandle = HandleError(Dart_GetNativeArgument(arguments, 2));
252 int64_t usage;
253 HandleError(Dart_IntegerToInt64(usageHandle, &usage));
254
255 glBufferData(target, size * sizeof(data[0]), data, usage);
256 CheckGLError("glBufferData");
257 delete[] data;
258 Dart_ExitScope();
259 }
260
261 void GLCompileShader(Dart_NativeArguments arguments) {
262 LOGI("GLCompileShader");
263 Dart_EnterScope();
264 int64_t shader = GetArgAsInt(arguments, 0);
265 glCompileShader(shader);
266 CheckGLError("glCompileShader");
267 Dart_ExitScope();
268 }
269
270 void GLCreateBuffer(Dart_NativeArguments arguments) {
271 LOGI("GLCreateBuffer");
272 Dart_EnterScope();
273 GLuint buffer;
274 glGenBuffers(1, &buffer);
275 CheckGLError("glGenBuffers");
276 SetIntReturnValue(arguments, buffer);
277 Dart_ExitScope();
278 }
279
280 void GLCreateProgram(Dart_NativeArguments arguments) {
281 LOGI("GLCreateProgram");
282 Dart_EnterScope();
283 int64_t program = glCreateProgram();
284 CheckGLError("glCreateProgram");
285 SetIntReturnValue(arguments, program);
286 Dart_ExitScope();
287 }
288
289 void GLCreateShader(Dart_NativeArguments arguments) {
290 LOGI("GLCreateShader");
291 Dart_EnterScope();
292 int64_t type = GetArgAsInt(arguments, 0);
293 int64_t shader = glCreateShader((GLenum)type);
294 CheckGLError("glCreateShader");
295 SetIntReturnValue(arguments, shader);
296 Dart_ExitScope();
297 }
298
299 void GLDrawArrays(Dart_NativeArguments arguments) {
300 LOGI("GLDrawArrays");
301 Dart_EnterScope();
302
303 int64_t mode = GetArgAsInt(arguments, 0);
304 int64_t first = GetArgAsInt(arguments, 1);
305 int64_t count = GetArgAsInt(arguments, 2);
306
307 glDrawArrays(mode, first, count);
308 CheckGLError("glDrawArrays");
309 Dart_ExitScope();
310 LOGI("Done GLDrawArrays");
311 }
312
313 void GLEnableVertexAttribArray(Dart_NativeArguments arguments) {
314 LOGI("GLEnableVertexAttribArray");
315 Dart_EnterScope();
316
317 int64_t location = GetArgAsInt(arguments, 0);
318
319 glEnableVertexAttribArray(location);
320 CheckGLError("glEnableVertexAttribArray");
321 Dart_ExitScope();
322 }
323
324 void GLGetAttribLocation(Dart_NativeArguments arguments) {
325 LOGI("GLGetAttribLocation");
326 Dart_EnterScope();
327
328 int64_t program = GetArgAsInt(arguments, 0);
329
330 Dart_Handle nameHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
331 intptr_t length;
332 HandleError(Dart_StringLength(nameHandle, &length));
333 uint8_t* str;
334 HandleError(Dart_StringToUTF8(nameHandle, &str, &length));
335 str[length] = 0;
336
337 int64_t location = glGetAttribLocation(program,
338 const_cast<const GLchar*>(reinterpret_cast<GLchar*>(str)));
339 CheckGLError("glGetAttribLocation");
340 SetIntReturnValue(arguments, location);
341 Dart_ExitScope();
342 }
343
344 void GLGetError(Dart_NativeArguments arguments) {
345 LOGI("GLGetError");
346 Dart_EnterScope();
347 SetIntReturnValue(arguments, glGetError());
348 Dart_ExitScope();
349 }
350
351 void GLGetProgramParameter(Dart_NativeArguments arguments) {
352 LOGI("GLGetProgramParameter");
353 Dart_EnterScope();
354
355 int64_t program = GetArgAsInt(arguments, 0);
356 int64_t param = GetArgAsInt(arguments, 1);
357
358 GLint value = -1;
359 glGetProgramiv(program, param, &value);
360 CheckGLError("glGetProgramiv");
361
362 SetIntReturnValue(arguments, value);
363 Dart_ExitScope();
364 }
365
366 void GLGetShaderParameter(Dart_NativeArguments arguments) {
367 LOGI("GLGetShaderParameter");
368 Dart_EnterScope();
369
370 int64_t shader = GetArgAsInt(arguments, 0);
371 int64_t param = GetArgAsInt(arguments, 1);
372
373 GLint value = -1;
374 glGetShaderiv((GLuint)shader, (GLenum)param, &value);
375 CheckGLError("glGetShaderiv");
376
377 SetIntReturnValue(arguments, value);
378 Dart_ExitScope();
379 }
380
381 void GLGetShaderInfoLog(Dart_NativeArguments arguments) {
382 LOGI("GLGetShaderInfoLog");
383 Dart_EnterScope();
384
385 int64_t shader = GetArgAsInt(arguments, 0);
386
387 GLint infoLogLength = 0;
388 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
389 GLchar* strInfoLog = new GLchar[infoLogLength + 1];
390 glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);
391 strInfoLog[infoLogLength] = 0;
392
393 SetStringReturnValue(arguments, strInfoLog);
394 Dart_ExitScope();
395 delete[] strInfoLog;
396 }
397
398 void GLGetProgramInfoLog(Dart_NativeArguments arguments) {
399 LOGI("GLGetProgramInfoLog");
400 Dart_EnterScope();
401
402 int64_t program = GetArgAsInt(arguments, 0);
403
404 GLint infoLogLength;
405 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);
406
407 GLchar* strInfoLog = new GLchar[infoLogLength + 1];
408 glGetProgramInfoLog(program, infoLogLength, NULL, strInfoLog);
409 strInfoLog[infoLogLength] = 0;
410
411 SetStringReturnValue(arguments, strInfoLog);
412 Dart_ExitScope();
413 delete[] strInfoLog;
414 }
415
416 void GLGetUniformLocation(Dart_NativeArguments arguments) {
417 LOGI("GLGetUniformLocation");
418 Dart_EnterScope();
419
420 int64_t program = GetArgAsInt(arguments, 0);
421
422
423 Dart_Handle nameHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
424 intptr_t length;
425 HandleError(Dart_StringLength(nameHandle, &length));
426 uint8_t* str;
427 HandleError(Dart_StringToUTF8(nameHandle, &str, &length));
428 str[length] = 0;
429
430 int64_t location = glGetUniformLocation(program,
431 const_cast<const GLchar*>(reinterpret_cast<GLchar*>(str)));
432 CheckGLError("glGetUniformLocation");
433 SetIntReturnValue(arguments, location);
434 Dart_ExitScope();
435 }
436
437 void GLLinkProgram(Dart_NativeArguments arguments) {
438 LOGI("GLLinkProgram");
439 Dart_EnterScope();
440 int64_t program = GetArgAsInt(arguments, 0);
441 glLinkProgram(program);
442 CheckGLError("glLinkProgram");
443 Dart_ExitScope();
444 }
445
446 void GLShaderSource(Dart_NativeArguments arguments) {
447 LOGI("GLShaderSource");
448 Dart_EnterScope();
449
450 int64_t shader = GetArgAsInt(arguments, 0);
451
452 Dart_Handle sourceHandle = HandleError(Dart_GetNativeArgument(arguments, 1));
453 intptr_t length[1];
454 HandleError(Dart_StringLength(sourceHandle, length));
455 LOGI("Source length is %d", static_cast<int>(length[0]));
456 uint8_t* str[1];
457 HandleError(Dart_StringToUTF8(sourceHandle, &str[0], length));
458 LOGI("Converted length is %d", static_cast<int>(length[0]));
459 str[0][*length] = 0;
460
461 const GLchar* source =
462 const_cast<const GLchar*>(reinterpret_cast<GLchar*>(str[0]));
463 LOGI("Source: %s", source);
464 glShaderSource(shader, 1,
465 const_cast<const GLchar**>(reinterpret_cast<GLchar**>(str)), NULL);
466 CheckGLError("glShaderSource");
467 Dart_ExitScope();
468 }
469
470 void GLUseProgram(Dart_NativeArguments arguments) {
471 LOGI("GLUseProgram");
472 Dart_EnterScope();
473 int64_t program = GetArgAsInt(arguments, 0);
474 glUseProgram(program);
475 CheckGLError("glUseProgram");
476 Dart_ExitScope();
477 }
478
479 void GLUniform1i(Dart_NativeArguments arguments) {
480 LOGI("GLUniform1i");
481 Dart_EnterScope();
482 int64_t location = GetArgAsInt(arguments, 0);
483 int64_t v0 = GetArgAsInt(arguments, 1);
484 glUniform1i(location, v0);
485 CheckGLError("glUniform1i");
486 Dart_ExitScope();
487 }
488
489 void GLUniform2i(Dart_NativeArguments arguments) {
490 LOGI("GLUniform2i");
491 Dart_EnterScope();
492 int64_t location = GetArgAsInt(arguments, 0);
493 int64_t v0 = GetArgAsInt(arguments, 1);
494 int64_t v1 = GetArgAsInt(arguments, 2);
495 glUniform2i(location, v0, v1);
496 CheckGLError("glUniform2i");
497 Dart_ExitScope();
498 }
499
500 void GLUniform3i(Dart_NativeArguments arguments) {
501 LOGI("GLUniform3i");
502 Dart_EnterScope();
503 int64_t location = GetArgAsInt(arguments, 0);
504 int64_t v0 = GetArgAsInt(arguments, 1);
505 int64_t v1 = GetArgAsInt(arguments, 2);
506 int64_t v2 = GetArgAsInt(arguments, 3);
507 glUniform3i(location, v0, v1, v2);
508 CheckGLError("glUniform3i");
509 Dart_ExitScope();
510 }
511
512 void GLUniform4i(Dart_NativeArguments arguments) {
513 LOGI("GLUniform4i");
514 Dart_EnterScope();
515 int64_t location = GetArgAsInt(arguments, 0);
516 int64_t v0 = GetArgAsInt(arguments, 1);
517 int64_t v1 = GetArgAsInt(arguments, 2);
518 int64_t v2 = GetArgAsInt(arguments, 3);
519 int64_t v3 = GetArgAsInt(arguments, 4);
520 glUniform4i(location, v0, v1, v2, v3);
521 CheckGLError("glUniform4i");
522 Dart_ExitScope();
523 }
524
525 void GLUniform1f(Dart_NativeArguments arguments) {
526 LOGI("GLUniform1f");
527 Dart_EnterScope();
528 int64_t location = GetArgAsInt(arguments, 0);
529 double v0 = GetArgAsDouble(arguments, 1);
530 glUniform1f(location, v0);
531 CheckGLError("glUniform1f");
532 Dart_ExitScope();
533 }
534
535 void GLUniform2f(Dart_NativeArguments arguments) {
536 LOGI("GLUniform2f");
537 Dart_EnterScope();
538 int64_t location = GetArgAsInt(arguments, 0);
539 double v0 = GetArgAsDouble(arguments, 1);
540 double v1 = GetArgAsDouble(arguments, 2);
541 glUniform2f(location, v0, v1);
542 CheckGLError("glUniform2f");
543 Dart_ExitScope();
544 }
545
546 void GLUniform3f(Dart_NativeArguments arguments) {
547 LOGI("GLUniform3f");
548 Dart_EnterScope();
549 int64_t location = GetArgAsInt(arguments, 0);
550 double v0 = GetArgAsDouble(arguments, 1);
551 double v1 = GetArgAsDouble(arguments, 2);
552 double v2 = GetArgAsDouble(arguments, 3);
553 glUniform3f(location, v0, v1, v2);
554 CheckGLError("glUniform3f");
555 Dart_ExitScope();
556 }
557
558 void GLUniform4f(Dart_NativeArguments arguments) {
559 LOGI("GLUniform4f");
560 Dart_EnterScope();
561 int64_t location = GetArgAsInt(arguments, 0);
562 double v0 = GetArgAsDouble(arguments, 1);
563 double v1 = GetArgAsDouble(arguments, 2);
564 double v2 = GetArgAsDouble(arguments, 3);
565 double v3 = GetArgAsDouble(arguments, 4);
566 glUniform4f(location, v0, v1, v2, v3);
567 CheckGLError("glUniform4f");
568 Dart_ExitScope();
569 }
570
571 void GLUniform1iv(Dart_NativeArguments arguments) {
572 LOGI("GLUniform1iv");
573 Dart_EnterScope();
574 int64_t location = GetArgAsInt(arguments, 0);
575 int len;
576 GLint* list = GetArgsAsGLintList(arguments, 1, &len);
577 if (list != NULL) {
578 glUniform1iv(location, len, list);
579 delete [] list;
580 CheckGLError("glUniform1iv");
581 }
582 Dart_ExitScope();
583 }
584
585 void GLUniform2iv(Dart_NativeArguments arguments) {
586 LOGI("GLUniform2iv");
587 Dart_EnterScope();
588 int64_t location = GetArgAsInt(arguments, 0);
589 int len;
590 GLint* list = GetArgsAsGLintList(arguments, 1, &len);
591 if (list != NULL) {
592 glUniform2iv(location, len / 2, list);
593 delete [] list;
594 CheckGLError("glUniform2iv");
595 }
596 Dart_ExitScope();
597 }
598
599 void GLUniform3iv(Dart_NativeArguments arguments) {
600 LOGI("GLUniform3iv");
601 Dart_EnterScope();
602 int64_t location = GetArgAsInt(arguments, 0);
603 int len;
604 GLint* list = GetArgsAsGLintList(arguments, 1, &len);
605 if (list != NULL) {
606 glUniform3iv(location, len / 3, list);
607 delete [] list;
608 CheckGLError("glUniform3iv");
609 }
610 Dart_ExitScope();
611 }
612
613 void GLUniform4iv(Dart_NativeArguments arguments) {
614 LOGI("GLUniform4iv");
615 Dart_EnterScope();
616 int64_t location = GetArgAsInt(arguments, 0);
617 int len;
618 GLint* list = GetArgsAsGLintList(arguments, 1, &len);
619 if (list != NULL) {
620 glUniform1iv(location, len / 4, list);
621 delete [] list;
622 CheckGLError("glUniform4iv");
623 }
624 Dart_ExitScope();
625 }
626
627 void GLUniform1fv(Dart_NativeArguments arguments) {
628 LOGI("GLUniform1fv");
629 Dart_EnterScope();
630 int64_t location = GetArgAsInt(arguments, 0);
631 int len;
632 GLfloat* list = GetArgsAsFloatList(arguments, 1, &len);
633 if (list != NULL) {
634 glUniform1fv(location, len, list);
635 delete [] list;
636 CheckGLError("glUniform1fv");
637 }
638 Dart_ExitScope();
639 }
640
641 void GLUniform2fv(Dart_NativeArguments arguments) {
642 LOGI("GLUniform2fv");
643 Dart_EnterScope();
644 int64_t location = GetArgAsInt(arguments, 0);
645 int len;
646 GLfloat* list = GetArgsAsFloatList(arguments, 1, &len);
647 if (list != NULL) {
648 glUniform2fv(location, len / 2, list);
649 delete [] list;
650 CheckGLError("glUniform2fv");
651 }
652 Dart_ExitScope();
653 }
654
655 void GLUniform3fv(Dart_NativeArguments arguments) {
656 LOGI("GLUniform3fv");
657 Dart_EnterScope();
658 int64_t location = GetArgAsInt(arguments, 0);
659 int len;
660 GLfloat* list = GetArgsAsFloatList(arguments, 1, &len);
661 if (list != NULL) {
662 glUniform3fv(location, len / 3, list);
663 delete [] list;
664 CheckGLError("glUniform3fv");
665 }
666 Dart_ExitScope();
667 }
668
669 void GLUniform4fv(Dart_NativeArguments arguments) {
670 LOGI("In GLUniform4fv");
671 Dart_EnterScope();
672 int64_t location = GetArgAsInt(arguments, 0);
673 int len;
674 GLfloat* list = GetArgsAsFloatList(arguments, 1, &len);
675 if (list != NULL) {
676 glUniform4fv(location, len / 4, list);
677 delete [] list;
678 CheckGLError("glUniform4fv");
679 }
680 Dart_ExitScope();
681 }
682
683 void GLViewport(Dart_NativeArguments arguments) {
684 LOGI("GLViewport");
685 Dart_EnterScope();
686 int64_t x = GetArgAsInt(arguments, 0);
687 int64_t y = GetArgAsInt(arguments, 1);
688 int64_t width = GetArgAsInt(arguments, 2);
689 int64_t height = GetArgAsInt(arguments, 3);
690 glViewport(x, y, width, height);
691 CheckGLError("glViewPort");
692 Dart_ExitScope();
693 }
694
695 void GLVertexAttribPointer(Dart_NativeArguments arguments) {
696 LOGI("GLVertexAttribPointer");
697 Dart_EnterScope();
698 int64_t index = GetArgAsInt(arguments, 0);
699 int64_t size = GetArgAsInt(arguments, 1);
700 int64_t type = GetArgAsInt(arguments, 2);
701 bool normalized = GetArgAsBool(arguments, 3);
702 int64_t stride = GetArgAsInt(arguments, 4);
703
704 Dart_Handle pointerHandle = HandleError(Dart_GetNativeArgument(arguments, 5));
705 int64_t pointerValue;
706 HandleError(Dart_IntegerToInt64(pointerHandle, &pointerValue));
707 const void* pointer;
708 pointer = const_cast<const void*>(reinterpret_cast<void*>(pointerValue));
709
710 glVertexAttribPointer(index, size, type, normalized, stride, pointer);
711 CheckGLError("glVertexAttribPointer");
712 Dart_ExitScope();
713 }
714
715 void GLClearColor(Dart_NativeArguments arguments) {
716 LOGI("GLClearColor");
717 Dart_EnterScope();
718 double red = GetArgAsDouble(arguments, 0);
719 double green = GetArgAsDouble(arguments, 1);
720 double blue = GetArgAsDouble(arguments, 2);
721 double alpha = GetArgAsDouble(arguments, 3);
722 glClearColor(red, green, blue, alpha);
723 CheckGLError("glClearColor");
724 Dart_ExitScope();
725 }
726
727 void GLClearDepth(Dart_NativeArguments arguments) {
728 LOGI("GLClearDepth");
729 Dart_EnterScope();
730 double depth = GetArgAsDouble(arguments, 0);
731 #if defined(__ANDROID__)
732 glClearDepthf(depth);
733 #else
734 glClearDepth(depth);
735 #endif
736 CheckGLError("glClearDepth");
737 Dart_ExitScope();
738 }
739
740 void GLClear(Dart_NativeArguments arguments) {
741 LOGI("GLClear");
742 Dart_EnterScope();
743 Dart_Handle maskHandle = HandleError(Dart_GetNativeArgument(arguments, 0));
744 int64_t mask;
745 HandleError(Dart_IntegerToInt64(maskHandle, &mask));
746 glClear(mask);
747 CheckGLError("glClear");
748 Dart_ExitScope();
749 }
750
751 void ReturnGLIntConstant(Dart_NativeArguments arguments, int c) {
752 Dart_EnterScope();
753 SetIntReturnValue(arguments, c);
754 Dart_ExitScope();
755 }
756
757 void GLArrayBuffer(Dart_NativeArguments arguments) {
758 ReturnGLIntConstant(arguments, GL_ARRAY_BUFFER);
759 }
760
761 void GLColorBufferBit(Dart_NativeArguments arguments) {
762 ReturnGLIntConstant(arguments, GL_COLOR_BUFFER_BIT);
763 }
764
765 void GLCompileStatus(Dart_NativeArguments arguments) {
766 ReturnGLIntConstant(arguments, GL_COMPILE_STATUS);
767 }
768
769 void GLDeleteStatus(Dart_NativeArguments arguments) {
770 ReturnGLIntConstant(arguments, GL_DELETE_STATUS);
771 }
772
773 void GLDepthBufferBit(Dart_NativeArguments arguments) {
774 ReturnGLIntConstant(arguments, GL_DEPTH_BUFFER_BIT);
775 }
776
777 void GLFloat(Dart_NativeArguments arguments) {
778 ReturnGLIntConstant(arguments, GL_FLOAT);
779 }
780
781 void GLFragmentShader(Dart_NativeArguments arguments) {
782 ReturnGLIntConstant(arguments, GL_FRAGMENT_SHADER);
783 }
784
785 void GLLinkStatus(Dart_NativeArguments arguments) {
786 ReturnGLIntConstant(arguments, GL_LINK_STATUS);
787 }
788
789 void GLStaticDraw(Dart_NativeArguments arguments) {
790 ReturnGLIntConstant(arguments, GL_STATIC_DRAW);
791 }
792
793 void GLTriangleStrip(Dart_NativeArguments arguments) {
794 ReturnGLIntConstant(arguments, GL_TRIANGLE_STRIP);
795 }
796
797 void GLTriangles(Dart_NativeArguments arguments) {
798 ReturnGLIntConstant(arguments, GL_TRIANGLES);
799 }
800
801 void GLTrue(Dart_NativeArguments arguments) {
802 ReturnGLIntConstant(arguments, GL_TRUE);
803 }
804
805 void GLValidateStatus(Dart_NativeArguments arguments) {
806 ReturnGLIntConstant(arguments, GL_VALIDATE_STATUS);
807 }
808
809 void GLVertexShader(Dart_NativeArguments arguments) {
810 ReturnGLIntConstant(arguments, GL_VERTEX_SHADER);
811 }
812
813 uint8_t* RandomArray(int seed, int length) {
814 if (length <= 0 || length > 10000000) return NULL;
815 uint8_t* values = reinterpret_cast<uint8_t*>(malloc(length));
816 if (NULL == values) return NULL;
817 srand(seed);
818 for (int i = 0; i < length; ++i) {
819 values[i] = rand() % 256;
820 }
821 return values;
822 }
823
824 void WrappedRandomArray(Dart_Port dest_port_id,
825 Dart_Port reply_port_id,
826 Dart_CObject* message) {
827 if (message->type == Dart_CObject::kArray &&
828 2 == message->value.as_array.length) {
829 // Use .as_array and .as_int32 to access the data in the Dart_CObject.
830 Dart_CObject* param0 = message->value.as_array.values[0];
831 Dart_CObject* param1 = message->value.as_array.values[1];
832 if (param0->type == Dart_CObject::kInt32 &&
833 param1->type == Dart_CObject::kInt32) {
834 int length = param0->value.as_int32;
835 int seed = param1->value.as_int32;
836
837 uint8_t* values = RandomArray(seed, length);
838
839 if (values != NULL) {
840 Dart_CObject result;
841 result.type = Dart_CObject::kUint8Array;
842 result.value.as_byte_array.values = values;
843 result.value.as_byte_array.length = length;
844 Dart_PostCObject(reply_port_id, &result);
845 free(values);
846 // It is OK that result is destroyed when function exits.
847 // Dart_PostCObject has copied its data.
848 return;
849 }
850 }
851 }
852 Dart_CObject result;
853 result.type = Dart_CObject::kNull;
854 Dart_PostCObject(reply_port_id, &result);
855 }
856
857 void RandomArrayServicePort(Dart_NativeArguments arguments) {
858 Dart_EnterScope();
859 Dart_SetReturnValue(arguments, Dart_Null());
860 Dart_Port service_port =
861 Dart_NewNativePort("RandomArrayService", WrappedRandomArray, true);
862 if (service_port != ((Dart_Port)0)) {
863 Dart_Handle send_port = HandleError(Dart_NewSendPort(service_port));
864 Dart_SetReturnValue(arguments, send_port);
865 }
866 Dart_ExitScope();
867 }
868
869 void PlayBackground(Dart_NativeArguments arguments) {
870 LOGI("PlayBackground");
871 Dart_EnterScope();
872 const char* what = GetArgAsString(arguments, 0);
873 int rtn = PlayBackgroundSound(what);
874 SetIntReturnValue(arguments, rtn);
875 Dart_ExitScope();
876 }
877
878 void StopBackground(Dart_NativeArguments arguments) {
879 LOGI("StopBackground");
880 Dart_EnterScope();
881 StopBackgroundSound();
882 Dart_ExitScope();
883 }
884
885 void LoadSample(Dart_NativeArguments arguments) {
886 LOGI("LoadSample");
887 Dart_EnterScope();
888 const char* what = GetArgAsString(arguments, 0);
889 int rtn = LoadSoundSample(what);
890 SetIntReturnValue(arguments, rtn);
891 Dart_ExitScope();
892 }
893
894 void PlaySample(Dart_NativeArguments arguments) {
895 LOGI("PlaySample");
896 Dart_EnterScope();
897 const char* what = GetArgAsString(arguments, 0);
898 int rtn = PlaySoundSample(what);
899 SetIntReturnValue(arguments, rtn);
900 Dart_ExitScope();
901 }
902
903 struct FunctionLookup {
904 const char* name;
905 Dart_NativeFunction function;
906 };
907
908 FunctionLookup function_list[] = {
909 {"Log", Log},
910 {"LogError", LogError},
911 {"SystemRand", SystemRand},
912 {"SystemSrand", SystemSrand},
913 {"SwapBuffers", SwapBuffers},
914 {"GLAttachShader", GLAttachShader},
915 {"GLBindBuffer", GLBindBuffer},
916 {"GLBufferData", GLBufferData},
917 {"GLClear", GLClear},
918 {"GLClearColor", GLClearColor},
919 {"GLClearDepth", GLClearDepth},
920 {"GLCompileShader", GLCompileShader},
921 {"GLCreateBuffer", GLCreateBuffer},
922 {"GLCreateProgram", GLCreateProgram},
923 {"GLCreateShader", GLCreateShader},
924 {"GLDrawArrays", GLDrawArrays},
925 {"GLEnableVertexAttribArray", GLEnableVertexAttribArray},
926 {"GLGetAttribLocation", GLGetAttribLocation},
927 {"GLGetError", GLGetError},
928 {"GLGetProgramParameter", GLGetProgramParameter},
929 {"GLGetShaderParameter", GLGetShaderParameter},
930 {"GLGetUniformLocation", GLGetUniformLocation},
931 {"GLLinkProgram", GLLinkProgram},
932 {"GLShaderSource", GLShaderSource},
933 {"GLUniform1f", GLUniform1f},
934 {"GLUniform2f", GLUniform2f},
935 {"GLUniform3f", GLUniform3f},
936 {"GLUniform4f", GLUniform4f},
937 {"GLUniform1i", GLUniform1i},
938 {"GLUniform2i", GLUniform2i},
939 {"GLUniform3i", GLUniform3i},
940 {"GLUniform4i", GLUniform4i},
941 {"GLUniform1fv", GLUniform1fv},
942 {"GLUniform2fv", GLUniform2fv},
943 {"GLUniform3fv", GLUniform3fv},
944 {"GLUniform4fv", GLUniform4fv},
945 {"GLUniform1iv", GLUniform1iv},
946 {"GLUniform2iv", GLUniform2iv},
947 {"GLUniform3iv", GLUniform3iv},
948 {"GLUniform4iv", GLUniform4iv},
949 {"GLUseProgram", GLUseProgram},
950 {"GLVertexAttribPointer", GLVertexAttribPointer},
951 {"GLViewport", GLViewport},
952 {"GLArrayBuffer", GLArrayBuffer},
953 {"GLColorBufferBit", GLColorBufferBit},
954 {"GLCompileStatus", GLCompileStatus},
955 {"GLDeleteStatus", GLDeleteStatus},
956 {"GLDepthBufferBit", GLDepthBufferBit},
957 {"GLFloat", GLFloat},
958 {"GLFragmentShader", GLFragmentShader},
959 {"GLLinkStatus", GLLinkStatus},
960 {"GLTriangleStrip", GLTriangleStrip},
961 {"GLTriangles", GLTriangles},
962 {"GLTrue", GLTrue},
963 {"GLStaticDraw", GLStaticDraw},
964 {"GLValidateStatus", GLValidateStatus},
965 {"GLVertexShader", GLVertexShader},
966 {"GLGetShaderInfoLog", GLGetShaderInfoLog},
967 {"GLGetProgramInfoLog", GLGetProgramInfoLog},
968 {"RandomArray_ServicePort", RandomArrayServicePort},
969
970 // Audio support.
971 {"PlayBackground", PlayBackground},
972 {"StopBackground", StopBackground},
973 {"LoadSample", LoadSample},
974 {"PlaySample", PlaySample},
975
976 {NULL, NULL}};
977
978 Dart_NativeFunction ResolveName(Dart_Handle name, int argc) {
979 if (!Dart_IsString(name)) return NULL;
980 Dart_NativeFunction result = NULL;
981 Dart_EnterScope();
982 const char* cname;
983 HandleError(Dart_StringToCString(name, &cname));
984 for (int i = 0; function_list[i].name != NULL; ++i) {
985 if (strcmp(function_list[i].name, cname) == 0) {
986 result = function_list[i].function;
987 break;
988 }
989 }
990 Dart_ExitScope();
991 return result;
992 }
993
OLDNEW
« no previous file with comments | « runtime/embedders/openglui/common/extension.h ('k') | runtime/embedders/openglui/common/gl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698