Home | History | Annotate | Download | only in gpu
      1 // Copyright (c) 2012 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 "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
      6 
      7 #include <GLES2/gl2.h>
      8 #ifndef GL_GLEXT_PROTOTYPES
      9 #define GL_GLEXT_PROTOTYPES 1
     10 #endif
     11 #include <GLES2/gl2ext.h>
     12 #include <GLES2/gl2extchromium.h>
     13 
     14 #include <string>
     15 
     16 #include "base/atomicops.h"
     17 #include "base/bind.h"
     18 #include "base/bind_helpers.h"
     19 #include "base/callback.h"
     20 #include "base/lazy_instance.h"
     21 #include "base/logging.h"
     22 #include "gpu/command_buffer/client/gl_in_process_context.h"
     23 #include "gpu/command_buffer/client/gles2_implementation.h"
     24 #include "gpu/command_buffer/client/gles2_lib.h"
     25 #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h"
     26 #include "ui/gfx/size.h"
     27 #include "ui/gl/gl_surface.h"
     28 
     29 using gpu::gles2::GLES2Implementation;
     30 using gpu::GLInProcessContext;
     31 
     32 namespace webkit {
     33 namespace gpu {
     34 
     35 namespace {
     36 
     37 const int32 kCommandBufferSize = 1024 * 1024;
     38 // TODO(kbr): make the transfer buffer size configurable via context
     39 // creation attributes.
     40 const size_t kStartTransferBufferSize = 4 * 1024 * 1024;
     41 const size_t kMinTransferBufferSize = 1 * 256 * 1024;
     42 const size_t kMaxTransferBufferSize = 16 * 1024 * 1024;
     43 
     44 uint32_t GenFlushID() {
     45   static base::subtle::Atomic32 flush_id = 0;
     46 
     47   base::subtle::Atomic32 my_id = base::subtle::Barrier_AtomicIncrement(
     48       &flush_id, 1);
     49   return static_cast<uint32_t>(my_id);
     50 }
     51 
     52 // Singleton used to initialize and terminate the gles2 library.
     53 class GLES2Initializer {
     54  public:
     55   GLES2Initializer() {
     56     ::gles2::Initialize();
     57   }
     58 
     59   ~GLES2Initializer() {
     60     ::gles2::Terminate();
     61   }
     62 
     63  private:
     64   DISALLOW_COPY_AND_ASSIGN(GLES2Initializer);
     65 };
     66 
     67 static base::LazyInstance<GLES2Initializer> g_gles2_initializer =
     68     LAZY_INSTANCE_INITIALIZER;
     69 
     70 }  // namespace anonymous
     71 
     72 // static
     73 scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
     74 WebGraphicsContext3DInProcessCommandBufferImpl::CreateViewContext(
     75     const blink::WebGraphicsContext3D::Attributes& attributes,
     76     gfx::AcceleratedWidget window) {
     77   scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> context;
     78   if (gfx::GLSurface::InitializeOneOff()) {
     79     context.reset(new WebGraphicsContext3DInProcessCommandBufferImpl(
     80       scoped_ptr< ::gpu::GLInProcessContext>(), attributes, false, window));
     81   }
     82   return context.Pass();
     83 }
     84 
     85 // static
     86 scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
     87 WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext(
     88     const blink::WebGraphicsContext3D::Attributes& attributes) {
     89   return make_scoped_ptr(new WebGraphicsContext3DInProcessCommandBufferImpl(
     90                              scoped_ptr< ::gpu::GLInProcessContext>(),
     91                              attributes,
     92                              true,
     93                              gfx::kNullAcceleratedWidget))
     94       .Pass();
     95 }
     96 
     97 scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
     98 WebGraphicsContext3DInProcessCommandBufferImpl::WrapContext(
     99     scoped_ptr< ::gpu::GLInProcessContext> context,
    100     const blink::WebGraphicsContext3D::Attributes& attributes) {
    101   return make_scoped_ptr(
    102       new WebGraphicsContext3DInProcessCommandBufferImpl(
    103           context.Pass(),
    104           attributes,
    105           true /* is_offscreen. Not used. */,
    106           gfx::kNullAcceleratedWidget /* window. Not used. */))
    107       .Pass();
    108 }
    109 
    110 WebGraphicsContext3DInProcessCommandBufferImpl::
    111     WebGraphicsContext3DInProcessCommandBufferImpl(
    112         scoped_ptr< ::gpu::GLInProcessContext> context,
    113         const blink::WebGraphicsContext3D::Attributes& attributes,
    114         bool is_offscreen,
    115         gfx::AcceleratedWidget window)
    116     : is_offscreen_(is_offscreen),
    117       window_(window),
    118       initialized_(false),
    119       initialize_failed_(false),
    120       context_(context.Pass()),
    121       gl_(NULL),
    122       context_lost_callback_(NULL),
    123       context_lost_reason_(GL_NO_ERROR),
    124       attributes_(attributes),
    125       flush_id_(0) {
    126 }
    127 
    128 WebGraphicsContext3DInProcessCommandBufferImpl::
    129     ~WebGraphicsContext3DInProcessCommandBufferImpl() {
    130 }
    131 
    132 // static
    133 void WebGraphicsContext3DInProcessCommandBufferImpl::ConvertAttributes(
    134     const blink::WebGraphicsContext3D::Attributes& attributes,
    135     ::gpu::GLInProcessContextAttribs* output_attribs) {
    136   output_attribs->alpha_size = attributes.alpha ? 8 : 0;
    137   output_attribs->depth_size = attributes.depth ? 24 : 0;
    138   output_attribs->stencil_size = attributes.stencil ? 8 : 0;
    139   output_attribs->samples = attributes.antialias ? 4 : 0;
    140   output_attribs->sample_buffers = attributes.antialias ? 1 : 0;
    141   output_attribs->fail_if_major_perf_caveat =
    142       attributes.failIfMajorPerformanceCaveat ? 1 : 0;
    143 }
    144 
    145 bool WebGraphicsContext3DInProcessCommandBufferImpl::MaybeInitializeGL() {
    146   if (initialized_)
    147     return true;
    148 
    149   if (initialize_failed_)
    150     return false;
    151 
    152   // Ensure the gles2 library is initialized first in a thread safe way.
    153   g_gles2_initializer.Get();
    154 
    155   if (!context_) {
    156     // TODO(kbr): More work will be needed in this implementation to
    157     // properly support GPU switching. Like in the out-of-process
    158     // command buffer implementation, all previously created contexts
    159     // will need to be lost either when the first context requesting the
    160     // discrete GPU is created, or the last one is destroyed.
    161     gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
    162 
    163     ::gpu::GLInProcessContextAttribs attrib_struct;
    164     ConvertAttributes(attributes_, &attrib_struct),
    165 
    166     context_.reset(GLInProcessContext::CreateContext(
    167         is_offscreen_,
    168         window_,
    169         gfx::Size(1, 1),
    170         attributes_.shareResources,
    171         attrib_struct,
    172         gpu_preference));
    173   }
    174 
    175   if (context_) {
    176     base::Closure context_lost_callback = base::Bind(
    177         &WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost,
    178         base::Unretained(this));
    179     context_->SetContextLostCallback(context_lost_callback);
    180   } else {
    181     initialize_failed_ = true;
    182     return false;
    183   }
    184 
    185   gl_ = context_->GetImplementation();
    186 
    187   if (gl_ && attributes_.noExtensions)
    188     gl_->EnableFeatureCHROMIUM("webgl_enable_glsl_webgl_validation");
    189 
    190   // Set attributes_ from created offscreen context.
    191   {
    192     GLint alpha_bits = 0;
    193     getIntegerv(GL_ALPHA_BITS, &alpha_bits);
    194     attributes_.alpha = alpha_bits > 0;
    195     GLint depth_bits = 0;
    196     getIntegerv(GL_DEPTH_BITS, &depth_bits);
    197     attributes_.depth = depth_bits > 0;
    198     GLint stencil_bits = 0;
    199     getIntegerv(GL_STENCIL_BITS, &stencil_bits);
    200     attributes_.stencil = stencil_bits > 0;
    201     GLint sample_buffers = 0;
    202     getIntegerv(GL_SAMPLE_BUFFERS, &sample_buffers);
    203     attributes_.antialias = sample_buffers > 0;
    204   }
    205 
    206   initialized_ = true;
    207   return true;
    208 }
    209 
    210 bool WebGraphicsContext3DInProcessCommandBufferImpl::makeContextCurrent() {
    211   if (!MaybeInitializeGL())
    212     return false;
    213   ::gles2::SetGLContext(gl_);
    214   return context_ && !isContextLost();
    215 }
    216 
    217 uint32_t WebGraphicsContext3DInProcessCommandBufferImpl::lastFlushID() {
    218   return flush_id_;
    219 }
    220 
    221 void WebGraphicsContext3DInProcessCommandBufferImpl::ClearContext() {
    222   // NOTE: Comment in the line below to check for code that is not calling
    223   // eglMakeCurrent where appropriate. The issue is code using
    224   // WebGraphicsContext3D does not need to call makeContextCurrent. Code using
    225   // direct OpenGL bindings needs to call the appropriate form of
    226   // eglMakeCurrent. If it doesn't it will be issuing commands on the wrong
    227   // context. Uncommenting the line below clears the current context so that
    228   // any code not calling eglMakeCurrent in the appropriate place should crash.
    229   // This is not a perfect test but generally code that used the direct OpenGL
    230   // bindings should not be mixed with code that uses WebGraphicsContext3D.
    231   //
    232   // GLInProcessContext::MakeCurrent(NULL);
    233 }
    234 
    235 // Helper macros to reduce the amount of code.
    236 
    237 #define DELEGATE_TO_GL(name, glname)                                    \
    238 void WebGraphicsContext3DInProcessCommandBufferImpl::name() {           \
    239   ClearContext();                                                       \
    240   gl_->glname();                                                        \
    241 }
    242 
    243 #define DELEGATE_TO_GL_R(name, glname, rt)                              \
    244 rt WebGraphicsContext3DInProcessCommandBufferImpl::name() {             \
    245   ClearContext();                                                       \
    246   return gl_->glname();                                                 \
    247 }
    248 
    249 #define DELEGATE_TO_GL_1(name, glname, t1)                              \
    250 void WebGraphicsContext3DInProcessCommandBufferImpl::name(t1 a1) {      \
    251   ClearContext();                                                       \
    252   gl_->glname(a1);                                                      \
    253 }
    254 
    255 #define DELEGATE_TO_GL_1R(name, glname, t1, rt)                         \
    256 rt WebGraphicsContext3DInProcessCommandBufferImpl::name(t1 a1) {        \
    257   ClearContext();                                                       \
    258   return gl_->glname(a1);                                               \
    259 }
    260 
    261 #define DELEGATE_TO_GL_1RB(name, glname, t1, rt)                        \
    262 rt WebGraphicsContext3DInProcessCommandBufferImpl::name(t1 a1) {        \
    263   ClearContext();                                                       \
    264   return gl_->glname(a1) ? true : false;                                \
    265 }
    266 
    267 #define DELEGATE_TO_GL_2(name, glname, t1, t2)                          \
    268 void WebGraphicsContext3DInProcessCommandBufferImpl::name(              \
    269     t1 a1, t2 a2) {                                                     \
    270   ClearContext();                                                       \
    271   gl_->glname(a1, a2);                                                  \
    272 }
    273 
    274 #define DELEGATE_TO_GL_2R(name, glname, t1, t2, rt)                     \
    275 rt WebGraphicsContext3DInProcessCommandBufferImpl::name(t1 a1, t2 a2) { \
    276   ClearContext();                                                       \
    277   return gl_->glname(a1, a2);                                           \
    278 }
    279 
    280 #define DELEGATE_TO_GL_3(name, glname, t1, t2, t3)                      \
    281 void WebGraphicsContext3DInProcessCommandBufferImpl::name(              \
    282     t1 a1, t2 a2, t3 a3) {                                              \
    283   ClearContext();                                                       \
    284   gl_->glname(a1, a2, a3);                                              \
    285 }
    286 
    287 #define DELEGATE_TO_GL_3R(name, glname, t1, t2, t3, rt)                 \
    288 rt WebGraphicsContext3DInProcessCommandBufferImpl::name(                \
    289     t1 a1, t2 a2, t3 a3) {                                              \
    290   ClearContext();                                                       \
    291   return gl_->glname(a1, a2, a3);                                       \
    292 }
    293 
    294 #define DELEGATE_TO_GL_4(name, glname, t1, t2, t3, t4)                  \
    295 void WebGraphicsContext3DInProcessCommandBufferImpl::name(              \
    296     t1 a1, t2 a2, t3 a3, t4 a4) {                                       \
    297   ClearContext();                                                       \
    298   gl_->glname(a1, a2, a3, a4);                                          \
    299 }
    300 
    301 #define DELEGATE_TO_GL_5(name, glname, t1, t2, t3, t4, t5)              \
    302 void WebGraphicsContext3DInProcessCommandBufferImpl::name(              \
    303     t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) {                                \
    304   ClearContext();                                                       \
    305   gl_->glname(a1, a2, a3, a4, a5);                                      \
    306 }
    307 
    308 #define DELEGATE_TO_GL_6(name, glname, t1, t2, t3, t4, t5, t6)          \
    309 void WebGraphicsContext3DInProcessCommandBufferImpl::name(              \
    310     t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6) {                         \
    311   ClearContext();                                                       \
    312   gl_->glname(a1, a2, a3, a4, a5, a6);                                  \
    313 }
    314 
    315 #define DELEGATE_TO_GL_7(name, glname, t1, t2, t3, t4, t5, t6, t7)      \
    316 void WebGraphicsContext3DInProcessCommandBufferImpl::name(              \
    317     t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7) {                  \
    318   ClearContext();                                                       \
    319   gl_->glname(a1, a2, a3, a4, a5, a6, a7);                              \
    320 }
    321 
    322 #define DELEGATE_TO_GL_8(name, glname, t1, t2, t3, t4, t5, t6, t7, t8)  \
    323 void WebGraphicsContext3DInProcessCommandBufferImpl::name(              \
    324     t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8) {           \
    325   ClearContext();                                                       \
    326   gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8);                          \
    327 }
    328 
    329 #define DELEGATE_TO_GL_9(name, glname, t1, t2, t3, t4, t5, t6, t7, t8, t9) \
    330 void WebGraphicsContext3DInProcessCommandBufferImpl::name(              \
    331     t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6, t7 a7, t8 a8, t9 a9) {    \
    332   ClearContext();                                                       \
    333   gl_->glname(a1, a2, a3, a4, a5, a6, a7, a8, a9);                      \
    334 }
    335 
    336 void WebGraphicsContext3DInProcessCommandBufferImpl::prepareTexture() {
    337   NOTREACHED();
    338 }
    339 
    340 void WebGraphicsContext3DInProcessCommandBufferImpl::postSubBufferCHROMIUM(
    341     int x, int y, int width, int height) {
    342   NOTREACHED();
    343 }
    344 
    345 DELEGATE_TO_GL_3(reshapeWithScaleFactor, ResizeCHROMIUM, int, int, float)
    346 
    347 void WebGraphicsContext3DInProcessCommandBufferImpl::synthesizeGLError(
    348     WGC3Denum error) {
    349   if (std::find(synthetic_errors_.begin(), synthetic_errors_.end(), error) ==
    350       synthetic_errors_.end()) {
    351     synthetic_errors_.push_back(error);
    352   }
    353 }
    354 
    355 void* WebGraphicsContext3DInProcessCommandBufferImpl::mapBufferSubDataCHROMIUM(
    356     WGC3Denum target,
    357     WGC3Dintptr offset,
    358     WGC3Dsizeiptr size,
    359     WGC3Denum access) {
    360   ClearContext();
    361   return gl_->MapBufferSubDataCHROMIUM(target, offset, size, access);
    362 }
    363 
    364 void WebGraphicsContext3DInProcessCommandBufferImpl::unmapBufferSubDataCHROMIUM(
    365     const void* mem) {
    366   ClearContext();
    367   return gl_->UnmapBufferSubDataCHROMIUM(mem);
    368 }
    369 
    370 void* WebGraphicsContext3DInProcessCommandBufferImpl::mapTexSubImage2DCHROMIUM(
    371     WGC3Denum target,
    372     WGC3Dint level,
    373     WGC3Dint xoffset,
    374     WGC3Dint yoffset,
    375     WGC3Dsizei width,
    376     WGC3Dsizei height,
    377     WGC3Denum format,
    378     WGC3Denum type,
    379     WGC3Denum access) {
    380   ClearContext();
    381   return gl_->MapTexSubImage2DCHROMIUM(
    382       target, level, xoffset, yoffset, width, height, format, type, access);
    383 }
    384 
    385 void WebGraphicsContext3DInProcessCommandBufferImpl::unmapTexSubImage2DCHROMIUM(
    386     const void* mem) {
    387   ClearContext();
    388   gl_->UnmapTexSubImage2DCHROMIUM(mem);
    389 }
    390 
    391 void WebGraphicsContext3DInProcessCommandBufferImpl::setVisibilityCHROMIUM(
    392     bool visible) {
    393 }
    394 
    395 void WebGraphicsContext3DInProcessCommandBufferImpl::discardFramebufferEXT(
    396     WGC3Denum target, WGC3Dsizei numAttachments, const WGC3Denum* attachments) {
    397   gl_->DiscardFramebufferEXT(target, numAttachments, attachments);
    398 }
    399 
    400 void WebGraphicsContext3DInProcessCommandBufferImpl::
    401     copyTextureToParentTextureCHROMIUM(WebGLId texture, WebGLId parentTexture) {
    402   NOTIMPLEMENTED();
    403 }
    404 
    405 void WebGraphicsContext3DInProcessCommandBufferImpl::
    406     rateLimitOffscreenContextCHROMIUM() {
    407   // TODO(gmam): See if we can comment this in.
    408   // ClearContext();
    409   gl_->RateLimitOffscreenContextCHROMIUM();
    410 }
    411 
    412 blink::WebString WebGraphicsContext3DInProcessCommandBufferImpl::
    413     getRequestableExtensionsCHROMIUM() {
    414   // TODO(gmam): See if we can comment this in.
    415   // ClearContext();
    416   return blink::WebString::fromUTF8(
    417       gl_->GetRequestableExtensionsCHROMIUM());
    418 }
    419 
    420 void WebGraphicsContext3DInProcessCommandBufferImpl::requestExtensionCHROMIUM(
    421     const char* extension) {
    422   // TODO(gmam): See if we can comment this in.
    423   // ClearContext();
    424   gl_->RequestExtensionCHROMIUM(extension);
    425 }
    426 
    427 void WebGraphicsContext3DInProcessCommandBufferImpl::blitFramebufferCHROMIUM(
    428     WGC3Dint srcX0, WGC3Dint srcY0, WGC3Dint srcX1, WGC3Dint srcY1,
    429     WGC3Dint dstX0, WGC3Dint dstY0, WGC3Dint dstX1, WGC3Dint dstY1,
    430     WGC3Dbitfield mask, WGC3Denum filter) {
    431   ClearContext();
    432   gl_->BlitFramebufferCHROMIUM(
    433       srcX0, srcY0, srcX1, srcY1,
    434       dstX0, dstY0, dstX1, dstY1,
    435       mask, filter);
    436 }
    437 
    438 void WebGraphicsContext3DInProcessCommandBufferImpl::
    439     renderbufferStorageMultisampleCHROMIUM(
    440         WGC3Denum target, WGC3Dsizei samples, WGC3Denum internalformat,
    441         WGC3Dsizei width, WGC3Dsizei height) {
    442   ClearContext();
    443   gl_->RenderbufferStorageMultisampleCHROMIUM(
    444       target, samples, internalformat, width, height);
    445 }
    446 
    447 DELEGATE_TO_GL_1(activeTexture, ActiveTexture, WGC3Denum)
    448 
    449 DELEGATE_TO_GL_2(attachShader, AttachShader, WebGLId, WebGLId)
    450 
    451 DELEGATE_TO_GL_3(bindAttribLocation, BindAttribLocation, WebGLId,
    452                  WGC3Duint, const WGC3Dchar*)
    453 
    454 DELEGATE_TO_GL_2(bindBuffer, BindBuffer, WGC3Denum, WebGLId)
    455 
    456 void WebGraphicsContext3DInProcessCommandBufferImpl::bindFramebuffer(
    457     WGC3Denum target,
    458     WebGLId framebuffer) {
    459   ClearContext();
    460   gl_->BindFramebuffer(target, framebuffer);
    461 }
    462 
    463 DELEGATE_TO_GL_2(bindRenderbuffer, BindRenderbuffer, WGC3Denum, WebGLId)
    464 
    465 DELEGATE_TO_GL_2(bindTexture, BindTexture, WGC3Denum, WebGLId)
    466 
    467 DELEGATE_TO_GL_4(blendColor, BlendColor,
    468                  WGC3Dclampf, WGC3Dclampf, WGC3Dclampf, WGC3Dclampf)
    469 
    470 DELEGATE_TO_GL_1(blendEquation, BlendEquation, WGC3Denum)
    471 
    472 DELEGATE_TO_GL_2(blendEquationSeparate, BlendEquationSeparate,
    473                  WGC3Denum, WGC3Denum)
    474 
    475 DELEGATE_TO_GL_2(blendFunc, BlendFunc, WGC3Denum, WGC3Denum)
    476 
    477 DELEGATE_TO_GL_4(blendFuncSeparate, BlendFuncSeparate,
    478                  WGC3Denum, WGC3Denum, WGC3Denum, WGC3Denum)
    479 
    480 DELEGATE_TO_GL_4(bufferData, BufferData,
    481                  WGC3Denum, WGC3Dsizeiptr, const void*, WGC3Denum)
    482 
    483 DELEGATE_TO_GL_4(bufferSubData, BufferSubData,
    484                  WGC3Denum, WGC3Dintptr, WGC3Dsizeiptr, const void*)
    485 
    486 DELEGATE_TO_GL_1R(checkFramebufferStatus, CheckFramebufferStatus,
    487                   WGC3Denum, WGC3Denum)
    488 
    489 DELEGATE_TO_GL_1(clear, Clear, WGC3Dbitfield)
    490 
    491 DELEGATE_TO_GL_4(clearColor, ClearColor,
    492                  WGC3Dclampf, WGC3Dclampf, WGC3Dclampf, WGC3Dclampf)
    493 
    494 DELEGATE_TO_GL_1(clearDepth, ClearDepthf, WGC3Dclampf)
    495 
    496 DELEGATE_TO_GL_1(clearStencil, ClearStencil, WGC3Dint)
    497 
    498 DELEGATE_TO_GL_4(colorMask, ColorMask,
    499                  WGC3Dboolean, WGC3Dboolean, WGC3Dboolean, WGC3Dboolean)
    500 
    501 DELEGATE_TO_GL_1(compileShader, CompileShader, WebGLId)
    502 
    503 DELEGATE_TO_GL_8(compressedTexImage2D, CompressedTexImage2D,
    504                  WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dint, WGC3Dint,
    505                  WGC3Dsizei, WGC3Dsizei, const void*)
    506 
    507 DELEGATE_TO_GL_9(compressedTexSubImage2D, CompressedTexSubImage2D,
    508                  WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint,
    509                  WGC3Denum, WGC3Dsizei, const void*)
    510 
    511 DELEGATE_TO_GL_8(copyTexImage2D, CopyTexImage2D,
    512                  WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dint, WGC3Dint,
    513                  WGC3Dsizei, WGC3Dsizei, WGC3Dint)
    514 
    515 DELEGATE_TO_GL_8(copyTexSubImage2D, CopyTexSubImage2D,
    516                  WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint,
    517                  WGC3Dsizei, WGC3Dsizei)
    518 
    519 DELEGATE_TO_GL_1(cullFace, CullFace, WGC3Denum)
    520 
    521 DELEGATE_TO_GL_1(depthFunc, DepthFunc, WGC3Denum)
    522 
    523 DELEGATE_TO_GL_1(depthMask, DepthMask, WGC3Dboolean)
    524 
    525 DELEGATE_TO_GL_2(depthRange, DepthRangef, WGC3Dclampf, WGC3Dclampf)
    526 
    527 DELEGATE_TO_GL_2(detachShader, DetachShader, WebGLId, WebGLId)
    528 
    529 DELEGATE_TO_GL_1(disable, Disable, WGC3Denum)
    530 
    531 DELEGATE_TO_GL_1(disableVertexAttribArray, DisableVertexAttribArray,
    532                  WGC3Duint)
    533 
    534 DELEGATE_TO_GL_3(drawArrays, DrawArrays, WGC3Denum, WGC3Dint, WGC3Dsizei)
    535 
    536 void WebGraphicsContext3DInProcessCommandBufferImpl::drawElements(
    537     WGC3Denum mode,
    538     WGC3Dsizei count,
    539     WGC3Denum type,
    540     WGC3Dintptr offset) {
    541   ClearContext();
    542   gl_->DrawElements(
    543       mode, count, type,
    544       reinterpret_cast<void*>(static_cast<intptr_t>(offset)));
    545 }
    546 
    547 DELEGATE_TO_GL_1(enable, Enable, WGC3Denum)
    548 
    549 DELEGATE_TO_GL_1(enableVertexAttribArray, EnableVertexAttribArray,
    550                  WGC3Duint)
    551 
    552 void WebGraphicsContext3DInProcessCommandBufferImpl::finish() {
    553   flush_id_ = GenFlushID();
    554   gl_->Finish();
    555 }
    556 
    557 void WebGraphicsContext3DInProcessCommandBufferImpl::flush() {
    558   flush_id_ = GenFlushID();
    559   gl_->Flush();
    560 }
    561 
    562 DELEGATE_TO_GL_4(framebufferRenderbuffer, FramebufferRenderbuffer,
    563                  WGC3Denum, WGC3Denum, WGC3Denum, WebGLId)
    564 
    565 DELEGATE_TO_GL_5(framebufferTexture2D, FramebufferTexture2D,
    566                  WGC3Denum, WGC3Denum, WGC3Denum, WebGLId, WGC3Dint)
    567 
    568 DELEGATE_TO_GL_1(frontFace, FrontFace, WGC3Denum)
    569 
    570 DELEGATE_TO_GL_1(generateMipmap, GenerateMipmap, WGC3Denum)
    571 
    572 bool WebGraphicsContext3DInProcessCommandBufferImpl::getActiveAttrib(
    573     WebGLId program, WGC3Duint index, ActiveInfo& info) {
    574   ClearContext();
    575   if (!program) {
    576     synthesizeGLError(GL_INVALID_VALUE);
    577     return false;
    578   }
    579   GLint max_name_length = -1;
    580   gl_->GetProgramiv(
    581       program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_name_length);
    582   if (max_name_length < 0)
    583     return false;
    584   scoped_ptr<GLchar[]> name(new GLchar[max_name_length]);
    585   if (!name) {
    586     synthesizeGLError(GL_OUT_OF_MEMORY);
    587     return false;
    588   }
    589   GLsizei length = 0;
    590   GLint size = -1;
    591   GLenum type = 0;
    592   gl_->GetActiveAttrib(
    593       program, index, max_name_length, &length, &size, &type, name.get());
    594   if (size < 0) {
    595     return false;
    596   }
    597   info.name = blink::WebString::fromUTF8(name.get(), length);
    598   info.type = type;
    599   info.size = size;
    600   return true;
    601 }
    602 
    603 bool WebGraphicsContext3DInProcessCommandBufferImpl::getActiveUniform(
    604     WebGLId program, WGC3Duint index, ActiveInfo& info) {
    605   ClearContext();
    606   GLint max_name_length = -1;
    607   gl_->GetProgramiv(
    608       program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max_name_length);
    609   if (max_name_length < 0)
    610     return false;
    611   scoped_ptr<GLchar[]> name(new GLchar[max_name_length]);
    612   if (!name) {
    613     synthesizeGLError(GL_OUT_OF_MEMORY);
    614     return false;
    615   }
    616   GLsizei length = 0;
    617   GLint size = -1;
    618   GLenum type = 0;
    619   gl_->GetActiveUniform(
    620       program, index, max_name_length, &length, &size, &type, name.get());
    621   if (size < 0) {
    622     return false;
    623   }
    624   info.name = blink::WebString::fromUTF8(name.get(), length);
    625   info.type = type;
    626   info.size = size;
    627   return true;
    628 }
    629 
    630 DELEGATE_TO_GL_4(getAttachedShaders, GetAttachedShaders,
    631                  WebGLId, WGC3Dsizei, WGC3Dsizei*, WebGLId*)
    632 
    633 DELEGATE_TO_GL_2R(getAttribLocation, GetAttribLocation,
    634                   WebGLId, const WGC3Dchar*, WGC3Dint)
    635 
    636 DELEGATE_TO_GL_2(getBooleanv, GetBooleanv, WGC3Denum, WGC3Dboolean*)
    637 
    638 DELEGATE_TO_GL_3(getBufferParameteriv, GetBufferParameteriv,
    639                  WGC3Denum, WGC3Denum, WGC3Dint*)
    640 
    641 blink::WebGraphicsContext3D::Attributes
    642 WebGraphicsContext3DInProcessCommandBufferImpl::getContextAttributes() {
    643   return attributes_;
    644 }
    645 
    646 WGC3Denum WebGraphicsContext3DInProcessCommandBufferImpl::getError() {
    647   ClearContext();
    648   if (!synthetic_errors_.empty()) {
    649     std::vector<WGC3Denum>::iterator iter = synthetic_errors_.begin();
    650     WGC3Denum err = *iter;
    651     synthetic_errors_.erase(iter);
    652     return err;
    653   }
    654 
    655   return gl_->GetError();
    656 }
    657 
    658 bool WebGraphicsContext3DInProcessCommandBufferImpl::isContextLost() {
    659   return context_lost_reason_ != GL_NO_ERROR;
    660 }
    661 
    662 DELEGATE_TO_GL_2(getFloatv, GetFloatv, WGC3Denum, WGC3Dfloat*)
    663 
    664 DELEGATE_TO_GL_4(getFramebufferAttachmentParameteriv,
    665                  GetFramebufferAttachmentParameteriv,
    666                  WGC3Denum, WGC3Denum, WGC3Denum, WGC3Dint*)
    667 
    668 DELEGATE_TO_GL_2(getIntegerv, GetIntegerv, WGC3Denum, WGC3Dint*)
    669 
    670 DELEGATE_TO_GL_3(getProgramiv, GetProgramiv, WebGLId, WGC3Denum, WGC3Dint*)
    671 
    672 blink::WebString WebGraphicsContext3DInProcessCommandBufferImpl::
    673     getProgramInfoLog(WebGLId program) {
    674   ClearContext();
    675   GLint logLength = 0;
    676   gl_->GetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
    677   if (!logLength)
    678     return blink::WebString();
    679   scoped_ptr<GLchar[]> log(new GLchar[logLength]);
    680   if (!log)
    681     return blink::WebString();
    682   GLsizei returnedLogLength = 0;
    683   gl_->GetProgramInfoLog(
    684       program, logLength, &returnedLogLength, log.get());
    685   DCHECK_EQ(logLength, returnedLogLength + 1);
    686   blink::WebString res =
    687       blink::WebString::fromUTF8(log.get(), returnedLogLength);
    688   return res;
    689 }
    690 
    691 DELEGATE_TO_GL_3(getRenderbufferParameteriv, GetRenderbufferParameteriv,
    692                  WGC3Denum, WGC3Denum, WGC3Dint*)
    693 
    694 DELEGATE_TO_GL_3(getShaderiv, GetShaderiv, WebGLId, WGC3Denum, WGC3Dint*)
    695 
    696 blink::WebString WebGraphicsContext3DInProcessCommandBufferImpl::
    697     getShaderInfoLog(WebGLId shader) {
    698   ClearContext();
    699   GLint logLength = 0;
    700   gl_->GetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
    701   if (!logLength)
    702     return blink::WebString();
    703   scoped_ptr<GLchar[]> log(new GLchar[logLength]);
    704   if (!log)
    705     return blink::WebString();
    706   GLsizei returnedLogLength = 0;
    707   gl_->GetShaderInfoLog(
    708       shader, logLength, &returnedLogLength, log.get());
    709   DCHECK_EQ(logLength, returnedLogLength + 1);
    710   blink::WebString res =
    711       blink::WebString::fromUTF8(log.get(), returnedLogLength);
    712   return res;
    713 }
    714 
    715 DELEGATE_TO_GL_4(getShaderPrecisionFormat, GetShaderPrecisionFormat,
    716                  WGC3Denum, WGC3Denum, WGC3Dint*, WGC3Dint*)
    717 
    718 blink::WebString WebGraphicsContext3DInProcessCommandBufferImpl::
    719     getShaderSource(WebGLId shader) {
    720   ClearContext();
    721   GLint logLength = 0;
    722   gl_->GetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &logLength);
    723   if (!logLength)
    724     return blink::WebString();
    725   scoped_ptr<GLchar[]> log(new GLchar[logLength]);
    726   if (!log)
    727     return blink::WebString();
    728   GLsizei returnedLogLength = 0;
    729   gl_->GetShaderSource(
    730       shader, logLength, &returnedLogLength, log.get());
    731   if (!returnedLogLength)
    732     return blink::WebString();
    733   DCHECK_EQ(logLength, returnedLogLength + 1);
    734   blink::WebString res =
    735       blink::WebString::fromUTF8(log.get(), returnedLogLength);
    736   return res;
    737 }
    738 
    739 blink::WebString WebGraphicsContext3DInProcessCommandBufferImpl::
    740     getTranslatedShaderSourceANGLE(WebGLId shader) {
    741   ClearContext();
    742   GLint logLength = 0;
    743   gl_->GetShaderiv(
    744       shader, GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, &logLength);
    745   if (!logLength)
    746     return blink::WebString();
    747   scoped_ptr<GLchar[]> log(new GLchar[logLength]);
    748   if (!log)
    749     return blink::WebString();
    750   GLsizei returnedLogLength = 0;
    751   gl_->GetTranslatedShaderSourceANGLE(
    752       shader, logLength, &returnedLogLength, log.get());
    753   if (!returnedLogLength)
    754     return blink::WebString();
    755   DCHECK_EQ(logLength, returnedLogLength + 1);
    756   blink::WebString res =
    757       blink::WebString::fromUTF8(log.get(), returnedLogLength);
    758   return res;
    759 }
    760 
    761 blink::WebString WebGraphicsContext3DInProcessCommandBufferImpl::getString(
    762     WGC3Denum name) {
    763   ClearContext();
    764   return blink::WebString::fromUTF8(
    765       reinterpret_cast<const char*>(gl_->GetString(name)));
    766 }
    767 
    768 DELEGATE_TO_GL_3(getTexParameterfv, GetTexParameterfv,
    769                  WGC3Denum, WGC3Denum, WGC3Dfloat*)
    770 
    771 DELEGATE_TO_GL_3(getTexParameteriv, GetTexParameteriv,
    772                  WGC3Denum, WGC3Denum, WGC3Dint*)
    773 
    774 DELEGATE_TO_GL_3(getUniformfv, GetUniformfv, WebGLId, WGC3Dint, WGC3Dfloat*)
    775 
    776 DELEGATE_TO_GL_3(getUniformiv, GetUniformiv, WebGLId, WGC3Dint, WGC3Dint*)
    777 
    778 DELEGATE_TO_GL_2R(getUniformLocation, GetUniformLocation,
    779                   WebGLId, const WGC3Dchar*, WGC3Dint)
    780 
    781 DELEGATE_TO_GL_3(getVertexAttribfv, GetVertexAttribfv,
    782                  WGC3Duint, WGC3Denum, WGC3Dfloat*)
    783 
    784 DELEGATE_TO_GL_3(getVertexAttribiv, GetVertexAttribiv,
    785                  WGC3Duint, WGC3Denum, WGC3Dint*)
    786 
    787 WGC3Dsizeiptr WebGraphicsContext3DInProcessCommandBufferImpl::
    788     getVertexAttribOffset(WGC3Duint index, WGC3Denum pname) {
    789   ClearContext();
    790   GLvoid* value = NULL;
    791   // NOTE: If pname is ever a value that returns more then 1 element
    792   // this will corrupt memory.
    793   gl_->GetVertexAttribPointerv(index, pname, &value);
    794   return static_cast<WGC3Dsizeiptr>(reinterpret_cast<intptr_t>(value));
    795 }
    796 
    797 DELEGATE_TO_GL_2(hint, Hint, WGC3Denum, WGC3Denum)
    798 
    799 DELEGATE_TO_GL_1RB(isBuffer, IsBuffer, WebGLId, WGC3Dboolean)
    800 
    801 DELEGATE_TO_GL_1RB(isEnabled, IsEnabled, WGC3Denum, WGC3Dboolean)
    802 
    803 DELEGATE_TO_GL_1RB(isFramebuffer, IsFramebuffer, WebGLId, WGC3Dboolean)
    804 
    805 DELEGATE_TO_GL_1RB(isProgram, IsProgram, WebGLId, WGC3Dboolean)
    806 
    807 DELEGATE_TO_GL_1RB(isRenderbuffer, IsRenderbuffer, WebGLId, WGC3Dboolean)
    808 
    809 DELEGATE_TO_GL_1RB(isShader, IsShader, WebGLId, WGC3Dboolean)
    810 
    811 DELEGATE_TO_GL_1RB(isTexture, IsTexture, WebGLId, WGC3Dboolean)
    812 
    813 DELEGATE_TO_GL_1(lineWidth, LineWidth, WGC3Dfloat)
    814 
    815 DELEGATE_TO_GL_1(linkProgram, LinkProgram, WebGLId)
    816 
    817 DELEGATE_TO_GL_2(pixelStorei, PixelStorei, WGC3Denum, WGC3Dint)
    818 
    819 DELEGATE_TO_GL_2(polygonOffset, PolygonOffset, WGC3Dfloat, WGC3Dfloat)
    820 
    821 DELEGATE_TO_GL_7(readPixels, ReadPixels,
    822                  WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei, WGC3Denum,
    823                  WGC3Denum, void*)
    824 
    825 void WebGraphicsContext3DInProcessCommandBufferImpl::releaseShaderCompiler() {
    826   ClearContext();
    827 }
    828 
    829 DELEGATE_TO_GL_4(renderbufferStorage, RenderbufferStorage,
    830                  WGC3Denum, WGC3Denum, WGC3Dsizei, WGC3Dsizei)
    831 
    832 DELEGATE_TO_GL_2(sampleCoverage, SampleCoverage, WGC3Dfloat, WGC3Dboolean)
    833 
    834 DELEGATE_TO_GL_4(scissor, Scissor, WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei)
    835 
    836 void WebGraphicsContext3DInProcessCommandBufferImpl::shaderSource(
    837     WebGLId shader, const WGC3Dchar* string) {
    838   ClearContext();
    839   GLint length = strlen(string);
    840   gl_->ShaderSource(shader, 1, &string, &length);
    841 }
    842 
    843 DELEGATE_TO_GL_3(stencilFunc, StencilFunc, WGC3Denum, WGC3Dint, WGC3Duint)
    844 
    845 DELEGATE_TO_GL_4(stencilFuncSeparate, StencilFuncSeparate,
    846                  WGC3Denum, WGC3Denum, WGC3Dint, WGC3Duint)
    847 
    848 DELEGATE_TO_GL_1(stencilMask, StencilMask, WGC3Duint)
    849 
    850 DELEGATE_TO_GL_2(stencilMaskSeparate, StencilMaskSeparate,
    851                  WGC3Denum, WGC3Duint)
    852 
    853 DELEGATE_TO_GL_3(stencilOp, StencilOp,
    854                  WGC3Denum, WGC3Denum, WGC3Denum)
    855 
    856 DELEGATE_TO_GL_4(stencilOpSeparate, StencilOpSeparate,
    857                  WGC3Denum, WGC3Denum, WGC3Denum, WGC3Denum)
    858 
    859 DELEGATE_TO_GL_9(texImage2D, TexImage2D,
    860                  WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dsizei, WGC3Dsizei,
    861                  WGC3Dint, WGC3Denum, WGC3Denum, const void*)
    862 
    863 DELEGATE_TO_GL_3(texParameterf, TexParameterf,
    864                  WGC3Denum, WGC3Denum, WGC3Dfloat);
    865 
    866 static const unsigned int kTextureWrapR = 0x8072;
    867 
    868 void WebGraphicsContext3DInProcessCommandBufferImpl::texParameteri(
    869     WGC3Denum target, WGC3Denum pname, WGC3Dint param) {
    870   ClearContext();
    871   // TODO(kbr): figure out whether the setting of TEXTURE_WRAP_R in
    872   // GraphicsContext3D.cpp is strictly necessary to avoid seams at the
    873   // edge of cube maps, and, if it is, push it into the GLES2 service
    874   // side code.
    875   if (pname == kTextureWrapR) {
    876     return;
    877   }
    878   gl_->TexParameteri(target, pname, param);
    879 }
    880 
    881 DELEGATE_TO_GL_9(texSubImage2D, TexSubImage2D,
    882                  WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei,
    883                  WGC3Dsizei, WGC3Denum, WGC3Denum, const void*)
    884 
    885 DELEGATE_TO_GL_2(uniform1f, Uniform1f, WGC3Dint, WGC3Dfloat)
    886 
    887 DELEGATE_TO_GL_3(uniform1fv, Uniform1fv, WGC3Dint, WGC3Dsizei,
    888                  const WGC3Dfloat*)
    889 
    890 DELEGATE_TO_GL_2(uniform1i, Uniform1i, WGC3Dint, WGC3Dint)
    891 
    892 DELEGATE_TO_GL_3(uniform1iv, Uniform1iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
    893 
    894 DELEGATE_TO_GL_3(uniform2f, Uniform2f, WGC3Dint, WGC3Dfloat, WGC3Dfloat)
    895 
    896 DELEGATE_TO_GL_3(uniform2fv, Uniform2fv, WGC3Dint, WGC3Dsizei,
    897                  const WGC3Dfloat*)
    898 
    899 DELEGATE_TO_GL_3(uniform2i, Uniform2i, WGC3Dint, WGC3Dint, WGC3Dint)
    900 
    901 DELEGATE_TO_GL_3(uniform2iv, Uniform2iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
    902 
    903 DELEGATE_TO_GL_4(uniform3f, Uniform3f, WGC3Dint,
    904                  WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
    905 
    906 DELEGATE_TO_GL_3(uniform3fv, Uniform3fv, WGC3Dint, WGC3Dsizei,
    907                  const WGC3Dfloat*)
    908 
    909 DELEGATE_TO_GL_4(uniform3i, Uniform3i, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint)
    910 
    911 DELEGATE_TO_GL_3(uniform3iv, Uniform3iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
    912 
    913 DELEGATE_TO_GL_5(uniform4f, Uniform4f, WGC3Dint,
    914                  WGC3Dfloat, WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
    915 
    916 DELEGATE_TO_GL_3(uniform4fv, Uniform4fv, WGC3Dint, WGC3Dsizei,
    917                  const WGC3Dfloat*)
    918 
    919 DELEGATE_TO_GL_5(uniform4i, Uniform4i, WGC3Dint,
    920                  WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dint)
    921 
    922 DELEGATE_TO_GL_3(uniform4iv, Uniform4iv, WGC3Dint, WGC3Dsizei, const WGC3Dint*)
    923 
    924 DELEGATE_TO_GL_4(uniformMatrix2fv, UniformMatrix2fv,
    925                  WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*)
    926 
    927 DELEGATE_TO_GL_4(uniformMatrix3fv, UniformMatrix3fv,
    928                  WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*)
    929 
    930 DELEGATE_TO_GL_4(uniformMatrix4fv, UniformMatrix4fv,
    931                  WGC3Dint, WGC3Dsizei, WGC3Dboolean, const WGC3Dfloat*)
    932 
    933 DELEGATE_TO_GL_1(useProgram, UseProgram, WebGLId)
    934 
    935 DELEGATE_TO_GL_1(validateProgram, ValidateProgram, WebGLId)
    936 
    937 DELEGATE_TO_GL_2(vertexAttrib1f, VertexAttrib1f, WGC3Duint, WGC3Dfloat)
    938 
    939 DELEGATE_TO_GL_2(vertexAttrib1fv, VertexAttrib1fv, WGC3Duint,
    940                  const WGC3Dfloat*)
    941 
    942 DELEGATE_TO_GL_3(vertexAttrib2f, VertexAttrib2f, WGC3Duint,
    943                  WGC3Dfloat, WGC3Dfloat)
    944 
    945 DELEGATE_TO_GL_2(vertexAttrib2fv, VertexAttrib2fv, WGC3Duint,
    946                  const WGC3Dfloat*)
    947 
    948 DELEGATE_TO_GL_4(vertexAttrib3f, VertexAttrib3f, WGC3Duint,
    949                  WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
    950 
    951 DELEGATE_TO_GL_2(vertexAttrib3fv, VertexAttrib3fv, WGC3Duint,
    952                  const WGC3Dfloat*)
    953 
    954 DELEGATE_TO_GL_5(vertexAttrib4f, VertexAttrib4f, WGC3Duint,
    955                  WGC3Dfloat, WGC3Dfloat, WGC3Dfloat, WGC3Dfloat)
    956 
    957 DELEGATE_TO_GL_2(vertexAttrib4fv, VertexAttrib4fv, WGC3Duint,
    958                  const WGC3Dfloat*)
    959 
    960 void WebGraphicsContext3DInProcessCommandBufferImpl::vertexAttribPointer(
    961     WGC3Duint index, WGC3Dint size, WGC3Denum type, WGC3Dboolean normalized,
    962     WGC3Dsizei stride, WGC3Dintptr offset) {
    963   ClearContext();
    964   gl_->VertexAttribPointer(
    965       index, size, type, normalized, stride,
    966       reinterpret_cast<void*>(static_cast<intptr_t>(offset)));
    967 }
    968 
    969 DELEGATE_TO_GL_4(viewport, Viewport,
    970                  WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei)
    971 
    972 DELEGATE_TO_GL_2(genBuffers, GenBuffers, WGC3Dsizei, WebGLId*);
    973 
    974 DELEGATE_TO_GL_2(genFramebuffers, GenFramebuffers, WGC3Dsizei, WebGLId*);
    975 
    976 DELEGATE_TO_GL_2(genRenderbuffers, GenRenderbuffers, WGC3Dsizei, WebGLId*);
    977 
    978 DELEGATE_TO_GL_2(genTextures, GenTextures, WGC3Dsizei, WebGLId*);
    979 
    980 DELEGATE_TO_GL_2(deleteBuffers, DeleteBuffers, WGC3Dsizei, WebGLId*);
    981 
    982 DELEGATE_TO_GL_2(deleteFramebuffers, DeleteFramebuffers, WGC3Dsizei, WebGLId*);
    983 
    984 DELEGATE_TO_GL_2(deleteRenderbuffers, DeleteRenderbuffers, WGC3Dsizei,
    985                  WebGLId*);
    986 
    987 DELEGATE_TO_GL_2(deleteTextures, DeleteTextures, WGC3Dsizei, WebGLId*);
    988 
    989 WebGLId WebGraphicsContext3DInProcessCommandBufferImpl::createBuffer() {
    990   ClearContext();
    991   GLuint o;
    992   gl_->GenBuffers(1, &o);
    993   return o;
    994 }
    995 
    996 WebGLId WebGraphicsContext3DInProcessCommandBufferImpl::createFramebuffer() {
    997   ClearContext();
    998   GLuint o = 0;
    999   gl_->GenFramebuffers(1, &o);
   1000   return o;
   1001 }
   1002 
   1003 WebGLId WebGraphicsContext3DInProcessCommandBufferImpl::createRenderbuffer() {
   1004   ClearContext();
   1005   GLuint o;
   1006   gl_->GenRenderbuffers(1, &o);
   1007   return o;
   1008 }
   1009 
   1010 WebGLId WebGraphicsContext3DInProcessCommandBufferImpl::createTexture() {
   1011   ClearContext();
   1012   GLuint o;
   1013   gl_->GenTextures(1, &o);
   1014   return o;
   1015 }
   1016 
   1017 void WebGraphicsContext3DInProcessCommandBufferImpl::deleteBuffer(
   1018     WebGLId buffer) {
   1019   ClearContext();
   1020   gl_->DeleteBuffers(1, &buffer);
   1021 }
   1022 
   1023 void WebGraphicsContext3DInProcessCommandBufferImpl::deleteFramebuffer(
   1024     WebGLId framebuffer) {
   1025   ClearContext();
   1026   gl_->DeleteFramebuffers(1, &framebuffer);
   1027 }
   1028 
   1029 void WebGraphicsContext3DInProcessCommandBufferImpl::deleteRenderbuffer(
   1030     WebGLId renderbuffer) {
   1031   ClearContext();
   1032   gl_->DeleteRenderbuffers(1, &renderbuffer);
   1033 }
   1034 
   1035 void WebGraphicsContext3DInProcessCommandBufferImpl::deleteTexture(
   1036     WebGLId texture) {
   1037   ClearContext();
   1038   gl_->DeleteTextures(1, &texture);
   1039 }
   1040 
   1041 DELEGATE_TO_GL_R(createProgram, CreateProgram, WebGLId);
   1042 
   1043 DELEGATE_TO_GL_1R(createShader, CreateShader, WGC3Denum, WebGLId);
   1044 
   1045 DELEGATE_TO_GL_1(deleteProgram, DeleteProgram, WebGLId);
   1046 
   1047 DELEGATE_TO_GL_1(deleteShader, DeleteShader, WebGLId);
   1048 
   1049 void WebGraphicsContext3DInProcessCommandBufferImpl::setContextLostCallback(
   1050     WebGraphicsContext3D::WebGraphicsContextLostCallback* cb) {
   1051   context_lost_callback_ = cb;
   1052 }
   1053 
   1054 WGC3Denum WebGraphicsContext3DInProcessCommandBufferImpl::
   1055     getGraphicsResetStatusARB() {
   1056   return context_lost_reason_;
   1057 }
   1058 
   1059 DELEGATE_TO_GL_5(texImageIOSurface2DCHROMIUM, TexImageIOSurface2DCHROMIUM,
   1060                  WGC3Denum, WGC3Dint, WGC3Dint, WGC3Duint, WGC3Duint)
   1061 
   1062 DELEGATE_TO_GL_5(texStorage2DEXT, TexStorage2DEXT,
   1063                  WGC3Denum, WGC3Dint, WGC3Duint, WGC3Dint, WGC3Dint)
   1064 
   1065 WebGLId WebGraphicsContext3DInProcessCommandBufferImpl::createQueryEXT() {
   1066   GLuint o;
   1067   gl_->GenQueriesEXT(1, &o);
   1068   return o;
   1069 }
   1070 
   1071 void WebGraphicsContext3DInProcessCommandBufferImpl::
   1072     deleteQueryEXT(WebGLId query) {
   1073   gl_->DeleteQueriesEXT(1, &query);
   1074 }
   1075 
   1076 DELEGATE_TO_GL_1R(isQueryEXT, IsQueryEXT, WebGLId, WGC3Dboolean)
   1077 DELEGATE_TO_GL_2(beginQueryEXT, BeginQueryEXT, WGC3Denum, WebGLId)
   1078 DELEGATE_TO_GL_1(endQueryEXT, EndQueryEXT, WGC3Denum)
   1079 DELEGATE_TO_GL_3(getQueryivEXT, GetQueryivEXT, WGC3Denum, WGC3Denum, WGC3Dint*)
   1080 DELEGATE_TO_GL_3(getQueryObjectuivEXT, GetQueryObjectuivEXT,
   1081                  WebGLId, WGC3Denum, WGC3Duint*)
   1082 
   1083 DELEGATE_TO_GL_6(copyTextureCHROMIUM, CopyTextureCHROMIUM, WGC3Denum, WGC3Duint,
   1084                  WGC3Duint, WGC3Dint, WGC3Denum, WGC3Denum)
   1085 
   1086 void WebGraphicsContext3DInProcessCommandBufferImpl::insertEventMarkerEXT(
   1087     const WGC3Dchar* marker) {
   1088   gl_->InsertEventMarkerEXT(0, marker);
   1089 }
   1090 
   1091 void WebGraphicsContext3DInProcessCommandBufferImpl::pushGroupMarkerEXT(
   1092     const WGC3Dchar* marker) {
   1093   gl_->PushGroupMarkerEXT(0, marker);
   1094 }
   1095 
   1096 DELEGATE_TO_GL(popGroupMarkerEXT, PopGroupMarkerEXT);
   1097 
   1098 DELEGATE_TO_GL_2(bindTexImage2DCHROMIUM, BindTexImage2DCHROMIUM,
   1099                  WGC3Denum, WGC3Dint)
   1100 DELEGATE_TO_GL_2(releaseTexImage2DCHROMIUM, ReleaseTexImage2DCHROMIUM,
   1101                  WGC3Denum, WGC3Dint)
   1102 
   1103 DELEGATE_TO_GL_1R(createStreamTextureCHROMIUM, CreateStreamTextureCHROMIUM,
   1104                   WebGLId, WebGLId)
   1105 DELEGATE_TO_GL_1(destroyStreamTextureCHROMIUM, DestroyStreamTextureCHROMIUM,
   1106                  WebGLId)
   1107 
   1108 void* WebGraphicsContext3DInProcessCommandBufferImpl::mapBufferCHROMIUM(
   1109     WGC3Denum target, WGC3Denum access) {
   1110   ClearContext();
   1111   return gl_->MapBufferCHROMIUM(target, access);
   1112 }
   1113 
   1114 WGC3Dboolean WebGraphicsContext3DInProcessCommandBufferImpl::
   1115     unmapBufferCHROMIUM(WGC3Denum target) {
   1116   ClearContext();
   1117   return gl_->UnmapBufferCHROMIUM(target);
   1118 }
   1119 
   1120 GrGLInterface* WebGraphicsContext3DInProcessCommandBufferImpl::
   1121     createGrGLInterface() {
   1122   return skia_bindings::CreateCommandBufferSkiaGLBinding();
   1123 }
   1124 
   1125 ::gpu::gles2::GLES2Interface*
   1126 WebGraphicsContext3DInProcessCommandBufferImpl::GetGLInterface() {
   1127   return gl_;
   1128 }
   1129 
   1130 ::gpu::ContextSupport*
   1131 WebGraphicsContext3DInProcessCommandBufferImpl::GetContextSupport() {
   1132   return gl_;
   1133 }
   1134 
   1135 void WebGraphicsContext3DInProcessCommandBufferImpl::OnContextLost() {
   1136   // TODO(kbr): improve the precision here.
   1137   context_lost_reason_ = GL_UNKNOWN_CONTEXT_RESET_ARB;
   1138   if (context_lost_callback_) {
   1139     context_lost_callback_->onContextLost();
   1140   }
   1141 }
   1142 
   1143 DELEGATE_TO_GL_3R(createImageCHROMIUM, CreateImageCHROMIUM,
   1144                   WGC3Dsizei, WGC3Dsizei, WGC3Denum, WGC3Duint);
   1145 
   1146 DELEGATE_TO_GL_1(destroyImageCHROMIUM, DestroyImageCHROMIUM, WGC3Duint);
   1147 
   1148 DELEGATE_TO_GL_3(getImageParameterivCHROMIUM, GetImageParameterivCHROMIUM,
   1149                  WGC3Duint, WGC3Denum, GLint*);
   1150 
   1151 DELEGATE_TO_GL_2R(mapImageCHROMIUM, MapImageCHROMIUM,
   1152                   WGC3Duint, WGC3Denum, void*);
   1153 
   1154 DELEGATE_TO_GL_1(unmapImageCHROMIUM, UnmapImageCHROMIUM, WGC3Duint);
   1155 
   1156 DELEGATE_TO_GL_3(bindUniformLocationCHROMIUM, BindUniformLocationCHROMIUM,
   1157                  WebGLId, WGC3Dint, const WGC3Dchar*)
   1158 
   1159 void WebGraphicsContext3DInProcessCommandBufferImpl::shallowFlushCHROMIUM() {
   1160   flush_id_ = GenFlushID();
   1161   gl_->ShallowFlushCHROMIUM();
   1162 }
   1163 
   1164 void WebGraphicsContext3DInProcessCommandBufferImpl::shallowFinishCHROMIUM() {
   1165   flush_id_ = GenFlushID();
   1166   gl_->ShallowFinishCHROMIUM();
   1167 }
   1168 
   1169 DELEGATE_TO_GL_1(genMailboxCHROMIUM, GenMailboxCHROMIUM, WGC3Dbyte*)
   1170 DELEGATE_TO_GL_2(produceTextureCHROMIUM, ProduceTextureCHROMIUM,
   1171                  WGC3Denum, const WGC3Dbyte*)
   1172 DELEGATE_TO_GL_2(consumeTextureCHROMIUM, ConsumeTextureCHROMIUM,
   1173                  WGC3Denum, const WGC3Dbyte*)
   1174 
   1175 DELEGATE_TO_GL_2(drawBuffersEXT, DrawBuffersEXT,
   1176                  WGC3Dsizei, const WGC3Denum*)
   1177 
   1178 DELEGATE_TO_GL_R(insertSyncPoint, InsertSyncPointCHROMIUM, unsigned)
   1179 
   1180 void WebGraphicsContext3DInProcessCommandBufferImpl::loseContextCHROMIUM(
   1181     WGC3Denum current, WGC3Denum other) {
   1182   gl_->LoseContextCHROMIUM(current, other);
   1183   gl_->ShallowFlushCHROMIUM();
   1184 }
   1185 
   1186 DELEGATE_TO_GL_9(asyncTexImage2DCHROMIUM, AsyncTexImage2DCHROMIUM,
   1187     WGC3Denum, WGC3Dint, WGC3Denum, WGC3Dsizei, WGC3Dsizei, WGC3Dint,
   1188     WGC3Denum, WGC3Denum, const void*)
   1189 
   1190 DELEGATE_TO_GL_9(asyncTexSubImage2DCHROMIUM, AsyncTexSubImage2DCHROMIUM,
   1191     WGC3Denum, WGC3Dint, WGC3Dint, WGC3Dint, WGC3Dsizei, WGC3Dsizei,
   1192     WGC3Denum, WGC3Denum, const void*)
   1193 
   1194 DELEGATE_TO_GL_1(waitAsyncTexImage2DCHROMIUM, WaitAsyncTexImage2DCHROMIUM,
   1195     WGC3Denum)
   1196 
   1197 }  // namespace gpu
   1198 }  // namespace webkit
   1199