Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / mojo / examples / pepper_container_app / ppb_opengles2_thunk.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/logging.h"
6 #include "mojo/examples/pepper_container_app/graphics_3d_resource.h"
7 #include "mojo/examples/pepper_container_app/thunk.h"
8 #include "mojo/public/c/gles2/gles2.h"
9 #include "ppapi/thunk/enter.h"
10 #include "ppapi/thunk/ppb_graphics_3d_api.h"
11
12 namespace mojo {
13 namespace examples {
14
15 namespace {
16
17 typedef ppapi::thunk::EnterResource<ppapi::thunk::PPB_Graphics3D_API> Enter3D;
18
19 bool IsBoundGraphics(Enter3D* enter) {
20   return enter->succeeded() &&
21          static_cast<Graphics3DResource*>(enter->object())->IsBoundGraphics();
22 }
23
24 void ActiveTexture(PP_Resource context_id, GLenum texture) {
25   Enter3D enter(context_id, true);
26   if (IsBoundGraphics(&enter)) {
27     glActiveTexture(texture);
28   }
29 }
30
31 void AttachShader(PP_Resource context_id, GLuint program, GLuint shader) {
32   Enter3D enter(context_id, true);
33   if (IsBoundGraphics(&enter)) {
34     glAttachShader(program, shader);
35   }
36 }
37
38 void BindAttribLocation(PP_Resource context_id,
39                         GLuint program,
40                         GLuint index,
41                         const char* name) {
42   Enter3D enter(context_id, true);
43   if (IsBoundGraphics(&enter)) {
44     glBindAttribLocation(program, index, name);
45   }
46 }
47
48 void BindBuffer(PP_Resource context_id, GLenum target, GLuint buffer) {
49   Enter3D enter(context_id, true);
50   if (IsBoundGraphics(&enter)) {
51     glBindBuffer(target, buffer);
52   }
53 }
54
55 void BindFramebuffer(PP_Resource context_id,
56                      GLenum target,
57                      GLuint framebuffer) {
58   Enter3D enter(context_id, true);
59   if (IsBoundGraphics(&enter)) {
60     glBindFramebuffer(target, framebuffer);
61   }
62 }
63
64 void BindRenderbuffer(PP_Resource context_id,
65                       GLenum target,
66                       GLuint renderbuffer) {
67   Enter3D enter(context_id, true);
68   if (IsBoundGraphics(&enter)) {
69     glBindRenderbuffer(target, renderbuffer);
70   }
71 }
72
73 void BindTexture(PP_Resource context_id, GLenum target, GLuint texture) {
74   Enter3D enter(context_id, true);
75   if (IsBoundGraphics(&enter)) {
76     glBindTexture(target, texture);
77   }
78 }
79
80 void BlendColor(PP_Resource context_id,
81                 GLclampf red,
82                 GLclampf green,
83                 GLclampf blue,
84                 GLclampf alpha) {
85   Enter3D enter(context_id, true);
86   if (IsBoundGraphics(&enter)) {
87     glBlendColor(red, green, blue, alpha);
88   }
89 }
90
91 void BlendEquation(PP_Resource context_id, GLenum mode) {
92   Enter3D enter(context_id, true);
93   if (IsBoundGraphics(&enter)) {
94     glBlendEquation(mode);
95   }
96 }
97
98 void BlendEquationSeparate(PP_Resource context_id,
99                            GLenum modeRGB,
100                            GLenum modeAlpha) {
101   Enter3D enter(context_id, true);
102   if (IsBoundGraphics(&enter)) {
103     glBlendEquationSeparate(modeRGB, modeAlpha);
104   }
105 }
106
107 void BlendFunc(PP_Resource context_id, GLenum sfactor, GLenum dfactor) {
108   Enter3D enter(context_id, true);
109   if (IsBoundGraphics(&enter)) {
110     glBlendFunc(sfactor, dfactor);
111   }
112 }
113
114 void BlendFuncSeparate(PP_Resource context_id,
115                        GLenum srcRGB,
116                        GLenum dstRGB,
117                        GLenum srcAlpha,
118                        GLenum dstAlpha) {
119   Enter3D enter(context_id, true);
120   if (IsBoundGraphics(&enter)) {
121     glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
122   }
123 }
124
125 void BufferData(PP_Resource context_id,
126                 GLenum target,
127                 GLsizeiptr size,
128                 const void* data,
129                 GLenum usage) {
130   Enter3D enter(context_id, true);
131   if (IsBoundGraphics(&enter)) {
132     glBufferData(target, size, data, usage);
133   }
134 }
135
136 void BufferSubData(PP_Resource context_id,
137                    GLenum target,
138                    GLintptr offset,
139                    GLsizeiptr size,
140                    const void* data) {
141   Enter3D enter(context_id, true);
142   if (IsBoundGraphics(&enter)) {
143     glBufferSubData(target, offset, size, data);
144   }
145 }
146
147 GLenum CheckFramebufferStatus(PP_Resource context_id, GLenum target) {
148   Enter3D enter(context_id, true);
149   if (IsBoundGraphics(&enter)) {
150     return glCheckFramebufferStatus(target);
151   } else {
152     return 0;
153   }
154 }
155
156 void Clear(PP_Resource context_id, GLbitfield mask) {
157   Enter3D enter(context_id, true);
158   if (IsBoundGraphics(&enter)) {
159     glClear(mask);
160   }
161 }
162
163 void ClearColor(PP_Resource context_id,
164                 GLclampf red,
165                 GLclampf green,
166                 GLclampf blue,
167                 GLclampf alpha) {
168   Enter3D enter(context_id, true);
169   if (IsBoundGraphics(&enter)) {
170     glClearColor(red, green, blue, alpha);
171   }
172 }
173
174 void ClearDepthf(PP_Resource context_id, GLclampf depth) {
175   Enter3D enter(context_id, true);
176   if (IsBoundGraphics(&enter)) {
177     glClearDepthf(depth);
178   }
179 }
180
181 void ClearStencil(PP_Resource context_id, GLint s) {
182   Enter3D enter(context_id, true);
183   if (IsBoundGraphics(&enter)) {
184     glClearStencil(s);
185   }
186 }
187
188 void ColorMask(PP_Resource context_id,
189                GLboolean red,
190                GLboolean green,
191                GLboolean blue,
192                GLboolean alpha) {
193   Enter3D enter(context_id, true);
194   if (IsBoundGraphics(&enter)) {
195     glColorMask(red, green, blue, alpha);
196   }
197 }
198
199 void CompileShader(PP_Resource context_id, GLuint shader) {
200   Enter3D enter(context_id, true);
201   if (IsBoundGraphics(&enter)) {
202     glCompileShader(shader);
203   }
204 }
205
206 void CompressedTexImage2D(PP_Resource context_id,
207                           GLenum target,
208                           GLint level,
209                           GLenum internalformat,
210                           GLsizei width,
211                           GLsizei height,
212                           GLint border,
213                           GLsizei imageSize,
214                           const void* data) {
215   Enter3D enter(context_id, true);
216   if (IsBoundGraphics(&enter)) {
217     glCompressedTexImage2D(
218         target, level, internalformat, width, height, border, imageSize, data);
219   }
220 }
221
222 void CompressedTexSubImage2D(PP_Resource context_id,
223                              GLenum target,
224                              GLint level,
225                              GLint xoffset,
226                              GLint yoffset,
227                              GLsizei width,
228                              GLsizei height,
229                              GLenum format,
230                              GLsizei imageSize,
231                              const void* data) {
232   Enter3D enter(context_id, true);
233   if (IsBoundGraphics(&enter)) {
234     glCompressedTexSubImage2D(target,
235                               level,
236                               xoffset,
237                               yoffset,
238                               width,
239                               height,
240                               format,
241                               imageSize,
242                               data);
243   }
244 }
245
246 void CopyTexImage2D(PP_Resource context_id,
247                     GLenum target,
248                     GLint level,
249                     GLenum internalformat,
250                     GLint x,
251                     GLint y,
252                     GLsizei width,
253                     GLsizei height,
254                     GLint border) {
255   Enter3D enter(context_id, true);
256   if (IsBoundGraphics(&enter)) {
257     glCopyTexImage2D(
258         target, level, internalformat, x, y, width, height, border);
259   }
260 }
261
262 void CopyTexSubImage2D(PP_Resource context_id,
263                        GLenum target,
264                        GLint level,
265                        GLint xoffset,
266                        GLint yoffset,
267                        GLint x,
268                        GLint y,
269                        GLsizei width,
270                        GLsizei height) {
271   Enter3D enter(context_id, true);
272   if (IsBoundGraphics(&enter)) {
273     glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
274   }
275 }
276
277 GLuint CreateProgram(PP_Resource context_id) {
278   Enter3D enter(context_id, true);
279   if (IsBoundGraphics(&enter)) {
280     return glCreateProgram();
281   } else {
282     return 0;
283   }
284 }
285
286 GLuint CreateShader(PP_Resource context_id, GLenum type) {
287   Enter3D enter(context_id, true);
288   if (IsBoundGraphics(&enter)) {
289     return glCreateShader(type);
290   } else {
291     return 0;
292   }
293 }
294
295 void CullFace(PP_Resource context_id, GLenum mode) {
296   Enter3D enter(context_id, true);
297   if (IsBoundGraphics(&enter)) {
298     glCullFace(mode);
299   }
300 }
301
302 void DeleteBuffers(PP_Resource context_id, GLsizei n, const GLuint* buffers) {
303   Enter3D enter(context_id, true);
304   if (IsBoundGraphics(&enter)) {
305     glDeleteBuffers(n, buffers);
306   }
307 }
308
309 void DeleteFramebuffers(PP_Resource context_id,
310                         GLsizei n,
311                         const GLuint* framebuffers) {
312   Enter3D enter(context_id, true);
313   if (IsBoundGraphics(&enter)) {
314     glDeleteFramebuffers(n, framebuffers);
315   }
316 }
317
318 void DeleteProgram(PP_Resource context_id, GLuint program) {
319   Enter3D enter(context_id, true);
320   if (IsBoundGraphics(&enter)) {
321     glDeleteProgram(program);
322   }
323 }
324
325 void DeleteRenderbuffers(PP_Resource context_id,
326                          GLsizei n,
327                          const GLuint* renderbuffers) {
328   Enter3D enter(context_id, true);
329   if (IsBoundGraphics(&enter)) {
330     glDeleteRenderbuffers(n, renderbuffers);
331   }
332 }
333
334 void DeleteShader(PP_Resource context_id, GLuint shader) {
335   Enter3D enter(context_id, true);
336   if (IsBoundGraphics(&enter)) {
337     glDeleteShader(shader);
338   }
339 }
340
341 void DeleteTextures(PP_Resource context_id, GLsizei n, const GLuint* textures) {
342   Enter3D enter(context_id, true);
343   if (IsBoundGraphics(&enter)) {
344     glDeleteTextures(n, textures);
345   }
346 }
347
348 void DepthFunc(PP_Resource context_id, GLenum func) {
349   Enter3D enter(context_id, true);
350   if (IsBoundGraphics(&enter)) {
351     glDepthFunc(func);
352   }
353 }
354
355 void DepthMask(PP_Resource context_id, GLboolean flag) {
356   Enter3D enter(context_id, true);
357   if (IsBoundGraphics(&enter)) {
358     glDepthMask(flag);
359   }
360 }
361
362 void DepthRangef(PP_Resource context_id, GLclampf zNear, GLclampf zFar) {
363   Enter3D enter(context_id, true);
364   if (IsBoundGraphics(&enter)) {
365     glDepthRangef(zNear, zFar);
366   }
367 }
368
369 void DetachShader(PP_Resource context_id, GLuint program, GLuint shader) {
370   Enter3D enter(context_id, true);
371   if (IsBoundGraphics(&enter)) {
372     glDetachShader(program, shader);
373   }
374 }
375
376 void Disable(PP_Resource context_id, GLenum cap) {
377   Enter3D enter(context_id, true);
378   if (IsBoundGraphics(&enter)) {
379     glDisable(cap);
380   }
381 }
382
383 void DisableVertexAttribArray(PP_Resource context_id, GLuint index) {
384   Enter3D enter(context_id, true);
385   if (IsBoundGraphics(&enter)) {
386     glDisableVertexAttribArray(index);
387   }
388 }
389
390 void DrawArrays(PP_Resource context_id,
391                 GLenum mode,
392                 GLint first,
393                 GLsizei count) {
394   Enter3D enter(context_id, true);
395   if (IsBoundGraphics(&enter)) {
396     glDrawArrays(mode, first, count);
397   }
398 }
399
400 void DrawElements(PP_Resource context_id,
401                   GLenum mode,
402                   GLsizei count,
403                   GLenum type,
404                   const void* indices) {
405   Enter3D enter(context_id, true);
406   if (IsBoundGraphics(&enter)) {
407     glDrawElements(mode, count, type, indices);
408   }
409 }
410
411 void Enable(PP_Resource context_id, GLenum cap) {
412   Enter3D enter(context_id, true);
413   if (IsBoundGraphics(&enter)) {
414     glEnable(cap);
415   }
416 }
417
418 void EnableVertexAttribArray(PP_Resource context_id, GLuint index) {
419   Enter3D enter(context_id, true);
420   if (IsBoundGraphics(&enter)) {
421     glEnableVertexAttribArray(index);
422   }
423 }
424
425 void Finish(PP_Resource context_id) {
426   Enter3D enter(context_id, true);
427   if (IsBoundGraphics(&enter)) {
428     glFinish();
429   }
430 }
431
432 void Flush(PP_Resource context_id) {
433   Enter3D enter(context_id, true);
434   if (IsBoundGraphics(&enter)) {
435     glFlush();
436   }
437 }
438
439 void FramebufferRenderbuffer(PP_Resource context_id,
440                              GLenum target,
441                              GLenum attachment,
442                              GLenum renderbuffertarget,
443                              GLuint renderbuffer) {
444   Enter3D enter(context_id, true);
445   if (IsBoundGraphics(&enter)) {
446     glFramebufferRenderbuffer(
447         target, attachment, renderbuffertarget, renderbuffer);
448   }
449 }
450
451 void FramebufferTexture2D(PP_Resource context_id,
452                           GLenum target,
453                           GLenum attachment,
454                           GLenum textarget,
455                           GLuint texture,
456                           GLint level) {
457   Enter3D enter(context_id, true);
458   if (IsBoundGraphics(&enter)) {
459     glFramebufferTexture2D(target, attachment, textarget, texture, level);
460   }
461 }
462
463 void FrontFace(PP_Resource context_id, GLenum mode) {
464   Enter3D enter(context_id, true);
465   if (IsBoundGraphics(&enter)) {
466     glFrontFace(mode);
467   }
468 }
469
470 void GenBuffers(PP_Resource context_id, GLsizei n, GLuint* buffers) {
471   Enter3D enter(context_id, true);
472   if (IsBoundGraphics(&enter)) {
473     glGenBuffers(n, buffers);
474   }
475 }
476
477 void GenerateMipmap(PP_Resource context_id, GLenum target) {
478   Enter3D enter(context_id, true);
479   if (IsBoundGraphics(&enter)) {
480     glGenerateMipmap(target);
481   }
482 }
483
484 void GenFramebuffers(PP_Resource context_id, GLsizei n, GLuint* framebuffers) {
485   Enter3D enter(context_id, true);
486   if (IsBoundGraphics(&enter)) {
487     glGenFramebuffers(n, framebuffers);
488   }
489 }
490
491 void GenRenderbuffers(PP_Resource context_id,
492                       GLsizei n,
493                       GLuint* renderbuffers) {
494   Enter3D enter(context_id, true);
495   if (IsBoundGraphics(&enter)) {
496     glGenRenderbuffers(n, renderbuffers);
497   }
498 }
499
500 void GenTextures(PP_Resource context_id, GLsizei n, GLuint* textures) {
501   Enter3D enter(context_id, true);
502   if (IsBoundGraphics(&enter)) {
503     glGenTextures(n, textures);
504   }
505 }
506
507 void GetActiveAttrib(PP_Resource context_id,
508                      GLuint program,
509                      GLuint index,
510                      GLsizei bufsize,
511                      GLsizei* length,
512                      GLint* size,
513                      GLenum* type,
514                      char* name) {
515   Enter3D enter(context_id, true);
516   if (IsBoundGraphics(&enter)) {
517     glGetActiveAttrib(program, index, bufsize, length, size, type, name);
518   }
519 }
520
521 void GetActiveUniform(PP_Resource context_id,
522                       GLuint program,
523                       GLuint index,
524                       GLsizei bufsize,
525                       GLsizei* length,
526                       GLint* size,
527                       GLenum* type,
528                       char* name) {
529   Enter3D enter(context_id, true);
530   if (IsBoundGraphics(&enter)) {
531     glGetActiveUniform(program, index, bufsize, length, size, type, name);
532   }
533 }
534
535 void GetAttachedShaders(PP_Resource context_id,
536                         GLuint program,
537                         GLsizei maxcount,
538                         GLsizei* count,
539                         GLuint* shaders) {
540   Enter3D enter(context_id, true);
541   if (IsBoundGraphics(&enter)) {
542     glGetAttachedShaders(program, maxcount, count, shaders);
543   }
544 }
545
546 GLint GetAttribLocation(PP_Resource context_id,
547                         GLuint program,
548                         const char* name) {
549   Enter3D enter(context_id, true);
550   if (IsBoundGraphics(&enter)) {
551     return glGetAttribLocation(program, name);
552   } else {
553     return -1;
554   }
555 }
556
557 void GetBooleanv(PP_Resource context_id, GLenum pname, GLboolean* params) {
558   Enter3D enter(context_id, true);
559   if (IsBoundGraphics(&enter)) {
560     glGetBooleanv(pname, params);
561   }
562 }
563
564 void GetBufferParameteriv(PP_Resource context_id,
565                           GLenum target,
566                           GLenum pname,
567                           GLint* params) {
568   Enter3D enter(context_id, true);
569   if (IsBoundGraphics(&enter)) {
570     glGetBufferParameteriv(target, pname, params);
571   }
572 }
573
574 GLenum GetError(PP_Resource context_id) {
575   Enter3D enter(context_id, true);
576   if (IsBoundGraphics(&enter)) {
577     return glGetError();
578   } else {
579     return 0;
580   }
581 }
582
583 void GetFloatv(PP_Resource context_id, GLenum pname, GLfloat* params) {
584   Enter3D enter(context_id, true);
585   if (IsBoundGraphics(&enter)) {
586     glGetFloatv(pname, params);
587   }
588 }
589
590 void GetFramebufferAttachmentParameteriv(PP_Resource context_id,
591                                          GLenum target,
592                                          GLenum attachment,
593                                          GLenum pname,
594                                          GLint* params) {
595   Enter3D enter(context_id, true);
596   if (IsBoundGraphics(&enter)) {
597     glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
598   }
599 }
600
601 void GetIntegerv(PP_Resource context_id, GLenum pname, GLint* params) {
602   Enter3D enter(context_id, true);
603   if (IsBoundGraphics(&enter)) {
604     glGetIntegerv(pname, params);
605   }
606 }
607
608 void GetProgramiv(PP_Resource context_id,
609                   GLuint program,
610                   GLenum pname,
611                   GLint* params) {
612   Enter3D enter(context_id, true);
613   if (IsBoundGraphics(&enter)) {
614     glGetProgramiv(program, pname, params);
615   }
616 }
617
618 void GetProgramInfoLog(PP_Resource context_id,
619                        GLuint program,
620                        GLsizei bufsize,
621                        GLsizei* length,
622                        char* infolog) {
623   Enter3D enter(context_id, true);
624   if (IsBoundGraphics(&enter)) {
625     glGetProgramInfoLog(program, bufsize, length, infolog);
626   }
627 }
628
629 void GetRenderbufferParameteriv(PP_Resource context_id,
630                                 GLenum target,
631                                 GLenum pname,
632                                 GLint* params) {
633   Enter3D enter(context_id, true);
634   if (IsBoundGraphics(&enter)) {
635     glGetRenderbufferParameteriv(target, pname, params);
636   }
637 }
638
639 void GetShaderiv(PP_Resource context_id,
640                  GLuint shader,
641                  GLenum pname,
642                  GLint* params) {
643   Enter3D enter(context_id, true);
644   if (IsBoundGraphics(&enter)) {
645     glGetShaderiv(shader, pname, params);
646   }
647 }
648
649 void GetShaderInfoLog(PP_Resource context_id,
650                       GLuint shader,
651                       GLsizei bufsize,
652                       GLsizei* length,
653                       char* infolog) {
654   Enter3D enter(context_id, true);
655   if (IsBoundGraphics(&enter)) {
656     glGetShaderInfoLog(shader, bufsize, length, infolog);
657   }
658 }
659
660 void GetShaderPrecisionFormat(PP_Resource context_id,
661                               GLenum shadertype,
662                               GLenum precisiontype,
663                               GLint* range,
664                               GLint* precision) {
665   Enter3D enter(context_id, true);
666   if (IsBoundGraphics(&enter)) {
667     glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
668   }
669 }
670
671 void GetShaderSource(PP_Resource context_id,
672                      GLuint shader,
673                      GLsizei bufsize,
674                      GLsizei* length,
675                      char* source) {
676   Enter3D enter(context_id, true);
677   if (IsBoundGraphics(&enter)) {
678     glGetShaderSource(shader, bufsize, length, source);
679   }
680 }
681
682 const GLubyte* GetString(PP_Resource context_id, GLenum name) {
683   Enter3D enter(context_id, true);
684   if (IsBoundGraphics(&enter)) {
685     return glGetString(name);
686   } else {
687     return NULL;
688   }
689 }
690
691 void GetTexParameterfv(PP_Resource context_id,
692                        GLenum target,
693                        GLenum pname,
694                        GLfloat* params) {
695   Enter3D enter(context_id, true);
696   if (IsBoundGraphics(&enter)) {
697     glGetTexParameterfv(target, pname, params);
698   }
699 }
700
701 void GetTexParameteriv(PP_Resource context_id,
702                        GLenum target,
703                        GLenum pname,
704                        GLint* params) {
705   Enter3D enter(context_id, true);
706   if (IsBoundGraphics(&enter)) {
707     glGetTexParameteriv(target, pname, params);
708   }
709 }
710
711 void GetUniformfv(PP_Resource context_id,
712                   GLuint program,
713                   GLint location,
714                   GLfloat* params) {
715   Enter3D enter(context_id, true);
716   if (IsBoundGraphics(&enter)) {
717     glGetUniformfv(program, location, params);
718   }
719 }
720
721 void GetUniformiv(PP_Resource context_id,
722                   GLuint program,
723                   GLint location,
724                   GLint* params) {
725   Enter3D enter(context_id, true);
726   if (IsBoundGraphics(&enter)) {
727     glGetUniformiv(program, location, params);
728   }
729 }
730
731 GLint GetUniformLocation(PP_Resource context_id,
732                          GLuint program,
733                          const char* name) {
734   Enter3D enter(context_id, true);
735   if (IsBoundGraphics(&enter)) {
736     return glGetUniformLocation(program, name);
737   } else {
738     return -1;
739   }
740 }
741
742 void GetVertexAttribfv(PP_Resource context_id,
743                        GLuint index,
744                        GLenum pname,
745                        GLfloat* params) {
746   Enter3D enter(context_id, true);
747   if (IsBoundGraphics(&enter)) {
748     glGetVertexAttribfv(index, pname, params);
749   }
750 }
751
752 void GetVertexAttribiv(PP_Resource context_id,
753                        GLuint index,
754                        GLenum pname,
755                        GLint* params) {
756   Enter3D enter(context_id, true);
757   if (IsBoundGraphics(&enter)) {
758     glGetVertexAttribiv(index, pname, params);
759   }
760 }
761
762 void GetVertexAttribPointerv(PP_Resource context_id,
763                              GLuint index,
764                              GLenum pname,
765                              void** pointer) {
766   Enter3D enter(context_id, true);
767   if (IsBoundGraphics(&enter)) {
768     glGetVertexAttribPointerv(index, pname, pointer);
769   }
770 }
771
772 void Hint(PP_Resource context_id, GLenum target, GLenum mode) {
773   Enter3D enter(context_id, true);
774   if (IsBoundGraphics(&enter)) {
775     glHint(target, mode);
776   }
777 }
778
779 GLboolean IsBuffer(PP_Resource context_id, GLuint buffer) {
780   Enter3D enter(context_id, true);
781   if (IsBoundGraphics(&enter)) {
782     return glIsBuffer(buffer);
783   } else {
784     return GL_FALSE;
785   }
786 }
787
788 GLboolean IsEnabled(PP_Resource context_id, GLenum cap) {
789   Enter3D enter(context_id, true);
790   if (IsBoundGraphics(&enter)) {
791     return glIsEnabled(cap);
792   } else {
793     return GL_FALSE;
794   }
795 }
796
797 GLboolean IsFramebuffer(PP_Resource context_id, GLuint framebuffer) {
798   Enter3D enter(context_id, true);
799   if (IsBoundGraphics(&enter)) {
800     return glIsFramebuffer(framebuffer);
801   } else {
802     return GL_FALSE;
803   }
804 }
805
806 GLboolean IsProgram(PP_Resource context_id, GLuint program) {
807   Enter3D enter(context_id, true);
808   if (IsBoundGraphics(&enter)) {
809     return glIsProgram(program);
810   } else {
811     return GL_FALSE;
812   }
813 }
814
815 GLboolean IsRenderbuffer(PP_Resource context_id, GLuint renderbuffer) {
816   Enter3D enter(context_id, true);
817   if (IsBoundGraphics(&enter)) {
818     return glIsRenderbuffer(renderbuffer);
819   } else {
820     return GL_FALSE;
821   }
822 }
823
824 GLboolean IsShader(PP_Resource context_id, GLuint shader) {
825   Enter3D enter(context_id, true);
826   if (IsBoundGraphics(&enter)) {
827     return glIsShader(shader);
828   } else {
829     return GL_FALSE;
830   }
831 }
832
833 GLboolean IsTexture(PP_Resource context_id, GLuint texture) {
834   Enter3D enter(context_id, true);
835   if (IsBoundGraphics(&enter)) {
836     return glIsTexture(texture);
837   } else {
838     return GL_FALSE;
839   }
840 }
841
842 void LineWidth(PP_Resource context_id, GLfloat width) {
843   Enter3D enter(context_id, true);
844   if (IsBoundGraphics(&enter)) {
845     glLineWidth(width);
846   }
847 }
848
849 void LinkProgram(PP_Resource context_id, GLuint program) {
850   Enter3D enter(context_id, true);
851   if (IsBoundGraphics(&enter)) {
852     glLinkProgram(program);
853   }
854 }
855
856 void PixelStorei(PP_Resource context_id, GLenum pname, GLint param) {
857   Enter3D enter(context_id, true);
858   if (IsBoundGraphics(&enter)) {
859     glPixelStorei(pname, param);
860   }
861 }
862
863 void PolygonOffset(PP_Resource context_id, GLfloat factor, GLfloat units) {
864   Enter3D enter(context_id, true);
865   if (IsBoundGraphics(&enter)) {
866     glPolygonOffset(factor, units);
867   }
868 }
869
870 void ReadPixels(PP_Resource context_id,
871                 GLint x,
872                 GLint y,
873                 GLsizei width,
874                 GLsizei height,
875                 GLenum format,
876                 GLenum type,
877                 void* pixels) {
878   Enter3D enter(context_id, true);
879   if (IsBoundGraphics(&enter)) {
880     glReadPixels(x, y, width, height, format, type, pixels);
881   }
882 }
883
884 void ReleaseShaderCompiler(PP_Resource context_id) {
885   Enter3D enter(context_id, true);
886   if (IsBoundGraphics(&enter)) {
887     glReleaseShaderCompiler();
888   }
889 }
890
891 void RenderbufferStorage(PP_Resource context_id,
892                          GLenum target,
893                          GLenum internalformat,
894                          GLsizei width,
895                          GLsizei height) {
896   Enter3D enter(context_id, true);
897   if (IsBoundGraphics(&enter)) {
898     glRenderbufferStorage(target, internalformat, width, height);
899   }
900 }
901
902 void SampleCoverage(PP_Resource context_id, GLclampf value, GLboolean invert) {
903   Enter3D enter(context_id, true);
904   if (IsBoundGraphics(&enter)) {
905     glSampleCoverage(value, invert);
906   }
907 }
908
909 void Scissor(PP_Resource context_id,
910              GLint x,
911              GLint y,
912              GLsizei width,
913              GLsizei height) {
914   Enter3D enter(context_id, true);
915   if (IsBoundGraphics(&enter)) {
916     glScissor(x, y, width, height);
917   }
918 }
919
920 void ShaderBinary(PP_Resource context_id,
921                   GLsizei n,
922                   const GLuint* shaders,
923                   GLenum binaryformat,
924                   const void* binary,
925                   GLsizei length) {
926   Enter3D enter(context_id, true);
927   if (IsBoundGraphics(&enter)) {
928     glShaderBinary(n, shaders, binaryformat, binary, length);
929   }
930 }
931
932 void ShaderSource(PP_Resource context_id,
933                   GLuint shader,
934                   GLsizei count,
935                   const char** str,
936                   const GLint* length) {
937   Enter3D enter(context_id, true);
938   if (IsBoundGraphics(&enter)) {
939     glShaderSource(shader, count, str, length);
940   }
941 }
942
943 void StencilFunc(PP_Resource context_id, GLenum func, GLint ref, GLuint mask) {
944   Enter3D enter(context_id, true);
945   if (IsBoundGraphics(&enter)) {
946     glStencilFunc(func, ref, mask);
947   }
948 }
949
950 void StencilFuncSeparate(PP_Resource context_id,
951                          GLenum face,
952                          GLenum func,
953                          GLint ref,
954                          GLuint mask) {
955   Enter3D enter(context_id, true);
956   if (IsBoundGraphics(&enter)) {
957     glStencilFuncSeparate(face, func, ref, mask);
958   }
959 }
960
961 void StencilMask(PP_Resource context_id, GLuint mask) {
962   Enter3D enter(context_id, true);
963   if (IsBoundGraphics(&enter)) {
964     glStencilMask(mask);
965   }
966 }
967
968 void StencilMaskSeparate(PP_Resource context_id, GLenum face, GLuint mask) {
969   Enter3D enter(context_id, true);
970   if (IsBoundGraphics(&enter)) {
971     glStencilMaskSeparate(face, mask);
972   }
973 }
974
975 void StencilOp(PP_Resource context_id,
976                GLenum fail,
977                GLenum zfail,
978                GLenum zpass) {
979   Enter3D enter(context_id, true);
980   if (IsBoundGraphics(&enter)) {
981     glStencilOp(fail, zfail, zpass);
982   }
983 }
984
985 void StencilOpSeparate(PP_Resource context_id,
986                        GLenum face,
987                        GLenum fail,
988                        GLenum zfail,
989                        GLenum zpass) {
990   Enter3D enter(context_id, true);
991   if (IsBoundGraphics(&enter)) {
992     glStencilOpSeparate(face, fail, zfail, zpass);
993   }
994 }
995
996 void TexImage2D(PP_Resource context_id,
997                 GLenum target,
998                 GLint level,
999                 GLint internalformat,
1000                 GLsizei width,
1001                 GLsizei height,
1002                 GLint border,
1003                 GLenum format,
1004                 GLenum type,
1005                 const void* pixels) {
1006   Enter3D enter(context_id, true);
1007   if (IsBoundGraphics(&enter)) {
1008     glTexImage2D(target,
1009                  level,
1010                  internalformat,
1011                  width,
1012                  height,
1013                  border,
1014                  format,
1015                  type,
1016                  pixels);
1017   }
1018 }
1019
1020 void TexParameterf(PP_Resource context_id,
1021                    GLenum target,
1022                    GLenum pname,
1023                    GLfloat param) {
1024   Enter3D enter(context_id, true);
1025   if (IsBoundGraphics(&enter)) {
1026     glTexParameterf(target, pname, param);
1027   }
1028 }
1029
1030 void TexParameterfv(PP_Resource context_id,
1031                     GLenum target,
1032                     GLenum pname,
1033                     const GLfloat* params) {
1034   Enter3D enter(context_id, true);
1035   if (IsBoundGraphics(&enter)) {
1036     glTexParameterfv(target, pname, params);
1037   }
1038 }
1039
1040 void TexParameteri(PP_Resource context_id,
1041                    GLenum target,
1042                    GLenum pname,
1043                    GLint param) {
1044   Enter3D enter(context_id, true);
1045   if (IsBoundGraphics(&enter)) {
1046     glTexParameteri(target, pname, param);
1047   }
1048 }
1049
1050 void TexParameteriv(PP_Resource context_id,
1051                     GLenum target,
1052                     GLenum pname,
1053                     const GLint* params) {
1054   Enter3D enter(context_id, true);
1055   if (IsBoundGraphics(&enter)) {
1056     glTexParameteriv(target, pname, params);
1057   }
1058 }
1059
1060 void TexSubImage2D(PP_Resource context_id,
1061                    GLenum target,
1062                    GLint level,
1063                    GLint xoffset,
1064                    GLint yoffset,
1065                    GLsizei width,
1066                    GLsizei height,
1067                    GLenum format,
1068                    GLenum type,
1069                    const void* pixels) {
1070   Enter3D enter(context_id, true);
1071   if (IsBoundGraphics(&enter)) {
1072     glTexSubImage2D(
1073         target, level, xoffset, yoffset, width, height, format, type, pixels);
1074   }
1075 }
1076
1077 void Uniform1f(PP_Resource context_id, GLint location, GLfloat x) {
1078   Enter3D enter(context_id, true);
1079   if (IsBoundGraphics(&enter)) {
1080     glUniform1f(location, x);
1081   }
1082 }
1083
1084 void Uniform1fv(PP_Resource context_id,
1085                 GLint location,
1086                 GLsizei count,
1087                 const GLfloat* v) {
1088   Enter3D enter(context_id, true);
1089   if (IsBoundGraphics(&enter)) {
1090     glUniform1fv(location, count, v);
1091   }
1092 }
1093
1094 void Uniform1i(PP_Resource context_id, GLint location, GLint x) {
1095   Enter3D enter(context_id, true);
1096   if (IsBoundGraphics(&enter)) {
1097     glUniform1i(location, x);
1098   }
1099 }
1100
1101 void Uniform1iv(PP_Resource context_id,
1102                 GLint location,
1103                 GLsizei count,
1104                 const GLint* v) {
1105   Enter3D enter(context_id, true);
1106   if (IsBoundGraphics(&enter)) {
1107     glUniform1iv(location, count, v);
1108   }
1109 }
1110
1111 void Uniform2f(PP_Resource context_id, GLint location, GLfloat x, GLfloat y) {
1112   Enter3D enter(context_id, true);
1113   if (IsBoundGraphics(&enter)) {
1114     glUniform2f(location, x, y);
1115   }
1116 }
1117
1118 void Uniform2fv(PP_Resource context_id,
1119                 GLint location,
1120                 GLsizei count,
1121                 const GLfloat* v) {
1122   Enter3D enter(context_id, true);
1123   if (IsBoundGraphics(&enter)) {
1124     glUniform2fv(location, count, v);
1125   }
1126 }
1127
1128 void Uniform2i(PP_Resource context_id, GLint location, GLint x, GLint y) {
1129   Enter3D enter(context_id, true);
1130   if (IsBoundGraphics(&enter)) {
1131     glUniform2i(location, x, y);
1132   }
1133 }
1134
1135 void Uniform2iv(PP_Resource context_id,
1136                 GLint location,
1137                 GLsizei count,
1138                 const GLint* v) {
1139   Enter3D enter(context_id, true);
1140   if (IsBoundGraphics(&enter)) {
1141     glUniform2iv(location, count, v);
1142   }
1143 }
1144
1145 void Uniform3f(PP_Resource context_id,
1146                GLint location,
1147                GLfloat x,
1148                GLfloat y,
1149                GLfloat z) {
1150   Enter3D enter(context_id, true);
1151   if (IsBoundGraphics(&enter)) {
1152     glUniform3f(location, x, y, z);
1153   }
1154 }
1155
1156 void Uniform3fv(PP_Resource context_id,
1157                 GLint location,
1158                 GLsizei count,
1159                 const GLfloat* v) {
1160   Enter3D enter(context_id, true);
1161   if (IsBoundGraphics(&enter)) {
1162     glUniform3fv(location, count, v);
1163   }
1164 }
1165
1166 void Uniform3i(PP_Resource context_id,
1167                GLint location,
1168                GLint x,
1169                GLint y,
1170                GLint z) {
1171   Enter3D enter(context_id, true);
1172   if (IsBoundGraphics(&enter)) {
1173     glUniform3i(location, x, y, z);
1174   }
1175 }
1176
1177 void Uniform3iv(PP_Resource context_id,
1178                 GLint location,
1179                 GLsizei count,
1180                 const GLint* v) {
1181   Enter3D enter(context_id, true);
1182   if (IsBoundGraphics(&enter)) {
1183     glUniform3iv(location, count, v);
1184   }
1185 }
1186
1187 void Uniform4f(PP_Resource context_id,
1188                GLint location,
1189                GLfloat x,
1190                GLfloat y,
1191                GLfloat z,
1192                GLfloat w) {
1193   Enter3D enter(context_id, true);
1194   if (IsBoundGraphics(&enter)) {
1195     glUniform4f(location, x, y, z, w);
1196   }
1197 }
1198
1199 void Uniform4fv(PP_Resource context_id,
1200                 GLint location,
1201                 GLsizei count,
1202                 const GLfloat* v) {
1203   Enter3D enter(context_id, true);
1204   if (IsBoundGraphics(&enter)) {
1205     glUniform4fv(location, count, v);
1206   }
1207 }
1208
1209 void Uniform4i(PP_Resource context_id,
1210                GLint location,
1211                GLint x,
1212                GLint y,
1213                GLint z,
1214                GLint w) {
1215   Enter3D enter(context_id, true);
1216   if (IsBoundGraphics(&enter)) {
1217     glUniform4i(location, x, y, z, w);
1218   }
1219 }
1220
1221 void Uniform4iv(PP_Resource context_id,
1222                 GLint location,
1223                 GLsizei count,
1224                 const GLint* v) {
1225   Enter3D enter(context_id, true);
1226   if (IsBoundGraphics(&enter)) {
1227     glUniform4iv(location, count, v);
1228   }
1229 }
1230
1231 void UniformMatrix2fv(PP_Resource context_id,
1232                       GLint location,
1233                       GLsizei count,
1234                       GLboolean transpose,
1235                       const GLfloat* value) {
1236   Enter3D enter(context_id, true);
1237   if (IsBoundGraphics(&enter)) {
1238     glUniformMatrix2fv(location, count, transpose, value);
1239   }
1240 }
1241
1242 void UniformMatrix3fv(PP_Resource context_id,
1243                       GLint location,
1244                       GLsizei count,
1245                       GLboolean transpose,
1246                       const GLfloat* value) {
1247   Enter3D enter(context_id, true);
1248   if (IsBoundGraphics(&enter)) {
1249     glUniformMatrix3fv(location, count, transpose, value);
1250   }
1251 }
1252
1253 void UniformMatrix4fv(PP_Resource context_id,
1254                       GLint location,
1255                       GLsizei count,
1256                       GLboolean transpose,
1257                       const GLfloat* value) {
1258   Enter3D enter(context_id, true);
1259   if (IsBoundGraphics(&enter)) {
1260     glUniformMatrix4fv(location, count, transpose, value);
1261   }
1262 }
1263
1264 void UseProgram(PP_Resource context_id, GLuint program) {
1265   Enter3D enter(context_id, true);
1266   if (IsBoundGraphics(&enter)) {
1267     glUseProgram(program);
1268   }
1269 }
1270
1271 void ValidateProgram(PP_Resource context_id, GLuint program) {
1272   Enter3D enter(context_id, true);
1273   if (IsBoundGraphics(&enter)) {
1274     glValidateProgram(program);
1275   }
1276 }
1277
1278 void VertexAttrib1f(PP_Resource context_id, GLuint indx, GLfloat x) {
1279   Enter3D enter(context_id, true);
1280   if (IsBoundGraphics(&enter)) {
1281     glVertexAttrib1f(indx, x);
1282   }
1283 }
1284
1285 void VertexAttrib1fv(PP_Resource context_id,
1286                      GLuint indx,
1287                      const GLfloat* values) {
1288   Enter3D enter(context_id, true);
1289   if (IsBoundGraphics(&enter)) {
1290     glVertexAttrib1fv(indx, values);
1291   }
1292 }
1293
1294 void VertexAttrib2f(PP_Resource context_id, GLuint indx, GLfloat x, GLfloat y) {
1295   Enter3D enter(context_id, true);
1296   if (IsBoundGraphics(&enter)) {
1297     glVertexAttrib2f(indx, x, y);
1298   }
1299 }
1300
1301 void VertexAttrib2fv(PP_Resource context_id,
1302                      GLuint indx,
1303                      const GLfloat* values) {
1304   Enter3D enter(context_id, true);
1305   if (IsBoundGraphics(&enter)) {
1306     glVertexAttrib2fv(indx, values);
1307   }
1308 }
1309
1310 void VertexAttrib3f(PP_Resource context_id,
1311                     GLuint indx,
1312                     GLfloat x,
1313                     GLfloat y,
1314                     GLfloat z) {
1315   Enter3D enter(context_id, true);
1316   if (IsBoundGraphics(&enter)) {
1317     glVertexAttrib3f(indx, x, y, z);
1318   }
1319 }
1320
1321 void VertexAttrib3fv(PP_Resource context_id,
1322                      GLuint indx,
1323                      const GLfloat* values) {
1324   Enter3D enter(context_id, true);
1325   if (IsBoundGraphics(&enter)) {
1326     glVertexAttrib3fv(indx, values);
1327   }
1328 }
1329
1330 void VertexAttrib4f(PP_Resource context_id,
1331                     GLuint indx,
1332                     GLfloat x,
1333                     GLfloat y,
1334                     GLfloat z,
1335                     GLfloat w) {
1336   Enter3D enter(context_id, true);
1337   if (IsBoundGraphics(&enter)) {
1338     glVertexAttrib4f(indx, x, y, z, w);
1339   }
1340 }
1341
1342 void VertexAttrib4fv(PP_Resource context_id,
1343                      GLuint indx,
1344                      const GLfloat* values) {
1345   Enter3D enter(context_id, true);
1346   if (IsBoundGraphics(&enter)) {
1347     glVertexAttrib4fv(indx, values);
1348   }
1349 }
1350
1351 void VertexAttribPointer(PP_Resource context_id,
1352                          GLuint indx,
1353                          GLint size,
1354                          GLenum type,
1355                          GLboolean normalized,
1356                          GLsizei stride,
1357                          const void* ptr) {
1358   Enter3D enter(context_id, true);
1359   if (IsBoundGraphics(&enter)) {
1360     glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
1361   }
1362 }
1363
1364 void Viewport(PP_Resource context_id,
1365               GLint x,
1366               GLint y,
1367               GLsizei width,
1368               GLsizei height) {
1369   Enter3D enter(context_id, true);
1370   if (IsBoundGraphics(&enter)) {
1371     glViewport(x, y, width, height);
1372   }
1373 }
1374
1375 }  // namespace
1376
1377 const PPB_OpenGLES2* GetPPB_OpenGLES2_Thunk() {
1378   static const struct PPB_OpenGLES2 ppb_opengles2 = {
1379       &ActiveTexture,                       &AttachShader,
1380       &BindAttribLocation,                  &BindBuffer,
1381       &BindFramebuffer,                     &BindRenderbuffer,
1382       &BindTexture,                         &BlendColor,
1383       &BlendEquation,                       &BlendEquationSeparate,
1384       &BlendFunc,                           &BlendFuncSeparate,
1385       &BufferData,                          &BufferSubData,
1386       &CheckFramebufferStatus,              &Clear,
1387       &ClearColor,                          &ClearDepthf,
1388       &ClearStencil,                        &ColorMask,
1389       &CompileShader,                       &CompressedTexImage2D,
1390       &CompressedTexSubImage2D,             &CopyTexImage2D,
1391       &CopyTexSubImage2D,                   &CreateProgram,
1392       &CreateShader,                        &CullFace,
1393       &DeleteBuffers,                       &DeleteFramebuffers,
1394       &DeleteProgram,                       &DeleteRenderbuffers,
1395       &DeleteShader,                        &DeleteTextures,
1396       &DepthFunc,                           &DepthMask,
1397       &DepthRangef,                         &DetachShader,
1398       &Disable,                             &DisableVertexAttribArray,
1399       &DrawArrays,                          &DrawElements,
1400       &Enable,                              &EnableVertexAttribArray,
1401       &Finish,                              &Flush,
1402       &FramebufferRenderbuffer,             &FramebufferTexture2D,
1403       &FrontFace,                           &GenBuffers,
1404       &GenerateMipmap,                      &GenFramebuffers,
1405       &GenRenderbuffers,                    &GenTextures,
1406       &GetActiveAttrib,                     &GetActiveUniform,
1407       &GetAttachedShaders,                  &GetAttribLocation,
1408       &GetBooleanv,                         &GetBufferParameteriv,
1409       &GetError,                            &GetFloatv,
1410       &GetFramebufferAttachmentParameteriv, &GetIntegerv,
1411       &GetProgramiv,                        &GetProgramInfoLog,
1412       &GetRenderbufferParameteriv,          &GetShaderiv,
1413       &GetShaderInfoLog,                    &GetShaderPrecisionFormat,
1414       &GetShaderSource,                     &GetString,
1415       &GetTexParameterfv,                   &GetTexParameteriv,
1416       &GetUniformfv,                        &GetUniformiv,
1417       &GetUniformLocation,                  &GetVertexAttribfv,
1418       &GetVertexAttribiv,                   &GetVertexAttribPointerv,
1419       &Hint,                                &IsBuffer,
1420       &IsEnabled,                           &IsFramebuffer,
1421       &IsProgram,                           &IsRenderbuffer,
1422       &IsShader,                            &IsTexture,
1423       &LineWidth,                           &LinkProgram,
1424       &PixelStorei,                         &PolygonOffset,
1425       &ReadPixels,                          &ReleaseShaderCompiler,
1426       &RenderbufferStorage,                 &SampleCoverage,
1427       &Scissor,                             &ShaderBinary,
1428       &ShaderSource,                        &StencilFunc,
1429       &StencilFuncSeparate,                 &StencilMask,
1430       &StencilMaskSeparate,                 &StencilOp,
1431       &StencilOpSeparate,                   &TexImage2D,
1432       &TexParameterf,                       &TexParameterfv,
1433       &TexParameteri,                       &TexParameteriv,
1434       &TexSubImage2D,                       &Uniform1f,
1435       &Uniform1fv,                          &Uniform1i,
1436       &Uniform1iv,                          &Uniform2f,
1437       &Uniform2fv,                          &Uniform2i,
1438       &Uniform2iv,                          &Uniform3f,
1439       &Uniform3fv,                          &Uniform3i,
1440       &Uniform3iv,                          &Uniform4f,
1441       &Uniform4fv,                          &Uniform4i,
1442       &Uniform4iv,                          &UniformMatrix2fv,
1443       &UniformMatrix3fv,                    &UniformMatrix4fv,
1444       &UseProgram,                          &ValidateProgram,
1445       &VertexAttrib1f,                      &VertexAttrib1fv,
1446       &VertexAttrib2f,                      &VertexAttrib2fv,
1447       &VertexAttrib3f,                      &VertexAttrib3fv,
1448       &VertexAttrib4f,                      &VertexAttrib4fv,
1449       &VertexAttribPointer,                 &Viewport};
1450   return &ppb_opengles2;
1451 }
1452
1453 }  // namespace examples
1454 }  // namespace mojo