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