14ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is auto-generated from
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gpu/command_buffer/build_gles2_cmd_buffer.py
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// It's formatted by clang-format using chromium coding style:
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//    clang-format -i -style=chromium filename
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DO NOT EDIT!
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It is included by gles2_cmd_decoder.cc
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleActiveTexture(uint32_t immediate_data_size,
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   const void* cmd_data) {
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::ActiveTexture& c =
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::ActiveTexture*>(cmd_data);
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum texture = static_cast<GLenum>(c.texture);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoActiveTexture(texture);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleAttachShader(uint32_t immediate_data_size,
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  const void* cmd_data) {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::AttachShader& c =
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::AttachShader*>(cmd_data);
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = c.program;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint shader = c.shader;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoAttachShader(program, shader);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleBindBuffer(uint32_t immediate_data_size,
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                const void* cmd_data) {
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BindBuffer& c =
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BindBuffer*>(cmd_data);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint buffer = c.buffer;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->buffer_target.IsValid(target)) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindBuffer", target, "target");
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindBuffer(target, buffer);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleBindFramebuffer(
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BindFramebuffer& c =
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BindFramebuffer*>(cmd_data);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint framebuffer = c.framebuffer;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->frame_buffer_target.IsValid(target)) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindFramebuffer", target, "target");
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindFramebuffer(target, framebuffer);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleBindRenderbuffer(
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BindRenderbuffer& c =
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BindRenderbuffer*>(cmd_data);
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint renderbuffer = c.renderbuffer;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->render_buffer_target.IsValid(target)) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindRenderbuffer", target, "target");
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindRenderbuffer(target, renderbuffer);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleBindTexture(uint32_t immediate_data_size,
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 const void* cmd_data) {
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BindTexture& c =
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BindTexture*>(cmd_data);
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint texture = c.texture;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTexture", target, "target");
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindTexture(target, texture);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleBlendColor(uint32_t immediate_data_size,
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                const void* cmd_data) {
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BlendColor& c =
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BlendColor*>(cmd_data);
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf red = static_cast<GLclampf>(c.red);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf green = static_cast<GLclampf>(c.green);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf blue = static_cast<GLclampf>(c.blue);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf alpha = static_cast<GLclampf>(c.alpha);
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (state_.blend_color_red != red || state_.blend_color_green != green ||
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      state_.blend_color_blue != blue || state_.blend_color_alpha != alpha) {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_color_red = red;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_color_green = green;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_color_blue = blue;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_color_alpha = alpha;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glBlendColor(red, green, blue, alpha);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleBlendEquation(uint32_t immediate_data_size,
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   const void* cmd_data) {
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BlendEquation& c =
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BlendEquation*>(cmd_data);
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum mode = static_cast<GLenum>(c.mode);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->equation.IsValid(mode)) {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendEquation", mode, "mode");
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.blend_equation_rgb != mode ||
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.blend_equation_alpha != mode) {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_equation_rgb = mode;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_equation_alpha = mode;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glBlendEquation(mode);
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleBlendEquationSeparate(
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BlendEquationSeparate& c =
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BlendEquationSeparate*>(cmd_data);
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum modeRGB = static_cast<GLenum>(c.modeRGB);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum modeAlpha = static_cast<GLenum>(c.modeAlpha);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->equation.IsValid(modeRGB)) {
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glBlendEquationSeparate", modeRGB, "modeRGB");
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->equation.IsValid(modeAlpha)) {
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glBlendEquationSeparate", modeAlpha, "modeAlpha");
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.blend_equation_rgb != modeRGB ||
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.blend_equation_alpha != modeAlpha) {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_equation_rgb = modeRGB;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_equation_alpha = modeAlpha;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glBlendEquationSeparate(modeRGB, modeAlpha);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleBlendFunc(uint32_t immediate_data_size,
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BlendFunc& c =
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BlendFunc*>(cmd_data);
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum sfactor = static_cast<GLenum>(c.sfactor);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum dfactor = static_cast<GLenum>(c.dfactor);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->src_blend_factor.IsValid(sfactor)) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFunc", sfactor, "sfactor");
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->dst_blend_factor.IsValid(dfactor)) {
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFunc", dfactor, "dfactor");
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (state_.blend_source_rgb != sfactor || state_.blend_dest_rgb != dfactor ||
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.blend_source_alpha != sfactor ||
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.blend_dest_alpha != dfactor) {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_source_rgb = sfactor;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_dest_rgb = dfactor;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_source_alpha = sfactor;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_dest_alpha = dfactor;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glBlendFunc(sfactor, dfactor);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleBlendFuncSeparate(
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BlendFuncSeparate& c =
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BlendFuncSeparate*>(cmd_data);
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum srcRGB = static_cast<GLenum>(c.srcRGB);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum dstRGB = static_cast<GLenum>(c.dstRGB);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum srcAlpha = static_cast<GLenum>(c.srcAlpha);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum dstAlpha = static_cast<GLenum>(c.dstAlpha);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->src_blend_factor.IsValid(srcRGB)) {
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", srcRGB, "srcRGB");
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->dst_blend_factor.IsValid(dstRGB)) {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", dstRGB, "dstRGB");
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->src_blend_factor.IsValid(srcAlpha)) {
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glBlendFuncSeparate", srcAlpha, "srcAlpha");
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->dst_blend_factor.IsValid(dstAlpha)) {
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glBlendFuncSeparate", dstAlpha, "dstAlpha");
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (state_.blend_source_rgb != srcRGB || state_.blend_dest_rgb != dstRGB ||
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.blend_source_alpha != srcAlpha ||
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.blend_dest_alpha != dstAlpha) {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_source_rgb = srcRGB;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_dest_rgb = dstRGB;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_source_alpha = srcAlpha;
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.blend_dest_alpha = dstAlpha;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleBufferSubData(uint32_t immediate_data_size,
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   const void* cmd_data) {
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BufferSubData& c =
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BufferSubData*>(cmd_data);
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLintptr offset = static_cast<GLintptr>(c.offset);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizeiptr size = static_cast<GLsizeiptr>(c.size);
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size = size;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* data = GetSharedMemoryAs<const void*>(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.data_shm_id, c.data_shm_offset, data_size);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->buffer_target.IsValid(target)) {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBufferSubData", target, "target");
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size < 0) {
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glBufferSubData", "size < 0");
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data == NULL) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBufferSubData(target, offset, size, data);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleCheckFramebufferStatus(
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::CheckFramebufferStatus& c =
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::CheckFramebufferStatus*>(cmd_data);
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::CheckFramebufferStatus::Result Result;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->frame_buffer_target.IsValid(target)) {
271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glCheckFramebufferStatus", target, "target");
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_dst = DoCheckFramebufferStatus(target);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleClear(uint32_t immediate_data_size,
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           const void* cmd_data) {
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Clear& c =
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Clear*>(cmd_data);
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error::Error error;
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error = WillAccessBoundFramebufferForDraw();
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (error != error::kNoError)
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return error;
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLbitfield mask = static_cast<GLbitfield>(c.mask);
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoClear(mask);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return error::kNoError;
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleClearColor(uint32_t immediate_data_size,
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                const void* cmd_data) {
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::ClearColor& c =
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::ClearColor*>(cmd_data);
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf red = static_cast<GLclampf>(c.red);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf green = static_cast<GLclampf>(c.green);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf blue = static_cast<GLclampf>(c.blue);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf alpha = static_cast<GLclampf>(c.alpha);
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (state_.color_clear_red != red || state_.color_clear_green != green ||
303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      state_.color_clear_blue != blue || state_.color_clear_alpha != alpha) {
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.color_clear_red = red;
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.color_clear_green = green;
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.color_clear_blue = blue;
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.color_clear_alpha = alpha;
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glClearColor(red, green, blue, alpha);
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleClearDepthf(uint32_t immediate_data_size,
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 const void* cmd_data) {
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::ClearDepthf& c =
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::ClearDepthf*>(cmd_data);
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf depth = static_cast<GLclampf>(c.depth);
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.depth_clear != depth) {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.depth_clear = depth;
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glClearDepth(depth);
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleClearStencil(uint32_t immediate_data_size,
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  const void* cmd_data) {
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::ClearStencil& c =
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::ClearStencil*>(cmd_data);
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint s = static_cast<GLint>(c.s);
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.stencil_clear != s) {
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_clear = s;
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glClearStencil(s);
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleColorMask(uint32_t immediate_data_size,
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::ColorMask& c =
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::ColorMask*>(cmd_data);
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLboolean red = static_cast<GLboolean>(c.red);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLboolean green = static_cast<GLboolean>(c.green);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLboolean blue = static_cast<GLboolean>(c.blue);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLboolean alpha = static_cast<GLboolean>(c.alpha);
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (state_.color_mask_red != red || state_.color_mask_green != green ||
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      state_.color_mask_blue != blue || state_.color_mask_alpha != alpha) {
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.color_mask_red = red;
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.color_mask_green = green;
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.color_mask_blue = blue;
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.color_mask_alpha = alpha;
3543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    framebuffer_state_.clear_state_dirty = true;
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleCompileShader(uint32_t immediate_data_size,
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   const void* cmd_data) {
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::CompileShader& c =
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::CompileShader*>(cmd_data);
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint shader = c.shader;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCompileShader(shader);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2D(
370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::CompressedTexSubImage2D& c =
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::CompressedTexSubImage2D*>(cmd_data);
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint level = static_cast<GLint>(c.level);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint xoffset = static_cast<GLint>(c.xoffset);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint yoffset = static_cast<GLint>(c.yoffset);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei width = static_cast<GLsizei>(c.width);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei height = static_cast<GLsizei>(c.height);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum format = static_cast<GLenum>(c.format);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei imageSize = static_cast<GLsizei>(c.imageSize);
383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size = imageSize;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* data = GetSharedMemoryAs<const void*>(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.data_shm_id, c.data_shm_offset, data_size);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_target.IsValid(target)) {
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glCompressedTexSubImage2D", target, "target");
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (width < 0) {
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GL_INVALID_VALUE, "glCompressedTexSubImage2D", "width < 0");
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (height < 0) {
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GL_INVALID_VALUE, "glCompressedTexSubImage2D", "height < 0");
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->compressed_texture_format.IsValid(format)) {
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glCompressedTexSubImage2D", format, "format");
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (imageSize < 0) {
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GL_INVALID_VALUE, "glCompressedTexSubImage2D", "imageSize < 0");
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data == NULL) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCompressedTexSubImage2D(
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, level, xoffset, yoffset, width, height, format, imageSize, data);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleCopyTexImage2D(
420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::CopyTexImage2D& c =
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::CopyTexImage2D*>(cmd_data);
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error::Error error;
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error = WillAccessBoundFramebufferForRead();
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (error != error::kNoError)
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return error;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint level = static_cast<GLint>(c.level);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum internalformat = static_cast<GLenum>(c.internalformat);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint x = static_cast<GLint>(c.x);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint y = static_cast<GLint>(c.y);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei width = static_cast<GLsizei>(c.width);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei height = static_cast<GLsizei>(c.height);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint border = static_cast<GLint>(c.border);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_target.IsValid(target)) {
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexImage2D", target, "target");
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_internal_format.IsValid(internalformat)) {
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glCopyTexImage2D", internalformat, "internalformat");
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (width < 0) {
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyTexImage2D", "width < 0");
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (height < 0) {
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyTexImage2D", "height < 0");
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleCopyTexSubImage2D(
459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::CopyTexSubImage2D& c =
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::CopyTexSubImage2D*>(cmd_data);
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error::Error error;
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error = WillAccessBoundFramebufferForRead();
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (error != error::kNoError)
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return error;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint level = static_cast<GLint>(c.level);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint xoffset = static_cast<GLint>(c.xoffset);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint yoffset = static_cast<GLint>(c.yoffset);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint x = static_cast<GLint>(c.x);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint y = static_cast<GLint>(c.y);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei width = static_cast<GLsizei>(c.width);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei height = static_cast<GLsizei>(c.height);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_target.IsValid(target)) {
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexSubImage2D", target, "target");
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (width < 0) {
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyTexSubImage2D", "width < 0");
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (height < 0) {
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyTexSubImage2D", "height < 0");
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleCreateProgram(uint32_t immediate_data_size,
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   const void* cmd_data) {
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::CreateProgram& c =
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::CreateProgram*>(cmd_data);
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t client_id = c.client_id;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CreateProgramHelper(client_id)) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleCreateShader(uint32_t immediate_data_size,
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  const void* cmd_data) {
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::CreateShader& c =
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::CreateShader*>(cmd_data);
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum type = static_cast<GLenum>(c.type);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->shader_type.IsValid(type)) {
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glCreateShader", type, "type");
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t client_id = c.client_id;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CreateShaderHelper(type, client_id)) {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleCullFace(uint32_t immediate_data_size,
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              const void* cmd_data) {
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::CullFace& c =
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::CullFace*>(cmd_data);
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum mode = static_cast<GLenum>(c.mode);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->face_type.IsValid(mode)) {
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glCullFace", mode, "mode");
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.cull_mode != mode) {
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.cull_mode = mode;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glCullFace(mode);
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleDeleteBuffersImmediate(
539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DeleteBuffersImmediate& c =
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DeleteBuffersImmediate*>(cmd_data);
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLuint* buffers =
550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (buffers == NULL) {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteBuffersHelper(n, buffers);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleDeleteFramebuffersImmediate(
559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DeleteFramebuffersImmediate& c =
5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DeleteFramebuffersImmediate*>(cmd_data);
5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLuint* framebuffers =
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (framebuffers == NULL) {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteFramebuffersHelper(n, framebuffers);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleDeleteRenderbuffersImmediate(
579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DeleteRenderbuffersImmediate& c =
5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DeleteRenderbuffersImmediate*>(cmd_data);
5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLuint* renderbuffers =
590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (renderbuffers == NULL) {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteRenderbuffersHelper(n, renderbuffers);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleDeleteTexturesImmediate(
599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DeleteTexturesImmediate& c =
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DeleteTexturesImmediate*>(cmd_data);
6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLuint* textures =
610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (textures == NULL) {
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteTexturesHelper(n, textures);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleDepthFunc(uint32_t immediate_data_size,
6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DepthFunc& c =
6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DepthFunc*>(cmd_data);
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum func = static_cast<GLenum>(c.func);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->cmp_function.IsValid(func)) {
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glDepthFunc", func, "func");
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.depth_func != func) {
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.depth_func = func;
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glDepthFunc(func);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleDepthMask(uint32_t immediate_data_size,
6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
6371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DepthMask& c =
6381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DepthMask*>(cmd_data);
6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLboolean flag = static_cast<GLboolean>(c.flag);
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.depth_mask != flag) {
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.depth_mask = flag;
6433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    framebuffer_state_.clear_state_dirty = true;
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleDepthRangef(uint32_t immediate_data_size,
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 const void* cmd_data) {
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DepthRangef& c =
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DepthRangef*>(cmd_data);
6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf zNear = static_cast<GLclampf>(c.zNear);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf zFar = static_cast<GLclampf>(c.zFar);
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoDepthRangef(zNear, zFar);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleDetachShader(uint32_t immediate_data_size,
6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  const void* cmd_data) {
6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DetachShader& c =
6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DetachShader*>(cmd_data);
6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = c.program;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint shader = c.shader;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoDetachShader(program, shader);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleDisable(uint32_t immediate_data_size,
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             const void* cmd_data) {
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Disable& c =
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Disable*>(cmd_data);
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum cap = static_cast<GLenum>(c.cap);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->capability.IsValid(cap)) {
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glDisable", cap, "cap");
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoDisable(cap);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleDisableVertexAttribArray(
685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DisableVertexAttribArray& c =
6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DisableVertexAttribArray*>(cmd_data);
6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint index = static_cast<GLuint>(c.index);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoDisableVertexAttribArray(index);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleEnable(uint32_t immediate_data_size,
6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            const void* cmd_data) {
6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Enable& c =
6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Enable*>(cmd_data);
6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum cap = static_cast<GLenum>(c.cap);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->capability.IsValid(cap)) {
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glEnable", cap, "cap");
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnable(cap);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleEnableVertexAttribArray(
710010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::EnableVertexAttribArray& c =
7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::EnableVertexAttribArray*>(cmd_data);
7141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint index = static_cast<GLuint>(c.index);
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoEnableVertexAttribArray(index);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
720010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleFinish(uint32_t immediate_data_size,
7211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            const void* cmd_data) {
7221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Finish& c =
7231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Finish*>(cmd_data);
7241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error::Error error;
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error = WillAccessBoundFramebufferForRead();
7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (error != error::kNoError)
7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return error;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoFinish();
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
733010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleFlush(uint32_t immediate_data_size,
7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           const void* cmd_data) {
7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Flush& c =
7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Flush*>(cmd_data);
7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoFlush();
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleFramebufferRenderbuffer(
743010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::FramebufferRenderbuffer& c =
7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::FramebufferRenderbuffer*>(cmd_data);
7471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum attachment = static_cast<GLenum>(c.attachment);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum renderbuffertarget = static_cast<GLenum>(c.renderbuffertarget);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint renderbuffer = c.renderbuffer;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->frame_buffer_target.IsValid(target)) {
753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glFramebufferRenderbuffer", target, "target");
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->attachment.IsValid(attachment)) {
758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glFramebufferRenderbuffer", attachment, "attachment");
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->render_buffer_target.IsValid(renderbuffertarget)) {
763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glFramebufferRenderbuffer", renderbuffertarget, "renderbuffertarget");
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoFramebufferRenderbuffer(
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, attachment, renderbuffertarget, renderbuffer);
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleFramebufferTexture2D(
773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
7751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::FramebufferTexture2D& c =
7761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::FramebufferTexture2D*>(cmd_data);
7771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum attachment = static_cast<GLenum>(c.attachment);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum textarget = static_cast<GLenum>(c.textarget);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint texture = c.texture;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint level = static_cast<GLint>(c.level);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->frame_buffer_target.IsValid(target)) {
784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", target, "target");
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->attachment.IsValid(attachment)) {
788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glFramebufferTexture2D", attachment, "attachment");
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_target.IsValid(textarget)) {
793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glFramebufferTexture2D", textarget, "textarget");
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoFramebufferTexture2D(target, attachment, textarget, texture, level);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleFrontFace(uint32_t immediate_data_size,
8021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
8031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::FrontFace& c =
8041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::FrontFace*>(cmd_data);
8051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum mode = static_cast<GLenum>(c.mode);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->face_mode.IsValid(mode)) {
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glFrontFace", mode, "mode");
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.front_face != mode) {
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.front_face = mode;
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glFrontFace(mode);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGenBuffersImmediate(
819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GenBuffersImmediate& c =
8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GenBuffersImmediate*>(cmd_data);
8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GLuint* buffers =
830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (buffers == NULL) {
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GenBuffersHelper(n, buffers)) {
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGenerateMipmap(
841010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GenerateMipmap& c =
8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GenerateMipmap*>(cmd_data);
8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGenerateMipmap", target, "target");
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoGenerateMipmap(target);
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGenFramebuffersImmediate(
856010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GenFramebuffersImmediate& c =
8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GenFramebuffersImmediate*>(cmd_data);
8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
866a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GLuint* framebuffers =
867a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (framebuffers == NULL) {
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GenFramebuffersHelper(n, framebuffers)) {
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGenRenderbuffersImmediate(
878010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GenRenderbuffersImmediate& c =
8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GenRenderbuffersImmediate*>(cmd_data);
8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
888a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GLuint* renderbuffers =
889a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (renderbuffers == NULL) {
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GenRenderbuffersHelper(n, renderbuffers)) {
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGenTexturesImmediate(
900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
9011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GenTexturesImmediate& c =
9031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GenTexturesImmediate*>(cmd_data);
9041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
910a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GLuint* textures =
911a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (textures == NULL) {
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GenTexturesHelper(n, textures)) {
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleGetBooleanv(uint32_t immediate_data_size,
9221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 const void* cmd_data) {
9231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetBooleanv& c =
9241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetBooleanv*>(cmd_data);
9251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetBooleanv::Result Result;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLboolean* params = result ? result->GetData() : NULL;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->g_l_state.IsValid(pname)) {
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBooleanv", pname, "pname");
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetBooleanv");
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoGetBooleanv(pname, params);
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum error = glGetError();
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "GetBooleanv", "");
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGetBufferParameteriv(
956010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
9571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
9581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetBufferParameteriv& c =
9591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetBufferParameteriv*>(cmd_data);
9601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetBufferParameteriv::Result Result;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint* params = result ? result->GetData() : NULL;
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->buffer_target.IsValid(target)) {
970a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", target, "target");
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->buffer_parameter.IsValid(pname)) {
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", pname, "pname");
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoGetBufferParameteriv(target, pname, params);
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result->SetNumResults(num_values);
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
988010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleGetError(uint32_t immediate_data_size,
9891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              const void* cmd_data) {
9901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetError& c =
9911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetError*>(cmd_data);
9921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetError::Result Result;
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  *result_dst = GetErrorState()->GetGLError();
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleGetFloatv(uint32_t immediate_data_size,
10041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
10051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetFloatv& c =
10061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetFloatv*>(cmd_data);
10071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetFloatv::Result Result;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat* params = result ? result->GetData() : NULL;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->g_l_state.IsValid(pname)) {
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFloatv", pname, "pname");
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetFloatv");
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoGetFloatv(pname, params);
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum error = glGetError();
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "GetFloatv", "");
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGetFramebufferAttachmentParameteriv(
1038010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
10391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
10401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetFramebufferAttachmentParameteriv& c =
10411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetFramebufferAttachmentParameteriv*>(
10421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cmd_data);
10431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum attachment = static_cast<GLenum>(c.attachment);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetFramebufferAttachmentParameteriv::Result Result;
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint* params = result ? result->GetData() : NULL;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->frame_buffer_target.IsValid(target)) {
1054a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
1055a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glGetFramebufferAttachmentParameteriv", target, "target");
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->attachment.IsValid(attachment)) {
1059a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
1060a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glGetFramebufferAttachmentParameteriv", attachment, "attachment");
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->frame_buffer_parameter.IsValid(pname)) {
1064a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
1065a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glGetFramebufferAttachmentParameteriv", pname, "pname");
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetFramebufferAttachmentParameteriv");
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum error = glGetError();
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "GetFramebufferAttachmentParameteriv", "");
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleGetIntegerv(uint32_t immediate_data_size,
10871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 const void* cmd_data) {
10881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetIntegerv& c =
10891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetIntegerv*>(cmd_data);
10901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetIntegerv::Result Result;
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint* params = result ? result->GetData() : NULL;
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->g_l_state.IsValid(pname)) {
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetIntegerv", pname, "pname");
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetIntegerv");
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoGetIntegerv(pname, params);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum error = glGetError();
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "GetIntegerv", "");
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleGetProgramiv(uint32_t immediate_data_size,
11211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  const void* cmd_data) {
11221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetProgramiv& c =
11231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetProgramiv*>(cmd_data);
11241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = c.program;
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetProgramiv::Result Result;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint* params = result ? result->GetData() : NULL;
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->program_parameter.IsValid(pname)) {
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetProgramiv", pname, "pname");
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetProgramiv");
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoGetProgramiv(program, pname, params);
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum error = glGetError();
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "GetProgramiv", "");
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGetRenderbufferParameteriv(
1156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
11571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
11581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetRenderbufferParameteriv& c =
11591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetRenderbufferParameteriv*>(cmd_data);
11601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetRenderbufferParameteriv::Result Result;
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint* params = result ? result->GetData() : NULL;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->render_buffer_target.IsValid(target)) {
1170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
1171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glGetRenderbufferParameteriv", target, "target");
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->render_buffer_parameter.IsValid(pname)) {
1175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
1176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glGetRenderbufferParameteriv", pname, "pname");
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetRenderbufferParameteriv");
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoGetRenderbufferParameteriv(target, pname, params);
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum error = glGetError();
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "GetRenderbufferParameteriv", "");
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleGetShaderiv(uint32_t immediate_data_size,
11981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 const void* cmd_data) {
11991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetShaderiv& c =
12001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetShaderiv*>(cmd_data);
12011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint shader = c.shader;
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetShaderiv::Result Result;
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint* params = result ? result->GetData() : NULL;
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->shader_parameter.IsValid(pname)) {
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetShaderiv", pname, "pname");
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetShaderiv");
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoGetShaderiv(shader, pname, params);
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum error = glGetError();
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "GetShaderiv", "");
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGetTexParameterfv(
1233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
12341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
12351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetTexParameterfv& c =
12361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetTexParameterfv*>(cmd_data);
12371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetTexParameterfv::Result Result;
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat* params = result ? result->GetData() : NULL;
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->get_tex_param_target.IsValid(target)) {
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameterfv", target, "target");
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_parameter.IsValid(pname)) {
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameterfv", pname, "pname");
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetTexParameterfv");
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoGetTexParameterfv(target, pname, params);
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum error = glGetError();
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "GetTexParameterfv", "");
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGetTexParameteriv(
1273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
12741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
12751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetTexParameteriv& c =
12761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetTexParameteriv*>(cmd_data);
12771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetTexParameteriv::Result Result;
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint* params = result ? result->GetData() : NULL;
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->get_tex_param_target.IsValid(target)) {
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameteriv", target, "target");
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_parameter.IsValid(pname)) {
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameteriv", pname, "pname");
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetTexParameteriv");
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DoGetTexParameteriv(target, pname, params);
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum error = glGetError();
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "GetTexParameteriv", "");
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGetVertexAttribfv(
1313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
13141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
13151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetVertexAttribfv& c =
13161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetVertexAttribfv*>(cmd_data);
13171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint index = static_cast<GLuint>(c.index);
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetVertexAttribfv::Result Result;
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat* params = result ? result->GetData() : NULL;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->vertex_attribute.IsValid(pname)) {
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribfv", pname, "pname");
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribfv");
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoGetVertexAttribfv(index, pname, params);
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum error = glGetError();
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "GetVertexAttribfv", "");
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGetVertexAttribiv(
1349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
13501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
13511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetVertexAttribiv& c =
13521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetVertexAttribiv*>(cmd_data);
13531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint index = static_cast<GLuint>(c.index);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetVertexAttribiv::Result Result;
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint* params = result ? result->GetData() : NULL;
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->vertex_attribute.IsValid(pname)) {
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribiv", pname, "pname");
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribiv");
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the client initialized the result.
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoGetVertexAttribiv(index, pname, params);
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum error = glGetError();
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "GetVertexAttribiv", "");
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleHint(uint32_t immediate_data_size,
13851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          const void* cmd_data) {
13861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Hint& c = *static_cast<const gles2::cmds::Hint*>(cmd_data);
13871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum mode = static_cast<GLenum>(c.mode);
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->hint_target.IsValid(target)) {
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glHint", target, "target");
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->hint_mode.IsValid(mode)) {
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glHint", mode, "mode");
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  switch (target) {
1399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case GL_GENERATE_MIPMAP_HINT:
1400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (state_.hint_generate_mipmap != mode) {
1401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        state_.hint_generate_mipmap = mode;
1402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        glHint(target, mode);
1403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
1404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
1405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
1406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (state_.hint_fragment_shader_derivative != mode) {
1407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        state_.hint_fragment_shader_derivative = mode;
1408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        glHint(target, mode);
1409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
1410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
1411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    default:
1412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      NOTREACHED();
1413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleIsBuffer(uint32_t immediate_data_size,
14181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              const void* cmd_data) {
14191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::IsBuffer& c =
14201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::IsBuffer*>(cmd_data);
14211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint buffer = c.buffer;
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::IsBuffer::Result Result;
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_dst = DoIsBuffer(buffer);
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleIsEnabled(uint32_t immediate_data_size,
14341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
14351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::IsEnabled& c =
14361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::IsEnabled*>(cmd_data);
14371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum cap = static_cast<GLenum>(c.cap);
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::IsEnabled::Result Result;
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->capability.IsValid(cap)) {
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glIsEnabled", cap, "cap");
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_dst = DoIsEnabled(cap);
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleIsFramebuffer(uint32_t immediate_data_size,
14541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   const void* cmd_data) {
14551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::IsFramebuffer& c =
14561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::IsFramebuffer*>(cmd_data);
14571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint framebuffer = c.framebuffer;
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::IsFramebuffer::Result Result;
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_dst = DoIsFramebuffer(framebuffer);
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleIsProgram(uint32_t immediate_data_size,
14701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
14711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::IsProgram& c =
14721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::IsProgram*>(cmd_data);
14731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = c.program;
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::IsProgram::Result Result;
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_dst = DoIsProgram(program);
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleIsRenderbuffer(
1486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
14871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
14881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::IsRenderbuffer& c =
14891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::IsRenderbuffer*>(cmd_data);
14901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint renderbuffer = c.renderbuffer;
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::IsRenderbuffer::Result Result;
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_dst = DoIsRenderbuffer(renderbuffer);
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleIsShader(uint32_t immediate_data_size,
15031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              const void* cmd_data) {
15041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::IsShader& c =
15051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::IsShader*>(cmd_data);
15061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint shader = c.shader;
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::IsShader::Result Result;
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_dst = DoIsShader(shader);
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleIsTexture(uint32_t immediate_data_size,
15191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
15201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::IsTexture& c =
15211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::IsTexture*>(cmd_data);
15221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint texture = c.texture;
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::IsTexture::Result Result;
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_dst = DoIsTexture(texture);
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleLineWidth(uint32_t immediate_data_size,
15351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
15361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::LineWidth& c =
15371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::LineWidth*>(cmd_data);
15381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat width = static_cast<GLfloat>(c.width);
15406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (width <= 0.0f || base::IsNaN(width)) {
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "LineWidth", "width out of range");
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error::kNoError;
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.line_width != width) {
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.line_width = width;
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glLineWidth(width);
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleLinkProgram(uint32_t immediate_data_size,
15521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 const void* cmd_data) {
15531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::LinkProgram& c =
15541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::LinkProgram*>(cmd_data);
15551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = c.program;
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoLinkProgram(program);
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandlePolygonOffset(uint32_t immediate_data_size,
15621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   const void* cmd_data) {
15631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::PolygonOffset& c =
15641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::PolygonOffset*>(cmd_data);
15651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat factor = static_cast<GLfloat>(c.factor);
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat units = static_cast<GLfloat>(c.units);
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.polygon_offset_factor != factor ||
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.polygon_offset_units != units) {
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.polygon_offset_factor = factor;
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.polygon_offset_units = units;
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glPolygonOffset(factor, units);
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleReleaseShaderCompiler(
1578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
15791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
15801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::ReleaseShaderCompiler& c =
15811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::ReleaseShaderCompiler*>(cmd_data);
15821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoReleaseShaderCompiler();
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleRenderbufferStorage(
1588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
15891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
15901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::RenderbufferStorage& c =
15911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::RenderbufferStorage*>(cmd_data);
15921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum internalformat = static_cast<GLenum>(c.internalformat);
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei width = static_cast<GLsizei>(c.width);
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei height = static_cast<GLsizei>(c.height);
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->render_buffer_target.IsValid(target)) {
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorage", target, "target");
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->render_buffer_format.IsValid(internalformat)) {
1602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
1603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glRenderbufferStorage", internalformat, "internalformat");
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (width < 0) {
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glRenderbufferStorage", "width < 0");
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (height < 0) {
1611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glRenderbufferStorage", "height < 0");
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoRenderbufferStorage(target, internalformat, width, height);
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleSampleCoverage(
1619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
16201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
16211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::SampleCoverage& c =
16221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::SampleCoverage*>(cmd_data);
16231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLclampf value = static_cast<GLclampf>(c.value);
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLboolean invert = static_cast<GLboolean>(c.invert);
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoSampleCoverage(value, invert);
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleScissor(uint32_t immediate_data_size,
16311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             const void* cmd_data) {
16321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Scissor& c =
16331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Scissor*>(cmd_data);
16341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint x = static_cast<GLint>(c.x);
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint y = static_cast<GLint>(c.y);
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei width = static_cast<GLsizei>(c.width);
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei height = static_cast<GLsizei>(c.height);
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (width < 0) {
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glScissor", "width < 0");
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (height < 0) {
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glScissor", "height < 0");
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (state_.scissor_x != x || state_.scissor_y != y ||
1648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      state_.scissor_width != width || state_.scissor_height != height) {
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.scissor_x = x;
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.scissor_y = y;
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.scissor_width = width;
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.scissor_height = height;
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glScissor(x, y, width, height);
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleStencilFunc(uint32_t immediate_data_size,
16591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 const void* cmd_data) {
16601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::StencilFunc& c =
16611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::StencilFunc*>(cmd_data);
16621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum func = static_cast<GLenum>(c.func);
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint ref = static_cast<GLint>(c.ref);
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint mask = static_cast<GLuint>(c.mask);
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->cmp_function.IsValid(func)) {
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFunc", func, "func");
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (state_.stencil_front_func != func || state_.stencil_front_ref != ref ||
1671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      state_.stencil_front_mask != mask || state_.stencil_back_func != func ||
1672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      state_.stencil_back_ref != ref || state_.stencil_back_mask != mask) {
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_front_func = func;
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_front_ref = ref;
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_front_mask = mask;
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_back_func = func;
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_back_ref = ref;
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_back_mask = mask;
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glStencilFunc(func, ref, mask);
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleStencilFuncSeparate(
1685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
16861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
16871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::StencilFuncSeparate& c =
16881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::StencilFuncSeparate*>(cmd_data);
16891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum face = static_cast<GLenum>(c.face);
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum func = static_cast<GLenum>(c.func);
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint ref = static_cast<GLint>(c.ref);
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint mask = static_cast<GLuint>(c.mask);
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->face_type.IsValid(face)) {
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFuncSeparate", face, "face");
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->cmp_function.IsValid(func)) {
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFuncSeparate", func, "func");
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool changed = false;
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    changed |= state_.stencil_front_func != func ||
1705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               state_.stencil_front_ref != ref ||
1706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               state_.stencil_front_mask != mask;
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    changed |= state_.stencil_back_func != func ||
1710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               state_.stencil_back_ref != ref ||
1711a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               state_.stencil_back_mask != mask;
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (changed) {
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_front_func = func;
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_front_ref = ref;
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_front_mask = mask;
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_back_func = func;
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_back_ref = ref;
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_back_mask = mask;
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glStencilFuncSeparate(face, func, ref, mask);
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleStencilMask(uint32_t immediate_data_size,
17301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 const void* cmd_data) {
17311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::StencilMask& c =
17321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::StencilMask*>(cmd_data);
17331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint mask = static_cast<GLuint>(c.mask);
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.stencil_front_writemask != mask ||
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_back_writemask != mask) {
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_front_writemask = mask;
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_back_writemask = mask;
17393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    framebuffer_state_.clear_state_dirty = true;
17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleStencilMaskSeparate(
1745010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
17461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
17471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::StencilMaskSeparate& c =
17481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::StencilMaskSeparate*>(cmd_data);
17491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum face = static_cast<GLenum>(c.face);
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint mask = static_cast<GLuint>(c.mask);
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->face_type.IsValid(face)) {
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilMaskSeparate", face, "face");
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool changed = false;
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    changed |= state_.stencil_front_writemask != mask;
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    changed |= state_.stencil_back_writemask != mask;
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (changed) {
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_front_writemask = mask;
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_back_writemask = mask;
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    framebuffer_state_.clear_state_dirty = true;
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleStencilOp(uint32_t immediate_data_size,
17761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
17771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::StencilOp& c =
17781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::StencilOp*>(cmd_data);
17791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum fail = static_cast<GLenum>(c.fail);
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum zfail = static_cast<GLenum>(c.zfail);
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum zpass = static_cast<GLenum>(c.zpass);
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->stencil_op.IsValid(fail)) {
17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", fail, "fail");
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->stencil_op.IsValid(zfail)) {
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", zfail, "zfail");
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->stencil_op.IsValid(zpass)) {
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", zpass, "zpass");
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state_.stencil_front_fail_op != fail ||
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_front_z_fail_op != zfail ||
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_front_z_pass_op != zpass ||
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_back_fail_op != fail ||
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_back_z_fail_op != zfail ||
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_back_z_pass_op != zpass) {
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_front_fail_op = fail;
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_front_z_fail_op = zfail;
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_front_z_pass_op = zpass;
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_back_fail_op = fail;
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_back_z_fail_op = zfail;
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_.stencil_back_z_pass_op = zpass;
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glStencilOp(fail, zfail, zpass);
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleStencilOpSeparate(
1813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
18141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
18151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::StencilOpSeparate& c =
18161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::StencilOpSeparate*>(cmd_data);
18171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum face = static_cast<GLenum>(c.face);
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum fail = static_cast<GLenum>(c.fail);
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum zfail = static_cast<GLenum>(c.zfail);
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum zpass = static_cast<GLenum>(c.zpass);
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->face_type.IsValid(face)) {
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", face, "face");
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->stencil_op.IsValid(fail)) {
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", fail, "fail");
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->stencil_op.IsValid(zfail)) {
18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", zfail, "zfail");
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->stencil_op.IsValid(zpass)) {
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", zpass, "zpass");
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool changed = false;
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    changed |= state_.stencil_front_fail_op != fail ||
1841a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               state_.stencil_front_z_fail_op != zfail ||
1842a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               state_.stencil_front_z_pass_op != zpass;
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    changed |= state_.stencil_back_fail_op != fail ||
1846a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               state_.stencil_back_z_fail_op != zfail ||
1847a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               state_.stencil_back_z_pass_op != zpass;
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (changed) {
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_front_fail_op = fail;
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_front_z_fail_op = zfail;
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_front_z_pass_op = zpass;
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_back_fail_op = fail;
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_back_z_fail_op = zfail;
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      state_.stencil_back_z_pass_op = zpass;
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    glStencilOpSeparate(face, fail, zfail, zpass);
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleTexParameterf(uint32_t immediate_data_size,
18661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   const void* cmd_data) {
18671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::TexParameterf& c =
18681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::TexParameterf*>(cmd_data);
18691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat param = static_cast<GLfloat>(c.param);
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterf", target, "target");
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_parameter.IsValid(pname)) {
18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterf", pname, "pname");
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoTexParameterf(target, pname, param);
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleTexParameterfvImmediate(
1886010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
18871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
18881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::TexParameterfvImmediate& c =
18891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::TexParameterfvImmediate*>(cmd_data);
18901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
1893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(1, sizeof(GLfloat), 1, &data_size)) {
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1900a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* params =
1901a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", target, "target");
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_parameter.IsValid(pname)) {
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", pname, "pname");
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoTexParameterfv(target, pname, params);
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleTexParameteri(uint32_t immediate_data_size,
19181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   const void* cmd_data) {
19191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::TexParameteri& c =
19201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::TexParameteri*>(cmd_data);
19211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint param = static_cast<GLint>(c.param);
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", target, "target");
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_parameter.IsValid(pname)) {
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", pname, "pname");
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoTexParameteri(target, pname, param);
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleTexParameterivImmediate(
1938010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
19391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
19401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::TexParameterivImmediate& c =
19411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::TexParameterivImmediate*>(cmd_data);
19421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum pname = static_cast<GLenum>(c.pname);
1945010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(1, sizeof(GLint), 1, &data_size)) {
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1952a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLint* params =
1953a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", target, "target");
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_parameter.IsValid(pname)) {
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", pname, "pname");
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (params == NULL) {
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoTexParameteriv(target, pname, params);
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleUniform1f(uint32_t immediate_data_size,
19701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
19711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform1f& c =
19721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform1f*>(cmd_data);
19731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat x = static_cast<GLfloat>(c.x);
19765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GLfloat temp[1] = {
19775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      x,
19785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  };
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform1fv(location, 1, &temp[0]);
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleUniform1fvImmediate(
1984010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
19851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
19861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform1fvImmediate& c =
19871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform1fvImmediate*>(cmd_data);
19881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
1991010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLfloat), 1, &data_size)) {
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1998a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* v =
1999a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v == NULL) {
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform1fv(location, count, v);
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleUniform1i(uint32_t immediate_data_size,
20081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
20091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform1i& c =
20101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform1i*>(cmd_data);
20111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint x = static_cast<GLint>(c.x);
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform1i(location, x);
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleUniform1ivImmediate(
2019010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
20201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
20211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform1ivImmediate& c =
20221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform1ivImmediate*>(cmd_data);
20231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
2026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLint), 1, &data_size)) {
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2033a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLint* v =
2034a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v == NULL) {
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform1iv(location, count, v);
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleUniform2f(uint32_t immediate_data_size,
20431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
20441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform2f& c =
20451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform2f*>(cmd_data);
20461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat x = static_cast<GLfloat>(c.x);
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat y = static_cast<GLfloat>(c.y);
20505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GLfloat temp[2] = {
20515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      x, y,
20525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  };
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform2fv(location, 1, &temp[0]);
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleUniform2fvImmediate(
2058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
20591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
20601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform2fvImmediate& c =
20611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform2fvImmediate*>(cmd_data);
20621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
2065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLfloat), 2, &data_size)) {
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2072a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* v =
2073a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v == NULL) {
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform2fv(location, count, v);
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleUniform2i(uint32_t immediate_data_size,
20821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
20831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform2i& c =
20841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform2i*>(cmd_data);
20851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint x = static_cast<GLint>(c.x);
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint y = static_cast<GLint>(c.y);
20895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GLint temp[2] = {
20905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      x, y,
20915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  };
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform2iv(location, 1, &temp[0]);
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleUniform2ivImmediate(
2097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
20981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
20991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform2ivImmediate& c =
21001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform2ivImmediate*>(cmd_data);
21011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
2104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLint), 2, &data_size)) {
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLint* v =
2112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v == NULL) {
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform2iv(location, count, v);
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleUniform3f(uint32_t immediate_data_size,
21211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
21221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform3f& c =
21231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform3f*>(cmd_data);
21241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat x = static_cast<GLfloat>(c.x);
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat y = static_cast<GLfloat>(c.y);
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat z = static_cast<GLfloat>(c.z);
21295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GLfloat temp[3] = {
21305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      x, y, z,
21315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  };
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform3fv(location, 1, &temp[0]);
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleUniform3fvImmediate(
2137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
21381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
21391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform3fvImmediate& c =
21401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform3fvImmediate*>(cmd_data);
21411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
2144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLfloat), 3, &data_size)) {
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* v =
2152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v == NULL) {
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform3fv(location, count, v);
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleUniform3i(uint32_t immediate_data_size,
21611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
21621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform3i& c =
21631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform3i*>(cmd_data);
21641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint x = static_cast<GLint>(c.x);
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint y = static_cast<GLint>(c.y);
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint z = static_cast<GLint>(c.z);
21695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GLint temp[3] = {
21705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      x, y, z,
21715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  };
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform3iv(location, 1, &temp[0]);
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleUniform3ivImmediate(
2177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
21781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
21791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform3ivImmediate& c =
21801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform3ivImmediate*>(cmd_data);
21811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
2184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLint), 3, &data_size)) {
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLint* v =
2192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v == NULL) {
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform3iv(location, count, v);
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleUniform4f(uint32_t immediate_data_size,
22011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
22021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform4f& c =
22031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform4f*>(cmd_data);
22041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat x = static_cast<GLfloat>(c.x);
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat y = static_cast<GLfloat>(c.y);
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat z = static_cast<GLfloat>(c.z);
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat w = static_cast<GLfloat>(c.w);
22105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GLfloat temp[4] = {
22115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      x, y, z, w,
22125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  };
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform4fv(location, 1, &temp[0]);
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleUniform4fvImmediate(
2218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
22191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
22201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform4fvImmediate& c =
22211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform4fvImmediate*>(cmd_data);
22221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
2225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLfloat), 4, &data_size)) {
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* v =
2233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v == NULL) {
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform4fv(location, count, v);
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleUniform4i(uint32_t immediate_data_size,
22421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                               const void* cmd_data) {
22431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform4i& c =
22441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform4i*>(cmd_data);
22451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint x = static_cast<GLint>(c.x);
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint y = static_cast<GLint>(c.y);
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint z = static_cast<GLint>(c.z);
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint w = static_cast<GLint>(c.w);
22515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GLint temp[4] = {
22525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      x, y, z, w,
22535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  };
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform4iv(location, 1, &temp[0]);
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleUniform4ivImmediate(
2259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
22601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
22611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Uniform4ivImmediate& c =
22621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Uniform4ivImmediate*>(cmd_data);
22631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
2266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLint), 4, &data_size)) {
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLint* v =
2274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v == NULL) {
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniform4iv(location, count, v);
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleUniformMatrix2fvImmediate(
2283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
22841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
22851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::UniformMatrix2fvImmediate& c =
22861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::UniformMatrix2fvImmediate*>(cmd_data);
22871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLboolean transpose = static_cast<GLboolean>(c.transpose);
2291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLfloat), 4, &data_size)) {
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* value =
2299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value == NULL) {
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniformMatrix2fv(location, count, transpose, value);
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleUniformMatrix3fvImmediate(
2308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
23091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
23101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::UniformMatrix3fvImmediate& c =
23111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::UniformMatrix3fvImmediate*>(cmd_data);
23121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLboolean transpose = static_cast<GLboolean>(c.transpose);
2316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLfloat), 9, &data_size)) {
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* value =
2324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value == NULL) {
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniformMatrix3fv(location, count, transpose, value);
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleUniformMatrix4fvImmediate(
2333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
23341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
23351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::UniformMatrix4fvImmediate& c =
23361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::UniformMatrix4fvImmediate*>(cmd_data);
23371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint location = static_cast<GLint>(c.location);
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLboolean transpose = static_cast<GLboolean>(c.transpose);
2341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLfloat), 16, &data_size)) {
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* value =
2349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (value == NULL) {
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUniformMatrix4fv(location, count, transpose, value);
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleUseProgram(uint32_t immediate_data_size,
23581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                const void* cmd_data) {
23591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::UseProgram& c =
23601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::UseProgram*>(cmd_data);
23611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = c.program;
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoUseProgram(program);
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleValidateProgram(
2368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
23691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
23701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::ValidateProgram& c =
23711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::ValidateProgram*>(cmd_data);
23721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint program = c.program;
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoValidateProgram(program);
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleVertexAttrib1f(
2379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
23801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
23811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::VertexAttrib1f& c =
23821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::VertexAttrib1f*>(cmd_data);
23831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint indx = static_cast<GLuint>(c.indx);
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat x = static_cast<GLfloat>(c.x);
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttrib1f(indx, x);
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleVertexAttrib1fvImmediate(
2391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
23921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
23931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::VertexAttrib1fvImmediate& c =
23941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::VertexAttrib1fvImmediate*>(cmd_data);
23951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint indx = static_cast<GLuint>(c.indx);
2397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(1, sizeof(GLfloat), 1, &data_size)) {
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* values =
2405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (values == NULL) {
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttrib1fv(indx, values);
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleVertexAttrib2f(
2414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
24151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
24161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::VertexAttrib2f& c =
24171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::VertexAttrib2f*>(cmd_data);
24181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint indx = static_cast<GLuint>(c.indx);
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat x = static_cast<GLfloat>(c.x);
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat y = static_cast<GLfloat>(c.y);
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttrib2f(indx, x, y);
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleVertexAttrib2fvImmediate(
2427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
24281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
24291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::VertexAttrib2fvImmediate& c =
24301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::VertexAttrib2fvImmediate*>(cmd_data);
24311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint indx = static_cast<GLuint>(c.indx);
2433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(1, sizeof(GLfloat), 2, &data_size)) {
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* values =
2441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (values == NULL) {
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttrib2fv(indx, values);
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleVertexAttrib3f(
2450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
24511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
24521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::VertexAttrib3f& c =
24531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::VertexAttrib3f*>(cmd_data);
24541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint indx = static_cast<GLuint>(c.indx);
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat x = static_cast<GLfloat>(c.x);
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat y = static_cast<GLfloat>(c.y);
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat z = static_cast<GLfloat>(c.z);
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttrib3f(indx, x, y, z);
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleVertexAttrib3fvImmediate(
2464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
24651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
24661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::VertexAttrib3fvImmediate& c =
24671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::VertexAttrib3fvImmediate*>(cmd_data);
24681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint indx = static_cast<GLuint>(c.indx);
2470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(1, sizeof(GLfloat), 3, &data_size)) {
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* values =
2478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (values == NULL) {
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttrib3fv(indx, values);
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleVertexAttrib4f(
2487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
24881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
24891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::VertexAttrib4f& c =
24901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::VertexAttrib4f*>(cmd_data);
24911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint indx = static_cast<GLuint>(c.indx);
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat x = static_cast<GLfloat>(c.x);
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat y = static_cast<GLfloat>(c.y);
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat z = static_cast<GLfloat>(c.z);
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLfloat w = static_cast<GLfloat>(c.w);
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttrib4f(indx, x, y, z, w);
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleVertexAttrib4fvImmediate(
2502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
25031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
25041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::VertexAttrib4fvImmediate& c =
25051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::VertexAttrib4fvImmediate*>(cmd_data);
25061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint indx = static_cast<GLuint>(c.indx);
2508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(1, sizeof(GLfloat), 4, &data_size)) {
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLfloat* values =
2516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (values == NULL) {
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoVertexAttrib4fv(indx, values);
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleViewport(uint32_t immediate_data_size,
25251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              const void* cmd_data) {
25261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::Viewport& c =
25271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::Viewport*>(cmd_data);
25281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint x = static_cast<GLint>(c.x);
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint y = static_cast<GLint>(c.y);
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei width = static_cast<GLsizei>(c.width);
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei height = static_cast<GLsizei>(c.height);
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (width < 0) {
25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glViewport", "width < 0");
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (height < 0) {
25382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glViewport", "height < 0");
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoViewport(x, y, width, height);
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleBlitFramebufferCHROMIUM(
2546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
25471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
25481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BlitFramebufferCHROMIUM& c =
25491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BlitFramebufferCHROMIUM*>(cmd_data);
25501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
2551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!features().chromium_framebuffer_multisample) {
2552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
2553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       "glBlitFramebufferCHROMIUM",
2554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       "function not available");
2555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return error::kNoError;
2556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
2557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
25585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error::Error error;
25595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error = WillAccessBoundFramebufferForDraw();
25605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (error != error::kNoError)
25615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return error;
25625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error = WillAccessBoundFramebufferForRead();
25635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (error != error::kNoError)
25645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return error;
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint srcX0 = static_cast<GLint>(c.srcX0);
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint srcY0 = static_cast<GLint>(c.srcY0);
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint srcX1 = static_cast<GLint>(c.srcX1);
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint srcY1 = static_cast<GLint>(c.srcY1);
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint dstX0 = static_cast<GLint>(c.dstX0);
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint dstY0 = static_cast<GLint>(c.dstY0);
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint dstX1 = static_cast<GLint>(c.dstX1);
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint dstY1 = static_cast<GLint>(c.dstY1);
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLbitfield mask = static_cast<GLbitfield>(c.mask);
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum filter = static_cast<GLenum>(c.filter);
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->blit_filter.IsValid(filter)) {
2576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
2577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glBlitFramebufferCHROMIUM", filter, "filter");
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DoBlitFramebufferCHROMIUM(
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleCHROMIUM(
2586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
25871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
25881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM& c =
25891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM*>(
25901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cmd_data);
25911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
2592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!features().chromium_framebuffer_multisample) {
2593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
2594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       "glRenderbufferStorageMultisampleCHROMIUM",
2595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       "function not available");
2596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return error::kNoError;
2597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
2598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
2600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GLsizei samples = static_cast<GLsizei>(c.samples);
2601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GLenum internalformat = static_cast<GLenum>(c.internalformat);
2602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GLsizei width = static_cast<GLsizei>(c.width);
2603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GLsizei height = static_cast<GLsizei>(c.height);
2604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!validators_->render_buffer_target.IsValid(target)) {
2605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
2606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glRenderbufferStorageMultisampleCHROMIUM", target, "target");
2607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return error::kNoError;
2608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
2609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (samples < 0) {
2610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
2611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       "glRenderbufferStorageMultisampleCHROMIUM",
2612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       "samples < 0");
2613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return error::kNoError;
2614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
2615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!validators_->render_buffer_format.IsValid(internalformat)) {
2616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleCHROMIUM",
2617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    internalformat,
2618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    "internalformat");
2619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return error::kNoError;
2620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
2621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (width < 0) {
2622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
2623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       "glRenderbufferStorageMultisampleCHROMIUM",
2624a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       "width < 0");
2625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return error::kNoError;
2626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
2627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (height < 0) {
2628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
2629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       "glRenderbufferStorageMultisampleCHROMIUM",
2630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       "height < 0");
2631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return error::kNoError;
2632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
2633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DoRenderbufferStorageMultisampleCHROMIUM(
2634f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      target, samples, internalformat, width, height);
2635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return error::kNoError;
2636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
2637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleEXT(
2639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
26401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
26411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::RenderbufferStorageMultisampleEXT& c =
26421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::RenderbufferStorageMultisampleEXT*>(
26431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cmd_data);
26441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
2645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!features().multisampled_render_to_texture) {
2646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
2647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       "glRenderbufferStorageMultisampleEXT",
2648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       "function not available");
2649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return error::kNoError;
2650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
2651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei samples = static_cast<GLsizei>(c.samples);
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum internalformat = static_cast<GLenum>(c.internalformat);
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei width = static_cast<GLsizei>(c.width);
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei height = static_cast<GLsizei>(c.height);
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->render_buffer_target.IsValid(target)) {
2658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
2659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glRenderbufferStorageMultisampleEXT", target, "target");
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (samples < 0) {
26632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "samples < 0");
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->render_buffer_format.IsValid(internalformat)) {
2668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleEXT",
2669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    internalformat,
2670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    "internalformat");
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (width < 0) {
26742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "width < 0");
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (height < 0) {
26792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "height < 0");
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2683f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DoRenderbufferStorageMultisampleEXT(
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target, samples, internalformat, width, height);
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdocherror::Error GLES2DecoderImpl::HandleFramebufferTexture2DMultisampleEXT(
2689010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
26901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
26911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::FramebufferTexture2DMultisampleEXT& c =
26921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::FramebufferTexture2DMultisampleEXT*>(
26931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cmd_data);
26941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
2695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!features().multisampled_render_to_texture) {
2696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
2697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       "glFramebufferTexture2DMultisampleEXT",
2698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       "function not available");
2699cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return error::kNoError;
2700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
2701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GLenum target = static_cast<GLenum>(c.target);
27037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GLenum attachment = static_cast<GLenum>(c.attachment);
27047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GLenum textarget = static_cast<GLenum>(c.textarget);
27057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GLuint texture = c.texture;
27067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GLint level = static_cast<GLint>(c.level);
27077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GLsizei samples = static_cast<GLsizei>(c.samples);
27087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!validators_->frame_buffer_target.IsValid(target)) {
2709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
2710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glFramebufferTexture2DMultisampleEXT", target, "target");
27117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return error::kNoError;
27127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
27137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!validators_->attachment.IsValid(attachment)) {
2714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
2715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glFramebufferTexture2DMultisampleEXT", attachment, "attachment");
27167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return error::kNoError;
27177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
27187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!validators_->texture_target.IsValid(textarget)) {
2719a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
2720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glFramebufferTexture2DMultisampleEXT", textarget, "textarget");
27217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return error::kNoError;
27227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
27237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (samples < 0) {
2724a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
2725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       "glFramebufferTexture2DMultisampleEXT",
2726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       "samples < 0");
27277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return error::kNoError;
27287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
27297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DoFramebufferTexture2DMultisample(
27307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      target, attachment, textarget, texture, level, samples);
27317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return error::kNoError;
27327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
27337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleTexStorage2DEXT(
2735010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
27361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
27371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::TexStorage2DEXT& c =
27381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::TexStorage2DEXT*>(cmd_data);
27391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei levels = static_cast<GLsizei>(c.levels);
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum internalFormat = static_cast<GLenum>(c.internalFormat);
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei width = static_cast<GLsizei>(c.width);
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei height = static_cast<GLsizei>(c.height);
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_target.IsValid(target)) {
27462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DEXT", target, "target");
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (levels < 0) {
27502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DEXT", "levels < 0");
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_internal_format_storage.IsValid(internalFormat)) {
2754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
2755a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glTexStorage2DEXT", internalFormat, "internalFormat");
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (width < 0) {
27592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DEXT", "width < 0");
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (height < 0) {
27632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DEXT", "height < 0");
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoTexStorage2DEXT(target, levels, internalFormat, width, height);
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGenQueriesEXTImmediate(
2771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
27721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
27731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GenQueriesEXTImmediate& c =
27741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GenQueriesEXTImmediate*>(cmd_data);
27751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
2777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GLuint* queries =
2782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (queries == NULL) {
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GenQueriesEXTHelper(n, queries)) {
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleDeleteQueriesEXTImmediate(
2793010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
27941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
27951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DeleteQueriesEXTImmediate& c =
27961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DeleteQueriesEXTImmediate*>(cmd_data);
27971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
2799010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2803a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLuint* queries =
2804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (queries == NULL) {
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteQueriesEXTHelper(n, queries);
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleInsertEventMarkerEXT(
2813010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
28141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
28151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::InsertEventMarkerEXT& c =
28161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::InsertEventMarkerEXT*>(cmd_data);
28171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
28181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint bucket_id = static_cast<GLuint>(c.bucket_id);
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bucket* bucket = GetBucket(bucket_id);
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!bucket || bucket->size() == 0) {
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string str;
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!bucket->GetAsString(&str)) {
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoInsertEventMarkerEXT(0, str.c_str());
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandlePushGroupMarkerEXT(
2833010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
28341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
28351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::PushGroupMarkerEXT& c =
28361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::PushGroupMarkerEXT*>(cmd_data);
28371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
28381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint bucket_id = static_cast<GLuint>(c.bucket_id);
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bucket* bucket = GetBucket(bucket_id);
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!bucket || bucket->size() == 0) {
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string str;
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!bucket->GetAsString(&str)) {
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoPushGroupMarkerEXT(0, str.c_str());
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandlePopGroupMarkerEXT(
2853010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
28541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
28551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::PopGroupMarkerEXT& c =
28561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::PopGroupMarkerEXT*>(cmd_data);
28571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoPopGroupMarkerEXT();
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGenVertexArraysOESImmediate(
2863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
28641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
28651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GenVertexArraysOESImmediate& c =
28661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GenVertexArraysOESImmediate*>(cmd_data);
28671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
2869010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2873a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GLuint* arrays =
2874a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size);
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (arrays == NULL) {
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GenVertexArraysOESHelper(n, arrays)) {
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleDeleteVertexArraysOESImmediate(
2885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
28861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
28871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DeleteVertexArraysOESImmediate& c =
28881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DeleteVertexArraysOESImmediate*>(
28891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cmd_data);
28901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei n = static_cast<GLsizei>(c.n);
2892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2896a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLuint* arrays =
2897a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (arrays == NULL) {
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteVertexArraysOESHelper(n, arrays);
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleIsVertexArrayOES(
2906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
29071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
29081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::IsVertexArrayOES& c =
29091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::IsVertexArrayOES*>(cmd_data);
29101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint array = c.array;
29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::IsVertexArrayOES::Result Result;
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_dst = DoIsVertexArrayOES(array);
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleBindVertexArrayOES(
2923010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
29241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
29251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BindVertexArrayOES& c =
29261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BindVertexArrayOES*>(cmd_data);
29271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint array = c.array;
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindVertexArrayOES(array);
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleSwapBuffers(uint32_t immediate_data_size,
29341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 const void* cmd_data) {
29351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::SwapBuffers& c =
29361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::SwapBuffers*>(cmd_data);
29371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
2938a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  DoSwapBuffers();
2939a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return error::kNoError;
2940a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
2941a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleGetMaxValueInBufferCHROMIUM(
2943010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
29441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
29451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::GetMaxValueInBufferCHROMIUM& c =
29461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::GetMaxValueInBufferCHROMIUM*>(cmd_data);
29471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint buffer_id = c.buffer_id;
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum type = static_cast<GLenum>(c.type);
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint offset = static_cast<GLuint>(c.offset);
29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::GetMaxValueInBufferCHROMIUM::Result Result;
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (count < 0) {
29592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(
29602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GL_INVALID_VALUE, "glGetMaxValueInBufferCHROMIUM", "count < 0");
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->get_max_index_type.IsValid(type)) {
2964a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
2965a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glGetMaxValueInBufferCHROMIUM", type, "type");
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result_dst = DoGetMaxValueInBufferCHROMIUM(buffer_id, count, type, offset);
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleTexImageIOSurface2DCHROMIUM(
2973010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
29741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
29751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::TexImageIOSurface2DCHROMIUM& c =
29761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::TexImageIOSurface2DCHROMIUM*>(cmd_data);
29771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei width = static_cast<GLsizei>(c.width);
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei height = static_cast<GLsizei>(c.height);
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint ioSurfaceId = static_cast<GLuint>(c.ioSurfaceId);
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint plane = static_cast<GLuint>(c.plane);
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
2984a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
2985a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glTexImageIOSurface2DCHROMIUM", target, "target");
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (width < 0) {
29892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(
29902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "width < 0");
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (height < 0) {
29942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "height < 0");
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoTexImageIOSurface2DCHROMIUM(target, width, height, ioSurfaceId, plane);
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleCopyTextureCHROMIUM(
3003010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
30041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
30051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::CopyTextureCHROMIUM& c =
30061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::CopyTextureCHROMIUM*>(cmd_data);
30071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum source_id = static_cast<GLenum>(c.source_id);
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum dest_id = static_cast<GLenum>(c.dest_id);
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint level = static_cast<GLint>(c.level);
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint internalformat = static_cast<GLint>(c.internalformat);
3013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GLenum dest_type = static_cast<GLenum>(c.dest_type);
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_internal_format.IsValid(internalformat)) {
3015a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
3016a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       "glCopyTextureCHROMIUM",
3017a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       "internalformat GL_INVALID_VALUE");
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!validators_->pixel_type.IsValid(dest_type)) {
3021a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
3022a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glCopyTextureCHROMIUM", dest_type, "dest_type");
3023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return error::kNoError;
3024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DoCopyTextureCHROMIUM(
3026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      target, source_id, dest_id, level, internalformat, dest_type);
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleProduceTextureCHROMIUMImmediate(
3031010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
30321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
30331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::ProduceTextureCHROMIUMImmediate& c =
30341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::ProduceTextureCHROMIUMImmediate*>(
30351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cmd_data);
30361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
3038010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) {
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLbyte* mailbox =
3046a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLbyte*>(c, data_size, immediate_data_size);
3047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
3048a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
3049a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glProduceTextureCHROMIUM", target, "target");
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mailbox == NULL) {
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoProduceTextureCHROMIUM(target, mailbox);
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3059f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleProduceTextureDirectCHROMIUMImmediate(
3060f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    uint32_t immediate_data_size,
30611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
30621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::ProduceTextureDirectCHROMIUMImmediate& c =
30631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::ProduceTextureDirectCHROMIUMImmediate*>(
30641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cmd_data);
30651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
3066f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GLuint texture = c.texture;
3067f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
3068f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  uint32_t data_size;
3069f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) {
3070f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return error::kOutOfBounds;
3071f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
3072f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (data_size > immediate_data_size) {
3073f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return error::kOutOfBounds;
3074f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
3075f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const GLbyte* mailbox =
3076f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GetImmediateDataAs<const GLbyte*>(c, data_size, immediate_data_size);
3077f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
3078f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
3079f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        "glProduceTextureDirectCHROMIUM", target, "target");
3080f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return error::kNoError;
3081f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
3082f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (mailbox == NULL) {
3083f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return error::kOutOfBounds;
3084f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
3085f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DoProduceTextureDirectCHROMIUM(texture, target, mailbox);
3086f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return error::kNoError;
3087f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
3088f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleConsumeTextureCHROMIUMImmediate(
3090010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
30911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
30921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::ConsumeTextureCHROMIUMImmediate& c =
30931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::ConsumeTextureCHROMIUMImmediate*>(
30941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cmd_data);
30951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
3097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) {
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data_size > immediate_data_size) {
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLbyte* mailbox =
3105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLbyte*>(c, data_size, immediate_data_size);
3106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
3107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
3108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glConsumeTextureCHROMIUM", target, "target");
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mailbox == NULL) {
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoConsumeTextureCHROMIUM(target, mailbox);
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleBindTexImage2DCHROMIUM(
3119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
31201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
31211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::BindTexImage2DCHROMIUM& c =
31221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::BindTexImage2DCHROMIUM*>(cmd_data);
31231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint imageId = static_cast<GLint>(c.imageId);
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
3127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
3128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glBindTexImage2DCHROMIUM", target, "target");
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoBindTexImage2DCHROMIUM(target, imageId);
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleReleaseTexImage2DCHROMIUM(
3136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
31371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
31381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::ReleaseTexImage2DCHROMIUM& c =
31391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::ReleaseTexImage2DCHROMIUM*>(cmd_data);
31401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint imageId = static_cast<GLint>(c.imageId);
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!validators_->texture_bind_target.IsValid(target)) {
3144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
3145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        "glReleaseTexImage2DCHROMIUM", target, "target");
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kNoError;
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DoReleaseTexImage2DCHROMIUM(target, imageId);
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleTraceEndCHROMIUM(
3153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
31541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
31551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::TraceEndCHROMIUM& c =
31561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::TraceEndCHROMIUM*>(cmd_data);
31571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
31582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoTraceEndCHROMIUM();
31592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return error::kNoError;
31602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
31612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleDiscardFramebufferEXTImmediate(
3163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
31641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
31651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DiscardFramebufferEXTImmediate& c =
31661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DiscardFramebufferEXTImmediate*>(
31671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          cmd_data);
31681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
3169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!features().ext_discard_framebuffer) {
3170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
3171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       "glDiscardFramebufferEXT",
3172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       "function not available");
31732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error::kNoError;
31742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
31752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum target = static_cast<GLenum>(c.target);
31772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
3178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
31792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLenum), 1, &data_size)) {
31802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error::kOutOfBounds;
31812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
31822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (data_size > immediate_data_size) {
31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error::kOutOfBounds;
31842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLenum* attachments =
3186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLenum*>(c, data_size, immediate_data_size);
31872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (count < 0) {
31882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(
31892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GL_INVALID_VALUE, "glDiscardFramebufferEXT", "count < 0");
31902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error::kNoError;
31912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
31922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (attachments == NULL) {
31932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error::kOutOfBounds;
31942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
31952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoDiscardFramebufferEXT(target, count, attachments);
31962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return error::kNoError;
31972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
31982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)error::Error GLES2DecoderImpl::HandleLoseContextCHROMIUM(
3200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
32011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
32021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::LoseContextCHROMIUM& c =
32031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::LoseContextCHROMIUM*>(cmd_data);
32041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
3205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GLenum current = static_cast<GLenum>(c.current);
3206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GLenum other = static_cast<GLenum>(c.other);
3207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!validators_->reset_status.IsValid(current)) {
3208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM(
3209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        "glLoseContextCHROMIUM", current, "current");
32102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error::kNoError;
32112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!validators_->reset_status.IsValid(other)) {
3213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", other, "other");
3214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return error::kNoError;
32152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DoLoseContextCHROMIUM(current, other);
32172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return error::kNoError;
32182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
32192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)error::Error GLES2DecoderImpl::HandleDrawBuffersEXTImmediate(
3221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    uint32_t immediate_data_size,
32221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
32231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::DrawBuffersEXTImmediate& c =
32241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::DrawBuffersEXTImmediate*>(cmd_data);
32251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
32262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei count = static_cast<GLsizei>(c.count);
3227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  uint32_t data_size;
32282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ComputeDataSize(count, sizeof(GLenum), 1, &data_size)) {
32292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error::kOutOfBounds;
32302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
32312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (data_size > immediate_data_size) {
32322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error::kOutOfBounds;
32332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const GLenum* bufs =
3235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetImmediateDataAs<const GLenum*>(c, data_size, immediate_data_size);
32362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (count < 0) {
32372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glDrawBuffersEXT", "count < 0");
32382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error::kNoError;
32392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
32402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (bufs == NULL) {
32412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error::kOutOfBounds;
32422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
32432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoDrawBuffersEXT(count, bufs);
32442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return error::kNoError;
32452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
32462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleMatrixLoadfCHROMIUMImmediate(
32481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    uint32_t immediate_data_size,
32491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
32501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::MatrixLoadfCHROMIUMImmediate& c =
32511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::MatrixLoadfCHROMIUMImmediate*>(cmd_data);
32521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
32531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!features().chromium_path_rendering) {
32541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
32551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       "glMatrixLoadfCHROMIUM",
32561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       "function not available");
32571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return error::kNoError;
32581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
32591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
32601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GLenum matrixMode = static_cast<GLenum>(c.matrixMode);
32611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  uint32_t data_size;
32621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!ComputeDataSize(1, sizeof(GLfloat), 16, &data_size)) {
32631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return error::kOutOfBounds;
32641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
32651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (data_size > immediate_data_size) {
32661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return error::kOutOfBounds;
32671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
32681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const GLfloat* m =
32691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
32701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!validators_->matrix_mode.IsValid(matrixMode)) {
32711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOCAL_SET_GL_ERROR_INVALID_ENUM(
32721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        "glMatrixLoadfCHROMIUM", matrixMode, "matrixMode");
32731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return error::kNoError;
32741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
32751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (m == NULL) {
32761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return error::kOutOfBounds;
32771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
32781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DoMatrixLoadfCHROMIUM(matrixMode, m);
32791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return error::kNoError;
32801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
32811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
32821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccierror::Error GLES2DecoderImpl::HandleMatrixLoadIdentityCHROMIUM(
32831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    uint32_t immediate_data_size,
32841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const void* cmd_data) {
32851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gles2::cmds::MatrixLoadIdentityCHROMIUM& c =
32861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *static_cast<const gles2::cmds::MatrixLoadIdentityCHROMIUM*>(cmd_data);
32871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  (void)c;
32881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!features().chromium_path_rendering) {
32891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
32901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       "glMatrixLoadIdentityCHROMIUM",
32911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       "function not available");
32921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return error::kNoError;
32931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
32941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
32951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GLenum matrixMode = static_cast<GLenum>(c.matrixMode);
32961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!validators_->matrix_mode.IsValid(matrixMode)) {
32971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LOCAL_SET_GL_ERROR_INVALID_ENUM(
32981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        "glMatrixLoadIdentityCHROMIUM", matrixMode, "matrixMode");
32991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return error::kNoError;
33001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
33011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DoMatrixLoadIdentityCHROMIUM(matrixMode);
33021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return error::kNoError;
33031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
33041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) {
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (cap) {
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_BLEND:
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_.enable_flags.blend = enabled;
3309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (state_.enable_flags.cached_blend != enabled ||
3310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          state_.ignore_cached_state) {
3311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        state_.enable_flags.cached_blend = enabled;
3312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return true;
3313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
3314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return false;
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_CULL_FACE:
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_.enable_flags.cull_face = enabled;
3317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (state_.enable_flags.cached_cull_face != enabled ||
3318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          state_.ignore_cached_state) {
3319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        state_.enable_flags.cached_cull_face = enabled;
3320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return true;
3321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
3322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return false;
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DEPTH_TEST:
3324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      state_.enable_flags.depth_test = enabled;
3325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (state_.enable_flags.cached_depth_test != enabled ||
3326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          state_.ignore_cached_state) {
33273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        framebuffer_state_.clear_state_dirty = true;
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_DITHER:
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_.enable_flags.dither = enabled;
3332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (state_.enable_flags.cached_dither != enabled ||
3333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          state_.ignore_cached_state) {
3334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        state_.enable_flags.cached_dither = enabled;
3335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return true;
3336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
3337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return false;
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_POLYGON_OFFSET_FILL:
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_.enable_flags.polygon_offset_fill = enabled;
3340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (state_.enable_flags.cached_polygon_offset_fill != enabled ||
3341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          state_.ignore_cached_state) {
3342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        state_.enable_flags.cached_polygon_offset_fill = enabled;
3343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return true;
3344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
3345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return false;
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLE_ALPHA_TO_COVERAGE:
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_.enable_flags.sample_alpha_to_coverage = enabled;
3348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (state_.enable_flags.cached_sample_alpha_to_coverage != enabled ||
3349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          state_.ignore_cached_state) {
3350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        state_.enable_flags.cached_sample_alpha_to_coverage = enabled;
3351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return true;
3352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
3353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return false;
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SAMPLE_COVERAGE:
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_.enable_flags.sample_coverage = enabled;
3356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (state_.enable_flags.cached_sample_coverage != enabled ||
3357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          state_.ignore_cached_state) {
3358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        state_.enable_flags.cached_sample_coverage = enabled;
3359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return true;
3360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
3361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return false;
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_SCISSOR_TEST:
3363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      state_.enable_flags.scissor_test = enabled;
3364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (state_.enable_flags.cached_scissor_test != enabled ||
3365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          state_.ignore_cached_state) {
3366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        state_.enable_flags.cached_scissor_test = enabled;
3367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return true;
33682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
33692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GL_STENCIL_TEST:
3371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      state_.enable_flags.stencil_test = enabled;
3372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (state_.enable_flags.cached_stencil_test != enabled ||
3373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          state_.ignore_cached_state) {
33743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        framebuffer_state_.clear_state_dirty = true;
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_
3383