Home | History | Annotate | Download | only in client
      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 // This file is auto-generated from
      6 // gpu/command_buffer/build_gles2_cmd_buffer.py
      7 // DO NOT EDIT!
      8 
      9 // This file is included by gles2_implementation.cc to define the
     10 // GL api functions.
     11 #ifndef GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_
     12 #define GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_
     13 
     14 void GLES2Implementation::AttachShader(GLuint program, GLuint shader) {
     15   GPU_CLIENT_SINGLE_THREAD_CHECK();
     16   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glAttachShader(" << program << ", " << shader << ")");  // NOLINT
     17   helper_->AttachShader(program, shader);
     18   CheckGLError();
     19 }
     20 
     21 void GLES2Implementation::BindBuffer(GLenum target, GLuint buffer) {
     22   GPU_CLIENT_SINGLE_THREAD_CHECK();
     23   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindBuffer(" << GLES2Util::GetStringBufferTarget(target) << ", " << buffer << ")");  // NOLINT
     24   if (IsBufferReservedId(buffer)) {
     25     SetGLError(GL_INVALID_OPERATION, "BindBuffer", "buffer reserved id");
     26     return;
     27   }
     28   if (BindBufferHelper(target, buffer)) {
     29     helper_->BindBuffer(target, buffer);
     30   }
     31   CheckGLError();
     32 }
     33 
     34 void GLES2Implementation::BindFramebuffer(GLenum target, GLuint framebuffer) {
     35   GPU_CLIENT_SINGLE_THREAD_CHECK();
     36   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindFramebuffer(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << framebuffer << ")");  // NOLINT
     37   if (IsFramebufferReservedId(framebuffer)) {
     38     SetGLError(
     39         GL_INVALID_OPERATION, "BindFramebuffer", "framebuffer reserved id");
     40     return;
     41   }
     42   if (BindFramebufferHelper(target, framebuffer)) {
     43     helper_->BindFramebuffer(target, framebuffer);
     44   }
     45   CheckGLError();
     46 }
     47 
     48 void GLES2Implementation::BindRenderbuffer(
     49     GLenum target, GLuint renderbuffer) {
     50   GPU_CLIENT_SINGLE_THREAD_CHECK();
     51   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindRenderbuffer(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << renderbuffer << ")");  // NOLINT
     52   if (IsRenderbufferReservedId(renderbuffer)) {
     53     SetGLError(
     54         GL_INVALID_OPERATION, "BindRenderbuffer", "renderbuffer reserved id");
     55     return;
     56   }
     57   if (BindRenderbufferHelper(target, renderbuffer)) {
     58     helper_->BindRenderbuffer(target, renderbuffer);
     59   }
     60   CheckGLError();
     61 }
     62 
     63 void GLES2Implementation::BindTexture(GLenum target, GLuint texture) {
     64   GPU_CLIENT_SINGLE_THREAD_CHECK();
     65   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTexture(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << texture << ")");  // NOLINT
     66   if (IsTextureReservedId(texture)) {
     67     SetGLError(GL_INVALID_OPERATION, "BindTexture", "texture reserved id");
     68     return;
     69   }
     70   if (BindTextureHelper(target, texture)) {
     71     helper_->BindTexture(target, texture);
     72   }
     73   CheckGLError();
     74 }
     75 
     76 void GLES2Implementation::BlendColor(
     77     GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
     78   GPU_CLIENT_SINGLE_THREAD_CHECK();
     79   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendColor(" << red << ", " << green << ", " << blue << ", " << alpha << ")");  // NOLINT
     80   helper_->BlendColor(red, green, blue, alpha);
     81   CheckGLError();
     82 }
     83 
     84 void GLES2Implementation::BlendEquation(GLenum mode) {
     85   GPU_CLIENT_SINGLE_THREAD_CHECK();
     86   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendEquation(" << GLES2Util::GetStringEquation(mode) << ")");  // NOLINT
     87   helper_->BlendEquation(mode);
     88   CheckGLError();
     89 }
     90 
     91 void GLES2Implementation::BlendEquationSeparate(
     92     GLenum modeRGB, GLenum modeAlpha) {
     93   GPU_CLIENT_SINGLE_THREAD_CHECK();
     94   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendEquationSeparate(" << GLES2Util::GetStringEquation(modeRGB) << ", " << GLES2Util::GetStringEquation(modeAlpha) << ")");  // NOLINT
     95   helper_->BlendEquationSeparate(modeRGB, modeAlpha);
     96   CheckGLError();
     97 }
     98 
     99 void GLES2Implementation::BlendFunc(GLenum sfactor, GLenum dfactor) {
    100   GPU_CLIENT_SINGLE_THREAD_CHECK();
    101   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendFunc(" << GLES2Util::GetStringSrcBlendFactor(sfactor) << ", " << GLES2Util::GetStringDstBlendFactor(dfactor) << ")");  // NOLINT
    102   helper_->BlendFunc(sfactor, dfactor);
    103   CheckGLError();
    104 }
    105 
    106 void GLES2Implementation::BlendFuncSeparate(
    107     GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) {
    108   GPU_CLIENT_SINGLE_THREAD_CHECK();
    109   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendFuncSeparate(" << GLES2Util::GetStringSrcBlendFactor(srcRGB) << ", " << GLES2Util::GetStringDstBlendFactor(dstRGB) << ", " << GLES2Util::GetStringSrcBlendFactor(srcAlpha) << ", " << GLES2Util::GetStringDstBlendFactor(dstAlpha) << ")");  // NOLINT
    110   helper_->BlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
    111   CheckGLError();
    112 }
    113 
    114 GLenum GLES2Implementation::CheckFramebufferStatus(GLenum target) {
    115   GPU_CLIENT_SINGLE_THREAD_CHECK();
    116   TRACE_EVENT0("gpu", "GLES2Implementation::CheckFramebufferStatus");
    117   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCheckFramebufferStatus(" << GLES2Util::GetStringFrameBufferTarget(target) << ")");  // NOLINT
    118   typedef cmds::CheckFramebufferStatus::Result Result;
    119   Result* result = GetResultAs<Result*>();
    120   if (!result) {
    121     return GL_FRAMEBUFFER_UNSUPPORTED;
    122   }
    123   *result = 0;
    124   helper_->CheckFramebufferStatus(
    125       target, GetResultShmId(), GetResultShmOffset());
    126   WaitForCmd();
    127   GLenum result_value = *result;
    128   GPU_CLIENT_LOG("returned " << result_value);
    129   CheckGLError();
    130   return result_value;
    131 }
    132 
    133 void GLES2Implementation::Clear(GLbitfield mask) {
    134   GPU_CLIENT_SINGLE_THREAD_CHECK();
    135   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClear(" << mask << ")");
    136   helper_->Clear(mask);
    137   CheckGLError();
    138 }
    139 
    140 void GLES2Implementation::ClearColor(
    141     GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
    142   GPU_CLIENT_SINGLE_THREAD_CHECK();
    143   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearColor(" << red << ", " << green << ", " << blue << ", " << alpha << ")");  // NOLINT
    144   helper_->ClearColor(red, green, blue, alpha);
    145   CheckGLError();
    146 }
    147 
    148 void GLES2Implementation::ClearDepthf(GLclampf depth) {
    149   GPU_CLIENT_SINGLE_THREAD_CHECK();
    150   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearDepthf(" << depth << ")");
    151   helper_->ClearDepthf(depth);
    152   CheckGLError();
    153 }
    154 
    155 void GLES2Implementation::ClearStencil(GLint s) {
    156   GPU_CLIENT_SINGLE_THREAD_CHECK();
    157   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearStencil(" << s << ")");
    158   helper_->ClearStencil(s);
    159   CheckGLError();
    160 }
    161 
    162 void GLES2Implementation::ColorMask(
    163     GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) {
    164   GPU_CLIENT_SINGLE_THREAD_CHECK();
    165   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glColorMask(" << GLES2Util::GetStringBool(red) << ", " << GLES2Util::GetStringBool(green) << ", " << GLES2Util::GetStringBool(blue) << ", " << GLES2Util::GetStringBool(alpha) << ")");  // NOLINT
    166   helper_->ColorMask(red, green, blue, alpha);
    167   CheckGLError();
    168 }
    169 
    170 void GLES2Implementation::CompileShader(GLuint shader) {
    171   GPU_CLIENT_SINGLE_THREAD_CHECK();
    172   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCompileShader(" << shader << ")");  // NOLINT
    173   helper_->CompileShader(shader);
    174   CheckGLError();
    175 }
    176 
    177 void GLES2Implementation::CopyTexImage2D(
    178     GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,
    179     GLsizei width, GLsizei height, GLint border) {
    180   GPU_CLIENT_SINGLE_THREAD_CHECK();
    181   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTexImage2D(" << GLES2Util::GetStringTextureTarget(target) << ", " << level << ", " << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", " << x << ", " << y << ", " << width << ", " << height << ", " << border << ")");  // NOLINT
    182   if (width < 0) {
    183     SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "width < 0");
    184     return;
    185   }
    186   if (height < 0) {
    187     SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "height < 0");
    188     return;
    189   }
    190   helper_->CopyTexImage2D(
    191       target, level, internalformat, x, y, width, height, border);
    192   CheckGLError();
    193 }
    194 
    195 void GLES2Implementation::CopyTexSubImage2D(
    196     GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y,
    197     GLsizei width, GLsizei height) {
    198   GPU_CLIENT_SINGLE_THREAD_CHECK();
    199   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTexSubImage2D(" << GLES2Util::GetStringTextureTarget(target) << ", " << level << ", " << xoffset << ", " << yoffset << ", " << x << ", " << y << ", " << width << ", " << height << ")");  // NOLINT
    200   if (width < 0) {
    201     SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D", "width < 0");
    202     return;
    203   }
    204   if (height < 0) {
    205     SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D", "height < 0");
    206     return;
    207   }
    208   helper_->CopyTexSubImage2D(
    209       target, level, xoffset, yoffset, x, y, width, height);
    210   CheckGLError();
    211 }
    212 
    213 GLuint GLES2Implementation::CreateProgram() {
    214   GPU_CLIENT_SINGLE_THREAD_CHECK();
    215   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateProgram(" << ")");
    216   GLuint client_id;
    217   GetIdHandler(id_namespaces::kProgramsAndShaders)->
    218       MakeIds(this, 0, 1, &client_id);
    219   helper_->CreateProgram(client_id);
    220   GPU_CLIENT_LOG("returned " << client_id);
    221   CheckGLError();
    222   return client_id;
    223 }
    224 
    225 GLuint GLES2Implementation::CreateShader(GLenum type) {
    226   GPU_CLIENT_SINGLE_THREAD_CHECK();
    227   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateShader(" << GLES2Util::GetStringShaderType(type) << ")");  // NOLINT
    228   GLuint client_id;
    229   GetIdHandler(id_namespaces::kProgramsAndShaders)->
    230       MakeIds(this, 0, 1, &client_id);
    231   helper_->CreateShader(type, client_id);
    232   GPU_CLIENT_LOG("returned " << client_id);
    233   CheckGLError();
    234   return client_id;
    235 }
    236 
    237 void GLES2Implementation::CullFace(GLenum mode) {
    238   GPU_CLIENT_SINGLE_THREAD_CHECK();
    239   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCullFace(" << GLES2Util::GetStringFaceType(mode) << ")");  // NOLINT
    240   helper_->CullFace(mode);
    241   CheckGLError();
    242 }
    243 
    244 void GLES2Implementation::DeleteBuffers(GLsizei n, const GLuint* buffers) {
    245   GPU_CLIENT_SINGLE_THREAD_CHECK();
    246   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteBuffers(" << n << ", " << static_cast<const void*>(buffers) << ")");  // NOLINT
    247   GPU_CLIENT_LOG_CODE_BLOCK({
    248     for (GLsizei i = 0; i < n; ++i) {
    249       GPU_CLIENT_LOG("  " << i << ": " << buffers[i]);
    250     }
    251   });
    252   GPU_CLIENT_DCHECK_CODE_BLOCK({
    253     for (GLsizei i = 0; i < n; ++i) {
    254       GPU_DCHECK(buffers[i] != 0);
    255     }
    256   });
    257   if (n < 0) {
    258     SetGLError(GL_INVALID_VALUE, "glDeleteBuffers", "n < 0");
    259     return;
    260   }
    261   DeleteBuffersHelper(n, buffers);
    262   CheckGLError();
    263 }
    264 
    265 void GLES2Implementation::DeleteFramebuffers(
    266     GLsizei n, const GLuint* framebuffers) {
    267   GPU_CLIENT_SINGLE_THREAD_CHECK();
    268   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteFramebuffers(" << n << ", " << static_cast<const void*>(framebuffers) << ")");  // NOLINT
    269   GPU_CLIENT_LOG_CODE_BLOCK({
    270     for (GLsizei i = 0; i < n; ++i) {
    271       GPU_CLIENT_LOG("  " << i << ": " << framebuffers[i]);
    272     }
    273   });
    274   GPU_CLIENT_DCHECK_CODE_BLOCK({
    275     for (GLsizei i = 0; i < n; ++i) {
    276       GPU_DCHECK(framebuffers[i] != 0);
    277     }
    278   });
    279   if (n < 0) {
    280     SetGLError(GL_INVALID_VALUE, "glDeleteFramebuffers", "n < 0");
    281     return;
    282   }
    283   DeleteFramebuffersHelper(n, framebuffers);
    284   CheckGLError();
    285 }
    286 
    287 void GLES2Implementation::DeleteProgram(GLuint program) {
    288   GPU_CLIENT_SINGLE_THREAD_CHECK();
    289   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteProgram(" << program << ")");  // NOLINT
    290   GPU_CLIENT_DCHECK(program != 0);
    291   DeleteProgramHelper(program);
    292   CheckGLError();
    293 }
    294 
    295 void GLES2Implementation::DeleteRenderbuffers(
    296     GLsizei n, const GLuint* renderbuffers) {
    297   GPU_CLIENT_SINGLE_THREAD_CHECK();
    298   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteRenderbuffers(" << n << ", " << static_cast<const void*>(renderbuffers) << ")");  // NOLINT
    299   GPU_CLIENT_LOG_CODE_BLOCK({
    300     for (GLsizei i = 0; i < n; ++i) {
    301       GPU_CLIENT_LOG("  " << i << ": " << renderbuffers[i]);
    302     }
    303   });
    304   GPU_CLIENT_DCHECK_CODE_BLOCK({
    305     for (GLsizei i = 0; i < n; ++i) {
    306       GPU_DCHECK(renderbuffers[i] != 0);
    307     }
    308   });
    309   if (n < 0) {
    310     SetGLError(GL_INVALID_VALUE, "glDeleteRenderbuffers", "n < 0");
    311     return;
    312   }
    313   DeleteRenderbuffersHelper(n, renderbuffers);
    314   CheckGLError();
    315 }
    316 
    317 void GLES2Implementation::DeleteShader(GLuint shader) {
    318   GPU_CLIENT_SINGLE_THREAD_CHECK();
    319   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteShader(" << shader << ")");
    320   GPU_CLIENT_DCHECK(shader != 0);
    321   DeleteShaderHelper(shader);
    322   CheckGLError();
    323 }
    324 
    325 void GLES2Implementation::DeleteTextures(GLsizei n, const GLuint* textures) {
    326   GPU_CLIENT_SINGLE_THREAD_CHECK();
    327   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteTextures(" << n << ", " << static_cast<const void*>(textures) << ")");  // NOLINT
    328   GPU_CLIENT_LOG_CODE_BLOCK({
    329     for (GLsizei i = 0; i < n; ++i) {
    330       GPU_CLIENT_LOG("  " << i << ": " << textures[i]);
    331     }
    332   });
    333   GPU_CLIENT_DCHECK_CODE_BLOCK({
    334     for (GLsizei i = 0; i < n; ++i) {
    335       GPU_DCHECK(textures[i] != 0);
    336     }
    337   });
    338   if (n < 0) {
    339     SetGLError(GL_INVALID_VALUE, "glDeleteTextures", "n < 0");
    340     return;
    341   }
    342   DeleteTexturesHelper(n, textures);
    343   CheckGLError();
    344 }
    345 
    346 void GLES2Implementation::DepthFunc(GLenum func) {
    347   GPU_CLIENT_SINGLE_THREAD_CHECK();
    348   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthFunc(" << GLES2Util::GetStringCmpFunction(func) << ")");  // NOLINT
    349   helper_->DepthFunc(func);
    350   CheckGLError();
    351 }
    352 
    353 void GLES2Implementation::DepthMask(GLboolean flag) {
    354   GPU_CLIENT_SINGLE_THREAD_CHECK();
    355   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthMask(" << GLES2Util::GetStringBool(flag) << ")");  // NOLINT
    356   helper_->DepthMask(flag);
    357   CheckGLError();
    358 }
    359 
    360 void GLES2Implementation::DepthRangef(GLclampf zNear, GLclampf zFar) {
    361   GPU_CLIENT_SINGLE_THREAD_CHECK();
    362   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthRangef(" << zNear << ", " << zFar << ")");  // NOLINT
    363   helper_->DepthRangef(zNear, zFar);
    364   CheckGLError();
    365 }
    366 
    367 void GLES2Implementation::DetachShader(GLuint program, GLuint shader) {
    368   GPU_CLIENT_SINGLE_THREAD_CHECK();
    369   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDetachShader(" << program << ", " << shader << ")");  // NOLINT
    370   helper_->DetachShader(program, shader);
    371   CheckGLError();
    372 }
    373 
    374 void GLES2Implementation::FramebufferRenderbuffer(
    375     GLenum target, GLenum attachment, GLenum renderbuffertarget,
    376     GLuint renderbuffer) {
    377   GPU_CLIENT_SINGLE_THREAD_CHECK();
    378   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferRenderbuffer(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringRenderBufferTarget(renderbuffertarget) << ", " << renderbuffer << ")");  // NOLINT
    379   helper_->FramebufferRenderbuffer(
    380       target, attachment, renderbuffertarget, renderbuffer);
    381   CheckGLError();
    382 }
    383 
    384 void GLES2Implementation::FramebufferTexture2D(
    385     GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
    386     GLint level) {
    387   GPU_CLIENT_SINGLE_THREAD_CHECK();
    388   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferTexture2D(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringTextureTarget(textarget) << ", " << texture << ", " << level << ")");  // NOLINT
    389   helper_->FramebufferTexture2D(target, attachment, textarget, texture, level);
    390   CheckGLError();
    391 }
    392 
    393 void GLES2Implementation::FrontFace(GLenum mode) {
    394   GPU_CLIENT_SINGLE_THREAD_CHECK();
    395   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFrontFace(" << GLES2Util::GetStringFaceMode(mode) << ")");  // NOLINT
    396   helper_->FrontFace(mode);
    397   CheckGLError();
    398 }
    399 
    400 void GLES2Implementation::GenBuffers(GLsizei n, GLuint* buffers) {
    401   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenBuffers(" << n << ", " << static_cast<const void*>(buffers) << ")");  // NOLINT
    402   if (n < 0) {
    403     SetGLError(GL_INVALID_VALUE, "glGenBuffers", "n < 0");
    404     return;
    405   }
    406   GPU_CLIENT_SINGLE_THREAD_CHECK();
    407   GetIdHandler(id_namespaces::kBuffers)->
    408       MakeIds(this, 0, n, buffers);
    409   GenBuffersHelper(n, buffers);
    410   helper_->GenBuffersImmediate(n, buffers);
    411   helper_->CommandBufferHelper::Flush();
    412   GPU_CLIENT_LOG_CODE_BLOCK({
    413     for (GLsizei i = 0; i < n; ++i) {
    414       GPU_CLIENT_LOG("  " << i << ": " << buffers[i]);
    415     }
    416   });
    417   CheckGLError();
    418 }
    419 
    420 void GLES2Implementation::GenerateMipmap(GLenum target) {
    421   GPU_CLIENT_SINGLE_THREAD_CHECK();
    422   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenerateMipmap(" << GLES2Util::GetStringTextureBindTarget(target) << ")");  // NOLINT
    423   helper_->GenerateMipmap(target);
    424   CheckGLError();
    425 }
    426 
    427 void GLES2Implementation::GenFramebuffers(GLsizei n, GLuint* framebuffers) {
    428   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenFramebuffers(" << n << ", " << static_cast<const void*>(framebuffers) << ")");  // NOLINT
    429   if (n < 0) {
    430     SetGLError(GL_INVALID_VALUE, "glGenFramebuffers", "n < 0");
    431     return;
    432   }
    433   GPU_CLIENT_SINGLE_THREAD_CHECK();
    434   GetIdHandler(id_namespaces::kFramebuffers)->
    435       MakeIds(this, 0, n, framebuffers);
    436   GenFramebuffersHelper(n, framebuffers);
    437   helper_->GenFramebuffersImmediate(n, framebuffers);
    438   helper_->CommandBufferHelper::Flush();
    439   GPU_CLIENT_LOG_CODE_BLOCK({
    440     for (GLsizei i = 0; i < n; ++i) {
    441       GPU_CLIENT_LOG("  " << i << ": " << framebuffers[i]);
    442     }
    443   });
    444   CheckGLError();
    445 }
    446 
    447 void GLES2Implementation::GenRenderbuffers(GLsizei n, GLuint* renderbuffers) {
    448   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenRenderbuffers(" << n << ", " << static_cast<const void*>(renderbuffers) << ")");  // NOLINT
    449   if (n < 0) {
    450     SetGLError(GL_INVALID_VALUE, "glGenRenderbuffers", "n < 0");
    451     return;
    452   }
    453   GPU_CLIENT_SINGLE_THREAD_CHECK();
    454   GetIdHandler(id_namespaces::kRenderbuffers)->
    455       MakeIds(this, 0, n, renderbuffers);
    456   GenRenderbuffersHelper(n, renderbuffers);
    457   helper_->GenRenderbuffersImmediate(n, renderbuffers);
    458   helper_->CommandBufferHelper::Flush();
    459   GPU_CLIENT_LOG_CODE_BLOCK({
    460     for (GLsizei i = 0; i < n; ++i) {
    461       GPU_CLIENT_LOG("  " << i << ": " << renderbuffers[i]);
    462     }
    463   });
    464   CheckGLError();
    465 }
    466 
    467 void GLES2Implementation::GenTextures(GLsizei n, GLuint* textures) {
    468   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenTextures(" << n << ", " << static_cast<const void*>(textures) << ")");  // NOLINT
    469   if (n < 0) {
    470     SetGLError(GL_INVALID_VALUE, "glGenTextures", "n < 0");
    471     return;
    472   }
    473   GPU_CLIENT_SINGLE_THREAD_CHECK();
    474   GetIdHandler(id_namespaces::kTextures)->
    475       MakeIds(this, 0, n, textures);
    476   GenTexturesHelper(n, textures);
    477   helper_->GenTexturesImmediate(n, textures);
    478   helper_->CommandBufferHelper::Flush();
    479   GPU_CLIENT_LOG_CODE_BLOCK({
    480     for (GLsizei i = 0; i < n; ++i) {
    481       GPU_CLIENT_LOG("  " << i << ": " << textures[i]);
    482     }
    483   });
    484   CheckGLError();
    485 }
    486 
    487 void GLES2Implementation::GetBooleanv(GLenum pname, GLboolean* params) {
    488   GPU_CLIENT_SINGLE_THREAD_CHECK();
    489   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLboolean, params);
    490   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetBooleanv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
    491   TRACE_EVENT0("gpu", "GLES2Implementation::GetBooleanv");
    492   if (GetBooleanvHelper(pname, params)) {
    493     return;
    494   }
    495   typedef cmds::GetBooleanv::Result Result;
    496   Result* result = GetResultAs<Result*>();
    497   if (!result) {
    498     return;
    499   }
    500   result->SetNumResults(0);
    501   helper_->GetBooleanv(pname,
    502       GetResultShmId(), GetResultShmOffset());
    503   WaitForCmd();
    504   result->CopyResult(params);
    505   GPU_CLIENT_LOG_CODE_BLOCK({
    506     for (int32 i = 0; i < result->GetNumResults(); ++i) {
    507       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
    508     }
    509   });
    510   CheckGLError();
    511 }
    512 void GLES2Implementation::GetBufferParameteriv(
    513     GLenum target, GLenum pname, GLint* params) {
    514   GPU_CLIENT_SINGLE_THREAD_CHECK();
    515   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
    516   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetBufferParameteriv(" << GLES2Util::GetStringBufferTarget(target) << ", " << GLES2Util::GetStringBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
    517   TRACE_EVENT0("gpu", "GLES2Implementation::GetBufferParameteriv");
    518   if (GetBufferParameterivHelper(target, pname, params)) {
    519     return;
    520   }
    521   typedef cmds::GetBufferParameteriv::Result Result;
    522   Result* result = GetResultAs<Result*>();
    523   if (!result) {
    524     return;
    525   }
    526   result->SetNumResults(0);
    527   helper_->GetBufferParameteriv(target, pname,
    528       GetResultShmId(), GetResultShmOffset());
    529   WaitForCmd();
    530   result->CopyResult(params);
    531   GPU_CLIENT_LOG_CODE_BLOCK({
    532     for (int32 i = 0; i < result->GetNumResults(); ++i) {
    533       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
    534     }
    535   });
    536   CheckGLError();
    537 }
    538 void GLES2Implementation::GetFloatv(GLenum pname, GLfloat* params) {
    539   GPU_CLIENT_SINGLE_THREAD_CHECK();
    540   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetFloatv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
    541   TRACE_EVENT0("gpu", "GLES2Implementation::GetFloatv");
    542   if (GetFloatvHelper(pname, params)) {
    543     return;
    544   }
    545   typedef cmds::GetFloatv::Result Result;
    546   Result* result = GetResultAs<Result*>();
    547   if (!result) {
    548     return;
    549   }
    550   result->SetNumResults(0);
    551   helper_->GetFloatv(pname,
    552       GetResultShmId(), GetResultShmOffset());
    553   WaitForCmd();
    554   result->CopyResult(params);
    555   GPU_CLIENT_LOG_CODE_BLOCK({
    556     for (int32 i = 0; i < result->GetNumResults(); ++i) {
    557       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
    558     }
    559   });
    560   CheckGLError();
    561 }
    562 void GLES2Implementation::GetFramebufferAttachmentParameteriv(
    563     GLenum target, GLenum attachment, GLenum pname, GLint* params) {
    564   GPU_CLIENT_SINGLE_THREAD_CHECK();
    565   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
    566   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetFramebufferAttachmentParameteriv(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringFrameBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
    567   TRACE_EVENT0("gpu", "GLES2Implementation::GetFramebufferAttachmentParameteriv");  // NOLINT
    568   if (GetFramebufferAttachmentParameterivHelper(
    569       target, attachment, pname, params)) {
    570     return;
    571   }
    572   typedef cmds::GetFramebufferAttachmentParameteriv::Result Result;
    573   Result* result = GetResultAs<Result*>();
    574   if (!result) {
    575     return;
    576   }
    577   result->SetNumResults(0);
    578   helper_->GetFramebufferAttachmentParameteriv(target, attachment, pname,
    579       GetResultShmId(), GetResultShmOffset());
    580   WaitForCmd();
    581   result->CopyResult(params);
    582   GPU_CLIENT_LOG_CODE_BLOCK({
    583     for (int32 i = 0; i < result->GetNumResults(); ++i) {
    584       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
    585     }
    586   });
    587   CheckGLError();
    588 }
    589 void GLES2Implementation::GetIntegerv(GLenum pname, GLint* params) {
    590   GPU_CLIENT_SINGLE_THREAD_CHECK();
    591   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
    592   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetIntegerv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
    593   TRACE_EVENT0("gpu", "GLES2Implementation::GetIntegerv");
    594   if (GetIntegervHelper(pname, params)) {
    595     return;
    596   }
    597   typedef cmds::GetIntegerv::Result Result;
    598   Result* result = GetResultAs<Result*>();
    599   if (!result) {
    600     return;
    601   }
    602   result->SetNumResults(0);
    603   helper_->GetIntegerv(pname,
    604       GetResultShmId(), GetResultShmOffset());
    605   WaitForCmd();
    606   result->CopyResult(params);
    607   GPU_CLIENT_LOG_CODE_BLOCK({
    608     for (int32 i = 0; i < result->GetNumResults(); ++i) {
    609       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
    610     }
    611   });
    612   CheckGLError();
    613 }
    614 void GLES2Implementation::GetProgramiv(
    615     GLuint program, GLenum pname, GLint* params) {
    616   GPU_CLIENT_SINGLE_THREAD_CHECK();
    617   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
    618   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetProgramiv(" << program << ", " << GLES2Util::GetStringProgramParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
    619   TRACE_EVENT0("gpu", "GLES2Implementation::GetProgramiv");
    620   if (GetProgramivHelper(program, pname, params)) {
    621     return;
    622   }
    623   typedef cmds::GetProgramiv::Result Result;
    624   Result* result = GetResultAs<Result*>();
    625   if (!result) {
    626     return;
    627   }
    628   result->SetNumResults(0);
    629   helper_->GetProgramiv(program, pname,
    630       GetResultShmId(), GetResultShmOffset());
    631   WaitForCmd();
    632   result->CopyResult(params);
    633   GPU_CLIENT_LOG_CODE_BLOCK({
    634     for (int32 i = 0; i < result->GetNumResults(); ++i) {
    635       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
    636     }
    637   });
    638   CheckGLError();
    639 }
    640 void GLES2Implementation::GetProgramInfoLog(
    641     GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) {
    642   GPU_CLIENT_SINGLE_THREAD_CHECK();
    643   GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length);
    644   GPU_CLIENT_LOG("[" << GetLogPrefix()
    645       << "] glGetProgramInfoLog" << "("
    646       << program << ", "
    647       << bufsize << ", "
    648       << static_cast<void*>(length) << ", "
    649       << static_cast<void*>(infolog) << ")");
    650   helper_->SetBucketSize(kResultBucketId, 0);
    651   helper_->GetProgramInfoLog(program, kResultBucketId);
    652   std::string str;
    653   GLsizei max_size = 0;
    654   if (GetBucketAsString(kResultBucketId, &str)) {
    655     if (bufsize > 0) {
    656       max_size =
    657           std::min(static_cast<size_t>(bufsize) - 1, str.size());
    658       memcpy(infolog, str.c_str(), max_size);
    659       infolog[max_size] = '\0';
    660       GPU_CLIENT_LOG("------\n" << infolog << "\n------");
    661     }
    662   }
    663   if (length != NULL) {
    664     *length = max_size;
    665   }
    666   CheckGLError();
    667 }
    668 void GLES2Implementation::GetRenderbufferParameteriv(
    669     GLenum target, GLenum pname, GLint* params) {
    670   GPU_CLIENT_SINGLE_THREAD_CHECK();
    671   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
    672   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetRenderbufferParameteriv(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << GLES2Util::GetStringRenderBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
    673   TRACE_EVENT0("gpu", "GLES2Implementation::GetRenderbufferParameteriv");
    674   if (GetRenderbufferParameterivHelper(target, pname, params)) {
    675     return;
    676   }
    677   typedef cmds::GetRenderbufferParameteriv::Result Result;
    678   Result* result = GetResultAs<Result*>();
    679   if (!result) {
    680     return;
    681   }
    682   result->SetNumResults(0);
    683   helper_->GetRenderbufferParameteriv(target, pname,
    684       GetResultShmId(), GetResultShmOffset());
    685   WaitForCmd();
    686   result->CopyResult(params);
    687   GPU_CLIENT_LOG_CODE_BLOCK({
    688     for (int32 i = 0; i < result->GetNumResults(); ++i) {
    689       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
    690     }
    691   });
    692   CheckGLError();
    693 }
    694 void GLES2Implementation::GetShaderiv(
    695     GLuint shader, GLenum pname, GLint* params) {
    696   GPU_CLIENT_SINGLE_THREAD_CHECK();
    697   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
    698   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetShaderiv(" << shader << ", " << GLES2Util::GetStringShaderParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
    699   TRACE_EVENT0("gpu", "GLES2Implementation::GetShaderiv");
    700   if (GetShaderivHelper(shader, pname, params)) {
    701     return;
    702   }
    703   typedef cmds::GetShaderiv::Result Result;
    704   Result* result = GetResultAs<Result*>();
    705   if (!result) {
    706     return;
    707   }
    708   result->SetNumResults(0);
    709   helper_->GetShaderiv(shader, pname,
    710       GetResultShmId(), GetResultShmOffset());
    711   WaitForCmd();
    712   result->CopyResult(params);
    713   GPU_CLIENT_LOG_CODE_BLOCK({
    714     for (int32 i = 0; i < result->GetNumResults(); ++i) {
    715       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
    716     }
    717   });
    718   CheckGLError();
    719 }
    720 void GLES2Implementation::GetShaderInfoLog(
    721     GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) {
    722   GPU_CLIENT_SINGLE_THREAD_CHECK();
    723   GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length);
    724   GPU_CLIENT_LOG("[" << GetLogPrefix()
    725       << "] glGetShaderInfoLog" << "("
    726       << shader << ", "
    727       << bufsize << ", "
    728       << static_cast<void*>(length) << ", "
    729       << static_cast<void*>(infolog) << ")");
    730   helper_->SetBucketSize(kResultBucketId, 0);
    731   helper_->GetShaderInfoLog(shader, kResultBucketId);
    732   std::string str;
    733   GLsizei max_size = 0;
    734   if (GetBucketAsString(kResultBucketId, &str)) {
    735     if (bufsize > 0) {
    736       max_size =
    737           std::min(static_cast<size_t>(bufsize) - 1, str.size());
    738       memcpy(infolog, str.c_str(), max_size);
    739       infolog[max_size] = '\0';
    740       GPU_CLIENT_LOG("------\n" << infolog << "\n------");
    741     }
    742   }
    743   if (length != NULL) {
    744     *length = max_size;
    745   }
    746   CheckGLError();
    747 }
    748 void GLES2Implementation::GetShaderSource(
    749     GLuint shader, GLsizei bufsize, GLsizei* length, char* source) {
    750   GPU_CLIENT_SINGLE_THREAD_CHECK();
    751   GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length);
    752   GPU_CLIENT_LOG("[" << GetLogPrefix()
    753       << "] glGetShaderSource" << "("
    754       << shader << ", "
    755       << bufsize << ", "
    756       << static_cast<void*>(length) << ", "
    757       << static_cast<void*>(source) << ")");
    758   helper_->SetBucketSize(kResultBucketId, 0);
    759   helper_->GetShaderSource(shader, kResultBucketId);
    760   std::string str;
    761   GLsizei max_size = 0;
    762   if (GetBucketAsString(kResultBucketId, &str)) {
    763     if (bufsize > 0) {
    764       max_size =
    765           std::min(static_cast<size_t>(bufsize) - 1, str.size());
    766       memcpy(source, str.c_str(), max_size);
    767       source[max_size] = '\0';
    768       GPU_CLIENT_LOG("------\n" << source << "\n------");
    769     }
    770   }
    771   if (length != NULL) {
    772     *length = max_size;
    773   }
    774   CheckGLError();
    775 }
    776 void GLES2Implementation::GetTexParameterfv(
    777     GLenum target, GLenum pname, GLfloat* params) {
    778   GPU_CLIENT_SINGLE_THREAD_CHECK();
    779   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTexParameterfv(" << GLES2Util::GetStringGetTexParamTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
    780   TRACE_EVENT0("gpu", "GLES2Implementation::GetTexParameterfv");
    781   if (GetTexParameterfvHelper(target, pname, params)) {
    782     return;
    783   }
    784   typedef cmds::GetTexParameterfv::Result Result;
    785   Result* result = GetResultAs<Result*>();
    786   if (!result) {
    787     return;
    788   }
    789   result->SetNumResults(0);
    790   helper_->GetTexParameterfv(target, pname,
    791       GetResultShmId(), GetResultShmOffset());
    792   WaitForCmd();
    793   result->CopyResult(params);
    794   GPU_CLIENT_LOG_CODE_BLOCK({
    795     for (int32 i = 0; i < result->GetNumResults(); ++i) {
    796       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
    797     }
    798   });
    799   CheckGLError();
    800 }
    801 void GLES2Implementation::GetTexParameteriv(
    802     GLenum target, GLenum pname, GLint* params) {
    803   GPU_CLIENT_SINGLE_THREAD_CHECK();
    804   GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
    805   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTexParameteriv(" << GLES2Util::GetStringGetTexParamTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
    806   TRACE_EVENT0("gpu", "GLES2Implementation::GetTexParameteriv");
    807   if (GetTexParameterivHelper(target, pname, params)) {
    808     return;
    809   }
    810   typedef cmds::GetTexParameteriv::Result Result;
    811   Result* result = GetResultAs<Result*>();
    812   if (!result) {
    813     return;
    814   }
    815   result->SetNumResults(0);
    816   helper_->GetTexParameteriv(target, pname,
    817       GetResultShmId(), GetResultShmOffset());
    818   WaitForCmd();
    819   result->CopyResult(params);
    820   GPU_CLIENT_LOG_CODE_BLOCK({
    821     for (int32 i = 0; i < result->GetNumResults(); ++i) {
    822       GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
    823     }
    824   });
    825   CheckGLError();
    826 }
    827 void GLES2Implementation::Hint(GLenum target, GLenum mode) {
    828   GPU_CLIENT_SINGLE_THREAD_CHECK();
    829   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glHint(" << GLES2Util::GetStringHintTarget(target) << ", " << GLES2Util::GetStringHintMode(mode) << ")");  // NOLINT
    830   helper_->Hint(target, mode);
    831   CheckGLError();
    832 }
    833 
    834 GLboolean GLES2Implementation::IsBuffer(GLuint buffer) {
    835   GPU_CLIENT_SINGLE_THREAD_CHECK();
    836   TRACE_EVENT0("gpu", "GLES2Implementation::IsBuffer");
    837   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsBuffer(" << buffer << ")");
    838   typedef cmds::IsBuffer::Result Result;
    839   Result* result = GetResultAs<Result*>();
    840   if (!result) {
    841     return GL_FALSE;
    842   }
    843   *result = 0;
    844   helper_->IsBuffer(buffer, GetResultShmId(), GetResultShmOffset());
    845   WaitForCmd();
    846   GLboolean result_value = *result;
    847   GPU_CLIENT_LOG("returned " << result_value);
    848   CheckGLError();
    849   return result_value;
    850 }
    851 
    852 GLboolean GLES2Implementation::IsFramebuffer(GLuint framebuffer) {
    853   GPU_CLIENT_SINGLE_THREAD_CHECK();
    854   TRACE_EVENT0("gpu", "GLES2Implementation::IsFramebuffer");
    855   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsFramebuffer(" << framebuffer << ")");  // NOLINT
    856   typedef cmds::IsFramebuffer::Result Result;
    857   Result* result = GetResultAs<Result*>();
    858   if (!result) {
    859     return GL_FALSE;
    860   }
    861   *result = 0;
    862   helper_->IsFramebuffer(framebuffer, GetResultShmId(), GetResultShmOffset());
    863   WaitForCmd();
    864   GLboolean result_value = *result;
    865   GPU_CLIENT_LOG("returned " << result_value);
    866   CheckGLError();
    867   return result_value;
    868 }
    869 
    870 GLboolean GLES2Implementation::IsProgram(GLuint program) {
    871   GPU_CLIENT_SINGLE_THREAD_CHECK();
    872   TRACE_EVENT0("gpu", "GLES2Implementation::IsProgram");
    873   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsProgram(" << program << ")");
    874   typedef cmds::IsProgram::Result Result;
    875   Result* result = GetResultAs<Result*>();
    876   if (!result) {
    877     return GL_FALSE;
    878   }
    879   *result = 0;
    880   helper_->IsProgram(program, GetResultShmId(), GetResultShmOffset());
    881   WaitForCmd();
    882   GLboolean result_value = *result;
    883   GPU_CLIENT_LOG("returned " << result_value);
    884   CheckGLError();
    885   return result_value;
    886 }
    887 
    888 GLboolean GLES2Implementation::IsRenderbuffer(GLuint renderbuffer) {
    889   GPU_CLIENT_SINGLE_THREAD_CHECK();
    890   TRACE_EVENT0("gpu", "GLES2Implementation::IsRenderbuffer");
    891   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsRenderbuffer(" << renderbuffer << ")");  // NOLINT
    892   typedef cmds::IsRenderbuffer::Result Result;
    893   Result* result = GetResultAs<Result*>();
    894   if (!result) {
    895     return GL_FALSE;
    896   }
    897   *result = 0;
    898   helper_->IsRenderbuffer(
    899       renderbuffer, GetResultShmId(), GetResultShmOffset());
    900   WaitForCmd();
    901   GLboolean result_value = *result;
    902   GPU_CLIENT_LOG("returned " << result_value);
    903   CheckGLError();
    904   return result_value;
    905 }
    906 
    907 GLboolean GLES2Implementation::IsShader(GLuint shader) {
    908   GPU_CLIENT_SINGLE_THREAD_CHECK();
    909   TRACE_EVENT0("gpu", "GLES2Implementation::IsShader");
    910   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsShader(" << shader << ")");
    911   typedef cmds::IsShader::Result Result;
    912   Result* result = GetResultAs<Result*>();
    913   if (!result) {
    914     return GL_FALSE;
    915   }
    916   *result = 0;
    917   helper_->IsShader(shader, GetResultShmId(), GetResultShmOffset());
    918   WaitForCmd();
    919   GLboolean result_value = *result;
    920   GPU_CLIENT_LOG("returned " << result_value);
    921   CheckGLError();
    922   return result_value;
    923 }
    924 
    925 GLboolean GLES2Implementation::IsTexture(GLuint texture) {
    926   GPU_CLIENT_SINGLE_THREAD_CHECK();
    927   TRACE_EVENT0("gpu", "GLES2Implementation::IsTexture");
    928   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsTexture(" << texture << ")");
    929   typedef cmds::IsTexture::Result Result;
    930   Result* result = GetResultAs<Result*>();
    931   if (!result) {
    932     return GL_FALSE;
    933   }
    934   *result = 0;
    935   helper_->IsTexture(texture, GetResultShmId(), GetResultShmOffset());
    936   WaitForCmd();
    937   GLboolean result_value = *result;
    938   GPU_CLIENT_LOG("returned " << result_value);
    939   CheckGLError();
    940   return result_value;
    941 }
    942 
    943 void GLES2Implementation::LineWidth(GLfloat width) {
    944   GPU_CLIENT_SINGLE_THREAD_CHECK();
    945   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glLineWidth(" << width << ")");
    946   helper_->LineWidth(width);
    947   CheckGLError();
    948 }
    949 
    950 void GLES2Implementation::PolygonOffset(GLfloat factor, GLfloat units) {
    951   GPU_CLIENT_SINGLE_THREAD_CHECK();
    952   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPolygonOffset(" << factor << ", " << units << ")");  // NOLINT
    953   helper_->PolygonOffset(factor, units);
    954   CheckGLError();
    955 }
    956 
    957 void GLES2Implementation::ReleaseShaderCompiler() {
    958   GPU_CLIENT_SINGLE_THREAD_CHECK();
    959   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReleaseShaderCompiler(" << ")");
    960   helper_->ReleaseShaderCompiler();
    961   CheckGLError();
    962 }
    963 
    964 void GLES2Implementation::RenderbufferStorage(
    965     GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {
    966   GPU_CLIENT_SINGLE_THREAD_CHECK();
    967   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRenderbufferStorage(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) << ", " << width << ", " << height << ")");  // NOLINT
    968   if (width < 0) {
    969     SetGLError(GL_INVALID_VALUE, "glRenderbufferStorage", "width < 0");
    970     return;
    971   }
    972   if (height < 0) {
    973     SetGLError(GL_INVALID_VALUE, "glRenderbufferStorage", "height < 0");
    974     return;
    975   }
    976   helper_->RenderbufferStorage(target, internalformat, width, height);
    977   CheckGLError();
    978 }
    979 
    980 void GLES2Implementation::SampleCoverage(GLclampf value, GLboolean invert) {
    981   GPU_CLIENT_SINGLE_THREAD_CHECK();
    982   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSampleCoverage(" << value << ", " << GLES2Util::GetStringBool(invert) << ")");  // NOLINT
    983   helper_->SampleCoverage(value, invert);
    984   CheckGLError();
    985 }
    986 
    987 void GLES2Implementation::Scissor(
    988     GLint x, GLint y, GLsizei width, GLsizei height) {
    989   GPU_CLIENT_SINGLE_THREAD_CHECK();
    990   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glScissor(" << x << ", " << y << ", " << width << ", " << height << ")");  // NOLINT
    991   if (width < 0) {
    992     SetGLError(GL_INVALID_VALUE, "glScissor", "width < 0");
    993     return;
    994   }
    995   if (height < 0) {
    996     SetGLError(GL_INVALID_VALUE, "glScissor", "height < 0");
    997     return;
    998   }
    999   helper_->Scissor(x, y, width, height);
   1000   CheckGLError();
   1001 }
   1002 
   1003 void GLES2Implementation::StencilFunc(GLenum func, GLint ref, GLuint mask) {
   1004   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1005   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilFunc(" << GLES2Util::GetStringCmpFunction(func) << ", " << ref << ", " << mask << ")");  // NOLINT
   1006   helper_->StencilFunc(func, ref, mask);
   1007   CheckGLError();
   1008 }
   1009 
   1010 void GLES2Implementation::StencilFuncSeparate(
   1011     GLenum face, GLenum func, GLint ref, GLuint mask) {
   1012   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1013   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilFuncSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << GLES2Util::GetStringCmpFunction(func) << ", " << ref << ", " << mask << ")");  // NOLINT
   1014   helper_->StencilFuncSeparate(face, func, ref, mask);
   1015   CheckGLError();
   1016 }
   1017 
   1018 void GLES2Implementation::StencilMask(GLuint mask) {
   1019   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1020   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilMask(" << mask << ")");
   1021   helper_->StencilMask(mask);
   1022   CheckGLError();
   1023 }
   1024 
   1025 void GLES2Implementation::StencilMaskSeparate(GLenum face, GLuint mask) {
   1026   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1027   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilMaskSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << mask << ")");  // NOLINT
   1028   helper_->StencilMaskSeparate(face, mask);
   1029   CheckGLError();
   1030 }
   1031 
   1032 void GLES2Implementation::StencilOp(GLenum fail, GLenum zfail, GLenum zpass) {
   1033   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1034   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilOp(" << GLES2Util::GetStringStencilOp(fail) << ", " << GLES2Util::GetStringStencilOp(zfail) << ", " << GLES2Util::GetStringStencilOp(zpass) << ")");  // NOLINT
   1035   helper_->StencilOp(fail, zfail, zpass);
   1036   CheckGLError();
   1037 }
   1038 
   1039 void GLES2Implementation::StencilOpSeparate(
   1040     GLenum face, GLenum fail, GLenum zfail, GLenum zpass) {
   1041   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1042   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilOpSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << GLES2Util::GetStringStencilOp(fail) << ", " << GLES2Util::GetStringStencilOp(zfail) << ", " << GLES2Util::GetStringStencilOp(zpass) << ")");  // NOLINT
   1043   helper_->StencilOpSeparate(face, fail, zfail, zpass);
   1044   CheckGLError();
   1045 }
   1046 
   1047 void GLES2Implementation::TexParameterf(
   1048     GLenum target, GLenum pname, GLfloat param) {
   1049   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1050   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameterf(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << param << ")");  // NOLINT
   1051   helper_->TexParameterf(target, pname, param);
   1052   CheckGLError();
   1053 }
   1054 
   1055 void GLES2Implementation::TexParameterfv(
   1056     GLenum target, GLenum pname, const GLfloat* params) {
   1057   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1058   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameterfv(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
   1059   GPU_CLIENT_LOG("values: " << params[0]);
   1060   helper_->TexParameterfvImmediate(target, pname, params);
   1061   CheckGLError();
   1062 }
   1063 
   1064 void GLES2Implementation::TexParameteri(
   1065     GLenum target, GLenum pname, GLint param) {
   1066   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1067   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameteri(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << param << ")");  // NOLINT
   1068   helper_->TexParameteri(target, pname, param);
   1069   CheckGLError();
   1070 }
   1071 
   1072 void GLES2Implementation::TexParameteriv(
   1073     GLenum target, GLenum pname, const GLint* params) {
   1074   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1075   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameteriv(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")");  // NOLINT
   1076   GPU_CLIENT_LOG("values: " << params[0]);
   1077   helper_->TexParameterivImmediate(target, pname, params);
   1078   CheckGLError();
   1079 }
   1080 
   1081 void GLES2Implementation::Uniform1f(GLint location, GLfloat x) {
   1082   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1083   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1f(" << location << ", " << x << ")");  // NOLINT
   1084   helper_->Uniform1f(location, x);
   1085   CheckGLError();
   1086 }
   1087 
   1088 void GLES2Implementation::Uniform1fv(
   1089     GLint location, GLsizei count, const GLfloat* v) {
   1090   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1091   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
   1092   GPU_CLIENT_LOG_CODE_BLOCK({
   1093     for (GLsizei i = 0; i < count; ++i) {
   1094        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 1]);
   1095     }
   1096   });
   1097   if (count < 0) {
   1098     SetGLError(GL_INVALID_VALUE, "glUniform1fv", "count < 0");
   1099     return;
   1100   }
   1101   helper_->Uniform1fvImmediate(location, count, v);
   1102   CheckGLError();
   1103 }
   1104 
   1105 void GLES2Implementation::Uniform1i(GLint location, GLint x) {
   1106   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1107   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1i(" << location << ", " << x << ")");  // NOLINT
   1108   helper_->Uniform1i(location, x);
   1109   CheckGLError();
   1110 }
   1111 
   1112 void GLES2Implementation::Uniform1iv(
   1113     GLint location, GLsizei count, const GLint* v) {
   1114   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1115   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
   1116   GPU_CLIENT_LOG_CODE_BLOCK({
   1117     for (GLsizei i = 0; i < count; ++i) {
   1118        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 1]);
   1119     }
   1120   });
   1121   if (count < 0) {
   1122     SetGLError(GL_INVALID_VALUE, "glUniform1iv", "count < 0");
   1123     return;
   1124   }
   1125   helper_->Uniform1ivImmediate(location, count, v);
   1126   CheckGLError();
   1127 }
   1128 
   1129 void GLES2Implementation::Uniform2f(GLint location, GLfloat x, GLfloat y) {
   1130   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1131   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2f(" << location << ", " << x << ", " << y << ")");  // NOLINT
   1132   helper_->Uniform2f(location, x, y);
   1133   CheckGLError();
   1134 }
   1135 
   1136 void GLES2Implementation::Uniform2fv(
   1137     GLint location, GLsizei count, const GLfloat* v) {
   1138   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1139   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
   1140   GPU_CLIENT_LOG_CODE_BLOCK({
   1141     for (GLsizei i = 0; i < count; ++i) {
   1142        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]);  // NOLINT
   1143     }
   1144   });
   1145   if (count < 0) {
   1146     SetGLError(GL_INVALID_VALUE, "glUniform2fv", "count < 0");
   1147     return;
   1148   }
   1149   helper_->Uniform2fvImmediate(location, count, v);
   1150   CheckGLError();
   1151 }
   1152 
   1153 void GLES2Implementation::Uniform2i(GLint location, GLint x, GLint y) {
   1154   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1155   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2i(" << location << ", " << x << ", " << y << ")");  // NOLINT
   1156   helper_->Uniform2i(location, x, y);
   1157   CheckGLError();
   1158 }
   1159 
   1160 void GLES2Implementation::Uniform2iv(
   1161     GLint location, GLsizei count, const GLint* v) {
   1162   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1163   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
   1164   GPU_CLIENT_LOG_CODE_BLOCK({
   1165     for (GLsizei i = 0; i < count; ++i) {
   1166        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]);  // NOLINT
   1167     }
   1168   });
   1169   if (count < 0) {
   1170     SetGLError(GL_INVALID_VALUE, "glUniform2iv", "count < 0");
   1171     return;
   1172   }
   1173   helper_->Uniform2ivImmediate(location, count, v);
   1174   CheckGLError();
   1175 }
   1176 
   1177 void GLES2Implementation::Uniform3f(
   1178     GLint location, GLfloat x, GLfloat y, GLfloat z) {
   1179   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1180   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3f(" << location << ", " << x << ", " << y << ", " << z << ")");  // NOLINT
   1181   helper_->Uniform3f(location, x, y, z);
   1182   CheckGLError();
   1183 }
   1184 
   1185 void GLES2Implementation::Uniform3fv(
   1186     GLint location, GLsizei count, const GLfloat* v) {
   1187   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1188   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
   1189   GPU_CLIENT_LOG_CODE_BLOCK({
   1190     for (GLsizei i = 0; i < count; ++i) {
   1191        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3] << ", " << v[2 + i * 3]);  // NOLINT
   1192     }
   1193   });
   1194   if (count < 0) {
   1195     SetGLError(GL_INVALID_VALUE, "glUniform3fv", "count < 0");
   1196     return;
   1197   }
   1198   helper_->Uniform3fvImmediate(location, count, v);
   1199   CheckGLError();
   1200 }
   1201 
   1202 void GLES2Implementation::Uniform3i(
   1203     GLint location, GLint x, GLint y, GLint z) {
   1204   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1205   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3i(" << location << ", " << x << ", " << y << ", " << z << ")");  // NOLINT
   1206   helper_->Uniform3i(location, x, y, z);
   1207   CheckGLError();
   1208 }
   1209 
   1210 void GLES2Implementation::Uniform3iv(
   1211     GLint location, GLsizei count, const GLint* v) {
   1212   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1213   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
   1214   GPU_CLIENT_LOG_CODE_BLOCK({
   1215     for (GLsizei i = 0; i < count; ++i) {
   1216        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3] << ", " << v[2 + i * 3]);  // NOLINT
   1217     }
   1218   });
   1219   if (count < 0) {
   1220     SetGLError(GL_INVALID_VALUE, "glUniform3iv", "count < 0");
   1221     return;
   1222   }
   1223   helper_->Uniform3ivImmediate(location, count, v);
   1224   CheckGLError();
   1225 }
   1226 
   1227 void GLES2Implementation::Uniform4f(
   1228     GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
   1229   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1230   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4f(" << location << ", " << x << ", " << y << ", " << z << ", " << w << ")");  // NOLINT
   1231   helper_->Uniform4f(location, x, y, z, w);
   1232   CheckGLError();
   1233 }
   1234 
   1235 void GLES2Implementation::Uniform4fv(
   1236     GLint location, GLsizei count, const GLfloat* v) {
   1237   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1238   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
   1239   GPU_CLIENT_LOG_CODE_BLOCK({
   1240     for (GLsizei i = 0; i < count; ++i) {
   1241        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4] << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]);  // NOLINT
   1242     }
   1243   });
   1244   if (count < 0) {
   1245     SetGLError(GL_INVALID_VALUE, "glUniform4fv", "count < 0");
   1246     return;
   1247   }
   1248   helper_->Uniform4fvImmediate(location, count, v);
   1249   CheckGLError();
   1250 }
   1251 
   1252 void GLES2Implementation::Uniform4i(
   1253     GLint location, GLint x, GLint y, GLint z, GLint w) {
   1254   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1255   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4i(" << location << ", " << x << ", " << y << ", " << z << ", " << w << ")");  // NOLINT
   1256   helper_->Uniform4i(location, x, y, z, w);
   1257   CheckGLError();
   1258 }
   1259 
   1260 void GLES2Implementation::Uniform4iv(
   1261     GLint location, GLsizei count, const GLint* v) {
   1262   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1263   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")");  // NOLINT
   1264   GPU_CLIENT_LOG_CODE_BLOCK({
   1265     for (GLsizei i = 0; i < count; ++i) {
   1266        GPU_CLIENT_LOG("  " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4] << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]);  // NOLINT
   1267     }
   1268   });
   1269   if (count < 0) {
   1270     SetGLError(GL_INVALID_VALUE, "glUniform4iv", "count < 0");
   1271     return;
   1272   }
   1273   helper_->Uniform4ivImmediate(location, count, v);
   1274   CheckGLError();
   1275 }
   1276 
   1277 void GLES2Implementation::UniformMatrix2fv(
   1278     GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
   1279   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1280   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix2fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast<const void*>(value) << ")");  // NOLINT
   1281   GPU_CLIENT_LOG_CODE_BLOCK({
   1282     for (GLsizei i = 0; i < count; ++i) {
   1283        GPU_CLIENT_LOG("  " << i << ": " << value[0 + i * 4] << ", " << value[1 + i * 4] << ", " << value[2 + i * 4] << ", " << value[3 + i * 4]);  // NOLINT
   1284     }
   1285   });
   1286   if (count < 0) {
   1287     SetGLError(GL_INVALID_VALUE, "glUniformMatrix2fv", "count < 0");
   1288     return;
   1289   }
   1290   helper_->UniformMatrix2fvImmediate(location, count, transpose, value);
   1291   CheckGLError();
   1292 }
   1293 
   1294 void GLES2Implementation::UniformMatrix3fv(
   1295     GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
   1296   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1297   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix3fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast<const void*>(value) << ")");  // NOLINT
   1298   GPU_CLIENT_LOG_CODE_BLOCK({
   1299     for (GLsizei i = 0; i < count; ++i) {
   1300        GPU_CLIENT_LOG("  " << i << ": " << value[0 + i * 9] << ", " << value[1 + i * 9] << ", " << value[2 + i * 9] << ", " << value[3 + i * 9] << ", " << value[4 + i * 9] << ", " << value[5 + i * 9] << ", " << value[6 + i * 9] << ", " << value[7 + i * 9] << ", " << value[8 + i * 9]);  // NOLINT
   1301     }
   1302   });
   1303   if (count < 0) {
   1304     SetGLError(GL_INVALID_VALUE, "glUniformMatrix3fv", "count < 0");
   1305     return;
   1306   }
   1307   helper_->UniformMatrix3fvImmediate(location, count, transpose, value);
   1308   CheckGLError();
   1309 }
   1310 
   1311 void GLES2Implementation::UniformMatrix4fv(
   1312     GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) {
   1313   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1314   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix4fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast<const void*>(value) << ")");  // NOLINT
   1315   GPU_CLIENT_LOG_CODE_BLOCK({
   1316     for (GLsizei i = 0; i < count; ++i) {
   1317        GPU_CLIENT_LOG("  " << i << ": " << value[0 + i * 16] << ", " << value[1 + i * 16] << ", " << value[2 + i * 16] << ", " << value[3 + i * 16] << ", " << value[4 + i * 16] << ", " << value[5 + i * 16] << ", " << value[6 + i * 16] << ", " << value[7 + i * 16] << ", " << value[8 + i * 16] << ", " << value[9 + i * 16] << ", " << value[10 + i * 16] << ", " << value[11 + i * 16] << ", " << value[12 + i * 16] << ", " << value[13 + i * 16] << ", " << value[14 + i * 16] << ", " << value[15 + i * 16]);  // NOLINT
   1318     }
   1319   });
   1320   if (count < 0) {
   1321     SetGLError(GL_INVALID_VALUE, "glUniformMatrix4fv", "count < 0");
   1322     return;
   1323   }
   1324   helper_->UniformMatrix4fvImmediate(location, count, transpose, value);
   1325   CheckGLError();
   1326 }
   1327 
   1328 void GLES2Implementation::ValidateProgram(GLuint program) {
   1329   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1330   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glValidateProgram(" << program << ")");  // NOLINT
   1331   helper_->ValidateProgram(program);
   1332   CheckGLError();
   1333 }
   1334 
   1335 void GLES2Implementation::VertexAttrib1f(GLuint indx, GLfloat x) {
   1336   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1337   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib1f(" << indx << ", " << x << ")");  // NOLINT
   1338   helper_->VertexAttrib1f(indx, x);
   1339   CheckGLError();
   1340 }
   1341 
   1342 void GLES2Implementation::VertexAttrib1fv(GLuint indx, const GLfloat* values) {
   1343   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1344   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib1fv(" << indx << ", " << static_cast<const void*>(values) << ")");  // NOLINT
   1345   GPU_CLIENT_LOG("values: " << values[0]);
   1346   helper_->VertexAttrib1fvImmediate(indx, values);
   1347   CheckGLError();
   1348 }
   1349 
   1350 void GLES2Implementation::VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) {
   1351   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1352   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib2f(" << indx << ", " << x << ", " << y << ")");  // NOLINT
   1353   helper_->VertexAttrib2f(indx, x, y);
   1354   CheckGLError();
   1355 }
   1356 
   1357 void GLES2Implementation::VertexAttrib2fv(GLuint indx, const GLfloat* values) {
   1358   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1359   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib2fv(" << indx << ", " << static_cast<const void*>(values) << ")");  // NOLINT
   1360   GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1]);
   1361   helper_->VertexAttrib2fvImmediate(indx, values);
   1362   CheckGLError();
   1363 }
   1364 
   1365 void GLES2Implementation::VertexAttrib3f(
   1366     GLuint indx, GLfloat x, GLfloat y, GLfloat z) {
   1367   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1368   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib3f(" << indx << ", " << x << ", " << y << ", " << z << ")");  // NOLINT
   1369   helper_->VertexAttrib3f(indx, x, y, z);
   1370   CheckGLError();
   1371 }
   1372 
   1373 void GLES2Implementation::VertexAttrib3fv(GLuint indx, const GLfloat* values) {
   1374   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1375   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib3fv(" << indx << ", " << static_cast<const void*>(values) << ")");  // NOLINT
   1376   GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1] << ", " << values[2]);  // NOLINT
   1377   helper_->VertexAttrib3fvImmediate(indx, values);
   1378   CheckGLError();
   1379 }
   1380 
   1381 void GLES2Implementation::VertexAttrib4f(
   1382     GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
   1383   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1384   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib4f(" << indx << ", " << x << ", " << y << ", " << z << ", " << w << ")");  // NOLINT
   1385   helper_->VertexAttrib4f(indx, x, y, z, w);
   1386   CheckGLError();
   1387 }
   1388 
   1389 void GLES2Implementation::VertexAttrib4fv(GLuint indx, const GLfloat* values) {
   1390   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1391   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib4fv(" << indx << ", " << static_cast<const void*>(values) << ")");  // NOLINT
   1392   GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1] << ", " << values[2] << ", " << values[3]);  // NOLINT
   1393   helper_->VertexAttrib4fvImmediate(indx, values);
   1394   CheckGLError();
   1395 }
   1396 
   1397 void GLES2Implementation::Viewport(
   1398     GLint x, GLint y, GLsizei width, GLsizei height) {
   1399   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1400   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glViewport(" << x << ", " << y << ", " << width << ", " << height << ")");  // NOLINT
   1401   if (width < 0) {
   1402     SetGLError(GL_INVALID_VALUE, "glViewport", "width < 0");
   1403     return;
   1404   }
   1405   if (height < 0) {
   1406     SetGLError(GL_INVALID_VALUE, "glViewport", "height < 0");
   1407     return;
   1408   }
   1409   helper_->Viewport(x, y, width, height);
   1410   CheckGLError();
   1411 }
   1412 
   1413 void GLES2Implementation::BlitFramebufferEXT(
   1414     GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0,
   1415     GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) {
   1416   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1417   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlitFramebufferEXT(" << srcX0 << ", " << srcY0 << ", " << srcX1 << ", " << srcY1 << ", " << dstX0 << ", " << dstY0 << ", " << dstX1 << ", " << dstY1 << ", " << mask << ", " << GLES2Util::GetStringBlitFilter(filter) << ")");  // NOLINT
   1418   helper_->BlitFramebufferEXT(
   1419       srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
   1420   CheckGLError();
   1421 }
   1422 
   1423 void GLES2Implementation::RenderbufferStorageMultisampleEXT(
   1424     GLenum target, GLsizei samples, GLenum internalformat, GLsizei width,
   1425     GLsizei height) {
   1426   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1427   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRenderbufferStorageMultisampleEXT(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << samples << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) << ", " << width << ", " << height << ")");  // NOLINT
   1428   if (samples < 0) {
   1429     SetGLError(
   1430         GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "samples < 0");
   1431     return;
   1432   }
   1433   if (width < 0) {
   1434     SetGLError(
   1435         GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "width < 0");
   1436     return;
   1437   }
   1438   if (height < 0) {
   1439     SetGLError(
   1440         GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "height < 0");
   1441     return;
   1442   }
   1443   helper_->RenderbufferStorageMultisampleEXT(
   1444       target, samples, internalformat, width, height);
   1445   CheckGLError();
   1446 }
   1447 
   1448 void GLES2Implementation::FramebufferTexture2DMultisampleEXT(
   1449     GLenum target, GLenum attachment, GLenum textarget, GLuint texture,
   1450     GLint level, GLsizei samples) {
   1451   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1452   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferTexture2DMultisampleEXT(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringTextureTarget(textarget) << ", " << texture << ", " << level << ", " << samples << ")");  // NOLINT
   1453   if (samples < 0) {
   1454     SetGLError(
   1455         GL_INVALID_VALUE, "glFramebufferTexture2DMultisampleEXT", "samples < 0");  // NOLINT
   1456     return;
   1457   }
   1458   helper_->FramebufferTexture2DMultisampleEXT(
   1459       target, attachment, textarget, texture, level, samples);
   1460   CheckGLError();
   1461 }
   1462 
   1463 void GLES2Implementation::TexStorage2DEXT(
   1464     GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width,
   1465     GLsizei height) {
   1466   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1467   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexStorage2DEXT(" << GLES2Util::GetStringTextureTarget(target) << ", " << levels << ", " << GLES2Util::GetStringTextureInternalFormatStorage(internalFormat) << ", " << width << ", " << height << ")");  // NOLINT
   1468   if (levels < 0) {
   1469     SetGLError(GL_INVALID_VALUE, "glTexStorage2DEXT", "levels < 0");
   1470     return;
   1471   }
   1472   if (width < 0) {
   1473     SetGLError(GL_INVALID_VALUE, "glTexStorage2DEXT", "width < 0");
   1474     return;
   1475   }
   1476   if (height < 0) {
   1477     SetGLError(GL_INVALID_VALUE, "glTexStorage2DEXT", "height < 0");
   1478     return;
   1479   }
   1480   helper_->TexStorage2DEXT(target, levels, internalFormat, width, height);
   1481   CheckGLError();
   1482 }
   1483 
   1484 void GLES2Implementation::GenQueriesEXT(GLsizei n, GLuint* queries) {
   1485   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenQueriesEXT(" << n << ", " << static_cast<const void*>(queries) << ")");  // NOLINT
   1486   if (n < 0) {
   1487     SetGLError(GL_INVALID_VALUE, "glGenQueriesEXT", "n < 0");
   1488     return;
   1489   }
   1490   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1491   GetIdHandler(id_namespaces::kQueries)->
   1492       MakeIds(this, 0, n, queries);
   1493   GenQueriesEXTHelper(n, queries);
   1494   helper_->GenQueriesEXTImmediate(n, queries);
   1495   helper_->CommandBufferHelper::Flush();
   1496   GPU_CLIENT_LOG_CODE_BLOCK({
   1497     for (GLsizei i = 0; i < n; ++i) {
   1498       GPU_CLIENT_LOG("  " << i << ": " << queries[i]);
   1499     }
   1500   });
   1501   CheckGLError();
   1502 }
   1503 
   1504 void GLES2Implementation::DeleteQueriesEXT(GLsizei n, const GLuint* queries) {
   1505   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1506   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteQueriesEXT(" << n << ", " << static_cast<const void*>(queries) << ")");  // NOLINT
   1507   GPU_CLIENT_LOG_CODE_BLOCK({
   1508     for (GLsizei i = 0; i < n; ++i) {
   1509       GPU_CLIENT_LOG("  " << i << ": " << queries[i]);
   1510     }
   1511   });
   1512   GPU_CLIENT_DCHECK_CODE_BLOCK({
   1513     for (GLsizei i = 0; i < n; ++i) {
   1514       GPU_DCHECK(queries[i] != 0);
   1515     }
   1516   });
   1517   if (n < 0) {
   1518     SetGLError(GL_INVALID_VALUE, "glDeleteQueriesEXT", "n < 0");
   1519     return;
   1520   }
   1521   DeleteQueriesEXTHelper(n, queries);
   1522   CheckGLError();
   1523 }
   1524 
   1525 void GLES2Implementation::GenVertexArraysOES(GLsizei n, GLuint* arrays) {
   1526   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenVertexArraysOES(" << n << ", " << static_cast<const void*>(arrays) << ")");  // NOLINT
   1527   if (n < 0) {
   1528     SetGLError(GL_INVALID_VALUE, "glGenVertexArraysOES", "n < 0");
   1529     return;
   1530   }
   1531   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1532   GetIdHandler(id_namespaces::kVertexArrays)->
   1533       MakeIds(this, 0, n, arrays);
   1534   GenVertexArraysOESHelper(n, arrays);
   1535   helper_->GenVertexArraysOESImmediate(n, arrays);
   1536   helper_->CommandBufferHelper::Flush();
   1537   GPU_CLIENT_LOG_CODE_BLOCK({
   1538     for (GLsizei i = 0; i < n; ++i) {
   1539       GPU_CLIENT_LOG("  " << i << ": " << arrays[i]);
   1540     }
   1541   });
   1542   CheckGLError();
   1543 }
   1544 
   1545 void GLES2Implementation::DeleteVertexArraysOES(
   1546     GLsizei n, const GLuint* arrays) {
   1547   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1548   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteVertexArraysOES(" << n << ", " << static_cast<const void*>(arrays) << ")");  // NOLINT
   1549   GPU_CLIENT_LOG_CODE_BLOCK({
   1550     for (GLsizei i = 0; i < n; ++i) {
   1551       GPU_CLIENT_LOG("  " << i << ": " << arrays[i]);
   1552     }
   1553   });
   1554   GPU_CLIENT_DCHECK_CODE_BLOCK({
   1555     for (GLsizei i = 0; i < n; ++i) {
   1556       GPU_DCHECK(arrays[i] != 0);
   1557     }
   1558   });
   1559   if (n < 0) {
   1560     SetGLError(GL_INVALID_VALUE, "glDeleteVertexArraysOES", "n < 0");
   1561     return;
   1562   }
   1563   DeleteVertexArraysOESHelper(n, arrays);
   1564   CheckGLError();
   1565 }
   1566 
   1567 GLboolean GLES2Implementation::IsVertexArrayOES(GLuint array) {
   1568   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1569   TRACE_EVENT0("gpu", "GLES2Implementation::IsVertexArrayOES");
   1570   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsVertexArrayOES(" << array << ")");  // NOLINT
   1571   typedef cmds::IsVertexArrayOES::Result Result;
   1572   Result* result = GetResultAs<Result*>();
   1573   if (!result) {
   1574     return GL_FALSE;
   1575   }
   1576   *result = 0;
   1577   helper_->IsVertexArrayOES(array, GetResultShmId(), GetResultShmOffset());
   1578   WaitForCmd();
   1579   GLboolean result_value = *result;
   1580   GPU_CLIENT_LOG("returned " << result_value);
   1581   CheckGLError();
   1582   return result_value;
   1583 }
   1584 
   1585 void GLES2Implementation::BindVertexArrayOES(GLuint array) {
   1586   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1587   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindVertexArrayOES(" << array << ")");  // NOLINT
   1588   if (IsVertexArrayReservedId(array)) {
   1589     SetGLError(
   1590         GL_INVALID_OPERATION, "BindVertexArrayOES", "array reserved id");
   1591     return;
   1592   }
   1593   if (BindVertexArrayHelper(array)) {
   1594     helper_->BindVertexArrayOES(array);
   1595   }
   1596   CheckGLError();
   1597 }
   1598 
   1599 void GLES2Implementation::GetTranslatedShaderSourceANGLE(
   1600     GLuint shader, GLsizei bufsize, GLsizei* length, char* source) {
   1601   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1602   GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length);
   1603   GPU_CLIENT_LOG("[" << GetLogPrefix()
   1604       << "] glGetTranslatedShaderSourceANGLE" << "("
   1605       << shader << ", "
   1606       << bufsize << ", "
   1607       << static_cast<void*>(length) << ", "
   1608       << static_cast<void*>(source) << ")");
   1609   helper_->SetBucketSize(kResultBucketId, 0);
   1610   helper_->GetTranslatedShaderSourceANGLE(shader, kResultBucketId);
   1611   std::string str;
   1612   GLsizei max_size = 0;
   1613   if (GetBucketAsString(kResultBucketId, &str)) {
   1614     if (bufsize > 0) {
   1615       max_size =
   1616           std::min(static_cast<size_t>(bufsize) - 1, str.size());
   1617       memcpy(source, str.c_str(), max_size);
   1618       source[max_size] = '\0';
   1619       GPU_CLIENT_LOG("------\n" << source << "\n------");
   1620     }
   1621   }
   1622   if (length != NULL) {
   1623     *length = max_size;
   1624   }
   1625   CheckGLError();
   1626 }
   1627 void GLES2Implementation::TexImageIOSurface2DCHROMIUM(
   1628     GLenum target, GLsizei width, GLsizei height, GLuint ioSurfaceId,
   1629     GLuint plane) {
   1630   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1631   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImageIOSurface2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << width << ", " << height << ", " << ioSurfaceId << ", " << plane << ")");  // NOLINT
   1632   if (width < 0) {
   1633     SetGLError(GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "width < 0");
   1634     return;
   1635   }
   1636   if (height < 0) {
   1637     SetGLError(
   1638         GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "height < 0");
   1639     return;
   1640   }
   1641   helper_->TexImageIOSurface2DCHROMIUM(
   1642       target, width, height, ioSurfaceId, plane);
   1643   CheckGLError();
   1644 }
   1645 
   1646 void GLES2Implementation::CopyTextureCHROMIUM(
   1647     GLenum target, GLenum source_id, GLenum dest_id, GLint level,
   1648     GLint internalformat, GLenum dest_type) {
   1649   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1650   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTextureCHROMIUM(" << GLES2Util::GetStringEnum(target) << ", " << GLES2Util::GetStringEnum(source_id) << ", " << GLES2Util::GetStringEnum(dest_id) << ", " << level << ", " << internalformat << ", " << GLES2Util::GetStringPixelType(dest_type) << ")");  // NOLINT
   1651   helper_->CopyTextureCHROMIUM(
   1652       target, source_id, dest_id, level, internalformat, dest_type);
   1653   CheckGLError();
   1654 }
   1655 
   1656 void GLES2Implementation::ProduceTextureCHROMIUM(
   1657     GLenum target, const GLbyte* mailbox) {
   1658   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1659   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glProduceTextureCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << static_cast<const void*>(mailbox) << ")");  // NOLINT
   1660   GPU_CLIENT_LOG("values: " << mailbox[0] << ", " << mailbox[1] << ", " << mailbox[2] << ", " << mailbox[3] << ", " << mailbox[4] << ", " << mailbox[5] << ", " << mailbox[6] << ", " << mailbox[7] << ", " << mailbox[8] << ", " << mailbox[9] << ", " << mailbox[10] << ", " << mailbox[11] << ", " << mailbox[12] << ", " << mailbox[13] << ", " << mailbox[14] << ", " << mailbox[15] << ", " << mailbox[16] << ", " << mailbox[17] << ", " << mailbox[18] << ", " << mailbox[19] << ", " << mailbox[20] << ", " << mailbox[21] << ", " << mailbox[22] << ", " << mailbox[23] << ", " << mailbox[24] << ", " << mailbox[25] << ", " << mailbox[26] << ", " << mailbox[27] << ", " << mailbox[28] << ", " << mailbox[29] << ", " << mailbox[30] << ", " << mailbox[31] << ", " << mailbox[32] << ", " << mailbox[33] << ", " << mailbox[34] << ", " << mailbox[35] << ", " << mailbox[36] << ", " << mailbox[37] << ", " << mailbox[38] << ", " << mailbox[39] << ", " << mailbox[40] << ", " << mailbox[41] << ", " << mailbox[42] << ", " << mailbox[43] << ", " << mailbox[44] << ", " << mailbox[45] << ", " << mailbox[46] << ", " << mailbox[47] << ", " << mailbox[48] << ", " << mailbox[49] << ", " << mailbox[50] << ", " << mailbox[51] << ", " << mailbox[52] << ", " << mailbox[53] << ", " << mailbox[54] << ", " << mailbox[55] << ", " << mailbox[56] << ", " << mailbox[57] << ", " << mailbox[58] << ", " << mailbox[59] << ", " << mailbox[60] << ", " << mailbox[61] << ", " << mailbox[62] << ", " << mailbox[63]);  // NOLINT
   1661   helper_->ProduceTextureCHROMIUMImmediate(target, mailbox);
   1662   CheckGLError();
   1663 }
   1664 
   1665 void GLES2Implementation::ConsumeTextureCHROMIUM(
   1666     GLenum target, const GLbyte* mailbox) {
   1667   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1668   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glConsumeTextureCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << static_cast<const void*>(mailbox) << ")");  // NOLINT
   1669   GPU_CLIENT_LOG("values: " << mailbox[0] << ", " << mailbox[1] << ", " << mailbox[2] << ", " << mailbox[3] << ", " << mailbox[4] << ", " << mailbox[5] << ", " << mailbox[6] << ", " << mailbox[7] << ", " << mailbox[8] << ", " << mailbox[9] << ", " << mailbox[10] << ", " << mailbox[11] << ", " << mailbox[12] << ", " << mailbox[13] << ", " << mailbox[14] << ", " << mailbox[15] << ", " << mailbox[16] << ", " << mailbox[17] << ", " << mailbox[18] << ", " << mailbox[19] << ", " << mailbox[20] << ", " << mailbox[21] << ", " << mailbox[22] << ", " << mailbox[23] << ", " << mailbox[24] << ", " << mailbox[25] << ", " << mailbox[26] << ", " << mailbox[27] << ", " << mailbox[28] << ", " << mailbox[29] << ", " << mailbox[30] << ", " << mailbox[31] << ", " << mailbox[32] << ", " << mailbox[33] << ", " << mailbox[34] << ", " << mailbox[35] << ", " << mailbox[36] << ", " << mailbox[37] << ", " << mailbox[38] << ", " << mailbox[39] << ", " << mailbox[40] << ", " << mailbox[41] << ", " << mailbox[42] << ", " << mailbox[43] << ", " << mailbox[44] << ", " << mailbox[45] << ", " << mailbox[46] << ", " << mailbox[47] << ", " << mailbox[48] << ", " << mailbox[49] << ", " << mailbox[50] << ", " << mailbox[51] << ", " << mailbox[52] << ", " << mailbox[53] << ", " << mailbox[54] << ", " << mailbox[55] << ", " << mailbox[56] << ", " << mailbox[57] << ", " << mailbox[58] << ", " << mailbox[59] << ", " << mailbox[60] << ", " << mailbox[61] << ", " << mailbox[62] << ", " << mailbox[63]);  // NOLINT
   1670   helper_->ConsumeTextureCHROMIUMImmediate(target, mailbox);
   1671   CheckGLError();
   1672 }
   1673 
   1674 void GLES2Implementation::BindTexImage2DCHROMIUM(
   1675     GLenum target, GLint imageId) {
   1676   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1677   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTexImage2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << imageId << ")");  // NOLINT
   1678   helper_->BindTexImage2DCHROMIUM(target, imageId);
   1679   CheckGLError();
   1680 }
   1681 
   1682 void GLES2Implementation::ReleaseTexImage2DCHROMIUM(
   1683     GLenum target, GLint imageId) {
   1684   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1685   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReleaseTexImage2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << imageId << ")");  // NOLINT
   1686   helper_->ReleaseTexImage2DCHROMIUM(target, imageId);
   1687   CheckGLError();
   1688 }
   1689 
   1690 void GLES2Implementation::DiscardFramebufferEXT(
   1691     GLenum target, GLsizei count, const GLenum* attachments) {
   1692   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1693   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDiscardFramebufferEXT(" << GLES2Util::GetStringEnum(target) << ", " << count << ", " << static_cast<const void*>(attachments) << ")");  // NOLINT
   1694   GPU_CLIENT_LOG_CODE_BLOCK({
   1695     for (GLsizei i = 0; i < count; ++i) {
   1696        GPU_CLIENT_LOG("  " << i << ": " << attachments[0 + i * 1]);
   1697     }
   1698   });
   1699   if (count < 0) {
   1700     SetGLError(GL_INVALID_VALUE, "glDiscardFramebufferEXT", "count < 0");
   1701     return;
   1702   }
   1703   helper_->DiscardFramebufferEXTImmediate(target, count, attachments);
   1704   CheckGLError();
   1705 }
   1706 
   1707 void GLES2Implementation::LoseContextCHROMIUM(GLenum current, GLenum other) {
   1708   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1709   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glLoseContextCHROMIUM(" << GLES2Util::GetStringEnum(current) << ", " << GLES2Util::GetStringEnum(other) << ")");  // NOLINT
   1710   helper_->LoseContextCHROMIUM(current, other);
   1711   CheckGLError();
   1712 }
   1713 
   1714 void GLES2Implementation::WaitSyncPointCHROMIUM(GLuint sync_point) {
   1715   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1716   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glWaitSyncPointCHROMIUM(" << sync_point << ")");  // NOLINT
   1717   helper_->WaitSyncPointCHROMIUM(sync_point);
   1718   CheckGLError();
   1719 }
   1720 
   1721 void GLES2Implementation::DrawBuffersEXT(GLsizei count, const GLenum* bufs) {
   1722   GPU_CLIENT_SINGLE_THREAD_CHECK();
   1723   GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawBuffersEXT(" << count << ", " << static_cast<const void*>(bufs) << ")");  // NOLINT
   1724   GPU_CLIENT_LOG_CODE_BLOCK({
   1725     for (GLsizei i = 0; i < count; ++i) {
   1726        GPU_CLIENT_LOG("  " << i << ": " << bufs[0 + i * 1]);
   1727     }
   1728   });
   1729   if (count < 0) {
   1730     SetGLError(GL_INVALID_VALUE, "glDrawBuffersEXT", "count < 0");
   1731     return;
   1732   }
   1733   helper_->DrawBuffersEXTImmediate(count, bufs);
   1734   CheckGLError();
   1735 }
   1736 
   1737 #endif  // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_
   1738 
   1739