Home | History | Annotate | Download | only in pepper_container_app
      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
   1455