Home | History | Annotate | Download | only in service
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // This file is auto-generated from
      6 // gpu/command_buffer/build_gles2_cmd_buffer.py
      7 // It's formatted by clang-format using chromium coding style:
      8 //    clang-format -i -style=chromium filename
      9 // DO NOT EDIT!
     10 
     11 // It is included by gles2_cmd_decoder.cc
     12 #ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_
     13 #define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_
     14 
     15 error::Error GLES2DecoderImpl::HandleActiveTexture(uint32_t immediate_data_size,
     16                                                    const void* cmd_data) {
     17   const gles2::cmds::ActiveTexture& c =
     18       *static_cast<const gles2::cmds::ActiveTexture*>(cmd_data);
     19   (void)c;
     20   GLenum texture = static_cast<GLenum>(c.texture);
     21   DoActiveTexture(texture);
     22   return error::kNoError;
     23 }
     24 
     25 error::Error GLES2DecoderImpl::HandleAttachShader(uint32_t immediate_data_size,
     26                                                   const void* cmd_data) {
     27   const gles2::cmds::AttachShader& c =
     28       *static_cast<const gles2::cmds::AttachShader*>(cmd_data);
     29   (void)c;
     30   GLuint program = c.program;
     31   GLuint shader = c.shader;
     32   DoAttachShader(program, shader);
     33   return error::kNoError;
     34 }
     35 
     36 error::Error GLES2DecoderImpl::HandleBindBuffer(uint32_t immediate_data_size,
     37                                                 const void* cmd_data) {
     38   const gles2::cmds::BindBuffer& c =
     39       *static_cast<const gles2::cmds::BindBuffer*>(cmd_data);
     40   (void)c;
     41   GLenum target = static_cast<GLenum>(c.target);
     42   GLuint buffer = c.buffer;
     43   if (!validators_->buffer_target.IsValid(target)) {
     44     LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindBuffer", target, "target");
     45     return error::kNoError;
     46   }
     47   DoBindBuffer(target, buffer);
     48   return error::kNoError;
     49 }
     50 
     51 error::Error GLES2DecoderImpl::HandleBindFramebuffer(
     52     uint32_t immediate_data_size,
     53     const void* cmd_data) {
     54   const gles2::cmds::BindFramebuffer& c =
     55       *static_cast<const gles2::cmds::BindFramebuffer*>(cmd_data);
     56   (void)c;
     57   GLenum target = static_cast<GLenum>(c.target);
     58   GLuint framebuffer = c.framebuffer;
     59   if (!validators_->frame_buffer_target.IsValid(target)) {
     60     LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindFramebuffer", target, "target");
     61     return error::kNoError;
     62   }
     63   DoBindFramebuffer(target, framebuffer);
     64   return error::kNoError;
     65 }
     66 
     67 error::Error GLES2DecoderImpl::HandleBindRenderbuffer(
     68     uint32_t immediate_data_size,
     69     const void* cmd_data) {
     70   const gles2::cmds::BindRenderbuffer& c =
     71       *static_cast<const gles2::cmds::BindRenderbuffer*>(cmd_data);
     72   (void)c;
     73   GLenum target = static_cast<GLenum>(c.target);
     74   GLuint renderbuffer = c.renderbuffer;
     75   if (!validators_->render_buffer_target.IsValid(target)) {
     76     LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindRenderbuffer", target, "target");
     77     return error::kNoError;
     78   }
     79   DoBindRenderbuffer(target, renderbuffer);
     80   return error::kNoError;
     81 }
     82 
     83 error::Error GLES2DecoderImpl::HandleBindTexture(uint32_t immediate_data_size,
     84                                                  const void* cmd_data) {
     85   const gles2::cmds::BindTexture& c =
     86       *static_cast<const gles2::cmds::BindTexture*>(cmd_data);
     87   (void)c;
     88   GLenum target = static_cast<GLenum>(c.target);
     89   GLuint texture = c.texture;
     90   if (!validators_->texture_bind_target.IsValid(target)) {
     91     LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTexture", target, "target");
     92     return error::kNoError;
     93   }
     94   DoBindTexture(target, texture);
     95   return error::kNoError;
     96 }
     97 
     98 error::Error GLES2DecoderImpl::HandleBlendColor(uint32_t immediate_data_size,
     99                                                 const void* cmd_data) {
    100   const gles2::cmds::BlendColor& c =
    101       *static_cast<const gles2::cmds::BlendColor*>(cmd_data);
    102   (void)c;
    103   GLclampf red = static_cast<GLclampf>(c.red);
    104   GLclampf green = static_cast<GLclampf>(c.green);
    105   GLclampf blue = static_cast<GLclampf>(c.blue);
    106   GLclampf alpha = static_cast<GLclampf>(c.alpha);
    107   if (state_.blend_color_red != red || state_.blend_color_green != green ||
    108       state_.blend_color_blue != blue || state_.blend_color_alpha != alpha) {
    109     state_.blend_color_red = red;
    110     state_.blend_color_green = green;
    111     state_.blend_color_blue = blue;
    112     state_.blend_color_alpha = alpha;
    113     glBlendColor(red, green, blue, alpha);
    114   }
    115   return error::kNoError;
    116 }
    117 
    118 error::Error GLES2DecoderImpl::HandleBlendEquation(uint32_t immediate_data_size,
    119                                                    const void* cmd_data) {
    120   const gles2::cmds::BlendEquation& c =
    121       *static_cast<const gles2::cmds::BlendEquation*>(cmd_data);
    122   (void)c;
    123   GLenum mode = static_cast<GLenum>(c.mode);
    124   if (!validators_->equation.IsValid(mode)) {
    125     LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendEquation", mode, "mode");
    126     return error::kNoError;
    127   }
    128   if (state_.blend_equation_rgb != mode ||
    129       state_.blend_equation_alpha != mode) {
    130     state_.blend_equation_rgb = mode;
    131     state_.blend_equation_alpha = mode;
    132     glBlendEquation(mode);
    133   }
    134   return error::kNoError;
    135 }
    136 
    137 error::Error GLES2DecoderImpl::HandleBlendEquationSeparate(
    138     uint32_t immediate_data_size,
    139     const void* cmd_data) {
    140   const gles2::cmds::BlendEquationSeparate& c =
    141       *static_cast<const gles2::cmds::BlendEquationSeparate*>(cmd_data);
    142   (void)c;
    143   GLenum modeRGB = static_cast<GLenum>(c.modeRGB);
    144   GLenum modeAlpha = static_cast<GLenum>(c.modeAlpha);
    145   if (!validators_->equation.IsValid(modeRGB)) {
    146     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    147         "glBlendEquationSeparate", modeRGB, "modeRGB");
    148     return error::kNoError;
    149   }
    150   if (!validators_->equation.IsValid(modeAlpha)) {
    151     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    152         "glBlendEquationSeparate", modeAlpha, "modeAlpha");
    153     return error::kNoError;
    154   }
    155   if (state_.blend_equation_rgb != modeRGB ||
    156       state_.blend_equation_alpha != modeAlpha) {
    157     state_.blend_equation_rgb = modeRGB;
    158     state_.blend_equation_alpha = modeAlpha;
    159     glBlendEquationSeparate(modeRGB, modeAlpha);
    160   }
    161   return error::kNoError;
    162 }
    163 
    164 error::Error GLES2DecoderImpl::HandleBlendFunc(uint32_t immediate_data_size,
    165                                                const void* cmd_data) {
    166   const gles2::cmds::BlendFunc& c =
    167       *static_cast<const gles2::cmds::BlendFunc*>(cmd_data);
    168   (void)c;
    169   GLenum sfactor = static_cast<GLenum>(c.sfactor);
    170   GLenum dfactor = static_cast<GLenum>(c.dfactor);
    171   if (!validators_->src_blend_factor.IsValid(sfactor)) {
    172     LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFunc", sfactor, "sfactor");
    173     return error::kNoError;
    174   }
    175   if (!validators_->dst_blend_factor.IsValid(dfactor)) {
    176     LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFunc", dfactor, "dfactor");
    177     return error::kNoError;
    178   }
    179   if (state_.blend_source_rgb != sfactor || state_.blend_dest_rgb != dfactor ||
    180       state_.blend_source_alpha != sfactor ||
    181       state_.blend_dest_alpha != dfactor) {
    182     state_.blend_source_rgb = sfactor;
    183     state_.blend_dest_rgb = dfactor;
    184     state_.blend_source_alpha = sfactor;
    185     state_.blend_dest_alpha = dfactor;
    186     glBlendFunc(sfactor, dfactor);
    187   }
    188   return error::kNoError;
    189 }
    190 
    191 error::Error GLES2DecoderImpl::HandleBlendFuncSeparate(
    192     uint32_t immediate_data_size,
    193     const void* cmd_data) {
    194   const gles2::cmds::BlendFuncSeparate& c =
    195       *static_cast<const gles2::cmds::BlendFuncSeparate*>(cmd_data);
    196   (void)c;
    197   GLenum srcRGB = static_cast<GLenum>(c.srcRGB);
    198   GLenum dstRGB = static_cast<GLenum>(c.dstRGB);
    199   GLenum srcAlpha = static_cast<GLenum>(c.srcAlpha);
    200   GLenum dstAlpha = static_cast<GLenum>(c.dstAlpha);
    201   if (!validators_->src_blend_factor.IsValid(srcRGB)) {
    202     LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", srcRGB, "srcRGB");
    203     return error::kNoError;
    204   }
    205   if (!validators_->dst_blend_factor.IsValid(dstRGB)) {
    206     LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", dstRGB, "dstRGB");
    207     return error::kNoError;
    208   }
    209   if (!validators_->src_blend_factor.IsValid(srcAlpha)) {
    210     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    211         "glBlendFuncSeparate", srcAlpha, "srcAlpha");
    212     return error::kNoError;
    213   }
    214   if (!validators_->dst_blend_factor.IsValid(dstAlpha)) {
    215     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    216         "glBlendFuncSeparate", dstAlpha, "dstAlpha");
    217     return error::kNoError;
    218   }
    219   if (state_.blend_source_rgb != srcRGB || state_.blend_dest_rgb != dstRGB ||
    220       state_.blend_source_alpha != srcAlpha ||
    221       state_.blend_dest_alpha != dstAlpha) {
    222     state_.blend_source_rgb = srcRGB;
    223     state_.blend_dest_rgb = dstRGB;
    224     state_.blend_source_alpha = srcAlpha;
    225     state_.blend_dest_alpha = dstAlpha;
    226     glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
    227   }
    228   return error::kNoError;
    229 }
    230 
    231 error::Error GLES2DecoderImpl::HandleBufferSubData(uint32_t immediate_data_size,
    232                                                    const void* cmd_data) {
    233   const gles2::cmds::BufferSubData& c =
    234       *static_cast<const gles2::cmds::BufferSubData*>(cmd_data);
    235   (void)c;
    236   GLenum target = static_cast<GLenum>(c.target);
    237   GLintptr offset = static_cast<GLintptr>(c.offset);
    238   GLsizeiptr size = static_cast<GLsizeiptr>(c.size);
    239   uint32_t data_size = size;
    240   const void* data = GetSharedMemoryAs<const void*>(
    241       c.data_shm_id, c.data_shm_offset, data_size);
    242   if (!validators_->buffer_target.IsValid(target)) {
    243     LOCAL_SET_GL_ERROR_INVALID_ENUM("glBufferSubData", target, "target");
    244     return error::kNoError;
    245   }
    246   if (size < 0) {
    247     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glBufferSubData", "size < 0");
    248     return error::kNoError;
    249   }
    250   if (data == NULL) {
    251     return error::kOutOfBounds;
    252   }
    253   DoBufferSubData(target, offset, size, data);
    254   return error::kNoError;
    255 }
    256 
    257 error::Error GLES2DecoderImpl::HandleCheckFramebufferStatus(
    258     uint32_t immediate_data_size,
    259     const void* cmd_data) {
    260   const gles2::cmds::CheckFramebufferStatus& c =
    261       *static_cast<const gles2::cmds::CheckFramebufferStatus*>(cmd_data);
    262   (void)c;
    263   GLenum target = static_cast<GLenum>(c.target);
    264   typedef cmds::CheckFramebufferStatus::Result Result;
    265   Result* result_dst = GetSharedMemoryAs<Result*>(
    266       c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
    267   if (!result_dst) {
    268     return error::kOutOfBounds;
    269   }
    270   if (!validators_->frame_buffer_target.IsValid(target)) {
    271     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    272         "glCheckFramebufferStatus", target, "target");
    273     return error::kNoError;
    274   }
    275   *result_dst = DoCheckFramebufferStatus(target);
    276   return error::kNoError;
    277 }
    278 
    279 error::Error GLES2DecoderImpl::HandleClear(uint32_t immediate_data_size,
    280                                            const void* cmd_data) {
    281   const gles2::cmds::Clear& c =
    282       *static_cast<const gles2::cmds::Clear*>(cmd_data);
    283   (void)c;
    284   error::Error error;
    285   error = WillAccessBoundFramebufferForDraw();
    286   if (error != error::kNoError)
    287     return error;
    288   GLbitfield mask = static_cast<GLbitfield>(c.mask);
    289   DoClear(mask);
    290   return error::kNoError;
    291 }
    292 
    293 error::Error GLES2DecoderImpl::HandleClearColor(uint32_t immediate_data_size,
    294                                                 const void* cmd_data) {
    295   const gles2::cmds::ClearColor& c =
    296       *static_cast<const gles2::cmds::ClearColor*>(cmd_data);
    297   (void)c;
    298   GLclampf red = static_cast<GLclampf>(c.red);
    299   GLclampf green = static_cast<GLclampf>(c.green);
    300   GLclampf blue = static_cast<GLclampf>(c.blue);
    301   GLclampf alpha = static_cast<GLclampf>(c.alpha);
    302   if (state_.color_clear_red != red || state_.color_clear_green != green ||
    303       state_.color_clear_blue != blue || state_.color_clear_alpha != alpha) {
    304     state_.color_clear_red = red;
    305     state_.color_clear_green = green;
    306     state_.color_clear_blue = blue;
    307     state_.color_clear_alpha = alpha;
    308     glClearColor(red, green, blue, alpha);
    309   }
    310   return error::kNoError;
    311 }
    312 
    313 error::Error GLES2DecoderImpl::HandleClearDepthf(uint32_t immediate_data_size,
    314                                                  const void* cmd_data) {
    315   const gles2::cmds::ClearDepthf& c =
    316       *static_cast<const gles2::cmds::ClearDepthf*>(cmd_data);
    317   (void)c;
    318   GLclampf depth = static_cast<GLclampf>(c.depth);
    319   if (state_.depth_clear != depth) {
    320     state_.depth_clear = depth;
    321     glClearDepth(depth);
    322   }
    323   return error::kNoError;
    324 }
    325 
    326 error::Error GLES2DecoderImpl::HandleClearStencil(uint32_t immediate_data_size,
    327                                                   const void* cmd_data) {
    328   const gles2::cmds::ClearStencil& c =
    329       *static_cast<const gles2::cmds::ClearStencil*>(cmd_data);
    330   (void)c;
    331   GLint s = static_cast<GLint>(c.s);
    332   if (state_.stencil_clear != s) {
    333     state_.stencil_clear = s;
    334     glClearStencil(s);
    335   }
    336   return error::kNoError;
    337 }
    338 
    339 error::Error GLES2DecoderImpl::HandleColorMask(uint32_t immediate_data_size,
    340                                                const void* cmd_data) {
    341   const gles2::cmds::ColorMask& c =
    342       *static_cast<const gles2::cmds::ColorMask*>(cmd_data);
    343   (void)c;
    344   GLboolean red = static_cast<GLboolean>(c.red);
    345   GLboolean green = static_cast<GLboolean>(c.green);
    346   GLboolean blue = static_cast<GLboolean>(c.blue);
    347   GLboolean alpha = static_cast<GLboolean>(c.alpha);
    348   if (state_.color_mask_red != red || state_.color_mask_green != green ||
    349       state_.color_mask_blue != blue || state_.color_mask_alpha != alpha) {
    350     state_.color_mask_red = red;
    351     state_.color_mask_green = green;
    352     state_.color_mask_blue = blue;
    353     state_.color_mask_alpha = alpha;
    354     framebuffer_state_.clear_state_dirty = true;
    355   }
    356   return error::kNoError;
    357 }
    358 
    359 error::Error GLES2DecoderImpl::HandleCompileShader(uint32_t immediate_data_size,
    360                                                    const void* cmd_data) {
    361   const gles2::cmds::CompileShader& c =
    362       *static_cast<const gles2::cmds::CompileShader*>(cmd_data);
    363   (void)c;
    364   GLuint shader = c.shader;
    365   DoCompileShader(shader);
    366   return error::kNoError;
    367 }
    368 
    369 error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2D(
    370     uint32_t immediate_data_size,
    371     const void* cmd_data) {
    372   const gles2::cmds::CompressedTexSubImage2D& c =
    373       *static_cast<const gles2::cmds::CompressedTexSubImage2D*>(cmd_data);
    374   (void)c;
    375   GLenum target = static_cast<GLenum>(c.target);
    376   GLint level = static_cast<GLint>(c.level);
    377   GLint xoffset = static_cast<GLint>(c.xoffset);
    378   GLint yoffset = static_cast<GLint>(c.yoffset);
    379   GLsizei width = static_cast<GLsizei>(c.width);
    380   GLsizei height = static_cast<GLsizei>(c.height);
    381   GLenum format = static_cast<GLenum>(c.format);
    382   GLsizei imageSize = static_cast<GLsizei>(c.imageSize);
    383   uint32_t data_size = imageSize;
    384   const void* data = GetSharedMemoryAs<const void*>(
    385       c.data_shm_id, c.data_shm_offset, data_size);
    386   if (!validators_->texture_target.IsValid(target)) {
    387     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    388         "glCompressedTexSubImage2D", target, "target");
    389     return error::kNoError;
    390   }
    391   if (width < 0) {
    392     LOCAL_SET_GL_ERROR(
    393         GL_INVALID_VALUE, "glCompressedTexSubImage2D", "width < 0");
    394     return error::kNoError;
    395   }
    396   if (height < 0) {
    397     LOCAL_SET_GL_ERROR(
    398         GL_INVALID_VALUE, "glCompressedTexSubImage2D", "height < 0");
    399     return error::kNoError;
    400   }
    401   if (!validators_->compressed_texture_format.IsValid(format)) {
    402     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    403         "glCompressedTexSubImage2D", format, "format");
    404     return error::kNoError;
    405   }
    406   if (imageSize < 0) {
    407     LOCAL_SET_GL_ERROR(
    408         GL_INVALID_VALUE, "glCompressedTexSubImage2D", "imageSize < 0");
    409     return error::kNoError;
    410   }
    411   if (data == NULL) {
    412     return error::kOutOfBounds;
    413   }
    414   DoCompressedTexSubImage2D(
    415       target, level, xoffset, yoffset, width, height, format, imageSize, data);
    416   return error::kNoError;
    417 }
    418 
    419 error::Error GLES2DecoderImpl::HandleCopyTexImage2D(
    420     uint32_t immediate_data_size,
    421     const void* cmd_data) {
    422   const gles2::cmds::CopyTexImage2D& c =
    423       *static_cast<const gles2::cmds::CopyTexImage2D*>(cmd_data);
    424   (void)c;
    425   error::Error error;
    426   error = WillAccessBoundFramebufferForRead();
    427   if (error != error::kNoError)
    428     return error;
    429   GLenum target = static_cast<GLenum>(c.target);
    430   GLint level = static_cast<GLint>(c.level);
    431   GLenum internalformat = static_cast<GLenum>(c.internalformat);
    432   GLint x = static_cast<GLint>(c.x);
    433   GLint y = static_cast<GLint>(c.y);
    434   GLsizei width = static_cast<GLsizei>(c.width);
    435   GLsizei height = static_cast<GLsizei>(c.height);
    436   GLint border = static_cast<GLint>(c.border);
    437   if (!validators_->texture_target.IsValid(target)) {
    438     LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexImage2D", target, "target");
    439     return error::kNoError;
    440   }
    441   if (!validators_->texture_internal_format.IsValid(internalformat)) {
    442     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    443         "glCopyTexImage2D", internalformat, "internalformat");
    444     return error::kNoError;
    445   }
    446   if (width < 0) {
    447     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyTexImage2D", "width < 0");
    448     return error::kNoError;
    449   }
    450   if (height < 0) {
    451     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyTexImage2D", "height < 0");
    452     return error::kNoError;
    453   }
    454   DoCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
    455   return error::kNoError;
    456 }
    457 
    458 error::Error GLES2DecoderImpl::HandleCopyTexSubImage2D(
    459     uint32_t immediate_data_size,
    460     const void* cmd_data) {
    461   const gles2::cmds::CopyTexSubImage2D& c =
    462       *static_cast<const gles2::cmds::CopyTexSubImage2D*>(cmd_data);
    463   (void)c;
    464   error::Error error;
    465   error = WillAccessBoundFramebufferForRead();
    466   if (error != error::kNoError)
    467     return error;
    468   GLenum target = static_cast<GLenum>(c.target);
    469   GLint level = static_cast<GLint>(c.level);
    470   GLint xoffset = static_cast<GLint>(c.xoffset);
    471   GLint yoffset = static_cast<GLint>(c.yoffset);
    472   GLint x = static_cast<GLint>(c.x);
    473   GLint y = static_cast<GLint>(c.y);
    474   GLsizei width = static_cast<GLsizei>(c.width);
    475   GLsizei height = static_cast<GLsizei>(c.height);
    476   if (!validators_->texture_target.IsValid(target)) {
    477     LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexSubImage2D", target, "target");
    478     return error::kNoError;
    479   }
    480   if (width < 0) {
    481     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyTexSubImage2D", "width < 0");
    482     return error::kNoError;
    483   }
    484   if (height < 0) {
    485     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyTexSubImage2D", "height < 0");
    486     return error::kNoError;
    487   }
    488   DoCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
    489   return error::kNoError;
    490 }
    491 
    492 error::Error GLES2DecoderImpl::HandleCreateProgram(uint32_t immediate_data_size,
    493                                                    const void* cmd_data) {
    494   const gles2::cmds::CreateProgram& c =
    495       *static_cast<const gles2::cmds::CreateProgram*>(cmd_data);
    496   (void)c;
    497   uint32_t client_id = c.client_id;
    498   if (!CreateProgramHelper(client_id)) {
    499     return error::kInvalidArguments;
    500   }
    501   return error::kNoError;
    502 }
    503 
    504 error::Error GLES2DecoderImpl::HandleCreateShader(uint32_t immediate_data_size,
    505                                                   const void* cmd_data) {
    506   const gles2::cmds::CreateShader& c =
    507       *static_cast<const gles2::cmds::CreateShader*>(cmd_data);
    508   (void)c;
    509   GLenum type = static_cast<GLenum>(c.type);
    510   if (!validators_->shader_type.IsValid(type)) {
    511     LOCAL_SET_GL_ERROR_INVALID_ENUM("glCreateShader", type, "type");
    512     return error::kNoError;
    513   }
    514   uint32_t client_id = c.client_id;
    515   if (!CreateShaderHelper(type, client_id)) {
    516     return error::kInvalidArguments;
    517   }
    518   return error::kNoError;
    519 }
    520 
    521 error::Error GLES2DecoderImpl::HandleCullFace(uint32_t immediate_data_size,
    522                                               const void* cmd_data) {
    523   const gles2::cmds::CullFace& c =
    524       *static_cast<const gles2::cmds::CullFace*>(cmd_data);
    525   (void)c;
    526   GLenum mode = static_cast<GLenum>(c.mode);
    527   if (!validators_->face_type.IsValid(mode)) {
    528     LOCAL_SET_GL_ERROR_INVALID_ENUM("glCullFace", mode, "mode");
    529     return error::kNoError;
    530   }
    531   if (state_.cull_mode != mode) {
    532     state_.cull_mode = mode;
    533     glCullFace(mode);
    534   }
    535   return error::kNoError;
    536 }
    537 
    538 error::Error GLES2DecoderImpl::HandleDeleteBuffersImmediate(
    539     uint32_t immediate_data_size,
    540     const void* cmd_data) {
    541   const gles2::cmds::DeleteBuffersImmediate& c =
    542       *static_cast<const gles2::cmds::DeleteBuffersImmediate*>(cmd_data);
    543   (void)c;
    544   GLsizei n = static_cast<GLsizei>(c.n);
    545   uint32_t data_size;
    546   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
    547     return error::kOutOfBounds;
    548   }
    549   const GLuint* buffers =
    550       GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
    551   if (buffers == NULL) {
    552     return error::kOutOfBounds;
    553   }
    554   DeleteBuffersHelper(n, buffers);
    555   return error::kNoError;
    556 }
    557 
    558 error::Error GLES2DecoderImpl::HandleDeleteFramebuffersImmediate(
    559     uint32_t immediate_data_size,
    560     const void* cmd_data) {
    561   const gles2::cmds::DeleteFramebuffersImmediate& c =
    562       *static_cast<const gles2::cmds::DeleteFramebuffersImmediate*>(cmd_data);
    563   (void)c;
    564   GLsizei n = static_cast<GLsizei>(c.n);
    565   uint32_t data_size;
    566   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
    567     return error::kOutOfBounds;
    568   }
    569   const GLuint* framebuffers =
    570       GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
    571   if (framebuffers == NULL) {
    572     return error::kOutOfBounds;
    573   }
    574   DeleteFramebuffersHelper(n, framebuffers);
    575   return error::kNoError;
    576 }
    577 
    578 error::Error GLES2DecoderImpl::HandleDeleteRenderbuffersImmediate(
    579     uint32_t immediate_data_size,
    580     const void* cmd_data) {
    581   const gles2::cmds::DeleteRenderbuffersImmediate& c =
    582       *static_cast<const gles2::cmds::DeleteRenderbuffersImmediate*>(cmd_data);
    583   (void)c;
    584   GLsizei n = static_cast<GLsizei>(c.n);
    585   uint32_t data_size;
    586   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
    587     return error::kOutOfBounds;
    588   }
    589   const GLuint* renderbuffers =
    590       GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
    591   if (renderbuffers == NULL) {
    592     return error::kOutOfBounds;
    593   }
    594   DeleteRenderbuffersHelper(n, renderbuffers);
    595   return error::kNoError;
    596 }
    597 
    598 error::Error GLES2DecoderImpl::HandleDeleteTexturesImmediate(
    599     uint32_t immediate_data_size,
    600     const void* cmd_data) {
    601   const gles2::cmds::DeleteTexturesImmediate& c =
    602       *static_cast<const gles2::cmds::DeleteTexturesImmediate*>(cmd_data);
    603   (void)c;
    604   GLsizei n = static_cast<GLsizei>(c.n);
    605   uint32_t data_size;
    606   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
    607     return error::kOutOfBounds;
    608   }
    609   const GLuint* textures =
    610       GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
    611   if (textures == NULL) {
    612     return error::kOutOfBounds;
    613   }
    614   DeleteTexturesHelper(n, textures);
    615   return error::kNoError;
    616 }
    617 
    618 error::Error GLES2DecoderImpl::HandleDepthFunc(uint32_t immediate_data_size,
    619                                                const void* cmd_data) {
    620   const gles2::cmds::DepthFunc& c =
    621       *static_cast<const gles2::cmds::DepthFunc*>(cmd_data);
    622   (void)c;
    623   GLenum func = static_cast<GLenum>(c.func);
    624   if (!validators_->cmp_function.IsValid(func)) {
    625     LOCAL_SET_GL_ERROR_INVALID_ENUM("glDepthFunc", func, "func");
    626     return error::kNoError;
    627   }
    628   if (state_.depth_func != func) {
    629     state_.depth_func = func;
    630     glDepthFunc(func);
    631   }
    632   return error::kNoError;
    633 }
    634 
    635 error::Error GLES2DecoderImpl::HandleDepthMask(uint32_t immediate_data_size,
    636                                                const void* cmd_data) {
    637   const gles2::cmds::DepthMask& c =
    638       *static_cast<const gles2::cmds::DepthMask*>(cmd_data);
    639   (void)c;
    640   GLboolean flag = static_cast<GLboolean>(c.flag);
    641   if (state_.depth_mask != flag) {
    642     state_.depth_mask = flag;
    643     framebuffer_state_.clear_state_dirty = true;
    644   }
    645   return error::kNoError;
    646 }
    647 
    648 error::Error GLES2DecoderImpl::HandleDepthRangef(uint32_t immediate_data_size,
    649                                                  const void* cmd_data) {
    650   const gles2::cmds::DepthRangef& c =
    651       *static_cast<const gles2::cmds::DepthRangef*>(cmd_data);
    652   (void)c;
    653   GLclampf zNear = static_cast<GLclampf>(c.zNear);
    654   GLclampf zFar = static_cast<GLclampf>(c.zFar);
    655   DoDepthRangef(zNear, zFar);
    656   return error::kNoError;
    657 }
    658 
    659 error::Error GLES2DecoderImpl::HandleDetachShader(uint32_t immediate_data_size,
    660                                                   const void* cmd_data) {
    661   const gles2::cmds::DetachShader& c =
    662       *static_cast<const gles2::cmds::DetachShader*>(cmd_data);
    663   (void)c;
    664   GLuint program = c.program;
    665   GLuint shader = c.shader;
    666   DoDetachShader(program, shader);
    667   return error::kNoError;
    668 }
    669 
    670 error::Error GLES2DecoderImpl::HandleDisable(uint32_t immediate_data_size,
    671                                              const void* cmd_data) {
    672   const gles2::cmds::Disable& c =
    673       *static_cast<const gles2::cmds::Disable*>(cmd_data);
    674   (void)c;
    675   GLenum cap = static_cast<GLenum>(c.cap);
    676   if (!validators_->capability.IsValid(cap)) {
    677     LOCAL_SET_GL_ERROR_INVALID_ENUM("glDisable", cap, "cap");
    678     return error::kNoError;
    679   }
    680   DoDisable(cap);
    681   return error::kNoError;
    682 }
    683 
    684 error::Error GLES2DecoderImpl::HandleDisableVertexAttribArray(
    685     uint32_t immediate_data_size,
    686     const void* cmd_data) {
    687   const gles2::cmds::DisableVertexAttribArray& c =
    688       *static_cast<const gles2::cmds::DisableVertexAttribArray*>(cmd_data);
    689   (void)c;
    690   GLuint index = static_cast<GLuint>(c.index);
    691   DoDisableVertexAttribArray(index);
    692   return error::kNoError;
    693 }
    694 
    695 error::Error GLES2DecoderImpl::HandleEnable(uint32_t immediate_data_size,
    696                                             const void* cmd_data) {
    697   const gles2::cmds::Enable& c =
    698       *static_cast<const gles2::cmds::Enable*>(cmd_data);
    699   (void)c;
    700   GLenum cap = static_cast<GLenum>(c.cap);
    701   if (!validators_->capability.IsValid(cap)) {
    702     LOCAL_SET_GL_ERROR_INVALID_ENUM("glEnable", cap, "cap");
    703     return error::kNoError;
    704   }
    705   DoEnable(cap);
    706   return error::kNoError;
    707 }
    708 
    709 error::Error GLES2DecoderImpl::HandleEnableVertexAttribArray(
    710     uint32_t immediate_data_size,
    711     const void* cmd_data) {
    712   const gles2::cmds::EnableVertexAttribArray& c =
    713       *static_cast<const gles2::cmds::EnableVertexAttribArray*>(cmd_data);
    714   (void)c;
    715   GLuint index = static_cast<GLuint>(c.index);
    716   DoEnableVertexAttribArray(index);
    717   return error::kNoError;
    718 }
    719 
    720 error::Error GLES2DecoderImpl::HandleFinish(uint32_t immediate_data_size,
    721                                             const void* cmd_data) {
    722   const gles2::cmds::Finish& c =
    723       *static_cast<const gles2::cmds::Finish*>(cmd_data);
    724   (void)c;
    725   error::Error error;
    726   error = WillAccessBoundFramebufferForRead();
    727   if (error != error::kNoError)
    728     return error;
    729   DoFinish();
    730   return error::kNoError;
    731 }
    732 
    733 error::Error GLES2DecoderImpl::HandleFlush(uint32_t immediate_data_size,
    734                                            const void* cmd_data) {
    735   const gles2::cmds::Flush& c =
    736       *static_cast<const gles2::cmds::Flush*>(cmd_data);
    737   (void)c;
    738   DoFlush();
    739   return error::kNoError;
    740 }
    741 
    742 error::Error GLES2DecoderImpl::HandleFramebufferRenderbuffer(
    743     uint32_t immediate_data_size,
    744     const void* cmd_data) {
    745   const gles2::cmds::FramebufferRenderbuffer& c =
    746       *static_cast<const gles2::cmds::FramebufferRenderbuffer*>(cmd_data);
    747   (void)c;
    748   GLenum target = static_cast<GLenum>(c.target);
    749   GLenum attachment = static_cast<GLenum>(c.attachment);
    750   GLenum renderbuffertarget = static_cast<GLenum>(c.renderbuffertarget);
    751   GLuint renderbuffer = c.renderbuffer;
    752   if (!validators_->frame_buffer_target.IsValid(target)) {
    753     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    754         "glFramebufferRenderbuffer", target, "target");
    755     return error::kNoError;
    756   }
    757   if (!validators_->attachment.IsValid(attachment)) {
    758     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    759         "glFramebufferRenderbuffer", attachment, "attachment");
    760     return error::kNoError;
    761   }
    762   if (!validators_->render_buffer_target.IsValid(renderbuffertarget)) {
    763     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    764         "glFramebufferRenderbuffer", renderbuffertarget, "renderbuffertarget");
    765     return error::kNoError;
    766   }
    767   DoFramebufferRenderbuffer(
    768       target, attachment, renderbuffertarget, renderbuffer);
    769   return error::kNoError;
    770 }
    771 
    772 error::Error GLES2DecoderImpl::HandleFramebufferTexture2D(
    773     uint32_t immediate_data_size,
    774     const void* cmd_data) {
    775   const gles2::cmds::FramebufferTexture2D& c =
    776       *static_cast<const gles2::cmds::FramebufferTexture2D*>(cmd_data);
    777   (void)c;
    778   GLenum target = static_cast<GLenum>(c.target);
    779   GLenum attachment = static_cast<GLenum>(c.attachment);
    780   GLenum textarget = static_cast<GLenum>(c.textarget);
    781   GLuint texture = c.texture;
    782   GLint level = static_cast<GLint>(c.level);
    783   if (!validators_->frame_buffer_target.IsValid(target)) {
    784     LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", target, "target");
    785     return error::kNoError;
    786   }
    787   if (!validators_->attachment.IsValid(attachment)) {
    788     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    789         "glFramebufferTexture2D", attachment, "attachment");
    790     return error::kNoError;
    791   }
    792   if (!validators_->texture_target.IsValid(textarget)) {
    793     LOCAL_SET_GL_ERROR_INVALID_ENUM(
    794         "glFramebufferTexture2D", textarget, "textarget");
    795     return error::kNoError;
    796   }
    797   DoFramebufferTexture2D(target, attachment, textarget, texture, level);
    798   return error::kNoError;
    799 }
    800 
    801 error::Error GLES2DecoderImpl::HandleFrontFace(uint32_t immediate_data_size,
    802                                                const void* cmd_data) {
    803   const gles2::cmds::FrontFace& c =
    804       *static_cast<const gles2::cmds::FrontFace*>(cmd_data);
    805   (void)c;
    806   GLenum mode = static_cast<GLenum>(c.mode);
    807   if (!validators_->face_mode.IsValid(mode)) {
    808     LOCAL_SET_GL_ERROR_INVALID_ENUM("glFrontFace", mode, "mode");
    809     return error::kNoError;
    810   }
    811   if (state_.front_face != mode) {
    812     state_.front_face = mode;
    813     glFrontFace(mode);
    814   }
    815   return error::kNoError;
    816 }
    817 
    818 error::Error GLES2DecoderImpl::HandleGenBuffersImmediate(
    819     uint32_t immediate_data_size,
    820     const void* cmd_data) {
    821   const gles2::cmds::GenBuffersImmediate& c =
    822       *static_cast<const gles2::cmds::GenBuffersImmediate*>(cmd_data);
    823   (void)c;
    824   GLsizei n = static_cast<GLsizei>(c.n);
    825   uint32_t data_size;
    826   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
    827     return error::kOutOfBounds;
    828   }
    829   GLuint* buffers =
    830       GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
    831   if (buffers == NULL) {
    832     return error::kOutOfBounds;
    833   }
    834   if (!GenBuffersHelper(n, buffers)) {
    835     return error::kInvalidArguments;
    836   }
    837   return error::kNoError;
    838 }
    839 
    840 error::Error GLES2DecoderImpl::HandleGenerateMipmap(
    841     uint32_t immediate_data_size,
    842     const void* cmd_data) {
    843   const gles2::cmds::GenerateMipmap& c =
    844       *static_cast<const gles2::cmds::GenerateMipmap*>(cmd_data);
    845   (void)c;
    846   GLenum target = static_cast<GLenum>(c.target);
    847   if (!validators_->texture_bind_target.IsValid(target)) {
    848     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGenerateMipmap", target, "target");
    849     return error::kNoError;
    850   }
    851   DoGenerateMipmap(target);
    852   return error::kNoError;
    853 }
    854 
    855 error::Error GLES2DecoderImpl::HandleGenFramebuffersImmediate(
    856     uint32_t immediate_data_size,
    857     const void* cmd_data) {
    858   const gles2::cmds::GenFramebuffersImmediate& c =
    859       *static_cast<const gles2::cmds::GenFramebuffersImmediate*>(cmd_data);
    860   (void)c;
    861   GLsizei n = static_cast<GLsizei>(c.n);
    862   uint32_t data_size;
    863   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
    864     return error::kOutOfBounds;
    865   }
    866   GLuint* framebuffers =
    867       GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
    868   if (framebuffers == NULL) {
    869     return error::kOutOfBounds;
    870   }
    871   if (!GenFramebuffersHelper(n, framebuffers)) {
    872     return error::kInvalidArguments;
    873   }
    874   return error::kNoError;
    875 }
    876 
    877 error::Error GLES2DecoderImpl::HandleGenRenderbuffersImmediate(
    878     uint32_t immediate_data_size,
    879     const void* cmd_data) {
    880   const gles2::cmds::GenRenderbuffersImmediate& c =
    881       *static_cast<const gles2::cmds::GenRenderbuffersImmediate*>(cmd_data);
    882   (void)c;
    883   GLsizei n = static_cast<GLsizei>(c.n);
    884   uint32_t data_size;
    885   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
    886     return error::kOutOfBounds;
    887   }
    888   GLuint* renderbuffers =
    889       GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
    890   if (renderbuffers == NULL) {
    891     return error::kOutOfBounds;
    892   }
    893   if (!GenRenderbuffersHelper(n, renderbuffers)) {
    894     return error::kInvalidArguments;
    895   }
    896   return error::kNoError;
    897 }
    898 
    899 error::Error GLES2DecoderImpl::HandleGenTexturesImmediate(
    900     uint32_t immediate_data_size,
    901     const void* cmd_data) {
    902   const gles2::cmds::GenTexturesImmediate& c =
    903       *static_cast<const gles2::cmds::GenTexturesImmediate*>(cmd_data);
    904   (void)c;
    905   GLsizei n = static_cast<GLsizei>(c.n);
    906   uint32_t data_size;
    907   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
    908     return error::kOutOfBounds;
    909   }
    910   GLuint* textures =
    911       GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
    912   if (textures == NULL) {
    913     return error::kOutOfBounds;
    914   }
    915   if (!GenTexturesHelper(n, textures)) {
    916     return error::kInvalidArguments;
    917   }
    918   return error::kNoError;
    919 }
    920 
    921 error::Error GLES2DecoderImpl::HandleGetBooleanv(uint32_t immediate_data_size,
    922                                                  const void* cmd_data) {
    923   const gles2::cmds::GetBooleanv& c =
    924       *static_cast<const gles2::cmds::GetBooleanv*>(cmd_data);
    925   (void)c;
    926   GLenum pname = static_cast<GLenum>(c.pname);
    927   typedef cmds::GetBooleanv::Result Result;
    928   GLsizei num_values = 0;
    929   GetNumValuesReturnedForGLGet(pname, &num_values);
    930   Result* result = GetSharedMemoryAs<Result*>(
    931       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
    932   GLboolean* params = result ? result->GetData() : NULL;
    933   if (!validators_->g_l_state.IsValid(pname)) {
    934     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBooleanv", pname, "pname");
    935     return error::kNoError;
    936   }
    937   if (params == NULL) {
    938     return error::kOutOfBounds;
    939   }
    940   LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetBooleanv");
    941   // Check that the client initialized the result.
    942   if (result->size != 0) {
    943     return error::kInvalidArguments;
    944   }
    945   DoGetBooleanv(pname, params);
    946   GLenum error = glGetError();
    947   if (error == GL_NO_ERROR) {
    948     result->SetNumResults(num_values);
    949   } else {
    950     LOCAL_SET_GL_ERROR(error, "GetBooleanv", "");
    951   }
    952   return error::kNoError;
    953 }
    954 
    955 error::Error GLES2DecoderImpl::HandleGetBufferParameteriv(
    956     uint32_t immediate_data_size,
    957     const void* cmd_data) {
    958   const gles2::cmds::GetBufferParameteriv& c =
    959       *static_cast<const gles2::cmds::GetBufferParameteriv*>(cmd_data);
    960   (void)c;
    961   GLenum target = static_cast<GLenum>(c.target);
    962   GLenum pname = static_cast<GLenum>(c.pname);
    963   typedef cmds::GetBufferParameteriv::Result Result;
    964   GLsizei num_values = 0;
    965   GetNumValuesReturnedForGLGet(pname, &num_values);
    966   Result* result = GetSharedMemoryAs<Result*>(
    967       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
    968   GLint* params = result ? result->GetData() : NULL;
    969   if (!validators_->buffer_target.IsValid(target)) {
    970     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", target, "target");
    971     return error::kNoError;
    972   }
    973   if (!validators_->buffer_parameter.IsValid(pname)) {
    974     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", pname, "pname");
    975     return error::kNoError;
    976   }
    977   if (params == NULL) {
    978     return error::kOutOfBounds;
    979   }
    980   // Check that the client initialized the result.
    981   if (result->size != 0) {
    982     return error::kInvalidArguments;
    983   }
    984   DoGetBufferParameteriv(target, pname, params);
    985   result->SetNumResults(num_values);
    986   return error::kNoError;
    987 }
    988 error::Error GLES2DecoderImpl::HandleGetError(uint32_t immediate_data_size,
    989                                               const void* cmd_data) {
    990   const gles2::cmds::GetError& c =
    991       *static_cast<const gles2::cmds::GetError*>(cmd_data);
    992   (void)c;
    993   typedef cmds::GetError::Result Result;
    994   Result* result_dst = GetSharedMemoryAs<Result*>(
    995       c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
    996   if (!result_dst) {
    997     return error::kOutOfBounds;
    998   }
    999   *result_dst = GetErrorState()->GetGLError();
   1000   return error::kNoError;
   1001 }
   1002 
   1003 error::Error GLES2DecoderImpl::HandleGetFloatv(uint32_t immediate_data_size,
   1004                                                const void* cmd_data) {
   1005   const gles2::cmds::GetFloatv& c =
   1006       *static_cast<const gles2::cmds::GetFloatv*>(cmd_data);
   1007   (void)c;
   1008   GLenum pname = static_cast<GLenum>(c.pname);
   1009   typedef cmds::GetFloatv::Result Result;
   1010   GLsizei num_values = 0;
   1011   GetNumValuesReturnedForGLGet(pname, &num_values);
   1012   Result* result = GetSharedMemoryAs<Result*>(
   1013       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
   1014   GLfloat* params = result ? result->GetData() : NULL;
   1015   if (!validators_->g_l_state.IsValid(pname)) {
   1016     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFloatv", pname, "pname");
   1017     return error::kNoError;
   1018   }
   1019   if (params == NULL) {
   1020     return error::kOutOfBounds;
   1021   }
   1022   LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetFloatv");
   1023   // Check that the client initialized the result.
   1024   if (result->size != 0) {
   1025     return error::kInvalidArguments;
   1026   }
   1027   DoGetFloatv(pname, params);
   1028   GLenum error = glGetError();
   1029   if (error == GL_NO_ERROR) {
   1030     result->SetNumResults(num_values);
   1031   } else {
   1032     LOCAL_SET_GL_ERROR(error, "GetFloatv", "");
   1033   }
   1034   return error::kNoError;
   1035 }
   1036 
   1037 error::Error GLES2DecoderImpl::HandleGetFramebufferAttachmentParameteriv(
   1038     uint32_t immediate_data_size,
   1039     const void* cmd_data) {
   1040   const gles2::cmds::GetFramebufferAttachmentParameteriv& c =
   1041       *static_cast<const gles2::cmds::GetFramebufferAttachmentParameteriv*>(
   1042           cmd_data);
   1043   (void)c;
   1044   GLenum target = static_cast<GLenum>(c.target);
   1045   GLenum attachment = static_cast<GLenum>(c.attachment);
   1046   GLenum pname = static_cast<GLenum>(c.pname);
   1047   typedef cmds::GetFramebufferAttachmentParameteriv::Result Result;
   1048   GLsizei num_values = 0;
   1049   GetNumValuesReturnedForGLGet(pname, &num_values);
   1050   Result* result = GetSharedMemoryAs<Result*>(
   1051       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
   1052   GLint* params = result ? result->GetData() : NULL;
   1053   if (!validators_->frame_buffer_target.IsValid(target)) {
   1054     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   1055         "glGetFramebufferAttachmentParameteriv", target, "target");
   1056     return error::kNoError;
   1057   }
   1058   if (!validators_->attachment.IsValid(attachment)) {
   1059     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   1060         "glGetFramebufferAttachmentParameteriv", attachment, "attachment");
   1061     return error::kNoError;
   1062   }
   1063   if (!validators_->frame_buffer_parameter.IsValid(pname)) {
   1064     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   1065         "glGetFramebufferAttachmentParameteriv", pname, "pname");
   1066     return error::kNoError;
   1067   }
   1068   if (params == NULL) {
   1069     return error::kOutOfBounds;
   1070   }
   1071   LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetFramebufferAttachmentParameteriv");
   1072   // Check that the client initialized the result.
   1073   if (result->size != 0) {
   1074     return error::kInvalidArguments;
   1075   }
   1076   DoGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
   1077   GLenum error = glGetError();
   1078   if (error == GL_NO_ERROR) {
   1079     result->SetNumResults(num_values);
   1080   } else {
   1081     LOCAL_SET_GL_ERROR(error, "GetFramebufferAttachmentParameteriv", "");
   1082   }
   1083   return error::kNoError;
   1084 }
   1085 
   1086 error::Error GLES2DecoderImpl::HandleGetIntegerv(uint32_t immediate_data_size,
   1087                                                  const void* cmd_data) {
   1088   const gles2::cmds::GetIntegerv& c =
   1089       *static_cast<const gles2::cmds::GetIntegerv*>(cmd_data);
   1090   (void)c;
   1091   GLenum pname = static_cast<GLenum>(c.pname);
   1092   typedef cmds::GetIntegerv::Result Result;
   1093   GLsizei num_values = 0;
   1094   GetNumValuesReturnedForGLGet(pname, &num_values);
   1095   Result* result = GetSharedMemoryAs<Result*>(
   1096       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
   1097   GLint* params = result ? result->GetData() : NULL;
   1098   if (!validators_->g_l_state.IsValid(pname)) {
   1099     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetIntegerv", pname, "pname");
   1100     return error::kNoError;
   1101   }
   1102   if (params == NULL) {
   1103     return error::kOutOfBounds;
   1104   }
   1105   LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetIntegerv");
   1106   // Check that the client initialized the result.
   1107   if (result->size != 0) {
   1108     return error::kInvalidArguments;
   1109   }
   1110   DoGetIntegerv(pname, params);
   1111   GLenum error = glGetError();
   1112   if (error == GL_NO_ERROR) {
   1113     result->SetNumResults(num_values);
   1114   } else {
   1115     LOCAL_SET_GL_ERROR(error, "GetIntegerv", "");
   1116   }
   1117   return error::kNoError;
   1118 }
   1119 
   1120 error::Error GLES2DecoderImpl::HandleGetProgramiv(uint32_t immediate_data_size,
   1121                                                   const void* cmd_data) {
   1122   const gles2::cmds::GetProgramiv& c =
   1123       *static_cast<const gles2::cmds::GetProgramiv*>(cmd_data);
   1124   (void)c;
   1125   GLuint program = c.program;
   1126   GLenum pname = static_cast<GLenum>(c.pname);
   1127   typedef cmds::GetProgramiv::Result Result;
   1128   GLsizei num_values = 0;
   1129   GetNumValuesReturnedForGLGet(pname, &num_values);
   1130   Result* result = GetSharedMemoryAs<Result*>(
   1131       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
   1132   GLint* params = result ? result->GetData() : NULL;
   1133   if (!validators_->program_parameter.IsValid(pname)) {
   1134     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetProgramiv", pname, "pname");
   1135     return error::kNoError;
   1136   }
   1137   if (params == NULL) {
   1138     return error::kOutOfBounds;
   1139   }
   1140   LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetProgramiv");
   1141   // Check that the client initialized the result.
   1142   if (result->size != 0) {
   1143     return error::kInvalidArguments;
   1144   }
   1145   DoGetProgramiv(program, pname, params);
   1146   GLenum error = glGetError();
   1147   if (error == GL_NO_ERROR) {
   1148     result->SetNumResults(num_values);
   1149   } else {
   1150     LOCAL_SET_GL_ERROR(error, "GetProgramiv", "");
   1151   }
   1152   return error::kNoError;
   1153 }
   1154 
   1155 error::Error GLES2DecoderImpl::HandleGetRenderbufferParameteriv(
   1156     uint32_t immediate_data_size,
   1157     const void* cmd_data) {
   1158   const gles2::cmds::GetRenderbufferParameteriv& c =
   1159       *static_cast<const gles2::cmds::GetRenderbufferParameteriv*>(cmd_data);
   1160   (void)c;
   1161   GLenum target = static_cast<GLenum>(c.target);
   1162   GLenum pname = static_cast<GLenum>(c.pname);
   1163   typedef cmds::GetRenderbufferParameteriv::Result Result;
   1164   GLsizei num_values = 0;
   1165   GetNumValuesReturnedForGLGet(pname, &num_values);
   1166   Result* result = GetSharedMemoryAs<Result*>(
   1167       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
   1168   GLint* params = result ? result->GetData() : NULL;
   1169   if (!validators_->render_buffer_target.IsValid(target)) {
   1170     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   1171         "glGetRenderbufferParameteriv", target, "target");
   1172     return error::kNoError;
   1173   }
   1174   if (!validators_->render_buffer_parameter.IsValid(pname)) {
   1175     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   1176         "glGetRenderbufferParameteriv", pname, "pname");
   1177     return error::kNoError;
   1178   }
   1179   if (params == NULL) {
   1180     return error::kOutOfBounds;
   1181   }
   1182   LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetRenderbufferParameteriv");
   1183   // Check that the client initialized the result.
   1184   if (result->size != 0) {
   1185     return error::kInvalidArguments;
   1186   }
   1187   DoGetRenderbufferParameteriv(target, pname, params);
   1188   GLenum error = glGetError();
   1189   if (error == GL_NO_ERROR) {
   1190     result->SetNumResults(num_values);
   1191   } else {
   1192     LOCAL_SET_GL_ERROR(error, "GetRenderbufferParameteriv", "");
   1193   }
   1194   return error::kNoError;
   1195 }
   1196 
   1197 error::Error GLES2DecoderImpl::HandleGetShaderiv(uint32_t immediate_data_size,
   1198                                                  const void* cmd_data) {
   1199   const gles2::cmds::GetShaderiv& c =
   1200       *static_cast<const gles2::cmds::GetShaderiv*>(cmd_data);
   1201   (void)c;
   1202   GLuint shader = c.shader;
   1203   GLenum pname = static_cast<GLenum>(c.pname);
   1204   typedef cmds::GetShaderiv::Result Result;
   1205   GLsizei num_values = 0;
   1206   GetNumValuesReturnedForGLGet(pname, &num_values);
   1207   Result* result = GetSharedMemoryAs<Result*>(
   1208       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
   1209   GLint* params = result ? result->GetData() : NULL;
   1210   if (!validators_->shader_parameter.IsValid(pname)) {
   1211     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetShaderiv", pname, "pname");
   1212     return error::kNoError;
   1213   }
   1214   if (params == NULL) {
   1215     return error::kOutOfBounds;
   1216   }
   1217   LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetShaderiv");
   1218   // Check that the client initialized the result.
   1219   if (result->size != 0) {
   1220     return error::kInvalidArguments;
   1221   }
   1222   DoGetShaderiv(shader, pname, params);
   1223   GLenum error = glGetError();
   1224   if (error == GL_NO_ERROR) {
   1225     result->SetNumResults(num_values);
   1226   } else {
   1227     LOCAL_SET_GL_ERROR(error, "GetShaderiv", "");
   1228   }
   1229   return error::kNoError;
   1230 }
   1231 
   1232 error::Error GLES2DecoderImpl::HandleGetTexParameterfv(
   1233     uint32_t immediate_data_size,
   1234     const void* cmd_data) {
   1235   const gles2::cmds::GetTexParameterfv& c =
   1236       *static_cast<const gles2::cmds::GetTexParameterfv*>(cmd_data);
   1237   (void)c;
   1238   GLenum target = static_cast<GLenum>(c.target);
   1239   GLenum pname = static_cast<GLenum>(c.pname);
   1240   typedef cmds::GetTexParameterfv::Result Result;
   1241   GLsizei num_values = 0;
   1242   GetNumValuesReturnedForGLGet(pname, &num_values);
   1243   Result* result = GetSharedMemoryAs<Result*>(
   1244       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
   1245   GLfloat* params = result ? result->GetData() : NULL;
   1246   if (!validators_->get_tex_param_target.IsValid(target)) {
   1247     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameterfv", target, "target");
   1248     return error::kNoError;
   1249   }
   1250   if (!validators_->texture_parameter.IsValid(pname)) {
   1251     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameterfv", pname, "pname");
   1252     return error::kNoError;
   1253   }
   1254   if (params == NULL) {
   1255     return error::kOutOfBounds;
   1256   }
   1257   LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetTexParameterfv");
   1258   // Check that the client initialized the result.
   1259   if (result->size != 0) {
   1260     return error::kInvalidArguments;
   1261   }
   1262   DoGetTexParameterfv(target, pname, params);
   1263   GLenum error = glGetError();
   1264   if (error == GL_NO_ERROR) {
   1265     result->SetNumResults(num_values);
   1266   } else {
   1267     LOCAL_SET_GL_ERROR(error, "GetTexParameterfv", "");
   1268   }
   1269   return error::kNoError;
   1270 }
   1271 
   1272 error::Error GLES2DecoderImpl::HandleGetTexParameteriv(
   1273     uint32_t immediate_data_size,
   1274     const void* cmd_data) {
   1275   const gles2::cmds::GetTexParameteriv& c =
   1276       *static_cast<const gles2::cmds::GetTexParameteriv*>(cmd_data);
   1277   (void)c;
   1278   GLenum target = static_cast<GLenum>(c.target);
   1279   GLenum pname = static_cast<GLenum>(c.pname);
   1280   typedef cmds::GetTexParameteriv::Result Result;
   1281   GLsizei num_values = 0;
   1282   GetNumValuesReturnedForGLGet(pname, &num_values);
   1283   Result* result = GetSharedMemoryAs<Result*>(
   1284       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
   1285   GLint* params = result ? result->GetData() : NULL;
   1286   if (!validators_->get_tex_param_target.IsValid(target)) {
   1287     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameteriv", target, "target");
   1288     return error::kNoError;
   1289   }
   1290   if (!validators_->texture_parameter.IsValid(pname)) {
   1291     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameteriv", pname, "pname");
   1292     return error::kNoError;
   1293   }
   1294   if (params == NULL) {
   1295     return error::kOutOfBounds;
   1296   }
   1297   LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetTexParameteriv");
   1298   // Check that the client initialized the result.
   1299   if (result->size != 0) {
   1300     return error::kInvalidArguments;
   1301   }
   1302   DoGetTexParameteriv(target, pname, params);
   1303   GLenum error = glGetError();
   1304   if (error == GL_NO_ERROR) {
   1305     result->SetNumResults(num_values);
   1306   } else {
   1307     LOCAL_SET_GL_ERROR(error, "GetTexParameteriv", "");
   1308   }
   1309   return error::kNoError;
   1310 }
   1311 
   1312 error::Error GLES2DecoderImpl::HandleGetVertexAttribfv(
   1313     uint32_t immediate_data_size,
   1314     const void* cmd_data) {
   1315   const gles2::cmds::GetVertexAttribfv& c =
   1316       *static_cast<const gles2::cmds::GetVertexAttribfv*>(cmd_data);
   1317   (void)c;
   1318   GLuint index = static_cast<GLuint>(c.index);
   1319   GLenum pname = static_cast<GLenum>(c.pname);
   1320   typedef cmds::GetVertexAttribfv::Result Result;
   1321   GLsizei num_values = 0;
   1322   GetNumValuesReturnedForGLGet(pname, &num_values);
   1323   Result* result = GetSharedMemoryAs<Result*>(
   1324       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
   1325   GLfloat* params = result ? result->GetData() : NULL;
   1326   if (!validators_->vertex_attribute.IsValid(pname)) {
   1327     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribfv", pname, "pname");
   1328     return error::kNoError;
   1329   }
   1330   if (params == NULL) {
   1331     return error::kOutOfBounds;
   1332   }
   1333   LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribfv");
   1334   // Check that the client initialized the result.
   1335   if (result->size != 0) {
   1336     return error::kInvalidArguments;
   1337   }
   1338   DoGetVertexAttribfv(index, pname, params);
   1339   GLenum error = glGetError();
   1340   if (error == GL_NO_ERROR) {
   1341     result->SetNumResults(num_values);
   1342   } else {
   1343     LOCAL_SET_GL_ERROR(error, "GetVertexAttribfv", "");
   1344   }
   1345   return error::kNoError;
   1346 }
   1347 
   1348 error::Error GLES2DecoderImpl::HandleGetVertexAttribiv(
   1349     uint32_t immediate_data_size,
   1350     const void* cmd_data) {
   1351   const gles2::cmds::GetVertexAttribiv& c =
   1352       *static_cast<const gles2::cmds::GetVertexAttribiv*>(cmd_data);
   1353   (void)c;
   1354   GLuint index = static_cast<GLuint>(c.index);
   1355   GLenum pname = static_cast<GLenum>(c.pname);
   1356   typedef cmds::GetVertexAttribiv::Result Result;
   1357   GLsizei num_values = 0;
   1358   GetNumValuesReturnedForGLGet(pname, &num_values);
   1359   Result* result = GetSharedMemoryAs<Result*>(
   1360       c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
   1361   GLint* params = result ? result->GetData() : NULL;
   1362   if (!validators_->vertex_attribute.IsValid(pname)) {
   1363     LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribiv", pname, "pname");
   1364     return error::kNoError;
   1365   }
   1366   if (params == NULL) {
   1367     return error::kOutOfBounds;
   1368   }
   1369   LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribiv");
   1370   // Check that the client initialized the result.
   1371   if (result->size != 0) {
   1372     return error::kInvalidArguments;
   1373   }
   1374   DoGetVertexAttribiv(index, pname, params);
   1375   GLenum error = glGetError();
   1376   if (error == GL_NO_ERROR) {
   1377     result->SetNumResults(num_values);
   1378   } else {
   1379     LOCAL_SET_GL_ERROR(error, "GetVertexAttribiv", "");
   1380   }
   1381   return error::kNoError;
   1382 }
   1383 
   1384 error::Error GLES2DecoderImpl::HandleHint(uint32_t immediate_data_size,
   1385                                           const void* cmd_data) {
   1386   const gles2::cmds::Hint& c = *static_cast<const gles2::cmds::Hint*>(cmd_data);
   1387   (void)c;
   1388   GLenum target = static_cast<GLenum>(c.target);
   1389   GLenum mode = static_cast<GLenum>(c.mode);
   1390   if (!validators_->hint_target.IsValid(target)) {
   1391     LOCAL_SET_GL_ERROR_INVALID_ENUM("glHint", target, "target");
   1392     return error::kNoError;
   1393   }
   1394   if (!validators_->hint_mode.IsValid(mode)) {
   1395     LOCAL_SET_GL_ERROR_INVALID_ENUM("glHint", mode, "mode");
   1396     return error::kNoError;
   1397   }
   1398   switch (target) {
   1399     case GL_GENERATE_MIPMAP_HINT:
   1400       if (state_.hint_generate_mipmap != mode) {
   1401         state_.hint_generate_mipmap = mode;
   1402         glHint(target, mode);
   1403       }
   1404       break;
   1405     case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
   1406       if (state_.hint_fragment_shader_derivative != mode) {
   1407         state_.hint_fragment_shader_derivative = mode;
   1408         glHint(target, mode);
   1409       }
   1410       break;
   1411     default:
   1412       NOTREACHED();
   1413   }
   1414   return error::kNoError;
   1415 }
   1416 
   1417 error::Error GLES2DecoderImpl::HandleIsBuffer(uint32_t immediate_data_size,
   1418                                               const void* cmd_data) {
   1419   const gles2::cmds::IsBuffer& c =
   1420       *static_cast<const gles2::cmds::IsBuffer*>(cmd_data);
   1421   (void)c;
   1422   GLuint buffer = c.buffer;
   1423   typedef cmds::IsBuffer::Result Result;
   1424   Result* result_dst = GetSharedMemoryAs<Result*>(
   1425       c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
   1426   if (!result_dst) {
   1427     return error::kOutOfBounds;
   1428   }
   1429   *result_dst = DoIsBuffer(buffer);
   1430   return error::kNoError;
   1431 }
   1432 
   1433 error::Error GLES2DecoderImpl::HandleIsEnabled(uint32_t immediate_data_size,
   1434                                                const void* cmd_data) {
   1435   const gles2::cmds::IsEnabled& c =
   1436       *static_cast<const gles2::cmds::IsEnabled*>(cmd_data);
   1437   (void)c;
   1438   GLenum cap = static_cast<GLenum>(c.cap);
   1439   typedef cmds::IsEnabled::Result Result;
   1440   Result* result_dst = GetSharedMemoryAs<Result*>(
   1441       c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
   1442   if (!result_dst) {
   1443     return error::kOutOfBounds;
   1444   }
   1445   if (!validators_->capability.IsValid(cap)) {
   1446     LOCAL_SET_GL_ERROR_INVALID_ENUM("glIsEnabled", cap, "cap");
   1447     return error::kNoError;
   1448   }
   1449   *result_dst = DoIsEnabled(cap);
   1450   return error::kNoError;
   1451 }
   1452 
   1453 error::Error GLES2DecoderImpl::HandleIsFramebuffer(uint32_t immediate_data_size,
   1454                                                    const void* cmd_data) {
   1455   const gles2::cmds::IsFramebuffer& c =
   1456       *static_cast<const gles2::cmds::IsFramebuffer*>(cmd_data);
   1457   (void)c;
   1458   GLuint framebuffer = c.framebuffer;
   1459   typedef cmds::IsFramebuffer::Result Result;
   1460   Result* result_dst = GetSharedMemoryAs<Result*>(
   1461       c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
   1462   if (!result_dst) {
   1463     return error::kOutOfBounds;
   1464   }
   1465   *result_dst = DoIsFramebuffer(framebuffer);
   1466   return error::kNoError;
   1467 }
   1468 
   1469 error::Error GLES2DecoderImpl::HandleIsProgram(uint32_t immediate_data_size,
   1470                                                const void* cmd_data) {
   1471   const gles2::cmds::IsProgram& c =
   1472       *static_cast<const gles2::cmds::IsProgram*>(cmd_data);
   1473   (void)c;
   1474   GLuint program = c.program;
   1475   typedef cmds::IsProgram::Result Result;
   1476   Result* result_dst = GetSharedMemoryAs<Result*>(
   1477       c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
   1478   if (!result_dst) {
   1479     return error::kOutOfBounds;
   1480   }
   1481   *result_dst = DoIsProgram(program);
   1482   return error::kNoError;
   1483 }
   1484 
   1485 error::Error GLES2DecoderImpl::HandleIsRenderbuffer(
   1486     uint32_t immediate_data_size,
   1487     const void* cmd_data) {
   1488   const gles2::cmds::IsRenderbuffer& c =
   1489       *static_cast<const gles2::cmds::IsRenderbuffer*>(cmd_data);
   1490   (void)c;
   1491   GLuint renderbuffer = c.renderbuffer;
   1492   typedef cmds::IsRenderbuffer::Result Result;
   1493   Result* result_dst = GetSharedMemoryAs<Result*>(
   1494       c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
   1495   if (!result_dst) {
   1496     return error::kOutOfBounds;
   1497   }
   1498   *result_dst = DoIsRenderbuffer(renderbuffer);
   1499   return error::kNoError;
   1500 }
   1501 
   1502 error::Error GLES2DecoderImpl::HandleIsShader(uint32_t immediate_data_size,
   1503                                               const void* cmd_data) {
   1504   const gles2::cmds::IsShader& c =
   1505       *static_cast<const gles2::cmds::IsShader*>(cmd_data);
   1506   (void)c;
   1507   GLuint shader = c.shader;
   1508   typedef cmds::IsShader::Result Result;
   1509   Result* result_dst = GetSharedMemoryAs<Result*>(
   1510       c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
   1511   if (!result_dst) {
   1512     return error::kOutOfBounds;
   1513   }
   1514   *result_dst = DoIsShader(shader);
   1515   return error::kNoError;
   1516 }
   1517 
   1518 error::Error GLES2DecoderImpl::HandleIsTexture(uint32_t immediate_data_size,
   1519                                                const void* cmd_data) {
   1520   const gles2::cmds::IsTexture& c =
   1521       *static_cast<const gles2::cmds::IsTexture*>(cmd_data);
   1522   (void)c;
   1523   GLuint texture = c.texture;
   1524   typedef cmds::IsTexture::Result Result;
   1525   Result* result_dst = GetSharedMemoryAs<Result*>(
   1526       c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
   1527   if (!result_dst) {
   1528     return error::kOutOfBounds;
   1529   }
   1530   *result_dst = DoIsTexture(texture);
   1531   return error::kNoError;
   1532 }
   1533 
   1534 error::Error GLES2DecoderImpl::HandleLineWidth(uint32_t immediate_data_size,
   1535                                                const void* cmd_data) {
   1536   const gles2::cmds::LineWidth& c =
   1537       *static_cast<const gles2::cmds::LineWidth*>(cmd_data);
   1538   (void)c;
   1539   GLfloat width = static_cast<GLfloat>(c.width);
   1540   if (width <= 0.0f || base::IsNaN(width)) {
   1541     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "LineWidth", "width out of range");
   1542     return error::kNoError;
   1543   }
   1544   if (state_.line_width != width) {
   1545     state_.line_width = width;
   1546     glLineWidth(width);
   1547   }
   1548   return error::kNoError;
   1549 }
   1550 
   1551 error::Error GLES2DecoderImpl::HandleLinkProgram(uint32_t immediate_data_size,
   1552                                                  const void* cmd_data) {
   1553   const gles2::cmds::LinkProgram& c =
   1554       *static_cast<const gles2::cmds::LinkProgram*>(cmd_data);
   1555   (void)c;
   1556   GLuint program = c.program;
   1557   DoLinkProgram(program);
   1558   return error::kNoError;
   1559 }
   1560 
   1561 error::Error GLES2DecoderImpl::HandlePolygonOffset(uint32_t immediate_data_size,
   1562                                                    const void* cmd_data) {
   1563   const gles2::cmds::PolygonOffset& c =
   1564       *static_cast<const gles2::cmds::PolygonOffset*>(cmd_data);
   1565   (void)c;
   1566   GLfloat factor = static_cast<GLfloat>(c.factor);
   1567   GLfloat units = static_cast<GLfloat>(c.units);
   1568   if (state_.polygon_offset_factor != factor ||
   1569       state_.polygon_offset_units != units) {
   1570     state_.polygon_offset_factor = factor;
   1571     state_.polygon_offset_units = units;
   1572     glPolygonOffset(factor, units);
   1573   }
   1574   return error::kNoError;
   1575 }
   1576 
   1577 error::Error GLES2DecoderImpl::HandleReleaseShaderCompiler(
   1578     uint32_t immediate_data_size,
   1579     const void* cmd_data) {
   1580   const gles2::cmds::ReleaseShaderCompiler& c =
   1581       *static_cast<const gles2::cmds::ReleaseShaderCompiler*>(cmd_data);
   1582   (void)c;
   1583   DoReleaseShaderCompiler();
   1584   return error::kNoError;
   1585 }
   1586 
   1587 error::Error GLES2DecoderImpl::HandleRenderbufferStorage(
   1588     uint32_t immediate_data_size,
   1589     const void* cmd_data) {
   1590   const gles2::cmds::RenderbufferStorage& c =
   1591       *static_cast<const gles2::cmds::RenderbufferStorage*>(cmd_data);
   1592   (void)c;
   1593   GLenum target = static_cast<GLenum>(c.target);
   1594   GLenum internalformat = static_cast<GLenum>(c.internalformat);
   1595   GLsizei width = static_cast<GLsizei>(c.width);
   1596   GLsizei height = static_cast<GLsizei>(c.height);
   1597   if (!validators_->render_buffer_target.IsValid(target)) {
   1598     LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorage", target, "target");
   1599     return error::kNoError;
   1600   }
   1601   if (!validators_->render_buffer_format.IsValid(internalformat)) {
   1602     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   1603         "glRenderbufferStorage", internalformat, "internalformat");
   1604     return error::kNoError;
   1605   }
   1606   if (width < 0) {
   1607     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glRenderbufferStorage", "width < 0");
   1608     return error::kNoError;
   1609   }
   1610   if (height < 0) {
   1611     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glRenderbufferStorage", "height < 0");
   1612     return error::kNoError;
   1613   }
   1614   DoRenderbufferStorage(target, internalformat, width, height);
   1615   return error::kNoError;
   1616 }
   1617 
   1618 error::Error GLES2DecoderImpl::HandleSampleCoverage(
   1619     uint32_t immediate_data_size,
   1620     const void* cmd_data) {
   1621   const gles2::cmds::SampleCoverage& c =
   1622       *static_cast<const gles2::cmds::SampleCoverage*>(cmd_data);
   1623   (void)c;
   1624   GLclampf value = static_cast<GLclampf>(c.value);
   1625   GLboolean invert = static_cast<GLboolean>(c.invert);
   1626   DoSampleCoverage(value, invert);
   1627   return error::kNoError;
   1628 }
   1629 
   1630 error::Error GLES2DecoderImpl::HandleScissor(uint32_t immediate_data_size,
   1631                                              const void* cmd_data) {
   1632   const gles2::cmds::Scissor& c =
   1633       *static_cast<const gles2::cmds::Scissor*>(cmd_data);
   1634   (void)c;
   1635   GLint x = static_cast<GLint>(c.x);
   1636   GLint y = static_cast<GLint>(c.y);
   1637   GLsizei width = static_cast<GLsizei>(c.width);
   1638   GLsizei height = static_cast<GLsizei>(c.height);
   1639   if (width < 0) {
   1640     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glScissor", "width < 0");
   1641     return error::kNoError;
   1642   }
   1643   if (height < 0) {
   1644     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glScissor", "height < 0");
   1645     return error::kNoError;
   1646   }
   1647   if (state_.scissor_x != x || state_.scissor_y != y ||
   1648       state_.scissor_width != width || state_.scissor_height != height) {
   1649     state_.scissor_x = x;
   1650     state_.scissor_y = y;
   1651     state_.scissor_width = width;
   1652     state_.scissor_height = height;
   1653     glScissor(x, y, width, height);
   1654   }
   1655   return error::kNoError;
   1656 }
   1657 
   1658 error::Error GLES2DecoderImpl::HandleStencilFunc(uint32_t immediate_data_size,
   1659                                                  const void* cmd_data) {
   1660   const gles2::cmds::StencilFunc& c =
   1661       *static_cast<const gles2::cmds::StencilFunc*>(cmd_data);
   1662   (void)c;
   1663   GLenum func = static_cast<GLenum>(c.func);
   1664   GLint ref = static_cast<GLint>(c.ref);
   1665   GLuint mask = static_cast<GLuint>(c.mask);
   1666   if (!validators_->cmp_function.IsValid(func)) {
   1667     LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFunc", func, "func");
   1668     return error::kNoError;
   1669   }
   1670   if (state_.stencil_front_func != func || state_.stencil_front_ref != ref ||
   1671       state_.stencil_front_mask != mask || state_.stencil_back_func != func ||
   1672       state_.stencil_back_ref != ref || state_.stencil_back_mask != mask) {
   1673     state_.stencil_front_func = func;
   1674     state_.stencil_front_ref = ref;
   1675     state_.stencil_front_mask = mask;
   1676     state_.stencil_back_func = func;
   1677     state_.stencil_back_ref = ref;
   1678     state_.stencil_back_mask = mask;
   1679     glStencilFunc(func, ref, mask);
   1680   }
   1681   return error::kNoError;
   1682 }
   1683 
   1684 error::Error GLES2DecoderImpl::HandleStencilFuncSeparate(
   1685     uint32_t immediate_data_size,
   1686     const void* cmd_data) {
   1687   const gles2::cmds::StencilFuncSeparate& c =
   1688       *static_cast<const gles2::cmds::StencilFuncSeparate*>(cmd_data);
   1689   (void)c;
   1690   GLenum face = static_cast<GLenum>(c.face);
   1691   GLenum func = static_cast<GLenum>(c.func);
   1692   GLint ref = static_cast<GLint>(c.ref);
   1693   GLuint mask = static_cast<GLuint>(c.mask);
   1694   if (!validators_->face_type.IsValid(face)) {
   1695     LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFuncSeparate", face, "face");
   1696     return error::kNoError;
   1697   }
   1698   if (!validators_->cmp_function.IsValid(func)) {
   1699     LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFuncSeparate", func, "func");
   1700     return error::kNoError;
   1701   }
   1702   bool changed = false;
   1703   if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
   1704     changed |= state_.stencil_front_func != func ||
   1705                state_.stencil_front_ref != ref ||
   1706                state_.stencil_front_mask != mask;
   1707   }
   1708   if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
   1709     changed |= state_.stencil_back_func != func ||
   1710                state_.stencil_back_ref != ref ||
   1711                state_.stencil_back_mask != mask;
   1712   }
   1713   if (changed) {
   1714     if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
   1715       state_.stencil_front_func = func;
   1716       state_.stencil_front_ref = ref;
   1717       state_.stencil_front_mask = mask;
   1718     }
   1719     if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
   1720       state_.stencil_back_func = func;
   1721       state_.stencil_back_ref = ref;
   1722       state_.stencil_back_mask = mask;
   1723     }
   1724     glStencilFuncSeparate(face, func, ref, mask);
   1725   }
   1726   return error::kNoError;
   1727 }
   1728 
   1729 error::Error GLES2DecoderImpl::HandleStencilMask(uint32_t immediate_data_size,
   1730                                                  const void* cmd_data) {
   1731   const gles2::cmds::StencilMask& c =
   1732       *static_cast<const gles2::cmds::StencilMask*>(cmd_data);
   1733   (void)c;
   1734   GLuint mask = static_cast<GLuint>(c.mask);
   1735   if (state_.stencil_front_writemask != mask ||
   1736       state_.stencil_back_writemask != mask) {
   1737     state_.stencil_front_writemask = mask;
   1738     state_.stencil_back_writemask = mask;
   1739     framebuffer_state_.clear_state_dirty = true;
   1740   }
   1741   return error::kNoError;
   1742 }
   1743 
   1744 error::Error GLES2DecoderImpl::HandleStencilMaskSeparate(
   1745     uint32_t immediate_data_size,
   1746     const void* cmd_data) {
   1747   const gles2::cmds::StencilMaskSeparate& c =
   1748       *static_cast<const gles2::cmds::StencilMaskSeparate*>(cmd_data);
   1749   (void)c;
   1750   GLenum face = static_cast<GLenum>(c.face);
   1751   GLuint mask = static_cast<GLuint>(c.mask);
   1752   if (!validators_->face_type.IsValid(face)) {
   1753     LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilMaskSeparate", face, "face");
   1754     return error::kNoError;
   1755   }
   1756   bool changed = false;
   1757   if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
   1758     changed |= state_.stencil_front_writemask != mask;
   1759   }
   1760   if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
   1761     changed |= state_.stencil_back_writemask != mask;
   1762   }
   1763   if (changed) {
   1764     if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
   1765       state_.stencil_front_writemask = mask;
   1766     }
   1767     if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
   1768       state_.stencil_back_writemask = mask;
   1769     }
   1770     framebuffer_state_.clear_state_dirty = true;
   1771   }
   1772   return error::kNoError;
   1773 }
   1774 
   1775 error::Error GLES2DecoderImpl::HandleStencilOp(uint32_t immediate_data_size,
   1776                                                const void* cmd_data) {
   1777   const gles2::cmds::StencilOp& c =
   1778       *static_cast<const gles2::cmds::StencilOp*>(cmd_data);
   1779   (void)c;
   1780   GLenum fail = static_cast<GLenum>(c.fail);
   1781   GLenum zfail = static_cast<GLenum>(c.zfail);
   1782   GLenum zpass = static_cast<GLenum>(c.zpass);
   1783   if (!validators_->stencil_op.IsValid(fail)) {
   1784     LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", fail, "fail");
   1785     return error::kNoError;
   1786   }
   1787   if (!validators_->stencil_op.IsValid(zfail)) {
   1788     LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", zfail, "zfail");
   1789     return error::kNoError;
   1790   }
   1791   if (!validators_->stencil_op.IsValid(zpass)) {
   1792     LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", zpass, "zpass");
   1793     return error::kNoError;
   1794   }
   1795   if (state_.stencil_front_fail_op != fail ||
   1796       state_.stencil_front_z_fail_op != zfail ||
   1797       state_.stencil_front_z_pass_op != zpass ||
   1798       state_.stencil_back_fail_op != fail ||
   1799       state_.stencil_back_z_fail_op != zfail ||
   1800       state_.stencil_back_z_pass_op != zpass) {
   1801     state_.stencil_front_fail_op = fail;
   1802     state_.stencil_front_z_fail_op = zfail;
   1803     state_.stencil_front_z_pass_op = zpass;
   1804     state_.stencil_back_fail_op = fail;
   1805     state_.stencil_back_z_fail_op = zfail;
   1806     state_.stencil_back_z_pass_op = zpass;
   1807     glStencilOp(fail, zfail, zpass);
   1808   }
   1809   return error::kNoError;
   1810 }
   1811 
   1812 error::Error GLES2DecoderImpl::HandleStencilOpSeparate(
   1813     uint32_t immediate_data_size,
   1814     const void* cmd_data) {
   1815   const gles2::cmds::StencilOpSeparate& c =
   1816       *static_cast<const gles2::cmds::StencilOpSeparate*>(cmd_data);
   1817   (void)c;
   1818   GLenum face = static_cast<GLenum>(c.face);
   1819   GLenum fail = static_cast<GLenum>(c.fail);
   1820   GLenum zfail = static_cast<GLenum>(c.zfail);
   1821   GLenum zpass = static_cast<GLenum>(c.zpass);
   1822   if (!validators_->face_type.IsValid(face)) {
   1823     LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", face, "face");
   1824     return error::kNoError;
   1825   }
   1826   if (!validators_->stencil_op.IsValid(fail)) {
   1827     LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", fail, "fail");
   1828     return error::kNoError;
   1829   }
   1830   if (!validators_->stencil_op.IsValid(zfail)) {
   1831     LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", zfail, "zfail");
   1832     return error::kNoError;
   1833   }
   1834   if (!validators_->stencil_op.IsValid(zpass)) {
   1835     LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", zpass, "zpass");
   1836     return error::kNoError;
   1837   }
   1838   bool changed = false;
   1839   if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
   1840     changed |= state_.stencil_front_fail_op != fail ||
   1841                state_.stencil_front_z_fail_op != zfail ||
   1842                state_.stencil_front_z_pass_op != zpass;
   1843   }
   1844   if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
   1845     changed |= state_.stencil_back_fail_op != fail ||
   1846                state_.stencil_back_z_fail_op != zfail ||
   1847                state_.stencil_back_z_pass_op != zpass;
   1848   }
   1849   if (changed) {
   1850     if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
   1851       state_.stencil_front_fail_op = fail;
   1852       state_.stencil_front_z_fail_op = zfail;
   1853       state_.stencil_front_z_pass_op = zpass;
   1854     }
   1855     if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
   1856       state_.stencil_back_fail_op = fail;
   1857       state_.stencil_back_z_fail_op = zfail;
   1858       state_.stencil_back_z_pass_op = zpass;
   1859     }
   1860     glStencilOpSeparate(face, fail, zfail, zpass);
   1861   }
   1862   return error::kNoError;
   1863 }
   1864 
   1865 error::Error GLES2DecoderImpl::HandleTexParameterf(uint32_t immediate_data_size,
   1866                                                    const void* cmd_data) {
   1867   const gles2::cmds::TexParameterf& c =
   1868       *static_cast<const gles2::cmds::TexParameterf*>(cmd_data);
   1869   (void)c;
   1870   GLenum target = static_cast<GLenum>(c.target);
   1871   GLenum pname = static_cast<GLenum>(c.pname);
   1872   GLfloat param = static_cast<GLfloat>(c.param);
   1873   if (!validators_->texture_bind_target.IsValid(target)) {
   1874     LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterf", target, "target");
   1875     return error::kNoError;
   1876   }
   1877   if (!validators_->texture_parameter.IsValid(pname)) {
   1878     LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterf", pname, "pname");
   1879     return error::kNoError;
   1880   }
   1881   DoTexParameterf(target, pname, param);
   1882   return error::kNoError;
   1883 }
   1884 
   1885 error::Error GLES2DecoderImpl::HandleTexParameterfvImmediate(
   1886     uint32_t immediate_data_size,
   1887     const void* cmd_data) {
   1888   const gles2::cmds::TexParameterfvImmediate& c =
   1889       *static_cast<const gles2::cmds::TexParameterfvImmediate*>(cmd_data);
   1890   (void)c;
   1891   GLenum target = static_cast<GLenum>(c.target);
   1892   GLenum pname = static_cast<GLenum>(c.pname);
   1893   uint32_t data_size;
   1894   if (!ComputeDataSize(1, sizeof(GLfloat), 1, &data_size)) {
   1895     return error::kOutOfBounds;
   1896   }
   1897   if (data_size > immediate_data_size) {
   1898     return error::kOutOfBounds;
   1899   }
   1900   const GLfloat* params =
   1901       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   1902   if (!validators_->texture_bind_target.IsValid(target)) {
   1903     LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", target, "target");
   1904     return error::kNoError;
   1905   }
   1906   if (!validators_->texture_parameter.IsValid(pname)) {
   1907     LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", pname, "pname");
   1908     return error::kNoError;
   1909   }
   1910   if (params == NULL) {
   1911     return error::kOutOfBounds;
   1912   }
   1913   DoTexParameterfv(target, pname, params);
   1914   return error::kNoError;
   1915 }
   1916 
   1917 error::Error GLES2DecoderImpl::HandleTexParameteri(uint32_t immediate_data_size,
   1918                                                    const void* cmd_data) {
   1919   const gles2::cmds::TexParameteri& c =
   1920       *static_cast<const gles2::cmds::TexParameteri*>(cmd_data);
   1921   (void)c;
   1922   GLenum target = static_cast<GLenum>(c.target);
   1923   GLenum pname = static_cast<GLenum>(c.pname);
   1924   GLint param = static_cast<GLint>(c.param);
   1925   if (!validators_->texture_bind_target.IsValid(target)) {
   1926     LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", target, "target");
   1927     return error::kNoError;
   1928   }
   1929   if (!validators_->texture_parameter.IsValid(pname)) {
   1930     LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", pname, "pname");
   1931     return error::kNoError;
   1932   }
   1933   DoTexParameteri(target, pname, param);
   1934   return error::kNoError;
   1935 }
   1936 
   1937 error::Error GLES2DecoderImpl::HandleTexParameterivImmediate(
   1938     uint32_t immediate_data_size,
   1939     const void* cmd_data) {
   1940   const gles2::cmds::TexParameterivImmediate& c =
   1941       *static_cast<const gles2::cmds::TexParameterivImmediate*>(cmd_data);
   1942   (void)c;
   1943   GLenum target = static_cast<GLenum>(c.target);
   1944   GLenum pname = static_cast<GLenum>(c.pname);
   1945   uint32_t data_size;
   1946   if (!ComputeDataSize(1, sizeof(GLint), 1, &data_size)) {
   1947     return error::kOutOfBounds;
   1948   }
   1949   if (data_size > immediate_data_size) {
   1950     return error::kOutOfBounds;
   1951   }
   1952   const GLint* params =
   1953       GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
   1954   if (!validators_->texture_bind_target.IsValid(target)) {
   1955     LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", target, "target");
   1956     return error::kNoError;
   1957   }
   1958   if (!validators_->texture_parameter.IsValid(pname)) {
   1959     LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", pname, "pname");
   1960     return error::kNoError;
   1961   }
   1962   if (params == NULL) {
   1963     return error::kOutOfBounds;
   1964   }
   1965   DoTexParameteriv(target, pname, params);
   1966   return error::kNoError;
   1967 }
   1968 
   1969 error::Error GLES2DecoderImpl::HandleUniform1f(uint32_t immediate_data_size,
   1970                                                const void* cmd_data) {
   1971   const gles2::cmds::Uniform1f& c =
   1972       *static_cast<const gles2::cmds::Uniform1f*>(cmd_data);
   1973   (void)c;
   1974   GLint location = static_cast<GLint>(c.location);
   1975   GLfloat x = static_cast<GLfloat>(c.x);
   1976   GLfloat temp[1] = {
   1977       x,
   1978   };
   1979   DoUniform1fv(location, 1, &temp[0]);
   1980   return error::kNoError;
   1981 }
   1982 
   1983 error::Error GLES2DecoderImpl::HandleUniform1fvImmediate(
   1984     uint32_t immediate_data_size,
   1985     const void* cmd_data) {
   1986   const gles2::cmds::Uniform1fvImmediate& c =
   1987       *static_cast<const gles2::cmds::Uniform1fvImmediate*>(cmd_data);
   1988   (void)c;
   1989   GLint location = static_cast<GLint>(c.location);
   1990   GLsizei count = static_cast<GLsizei>(c.count);
   1991   uint32_t data_size;
   1992   if (!ComputeDataSize(count, sizeof(GLfloat), 1, &data_size)) {
   1993     return error::kOutOfBounds;
   1994   }
   1995   if (data_size > immediate_data_size) {
   1996     return error::kOutOfBounds;
   1997   }
   1998   const GLfloat* v =
   1999       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   2000   if (v == NULL) {
   2001     return error::kOutOfBounds;
   2002   }
   2003   DoUniform1fv(location, count, v);
   2004   return error::kNoError;
   2005 }
   2006 
   2007 error::Error GLES2DecoderImpl::HandleUniform1i(uint32_t immediate_data_size,
   2008                                                const void* cmd_data) {
   2009   const gles2::cmds::Uniform1i& c =
   2010       *static_cast<const gles2::cmds::Uniform1i*>(cmd_data);
   2011   (void)c;
   2012   GLint location = static_cast<GLint>(c.location);
   2013   GLint x = static_cast<GLint>(c.x);
   2014   DoUniform1i(location, x);
   2015   return error::kNoError;
   2016 }
   2017 
   2018 error::Error GLES2DecoderImpl::HandleUniform1ivImmediate(
   2019     uint32_t immediate_data_size,
   2020     const void* cmd_data) {
   2021   const gles2::cmds::Uniform1ivImmediate& c =
   2022       *static_cast<const gles2::cmds::Uniform1ivImmediate*>(cmd_data);
   2023   (void)c;
   2024   GLint location = static_cast<GLint>(c.location);
   2025   GLsizei count = static_cast<GLsizei>(c.count);
   2026   uint32_t data_size;
   2027   if (!ComputeDataSize(count, sizeof(GLint), 1, &data_size)) {
   2028     return error::kOutOfBounds;
   2029   }
   2030   if (data_size > immediate_data_size) {
   2031     return error::kOutOfBounds;
   2032   }
   2033   const GLint* v =
   2034       GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
   2035   if (v == NULL) {
   2036     return error::kOutOfBounds;
   2037   }
   2038   DoUniform1iv(location, count, v);
   2039   return error::kNoError;
   2040 }
   2041 
   2042 error::Error GLES2DecoderImpl::HandleUniform2f(uint32_t immediate_data_size,
   2043                                                const void* cmd_data) {
   2044   const gles2::cmds::Uniform2f& c =
   2045       *static_cast<const gles2::cmds::Uniform2f*>(cmd_data);
   2046   (void)c;
   2047   GLint location = static_cast<GLint>(c.location);
   2048   GLfloat x = static_cast<GLfloat>(c.x);
   2049   GLfloat y = static_cast<GLfloat>(c.y);
   2050   GLfloat temp[2] = {
   2051       x, y,
   2052   };
   2053   DoUniform2fv(location, 1, &temp[0]);
   2054   return error::kNoError;
   2055 }
   2056 
   2057 error::Error GLES2DecoderImpl::HandleUniform2fvImmediate(
   2058     uint32_t immediate_data_size,
   2059     const void* cmd_data) {
   2060   const gles2::cmds::Uniform2fvImmediate& c =
   2061       *static_cast<const gles2::cmds::Uniform2fvImmediate*>(cmd_data);
   2062   (void)c;
   2063   GLint location = static_cast<GLint>(c.location);
   2064   GLsizei count = static_cast<GLsizei>(c.count);
   2065   uint32_t data_size;
   2066   if (!ComputeDataSize(count, sizeof(GLfloat), 2, &data_size)) {
   2067     return error::kOutOfBounds;
   2068   }
   2069   if (data_size > immediate_data_size) {
   2070     return error::kOutOfBounds;
   2071   }
   2072   const GLfloat* v =
   2073       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   2074   if (v == NULL) {
   2075     return error::kOutOfBounds;
   2076   }
   2077   DoUniform2fv(location, count, v);
   2078   return error::kNoError;
   2079 }
   2080 
   2081 error::Error GLES2DecoderImpl::HandleUniform2i(uint32_t immediate_data_size,
   2082                                                const void* cmd_data) {
   2083   const gles2::cmds::Uniform2i& c =
   2084       *static_cast<const gles2::cmds::Uniform2i*>(cmd_data);
   2085   (void)c;
   2086   GLint location = static_cast<GLint>(c.location);
   2087   GLint x = static_cast<GLint>(c.x);
   2088   GLint y = static_cast<GLint>(c.y);
   2089   GLint temp[2] = {
   2090       x, y,
   2091   };
   2092   DoUniform2iv(location, 1, &temp[0]);
   2093   return error::kNoError;
   2094 }
   2095 
   2096 error::Error GLES2DecoderImpl::HandleUniform2ivImmediate(
   2097     uint32_t immediate_data_size,
   2098     const void* cmd_data) {
   2099   const gles2::cmds::Uniform2ivImmediate& c =
   2100       *static_cast<const gles2::cmds::Uniform2ivImmediate*>(cmd_data);
   2101   (void)c;
   2102   GLint location = static_cast<GLint>(c.location);
   2103   GLsizei count = static_cast<GLsizei>(c.count);
   2104   uint32_t data_size;
   2105   if (!ComputeDataSize(count, sizeof(GLint), 2, &data_size)) {
   2106     return error::kOutOfBounds;
   2107   }
   2108   if (data_size > immediate_data_size) {
   2109     return error::kOutOfBounds;
   2110   }
   2111   const GLint* v =
   2112       GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
   2113   if (v == NULL) {
   2114     return error::kOutOfBounds;
   2115   }
   2116   DoUniform2iv(location, count, v);
   2117   return error::kNoError;
   2118 }
   2119 
   2120 error::Error GLES2DecoderImpl::HandleUniform3f(uint32_t immediate_data_size,
   2121                                                const void* cmd_data) {
   2122   const gles2::cmds::Uniform3f& c =
   2123       *static_cast<const gles2::cmds::Uniform3f*>(cmd_data);
   2124   (void)c;
   2125   GLint location = static_cast<GLint>(c.location);
   2126   GLfloat x = static_cast<GLfloat>(c.x);
   2127   GLfloat y = static_cast<GLfloat>(c.y);
   2128   GLfloat z = static_cast<GLfloat>(c.z);
   2129   GLfloat temp[3] = {
   2130       x, y, z,
   2131   };
   2132   DoUniform3fv(location, 1, &temp[0]);
   2133   return error::kNoError;
   2134 }
   2135 
   2136 error::Error GLES2DecoderImpl::HandleUniform3fvImmediate(
   2137     uint32_t immediate_data_size,
   2138     const void* cmd_data) {
   2139   const gles2::cmds::Uniform3fvImmediate& c =
   2140       *static_cast<const gles2::cmds::Uniform3fvImmediate*>(cmd_data);
   2141   (void)c;
   2142   GLint location = static_cast<GLint>(c.location);
   2143   GLsizei count = static_cast<GLsizei>(c.count);
   2144   uint32_t data_size;
   2145   if (!ComputeDataSize(count, sizeof(GLfloat), 3, &data_size)) {
   2146     return error::kOutOfBounds;
   2147   }
   2148   if (data_size > immediate_data_size) {
   2149     return error::kOutOfBounds;
   2150   }
   2151   const GLfloat* v =
   2152       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   2153   if (v == NULL) {
   2154     return error::kOutOfBounds;
   2155   }
   2156   DoUniform3fv(location, count, v);
   2157   return error::kNoError;
   2158 }
   2159 
   2160 error::Error GLES2DecoderImpl::HandleUniform3i(uint32_t immediate_data_size,
   2161                                                const void* cmd_data) {
   2162   const gles2::cmds::Uniform3i& c =
   2163       *static_cast<const gles2::cmds::Uniform3i*>(cmd_data);
   2164   (void)c;
   2165   GLint location = static_cast<GLint>(c.location);
   2166   GLint x = static_cast<GLint>(c.x);
   2167   GLint y = static_cast<GLint>(c.y);
   2168   GLint z = static_cast<GLint>(c.z);
   2169   GLint temp[3] = {
   2170       x, y, z,
   2171   };
   2172   DoUniform3iv(location, 1, &temp[0]);
   2173   return error::kNoError;
   2174 }
   2175 
   2176 error::Error GLES2DecoderImpl::HandleUniform3ivImmediate(
   2177     uint32_t immediate_data_size,
   2178     const void* cmd_data) {
   2179   const gles2::cmds::Uniform3ivImmediate& c =
   2180       *static_cast<const gles2::cmds::Uniform3ivImmediate*>(cmd_data);
   2181   (void)c;
   2182   GLint location = static_cast<GLint>(c.location);
   2183   GLsizei count = static_cast<GLsizei>(c.count);
   2184   uint32_t data_size;
   2185   if (!ComputeDataSize(count, sizeof(GLint), 3, &data_size)) {
   2186     return error::kOutOfBounds;
   2187   }
   2188   if (data_size > immediate_data_size) {
   2189     return error::kOutOfBounds;
   2190   }
   2191   const GLint* v =
   2192       GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
   2193   if (v == NULL) {
   2194     return error::kOutOfBounds;
   2195   }
   2196   DoUniform3iv(location, count, v);
   2197   return error::kNoError;
   2198 }
   2199 
   2200 error::Error GLES2DecoderImpl::HandleUniform4f(uint32_t immediate_data_size,
   2201                                                const void* cmd_data) {
   2202   const gles2::cmds::Uniform4f& c =
   2203       *static_cast<const gles2::cmds::Uniform4f*>(cmd_data);
   2204   (void)c;
   2205   GLint location = static_cast<GLint>(c.location);
   2206   GLfloat x = static_cast<GLfloat>(c.x);
   2207   GLfloat y = static_cast<GLfloat>(c.y);
   2208   GLfloat z = static_cast<GLfloat>(c.z);
   2209   GLfloat w = static_cast<GLfloat>(c.w);
   2210   GLfloat temp[4] = {
   2211       x, y, z, w,
   2212   };
   2213   DoUniform4fv(location, 1, &temp[0]);
   2214   return error::kNoError;
   2215 }
   2216 
   2217 error::Error GLES2DecoderImpl::HandleUniform4fvImmediate(
   2218     uint32_t immediate_data_size,
   2219     const void* cmd_data) {
   2220   const gles2::cmds::Uniform4fvImmediate& c =
   2221       *static_cast<const gles2::cmds::Uniform4fvImmediate*>(cmd_data);
   2222   (void)c;
   2223   GLint location = static_cast<GLint>(c.location);
   2224   GLsizei count = static_cast<GLsizei>(c.count);
   2225   uint32_t data_size;
   2226   if (!ComputeDataSize(count, sizeof(GLfloat), 4, &data_size)) {
   2227     return error::kOutOfBounds;
   2228   }
   2229   if (data_size > immediate_data_size) {
   2230     return error::kOutOfBounds;
   2231   }
   2232   const GLfloat* v =
   2233       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   2234   if (v == NULL) {
   2235     return error::kOutOfBounds;
   2236   }
   2237   DoUniform4fv(location, count, v);
   2238   return error::kNoError;
   2239 }
   2240 
   2241 error::Error GLES2DecoderImpl::HandleUniform4i(uint32_t immediate_data_size,
   2242                                                const void* cmd_data) {
   2243   const gles2::cmds::Uniform4i& c =
   2244       *static_cast<const gles2::cmds::Uniform4i*>(cmd_data);
   2245   (void)c;
   2246   GLint location = static_cast<GLint>(c.location);
   2247   GLint x = static_cast<GLint>(c.x);
   2248   GLint y = static_cast<GLint>(c.y);
   2249   GLint z = static_cast<GLint>(c.z);
   2250   GLint w = static_cast<GLint>(c.w);
   2251   GLint temp[4] = {
   2252       x, y, z, w,
   2253   };
   2254   DoUniform4iv(location, 1, &temp[0]);
   2255   return error::kNoError;
   2256 }
   2257 
   2258 error::Error GLES2DecoderImpl::HandleUniform4ivImmediate(
   2259     uint32_t immediate_data_size,
   2260     const void* cmd_data) {
   2261   const gles2::cmds::Uniform4ivImmediate& c =
   2262       *static_cast<const gles2::cmds::Uniform4ivImmediate*>(cmd_data);
   2263   (void)c;
   2264   GLint location = static_cast<GLint>(c.location);
   2265   GLsizei count = static_cast<GLsizei>(c.count);
   2266   uint32_t data_size;
   2267   if (!ComputeDataSize(count, sizeof(GLint), 4, &data_size)) {
   2268     return error::kOutOfBounds;
   2269   }
   2270   if (data_size > immediate_data_size) {
   2271     return error::kOutOfBounds;
   2272   }
   2273   const GLint* v =
   2274       GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
   2275   if (v == NULL) {
   2276     return error::kOutOfBounds;
   2277   }
   2278   DoUniform4iv(location, count, v);
   2279   return error::kNoError;
   2280 }
   2281 
   2282 error::Error GLES2DecoderImpl::HandleUniformMatrix2fvImmediate(
   2283     uint32_t immediate_data_size,
   2284     const void* cmd_data) {
   2285   const gles2::cmds::UniformMatrix2fvImmediate& c =
   2286       *static_cast<const gles2::cmds::UniformMatrix2fvImmediate*>(cmd_data);
   2287   (void)c;
   2288   GLint location = static_cast<GLint>(c.location);
   2289   GLsizei count = static_cast<GLsizei>(c.count);
   2290   GLboolean transpose = static_cast<GLboolean>(c.transpose);
   2291   uint32_t data_size;
   2292   if (!ComputeDataSize(count, sizeof(GLfloat), 4, &data_size)) {
   2293     return error::kOutOfBounds;
   2294   }
   2295   if (data_size > immediate_data_size) {
   2296     return error::kOutOfBounds;
   2297   }
   2298   const GLfloat* value =
   2299       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   2300   if (value == NULL) {
   2301     return error::kOutOfBounds;
   2302   }
   2303   DoUniformMatrix2fv(location, count, transpose, value);
   2304   return error::kNoError;
   2305 }
   2306 
   2307 error::Error GLES2DecoderImpl::HandleUniformMatrix3fvImmediate(
   2308     uint32_t immediate_data_size,
   2309     const void* cmd_data) {
   2310   const gles2::cmds::UniformMatrix3fvImmediate& c =
   2311       *static_cast<const gles2::cmds::UniformMatrix3fvImmediate*>(cmd_data);
   2312   (void)c;
   2313   GLint location = static_cast<GLint>(c.location);
   2314   GLsizei count = static_cast<GLsizei>(c.count);
   2315   GLboolean transpose = static_cast<GLboolean>(c.transpose);
   2316   uint32_t data_size;
   2317   if (!ComputeDataSize(count, sizeof(GLfloat), 9, &data_size)) {
   2318     return error::kOutOfBounds;
   2319   }
   2320   if (data_size > immediate_data_size) {
   2321     return error::kOutOfBounds;
   2322   }
   2323   const GLfloat* value =
   2324       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   2325   if (value == NULL) {
   2326     return error::kOutOfBounds;
   2327   }
   2328   DoUniformMatrix3fv(location, count, transpose, value);
   2329   return error::kNoError;
   2330 }
   2331 
   2332 error::Error GLES2DecoderImpl::HandleUniformMatrix4fvImmediate(
   2333     uint32_t immediate_data_size,
   2334     const void* cmd_data) {
   2335   const gles2::cmds::UniformMatrix4fvImmediate& c =
   2336       *static_cast<const gles2::cmds::UniformMatrix4fvImmediate*>(cmd_data);
   2337   (void)c;
   2338   GLint location = static_cast<GLint>(c.location);
   2339   GLsizei count = static_cast<GLsizei>(c.count);
   2340   GLboolean transpose = static_cast<GLboolean>(c.transpose);
   2341   uint32_t data_size;
   2342   if (!ComputeDataSize(count, sizeof(GLfloat), 16, &data_size)) {
   2343     return error::kOutOfBounds;
   2344   }
   2345   if (data_size > immediate_data_size) {
   2346     return error::kOutOfBounds;
   2347   }
   2348   const GLfloat* value =
   2349       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   2350   if (value == NULL) {
   2351     return error::kOutOfBounds;
   2352   }
   2353   DoUniformMatrix4fv(location, count, transpose, value);
   2354   return error::kNoError;
   2355 }
   2356 
   2357 error::Error GLES2DecoderImpl::HandleUseProgram(uint32_t immediate_data_size,
   2358                                                 const void* cmd_data) {
   2359   const gles2::cmds::UseProgram& c =
   2360       *static_cast<const gles2::cmds::UseProgram*>(cmd_data);
   2361   (void)c;
   2362   GLuint program = c.program;
   2363   DoUseProgram(program);
   2364   return error::kNoError;
   2365 }
   2366 
   2367 error::Error GLES2DecoderImpl::HandleValidateProgram(
   2368     uint32_t immediate_data_size,
   2369     const void* cmd_data) {
   2370   const gles2::cmds::ValidateProgram& c =
   2371       *static_cast<const gles2::cmds::ValidateProgram*>(cmd_data);
   2372   (void)c;
   2373   GLuint program = c.program;
   2374   DoValidateProgram(program);
   2375   return error::kNoError;
   2376 }
   2377 
   2378 error::Error GLES2DecoderImpl::HandleVertexAttrib1f(
   2379     uint32_t immediate_data_size,
   2380     const void* cmd_data) {
   2381   const gles2::cmds::VertexAttrib1f& c =
   2382       *static_cast<const gles2::cmds::VertexAttrib1f*>(cmd_data);
   2383   (void)c;
   2384   GLuint indx = static_cast<GLuint>(c.indx);
   2385   GLfloat x = static_cast<GLfloat>(c.x);
   2386   DoVertexAttrib1f(indx, x);
   2387   return error::kNoError;
   2388 }
   2389 
   2390 error::Error GLES2DecoderImpl::HandleVertexAttrib1fvImmediate(
   2391     uint32_t immediate_data_size,
   2392     const void* cmd_data) {
   2393   const gles2::cmds::VertexAttrib1fvImmediate& c =
   2394       *static_cast<const gles2::cmds::VertexAttrib1fvImmediate*>(cmd_data);
   2395   (void)c;
   2396   GLuint indx = static_cast<GLuint>(c.indx);
   2397   uint32_t data_size;
   2398   if (!ComputeDataSize(1, sizeof(GLfloat), 1, &data_size)) {
   2399     return error::kOutOfBounds;
   2400   }
   2401   if (data_size > immediate_data_size) {
   2402     return error::kOutOfBounds;
   2403   }
   2404   const GLfloat* values =
   2405       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   2406   if (values == NULL) {
   2407     return error::kOutOfBounds;
   2408   }
   2409   DoVertexAttrib1fv(indx, values);
   2410   return error::kNoError;
   2411 }
   2412 
   2413 error::Error GLES2DecoderImpl::HandleVertexAttrib2f(
   2414     uint32_t immediate_data_size,
   2415     const void* cmd_data) {
   2416   const gles2::cmds::VertexAttrib2f& c =
   2417       *static_cast<const gles2::cmds::VertexAttrib2f*>(cmd_data);
   2418   (void)c;
   2419   GLuint indx = static_cast<GLuint>(c.indx);
   2420   GLfloat x = static_cast<GLfloat>(c.x);
   2421   GLfloat y = static_cast<GLfloat>(c.y);
   2422   DoVertexAttrib2f(indx, x, y);
   2423   return error::kNoError;
   2424 }
   2425 
   2426 error::Error GLES2DecoderImpl::HandleVertexAttrib2fvImmediate(
   2427     uint32_t immediate_data_size,
   2428     const void* cmd_data) {
   2429   const gles2::cmds::VertexAttrib2fvImmediate& c =
   2430       *static_cast<const gles2::cmds::VertexAttrib2fvImmediate*>(cmd_data);
   2431   (void)c;
   2432   GLuint indx = static_cast<GLuint>(c.indx);
   2433   uint32_t data_size;
   2434   if (!ComputeDataSize(1, sizeof(GLfloat), 2, &data_size)) {
   2435     return error::kOutOfBounds;
   2436   }
   2437   if (data_size > immediate_data_size) {
   2438     return error::kOutOfBounds;
   2439   }
   2440   const GLfloat* values =
   2441       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   2442   if (values == NULL) {
   2443     return error::kOutOfBounds;
   2444   }
   2445   DoVertexAttrib2fv(indx, values);
   2446   return error::kNoError;
   2447 }
   2448 
   2449 error::Error GLES2DecoderImpl::HandleVertexAttrib3f(
   2450     uint32_t immediate_data_size,
   2451     const void* cmd_data) {
   2452   const gles2::cmds::VertexAttrib3f& c =
   2453       *static_cast<const gles2::cmds::VertexAttrib3f*>(cmd_data);
   2454   (void)c;
   2455   GLuint indx = static_cast<GLuint>(c.indx);
   2456   GLfloat x = static_cast<GLfloat>(c.x);
   2457   GLfloat y = static_cast<GLfloat>(c.y);
   2458   GLfloat z = static_cast<GLfloat>(c.z);
   2459   DoVertexAttrib3f(indx, x, y, z);
   2460   return error::kNoError;
   2461 }
   2462 
   2463 error::Error GLES2DecoderImpl::HandleVertexAttrib3fvImmediate(
   2464     uint32_t immediate_data_size,
   2465     const void* cmd_data) {
   2466   const gles2::cmds::VertexAttrib3fvImmediate& c =
   2467       *static_cast<const gles2::cmds::VertexAttrib3fvImmediate*>(cmd_data);
   2468   (void)c;
   2469   GLuint indx = static_cast<GLuint>(c.indx);
   2470   uint32_t data_size;
   2471   if (!ComputeDataSize(1, sizeof(GLfloat), 3, &data_size)) {
   2472     return error::kOutOfBounds;
   2473   }
   2474   if (data_size > immediate_data_size) {
   2475     return error::kOutOfBounds;
   2476   }
   2477   const GLfloat* values =
   2478       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   2479   if (values == NULL) {
   2480     return error::kOutOfBounds;
   2481   }
   2482   DoVertexAttrib3fv(indx, values);
   2483   return error::kNoError;
   2484 }
   2485 
   2486 error::Error GLES2DecoderImpl::HandleVertexAttrib4f(
   2487     uint32_t immediate_data_size,
   2488     const void* cmd_data) {
   2489   const gles2::cmds::VertexAttrib4f& c =
   2490       *static_cast<const gles2::cmds::VertexAttrib4f*>(cmd_data);
   2491   (void)c;
   2492   GLuint indx = static_cast<GLuint>(c.indx);
   2493   GLfloat x = static_cast<GLfloat>(c.x);
   2494   GLfloat y = static_cast<GLfloat>(c.y);
   2495   GLfloat z = static_cast<GLfloat>(c.z);
   2496   GLfloat w = static_cast<GLfloat>(c.w);
   2497   DoVertexAttrib4f(indx, x, y, z, w);
   2498   return error::kNoError;
   2499 }
   2500 
   2501 error::Error GLES2DecoderImpl::HandleVertexAttrib4fvImmediate(
   2502     uint32_t immediate_data_size,
   2503     const void* cmd_data) {
   2504   const gles2::cmds::VertexAttrib4fvImmediate& c =
   2505       *static_cast<const gles2::cmds::VertexAttrib4fvImmediate*>(cmd_data);
   2506   (void)c;
   2507   GLuint indx = static_cast<GLuint>(c.indx);
   2508   uint32_t data_size;
   2509   if (!ComputeDataSize(1, sizeof(GLfloat), 4, &data_size)) {
   2510     return error::kOutOfBounds;
   2511   }
   2512   if (data_size > immediate_data_size) {
   2513     return error::kOutOfBounds;
   2514   }
   2515   const GLfloat* values =
   2516       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   2517   if (values == NULL) {
   2518     return error::kOutOfBounds;
   2519   }
   2520   DoVertexAttrib4fv(indx, values);
   2521   return error::kNoError;
   2522 }
   2523 
   2524 error::Error GLES2DecoderImpl::HandleViewport(uint32_t immediate_data_size,
   2525                                               const void* cmd_data) {
   2526   const gles2::cmds::Viewport& c =
   2527       *static_cast<const gles2::cmds::Viewport*>(cmd_data);
   2528   (void)c;
   2529   GLint x = static_cast<GLint>(c.x);
   2530   GLint y = static_cast<GLint>(c.y);
   2531   GLsizei width = static_cast<GLsizei>(c.width);
   2532   GLsizei height = static_cast<GLsizei>(c.height);
   2533   if (width < 0) {
   2534     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glViewport", "width < 0");
   2535     return error::kNoError;
   2536   }
   2537   if (height < 0) {
   2538     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glViewport", "height < 0");
   2539     return error::kNoError;
   2540   }
   2541   DoViewport(x, y, width, height);
   2542   return error::kNoError;
   2543 }
   2544 
   2545 error::Error GLES2DecoderImpl::HandleBlitFramebufferCHROMIUM(
   2546     uint32_t immediate_data_size,
   2547     const void* cmd_data) {
   2548   const gles2::cmds::BlitFramebufferCHROMIUM& c =
   2549       *static_cast<const gles2::cmds::BlitFramebufferCHROMIUM*>(cmd_data);
   2550   (void)c;
   2551   if (!features().chromium_framebuffer_multisample) {
   2552     LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
   2553                        "glBlitFramebufferCHROMIUM",
   2554                        "function not available");
   2555     return error::kNoError;
   2556   }
   2557 
   2558   error::Error error;
   2559   error = WillAccessBoundFramebufferForDraw();
   2560   if (error != error::kNoError)
   2561     return error;
   2562   error = WillAccessBoundFramebufferForRead();
   2563   if (error != error::kNoError)
   2564     return error;
   2565   GLint srcX0 = static_cast<GLint>(c.srcX0);
   2566   GLint srcY0 = static_cast<GLint>(c.srcY0);
   2567   GLint srcX1 = static_cast<GLint>(c.srcX1);
   2568   GLint srcY1 = static_cast<GLint>(c.srcY1);
   2569   GLint dstX0 = static_cast<GLint>(c.dstX0);
   2570   GLint dstY0 = static_cast<GLint>(c.dstY0);
   2571   GLint dstX1 = static_cast<GLint>(c.dstX1);
   2572   GLint dstY1 = static_cast<GLint>(c.dstY1);
   2573   GLbitfield mask = static_cast<GLbitfield>(c.mask);
   2574   GLenum filter = static_cast<GLenum>(c.filter);
   2575   if (!validators_->blit_filter.IsValid(filter)) {
   2576     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   2577         "glBlitFramebufferCHROMIUM", filter, "filter");
   2578     return error::kNoError;
   2579   }
   2580   DoBlitFramebufferCHROMIUM(
   2581       srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
   2582   return error::kNoError;
   2583 }
   2584 
   2585 error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleCHROMIUM(
   2586     uint32_t immediate_data_size,
   2587     const void* cmd_data) {
   2588   const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM& c =
   2589       *static_cast<const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM*>(
   2590           cmd_data);
   2591   (void)c;
   2592   if (!features().chromium_framebuffer_multisample) {
   2593     LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
   2594                        "glRenderbufferStorageMultisampleCHROMIUM",
   2595                        "function not available");
   2596     return error::kNoError;
   2597   }
   2598 
   2599   GLenum target = static_cast<GLenum>(c.target);
   2600   GLsizei samples = static_cast<GLsizei>(c.samples);
   2601   GLenum internalformat = static_cast<GLenum>(c.internalformat);
   2602   GLsizei width = static_cast<GLsizei>(c.width);
   2603   GLsizei height = static_cast<GLsizei>(c.height);
   2604   if (!validators_->render_buffer_target.IsValid(target)) {
   2605     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   2606         "glRenderbufferStorageMultisampleCHROMIUM", target, "target");
   2607     return error::kNoError;
   2608   }
   2609   if (samples < 0) {
   2610     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
   2611                        "glRenderbufferStorageMultisampleCHROMIUM",
   2612                        "samples < 0");
   2613     return error::kNoError;
   2614   }
   2615   if (!validators_->render_buffer_format.IsValid(internalformat)) {
   2616     LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleCHROMIUM",
   2617                                     internalformat,
   2618                                     "internalformat");
   2619     return error::kNoError;
   2620   }
   2621   if (width < 0) {
   2622     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
   2623                        "glRenderbufferStorageMultisampleCHROMIUM",
   2624                        "width < 0");
   2625     return error::kNoError;
   2626   }
   2627   if (height < 0) {
   2628     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
   2629                        "glRenderbufferStorageMultisampleCHROMIUM",
   2630                        "height < 0");
   2631     return error::kNoError;
   2632   }
   2633   DoRenderbufferStorageMultisampleCHROMIUM(
   2634       target, samples, internalformat, width, height);
   2635   return error::kNoError;
   2636 }
   2637 
   2638 error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleEXT(
   2639     uint32_t immediate_data_size,
   2640     const void* cmd_data) {
   2641   const gles2::cmds::RenderbufferStorageMultisampleEXT& c =
   2642       *static_cast<const gles2::cmds::RenderbufferStorageMultisampleEXT*>(
   2643           cmd_data);
   2644   (void)c;
   2645   if (!features().multisampled_render_to_texture) {
   2646     LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
   2647                        "glRenderbufferStorageMultisampleEXT",
   2648                        "function not available");
   2649     return error::kNoError;
   2650   }
   2651 
   2652   GLenum target = static_cast<GLenum>(c.target);
   2653   GLsizei samples = static_cast<GLsizei>(c.samples);
   2654   GLenum internalformat = static_cast<GLenum>(c.internalformat);
   2655   GLsizei width = static_cast<GLsizei>(c.width);
   2656   GLsizei height = static_cast<GLsizei>(c.height);
   2657   if (!validators_->render_buffer_target.IsValid(target)) {
   2658     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   2659         "glRenderbufferStorageMultisampleEXT", target, "target");
   2660     return error::kNoError;
   2661   }
   2662   if (samples < 0) {
   2663     LOCAL_SET_GL_ERROR(
   2664         GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "samples < 0");
   2665     return error::kNoError;
   2666   }
   2667   if (!validators_->render_buffer_format.IsValid(internalformat)) {
   2668     LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleEXT",
   2669                                     internalformat,
   2670                                     "internalformat");
   2671     return error::kNoError;
   2672   }
   2673   if (width < 0) {
   2674     LOCAL_SET_GL_ERROR(
   2675         GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "width < 0");
   2676     return error::kNoError;
   2677   }
   2678   if (height < 0) {
   2679     LOCAL_SET_GL_ERROR(
   2680         GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "height < 0");
   2681     return error::kNoError;
   2682   }
   2683   DoRenderbufferStorageMultisampleEXT(
   2684       target, samples, internalformat, width, height);
   2685   return error::kNoError;
   2686 }
   2687 
   2688 error::Error GLES2DecoderImpl::HandleFramebufferTexture2DMultisampleEXT(
   2689     uint32_t immediate_data_size,
   2690     const void* cmd_data) {
   2691   const gles2::cmds::FramebufferTexture2DMultisampleEXT& c =
   2692       *static_cast<const gles2::cmds::FramebufferTexture2DMultisampleEXT*>(
   2693           cmd_data);
   2694   (void)c;
   2695   if (!features().multisampled_render_to_texture) {
   2696     LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
   2697                        "glFramebufferTexture2DMultisampleEXT",
   2698                        "function not available");
   2699     return error::kNoError;
   2700   }
   2701 
   2702   GLenum target = static_cast<GLenum>(c.target);
   2703   GLenum attachment = static_cast<GLenum>(c.attachment);
   2704   GLenum textarget = static_cast<GLenum>(c.textarget);
   2705   GLuint texture = c.texture;
   2706   GLint level = static_cast<GLint>(c.level);
   2707   GLsizei samples = static_cast<GLsizei>(c.samples);
   2708   if (!validators_->frame_buffer_target.IsValid(target)) {
   2709     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   2710         "glFramebufferTexture2DMultisampleEXT", target, "target");
   2711     return error::kNoError;
   2712   }
   2713   if (!validators_->attachment.IsValid(attachment)) {
   2714     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   2715         "glFramebufferTexture2DMultisampleEXT", attachment, "attachment");
   2716     return error::kNoError;
   2717   }
   2718   if (!validators_->texture_target.IsValid(textarget)) {
   2719     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   2720         "glFramebufferTexture2DMultisampleEXT", textarget, "textarget");
   2721     return error::kNoError;
   2722   }
   2723   if (samples < 0) {
   2724     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
   2725                        "glFramebufferTexture2DMultisampleEXT",
   2726                        "samples < 0");
   2727     return error::kNoError;
   2728   }
   2729   DoFramebufferTexture2DMultisample(
   2730       target, attachment, textarget, texture, level, samples);
   2731   return error::kNoError;
   2732 }
   2733 
   2734 error::Error GLES2DecoderImpl::HandleTexStorage2DEXT(
   2735     uint32_t immediate_data_size,
   2736     const void* cmd_data) {
   2737   const gles2::cmds::TexStorage2DEXT& c =
   2738       *static_cast<const gles2::cmds::TexStorage2DEXT*>(cmd_data);
   2739   (void)c;
   2740   GLenum target = static_cast<GLenum>(c.target);
   2741   GLsizei levels = static_cast<GLsizei>(c.levels);
   2742   GLenum internalFormat = static_cast<GLenum>(c.internalFormat);
   2743   GLsizei width = static_cast<GLsizei>(c.width);
   2744   GLsizei height = static_cast<GLsizei>(c.height);
   2745   if (!validators_->texture_target.IsValid(target)) {
   2746     LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DEXT", target, "target");
   2747     return error::kNoError;
   2748   }
   2749   if (levels < 0) {
   2750     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DEXT", "levels < 0");
   2751     return error::kNoError;
   2752   }
   2753   if (!validators_->texture_internal_format_storage.IsValid(internalFormat)) {
   2754     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   2755         "glTexStorage2DEXT", internalFormat, "internalFormat");
   2756     return error::kNoError;
   2757   }
   2758   if (width < 0) {
   2759     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DEXT", "width < 0");
   2760     return error::kNoError;
   2761   }
   2762   if (height < 0) {
   2763     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DEXT", "height < 0");
   2764     return error::kNoError;
   2765   }
   2766   DoTexStorage2DEXT(target, levels, internalFormat, width, height);
   2767   return error::kNoError;
   2768 }
   2769 
   2770 error::Error GLES2DecoderImpl::HandleGenQueriesEXTImmediate(
   2771     uint32_t immediate_data_size,
   2772     const void* cmd_data) {
   2773   const gles2::cmds::GenQueriesEXTImmediate& c =
   2774       *static_cast<const gles2::cmds::GenQueriesEXTImmediate*>(cmd_data);
   2775   (void)c;
   2776   GLsizei n = static_cast<GLsizei>(c.n);
   2777   uint32_t data_size;
   2778   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
   2779     return error::kOutOfBounds;
   2780   }
   2781   GLuint* queries =
   2782       GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
   2783   if (queries == NULL) {
   2784     return error::kOutOfBounds;
   2785   }
   2786   if (!GenQueriesEXTHelper(n, queries)) {
   2787     return error::kInvalidArguments;
   2788   }
   2789   return error::kNoError;
   2790 }
   2791 
   2792 error::Error GLES2DecoderImpl::HandleDeleteQueriesEXTImmediate(
   2793     uint32_t immediate_data_size,
   2794     const void* cmd_data) {
   2795   const gles2::cmds::DeleteQueriesEXTImmediate& c =
   2796       *static_cast<const gles2::cmds::DeleteQueriesEXTImmediate*>(cmd_data);
   2797   (void)c;
   2798   GLsizei n = static_cast<GLsizei>(c.n);
   2799   uint32_t data_size;
   2800   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
   2801     return error::kOutOfBounds;
   2802   }
   2803   const GLuint* queries =
   2804       GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
   2805   if (queries == NULL) {
   2806     return error::kOutOfBounds;
   2807   }
   2808   DeleteQueriesEXTHelper(n, queries);
   2809   return error::kNoError;
   2810 }
   2811 
   2812 error::Error GLES2DecoderImpl::HandleInsertEventMarkerEXT(
   2813     uint32_t immediate_data_size,
   2814     const void* cmd_data) {
   2815   const gles2::cmds::InsertEventMarkerEXT& c =
   2816       *static_cast<const gles2::cmds::InsertEventMarkerEXT*>(cmd_data);
   2817   (void)c;
   2818 
   2819   GLuint bucket_id = static_cast<GLuint>(c.bucket_id);
   2820   Bucket* bucket = GetBucket(bucket_id);
   2821   if (!bucket || bucket->size() == 0) {
   2822     return error::kInvalidArguments;
   2823   }
   2824   std::string str;
   2825   if (!bucket->GetAsString(&str)) {
   2826     return error::kInvalidArguments;
   2827   }
   2828   DoInsertEventMarkerEXT(0, str.c_str());
   2829   return error::kNoError;
   2830 }
   2831 
   2832 error::Error GLES2DecoderImpl::HandlePushGroupMarkerEXT(
   2833     uint32_t immediate_data_size,
   2834     const void* cmd_data) {
   2835   const gles2::cmds::PushGroupMarkerEXT& c =
   2836       *static_cast<const gles2::cmds::PushGroupMarkerEXT*>(cmd_data);
   2837   (void)c;
   2838 
   2839   GLuint bucket_id = static_cast<GLuint>(c.bucket_id);
   2840   Bucket* bucket = GetBucket(bucket_id);
   2841   if (!bucket || bucket->size() == 0) {
   2842     return error::kInvalidArguments;
   2843   }
   2844   std::string str;
   2845   if (!bucket->GetAsString(&str)) {
   2846     return error::kInvalidArguments;
   2847   }
   2848   DoPushGroupMarkerEXT(0, str.c_str());
   2849   return error::kNoError;
   2850 }
   2851 
   2852 error::Error GLES2DecoderImpl::HandlePopGroupMarkerEXT(
   2853     uint32_t immediate_data_size,
   2854     const void* cmd_data) {
   2855   const gles2::cmds::PopGroupMarkerEXT& c =
   2856       *static_cast<const gles2::cmds::PopGroupMarkerEXT*>(cmd_data);
   2857   (void)c;
   2858   DoPopGroupMarkerEXT();
   2859   return error::kNoError;
   2860 }
   2861 
   2862 error::Error GLES2DecoderImpl::HandleGenVertexArraysOESImmediate(
   2863     uint32_t immediate_data_size,
   2864     const void* cmd_data) {
   2865   const gles2::cmds::GenVertexArraysOESImmediate& c =
   2866       *static_cast<const gles2::cmds::GenVertexArraysOESImmediate*>(cmd_data);
   2867   (void)c;
   2868   GLsizei n = static_cast<GLsizei>(c.n);
   2869   uint32_t data_size;
   2870   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
   2871     return error::kOutOfBounds;
   2872   }
   2873   GLuint* arrays =
   2874       GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
   2875   if (arrays == NULL) {
   2876     return error::kOutOfBounds;
   2877   }
   2878   if (!GenVertexArraysOESHelper(n, arrays)) {
   2879     return error::kInvalidArguments;
   2880   }
   2881   return error::kNoError;
   2882 }
   2883 
   2884 error::Error GLES2DecoderImpl::HandleDeleteVertexArraysOESImmediate(
   2885     uint32_t immediate_data_size,
   2886     const void* cmd_data) {
   2887   const gles2::cmds::DeleteVertexArraysOESImmediate& c =
   2888       *static_cast<const gles2::cmds::DeleteVertexArraysOESImmediate*>(
   2889           cmd_data);
   2890   (void)c;
   2891   GLsizei n = static_cast<GLsizei>(c.n);
   2892   uint32_t data_size;
   2893   if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
   2894     return error::kOutOfBounds;
   2895   }
   2896   const GLuint* arrays =
   2897       GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
   2898   if (arrays == NULL) {
   2899     return error::kOutOfBounds;
   2900   }
   2901   DeleteVertexArraysOESHelper(n, arrays);
   2902   return error::kNoError;
   2903 }
   2904 
   2905 error::Error GLES2DecoderImpl::HandleIsVertexArrayOES(
   2906     uint32_t immediate_data_size,
   2907     const void* cmd_data) {
   2908   const gles2::cmds::IsVertexArrayOES& c =
   2909       *static_cast<const gles2::cmds::IsVertexArrayOES*>(cmd_data);
   2910   (void)c;
   2911   GLuint array = c.array;
   2912   typedef cmds::IsVertexArrayOES::Result Result;
   2913   Result* result_dst = GetSharedMemoryAs<Result*>(
   2914       c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
   2915   if (!result_dst) {
   2916     return error::kOutOfBounds;
   2917   }
   2918   *result_dst = DoIsVertexArrayOES(array);
   2919   return error::kNoError;
   2920 }
   2921 
   2922 error::Error GLES2DecoderImpl::HandleBindVertexArrayOES(
   2923     uint32_t immediate_data_size,
   2924     const void* cmd_data) {
   2925   const gles2::cmds::BindVertexArrayOES& c =
   2926       *static_cast<const gles2::cmds::BindVertexArrayOES*>(cmd_data);
   2927   (void)c;
   2928   GLuint array = c.array;
   2929   DoBindVertexArrayOES(array);
   2930   return error::kNoError;
   2931 }
   2932 
   2933 error::Error GLES2DecoderImpl::HandleSwapBuffers(uint32_t immediate_data_size,
   2934                                                  const void* cmd_data) {
   2935   const gles2::cmds::SwapBuffers& c =
   2936       *static_cast<const gles2::cmds::SwapBuffers*>(cmd_data);
   2937   (void)c;
   2938   DoSwapBuffers();
   2939   return error::kNoError;
   2940 }
   2941 
   2942 error::Error GLES2DecoderImpl::HandleGetMaxValueInBufferCHROMIUM(
   2943     uint32_t immediate_data_size,
   2944     const void* cmd_data) {
   2945   const gles2::cmds::GetMaxValueInBufferCHROMIUM& c =
   2946       *static_cast<const gles2::cmds::GetMaxValueInBufferCHROMIUM*>(cmd_data);
   2947   (void)c;
   2948   GLuint buffer_id = c.buffer_id;
   2949   GLsizei count = static_cast<GLsizei>(c.count);
   2950   GLenum type = static_cast<GLenum>(c.type);
   2951   GLuint offset = static_cast<GLuint>(c.offset);
   2952   typedef cmds::GetMaxValueInBufferCHROMIUM::Result Result;
   2953   Result* result_dst = GetSharedMemoryAs<Result*>(
   2954       c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
   2955   if (!result_dst) {
   2956     return error::kOutOfBounds;
   2957   }
   2958   if (count < 0) {
   2959     LOCAL_SET_GL_ERROR(
   2960         GL_INVALID_VALUE, "glGetMaxValueInBufferCHROMIUM", "count < 0");
   2961     return error::kNoError;
   2962   }
   2963   if (!validators_->get_max_index_type.IsValid(type)) {
   2964     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   2965         "glGetMaxValueInBufferCHROMIUM", type, "type");
   2966     return error::kNoError;
   2967   }
   2968   *result_dst = DoGetMaxValueInBufferCHROMIUM(buffer_id, count, type, offset);
   2969   return error::kNoError;
   2970 }
   2971 
   2972 error::Error GLES2DecoderImpl::HandleTexImageIOSurface2DCHROMIUM(
   2973     uint32_t immediate_data_size,
   2974     const void* cmd_data) {
   2975   const gles2::cmds::TexImageIOSurface2DCHROMIUM& c =
   2976       *static_cast<const gles2::cmds::TexImageIOSurface2DCHROMIUM*>(cmd_data);
   2977   (void)c;
   2978   GLenum target = static_cast<GLenum>(c.target);
   2979   GLsizei width = static_cast<GLsizei>(c.width);
   2980   GLsizei height = static_cast<GLsizei>(c.height);
   2981   GLuint ioSurfaceId = static_cast<GLuint>(c.ioSurfaceId);
   2982   GLuint plane = static_cast<GLuint>(c.plane);
   2983   if (!validators_->texture_bind_target.IsValid(target)) {
   2984     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   2985         "glTexImageIOSurface2DCHROMIUM", target, "target");
   2986     return error::kNoError;
   2987   }
   2988   if (width < 0) {
   2989     LOCAL_SET_GL_ERROR(
   2990         GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "width < 0");
   2991     return error::kNoError;
   2992   }
   2993   if (height < 0) {
   2994     LOCAL_SET_GL_ERROR(
   2995         GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "height < 0");
   2996     return error::kNoError;
   2997   }
   2998   DoTexImageIOSurface2DCHROMIUM(target, width, height, ioSurfaceId, plane);
   2999   return error::kNoError;
   3000 }
   3001 
   3002 error::Error GLES2DecoderImpl::HandleCopyTextureCHROMIUM(
   3003     uint32_t immediate_data_size,
   3004     const void* cmd_data) {
   3005   const gles2::cmds::CopyTextureCHROMIUM& c =
   3006       *static_cast<const gles2::cmds::CopyTextureCHROMIUM*>(cmd_data);
   3007   (void)c;
   3008   GLenum target = static_cast<GLenum>(c.target);
   3009   GLenum source_id = static_cast<GLenum>(c.source_id);
   3010   GLenum dest_id = static_cast<GLenum>(c.dest_id);
   3011   GLint level = static_cast<GLint>(c.level);
   3012   GLint internalformat = static_cast<GLint>(c.internalformat);
   3013   GLenum dest_type = static_cast<GLenum>(c.dest_type);
   3014   if (!validators_->texture_internal_format.IsValid(internalformat)) {
   3015     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
   3016                        "glCopyTextureCHROMIUM",
   3017                        "internalformat GL_INVALID_VALUE");
   3018     return error::kNoError;
   3019   }
   3020   if (!validators_->pixel_type.IsValid(dest_type)) {
   3021     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   3022         "glCopyTextureCHROMIUM", dest_type, "dest_type");
   3023     return error::kNoError;
   3024   }
   3025   DoCopyTextureCHROMIUM(
   3026       target, source_id, dest_id, level, internalformat, dest_type);
   3027   return error::kNoError;
   3028 }
   3029 
   3030 error::Error GLES2DecoderImpl::HandleProduceTextureCHROMIUMImmediate(
   3031     uint32_t immediate_data_size,
   3032     const void* cmd_data) {
   3033   const gles2::cmds::ProduceTextureCHROMIUMImmediate& c =
   3034       *static_cast<const gles2::cmds::ProduceTextureCHROMIUMImmediate*>(
   3035           cmd_data);
   3036   (void)c;
   3037   GLenum target = static_cast<GLenum>(c.target);
   3038   uint32_t data_size;
   3039   if (!ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) {
   3040     return error::kOutOfBounds;
   3041   }
   3042   if (data_size > immediate_data_size) {
   3043     return error::kOutOfBounds;
   3044   }
   3045   const GLbyte* mailbox =
   3046       GetImmediateDataAs<const GLbyte*>(c, data_size, immediate_data_size);
   3047   if (!validators_->texture_bind_target.IsValid(target)) {
   3048     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   3049         "glProduceTextureCHROMIUM", target, "target");
   3050     return error::kNoError;
   3051   }
   3052   if (mailbox == NULL) {
   3053     return error::kOutOfBounds;
   3054   }
   3055   DoProduceTextureCHROMIUM(target, mailbox);
   3056   return error::kNoError;
   3057 }
   3058 
   3059 error::Error GLES2DecoderImpl::HandleProduceTextureDirectCHROMIUMImmediate(
   3060     uint32_t immediate_data_size,
   3061     const void* cmd_data) {
   3062   const gles2::cmds::ProduceTextureDirectCHROMIUMImmediate& c =
   3063       *static_cast<const gles2::cmds::ProduceTextureDirectCHROMIUMImmediate*>(
   3064           cmd_data);
   3065   (void)c;
   3066   GLuint texture = c.texture;
   3067   GLenum target = static_cast<GLenum>(c.target);
   3068   uint32_t data_size;
   3069   if (!ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) {
   3070     return error::kOutOfBounds;
   3071   }
   3072   if (data_size > immediate_data_size) {
   3073     return error::kOutOfBounds;
   3074   }
   3075   const GLbyte* mailbox =
   3076       GetImmediateDataAs<const GLbyte*>(c, data_size, immediate_data_size);
   3077   if (!validators_->texture_bind_target.IsValid(target)) {
   3078     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   3079         "glProduceTextureDirectCHROMIUM", target, "target");
   3080     return error::kNoError;
   3081   }
   3082   if (mailbox == NULL) {
   3083     return error::kOutOfBounds;
   3084   }
   3085   DoProduceTextureDirectCHROMIUM(texture, target, mailbox);
   3086   return error::kNoError;
   3087 }
   3088 
   3089 error::Error GLES2DecoderImpl::HandleConsumeTextureCHROMIUMImmediate(
   3090     uint32_t immediate_data_size,
   3091     const void* cmd_data) {
   3092   const gles2::cmds::ConsumeTextureCHROMIUMImmediate& c =
   3093       *static_cast<const gles2::cmds::ConsumeTextureCHROMIUMImmediate*>(
   3094           cmd_data);
   3095   (void)c;
   3096   GLenum target = static_cast<GLenum>(c.target);
   3097   uint32_t data_size;
   3098   if (!ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) {
   3099     return error::kOutOfBounds;
   3100   }
   3101   if (data_size > immediate_data_size) {
   3102     return error::kOutOfBounds;
   3103   }
   3104   const GLbyte* mailbox =
   3105       GetImmediateDataAs<const GLbyte*>(c, data_size, immediate_data_size);
   3106   if (!validators_->texture_bind_target.IsValid(target)) {
   3107     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   3108         "glConsumeTextureCHROMIUM", target, "target");
   3109     return error::kNoError;
   3110   }
   3111   if (mailbox == NULL) {
   3112     return error::kOutOfBounds;
   3113   }
   3114   DoConsumeTextureCHROMIUM(target, mailbox);
   3115   return error::kNoError;
   3116 }
   3117 
   3118 error::Error GLES2DecoderImpl::HandleBindTexImage2DCHROMIUM(
   3119     uint32_t immediate_data_size,
   3120     const void* cmd_data) {
   3121   const gles2::cmds::BindTexImage2DCHROMIUM& c =
   3122       *static_cast<const gles2::cmds::BindTexImage2DCHROMIUM*>(cmd_data);
   3123   (void)c;
   3124   GLenum target = static_cast<GLenum>(c.target);
   3125   GLint imageId = static_cast<GLint>(c.imageId);
   3126   if (!validators_->texture_bind_target.IsValid(target)) {
   3127     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   3128         "glBindTexImage2DCHROMIUM", target, "target");
   3129     return error::kNoError;
   3130   }
   3131   DoBindTexImage2DCHROMIUM(target, imageId);
   3132   return error::kNoError;
   3133 }
   3134 
   3135 error::Error GLES2DecoderImpl::HandleReleaseTexImage2DCHROMIUM(
   3136     uint32_t immediate_data_size,
   3137     const void* cmd_data) {
   3138   const gles2::cmds::ReleaseTexImage2DCHROMIUM& c =
   3139       *static_cast<const gles2::cmds::ReleaseTexImage2DCHROMIUM*>(cmd_data);
   3140   (void)c;
   3141   GLenum target = static_cast<GLenum>(c.target);
   3142   GLint imageId = static_cast<GLint>(c.imageId);
   3143   if (!validators_->texture_bind_target.IsValid(target)) {
   3144     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   3145         "glReleaseTexImage2DCHROMIUM", target, "target");
   3146     return error::kNoError;
   3147   }
   3148   DoReleaseTexImage2DCHROMIUM(target, imageId);
   3149   return error::kNoError;
   3150 }
   3151 
   3152 error::Error GLES2DecoderImpl::HandleTraceEndCHROMIUM(
   3153     uint32_t immediate_data_size,
   3154     const void* cmd_data) {
   3155   const gles2::cmds::TraceEndCHROMIUM& c =
   3156       *static_cast<const gles2::cmds::TraceEndCHROMIUM*>(cmd_data);
   3157   (void)c;
   3158   DoTraceEndCHROMIUM();
   3159   return error::kNoError;
   3160 }
   3161 
   3162 error::Error GLES2DecoderImpl::HandleDiscardFramebufferEXTImmediate(
   3163     uint32_t immediate_data_size,
   3164     const void* cmd_data) {
   3165   const gles2::cmds::DiscardFramebufferEXTImmediate& c =
   3166       *static_cast<const gles2::cmds::DiscardFramebufferEXTImmediate*>(
   3167           cmd_data);
   3168   (void)c;
   3169   if (!features().ext_discard_framebuffer) {
   3170     LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
   3171                        "glDiscardFramebufferEXT",
   3172                        "function not available");
   3173     return error::kNoError;
   3174   }
   3175 
   3176   GLenum target = static_cast<GLenum>(c.target);
   3177   GLsizei count = static_cast<GLsizei>(c.count);
   3178   uint32_t data_size;
   3179   if (!ComputeDataSize(count, sizeof(GLenum), 1, &data_size)) {
   3180     return error::kOutOfBounds;
   3181   }
   3182   if (data_size > immediate_data_size) {
   3183     return error::kOutOfBounds;
   3184   }
   3185   const GLenum* attachments =
   3186       GetImmediateDataAs<const GLenum*>(c, data_size, immediate_data_size);
   3187   if (count < 0) {
   3188     LOCAL_SET_GL_ERROR(
   3189         GL_INVALID_VALUE, "glDiscardFramebufferEXT", "count < 0");
   3190     return error::kNoError;
   3191   }
   3192   if (attachments == NULL) {
   3193     return error::kOutOfBounds;
   3194   }
   3195   DoDiscardFramebufferEXT(target, count, attachments);
   3196   return error::kNoError;
   3197 }
   3198 
   3199 error::Error GLES2DecoderImpl::HandleLoseContextCHROMIUM(
   3200     uint32_t immediate_data_size,
   3201     const void* cmd_data) {
   3202   const gles2::cmds::LoseContextCHROMIUM& c =
   3203       *static_cast<const gles2::cmds::LoseContextCHROMIUM*>(cmd_data);
   3204   (void)c;
   3205   GLenum current = static_cast<GLenum>(c.current);
   3206   GLenum other = static_cast<GLenum>(c.other);
   3207   if (!validators_->reset_status.IsValid(current)) {
   3208     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   3209         "glLoseContextCHROMIUM", current, "current");
   3210     return error::kNoError;
   3211   }
   3212   if (!validators_->reset_status.IsValid(other)) {
   3213     LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", other, "other");
   3214     return error::kNoError;
   3215   }
   3216   DoLoseContextCHROMIUM(current, other);
   3217   return error::kNoError;
   3218 }
   3219 
   3220 error::Error GLES2DecoderImpl::HandleDrawBuffersEXTImmediate(
   3221     uint32_t immediate_data_size,
   3222     const void* cmd_data) {
   3223   const gles2::cmds::DrawBuffersEXTImmediate& c =
   3224       *static_cast<const gles2::cmds::DrawBuffersEXTImmediate*>(cmd_data);
   3225   (void)c;
   3226   GLsizei count = static_cast<GLsizei>(c.count);
   3227   uint32_t data_size;
   3228   if (!ComputeDataSize(count, sizeof(GLenum), 1, &data_size)) {
   3229     return error::kOutOfBounds;
   3230   }
   3231   if (data_size > immediate_data_size) {
   3232     return error::kOutOfBounds;
   3233   }
   3234   const GLenum* bufs =
   3235       GetImmediateDataAs<const GLenum*>(c, data_size, immediate_data_size);
   3236   if (count < 0) {
   3237     LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glDrawBuffersEXT", "count < 0");
   3238     return error::kNoError;
   3239   }
   3240   if (bufs == NULL) {
   3241     return error::kOutOfBounds;
   3242   }
   3243   DoDrawBuffersEXT(count, bufs);
   3244   return error::kNoError;
   3245 }
   3246 
   3247 error::Error GLES2DecoderImpl::HandleMatrixLoadfCHROMIUMImmediate(
   3248     uint32_t immediate_data_size,
   3249     const void* cmd_data) {
   3250   const gles2::cmds::MatrixLoadfCHROMIUMImmediate& c =
   3251       *static_cast<const gles2::cmds::MatrixLoadfCHROMIUMImmediate*>(cmd_data);
   3252   (void)c;
   3253   if (!features().chromium_path_rendering) {
   3254     LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
   3255                        "glMatrixLoadfCHROMIUM",
   3256                        "function not available");
   3257     return error::kNoError;
   3258   }
   3259 
   3260   GLenum matrixMode = static_cast<GLenum>(c.matrixMode);
   3261   uint32_t data_size;
   3262   if (!ComputeDataSize(1, sizeof(GLfloat), 16, &data_size)) {
   3263     return error::kOutOfBounds;
   3264   }
   3265   if (data_size > immediate_data_size) {
   3266     return error::kOutOfBounds;
   3267   }
   3268   const GLfloat* m =
   3269       GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
   3270   if (!validators_->matrix_mode.IsValid(matrixMode)) {
   3271     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   3272         "glMatrixLoadfCHROMIUM", matrixMode, "matrixMode");
   3273     return error::kNoError;
   3274   }
   3275   if (m == NULL) {
   3276     return error::kOutOfBounds;
   3277   }
   3278   DoMatrixLoadfCHROMIUM(matrixMode, m);
   3279   return error::kNoError;
   3280 }
   3281 
   3282 error::Error GLES2DecoderImpl::HandleMatrixLoadIdentityCHROMIUM(
   3283     uint32_t immediate_data_size,
   3284     const void* cmd_data) {
   3285   const gles2::cmds::MatrixLoadIdentityCHROMIUM& c =
   3286       *static_cast<const gles2::cmds::MatrixLoadIdentityCHROMIUM*>(cmd_data);
   3287   (void)c;
   3288   if (!features().chromium_path_rendering) {
   3289     LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
   3290                        "glMatrixLoadIdentityCHROMIUM",
   3291                        "function not available");
   3292     return error::kNoError;
   3293   }
   3294 
   3295   GLenum matrixMode = static_cast<GLenum>(c.matrixMode);
   3296   if (!validators_->matrix_mode.IsValid(matrixMode)) {
   3297     LOCAL_SET_GL_ERROR_INVALID_ENUM(
   3298         "glMatrixLoadIdentityCHROMIUM", matrixMode, "matrixMode");
   3299     return error::kNoError;
   3300   }
   3301   DoMatrixLoadIdentityCHROMIUM(matrixMode);
   3302   return error::kNoError;
   3303 }
   3304 
   3305 bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) {
   3306   switch (cap) {
   3307     case GL_BLEND:
   3308       state_.enable_flags.blend = enabled;
   3309       if (state_.enable_flags.cached_blend != enabled ||
   3310           state_.ignore_cached_state) {
   3311         state_.enable_flags.cached_blend = enabled;
   3312         return true;
   3313       }
   3314       return false;
   3315     case GL_CULL_FACE:
   3316       state_.enable_flags.cull_face = enabled;
   3317       if (state_.enable_flags.cached_cull_face != enabled ||
   3318           state_.ignore_cached_state) {
   3319         state_.enable_flags.cached_cull_face = enabled;
   3320         return true;
   3321       }
   3322       return false;
   3323     case GL_DEPTH_TEST:
   3324       state_.enable_flags.depth_test = enabled;
   3325       if (state_.enable_flags.cached_depth_test != enabled ||
   3326           state_.ignore_cached_state) {
   3327         framebuffer_state_.clear_state_dirty = true;
   3328       }
   3329       return false;
   3330     case GL_DITHER:
   3331       state_.enable_flags.dither = enabled;
   3332       if (state_.enable_flags.cached_dither != enabled ||
   3333           state_.ignore_cached_state) {
   3334         state_.enable_flags.cached_dither = enabled;
   3335         return true;
   3336       }
   3337       return false;
   3338     case GL_POLYGON_OFFSET_FILL:
   3339       state_.enable_flags.polygon_offset_fill = enabled;
   3340       if (state_.enable_flags.cached_polygon_offset_fill != enabled ||
   3341           state_.ignore_cached_state) {
   3342         state_.enable_flags.cached_polygon_offset_fill = enabled;
   3343         return true;
   3344       }
   3345       return false;
   3346     case GL_SAMPLE_ALPHA_TO_COVERAGE:
   3347       state_.enable_flags.sample_alpha_to_coverage = enabled;
   3348       if (state_.enable_flags.cached_sample_alpha_to_coverage != enabled ||
   3349           state_.ignore_cached_state) {
   3350         state_.enable_flags.cached_sample_alpha_to_coverage = enabled;
   3351         return true;
   3352       }
   3353       return false;
   3354     case GL_SAMPLE_COVERAGE:
   3355       state_.enable_flags.sample_coverage = enabled;
   3356       if (state_.enable_flags.cached_sample_coverage != enabled ||
   3357           state_.ignore_cached_state) {
   3358         state_.enable_flags.cached_sample_coverage = enabled;
   3359         return true;
   3360       }
   3361       return false;
   3362     case GL_SCISSOR_TEST:
   3363       state_.enable_flags.scissor_test = enabled;
   3364       if (state_.enable_flags.cached_scissor_test != enabled ||
   3365           state_.ignore_cached_state) {
   3366         state_.enable_flags.cached_scissor_test = enabled;
   3367         return true;
   3368       }
   3369       return false;
   3370     case GL_STENCIL_TEST:
   3371       state_.enable_flags.stencil_test = enabled;
   3372       if (state_.enable_flags.cached_stencil_test != enabled ||
   3373           state_.ignore_cached_state) {
   3374         framebuffer_state_.clear_state_dirty = true;
   3375       }
   3376       return false;
   3377     default:
   3378       NOTREACHED();
   3379       return false;
   3380   }
   3381 }
   3382 #endif  // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_
   3383