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