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.
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
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_
15 error::Error
GLES2DecoderImpl::HandleActiveTexture(uint32_t immediate_data_size
,
16 const void* cmd_data
) {
17 const gles2::cmds::ActiveTexture
& c
=
18 *static_cast<const gles2::cmds::ActiveTexture
*>(cmd_data
);
20 GLenum texture
= static_cast<GLenum
>(c
.texture
);
21 DoActiveTexture(texture
);
22 return error::kNoError
;
25 error::Error
GLES2DecoderImpl::HandleAttachShader(uint32_t immediate_data_size
,
26 const void* cmd_data
) {
27 const gles2::cmds::AttachShader
& c
=
28 *static_cast<const gles2::cmds::AttachShader
*>(cmd_data
);
30 GLuint program
= c
.program
;
31 GLuint shader
= c
.shader
;
32 DoAttachShader(program
, shader
);
33 return error::kNoError
;
36 error::Error
GLES2DecoderImpl::HandleBindBuffer(uint32_t immediate_data_size
,
37 const void* cmd_data
) {
38 const gles2::cmds::BindBuffer
& c
=
39 *static_cast<const gles2::cmds::BindBuffer
*>(cmd_data
);
41 GLenum target
= static_cast<GLenum
>(c
.target
);
42 GLuint buffer
= c
.buffer
;
43 if (!validators_
->buffer_target
.IsValid(target
)) {
44 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindBuffer", target
, "target");
45 return error::kNoError
;
47 DoBindBuffer(target
, buffer
);
48 return error::kNoError
;
51 error::Error
GLES2DecoderImpl::HandleBindBufferBase(
52 uint32_t immediate_data_size
,
53 const void* cmd_data
) {
54 if (!unsafe_es3_apis_enabled())
55 return error::kUnknownCommand
;
56 const gles2::cmds::BindBufferBase
& c
=
57 *static_cast<const gles2::cmds::BindBufferBase
*>(cmd_data
);
59 GLenum target
= static_cast<GLenum
>(c
.target
);
60 GLuint index
= static_cast<GLuint
>(c
.index
);
61 GLuint buffer
= c
.buffer
;
62 if (!group_
->GetBufferServiceId(buffer
, &buffer
)) {
63 if (!group_
->bind_generates_resource()) {
64 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBindBufferBase",
66 return error::kNoError
;
68 GLuint client_id
= buffer
;
69 glGenBuffersARB(1, &buffer
);
70 CreateBuffer(client_id
, buffer
);
72 glBindBufferBase(target
, index
, buffer
);
73 return error::kNoError
;
76 error::Error
GLES2DecoderImpl::HandleBindBufferRange(
77 uint32_t immediate_data_size
,
78 const void* cmd_data
) {
79 if (!unsafe_es3_apis_enabled())
80 return error::kUnknownCommand
;
81 const gles2::cmds::BindBufferRange
& c
=
82 *static_cast<const gles2::cmds::BindBufferRange
*>(cmd_data
);
84 GLenum target
= static_cast<GLenum
>(c
.target
);
85 GLuint index
= static_cast<GLuint
>(c
.index
);
86 GLuint buffer
= c
.buffer
;
87 GLintptr offset
= static_cast<GLintptr
>(c
.offset
);
88 GLsizeiptr size
= static_cast<GLsizeiptr
>(c
.size
);
89 if (!group_
->GetBufferServiceId(buffer
, &buffer
)) {
90 if (!group_
->bind_generates_resource()) {
91 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBindBufferRange",
93 return error::kNoError
;
95 GLuint client_id
= buffer
;
96 glGenBuffersARB(1, &buffer
);
97 CreateBuffer(client_id
, buffer
);
99 glBindBufferRange(target
, index
, buffer
, offset
, size
);
100 return error::kNoError
;
103 error::Error
GLES2DecoderImpl::HandleBindFramebuffer(
104 uint32_t immediate_data_size
,
105 const void* cmd_data
) {
106 const gles2::cmds::BindFramebuffer
& c
=
107 *static_cast<const gles2::cmds::BindFramebuffer
*>(cmd_data
);
109 GLenum target
= static_cast<GLenum
>(c
.target
);
110 GLuint framebuffer
= c
.framebuffer
;
111 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
112 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindFramebuffer", target
, "target");
113 return error::kNoError
;
115 DoBindFramebuffer(target
, framebuffer
);
116 return error::kNoError
;
119 error::Error
GLES2DecoderImpl::HandleBindRenderbuffer(
120 uint32_t immediate_data_size
,
121 const void* cmd_data
) {
122 const gles2::cmds::BindRenderbuffer
& c
=
123 *static_cast<const gles2::cmds::BindRenderbuffer
*>(cmd_data
);
125 GLenum target
= static_cast<GLenum
>(c
.target
);
126 GLuint renderbuffer
= c
.renderbuffer
;
127 if (!validators_
->render_buffer_target
.IsValid(target
)) {
128 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindRenderbuffer", target
, "target");
129 return error::kNoError
;
131 DoBindRenderbuffer(target
, renderbuffer
);
132 return error::kNoError
;
135 error::Error
GLES2DecoderImpl::HandleBindSampler(uint32_t immediate_data_size
,
136 const void* cmd_data
) {
137 if (!unsafe_es3_apis_enabled())
138 return error::kUnknownCommand
;
139 const gles2::cmds::BindSampler
& c
=
140 *static_cast<const gles2::cmds::BindSampler
*>(cmd_data
);
142 GLuint unit
= static_cast<GLuint
>(c
.unit
);
143 GLuint sampler
= c
.sampler
;
144 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
145 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBindSampler",
146 "invalid sampler id");
147 return error::kNoError
;
149 glBindSampler(unit
, sampler
);
150 return error::kNoError
;
153 error::Error
GLES2DecoderImpl::HandleBindTexture(uint32_t immediate_data_size
,
154 const void* cmd_data
) {
155 const gles2::cmds::BindTexture
& c
=
156 *static_cast<const gles2::cmds::BindTexture
*>(cmd_data
);
158 GLenum target
= static_cast<GLenum
>(c
.target
);
159 GLuint texture
= c
.texture
;
160 if (!validators_
->texture_bind_target
.IsValid(target
)) {
161 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTexture", target
, "target");
162 return error::kNoError
;
164 DoBindTexture(target
, texture
);
165 return error::kNoError
;
168 error::Error
GLES2DecoderImpl::HandleBindTransformFeedback(
169 uint32_t immediate_data_size
,
170 const void* cmd_data
) {
171 if (!unsafe_es3_apis_enabled())
172 return error::kUnknownCommand
;
173 const gles2::cmds::BindTransformFeedback
& c
=
174 *static_cast<const gles2::cmds::BindTransformFeedback
*>(cmd_data
);
176 GLenum target
= static_cast<GLenum
>(c
.target
);
177 GLuint transformfeedback
= c
.transformfeedback
;
178 if (!group_
->GetTransformFeedbackServiceId(transformfeedback
,
179 &transformfeedback
)) {
180 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBindTransformFeedback",
181 "invalid transformfeedback id");
182 return error::kNoError
;
184 glBindTransformFeedback(target
, transformfeedback
);
185 return error::kNoError
;
188 error::Error
GLES2DecoderImpl::HandleBlendColor(uint32_t immediate_data_size
,
189 const void* cmd_data
) {
190 const gles2::cmds::BlendColor
& c
=
191 *static_cast<const gles2::cmds::BlendColor
*>(cmd_data
);
193 GLclampf red
= static_cast<GLclampf
>(c
.red
);
194 GLclampf green
= static_cast<GLclampf
>(c
.green
);
195 GLclampf blue
= static_cast<GLclampf
>(c
.blue
);
196 GLclampf alpha
= static_cast<GLclampf
>(c
.alpha
);
197 if (state_
.blend_color_red
!= red
|| state_
.blend_color_green
!= green
||
198 state_
.blend_color_blue
!= blue
|| state_
.blend_color_alpha
!= alpha
) {
199 state_
.blend_color_red
= red
;
200 state_
.blend_color_green
= green
;
201 state_
.blend_color_blue
= blue
;
202 state_
.blend_color_alpha
= alpha
;
203 glBlendColor(red
, green
, blue
, alpha
);
205 return error::kNoError
;
208 error::Error
GLES2DecoderImpl::HandleBlendEquation(uint32_t immediate_data_size
,
209 const void* cmd_data
) {
210 const gles2::cmds::BlendEquation
& c
=
211 *static_cast<const gles2::cmds::BlendEquation
*>(cmd_data
);
213 GLenum mode
= static_cast<GLenum
>(c
.mode
);
214 if (!validators_
->equation
.IsValid(mode
)) {
215 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendEquation", mode
, "mode");
216 return error::kNoError
;
218 if (state_
.blend_equation_rgb
!= mode
||
219 state_
.blend_equation_alpha
!= mode
) {
220 state_
.blend_equation_rgb
= mode
;
221 state_
.blend_equation_alpha
= mode
;
222 glBlendEquation(mode
);
224 return error::kNoError
;
227 error::Error
GLES2DecoderImpl::HandleBlendEquationSeparate(
228 uint32_t immediate_data_size
,
229 const void* cmd_data
) {
230 const gles2::cmds::BlendEquationSeparate
& c
=
231 *static_cast<const gles2::cmds::BlendEquationSeparate
*>(cmd_data
);
233 GLenum modeRGB
= static_cast<GLenum
>(c
.modeRGB
);
234 GLenum modeAlpha
= static_cast<GLenum
>(c
.modeAlpha
);
235 if (!validators_
->equation
.IsValid(modeRGB
)) {
236 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendEquationSeparate", modeRGB
,
238 return error::kNoError
;
240 if (!validators_
->equation
.IsValid(modeAlpha
)) {
241 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendEquationSeparate", modeAlpha
,
243 return error::kNoError
;
245 if (state_
.blend_equation_rgb
!= modeRGB
||
246 state_
.blend_equation_alpha
!= modeAlpha
) {
247 state_
.blend_equation_rgb
= modeRGB
;
248 state_
.blend_equation_alpha
= modeAlpha
;
249 glBlendEquationSeparate(modeRGB
, modeAlpha
);
251 return error::kNoError
;
254 error::Error
GLES2DecoderImpl::HandleBlendFunc(uint32_t immediate_data_size
,
255 const void* cmd_data
) {
256 const gles2::cmds::BlendFunc
& c
=
257 *static_cast<const gles2::cmds::BlendFunc
*>(cmd_data
);
259 GLenum sfactor
= static_cast<GLenum
>(c
.sfactor
);
260 GLenum dfactor
= static_cast<GLenum
>(c
.dfactor
);
261 if (!validators_
->src_blend_factor
.IsValid(sfactor
)) {
262 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFunc", sfactor
, "sfactor");
263 return error::kNoError
;
265 if (!validators_
->dst_blend_factor
.IsValid(dfactor
)) {
266 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFunc", dfactor
, "dfactor");
267 return error::kNoError
;
269 if (state_
.blend_source_rgb
!= sfactor
|| state_
.blend_dest_rgb
!= dfactor
||
270 state_
.blend_source_alpha
!= sfactor
||
271 state_
.blend_dest_alpha
!= dfactor
) {
272 state_
.blend_source_rgb
= sfactor
;
273 state_
.blend_dest_rgb
= dfactor
;
274 state_
.blend_source_alpha
= sfactor
;
275 state_
.blend_dest_alpha
= dfactor
;
276 glBlendFunc(sfactor
, dfactor
);
278 return error::kNoError
;
281 error::Error
GLES2DecoderImpl::HandleBlendFuncSeparate(
282 uint32_t immediate_data_size
,
283 const void* cmd_data
) {
284 const gles2::cmds::BlendFuncSeparate
& c
=
285 *static_cast<const gles2::cmds::BlendFuncSeparate
*>(cmd_data
);
287 GLenum srcRGB
= static_cast<GLenum
>(c
.srcRGB
);
288 GLenum dstRGB
= static_cast<GLenum
>(c
.dstRGB
);
289 GLenum srcAlpha
= static_cast<GLenum
>(c
.srcAlpha
);
290 GLenum dstAlpha
= static_cast<GLenum
>(c
.dstAlpha
);
291 if (!validators_
->src_blend_factor
.IsValid(srcRGB
)) {
292 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", srcRGB
, "srcRGB");
293 return error::kNoError
;
295 if (!validators_
->dst_blend_factor
.IsValid(dstRGB
)) {
296 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", dstRGB
, "dstRGB");
297 return error::kNoError
;
299 if (!validators_
->src_blend_factor
.IsValid(srcAlpha
)) {
300 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", srcAlpha
,
302 return error::kNoError
;
304 if (!validators_
->dst_blend_factor
.IsValid(dstAlpha
)) {
305 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", dstAlpha
,
307 return error::kNoError
;
309 if (state_
.blend_source_rgb
!= srcRGB
|| state_
.blend_dest_rgb
!= dstRGB
||
310 state_
.blend_source_alpha
!= srcAlpha
||
311 state_
.blend_dest_alpha
!= dstAlpha
) {
312 state_
.blend_source_rgb
= srcRGB
;
313 state_
.blend_dest_rgb
= dstRGB
;
314 state_
.blend_source_alpha
= srcAlpha
;
315 state_
.blend_dest_alpha
= dstAlpha
;
316 glBlendFuncSeparate(srcRGB
, dstRGB
, srcAlpha
, dstAlpha
);
318 return error::kNoError
;
321 error::Error
GLES2DecoderImpl::HandleBufferSubData(uint32_t immediate_data_size
,
322 const void* cmd_data
) {
323 const gles2::cmds::BufferSubData
& c
=
324 *static_cast<const gles2::cmds::BufferSubData
*>(cmd_data
);
326 GLenum target
= static_cast<GLenum
>(c
.target
);
327 GLintptr offset
= static_cast<GLintptr
>(c
.offset
);
328 GLsizeiptr size
= static_cast<GLsizeiptr
>(c
.size
);
329 uint32_t data_size
= size
;
330 const void* data
= GetSharedMemoryAs
<const void*>(
331 c
.data_shm_id
, c
.data_shm_offset
, data_size
);
332 if (!validators_
->buffer_target
.IsValid(target
)) {
333 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBufferSubData", target
, "target");
334 return error::kNoError
;
337 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glBufferSubData", "size < 0");
338 return error::kNoError
;
341 return error::kOutOfBounds
;
343 DoBufferSubData(target
, offset
, size
, data
);
344 return error::kNoError
;
347 error::Error
GLES2DecoderImpl::HandleCheckFramebufferStatus(
348 uint32_t immediate_data_size
,
349 const void* cmd_data
) {
350 const gles2::cmds::CheckFramebufferStatus
& c
=
351 *static_cast<const gles2::cmds::CheckFramebufferStatus
*>(cmd_data
);
353 GLenum target
= static_cast<GLenum
>(c
.target
);
354 typedef cmds::CheckFramebufferStatus::Result Result
;
355 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
356 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
358 return error::kOutOfBounds
;
360 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
361 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCheckFramebufferStatus", target
,
363 return error::kNoError
;
365 *result_dst
= DoCheckFramebufferStatus(target
);
366 return error::kNoError
;
369 error::Error
GLES2DecoderImpl::HandleClear(uint32_t immediate_data_size
,
370 const void* cmd_data
) {
371 const gles2::cmds::Clear
& c
=
372 *static_cast<const gles2::cmds::Clear
*>(cmd_data
);
375 error
= WillAccessBoundFramebufferForDraw();
376 if (error
!= error::kNoError
)
378 GLbitfield mask
= static_cast<GLbitfield
>(c
.mask
);
380 return error::kNoError
;
383 error::Error
GLES2DecoderImpl::HandleClearBufferfi(uint32_t immediate_data_size
,
384 const void* cmd_data
) {
385 if (!unsafe_es3_apis_enabled())
386 return error::kUnknownCommand
;
387 const gles2::cmds::ClearBufferfi
& c
=
388 *static_cast<const gles2::cmds::ClearBufferfi
*>(cmd_data
);
390 GLenum buffer
= static_cast<GLenum
>(c
.buffer
);
391 GLint drawbuffers
= static_cast<GLint
>(c
.drawbuffers
);
392 GLfloat depth
= static_cast<GLfloat
>(c
.depth
);
393 GLint stencil
= static_cast<GLint
>(c
.stencil
);
394 glClearBufferfi(buffer
, drawbuffers
, depth
, stencil
);
395 return error::kNoError
;
398 error::Error
GLES2DecoderImpl::HandleClearBufferfvImmediate(
399 uint32_t immediate_data_size
,
400 const void* cmd_data
) {
401 if (!unsafe_es3_apis_enabled())
402 return error::kUnknownCommand
;
403 const gles2::cmds::ClearBufferfvImmediate
& c
=
404 *static_cast<const gles2::cmds::ClearBufferfvImmediate
*>(cmd_data
);
406 GLenum buffer
= static_cast<GLenum
>(c
.buffer
);
407 GLint drawbuffers
= static_cast<GLint
>(c
.drawbuffers
);
409 if (!ComputeDataSize(1, sizeof(GLfloat
), 4, &data_size
)) {
410 return error::kOutOfBounds
;
412 if (data_size
> immediate_data_size
) {
413 return error::kOutOfBounds
;
415 const GLfloat
* value
=
416 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
418 return error::kOutOfBounds
;
420 glClearBufferfv(buffer
, drawbuffers
, value
);
421 return error::kNoError
;
424 error::Error
GLES2DecoderImpl::HandleClearBufferivImmediate(
425 uint32_t immediate_data_size
,
426 const void* cmd_data
) {
427 if (!unsafe_es3_apis_enabled())
428 return error::kUnknownCommand
;
429 const gles2::cmds::ClearBufferivImmediate
& c
=
430 *static_cast<const gles2::cmds::ClearBufferivImmediate
*>(cmd_data
);
432 GLenum buffer
= static_cast<GLenum
>(c
.buffer
);
433 GLint drawbuffers
= static_cast<GLint
>(c
.drawbuffers
);
435 if (!ComputeDataSize(1, sizeof(GLint
), 4, &data_size
)) {
436 return error::kOutOfBounds
;
438 if (data_size
> immediate_data_size
) {
439 return error::kOutOfBounds
;
442 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
444 return error::kOutOfBounds
;
446 glClearBufferiv(buffer
, drawbuffers
, value
);
447 return error::kNoError
;
450 error::Error
GLES2DecoderImpl::HandleClearBufferuivImmediate(
451 uint32_t immediate_data_size
,
452 const void* cmd_data
) {
453 if (!unsafe_es3_apis_enabled())
454 return error::kUnknownCommand
;
455 const gles2::cmds::ClearBufferuivImmediate
& c
=
456 *static_cast<const gles2::cmds::ClearBufferuivImmediate
*>(cmd_data
);
458 GLenum buffer
= static_cast<GLenum
>(c
.buffer
);
459 GLint drawbuffers
= static_cast<GLint
>(c
.drawbuffers
);
461 if (!ComputeDataSize(1, sizeof(GLuint
), 4, &data_size
)) {
462 return error::kOutOfBounds
;
464 if (data_size
> immediate_data_size
) {
465 return error::kOutOfBounds
;
467 const GLuint
* value
=
468 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
470 return error::kOutOfBounds
;
472 glClearBufferuiv(buffer
, drawbuffers
, value
);
473 return error::kNoError
;
476 error::Error
GLES2DecoderImpl::HandleClearColor(uint32_t immediate_data_size
,
477 const void* cmd_data
) {
478 const gles2::cmds::ClearColor
& c
=
479 *static_cast<const gles2::cmds::ClearColor
*>(cmd_data
);
481 GLclampf red
= static_cast<GLclampf
>(c
.red
);
482 GLclampf green
= static_cast<GLclampf
>(c
.green
);
483 GLclampf blue
= static_cast<GLclampf
>(c
.blue
);
484 GLclampf alpha
= static_cast<GLclampf
>(c
.alpha
);
485 if (state_
.color_clear_red
!= red
|| state_
.color_clear_green
!= green
||
486 state_
.color_clear_blue
!= blue
|| state_
.color_clear_alpha
!= alpha
) {
487 state_
.color_clear_red
= red
;
488 state_
.color_clear_green
= green
;
489 state_
.color_clear_blue
= blue
;
490 state_
.color_clear_alpha
= alpha
;
491 glClearColor(red
, green
, blue
, alpha
);
493 return error::kNoError
;
496 error::Error
GLES2DecoderImpl::HandleClearDepthf(uint32_t immediate_data_size
,
497 const void* cmd_data
) {
498 const gles2::cmds::ClearDepthf
& c
=
499 *static_cast<const gles2::cmds::ClearDepthf
*>(cmd_data
);
501 GLclampf depth
= static_cast<GLclampf
>(c
.depth
);
502 if (state_
.depth_clear
!= depth
) {
503 state_
.depth_clear
= depth
;
506 return error::kNoError
;
509 error::Error
GLES2DecoderImpl::HandleClearStencil(uint32_t immediate_data_size
,
510 const void* cmd_data
) {
511 const gles2::cmds::ClearStencil
& c
=
512 *static_cast<const gles2::cmds::ClearStencil
*>(cmd_data
);
514 GLint s
= static_cast<GLint
>(c
.s
);
515 if (state_
.stencil_clear
!= s
) {
516 state_
.stencil_clear
= s
;
519 return error::kNoError
;
522 error::Error
GLES2DecoderImpl::HandleColorMask(uint32_t immediate_data_size
,
523 const void* cmd_data
) {
524 const gles2::cmds::ColorMask
& c
=
525 *static_cast<const gles2::cmds::ColorMask
*>(cmd_data
);
527 GLboolean red
= static_cast<GLboolean
>(c
.red
);
528 GLboolean green
= static_cast<GLboolean
>(c
.green
);
529 GLboolean blue
= static_cast<GLboolean
>(c
.blue
);
530 GLboolean alpha
= static_cast<GLboolean
>(c
.alpha
);
531 if (state_
.color_mask_red
!= red
|| state_
.color_mask_green
!= green
||
532 state_
.color_mask_blue
!= blue
|| state_
.color_mask_alpha
!= alpha
) {
533 state_
.color_mask_red
= red
;
534 state_
.color_mask_green
= green
;
535 state_
.color_mask_blue
= blue
;
536 state_
.color_mask_alpha
= alpha
;
537 framebuffer_state_
.clear_state_dirty
= true;
539 return error::kNoError
;
542 error::Error
GLES2DecoderImpl::HandleCompileShader(uint32_t immediate_data_size
,
543 const void* cmd_data
) {
544 const gles2::cmds::CompileShader
& c
=
545 *static_cast<const gles2::cmds::CompileShader
*>(cmd_data
);
547 GLuint shader
= c
.shader
;
548 DoCompileShader(shader
);
549 return error::kNoError
;
552 error::Error
GLES2DecoderImpl::HandleCompressedTexSubImage2D(
553 uint32_t immediate_data_size
,
554 const void* cmd_data
) {
555 const gles2::cmds::CompressedTexSubImage2D
& c
=
556 *static_cast<const gles2::cmds::CompressedTexSubImage2D
*>(cmd_data
);
558 GLenum target
= static_cast<GLenum
>(c
.target
);
559 GLint level
= static_cast<GLint
>(c
.level
);
560 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
561 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
562 GLsizei width
= static_cast<GLsizei
>(c
.width
);
563 GLsizei height
= static_cast<GLsizei
>(c
.height
);
564 GLenum format
= static_cast<GLenum
>(c
.format
);
565 GLsizei imageSize
= static_cast<GLsizei
>(c
.imageSize
);
566 uint32_t data_size
= imageSize
;
567 const void* data
= GetSharedMemoryAs
<const void*>(
568 c
.data_shm_id
, c
.data_shm_offset
, data_size
);
569 if (!validators_
->texture_target
.IsValid(target
)) {
570 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCompressedTexSubImage2D", target
,
572 return error::kNoError
;
575 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCompressedTexSubImage2D",
577 return error::kNoError
;
580 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCompressedTexSubImage2D",
582 return error::kNoError
;
584 if (!validators_
->compressed_texture_format
.IsValid(format
)) {
585 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCompressedTexSubImage2D", format
,
587 return error::kNoError
;
590 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCompressedTexSubImage2D",
592 return error::kNoError
;
595 return error::kOutOfBounds
;
597 DoCompressedTexSubImage2D(target
, level
, xoffset
, yoffset
, width
, height
,
598 format
, imageSize
, data
);
599 return error::kNoError
;
602 error::Error
GLES2DecoderImpl::HandleCopyBufferSubData(
603 uint32_t immediate_data_size
,
604 const void* cmd_data
) {
605 if (!unsafe_es3_apis_enabled())
606 return error::kUnknownCommand
;
607 const gles2::cmds::CopyBufferSubData
& c
=
608 *static_cast<const gles2::cmds::CopyBufferSubData
*>(cmd_data
);
610 GLenum readtarget
= static_cast<GLenum
>(c
.readtarget
);
611 GLenum writetarget
= static_cast<GLenum
>(c
.writetarget
);
612 GLintptr readoffset
= static_cast<GLintptr
>(c
.readoffset
);
613 GLintptr writeoffset
= static_cast<GLintptr
>(c
.writeoffset
);
614 GLsizeiptr size
= static_cast<GLsizeiptr
>(c
.size
);
615 glCopyBufferSubData(readtarget
, writetarget
, readoffset
, writeoffset
, size
);
616 return error::kNoError
;
619 error::Error
GLES2DecoderImpl::HandleCopyTexImage2D(
620 uint32_t immediate_data_size
,
621 const void* cmd_data
) {
622 const gles2::cmds::CopyTexImage2D
& c
=
623 *static_cast<const gles2::cmds::CopyTexImage2D
*>(cmd_data
);
626 error
= WillAccessBoundFramebufferForRead();
627 if (error
!= error::kNoError
)
629 GLenum target
= static_cast<GLenum
>(c
.target
);
630 GLint level
= static_cast<GLint
>(c
.level
);
631 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
632 GLint x
= static_cast<GLint
>(c
.x
);
633 GLint y
= static_cast<GLint
>(c
.y
);
634 GLsizei width
= static_cast<GLsizei
>(c
.width
);
635 GLsizei height
= static_cast<GLsizei
>(c
.height
);
636 GLint border
= static_cast<GLint
>(c
.border
);
637 if (!validators_
->texture_target
.IsValid(target
)) {
638 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexImage2D", target
, "target");
639 return error::kNoError
;
641 if (!validators_
->texture_internal_format
.IsValid(internalformat
)) {
642 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexImage2D", internalformat
,
644 return error::kNoError
;
647 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexImage2D", "width < 0");
648 return error::kNoError
;
651 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexImage2D", "height < 0");
652 return error::kNoError
;
654 DoCopyTexImage2D(target
, level
, internalformat
, x
, y
, width
, height
, border
);
655 return error::kNoError
;
658 error::Error
GLES2DecoderImpl::HandleCopyTexSubImage2D(
659 uint32_t immediate_data_size
,
660 const void* cmd_data
) {
661 const gles2::cmds::CopyTexSubImage2D
& c
=
662 *static_cast<const gles2::cmds::CopyTexSubImage2D
*>(cmd_data
);
665 error
= WillAccessBoundFramebufferForRead();
666 if (error
!= error::kNoError
)
668 GLenum target
= static_cast<GLenum
>(c
.target
);
669 GLint level
= static_cast<GLint
>(c
.level
);
670 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
671 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
672 GLint x
= static_cast<GLint
>(c
.x
);
673 GLint y
= static_cast<GLint
>(c
.y
);
674 GLsizei width
= static_cast<GLsizei
>(c
.width
);
675 GLsizei height
= static_cast<GLsizei
>(c
.height
);
676 if (!validators_
->texture_target
.IsValid(target
)) {
677 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexSubImage2D", target
, "target");
678 return error::kNoError
;
681 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexSubImage2D", "width < 0");
682 return error::kNoError
;
685 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexSubImage2D", "height < 0");
686 return error::kNoError
;
688 DoCopyTexSubImage2D(target
, level
, xoffset
, yoffset
, x
, y
, width
, height
);
689 return error::kNoError
;
692 error::Error
GLES2DecoderImpl::HandleCopyTexSubImage3D(
693 uint32_t immediate_data_size
,
694 const void* cmd_data
) {
695 if (!unsafe_es3_apis_enabled())
696 return error::kUnknownCommand
;
697 const gles2::cmds::CopyTexSubImage3D
& c
=
698 *static_cast<const gles2::cmds::CopyTexSubImage3D
*>(cmd_data
);
701 error
= WillAccessBoundFramebufferForRead();
702 if (error
!= error::kNoError
)
704 GLenum target
= static_cast<GLenum
>(c
.target
);
705 GLint level
= static_cast<GLint
>(c
.level
);
706 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
707 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
708 GLint zoffset
= static_cast<GLint
>(c
.zoffset
);
709 GLint x
= static_cast<GLint
>(c
.x
);
710 GLint y
= static_cast<GLint
>(c
.y
);
711 GLsizei width
= static_cast<GLsizei
>(c
.width
);
712 GLsizei height
= static_cast<GLsizei
>(c
.height
);
713 glCopyTexSubImage3D(target
, level
, xoffset
, yoffset
, zoffset
, x
, y
, width
,
715 return error::kNoError
;
718 error::Error
GLES2DecoderImpl::HandleCreateProgram(uint32_t immediate_data_size
,
719 const void* cmd_data
) {
720 const gles2::cmds::CreateProgram
& c
=
721 *static_cast<const gles2::cmds::CreateProgram
*>(cmd_data
);
723 uint32_t client_id
= c
.client_id
;
724 if (GetProgram(client_id
)) {
725 return error::kInvalidArguments
;
727 GLuint service_id
= glCreateProgram();
729 CreateProgram(client_id
, service_id
);
731 return error::kNoError
;
734 error::Error
GLES2DecoderImpl::HandleCreateShader(uint32_t immediate_data_size
,
735 const void* cmd_data
) {
736 const gles2::cmds::CreateShader
& c
=
737 *static_cast<const gles2::cmds::CreateShader
*>(cmd_data
);
739 GLenum type
= static_cast<GLenum
>(c
.type
);
740 if (!validators_
->shader_type
.IsValid(type
)) {
741 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCreateShader", type
, "type");
742 return error::kNoError
;
744 uint32_t client_id
= c
.client_id
;
745 if (GetShader(client_id
)) {
746 return error::kInvalidArguments
;
748 GLuint service_id
= glCreateShader(type
);
750 CreateShader(client_id
, service_id
, type
);
752 return error::kNoError
;
755 error::Error
GLES2DecoderImpl::HandleCullFace(uint32_t immediate_data_size
,
756 const void* cmd_data
) {
757 const gles2::cmds::CullFace
& c
=
758 *static_cast<const gles2::cmds::CullFace
*>(cmd_data
);
760 GLenum mode
= static_cast<GLenum
>(c
.mode
);
761 if (!validators_
->face_type
.IsValid(mode
)) {
762 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCullFace", mode
, "mode");
763 return error::kNoError
;
765 if (state_
.cull_mode
!= mode
) {
766 state_
.cull_mode
= mode
;
769 return error::kNoError
;
772 error::Error
GLES2DecoderImpl::HandleDeleteBuffersImmediate(
773 uint32_t immediate_data_size
,
774 const void* cmd_data
) {
775 const gles2::cmds::DeleteBuffersImmediate
& c
=
776 *static_cast<const gles2::cmds::DeleteBuffersImmediate
*>(cmd_data
);
778 GLsizei n
= static_cast<GLsizei
>(c
.n
);
780 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
781 return error::kOutOfBounds
;
783 const GLuint
* buffers
=
784 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
785 if (buffers
== NULL
) {
786 return error::kOutOfBounds
;
788 DeleteBuffersHelper(n
, buffers
);
789 return error::kNoError
;
792 error::Error
GLES2DecoderImpl::HandleDeleteFramebuffersImmediate(
793 uint32_t immediate_data_size
,
794 const void* cmd_data
) {
795 const gles2::cmds::DeleteFramebuffersImmediate
& c
=
796 *static_cast<const gles2::cmds::DeleteFramebuffersImmediate
*>(cmd_data
);
798 GLsizei n
= static_cast<GLsizei
>(c
.n
);
800 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
801 return error::kOutOfBounds
;
803 const GLuint
* framebuffers
=
804 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
805 if (framebuffers
== NULL
) {
806 return error::kOutOfBounds
;
808 DeleteFramebuffersHelper(n
, framebuffers
);
809 return error::kNoError
;
812 error::Error
GLES2DecoderImpl::HandleDeleteRenderbuffersImmediate(
813 uint32_t immediate_data_size
,
814 const void* cmd_data
) {
815 const gles2::cmds::DeleteRenderbuffersImmediate
& c
=
816 *static_cast<const gles2::cmds::DeleteRenderbuffersImmediate
*>(cmd_data
);
818 GLsizei n
= static_cast<GLsizei
>(c
.n
);
820 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
821 return error::kOutOfBounds
;
823 const GLuint
* renderbuffers
=
824 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
825 if (renderbuffers
== NULL
) {
826 return error::kOutOfBounds
;
828 DeleteRenderbuffersHelper(n
, renderbuffers
);
829 return error::kNoError
;
832 error::Error
GLES2DecoderImpl::HandleDeleteSamplersImmediate(
833 uint32_t immediate_data_size
,
834 const void* cmd_data
) {
835 if (!unsafe_es3_apis_enabled())
836 return error::kUnknownCommand
;
837 const gles2::cmds::DeleteSamplersImmediate
& c
=
838 *static_cast<const gles2::cmds::DeleteSamplersImmediate
*>(cmd_data
);
840 GLsizei n
= static_cast<GLsizei
>(c
.n
);
842 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
843 return error::kOutOfBounds
;
845 const GLuint
* samplers
=
846 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
847 if (samplers
== NULL
) {
848 return error::kOutOfBounds
;
850 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
851 GLuint service_id
= 0;
852 if (group_
->GetSamplerServiceId(samplers
[ii
], &service_id
)) {
853 glDeleteSamplers(1, &service_id
);
854 group_
->RemoveSamplerId(samplers
[ii
]);
857 return error::kNoError
;
860 error::Error
GLES2DecoderImpl::HandleDeleteSync(uint32_t immediate_data_size
,
861 const void* cmd_data
) {
862 if (!unsafe_es3_apis_enabled())
863 return error::kUnknownCommand
;
864 const gles2::cmds::DeleteSync
& c
=
865 *static_cast<const gles2::cmds::DeleteSync
*>(cmd_data
);
867 GLuint sync
= c
.sync
;
868 GLsync service_id
= 0;
869 if (group_
->GetSyncServiceId(sync
, &service_id
)) {
870 glDeleteSync(service_id
);
871 group_
->RemoveSyncId(sync
);
873 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glDeleteSync", "unknown sync");
875 return error::kNoError
;
878 error::Error
GLES2DecoderImpl::HandleDeleteTexturesImmediate(
879 uint32_t immediate_data_size
,
880 const void* cmd_data
) {
881 const gles2::cmds::DeleteTexturesImmediate
& c
=
882 *static_cast<const gles2::cmds::DeleteTexturesImmediate
*>(cmd_data
);
884 GLsizei n
= static_cast<GLsizei
>(c
.n
);
886 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
887 return error::kOutOfBounds
;
889 const GLuint
* textures
=
890 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
891 if (textures
== NULL
) {
892 return error::kOutOfBounds
;
894 DeleteTexturesHelper(n
, textures
);
895 return error::kNoError
;
898 error::Error
GLES2DecoderImpl::HandleDeleteTransformFeedbacksImmediate(
899 uint32_t immediate_data_size
,
900 const void* cmd_data
) {
901 if (!unsafe_es3_apis_enabled())
902 return error::kUnknownCommand
;
903 const gles2::cmds::DeleteTransformFeedbacksImmediate
& c
=
904 *static_cast<const gles2::cmds::DeleteTransformFeedbacksImmediate
*>(
907 GLsizei n
= static_cast<GLsizei
>(c
.n
);
909 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
910 return error::kOutOfBounds
;
913 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
915 return error::kOutOfBounds
;
917 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
918 GLuint service_id
= 0;
919 if (group_
->GetTransformFeedbackServiceId(ids
[ii
], &service_id
)) {
920 glDeleteTransformFeedbacks(1, &service_id
);
921 group_
->RemoveTransformFeedbackId(ids
[ii
]);
924 return error::kNoError
;
927 error::Error
GLES2DecoderImpl::HandleDepthFunc(uint32_t immediate_data_size
,
928 const void* cmd_data
) {
929 const gles2::cmds::DepthFunc
& c
=
930 *static_cast<const gles2::cmds::DepthFunc
*>(cmd_data
);
932 GLenum func
= static_cast<GLenum
>(c
.func
);
933 if (!validators_
->cmp_function
.IsValid(func
)) {
934 LOCAL_SET_GL_ERROR_INVALID_ENUM("glDepthFunc", func
, "func");
935 return error::kNoError
;
937 if (state_
.depth_func
!= func
) {
938 state_
.depth_func
= func
;
941 return error::kNoError
;
944 error::Error
GLES2DecoderImpl::HandleDepthMask(uint32_t immediate_data_size
,
945 const void* cmd_data
) {
946 const gles2::cmds::DepthMask
& c
=
947 *static_cast<const gles2::cmds::DepthMask
*>(cmd_data
);
949 GLboolean flag
= static_cast<GLboolean
>(c
.flag
);
950 if (state_
.depth_mask
!= flag
) {
951 state_
.depth_mask
= flag
;
952 framebuffer_state_
.clear_state_dirty
= true;
954 return error::kNoError
;
957 error::Error
GLES2DecoderImpl::HandleDepthRangef(uint32_t immediate_data_size
,
958 const void* cmd_data
) {
959 const gles2::cmds::DepthRangef
& c
=
960 *static_cast<const gles2::cmds::DepthRangef
*>(cmd_data
);
962 GLclampf zNear
= static_cast<GLclampf
>(c
.zNear
);
963 GLclampf zFar
= static_cast<GLclampf
>(c
.zFar
);
964 DoDepthRangef(zNear
, zFar
);
965 return error::kNoError
;
968 error::Error
GLES2DecoderImpl::HandleDetachShader(uint32_t immediate_data_size
,
969 const void* cmd_data
) {
970 const gles2::cmds::DetachShader
& c
=
971 *static_cast<const gles2::cmds::DetachShader
*>(cmd_data
);
973 GLuint program
= c
.program
;
974 GLuint shader
= c
.shader
;
975 DoDetachShader(program
, shader
);
976 return error::kNoError
;
979 error::Error
GLES2DecoderImpl::HandleDisable(uint32_t immediate_data_size
,
980 const void* cmd_data
) {
981 const gles2::cmds::Disable
& c
=
982 *static_cast<const gles2::cmds::Disable
*>(cmd_data
);
984 GLenum cap
= static_cast<GLenum
>(c
.cap
);
985 if (!validators_
->capability
.IsValid(cap
)) {
986 LOCAL_SET_GL_ERROR_INVALID_ENUM("glDisable", cap
, "cap");
987 return error::kNoError
;
990 return error::kNoError
;
993 error::Error
GLES2DecoderImpl::HandleDisableVertexAttribArray(
994 uint32_t immediate_data_size
,
995 const void* cmd_data
) {
996 const gles2::cmds::DisableVertexAttribArray
& c
=
997 *static_cast<const gles2::cmds::DisableVertexAttribArray
*>(cmd_data
);
999 GLuint index
= static_cast<GLuint
>(c
.index
);
1000 DoDisableVertexAttribArray(index
);
1001 return error::kNoError
;
1004 error::Error
GLES2DecoderImpl::HandleEnable(uint32_t immediate_data_size
,
1005 const void* cmd_data
) {
1006 const gles2::cmds::Enable
& c
=
1007 *static_cast<const gles2::cmds::Enable
*>(cmd_data
);
1009 GLenum cap
= static_cast<GLenum
>(c
.cap
);
1010 if (!validators_
->capability
.IsValid(cap
)) {
1011 LOCAL_SET_GL_ERROR_INVALID_ENUM("glEnable", cap
, "cap");
1012 return error::kNoError
;
1015 return error::kNoError
;
1018 error::Error
GLES2DecoderImpl::HandleEnableVertexAttribArray(
1019 uint32_t immediate_data_size
,
1020 const void* cmd_data
) {
1021 const gles2::cmds::EnableVertexAttribArray
& c
=
1022 *static_cast<const gles2::cmds::EnableVertexAttribArray
*>(cmd_data
);
1024 GLuint index
= static_cast<GLuint
>(c
.index
);
1025 DoEnableVertexAttribArray(index
);
1026 return error::kNoError
;
1029 error::Error
GLES2DecoderImpl::HandleFenceSync(uint32_t immediate_data_size
,
1030 const void* cmd_data
) {
1031 if (!unsafe_es3_apis_enabled())
1032 return error::kUnknownCommand
;
1033 const gles2::cmds::FenceSync
& c
=
1034 *static_cast<const gles2::cmds::FenceSync
*>(cmd_data
);
1036 GLenum condition
= static_cast<GLenum
>(c
.condition
);
1037 GLbitfield flags
= static_cast<GLbitfield
>(c
.flags
);
1038 uint32_t client_id
= c
.client_id
;
1039 GLsync service_id
= 0;
1040 if (group_
->GetSyncServiceId(client_id
, &service_id
)) {
1041 return error::kInvalidArguments
;
1043 service_id
= glFenceSync(condition
, flags
);
1045 group_
->AddSyncId(client_id
, service_id
);
1047 return error::kNoError
;
1050 error::Error
GLES2DecoderImpl::HandleFinish(uint32_t immediate_data_size
,
1051 const void* cmd_data
) {
1052 const gles2::cmds::Finish
& c
=
1053 *static_cast<const gles2::cmds::Finish
*>(cmd_data
);
1056 error
= WillAccessBoundFramebufferForRead();
1057 if (error
!= error::kNoError
)
1060 return error::kNoError
;
1063 error::Error
GLES2DecoderImpl::HandleFlush(uint32_t immediate_data_size
,
1064 const void* cmd_data
) {
1065 const gles2::cmds::Flush
& c
=
1066 *static_cast<const gles2::cmds::Flush
*>(cmd_data
);
1069 return error::kNoError
;
1072 error::Error
GLES2DecoderImpl::HandleFramebufferRenderbuffer(
1073 uint32_t immediate_data_size
,
1074 const void* cmd_data
) {
1075 const gles2::cmds::FramebufferRenderbuffer
& c
=
1076 *static_cast<const gles2::cmds::FramebufferRenderbuffer
*>(cmd_data
);
1078 GLenum target
= static_cast<GLenum
>(c
.target
);
1079 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1080 GLenum renderbuffertarget
= static_cast<GLenum
>(c
.renderbuffertarget
);
1081 GLuint renderbuffer
= c
.renderbuffer
;
1082 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
1083 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer", target
,
1085 return error::kNoError
;
1087 if (!validators_
->attachment
.IsValid(attachment
)) {
1088 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer", attachment
,
1090 return error::kNoError
;
1092 if (!validators_
->render_buffer_target
.IsValid(renderbuffertarget
)) {
1093 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer",
1094 renderbuffertarget
, "renderbuffertarget");
1095 return error::kNoError
;
1097 DoFramebufferRenderbuffer(target
, attachment
, renderbuffertarget
,
1099 return error::kNoError
;
1102 error::Error
GLES2DecoderImpl::HandleFramebufferTexture2D(
1103 uint32_t immediate_data_size
,
1104 const void* cmd_data
) {
1105 const gles2::cmds::FramebufferTexture2D
& c
=
1106 *static_cast<const gles2::cmds::FramebufferTexture2D
*>(cmd_data
);
1108 GLenum target
= static_cast<GLenum
>(c
.target
);
1109 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1110 GLenum textarget
= static_cast<GLenum
>(c
.textarget
);
1111 GLuint texture
= c
.texture
;
1112 GLint level
= static_cast<GLint
>(c
.level
);
1113 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
1114 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", target
, "target");
1115 return error::kNoError
;
1117 if (!validators_
->attachment
.IsValid(attachment
)) {
1118 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", attachment
,
1120 return error::kNoError
;
1122 if (!validators_
->texture_target
.IsValid(textarget
)) {
1123 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", textarget
,
1125 return error::kNoError
;
1127 DoFramebufferTexture2D(target
, attachment
, textarget
, texture
, level
);
1128 return error::kNoError
;
1131 error::Error
GLES2DecoderImpl::HandleFramebufferTextureLayer(
1132 uint32_t immediate_data_size
,
1133 const void* cmd_data
) {
1134 if (!unsafe_es3_apis_enabled())
1135 return error::kUnknownCommand
;
1136 const gles2::cmds::FramebufferTextureLayer
& c
=
1137 *static_cast<const gles2::cmds::FramebufferTextureLayer
*>(cmd_data
);
1139 GLenum target
= static_cast<GLenum
>(c
.target
);
1140 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1141 GLuint texture
= c
.texture
;
1142 GLint level
= static_cast<GLint
>(c
.level
);
1143 GLint layer
= static_cast<GLint
>(c
.layer
);
1144 DoFramebufferTextureLayer(target
, attachment
, texture
, level
, layer
);
1145 return error::kNoError
;
1148 error::Error
GLES2DecoderImpl::HandleFrontFace(uint32_t immediate_data_size
,
1149 const void* cmd_data
) {
1150 const gles2::cmds::FrontFace
& c
=
1151 *static_cast<const gles2::cmds::FrontFace
*>(cmd_data
);
1153 GLenum mode
= static_cast<GLenum
>(c
.mode
);
1154 if (!validators_
->face_mode
.IsValid(mode
)) {
1155 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFrontFace", mode
, "mode");
1156 return error::kNoError
;
1158 if (state_
.front_face
!= mode
) {
1159 state_
.front_face
= mode
;
1162 return error::kNoError
;
1165 error::Error
GLES2DecoderImpl::HandleGenBuffersImmediate(
1166 uint32_t immediate_data_size
,
1167 const void* cmd_data
) {
1168 const gles2::cmds::GenBuffersImmediate
& c
=
1169 *static_cast<const gles2::cmds::GenBuffersImmediate
*>(cmd_data
);
1171 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1173 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1174 return error::kOutOfBounds
;
1177 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1178 if (buffers
== NULL
) {
1179 return error::kOutOfBounds
;
1181 if (!GenBuffersHelper(n
, buffers
)) {
1182 return error::kInvalidArguments
;
1184 return error::kNoError
;
1187 error::Error
GLES2DecoderImpl::HandleGenerateMipmap(
1188 uint32_t immediate_data_size
,
1189 const void* cmd_data
) {
1190 const gles2::cmds::GenerateMipmap
& c
=
1191 *static_cast<const gles2::cmds::GenerateMipmap
*>(cmd_data
);
1193 GLenum target
= static_cast<GLenum
>(c
.target
);
1194 if (!validators_
->texture_bind_target
.IsValid(target
)) {
1195 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGenerateMipmap", target
, "target");
1196 return error::kNoError
;
1198 DoGenerateMipmap(target
);
1199 return error::kNoError
;
1202 error::Error
GLES2DecoderImpl::HandleGenFramebuffersImmediate(
1203 uint32_t immediate_data_size
,
1204 const void* cmd_data
) {
1205 const gles2::cmds::GenFramebuffersImmediate
& c
=
1206 *static_cast<const gles2::cmds::GenFramebuffersImmediate
*>(cmd_data
);
1208 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1210 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1211 return error::kOutOfBounds
;
1213 GLuint
* framebuffers
=
1214 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1215 if (framebuffers
== NULL
) {
1216 return error::kOutOfBounds
;
1218 if (!GenFramebuffersHelper(n
, framebuffers
)) {
1219 return error::kInvalidArguments
;
1221 return error::kNoError
;
1224 error::Error
GLES2DecoderImpl::HandleGenRenderbuffersImmediate(
1225 uint32_t immediate_data_size
,
1226 const void* cmd_data
) {
1227 const gles2::cmds::GenRenderbuffersImmediate
& c
=
1228 *static_cast<const gles2::cmds::GenRenderbuffersImmediate
*>(cmd_data
);
1230 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1232 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1233 return error::kOutOfBounds
;
1235 GLuint
* renderbuffers
=
1236 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1237 if (renderbuffers
== NULL
) {
1238 return error::kOutOfBounds
;
1240 if (!GenRenderbuffersHelper(n
, renderbuffers
)) {
1241 return error::kInvalidArguments
;
1243 return error::kNoError
;
1246 error::Error
GLES2DecoderImpl::HandleGenSamplersImmediate(
1247 uint32_t immediate_data_size
,
1248 const void* cmd_data
) {
1249 if (!unsafe_es3_apis_enabled())
1250 return error::kUnknownCommand
;
1251 const gles2::cmds::GenSamplersImmediate
& c
=
1252 *static_cast<const gles2::cmds::GenSamplersImmediate
*>(cmd_data
);
1254 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1256 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1257 return error::kOutOfBounds
;
1260 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1261 if (samplers
== NULL
) {
1262 return error::kOutOfBounds
;
1264 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1265 if (group_
->GetSamplerServiceId(samplers
[ii
], NULL
)) {
1266 return error::kInvalidArguments
;
1269 scoped_ptr
<GLuint
[]> service_ids(new GLuint
[n
]);
1270 glGenSamplers(n
, service_ids
.get());
1271 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1272 group_
->AddSamplerId(samplers
[ii
], service_ids
[ii
]);
1274 return error::kNoError
;
1277 error::Error
GLES2DecoderImpl::HandleGenTexturesImmediate(
1278 uint32_t immediate_data_size
,
1279 const void* cmd_data
) {
1280 const gles2::cmds::GenTexturesImmediate
& c
=
1281 *static_cast<const gles2::cmds::GenTexturesImmediate
*>(cmd_data
);
1283 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1285 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1286 return error::kOutOfBounds
;
1289 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1290 if (textures
== NULL
) {
1291 return error::kOutOfBounds
;
1293 if (!GenTexturesHelper(n
, textures
)) {
1294 return error::kInvalidArguments
;
1296 return error::kNoError
;
1299 error::Error
GLES2DecoderImpl::HandleGenTransformFeedbacksImmediate(
1300 uint32_t immediate_data_size
,
1301 const void* cmd_data
) {
1302 if (!unsafe_es3_apis_enabled())
1303 return error::kUnknownCommand
;
1304 const gles2::cmds::GenTransformFeedbacksImmediate
& c
=
1305 *static_cast<const gles2::cmds::GenTransformFeedbacksImmediate
*>(
1308 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1310 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1311 return error::kOutOfBounds
;
1313 GLuint
* ids
= GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1315 return error::kOutOfBounds
;
1317 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1318 if (group_
->GetTransformFeedbackServiceId(ids
[ii
], NULL
)) {
1319 return error::kInvalidArguments
;
1322 scoped_ptr
<GLuint
[]> service_ids(new GLuint
[n
]);
1323 glGenTransformFeedbacks(n
, service_ids
.get());
1324 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1325 group_
->AddTransformFeedbackId(ids
[ii
], service_ids
[ii
]);
1327 return error::kNoError
;
1330 error::Error
GLES2DecoderImpl::HandleGetBooleanv(uint32_t immediate_data_size
,
1331 const void* cmd_data
) {
1332 const gles2::cmds::GetBooleanv
& c
=
1333 *static_cast<const gles2::cmds::GetBooleanv
*>(cmd_data
);
1335 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1336 typedef cmds::GetBooleanv::Result Result
;
1337 GLsizei num_values
= 0;
1338 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1339 Result
* result
= GetSharedMemoryAs
<Result
*>(
1340 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1341 GLboolean
* params
= result
? result
->GetData() : NULL
;
1342 if (!validators_
->g_l_state
.IsValid(pname
)) {
1343 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBooleanv", pname
, "pname");
1344 return error::kNoError
;
1346 if (params
== NULL
) {
1347 return error::kOutOfBounds
;
1349 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetBooleanv");
1350 // Check that the client initialized the result.
1351 if (result
->size
!= 0) {
1352 return error::kInvalidArguments
;
1354 DoGetBooleanv(pname
, params
);
1355 GLenum error
= glGetError();
1356 if (error
== GL_NO_ERROR
) {
1357 result
->SetNumResults(num_values
);
1359 LOCAL_SET_GL_ERROR(error
, "GetBooleanv", "");
1361 return error::kNoError
;
1364 error::Error
GLES2DecoderImpl::HandleGetBufferParameteriv(
1365 uint32_t immediate_data_size
,
1366 const void* cmd_data
) {
1367 const gles2::cmds::GetBufferParameteriv
& c
=
1368 *static_cast<const gles2::cmds::GetBufferParameteriv
*>(cmd_data
);
1370 GLenum target
= static_cast<GLenum
>(c
.target
);
1371 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1372 typedef cmds::GetBufferParameteriv::Result Result
;
1373 GLsizei num_values
= 0;
1374 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1375 Result
* result
= GetSharedMemoryAs
<Result
*>(
1376 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1377 GLint
* params
= result
? result
->GetData() : NULL
;
1378 if (!validators_
->buffer_target
.IsValid(target
)) {
1379 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", target
, "target");
1380 return error::kNoError
;
1382 if (!validators_
->buffer_parameter
.IsValid(pname
)) {
1383 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", pname
, "pname");
1384 return error::kNoError
;
1386 if (params
== NULL
) {
1387 return error::kOutOfBounds
;
1389 // Check that the client initialized the result.
1390 if (result
->size
!= 0) {
1391 return error::kInvalidArguments
;
1393 DoGetBufferParameteriv(target
, pname
, params
);
1394 result
->SetNumResults(num_values
);
1395 return error::kNoError
;
1397 error::Error
GLES2DecoderImpl::HandleGetError(uint32_t immediate_data_size
,
1398 const void* cmd_data
) {
1399 const gles2::cmds::GetError
& c
=
1400 *static_cast<const gles2::cmds::GetError
*>(cmd_data
);
1402 typedef cmds::GetError::Result Result
;
1403 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
1404 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
1406 return error::kOutOfBounds
;
1408 *result_dst
= GetErrorState()->GetGLError();
1409 return error::kNoError
;
1412 error::Error
GLES2DecoderImpl::HandleGetFloatv(uint32_t immediate_data_size
,
1413 const void* cmd_data
) {
1414 const gles2::cmds::GetFloatv
& c
=
1415 *static_cast<const gles2::cmds::GetFloatv
*>(cmd_data
);
1417 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1418 typedef cmds::GetFloatv::Result Result
;
1419 GLsizei num_values
= 0;
1420 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1421 Result
* result
= GetSharedMemoryAs
<Result
*>(
1422 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1423 GLfloat
* params
= result
? result
->GetData() : NULL
;
1424 if (!validators_
->g_l_state
.IsValid(pname
)) {
1425 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFloatv", pname
, "pname");
1426 return error::kNoError
;
1428 if (params
== NULL
) {
1429 return error::kOutOfBounds
;
1431 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetFloatv");
1432 // Check that the client initialized the result.
1433 if (result
->size
!= 0) {
1434 return error::kInvalidArguments
;
1436 DoGetFloatv(pname
, params
);
1437 GLenum error
= glGetError();
1438 if (error
== GL_NO_ERROR
) {
1439 result
->SetNumResults(num_values
);
1441 LOCAL_SET_GL_ERROR(error
, "GetFloatv", "");
1443 return error::kNoError
;
1446 error::Error
GLES2DecoderImpl::HandleGetFramebufferAttachmentParameteriv(
1447 uint32_t immediate_data_size
,
1448 const void* cmd_data
) {
1449 const gles2::cmds::GetFramebufferAttachmentParameteriv
& c
=
1450 *static_cast<const gles2::cmds::GetFramebufferAttachmentParameteriv
*>(
1453 GLenum target
= static_cast<GLenum
>(c
.target
);
1454 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1455 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1456 typedef cmds::GetFramebufferAttachmentParameteriv::Result Result
;
1457 GLsizei num_values
= 0;
1458 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1459 Result
* result
= GetSharedMemoryAs
<Result
*>(
1460 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1461 GLint
* params
= result
? result
->GetData() : NULL
;
1462 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
1463 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv",
1465 return error::kNoError
;
1467 if (!validators_
->attachment
.IsValid(attachment
)) {
1468 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv",
1469 attachment
, "attachment");
1470 return error::kNoError
;
1472 if (!validators_
->frame_buffer_parameter
.IsValid(pname
)) {
1473 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv",
1475 return error::kNoError
;
1477 if (params
== NULL
) {
1478 return error::kOutOfBounds
;
1480 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetFramebufferAttachmentParameteriv");
1481 // Check that the client initialized the result.
1482 if (result
->size
!= 0) {
1483 return error::kInvalidArguments
;
1485 DoGetFramebufferAttachmentParameteriv(target
, attachment
, pname
, params
);
1486 GLenum error
= glGetError();
1487 if (error
== GL_NO_ERROR
) {
1488 result
->SetNumResults(num_values
);
1490 LOCAL_SET_GL_ERROR(error
, "GetFramebufferAttachmentParameteriv", "");
1492 return error::kNoError
;
1495 error::Error
GLES2DecoderImpl::HandleGetInteger64v(uint32_t immediate_data_size
,
1496 const void* cmd_data
) {
1497 if (!unsafe_es3_apis_enabled())
1498 return error::kUnknownCommand
;
1499 const gles2::cmds::GetInteger64v
& c
=
1500 *static_cast<const gles2::cmds::GetInteger64v
*>(cmd_data
);
1502 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1503 typedef cmds::GetInteger64v::Result Result
;
1504 GLsizei num_values
= 0;
1505 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1506 Result
* result
= GetSharedMemoryAs
<Result
*>(
1507 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1508 GLint64
* params
= result
? result
->GetData() : NULL
;
1509 if (params
== NULL
) {
1510 return error::kOutOfBounds
;
1512 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetInteger64v");
1513 // Check that the client initialized the result.
1514 if (result
->size
!= 0) {
1515 return error::kInvalidArguments
;
1517 DoGetInteger64v(pname
, params
);
1518 GLenum error
= glGetError();
1519 if (error
== GL_NO_ERROR
) {
1520 result
->SetNumResults(num_values
);
1522 LOCAL_SET_GL_ERROR(error
, "GetInteger64v", "");
1524 return error::kNoError
;
1527 error::Error
GLES2DecoderImpl::HandleGetIntegeri_v(uint32_t immediate_data_size
,
1528 const void* cmd_data
) {
1529 if (!unsafe_es3_apis_enabled())
1530 return error::kUnknownCommand
;
1531 const gles2::cmds::GetIntegeri_v
& c
=
1532 *static_cast<const gles2::cmds::GetIntegeri_v
*>(cmd_data
);
1534 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1535 GLuint index
= static_cast<GLuint
>(c
.index
);
1536 typedef cmds::GetIntegeri_v::Result Result
;
1537 GLsizei num_values
= 0;
1538 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1539 Result
* result
= GetSharedMemoryAs
<Result
*>(c
.data_shm_id
, c
.data_shm_offset
,
1540 Result::ComputeSize(num_values
));
1541 GLint
* data
= result
? result
->GetData() : NULL
;
1543 return error::kOutOfBounds
;
1545 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetIntegeri_v");
1546 // Check that the client initialized the result.
1547 if (result
->size
!= 0) {
1548 return error::kInvalidArguments
;
1550 glGetIntegeri_v(pname
, index
, data
);
1551 GLenum error
= glGetError();
1552 if (error
== GL_NO_ERROR
) {
1553 result
->SetNumResults(num_values
);
1555 LOCAL_SET_GL_ERROR(error
, "GetIntegeri_v", "");
1557 return error::kNoError
;
1560 error::Error
GLES2DecoderImpl::HandleGetInteger64i_v(
1561 uint32_t immediate_data_size
,
1562 const void* cmd_data
) {
1563 if (!unsafe_es3_apis_enabled())
1564 return error::kUnknownCommand
;
1565 const gles2::cmds::GetInteger64i_v
& c
=
1566 *static_cast<const gles2::cmds::GetInteger64i_v
*>(cmd_data
);
1568 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1569 GLuint index
= static_cast<GLuint
>(c
.index
);
1570 typedef cmds::GetInteger64i_v::Result Result
;
1571 GLsizei num_values
= 0;
1572 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1573 Result
* result
= GetSharedMemoryAs
<Result
*>(c
.data_shm_id
, c
.data_shm_offset
,
1574 Result::ComputeSize(num_values
));
1575 GLint64
* data
= result
? result
->GetData() : NULL
;
1577 return error::kOutOfBounds
;
1579 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetInteger64i_v");
1580 // Check that the client initialized the result.
1581 if (result
->size
!= 0) {
1582 return error::kInvalidArguments
;
1584 glGetInteger64i_v(pname
, index
, data
);
1585 GLenum error
= glGetError();
1586 if (error
== GL_NO_ERROR
) {
1587 result
->SetNumResults(num_values
);
1589 LOCAL_SET_GL_ERROR(error
, "GetInteger64i_v", "");
1591 return error::kNoError
;
1594 error::Error
GLES2DecoderImpl::HandleGetIntegerv(uint32_t immediate_data_size
,
1595 const void* cmd_data
) {
1596 const gles2::cmds::GetIntegerv
& c
=
1597 *static_cast<const gles2::cmds::GetIntegerv
*>(cmd_data
);
1599 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1600 typedef cmds::GetIntegerv::Result Result
;
1601 GLsizei num_values
= 0;
1602 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1603 Result
* result
= GetSharedMemoryAs
<Result
*>(
1604 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1605 GLint
* params
= result
? result
->GetData() : NULL
;
1606 if (!validators_
->g_l_state
.IsValid(pname
)) {
1607 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetIntegerv", pname
, "pname");
1608 return error::kNoError
;
1610 if (params
== NULL
) {
1611 return error::kOutOfBounds
;
1613 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetIntegerv");
1614 // Check that the client initialized the result.
1615 if (result
->size
!= 0) {
1616 return error::kInvalidArguments
;
1618 DoGetIntegerv(pname
, params
);
1619 GLenum error
= glGetError();
1620 if (error
== GL_NO_ERROR
) {
1621 result
->SetNumResults(num_values
);
1623 LOCAL_SET_GL_ERROR(error
, "GetIntegerv", "");
1625 return error::kNoError
;
1628 error::Error
GLES2DecoderImpl::HandleGetInternalformativ(
1629 uint32_t immediate_data_size
,
1630 const void* cmd_data
) {
1631 if (!unsafe_es3_apis_enabled())
1632 return error::kUnknownCommand
;
1633 const gles2::cmds::GetInternalformativ
& c
=
1634 *static_cast<const gles2::cmds::GetInternalformativ
*>(cmd_data
);
1636 GLenum target
= static_cast<GLenum
>(c
.target
);
1637 GLenum format
= static_cast<GLenum
>(c
.format
);
1638 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1639 GLsizei bufSize
= static_cast<GLsizei
>(c
.bufSize
);
1640 typedef cmds::GetInternalformativ::Result Result
;
1641 GLsizei num_values
= 0;
1642 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1643 Result
* result
= GetSharedMemoryAs
<Result
*>(
1644 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1645 GLint
* params
= result
? result
->GetData() : NULL
;
1646 if (params
== NULL
) {
1647 return error::kOutOfBounds
;
1649 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetInternalformativ");
1650 // Check that the client initialized the result.
1651 if (result
->size
!= 0) {
1652 return error::kInvalidArguments
;
1654 glGetInternalformativ(target
, format
, pname
, bufSize
, params
);
1655 GLenum error
= glGetError();
1656 if (error
== GL_NO_ERROR
) {
1657 result
->SetNumResults(num_values
);
1659 LOCAL_SET_GL_ERROR(error
, "GetInternalformativ", "");
1661 return error::kNoError
;
1664 error::Error
GLES2DecoderImpl::HandleGetProgramiv(uint32_t immediate_data_size
,
1665 const void* cmd_data
) {
1666 const gles2::cmds::GetProgramiv
& c
=
1667 *static_cast<const gles2::cmds::GetProgramiv
*>(cmd_data
);
1669 GLuint program
= c
.program
;
1670 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1671 typedef cmds::GetProgramiv::Result Result
;
1672 GLsizei num_values
= 0;
1673 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1674 Result
* result
= GetSharedMemoryAs
<Result
*>(
1675 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1676 GLint
* params
= result
? result
->GetData() : NULL
;
1677 if (!validators_
->program_parameter
.IsValid(pname
)) {
1678 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetProgramiv", pname
, "pname");
1679 return error::kNoError
;
1681 if (params
== NULL
) {
1682 return error::kOutOfBounds
;
1684 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetProgramiv");
1685 // Check that the client initialized the result.
1686 if (result
->size
!= 0) {
1687 return error::kInvalidArguments
;
1689 DoGetProgramiv(program
, pname
, params
);
1690 GLenum error
= glGetError();
1691 if (error
== GL_NO_ERROR
) {
1692 result
->SetNumResults(num_values
);
1694 LOCAL_SET_GL_ERROR(error
, "GetProgramiv", "");
1696 return error::kNoError
;
1699 error::Error
GLES2DecoderImpl::HandleGetRenderbufferParameteriv(
1700 uint32_t immediate_data_size
,
1701 const void* cmd_data
) {
1702 const gles2::cmds::GetRenderbufferParameteriv
& c
=
1703 *static_cast<const gles2::cmds::GetRenderbufferParameteriv
*>(cmd_data
);
1705 GLenum target
= static_cast<GLenum
>(c
.target
);
1706 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1707 typedef cmds::GetRenderbufferParameteriv::Result Result
;
1708 GLsizei num_values
= 0;
1709 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1710 Result
* result
= GetSharedMemoryAs
<Result
*>(
1711 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1712 GLint
* params
= result
? result
->GetData() : NULL
;
1713 if (!validators_
->render_buffer_target
.IsValid(target
)) {
1714 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetRenderbufferParameteriv", target
,
1716 return error::kNoError
;
1718 if (!validators_
->render_buffer_parameter
.IsValid(pname
)) {
1719 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetRenderbufferParameteriv", pname
,
1721 return error::kNoError
;
1723 if (params
== NULL
) {
1724 return error::kOutOfBounds
;
1726 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetRenderbufferParameteriv");
1727 // Check that the client initialized the result.
1728 if (result
->size
!= 0) {
1729 return error::kInvalidArguments
;
1731 DoGetRenderbufferParameteriv(target
, pname
, params
);
1732 GLenum error
= glGetError();
1733 if (error
== GL_NO_ERROR
) {
1734 result
->SetNumResults(num_values
);
1736 LOCAL_SET_GL_ERROR(error
, "GetRenderbufferParameteriv", "");
1738 return error::kNoError
;
1741 error::Error
GLES2DecoderImpl::HandleGetSamplerParameterfv(
1742 uint32_t immediate_data_size
,
1743 const void* cmd_data
) {
1744 if (!unsafe_es3_apis_enabled())
1745 return error::kUnknownCommand
;
1746 const gles2::cmds::GetSamplerParameterfv
& c
=
1747 *static_cast<const gles2::cmds::GetSamplerParameterfv
*>(cmd_data
);
1749 GLuint sampler
= c
.sampler
;
1750 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1751 typedef cmds::GetSamplerParameterfv::Result Result
;
1752 GLsizei num_values
= 0;
1753 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1754 Result
* result
= GetSharedMemoryAs
<Result
*>(
1755 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1756 GLfloat
* params
= result
? result
->GetData() : NULL
;
1757 if (params
== NULL
) {
1758 return error::kOutOfBounds
;
1760 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetSamplerParameterfv");
1761 // Check that the client initialized the result.
1762 if (result
->size
!= 0) {
1763 return error::kInvalidArguments
;
1765 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
1766 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glGetSamplerParameterfv",
1767 "invalid sampler id");
1768 return error::kNoError
;
1770 glGetSamplerParameterfv(sampler
, pname
, params
);
1771 GLenum error
= glGetError();
1772 if (error
== GL_NO_ERROR
) {
1773 result
->SetNumResults(num_values
);
1775 LOCAL_SET_GL_ERROR(error
, "GetSamplerParameterfv", "");
1777 return error::kNoError
;
1780 error::Error
GLES2DecoderImpl::HandleGetSamplerParameteriv(
1781 uint32_t immediate_data_size
,
1782 const void* cmd_data
) {
1783 if (!unsafe_es3_apis_enabled())
1784 return error::kUnknownCommand
;
1785 const gles2::cmds::GetSamplerParameteriv
& c
=
1786 *static_cast<const gles2::cmds::GetSamplerParameteriv
*>(cmd_data
);
1788 GLuint sampler
= c
.sampler
;
1789 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1790 typedef cmds::GetSamplerParameteriv::Result Result
;
1791 GLsizei num_values
= 0;
1792 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1793 Result
* result
= GetSharedMemoryAs
<Result
*>(
1794 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1795 GLint
* params
= result
? result
->GetData() : NULL
;
1796 if (params
== NULL
) {
1797 return error::kOutOfBounds
;
1799 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetSamplerParameteriv");
1800 // Check that the client initialized the result.
1801 if (result
->size
!= 0) {
1802 return error::kInvalidArguments
;
1804 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
1805 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glGetSamplerParameteriv",
1806 "invalid sampler id");
1807 return error::kNoError
;
1809 glGetSamplerParameteriv(sampler
, pname
, params
);
1810 GLenum error
= glGetError();
1811 if (error
== GL_NO_ERROR
) {
1812 result
->SetNumResults(num_values
);
1814 LOCAL_SET_GL_ERROR(error
, "GetSamplerParameteriv", "");
1816 return error::kNoError
;
1819 error::Error
GLES2DecoderImpl::HandleGetShaderiv(uint32_t immediate_data_size
,
1820 const void* cmd_data
) {
1821 const gles2::cmds::GetShaderiv
& c
=
1822 *static_cast<const gles2::cmds::GetShaderiv
*>(cmd_data
);
1824 GLuint shader
= c
.shader
;
1825 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1826 typedef cmds::GetShaderiv::Result Result
;
1827 GLsizei num_values
= 0;
1828 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1829 Result
* result
= GetSharedMemoryAs
<Result
*>(
1830 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1831 GLint
* params
= result
? result
->GetData() : NULL
;
1832 if (!validators_
->shader_parameter
.IsValid(pname
)) {
1833 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetShaderiv", pname
, "pname");
1834 return error::kNoError
;
1836 if (params
== NULL
) {
1837 return error::kOutOfBounds
;
1839 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetShaderiv");
1840 // Check that the client initialized the result.
1841 if (result
->size
!= 0) {
1842 return error::kInvalidArguments
;
1844 DoGetShaderiv(shader
, pname
, params
);
1845 GLenum error
= glGetError();
1846 if (error
== GL_NO_ERROR
) {
1847 result
->SetNumResults(num_values
);
1849 LOCAL_SET_GL_ERROR(error
, "GetShaderiv", "");
1851 return error::kNoError
;
1854 error::Error
GLES2DecoderImpl::HandleGetSynciv(uint32_t immediate_data_size
,
1855 const void* cmd_data
) {
1856 if (!unsafe_es3_apis_enabled())
1857 return error::kUnknownCommand
;
1858 const gles2::cmds::GetSynciv
& c
=
1859 *static_cast<const gles2::cmds::GetSynciv
*>(cmd_data
);
1861 GLuint sync
= static_cast<GLuint
>(c
.sync
);
1862 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1863 typedef cmds::GetSynciv::Result Result
;
1864 GLsizei num_values
= 0;
1865 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1866 Result
* result
= GetSharedMemoryAs
<Result
*>(
1867 c
.values_shm_id
, c
.values_shm_offset
, Result::ComputeSize(num_values
));
1868 GLint
* values
= result
? result
->GetData() : NULL
;
1869 if (values
== NULL
) {
1870 return error::kOutOfBounds
;
1872 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetSynciv");
1873 // Check that the client initialized the result.
1874 if (result
->size
!= 0) {
1875 return error::kInvalidArguments
;
1877 GLsync service_sync
= 0;
1878 if (!group_
->GetSyncServiceId(sync
, &service_sync
)) {
1879 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glGetSynciv", "invalid sync id");
1880 return error::kNoError
;
1882 glGetSynciv(service_sync
, pname
, num_values
, nullptr, values
);
1883 GLenum error
= glGetError();
1884 if (error
== GL_NO_ERROR
) {
1885 result
->SetNumResults(num_values
);
1887 LOCAL_SET_GL_ERROR(error
, "GetSynciv", "");
1889 return error::kNoError
;
1892 error::Error
GLES2DecoderImpl::HandleGetTexParameterfv(
1893 uint32_t immediate_data_size
,
1894 const void* cmd_data
) {
1895 const gles2::cmds::GetTexParameterfv
& c
=
1896 *static_cast<const gles2::cmds::GetTexParameterfv
*>(cmd_data
);
1898 GLenum target
= static_cast<GLenum
>(c
.target
);
1899 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1900 typedef cmds::GetTexParameterfv::Result Result
;
1901 GLsizei num_values
= 0;
1902 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1903 Result
* result
= GetSharedMemoryAs
<Result
*>(
1904 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1905 GLfloat
* params
= result
? result
->GetData() : NULL
;
1906 if (!validators_
->get_tex_param_target
.IsValid(target
)) {
1907 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameterfv", target
, "target");
1908 return error::kNoError
;
1910 if (!validators_
->texture_parameter
.IsValid(pname
)) {
1911 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameterfv", pname
, "pname");
1912 return error::kNoError
;
1914 if (params
== NULL
) {
1915 return error::kOutOfBounds
;
1917 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetTexParameterfv");
1918 // Check that the client initialized the result.
1919 if (result
->size
!= 0) {
1920 return error::kInvalidArguments
;
1922 DoGetTexParameterfv(target
, pname
, params
);
1923 GLenum error
= glGetError();
1924 if (error
== GL_NO_ERROR
) {
1925 result
->SetNumResults(num_values
);
1927 LOCAL_SET_GL_ERROR(error
, "GetTexParameterfv", "");
1929 return error::kNoError
;
1932 error::Error
GLES2DecoderImpl::HandleGetTexParameteriv(
1933 uint32_t immediate_data_size
,
1934 const void* cmd_data
) {
1935 const gles2::cmds::GetTexParameteriv
& c
=
1936 *static_cast<const gles2::cmds::GetTexParameteriv
*>(cmd_data
);
1938 GLenum target
= static_cast<GLenum
>(c
.target
);
1939 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1940 typedef cmds::GetTexParameteriv::Result Result
;
1941 GLsizei num_values
= 0;
1942 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1943 Result
* result
= GetSharedMemoryAs
<Result
*>(
1944 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1945 GLint
* params
= result
? result
->GetData() : NULL
;
1946 if (!validators_
->get_tex_param_target
.IsValid(target
)) {
1947 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameteriv", target
, "target");
1948 return error::kNoError
;
1950 if (!validators_
->texture_parameter
.IsValid(pname
)) {
1951 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameteriv", pname
, "pname");
1952 return error::kNoError
;
1954 if (params
== NULL
) {
1955 return error::kOutOfBounds
;
1957 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetTexParameteriv");
1958 // Check that the client initialized the result.
1959 if (result
->size
!= 0) {
1960 return error::kInvalidArguments
;
1962 DoGetTexParameteriv(target
, pname
, params
);
1963 GLenum error
= glGetError();
1964 if (error
== GL_NO_ERROR
) {
1965 result
->SetNumResults(num_values
);
1967 LOCAL_SET_GL_ERROR(error
, "GetTexParameteriv", "");
1969 return error::kNoError
;
1972 error::Error
GLES2DecoderImpl::HandleGetVertexAttribfv(
1973 uint32_t immediate_data_size
,
1974 const void* cmd_data
) {
1975 const gles2::cmds::GetVertexAttribfv
& c
=
1976 *static_cast<const gles2::cmds::GetVertexAttribfv
*>(cmd_data
);
1978 GLuint index
= static_cast<GLuint
>(c
.index
);
1979 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1980 typedef cmds::GetVertexAttribfv::Result Result
;
1981 GLsizei num_values
= 0;
1982 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1983 Result
* result
= GetSharedMemoryAs
<Result
*>(
1984 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1985 GLfloat
* params
= result
? result
->GetData() : NULL
;
1986 if (!validators_
->vertex_attribute
.IsValid(pname
)) {
1987 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribfv", pname
, "pname");
1988 return error::kNoError
;
1990 if (params
== NULL
) {
1991 return error::kOutOfBounds
;
1993 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribfv");
1994 // Check that the client initialized the result.
1995 if (result
->size
!= 0) {
1996 return error::kInvalidArguments
;
1998 DoGetVertexAttribfv(index
, pname
, params
);
1999 GLenum error
= glGetError();
2000 if (error
== GL_NO_ERROR
) {
2001 result
->SetNumResults(num_values
);
2003 LOCAL_SET_GL_ERROR(error
, "GetVertexAttribfv", "");
2005 return error::kNoError
;
2008 error::Error
GLES2DecoderImpl::HandleGetVertexAttribiv(
2009 uint32_t immediate_data_size
,
2010 const void* cmd_data
) {
2011 const gles2::cmds::GetVertexAttribiv
& c
=
2012 *static_cast<const gles2::cmds::GetVertexAttribiv
*>(cmd_data
);
2014 GLuint index
= static_cast<GLuint
>(c
.index
);
2015 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2016 typedef cmds::GetVertexAttribiv::Result Result
;
2017 GLsizei num_values
= 0;
2018 GetNumValuesReturnedForGLGet(pname
, &num_values
);
2019 Result
* result
= GetSharedMemoryAs
<Result
*>(
2020 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
2021 GLint
* params
= result
? result
->GetData() : NULL
;
2022 if (!validators_
->vertex_attribute
.IsValid(pname
)) {
2023 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribiv", pname
, "pname");
2024 return error::kNoError
;
2026 if (params
== NULL
) {
2027 return error::kOutOfBounds
;
2029 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribiv");
2030 // Check that the client initialized the result.
2031 if (result
->size
!= 0) {
2032 return error::kInvalidArguments
;
2034 DoGetVertexAttribiv(index
, pname
, params
);
2035 GLenum error
= glGetError();
2036 if (error
== GL_NO_ERROR
) {
2037 result
->SetNumResults(num_values
);
2039 LOCAL_SET_GL_ERROR(error
, "GetVertexAttribiv", "");
2041 return error::kNoError
;
2044 error::Error
GLES2DecoderImpl::HandleHint(uint32_t immediate_data_size
,
2045 const void* cmd_data
) {
2046 const gles2::cmds::Hint
& c
= *static_cast<const gles2::cmds::Hint
*>(cmd_data
);
2048 GLenum target
= static_cast<GLenum
>(c
.target
);
2049 GLenum mode
= static_cast<GLenum
>(c
.mode
);
2050 if (!validators_
->hint_target
.IsValid(target
)) {
2051 LOCAL_SET_GL_ERROR_INVALID_ENUM("glHint", target
, "target");
2052 return error::kNoError
;
2054 if (!validators_
->hint_mode
.IsValid(mode
)) {
2055 LOCAL_SET_GL_ERROR_INVALID_ENUM("glHint", mode
, "mode");
2056 return error::kNoError
;
2059 case GL_GENERATE_MIPMAP_HINT
:
2060 if (state_
.hint_generate_mipmap
!= mode
) {
2061 state_
.hint_generate_mipmap
= mode
;
2062 glHint(target
, mode
);
2065 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES
:
2066 if (state_
.hint_fragment_shader_derivative
!= mode
) {
2067 state_
.hint_fragment_shader_derivative
= mode
;
2068 glHint(target
, mode
);
2074 return error::kNoError
;
2077 error::Error
GLES2DecoderImpl::HandleInvalidateFramebufferImmediate(
2078 uint32_t immediate_data_size
,
2079 const void* cmd_data
) {
2080 if (!unsafe_es3_apis_enabled())
2081 return error::kUnknownCommand
;
2082 const gles2::cmds::InvalidateFramebufferImmediate
& c
=
2083 *static_cast<const gles2::cmds::InvalidateFramebufferImmediate
*>(
2086 GLenum target
= static_cast<GLenum
>(c
.target
);
2087 GLsizei count
= static_cast<GLsizei
>(c
.count
);
2089 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
2090 return error::kOutOfBounds
;
2092 if (data_size
> immediate_data_size
) {
2093 return error::kOutOfBounds
;
2095 const GLenum
* attachments
=
2096 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
2097 if (attachments
== NULL
) {
2098 return error::kOutOfBounds
;
2100 glInvalidateFramebuffer(target
, count
, attachments
);
2101 return error::kNoError
;
2104 error::Error
GLES2DecoderImpl::HandleInvalidateSubFramebufferImmediate(
2105 uint32_t immediate_data_size
,
2106 const void* cmd_data
) {
2107 if (!unsafe_es3_apis_enabled())
2108 return error::kUnknownCommand
;
2109 const gles2::cmds::InvalidateSubFramebufferImmediate
& c
=
2110 *static_cast<const gles2::cmds::InvalidateSubFramebufferImmediate
*>(
2113 GLenum target
= static_cast<GLenum
>(c
.target
);
2114 GLsizei count
= static_cast<GLsizei
>(c
.count
);
2116 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
2117 return error::kOutOfBounds
;
2119 if (data_size
> immediate_data_size
) {
2120 return error::kOutOfBounds
;
2122 const GLenum
* attachments
=
2123 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
2124 GLint x
= static_cast<GLint
>(c
.x
);
2125 GLint y
= static_cast<GLint
>(c
.y
);
2126 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2127 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2128 if (attachments
== NULL
) {
2129 return error::kOutOfBounds
;
2131 glInvalidateSubFramebuffer(target
, count
, attachments
, x
, y
, width
, height
);
2132 return error::kNoError
;
2135 error::Error
GLES2DecoderImpl::HandleIsBuffer(uint32_t immediate_data_size
,
2136 const void* cmd_data
) {
2137 const gles2::cmds::IsBuffer
& c
=
2138 *static_cast<const gles2::cmds::IsBuffer
*>(cmd_data
);
2140 GLuint buffer
= c
.buffer
;
2141 typedef cmds::IsBuffer::Result Result
;
2142 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2143 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2145 return error::kOutOfBounds
;
2147 *result_dst
= DoIsBuffer(buffer
);
2148 return error::kNoError
;
2151 error::Error
GLES2DecoderImpl::HandleIsEnabled(uint32_t immediate_data_size
,
2152 const void* cmd_data
) {
2153 const gles2::cmds::IsEnabled
& c
=
2154 *static_cast<const gles2::cmds::IsEnabled
*>(cmd_data
);
2156 GLenum cap
= static_cast<GLenum
>(c
.cap
);
2157 typedef cmds::IsEnabled::Result Result
;
2158 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2159 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2161 return error::kOutOfBounds
;
2163 if (!validators_
->capability
.IsValid(cap
)) {
2164 LOCAL_SET_GL_ERROR_INVALID_ENUM("glIsEnabled", cap
, "cap");
2165 return error::kNoError
;
2167 *result_dst
= DoIsEnabled(cap
);
2168 return error::kNoError
;
2171 error::Error
GLES2DecoderImpl::HandleIsFramebuffer(uint32_t immediate_data_size
,
2172 const void* cmd_data
) {
2173 const gles2::cmds::IsFramebuffer
& c
=
2174 *static_cast<const gles2::cmds::IsFramebuffer
*>(cmd_data
);
2176 GLuint framebuffer
= c
.framebuffer
;
2177 typedef cmds::IsFramebuffer::Result Result
;
2178 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2179 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2181 return error::kOutOfBounds
;
2183 *result_dst
= DoIsFramebuffer(framebuffer
);
2184 return error::kNoError
;
2187 error::Error
GLES2DecoderImpl::HandleIsProgram(uint32_t immediate_data_size
,
2188 const void* cmd_data
) {
2189 const gles2::cmds::IsProgram
& c
=
2190 *static_cast<const gles2::cmds::IsProgram
*>(cmd_data
);
2192 GLuint program
= c
.program
;
2193 typedef cmds::IsProgram::Result Result
;
2194 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2195 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2197 return error::kOutOfBounds
;
2199 *result_dst
= DoIsProgram(program
);
2200 return error::kNoError
;
2203 error::Error
GLES2DecoderImpl::HandleIsRenderbuffer(
2204 uint32_t immediate_data_size
,
2205 const void* cmd_data
) {
2206 const gles2::cmds::IsRenderbuffer
& c
=
2207 *static_cast<const gles2::cmds::IsRenderbuffer
*>(cmd_data
);
2209 GLuint renderbuffer
= c
.renderbuffer
;
2210 typedef cmds::IsRenderbuffer::Result Result
;
2211 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2212 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2214 return error::kOutOfBounds
;
2216 *result_dst
= DoIsRenderbuffer(renderbuffer
);
2217 return error::kNoError
;
2220 error::Error
GLES2DecoderImpl::HandleIsSampler(uint32_t immediate_data_size
,
2221 const void* cmd_data
) {
2222 if (!unsafe_es3_apis_enabled())
2223 return error::kUnknownCommand
;
2224 const gles2::cmds::IsSampler
& c
=
2225 *static_cast<const gles2::cmds::IsSampler
*>(cmd_data
);
2227 GLuint sampler
= c
.sampler
;
2228 typedef cmds::IsSampler::Result Result
;
2229 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2230 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2232 return error::kOutOfBounds
;
2234 GLuint service_sampler
= 0;
2235 *result_dst
= group_
->GetSamplerServiceId(sampler
, &service_sampler
);
2236 return error::kNoError
;
2239 error::Error
GLES2DecoderImpl::HandleIsShader(uint32_t immediate_data_size
,
2240 const void* cmd_data
) {
2241 const gles2::cmds::IsShader
& c
=
2242 *static_cast<const gles2::cmds::IsShader
*>(cmd_data
);
2244 GLuint shader
= c
.shader
;
2245 typedef cmds::IsShader::Result Result
;
2246 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2247 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2249 return error::kOutOfBounds
;
2251 *result_dst
= DoIsShader(shader
);
2252 return error::kNoError
;
2255 error::Error
GLES2DecoderImpl::HandleIsSync(uint32_t immediate_data_size
,
2256 const void* cmd_data
) {
2257 if (!unsafe_es3_apis_enabled())
2258 return error::kUnknownCommand
;
2259 const gles2::cmds::IsSync
& c
=
2260 *static_cast<const gles2::cmds::IsSync
*>(cmd_data
);
2262 GLuint sync
= c
.sync
;
2263 typedef cmds::IsSync::Result Result
;
2264 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2265 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2267 return error::kOutOfBounds
;
2269 GLsync service_sync
= 0;
2270 *result_dst
= group_
->GetSyncServiceId(sync
, &service_sync
);
2271 return error::kNoError
;
2274 error::Error
GLES2DecoderImpl::HandleIsTexture(uint32_t immediate_data_size
,
2275 const void* cmd_data
) {
2276 const gles2::cmds::IsTexture
& c
=
2277 *static_cast<const gles2::cmds::IsTexture
*>(cmd_data
);
2279 GLuint texture
= c
.texture
;
2280 typedef cmds::IsTexture::Result Result
;
2281 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2282 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2284 return error::kOutOfBounds
;
2286 *result_dst
= DoIsTexture(texture
);
2287 return error::kNoError
;
2290 error::Error
GLES2DecoderImpl::HandleIsTransformFeedback(
2291 uint32_t immediate_data_size
,
2292 const void* cmd_data
) {
2293 if (!unsafe_es3_apis_enabled())
2294 return error::kUnknownCommand
;
2295 const gles2::cmds::IsTransformFeedback
& c
=
2296 *static_cast<const gles2::cmds::IsTransformFeedback
*>(cmd_data
);
2298 GLuint transformfeedback
= c
.transformfeedback
;
2299 typedef cmds::IsTransformFeedback::Result Result
;
2300 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2301 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2303 return error::kOutOfBounds
;
2305 GLuint service_transformfeedback
= 0;
2306 *result_dst
= group_
->GetTransformFeedbackServiceId(
2307 transformfeedback
, &service_transformfeedback
);
2308 return error::kNoError
;
2311 error::Error
GLES2DecoderImpl::HandleLineWidth(uint32_t immediate_data_size
,
2312 const void* cmd_data
) {
2313 const gles2::cmds::LineWidth
& c
=
2314 *static_cast<const gles2::cmds::LineWidth
*>(cmd_data
);
2316 GLfloat width
= static_cast<GLfloat
>(c
.width
);
2317 if (width
<= 0.0f
|| std::isnan(width
)) {
2318 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "LineWidth", "width out of range");
2319 return error::kNoError
;
2321 if (state_
.line_width
!= width
) {
2322 state_
.line_width
= width
;
2325 return error::kNoError
;
2328 error::Error
GLES2DecoderImpl::HandleLinkProgram(uint32_t immediate_data_size
,
2329 const void* cmd_data
) {
2330 const gles2::cmds::LinkProgram
& c
=
2331 *static_cast<const gles2::cmds::LinkProgram
*>(cmd_data
);
2333 GLuint program
= c
.program
;
2334 DoLinkProgram(program
);
2335 return error::kNoError
;
2338 error::Error
GLES2DecoderImpl::HandlePauseTransformFeedback(
2339 uint32_t immediate_data_size
,
2340 const void* cmd_data
) {
2341 if (!unsafe_es3_apis_enabled())
2342 return error::kUnknownCommand
;
2343 const gles2::cmds::PauseTransformFeedback
& c
=
2344 *static_cast<const gles2::cmds::PauseTransformFeedback
*>(cmd_data
);
2346 glPauseTransformFeedback();
2347 return error::kNoError
;
2350 error::Error
GLES2DecoderImpl::HandlePolygonOffset(uint32_t immediate_data_size
,
2351 const void* cmd_data
) {
2352 const gles2::cmds::PolygonOffset
& c
=
2353 *static_cast<const gles2::cmds::PolygonOffset
*>(cmd_data
);
2355 GLfloat factor
= static_cast<GLfloat
>(c
.factor
);
2356 GLfloat units
= static_cast<GLfloat
>(c
.units
);
2357 if (state_
.polygon_offset_factor
!= factor
||
2358 state_
.polygon_offset_units
!= units
) {
2359 state_
.polygon_offset_factor
= factor
;
2360 state_
.polygon_offset_units
= units
;
2361 glPolygonOffset(factor
, units
);
2363 return error::kNoError
;
2366 error::Error
GLES2DecoderImpl::HandleReadBuffer(uint32_t immediate_data_size
,
2367 const void* cmd_data
) {
2368 if (!unsafe_es3_apis_enabled())
2369 return error::kUnknownCommand
;
2370 const gles2::cmds::ReadBuffer
& c
=
2371 *static_cast<const gles2::cmds::ReadBuffer
*>(cmd_data
);
2373 GLenum src
= static_cast<GLenum
>(c
.src
);
2375 return error::kNoError
;
2378 error::Error
GLES2DecoderImpl::HandleReleaseShaderCompiler(
2379 uint32_t immediate_data_size
,
2380 const void* cmd_data
) {
2381 const gles2::cmds::ReleaseShaderCompiler
& c
=
2382 *static_cast<const gles2::cmds::ReleaseShaderCompiler
*>(cmd_data
);
2384 DoReleaseShaderCompiler();
2385 return error::kNoError
;
2388 error::Error
GLES2DecoderImpl::HandleRenderbufferStorage(
2389 uint32_t immediate_data_size
,
2390 const void* cmd_data
) {
2391 const gles2::cmds::RenderbufferStorage
& c
=
2392 *static_cast<const gles2::cmds::RenderbufferStorage
*>(cmd_data
);
2394 GLenum target
= static_cast<GLenum
>(c
.target
);
2395 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
2396 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2397 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2398 if (!validators_
->render_buffer_target
.IsValid(target
)) {
2399 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorage", target
, "target");
2400 return error::kNoError
;
2402 if (!validators_
->render_buffer_format
.IsValid(internalformat
)) {
2403 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorage", internalformat
,
2405 return error::kNoError
;
2408 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorage", "width < 0");
2409 return error::kNoError
;
2412 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorage", "height < 0");
2413 return error::kNoError
;
2415 DoRenderbufferStorage(target
, internalformat
, width
, height
);
2416 return error::kNoError
;
2419 error::Error
GLES2DecoderImpl::HandleResumeTransformFeedback(
2420 uint32_t immediate_data_size
,
2421 const void* cmd_data
) {
2422 if (!unsafe_es3_apis_enabled())
2423 return error::kUnknownCommand
;
2424 const gles2::cmds::ResumeTransformFeedback
& c
=
2425 *static_cast<const gles2::cmds::ResumeTransformFeedback
*>(cmd_data
);
2427 glResumeTransformFeedback();
2428 return error::kNoError
;
2431 error::Error
GLES2DecoderImpl::HandleSampleCoverage(
2432 uint32_t immediate_data_size
,
2433 const void* cmd_data
) {
2434 const gles2::cmds::SampleCoverage
& c
=
2435 *static_cast<const gles2::cmds::SampleCoverage
*>(cmd_data
);
2437 GLclampf value
= static_cast<GLclampf
>(c
.value
);
2438 GLboolean invert
= static_cast<GLboolean
>(c
.invert
);
2439 DoSampleCoverage(value
, invert
);
2440 return error::kNoError
;
2443 error::Error
GLES2DecoderImpl::HandleSamplerParameterf(
2444 uint32_t immediate_data_size
,
2445 const void* cmd_data
) {
2446 if (!unsafe_es3_apis_enabled())
2447 return error::kUnknownCommand
;
2448 const gles2::cmds::SamplerParameterf
& c
=
2449 *static_cast<const gles2::cmds::SamplerParameterf
*>(cmd_data
);
2451 GLuint sampler
= c
.sampler
;
2452 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2453 GLfloat param
= static_cast<GLfloat
>(c
.param
);
2454 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
2455 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glSamplerParameterf",
2456 "invalid sampler id");
2457 return error::kNoError
;
2459 glSamplerParameterf(sampler
, pname
, param
);
2460 return error::kNoError
;
2463 error::Error
GLES2DecoderImpl::HandleSamplerParameterfvImmediate(
2464 uint32_t immediate_data_size
,
2465 const void* cmd_data
) {
2466 if (!unsafe_es3_apis_enabled())
2467 return error::kUnknownCommand
;
2468 const gles2::cmds::SamplerParameterfvImmediate
& c
=
2469 *static_cast<const gles2::cmds::SamplerParameterfvImmediate
*>(cmd_data
);
2471 GLuint sampler
= c
.sampler
;
2472 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2474 if (!ComputeDataSize(1, sizeof(GLfloat
), 1, &data_size
)) {
2475 return error::kOutOfBounds
;
2477 if (data_size
> immediate_data_size
) {
2478 return error::kOutOfBounds
;
2480 const GLfloat
* params
=
2481 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
2482 if (params
== NULL
) {
2483 return error::kOutOfBounds
;
2485 group_
->GetSamplerServiceId(sampler
, &sampler
);
2486 DoSamplerParameterfv(sampler
, pname
, params
);
2487 return error::kNoError
;
2490 error::Error
GLES2DecoderImpl::HandleSamplerParameteri(
2491 uint32_t immediate_data_size
,
2492 const void* cmd_data
) {
2493 if (!unsafe_es3_apis_enabled())
2494 return error::kUnknownCommand
;
2495 const gles2::cmds::SamplerParameteri
& c
=
2496 *static_cast<const gles2::cmds::SamplerParameteri
*>(cmd_data
);
2498 GLuint sampler
= c
.sampler
;
2499 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2500 GLint param
= static_cast<GLint
>(c
.param
);
2501 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
2502 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glSamplerParameteri",
2503 "invalid sampler id");
2504 return error::kNoError
;
2506 glSamplerParameteri(sampler
, pname
, param
);
2507 return error::kNoError
;
2510 error::Error
GLES2DecoderImpl::HandleSamplerParameterivImmediate(
2511 uint32_t immediate_data_size
,
2512 const void* cmd_data
) {
2513 if (!unsafe_es3_apis_enabled())
2514 return error::kUnknownCommand
;
2515 const gles2::cmds::SamplerParameterivImmediate
& c
=
2516 *static_cast<const gles2::cmds::SamplerParameterivImmediate
*>(cmd_data
);
2518 GLuint sampler
= c
.sampler
;
2519 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2521 if (!ComputeDataSize(1, sizeof(GLint
), 1, &data_size
)) {
2522 return error::kOutOfBounds
;
2524 if (data_size
> immediate_data_size
) {
2525 return error::kOutOfBounds
;
2527 const GLint
* params
=
2528 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
2529 if (params
== NULL
) {
2530 return error::kOutOfBounds
;
2532 DoSamplerParameteriv(sampler
, pname
, params
);
2533 return error::kNoError
;
2536 error::Error
GLES2DecoderImpl::HandleScissor(uint32_t immediate_data_size
,
2537 const void* cmd_data
) {
2538 const gles2::cmds::Scissor
& c
=
2539 *static_cast<const gles2::cmds::Scissor
*>(cmd_data
);
2541 GLint x
= static_cast<GLint
>(c
.x
);
2542 GLint y
= static_cast<GLint
>(c
.y
);
2543 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2544 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2546 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glScissor", "width < 0");
2547 return error::kNoError
;
2550 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glScissor", "height < 0");
2551 return error::kNoError
;
2553 if (state_
.scissor_x
!= x
|| state_
.scissor_y
!= y
||
2554 state_
.scissor_width
!= width
|| state_
.scissor_height
!= height
) {
2555 state_
.scissor_x
= x
;
2556 state_
.scissor_y
= y
;
2557 state_
.scissor_width
= width
;
2558 state_
.scissor_height
= height
;
2559 glScissor(x
, y
, width
, height
);
2561 return error::kNoError
;
2564 error::Error
GLES2DecoderImpl::HandleShaderSourceBucket(
2565 uint32_t immediate_data_size
,
2566 const void* cmd_data
) {
2567 const gles2::cmds::ShaderSourceBucket
& c
=
2568 *static_cast<const gles2::cmds::ShaderSourceBucket
*>(cmd_data
);
2570 GLuint shader
= static_cast<GLuint
>(c
.shader
);
2572 Bucket
* bucket
= GetBucket(c
.str_bucket_id
);
2574 return error::kInvalidArguments
;
2577 std::vector
<char*> strs
;
2578 std::vector
<GLint
> len
;
2579 if (!bucket
->GetAsStrings(&count
, &strs
, &len
)) {
2580 return error::kInvalidArguments
;
2583 strs
.size() > 0 ? const_cast<const char**>(&strs
[0]) : NULL
;
2584 const GLint
* length
=
2585 len
.size() > 0 ? const_cast<const GLint
*>(&len
[0]) : NULL
;
2587 DoShaderSource(shader
, count
, str
, length
);
2588 return error::kNoError
;
2591 error::Error
GLES2DecoderImpl::HandleStencilFunc(uint32_t immediate_data_size
,
2592 const void* cmd_data
) {
2593 const gles2::cmds::StencilFunc
& c
=
2594 *static_cast<const gles2::cmds::StencilFunc
*>(cmd_data
);
2596 GLenum func
= static_cast<GLenum
>(c
.func
);
2597 GLint ref
= static_cast<GLint
>(c
.ref
);
2598 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2599 if (!validators_
->cmp_function
.IsValid(func
)) {
2600 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFunc", func
, "func");
2601 return error::kNoError
;
2603 if (state_
.stencil_front_func
!= func
|| state_
.stencil_front_ref
!= ref
||
2604 state_
.stencil_front_mask
!= mask
|| state_
.stencil_back_func
!= func
||
2605 state_
.stencil_back_ref
!= ref
|| state_
.stencil_back_mask
!= mask
) {
2606 state_
.stencil_front_func
= func
;
2607 state_
.stencil_front_ref
= ref
;
2608 state_
.stencil_front_mask
= mask
;
2609 state_
.stencil_back_func
= func
;
2610 state_
.stencil_back_ref
= ref
;
2611 state_
.stencil_back_mask
= mask
;
2612 glStencilFunc(func
, ref
, mask
);
2614 return error::kNoError
;
2617 error::Error
GLES2DecoderImpl::HandleStencilFuncSeparate(
2618 uint32_t immediate_data_size
,
2619 const void* cmd_data
) {
2620 const gles2::cmds::StencilFuncSeparate
& c
=
2621 *static_cast<const gles2::cmds::StencilFuncSeparate
*>(cmd_data
);
2623 GLenum face
= static_cast<GLenum
>(c
.face
);
2624 GLenum func
= static_cast<GLenum
>(c
.func
);
2625 GLint ref
= static_cast<GLint
>(c
.ref
);
2626 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2627 if (!validators_
->face_type
.IsValid(face
)) {
2628 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFuncSeparate", face
, "face");
2629 return error::kNoError
;
2631 if (!validators_
->cmp_function
.IsValid(func
)) {
2632 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFuncSeparate", func
, "func");
2633 return error::kNoError
;
2635 bool changed
= false;
2636 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2637 changed
|= state_
.stencil_front_func
!= func
||
2638 state_
.stencil_front_ref
!= ref
||
2639 state_
.stencil_front_mask
!= mask
;
2641 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2642 changed
|= state_
.stencil_back_func
!= func
||
2643 state_
.stencil_back_ref
!= ref
||
2644 state_
.stencil_back_mask
!= mask
;
2647 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2648 state_
.stencil_front_func
= func
;
2649 state_
.stencil_front_ref
= ref
;
2650 state_
.stencil_front_mask
= mask
;
2652 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2653 state_
.stencil_back_func
= func
;
2654 state_
.stencil_back_ref
= ref
;
2655 state_
.stencil_back_mask
= mask
;
2657 glStencilFuncSeparate(face
, func
, ref
, mask
);
2659 return error::kNoError
;
2662 error::Error
GLES2DecoderImpl::HandleStencilMask(uint32_t immediate_data_size
,
2663 const void* cmd_data
) {
2664 const gles2::cmds::StencilMask
& c
=
2665 *static_cast<const gles2::cmds::StencilMask
*>(cmd_data
);
2667 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2668 if (state_
.stencil_front_writemask
!= mask
||
2669 state_
.stencil_back_writemask
!= mask
) {
2670 state_
.stencil_front_writemask
= mask
;
2671 state_
.stencil_back_writemask
= mask
;
2672 framebuffer_state_
.clear_state_dirty
= true;
2674 return error::kNoError
;
2677 error::Error
GLES2DecoderImpl::HandleStencilMaskSeparate(
2678 uint32_t immediate_data_size
,
2679 const void* cmd_data
) {
2680 const gles2::cmds::StencilMaskSeparate
& c
=
2681 *static_cast<const gles2::cmds::StencilMaskSeparate
*>(cmd_data
);
2683 GLenum face
= static_cast<GLenum
>(c
.face
);
2684 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2685 if (!validators_
->face_type
.IsValid(face
)) {
2686 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilMaskSeparate", face
, "face");
2687 return error::kNoError
;
2689 bool changed
= false;
2690 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2691 changed
|= state_
.stencil_front_writemask
!= mask
;
2693 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2694 changed
|= state_
.stencil_back_writemask
!= mask
;
2697 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2698 state_
.stencil_front_writemask
= mask
;
2700 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2701 state_
.stencil_back_writemask
= mask
;
2703 framebuffer_state_
.clear_state_dirty
= true;
2705 return error::kNoError
;
2708 error::Error
GLES2DecoderImpl::HandleStencilOp(uint32_t immediate_data_size
,
2709 const void* cmd_data
) {
2710 const gles2::cmds::StencilOp
& c
=
2711 *static_cast<const gles2::cmds::StencilOp
*>(cmd_data
);
2713 GLenum fail
= static_cast<GLenum
>(c
.fail
);
2714 GLenum zfail
= static_cast<GLenum
>(c
.zfail
);
2715 GLenum zpass
= static_cast<GLenum
>(c
.zpass
);
2716 if (!validators_
->stencil_op
.IsValid(fail
)) {
2717 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", fail
, "fail");
2718 return error::kNoError
;
2720 if (!validators_
->stencil_op
.IsValid(zfail
)) {
2721 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", zfail
, "zfail");
2722 return error::kNoError
;
2724 if (!validators_
->stencil_op
.IsValid(zpass
)) {
2725 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", zpass
, "zpass");
2726 return error::kNoError
;
2728 if (state_
.stencil_front_fail_op
!= fail
||
2729 state_
.stencil_front_z_fail_op
!= zfail
||
2730 state_
.stencil_front_z_pass_op
!= zpass
||
2731 state_
.stencil_back_fail_op
!= fail
||
2732 state_
.stencil_back_z_fail_op
!= zfail
||
2733 state_
.stencil_back_z_pass_op
!= zpass
) {
2734 state_
.stencil_front_fail_op
= fail
;
2735 state_
.stencil_front_z_fail_op
= zfail
;
2736 state_
.stencil_front_z_pass_op
= zpass
;
2737 state_
.stencil_back_fail_op
= fail
;
2738 state_
.stencil_back_z_fail_op
= zfail
;
2739 state_
.stencil_back_z_pass_op
= zpass
;
2740 glStencilOp(fail
, zfail
, zpass
);
2742 return error::kNoError
;
2745 error::Error
GLES2DecoderImpl::HandleStencilOpSeparate(
2746 uint32_t immediate_data_size
,
2747 const void* cmd_data
) {
2748 const gles2::cmds::StencilOpSeparate
& c
=
2749 *static_cast<const gles2::cmds::StencilOpSeparate
*>(cmd_data
);
2751 GLenum face
= static_cast<GLenum
>(c
.face
);
2752 GLenum fail
= static_cast<GLenum
>(c
.fail
);
2753 GLenum zfail
= static_cast<GLenum
>(c
.zfail
);
2754 GLenum zpass
= static_cast<GLenum
>(c
.zpass
);
2755 if (!validators_
->face_type
.IsValid(face
)) {
2756 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", face
, "face");
2757 return error::kNoError
;
2759 if (!validators_
->stencil_op
.IsValid(fail
)) {
2760 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", fail
, "fail");
2761 return error::kNoError
;
2763 if (!validators_
->stencil_op
.IsValid(zfail
)) {
2764 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", zfail
, "zfail");
2765 return error::kNoError
;
2767 if (!validators_
->stencil_op
.IsValid(zpass
)) {
2768 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", zpass
, "zpass");
2769 return error::kNoError
;
2771 bool changed
= false;
2772 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2773 changed
|= state_
.stencil_front_fail_op
!= fail
||
2774 state_
.stencil_front_z_fail_op
!= zfail
||
2775 state_
.stencil_front_z_pass_op
!= zpass
;
2777 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2778 changed
|= state_
.stencil_back_fail_op
!= fail
||
2779 state_
.stencil_back_z_fail_op
!= zfail
||
2780 state_
.stencil_back_z_pass_op
!= zpass
;
2783 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2784 state_
.stencil_front_fail_op
= fail
;
2785 state_
.stencil_front_z_fail_op
= zfail
;
2786 state_
.stencil_front_z_pass_op
= zpass
;
2788 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2789 state_
.stencil_back_fail_op
= fail
;
2790 state_
.stencil_back_z_fail_op
= zfail
;
2791 state_
.stencil_back_z_pass_op
= zpass
;
2793 glStencilOpSeparate(face
, fail
, zfail
, zpass
);
2795 return error::kNoError
;
2798 error::Error
GLES2DecoderImpl::HandleTexParameterf(uint32_t immediate_data_size
,
2799 const void* cmd_data
) {
2800 const gles2::cmds::TexParameterf
& c
=
2801 *static_cast<const gles2::cmds::TexParameterf
*>(cmd_data
);
2803 GLenum target
= static_cast<GLenum
>(c
.target
);
2804 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2805 GLfloat param
= static_cast<GLfloat
>(c
.param
);
2806 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2807 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterf", target
, "target");
2808 return error::kNoError
;
2810 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2811 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterf", pname
, "pname");
2812 return error::kNoError
;
2814 DoTexParameterf(target
, pname
, param
);
2815 return error::kNoError
;
2818 error::Error
GLES2DecoderImpl::HandleTexParameterfvImmediate(
2819 uint32_t immediate_data_size
,
2820 const void* cmd_data
) {
2821 const gles2::cmds::TexParameterfvImmediate
& c
=
2822 *static_cast<const gles2::cmds::TexParameterfvImmediate
*>(cmd_data
);
2824 GLenum target
= static_cast<GLenum
>(c
.target
);
2825 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2827 if (!ComputeDataSize(1, sizeof(GLfloat
), 1, &data_size
)) {
2828 return error::kOutOfBounds
;
2830 if (data_size
> immediate_data_size
) {
2831 return error::kOutOfBounds
;
2833 const GLfloat
* params
=
2834 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
2835 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2836 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", target
, "target");
2837 return error::kNoError
;
2839 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2840 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", pname
, "pname");
2841 return error::kNoError
;
2843 if (params
== NULL
) {
2844 return error::kOutOfBounds
;
2846 DoTexParameterfv(target
, pname
, params
);
2847 return error::kNoError
;
2850 error::Error
GLES2DecoderImpl::HandleTexParameteri(uint32_t immediate_data_size
,
2851 const void* cmd_data
) {
2852 const gles2::cmds::TexParameteri
& c
=
2853 *static_cast<const gles2::cmds::TexParameteri
*>(cmd_data
);
2855 GLenum target
= static_cast<GLenum
>(c
.target
);
2856 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2857 GLint param
= static_cast<GLint
>(c
.param
);
2858 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2859 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", target
, "target");
2860 return error::kNoError
;
2862 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2863 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", pname
, "pname");
2864 return error::kNoError
;
2866 DoTexParameteri(target
, pname
, param
);
2867 return error::kNoError
;
2870 error::Error
GLES2DecoderImpl::HandleTexParameterivImmediate(
2871 uint32_t immediate_data_size
,
2872 const void* cmd_data
) {
2873 const gles2::cmds::TexParameterivImmediate
& c
=
2874 *static_cast<const gles2::cmds::TexParameterivImmediate
*>(cmd_data
);
2876 GLenum target
= static_cast<GLenum
>(c
.target
);
2877 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2879 if (!ComputeDataSize(1, sizeof(GLint
), 1, &data_size
)) {
2880 return error::kOutOfBounds
;
2882 if (data_size
> immediate_data_size
) {
2883 return error::kOutOfBounds
;
2885 const GLint
* params
=
2886 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
2887 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2888 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", target
, "target");
2889 return error::kNoError
;
2891 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2892 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", pname
, "pname");
2893 return error::kNoError
;
2895 if (params
== NULL
) {
2896 return error::kOutOfBounds
;
2898 DoTexParameteriv(target
, pname
, params
);
2899 return error::kNoError
;
2902 error::Error
GLES2DecoderImpl::HandleTexStorage3D(uint32_t immediate_data_size
,
2903 const void* cmd_data
) {
2904 if (!unsafe_es3_apis_enabled())
2905 return error::kUnknownCommand
;
2906 const gles2::cmds::TexStorage3D
& c
=
2907 *static_cast<const gles2::cmds::TexStorage3D
*>(cmd_data
);
2909 GLenum target
= static_cast<GLenum
>(c
.target
);
2910 GLsizei levels
= static_cast<GLsizei
>(c
.levels
);
2911 GLenum internalFormat
= static_cast<GLenum
>(c
.internalFormat
);
2912 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2913 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2914 GLsizei depth
= static_cast<GLsizei
>(c
.depth
);
2915 glTexStorage3D(target
, levels
, internalFormat
, width
, height
, depth
);
2916 return error::kNoError
;
2919 error::Error
GLES2DecoderImpl::HandleTransformFeedbackVaryingsBucket(
2920 uint32_t immediate_data_size
,
2921 const void* cmd_data
) {
2922 if (!unsafe_es3_apis_enabled())
2923 return error::kUnknownCommand
;
2924 const gles2::cmds::TransformFeedbackVaryingsBucket
& c
=
2925 *static_cast<const gles2::cmds::TransformFeedbackVaryingsBucket
*>(
2928 GLuint program
= static_cast<GLuint
>(c
.program
);
2930 Bucket
* bucket
= GetBucket(c
.varyings_bucket_id
);
2932 return error::kInvalidArguments
;
2935 std::vector
<char*> strs
;
2936 std::vector
<GLint
> len
;
2937 if (!bucket
->GetAsStrings(&count
, &strs
, &len
)) {
2938 return error::kInvalidArguments
;
2940 const char** varyings
=
2941 strs
.size() > 0 ? const_cast<const char**>(&strs
[0]) : NULL
;
2942 const GLint
* length
=
2943 len
.size() > 0 ? const_cast<const GLint
*>(&len
[0]) : NULL
;
2945 GLenum buffermode
= static_cast<GLenum
>(c
.buffermode
);
2946 DoTransformFeedbackVaryings(program
, count
, varyings
, buffermode
);
2947 return error::kNoError
;
2950 error::Error
GLES2DecoderImpl::HandleUniform1f(uint32_t immediate_data_size
,
2951 const void* cmd_data
) {
2952 const gles2::cmds::Uniform1f
& c
=
2953 *static_cast<const gles2::cmds::Uniform1f
*>(cmd_data
);
2955 GLint location
= static_cast<GLint
>(c
.location
);
2956 GLfloat x
= static_cast<GLfloat
>(c
.x
);
2960 DoUniform1fv(location
, 1, &temp
[0]);
2961 return error::kNoError
;
2964 error::Error
GLES2DecoderImpl::HandleUniform1fvImmediate(
2965 uint32_t immediate_data_size
,
2966 const void* cmd_data
) {
2967 const gles2::cmds::Uniform1fvImmediate
& c
=
2968 *static_cast<const gles2::cmds::Uniform1fvImmediate
*>(cmd_data
);
2970 GLint location
= static_cast<GLint
>(c
.location
);
2971 GLsizei count
= static_cast<GLsizei
>(c
.count
);
2973 if (!ComputeDataSize(count
, sizeof(GLfloat
), 1, &data_size
)) {
2974 return error::kOutOfBounds
;
2976 if (data_size
> immediate_data_size
) {
2977 return error::kOutOfBounds
;
2980 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
2982 return error::kOutOfBounds
;
2984 DoUniform1fv(location
, count
, v
);
2985 return error::kNoError
;
2988 error::Error
GLES2DecoderImpl::HandleUniform1i(uint32_t immediate_data_size
,
2989 const void* cmd_data
) {
2990 const gles2::cmds::Uniform1i
& c
=
2991 *static_cast<const gles2::cmds::Uniform1i
*>(cmd_data
);
2993 GLint location
= static_cast<GLint
>(c
.location
);
2994 GLint x
= static_cast<GLint
>(c
.x
);
2995 DoUniform1i(location
, x
);
2996 return error::kNoError
;
2999 error::Error
GLES2DecoderImpl::HandleUniform1ivImmediate(
3000 uint32_t immediate_data_size
,
3001 const void* cmd_data
) {
3002 const gles2::cmds::Uniform1ivImmediate
& c
=
3003 *static_cast<const gles2::cmds::Uniform1ivImmediate
*>(cmd_data
);
3005 GLint location
= static_cast<GLint
>(c
.location
);
3006 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3008 if (!ComputeDataSize(count
, sizeof(GLint
), 1, &data_size
)) {
3009 return error::kOutOfBounds
;
3011 if (data_size
> immediate_data_size
) {
3012 return error::kOutOfBounds
;
3015 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3017 return error::kOutOfBounds
;
3019 DoUniform1iv(location
, count
, v
);
3020 return error::kNoError
;
3023 error::Error
GLES2DecoderImpl::HandleUniform1ui(uint32_t immediate_data_size
,
3024 const void* cmd_data
) {
3025 if (!unsafe_es3_apis_enabled())
3026 return error::kUnknownCommand
;
3027 const gles2::cmds::Uniform1ui
& c
=
3028 *static_cast<const gles2::cmds::Uniform1ui
*>(cmd_data
);
3030 GLint location
= static_cast<GLint
>(c
.location
);
3031 GLuint x
= static_cast<GLuint
>(c
.x
);
3035 glUniform1uiv(location
, 1, &temp
[0]);
3036 return error::kNoError
;
3039 error::Error
GLES2DecoderImpl::HandleUniform1uivImmediate(
3040 uint32_t immediate_data_size
,
3041 const void* cmd_data
) {
3042 if (!unsafe_es3_apis_enabled())
3043 return error::kUnknownCommand
;
3044 const gles2::cmds::Uniform1uivImmediate
& c
=
3045 *static_cast<const gles2::cmds::Uniform1uivImmediate
*>(cmd_data
);
3047 GLint location
= static_cast<GLint
>(c
.location
);
3048 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3050 if (!ComputeDataSize(count
, sizeof(GLuint
), 1, &data_size
)) {
3051 return error::kOutOfBounds
;
3053 if (data_size
> immediate_data_size
) {
3054 return error::kOutOfBounds
;
3057 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3059 return error::kOutOfBounds
;
3061 glUniform1uiv(location
, count
, v
);
3062 return error::kNoError
;
3065 error::Error
GLES2DecoderImpl::HandleUniform2f(uint32_t immediate_data_size
,
3066 const void* cmd_data
) {
3067 const gles2::cmds::Uniform2f
& c
=
3068 *static_cast<const gles2::cmds::Uniform2f
*>(cmd_data
);
3070 GLint location
= static_cast<GLint
>(c
.location
);
3071 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3072 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3076 DoUniform2fv(location
, 1, &temp
[0]);
3077 return error::kNoError
;
3080 error::Error
GLES2DecoderImpl::HandleUniform2fvImmediate(
3081 uint32_t immediate_data_size
,
3082 const void* cmd_data
) {
3083 const gles2::cmds::Uniform2fvImmediate
& c
=
3084 *static_cast<const gles2::cmds::Uniform2fvImmediate
*>(cmd_data
);
3086 GLint location
= static_cast<GLint
>(c
.location
);
3087 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3089 if (!ComputeDataSize(count
, sizeof(GLfloat
), 2, &data_size
)) {
3090 return error::kOutOfBounds
;
3092 if (data_size
> immediate_data_size
) {
3093 return error::kOutOfBounds
;
3096 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3098 return error::kOutOfBounds
;
3100 DoUniform2fv(location
, count
, v
);
3101 return error::kNoError
;
3104 error::Error
GLES2DecoderImpl::HandleUniform2i(uint32_t immediate_data_size
,
3105 const void* cmd_data
) {
3106 const gles2::cmds::Uniform2i
& c
=
3107 *static_cast<const gles2::cmds::Uniform2i
*>(cmd_data
);
3109 GLint location
= static_cast<GLint
>(c
.location
);
3110 GLint x
= static_cast<GLint
>(c
.x
);
3111 GLint y
= static_cast<GLint
>(c
.y
);
3115 DoUniform2iv(location
, 1, &temp
[0]);
3116 return error::kNoError
;
3119 error::Error
GLES2DecoderImpl::HandleUniform2ivImmediate(
3120 uint32_t immediate_data_size
,
3121 const void* cmd_data
) {
3122 const gles2::cmds::Uniform2ivImmediate
& c
=
3123 *static_cast<const gles2::cmds::Uniform2ivImmediate
*>(cmd_data
);
3125 GLint location
= static_cast<GLint
>(c
.location
);
3126 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3128 if (!ComputeDataSize(count
, sizeof(GLint
), 2, &data_size
)) {
3129 return error::kOutOfBounds
;
3131 if (data_size
> immediate_data_size
) {
3132 return error::kOutOfBounds
;
3135 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3137 return error::kOutOfBounds
;
3139 DoUniform2iv(location
, count
, v
);
3140 return error::kNoError
;
3143 error::Error
GLES2DecoderImpl::HandleUniform2ui(uint32_t immediate_data_size
,
3144 const void* cmd_data
) {
3145 if (!unsafe_es3_apis_enabled())
3146 return error::kUnknownCommand
;
3147 const gles2::cmds::Uniform2ui
& c
=
3148 *static_cast<const gles2::cmds::Uniform2ui
*>(cmd_data
);
3150 GLint location
= static_cast<GLint
>(c
.location
);
3151 GLuint x
= static_cast<GLuint
>(c
.x
);
3152 GLuint y
= static_cast<GLuint
>(c
.y
);
3156 glUniform2uiv(location
, 1, &temp
[0]);
3157 return error::kNoError
;
3160 error::Error
GLES2DecoderImpl::HandleUniform2uivImmediate(
3161 uint32_t immediate_data_size
,
3162 const void* cmd_data
) {
3163 if (!unsafe_es3_apis_enabled())
3164 return error::kUnknownCommand
;
3165 const gles2::cmds::Uniform2uivImmediate
& c
=
3166 *static_cast<const gles2::cmds::Uniform2uivImmediate
*>(cmd_data
);
3168 GLint location
= static_cast<GLint
>(c
.location
);
3169 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3171 if (!ComputeDataSize(count
, sizeof(GLuint
), 2, &data_size
)) {
3172 return error::kOutOfBounds
;
3174 if (data_size
> immediate_data_size
) {
3175 return error::kOutOfBounds
;
3178 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3180 return error::kOutOfBounds
;
3182 glUniform2uiv(location
, count
, v
);
3183 return error::kNoError
;
3186 error::Error
GLES2DecoderImpl::HandleUniform3f(uint32_t immediate_data_size
,
3187 const void* cmd_data
) {
3188 const gles2::cmds::Uniform3f
& c
=
3189 *static_cast<const gles2::cmds::Uniform3f
*>(cmd_data
);
3191 GLint location
= static_cast<GLint
>(c
.location
);
3192 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3193 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3194 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3198 DoUniform3fv(location
, 1, &temp
[0]);
3199 return error::kNoError
;
3202 error::Error
GLES2DecoderImpl::HandleUniform3fvImmediate(
3203 uint32_t immediate_data_size
,
3204 const void* cmd_data
) {
3205 const gles2::cmds::Uniform3fvImmediate
& c
=
3206 *static_cast<const gles2::cmds::Uniform3fvImmediate
*>(cmd_data
);
3208 GLint location
= static_cast<GLint
>(c
.location
);
3209 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3211 if (!ComputeDataSize(count
, sizeof(GLfloat
), 3, &data_size
)) {
3212 return error::kOutOfBounds
;
3214 if (data_size
> immediate_data_size
) {
3215 return error::kOutOfBounds
;
3218 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3220 return error::kOutOfBounds
;
3222 DoUniform3fv(location
, count
, v
);
3223 return error::kNoError
;
3226 error::Error
GLES2DecoderImpl::HandleUniform3i(uint32_t immediate_data_size
,
3227 const void* cmd_data
) {
3228 const gles2::cmds::Uniform3i
& c
=
3229 *static_cast<const gles2::cmds::Uniform3i
*>(cmd_data
);
3231 GLint location
= static_cast<GLint
>(c
.location
);
3232 GLint x
= static_cast<GLint
>(c
.x
);
3233 GLint y
= static_cast<GLint
>(c
.y
);
3234 GLint z
= static_cast<GLint
>(c
.z
);
3238 DoUniform3iv(location
, 1, &temp
[0]);
3239 return error::kNoError
;
3242 error::Error
GLES2DecoderImpl::HandleUniform3ivImmediate(
3243 uint32_t immediate_data_size
,
3244 const void* cmd_data
) {
3245 const gles2::cmds::Uniform3ivImmediate
& c
=
3246 *static_cast<const gles2::cmds::Uniform3ivImmediate
*>(cmd_data
);
3248 GLint location
= static_cast<GLint
>(c
.location
);
3249 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3251 if (!ComputeDataSize(count
, sizeof(GLint
), 3, &data_size
)) {
3252 return error::kOutOfBounds
;
3254 if (data_size
> immediate_data_size
) {
3255 return error::kOutOfBounds
;
3258 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3260 return error::kOutOfBounds
;
3262 DoUniform3iv(location
, count
, v
);
3263 return error::kNoError
;
3266 error::Error
GLES2DecoderImpl::HandleUniform3ui(uint32_t immediate_data_size
,
3267 const void* cmd_data
) {
3268 if (!unsafe_es3_apis_enabled())
3269 return error::kUnknownCommand
;
3270 const gles2::cmds::Uniform3ui
& c
=
3271 *static_cast<const gles2::cmds::Uniform3ui
*>(cmd_data
);
3273 GLint location
= static_cast<GLint
>(c
.location
);
3274 GLuint x
= static_cast<GLuint
>(c
.x
);
3275 GLuint y
= static_cast<GLuint
>(c
.y
);
3276 GLuint z
= static_cast<GLuint
>(c
.z
);
3280 glUniform3uiv(location
, 1, &temp
[0]);
3281 return error::kNoError
;
3284 error::Error
GLES2DecoderImpl::HandleUniform3uivImmediate(
3285 uint32_t immediate_data_size
,
3286 const void* cmd_data
) {
3287 if (!unsafe_es3_apis_enabled())
3288 return error::kUnknownCommand
;
3289 const gles2::cmds::Uniform3uivImmediate
& c
=
3290 *static_cast<const gles2::cmds::Uniform3uivImmediate
*>(cmd_data
);
3292 GLint location
= static_cast<GLint
>(c
.location
);
3293 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3295 if (!ComputeDataSize(count
, sizeof(GLuint
), 3, &data_size
)) {
3296 return error::kOutOfBounds
;
3298 if (data_size
> immediate_data_size
) {
3299 return error::kOutOfBounds
;
3302 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3304 return error::kOutOfBounds
;
3306 glUniform3uiv(location
, count
, v
);
3307 return error::kNoError
;
3310 error::Error
GLES2DecoderImpl::HandleUniform4f(uint32_t immediate_data_size
,
3311 const void* cmd_data
) {
3312 const gles2::cmds::Uniform4f
& c
=
3313 *static_cast<const gles2::cmds::Uniform4f
*>(cmd_data
);
3315 GLint location
= static_cast<GLint
>(c
.location
);
3316 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3317 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3318 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3319 GLfloat w
= static_cast<GLfloat
>(c
.w
);
3323 DoUniform4fv(location
, 1, &temp
[0]);
3324 return error::kNoError
;
3327 error::Error
GLES2DecoderImpl::HandleUniform4fvImmediate(
3328 uint32_t immediate_data_size
,
3329 const void* cmd_data
) {
3330 const gles2::cmds::Uniform4fvImmediate
& c
=
3331 *static_cast<const gles2::cmds::Uniform4fvImmediate
*>(cmd_data
);
3333 GLint location
= static_cast<GLint
>(c
.location
);
3334 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3336 if (!ComputeDataSize(count
, sizeof(GLfloat
), 4, &data_size
)) {
3337 return error::kOutOfBounds
;
3339 if (data_size
> immediate_data_size
) {
3340 return error::kOutOfBounds
;
3343 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3345 return error::kOutOfBounds
;
3347 DoUniform4fv(location
, count
, v
);
3348 return error::kNoError
;
3351 error::Error
GLES2DecoderImpl::HandleUniform4i(uint32_t immediate_data_size
,
3352 const void* cmd_data
) {
3353 const gles2::cmds::Uniform4i
& c
=
3354 *static_cast<const gles2::cmds::Uniform4i
*>(cmd_data
);
3356 GLint location
= static_cast<GLint
>(c
.location
);
3357 GLint x
= static_cast<GLint
>(c
.x
);
3358 GLint y
= static_cast<GLint
>(c
.y
);
3359 GLint z
= static_cast<GLint
>(c
.z
);
3360 GLint w
= static_cast<GLint
>(c
.w
);
3364 DoUniform4iv(location
, 1, &temp
[0]);
3365 return error::kNoError
;
3368 error::Error
GLES2DecoderImpl::HandleUniform4ivImmediate(
3369 uint32_t immediate_data_size
,
3370 const void* cmd_data
) {
3371 const gles2::cmds::Uniform4ivImmediate
& c
=
3372 *static_cast<const gles2::cmds::Uniform4ivImmediate
*>(cmd_data
);
3374 GLint location
= static_cast<GLint
>(c
.location
);
3375 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3377 if (!ComputeDataSize(count
, sizeof(GLint
), 4, &data_size
)) {
3378 return error::kOutOfBounds
;
3380 if (data_size
> immediate_data_size
) {
3381 return error::kOutOfBounds
;
3384 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3386 return error::kOutOfBounds
;
3388 DoUniform4iv(location
, count
, v
);
3389 return error::kNoError
;
3392 error::Error
GLES2DecoderImpl::HandleUniform4ui(uint32_t immediate_data_size
,
3393 const void* cmd_data
) {
3394 if (!unsafe_es3_apis_enabled())
3395 return error::kUnknownCommand
;
3396 const gles2::cmds::Uniform4ui
& c
=
3397 *static_cast<const gles2::cmds::Uniform4ui
*>(cmd_data
);
3399 GLint location
= static_cast<GLint
>(c
.location
);
3400 GLuint x
= static_cast<GLuint
>(c
.x
);
3401 GLuint y
= static_cast<GLuint
>(c
.y
);
3402 GLuint z
= static_cast<GLuint
>(c
.z
);
3403 GLuint w
= static_cast<GLuint
>(c
.w
);
3407 glUniform4uiv(location
, 1, &temp
[0]);
3408 return error::kNoError
;
3411 error::Error
GLES2DecoderImpl::HandleUniform4uivImmediate(
3412 uint32_t immediate_data_size
,
3413 const void* cmd_data
) {
3414 if (!unsafe_es3_apis_enabled())
3415 return error::kUnknownCommand
;
3416 const gles2::cmds::Uniform4uivImmediate
& c
=
3417 *static_cast<const gles2::cmds::Uniform4uivImmediate
*>(cmd_data
);
3419 GLint location
= static_cast<GLint
>(c
.location
);
3420 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3422 if (!ComputeDataSize(count
, sizeof(GLuint
), 4, &data_size
)) {
3423 return error::kOutOfBounds
;
3425 if (data_size
> immediate_data_size
) {
3426 return error::kOutOfBounds
;
3429 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3431 return error::kOutOfBounds
;
3433 glUniform4uiv(location
, count
, v
);
3434 return error::kNoError
;
3437 error::Error
GLES2DecoderImpl::HandleUniformMatrix2fvImmediate(
3438 uint32_t immediate_data_size
,
3439 const void* cmd_data
) {
3440 const gles2::cmds::UniformMatrix2fvImmediate
& c
=
3441 *static_cast<const gles2::cmds::UniformMatrix2fvImmediate
*>(cmd_data
);
3443 GLint location
= static_cast<GLint
>(c
.location
);
3444 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3445 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3447 if (!ComputeDataSize(count
, sizeof(GLfloat
), 4, &data_size
)) {
3448 return error::kOutOfBounds
;
3450 if (data_size
> immediate_data_size
) {
3451 return error::kOutOfBounds
;
3453 const GLfloat
* value
=
3454 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3455 if (value
== NULL
) {
3456 return error::kOutOfBounds
;
3458 DoUniformMatrix2fv(location
, count
, transpose
, value
);
3459 return error::kNoError
;
3462 error::Error
GLES2DecoderImpl::HandleUniformMatrix2x3fvImmediate(
3463 uint32_t immediate_data_size
,
3464 const void* cmd_data
) {
3465 if (!unsafe_es3_apis_enabled())
3466 return error::kUnknownCommand
;
3467 const gles2::cmds::UniformMatrix2x3fvImmediate
& c
=
3468 *static_cast<const gles2::cmds::UniformMatrix2x3fvImmediate
*>(cmd_data
);
3470 GLint location
= static_cast<GLint
>(c
.location
);
3471 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3472 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3474 if (!ComputeDataSize(count
, sizeof(GLfloat
), 6, &data_size
)) {
3475 return error::kOutOfBounds
;
3477 if (data_size
> immediate_data_size
) {
3478 return error::kOutOfBounds
;
3480 const GLfloat
* value
=
3481 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3482 if (value
== NULL
) {
3483 return error::kOutOfBounds
;
3485 glUniformMatrix2x3fv(location
, count
, transpose
, value
);
3486 return error::kNoError
;
3489 error::Error
GLES2DecoderImpl::HandleUniformMatrix2x4fvImmediate(
3490 uint32_t immediate_data_size
,
3491 const void* cmd_data
) {
3492 if (!unsafe_es3_apis_enabled())
3493 return error::kUnknownCommand
;
3494 const gles2::cmds::UniformMatrix2x4fvImmediate
& c
=
3495 *static_cast<const gles2::cmds::UniformMatrix2x4fvImmediate
*>(cmd_data
);
3497 GLint location
= static_cast<GLint
>(c
.location
);
3498 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3499 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3501 if (!ComputeDataSize(count
, sizeof(GLfloat
), 8, &data_size
)) {
3502 return error::kOutOfBounds
;
3504 if (data_size
> immediate_data_size
) {
3505 return error::kOutOfBounds
;
3507 const GLfloat
* value
=
3508 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3509 if (value
== NULL
) {
3510 return error::kOutOfBounds
;
3512 glUniformMatrix2x4fv(location
, count
, transpose
, value
);
3513 return error::kNoError
;
3516 error::Error
GLES2DecoderImpl::HandleUniformMatrix3fvImmediate(
3517 uint32_t immediate_data_size
,
3518 const void* cmd_data
) {
3519 const gles2::cmds::UniformMatrix3fvImmediate
& c
=
3520 *static_cast<const gles2::cmds::UniformMatrix3fvImmediate
*>(cmd_data
);
3522 GLint location
= static_cast<GLint
>(c
.location
);
3523 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3524 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3526 if (!ComputeDataSize(count
, sizeof(GLfloat
), 9, &data_size
)) {
3527 return error::kOutOfBounds
;
3529 if (data_size
> immediate_data_size
) {
3530 return error::kOutOfBounds
;
3532 const GLfloat
* value
=
3533 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3534 if (value
== NULL
) {
3535 return error::kOutOfBounds
;
3537 DoUniformMatrix3fv(location
, count
, transpose
, value
);
3538 return error::kNoError
;
3541 error::Error
GLES2DecoderImpl::HandleUniformMatrix3x2fvImmediate(
3542 uint32_t immediate_data_size
,
3543 const void* cmd_data
) {
3544 if (!unsafe_es3_apis_enabled())
3545 return error::kUnknownCommand
;
3546 const gles2::cmds::UniformMatrix3x2fvImmediate
& c
=
3547 *static_cast<const gles2::cmds::UniformMatrix3x2fvImmediate
*>(cmd_data
);
3549 GLint location
= static_cast<GLint
>(c
.location
);
3550 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3551 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3553 if (!ComputeDataSize(count
, sizeof(GLfloat
), 6, &data_size
)) {
3554 return error::kOutOfBounds
;
3556 if (data_size
> immediate_data_size
) {
3557 return error::kOutOfBounds
;
3559 const GLfloat
* value
=
3560 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3561 if (value
== NULL
) {
3562 return error::kOutOfBounds
;
3564 glUniformMatrix3x2fv(location
, count
, transpose
, value
);
3565 return error::kNoError
;
3568 error::Error
GLES2DecoderImpl::HandleUniformMatrix3x4fvImmediate(
3569 uint32_t immediate_data_size
,
3570 const void* cmd_data
) {
3571 if (!unsafe_es3_apis_enabled())
3572 return error::kUnknownCommand
;
3573 const gles2::cmds::UniformMatrix3x4fvImmediate
& c
=
3574 *static_cast<const gles2::cmds::UniformMatrix3x4fvImmediate
*>(cmd_data
);
3576 GLint location
= static_cast<GLint
>(c
.location
);
3577 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3578 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3580 if (!ComputeDataSize(count
, sizeof(GLfloat
), 12, &data_size
)) {
3581 return error::kOutOfBounds
;
3583 if (data_size
> immediate_data_size
) {
3584 return error::kOutOfBounds
;
3586 const GLfloat
* value
=
3587 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3588 if (value
== NULL
) {
3589 return error::kOutOfBounds
;
3591 glUniformMatrix3x4fv(location
, count
, transpose
, value
);
3592 return error::kNoError
;
3595 error::Error
GLES2DecoderImpl::HandleUniformMatrix4fvImmediate(
3596 uint32_t immediate_data_size
,
3597 const void* cmd_data
) {
3598 const gles2::cmds::UniformMatrix4fvImmediate
& c
=
3599 *static_cast<const gles2::cmds::UniformMatrix4fvImmediate
*>(cmd_data
);
3601 GLint location
= static_cast<GLint
>(c
.location
);
3602 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3603 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3605 if (!ComputeDataSize(count
, sizeof(GLfloat
), 16, &data_size
)) {
3606 return error::kOutOfBounds
;
3608 if (data_size
> immediate_data_size
) {
3609 return error::kOutOfBounds
;
3611 const GLfloat
* value
=
3612 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3613 if (value
== NULL
) {
3614 return error::kOutOfBounds
;
3616 DoUniformMatrix4fv(location
, count
, transpose
, value
);
3617 return error::kNoError
;
3620 error::Error
GLES2DecoderImpl::HandleUniformMatrix4x2fvImmediate(
3621 uint32_t immediate_data_size
,
3622 const void* cmd_data
) {
3623 if (!unsafe_es3_apis_enabled())
3624 return error::kUnknownCommand
;
3625 const gles2::cmds::UniformMatrix4x2fvImmediate
& c
=
3626 *static_cast<const gles2::cmds::UniformMatrix4x2fvImmediate
*>(cmd_data
);
3628 GLint location
= static_cast<GLint
>(c
.location
);
3629 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3630 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3632 if (!ComputeDataSize(count
, sizeof(GLfloat
), 8, &data_size
)) {
3633 return error::kOutOfBounds
;
3635 if (data_size
> immediate_data_size
) {
3636 return error::kOutOfBounds
;
3638 const GLfloat
* value
=
3639 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3640 if (value
== NULL
) {
3641 return error::kOutOfBounds
;
3643 glUniformMatrix4x2fv(location
, count
, transpose
, value
);
3644 return error::kNoError
;
3647 error::Error
GLES2DecoderImpl::HandleUniformMatrix4x3fvImmediate(
3648 uint32_t immediate_data_size
,
3649 const void* cmd_data
) {
3650 if (!unsafe_es3_apis_enabled())
3651 return error::kUnknownCommand
;
3652 const gles2::cmds::UniformMatrix4x3fvImmediate
& c
=
3653 *static_cast<const gles2::cmds::UniformMatrix4x3fvImmediate
*>(cmd_data
);
3655 GLint location
= static_cast<GLint
>(c
.location
);
3656 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3657 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3659 if (!ComputeDataSize(count
, sizeof(GLfloat
), 12, &data_size
)) {
3660 return error::kOutOfBounds
;
3662 if (data_size
> immediate_data_size
) {
3663 return error::kOutOfBounds
;
3665 const GLfloat
* value
=
3666 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3667 if (value
== NULL
) {
3668 return error::kOutOfBounds
;
3670 glUniformMatrix4x3fv(location
, count
, transpose
, value
);
3671 return error::kNoError
;
3674 error::Error
GLES2DecoderImpl::HandleUseProgram(uint32_t immediate_data_size
,
3675 const void* cmd_data
) {
3676 const gles2::cmds::UseProgram
& c
=
3677 *static_cast<const gles2::cmds::UseProgram
*>(cmd_data
);
3679 GLuint program
= c
.program
;
3680 DoUseProgram(program
);
3681 return error::kNoError
;
3684 error::Error
GLES2DecoderImpl::HandleValidateProgram(
3685 uint32_t immediate_data_size
,
3686 const void* cmd_data
) {
3687 const gles2::cmds::ValidateProgram
& c
=
3688 *static_cast<const gles2::cmds::ValidateProgram
*>(cmd_data
);
3690 GLuint program
= c
.program
;
3691 DoValidateProgram(program
);
3692 return error::kNoError
;
3695 error::Error
GLES2DecoderImpl::HandleVertexAttrib1f(
3696 uint32_t immediate_data_size
,
3697 const void* cmd_data
) {
3698 const gles2::cmds::VertexAttrib1f
& c
=
3699 *static_cast<const gles2::cmds::VertexAttrib1f
*>(cmd_data
);
3701 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3702 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3703 DoVertexAttrib1f(indx
, x
);
3704 return error::kNoError
;
3707 error::Error
GLES2DecoderImpl::HandleVertexAttrib1fvImmediate(
3708 uint32_t immediate_data_size
,
3709 const void* cmd_data
) {
3710 const gles2::cmds::VertexAttrib1fvImmediate
& c
=
3711 *static_cast<const gles2::cmds::VertexAttrib1fvImmediate
*>(cmd_data
);
3713 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3715 if (!ComputeDataSize(1, sizeof(GLfloat
), 1, &data_size
)) {
3716 return error::kOutOfBounds
;
3718 if (data_size
> immediate_data_size
) {
3719 return error::kOutOfBounds
;
3721 const GLfloat
* values
=
3722 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3723 if (values
== NULL
) {
3724 return error::kOutOfBounds
;
3726 DoVertexAttrib1fv(indx
, values
);
3727 return error::kNoError
;
3730 error::Error
GLES2DecoderImpl::HandleVertexAttrib2f(
3731 uint32_t immediate_data_size
,
3732 const void* cmd_data
) {
3733 const gles2::cmds::VertexAttrib2f
& c
=
3734 *static_cast<const gles2::cmds::VertexAttrib2f
*>(cmd_data
);
3736 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3737 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3738 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3739 DoVertexAttrib2f(indx
, x
, y
);
3740 return error::kNoError
;
3743 error::Error
GLES2DecoderImpl::HandleVertexAttrib2fvImmediate(
3744 uint32_t immediate_data_size
,
3745 const void* cmd_data
) {
3746 const gles2::cmds::VertexAttrib2fvImmediate
& c
=
3747 *static_cast<const gles2::cmds::VertexAttrib2fvImmediate
*>(cmd_data
);
3749 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3751 if (!ComputeDataSize(1, sizeof(GLfloat
), 2, &data_size
)) {
3752 return error::kOutOfBounds
;
3754 if (data_size
> immediate_data_size
) {
3755 return error::kOutOfBounds
;
3757 const GLfloat
* values
=
3758 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3759 if (values
== NULL
) {
3760 return error::kOutOfBounds
;
3762 DoVertexAttrib2fv(indx
, values
);
3763 return error::kNoError
;
3766 error::Error
GLES2DecoderImpl::HandleVertexAttrib3f(
3767 uint32_t immediate_data_size
,
3768 const void* cmd_data
) {
3769 const gles2::cmds::VertexAttrib3f
& c
=
3770 *static_cast<const gles2::cmds::VertexAttrib3f
*>(cmd_data
);
3772 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3773 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3774 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3775 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3776 DoVertexAttrib3f(indx
, x
, y
, z
);
3777 return error::kNoError
;
3780 error::Error
GLES2DecoderImpl::HandleVertexAttrib3fvImmediate(
3781 uint32_t immediate_data_size
,
3782 const void* cmd_data
) {
3783 const gles2::cmds::VertexAttrib3fvImmediate
& c
=
3784 *static_cast<const gles2::cmds::VertexAttrib3fvImmediate
*>(cmd_data
);
3786 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3788 if (!ComputeDataSize(1, sizeof(GLfloat
), 3, &data_size
)) {
3789 return error::kOutOfBounds
;
3791 if (data_size
> immediate_data_size
) {
3792 return error::kOutOfBounds
;
3794 const GLfloat
* values
=
3795 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3796 if (values
== NULL
) {
3797 return error::kOutOfBounds
;
3799 DoVertexAttrib3fv(indx
, values
);
3800 return error::kNoError
;
3803 error::Error
GLES2DecoderImpl::HandleVertexAttrib4f(
3804 uint32_t immediate_data_size
,
3805 const void* cmd_data
) {
3806 const gles2::cmds::VertexAttrib4f
& c
=
3807 *static_cast<const gles2::cmds::VertexAttrib4f
*>(cmd_data
);
3809 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3810 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3811 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3812 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3813 GLfloat w
= static_cast<GLfloat
>(c
.w
);
3814 DoVertexAttrib4f(indx
, x
, y
, z
, w
);
3815 return error::kNoError
;
3818 error::Error
GLES2DecoderImpl::HandleVertexAttrib4fvImmediate(
3819 uint32_t immediate_data_size
,
3820 const void* cmd_data
) {
3821 const gles2::cmds::VertexAttrib4fvImmediate
& c
=
3822 *static_cast<const gles2::cmds::VertexAttrib4fvImmediate
*>(cmd_data
);
3824 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3826 if (!ComputeDataSize(1, sizeof(GLfloat
), 4, &data_size
)) {
3827 return error::kOutOfBounds
;
3829 if (data_size
> immediate_data_size
) {
3830 return error::kOutOfBounds
;
3832 const GLfloat
* values
=
3833 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3834 if (values
== NULL
) {
3835 return error::kOutOfBounds
;
3837 DoVertexAttrib4fv(indx
, values
);
3838 return error::kNoError
;
3841 error::Error
GLES2DecoderImpl::HandleVertexAttribI4i(
3842 uint32_t immediate_data_size
,
3843 const void* cmd_data
) {
3844 if (!unsafe_es3_apis_enabled())
3845 return error::kUnknownCommand
;
3846 const gles2::cmds::VertexAttribI4i
& c
=
3847 *static_cast<const gles2::cmds::VertexAttribI4i
*>(cmd_data
);
3849 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3850 GLint x
= static_cast<GLint
>(c
.x
);
3851 GLint y
= static_cast<GLint
>(c
.y
);
3852 GLint z
= static_cast<GLint
>(c
.z
);
3853 GLint w
= static_cast<GLint
>(c
.w
);
3854 glVertexAttribI4i(indx
, x
, y
, z
, w
);
3855 return error::kNoError
;
3858 error::Error
GLES2DecoderImpl::HandleVertexAttribI4ivImmediate(
3859 uint32_t immediate_data_size
,
3860 const void* cmd_data
) {
3861 if (!unsafe_es3_apis_enabled())
3862 return error::kUnknownCommand
;
3863 const gles2::cmds::VertexAttribI4ivImmediate
& c
=
3864 *static_cast<const gles2::cmds::VertexAttribI4ivImmediate
*>(cmd_data
);
3866 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3868 if (!ComputeDataSize(1, sizeof(GLint
), 4, &data_size
)) {
3869 return error::kOutOfBounds
;
3871 if (data_size
> immediate_data_size
) {
3872 return error::kOutOfBounds
;
3874 const GLint
* values
=
3875 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3876 if (values
== NULL
) {
3877 return error::kOutOfBounds
;
3879 glVertexAttribI4iv(indx
, values
);
3880 return error::kNoError
;
3883 error::Error
GLES2DecoderImpl::HandleVertexAttribI4ui(
3884 uint32_t immediate_data_size
,
3885 const void* cmd_data
) {
3886 if (!unsafe_es3_apis_enabled())
3887 return error::kUnknownCommand
;
3888 const gles2::cmds::VertexAttribI4ui
& c
=
3889 *static_cast<const gles2::cmds::VertexAttribI4ui
*>(cmd_data
);
3891 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3892 GLuint x
= static_cast<GLuint
>(c
.x
);
3893 GLuint y
= static_cast<GLuint
>(c
.y
);
3894 GLuint z
= static_cast<GLuint
>(c
.z
);
3895 GLuint w
= static_cast<GLuint
>(c
.w
);
3896 glVertexAttribI4ui(indx
, x
, y
, z
, w
);
3897 return error::kNoError
;
3900 error::Error
GLES2DecoderImpl::HandleVertexAttribI4uivImmediate(
3901 uint32_t immediate_data_size
,
3902 const void* cmd_data
) {
3903 if (!unsafe_es3_apis_enabled())
3904 return error::kUnknownCommand
;
3905 const gles2::cmds::VertexAttribI4uivImmediate
& c
=
3906 *static_cast<const gles2::cmds::VertexAttribI4uivImmediate
*>(cmd_data
);
3908 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3910 if (!ComputeDataSize(1, sizeof(GLuint
), 4, &data_size
)) {
3911 return error::kOutOfBounds
;
3913 if (data_size
> immediate_data_size
) {
3914 return error::kOutOfBounds
;
3916 const GLuint
* values
=
3917 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3918 if (values
== NULL
) {
3919 return error::kOutOfBounds
;
3921 glVertexAttribI4uiv(indx
, values
);
3922 return error::kNoError
;
3925 error::Error
GLES2DecoderImpl::HandleViewport(uint32_t immediate_data_size
,
3926 const void* cmd_data
) {
3927 const gles2::cmds::Viewport
& c
=
3928 *static_cast<const gles2::cmds::Viewport
*>(cmd_data
);
3930 GLint x
= static_cast<GLint
>(c
.x
);
3931 GLint y
= static_cast<GLint
>(c
.y
);
3932 GLsizei width
= static_cast<GLsizei
>(c
.width
);
3933 GLsizei height
= static_cast<GLsizei
>(c
.height
);
3935 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glViewport", "width < 0");
3936 return error::kNoError
;
3939 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glViewport", "height < 0");
3940 return error::kNoError
;
3942 DoViewport(x
, y
, width
, height
);
3943 return error::kNoError
;
3946 error::Error
GLES2DecoderImpl::HandleBlitFramebufferCHROMIUM(
3947 uint32_t immediate_data_size
,
3948 const void* cmd_data
) {
3949 const gles2::cmds::BlitFramebufferCHROMIUM
& c
=
3950 *static_cast<const gles2::cmds::BlitFramebufferCHROMIUM
*>(cmd_data
);
3952 if (!features().chromium_framebuffer_multisample
) {
3953 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBlitFramebufferCHROMIUM",
3954 "function not available");
3955 return error::kNoError
;
3959 error
= WillAccessBoundFramebufferForDraw();
3960 if (error
!= error::kNoError
)
3962 error
= WillAccessBoundFramebufferForRead();
3963 if (error
!= error::kNoError
)
3965 GLint srcX0
= static_cast<GLint
>(c
.srcX0
);
3966 GLint srcY0
= static_cast<GLint
>(c
.srcY0
);
3967 GLint srcX1
= static_cast<GLint
>(c
.srcX1
);
3968 GLint srcY1
= static_cast<GLint
>(c
.srcY1
);
3969 GLint dstX0
= static_cast<GLint
>(c
.dstX0
);
3970 GLint dstY0
= static_cast<GLint
>(c
.dstY0
);
3971 GLint dstX1
= static_cast<GLint
>(c
.dstX1
);
3972 GLint dstY1
= static_cast<GLint
>(c
.dstY1
);
3973 GLbitfield mask
= static_cast<GLbitfield
>(c
.mask
);
3974 GLenum filter
= static_cast<GLenum
>(c
.filter
);
3975 if (!validators_
->blit_filter
.IsValid(filter
)) {
3976 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlitFramebufferCHROMIUM", filter
,
3978 return error::kNoError
;
3980 DoBlitFramebufferCHROMIUM(srcX0
, srcY0
, srcX1
, srcY1
, dstX0
, dstY0
, dstX1
,
3981 dstY1
, mask
, filter
);
3982 return error::kNoError
;
3985 error::Error
GLES2DecoderImpl::HandleRenderbufferStorageMultisampleCHROMIUM(
3986 uint32_t immediate_data_size
,
3987 const void* cmd_data
) {
3988 const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM
& c
=
3989 *static_cast<const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM
*>(
3992 if (!features().chromium_framebuffer_multisample
) {
3993 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
,
3994 "glRenderbufferStorageMultisampleCHROMIUM",
3995 "function not available");
3996 return error::kNoError
;
3999 GLenum target
= static_cast<GLenum
>(c
.target
);
4000 GLsizei samples
= static_cast<GLsizei
>(c
.samples
);
4001 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
4002 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4003 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4004 if (!validators_
->render_buffer_target
.IsValid(target
)) {
4005 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleCHROMIUM",
4007 return error::kNoError
;
4010 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
,
4011 "glRenderbufferStorageMultisampleCHROMIUM",
4013 return error::kNoError
;
4015 if (!validators_
->render_buffer_format
.IsValid(internalformat
)) {
4016 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleCHROMIUM",
4017 internalformat
, "internalformat");
4018 return error::kNoError
;
4021 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
,
4022 "glRenderbufferStorageMultisampleCHROMIUM", "width < 0");
4023 return error::kNoError
;
4026 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
,
4027 "glRenderbufferStorageMultisampleCHROMIUM",
4029 return error::kNoError
;
4031 DoRenderbufferStorageMultisampleCHROMIUM(target
, samples
, internalformat
,
4033 return error::kNoError
;
4036 error::Error
GLES2DecoderImpl::HandleRenderbufferStorageMultisampleEXT(
4037 uint32_t immediate_data_size
,
4038 const void* cmd_data
) {
4039 const gles2::cmds::RenderbufferStorageMultisampleEXT
& c
=
4040 *static_cast<const gles2::cmds::RenderbufferStorageMultisampleEXT
*>(
4043 if (!features().multisampled_render_to_texture
) {
4044 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
,
4045 "glRenderbufferStorageMultisampleEXT",
4046 "function not available");
4047 return error::kNoError
;
4050 GLenum target
= static_cast<GLenum
>(c
.target
);
4051 GLsizei samples
= static_cast<GLsizei
>(c
.samples
);
4052 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
4053 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4054 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4055 if (!validators_
->render_buffer_target
.IsValid(target
)) {
4056 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleEXT",
4058 return error::kNoError
;
4061 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorageMultisampleEXT",
4063 return error::kNoError
;
4065 if (!validators_
->render_buffer_format
.IsValid(internalformat
)) {
4066 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleEXT",
4067 internalformat
, "internalformat");
4068 return error::kNoError
;
4071 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorageMultisampleEXT",
4073 return error::kNoError
;
4076 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorageMultisampleEXT",
4078 return error::kNoError
;
4080 DoRenderbufferStorageMultisampleEXT(target
, samples
, internalformat
, width
,
4082 return error::kNoError
;
4085 error::Error
GLES2DecoderImpl::HandleFramebufferTexture2DMultisampleEXT(
4086 uint32_t immediate_data_size
,
4087 const void* cmd_data
) {
4088 const gles2::cmds::FramebufferTexture2DMultisampleEXT
& c
=
4089 *static_cast<const gles2::cmds::FramebufferTexture2DMultisampleEXT
*>(
4092 if (!features().multisampled_render_to_texture
) {
4093 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
,
4094 "glFramebufferTexture2DMultisampleEXT",
4095 "function not available");
4096 return error::kNoError
;
4099 GLenum target
= static_cast<GLenum
>(c
.target
);
4100 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
4101 GLenum textarget
= static_cast<GLenum
>(c
.textarget
);
4102 GLuint texture
= c
.texture
;
4103 GLint level
= static_cast<GLint
>(c
.level
);
4104 GLsizei samples
= static_cast<GLsizei
>(c
.samples
);
4105 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
4106 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT",
4108 return error::kNoError
;
4110 if (!validators_
->attachment
.IsValid(attachment
)) {
4111 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT",
4112 attachment
, "attachment");
4113 return error::kNoError
;
4115 if (!validators_
->texture_target
.IsValid(textarget
)) {
4116 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT",
4117 textarget
, "textarget");
4118 return error::kNoError
;
4121 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glFramebufferTexture2DMultisampleEXT",
4123 return error::kNoError
;
4125 DoFramebufferTexture2DMultisample(target
, attachment
, textarget
, texture
,
4127 return error::kNoError
;
4130 error::Error
GLES2DecoderImpl::HandleTexStorage2DEXT(
4131 uint32_t immediate_data_size
,
4132 const void* cmd_data
) {
4133 const gles2::cmds::TexStorage2DEXT
& c
=
4134 *static_cast<const gles2::cmds::TexStorage2DEXT
*>(cmd_data
);
4136 GLenum target
= static_cast<GLenum
>(c
.target
);
4137 GLsizei levels
= static_cast<GLsizei
>(c
.levels
);
4138 GLenum internalFormat
= static_cast<GLenum
>(c
.internalFormat
);
4139 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4140 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4141 if (!validators_
->texture_target
.IsValid(target
)) {
4142 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DEXT", target
, "target");
4143 return error::kNoError
;
4146 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexStorage2DEXT", "levels < 0");
4147 return error::kNoError
;
4149 if (!validators_
->texture_internal_format_storage
.IsValid(internalFormat
)) {
4150 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DEXT", internalFormat
,
4152 return error::kNoError
;
4155 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexStorage2DEXT", "width < 0");
4156 return error::kNoError
;
4159 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexStorage2DEXT", "height < 0");
4160 return error::kNoError
;
4162 DoTexStorage2DEXT(target
, levels
, internalFormat
, width
, height
);
4163 return error::kNoError
;
4166 error::Error
GLES2DecoderImpl::HandleGenQueriesEXTImmediate(
4167 uint32_t immediate_data_size
,
4168 const void* cmd_data
) {
4169 const gles2::cmds::GenQueriesEXTImmediate
& c
=
4170 *static_cast<const gles2::cmds::GenQueriesEXTImmediate
*>(cmd_data
);
4172 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4174 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4175 return error::kOutOfBounds
;
4178 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
4179 if (queries
== NULL
) {
4180 return error::kOutOfBounds
;
4182 if (!GenQueriesEXTHelper(n
, queries
)) {
4183 return error::kInvalidArguments
;
4185 return error::kNoError
;
4188 error::Error
GLES2DecoderImpl::HandleDeleteQueriesEXTImmediate(
4189 uint32_t immediate_data_size
,
4190 const void* cmd_data
) {
4191 const gles2::cmds::DeleteQueriesEXTImmediate
& c
=
4192 *static_cast<const gles2::cmds::DeleteQueriesEXTImmediate
*>(cmd_data
);
4194 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4196 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4197 return error::kOutOfBounds
;
4199 const GLuint
* queries
=
4200 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
4201 if (queries
== NULL
) {
4202 return error::kOutOfBounds
;
4204 DeleteQueriesEXTHelper(n
, queries
);
4205 return error::kNoError
;
4208 error::Error
GLES2DecoderImpl::HandleBeginTransformFeedback(
4209 uint32_t immediate_data_size
,
4210 const void* cmd_data
) {
4211 if (!unsafe_es3_apis_enabled())
4212 return error::kUnknownCommand
;
4213 const gles2::cmds::BeginTransformFeedback
& c
=
4214 *static_cast<const gles2::cmds::BeginTransformFeedback
*>(cmd_data
);
4216 GLenum primitivemode
= static_cast<GLenum
>(c
.primitivemode
);
4217 glBeginTransformFeedback(primitivemode
);
4218 return error::kNoError
;
4221 error::Error
GLES2DecoderImpl::HandleEndTransformFeedback(
4222 uint32_t immediate_data_size
,
4223 const void* cmd_data
) {
4224 if (!unsafe_es3_apis_enabled())
4225 return error::kUnknownCommand
;
4226 const gles2::cmds::EndTransformFeedback
& c
=
4227 *static_cast<const gles2::cmds::EndTransformFeedback
*>(cmd_data
);
4229 glEndTransformFeedback();
4230 return error::kNoError
;
4233 error::Error
GLES2DecoderImpl::HandleInsertEventMarkerEXT(
4234 uint32_t immediate_data_size
,
4235 const void* cmd_data
) {
4236 const gles2::cmds::InsertEventMarkerEXT
& c
=
4237 *static_cast<const gles2::cmds::InsertEventMarkerEXT
*>(cmd_data
);
4240 GLuint bucket_id
= static_cast<GLuint
>(c
.bucket_id
);
4241 Bucket
* bucket
= GetBucket(bucket_id
);
4242 if (!bucket
|| bucket
->size() == 0) {
4243 return error::kInvalidArguments
;
4246 if (!bucket
->GetAsString(&str
)) {
4247 return error::kInvalidArguments
;
4249 DoInsertEventMarkerEXT(0, str
.c_str());
4250 return error::kNoError
;
4253 error::Error
GLES2DecoderImpl::HandlePushGroupMarkerEXT(
4254 uint32_t immediate_data_size
,
4255 const void* cmd_data
) {
4256 const gles2::cmds::PushGroupMarkerEXT
& c
=
4257 *static_cast<const gles2::cmds::PushGroupMarkerEXT
*>(cmd_data
);
4260 GLuint bucket_id
= static_cast<GLuint
>(c
.bucket_id
);
4261 Bucket
* bucket
= GetBucket(bucket_id
);
4262 if (!bucket
|| bucket
->size() == 0) {
4263 return error::kInvalidArguments
;
4266 if (!bucket
->GetAsString(&str
)) {
4267 return error::kInvalidArguments
;
4269 DoPushGroupMarkerEXT(0, str
.c_str());
4270 return error::kNoError
;
4273 error::Error
GLES2DecoderImpl::HandlePopGroupMarkerEXT(
4274 uint32_t immediate_data_size
,
4275 const void* cmd_data
) {
4276 const gles2::cmds::PopGroupMarkerEXT
& c
=
4277 *static_cast<const gles2::cmds::PopGroupMarkerEXT
*>(cmd_data
);
4279 DoPopGroupMarkerEXT();
4280 return error::kNoError
;
4283 error::Error
GLES2DecoderImpl::HandleGenVertexArraysOESImmediate(
4284 uint32_t immediate_data_size
,
4285 const void* cmd_data
) {
4286 const gles2::cmds::GenVertexArraysOESImmediate
& c
=
4287 *static_cast<const gles2::cmds::GenVertexArraysOESImmediate
*>(cmd_data
);
4289 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4291 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4292 return error::kOutOfBounds
;
4295 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
4296 if (arrays
== NULL
) {
4297 return error::kOutOfBounds
;
4299 if (!GenVertexArraysOESHelper(n
, arrays
)) {
4300 return error::kInvalidArguments
;
4302 return error::kNoError
;
4305 error::Error
GLES2DecoderImpl::HandleDeleteVertexArraysOESImmediate(
4306 uint32_t immediate_data_size
,
4307 const void* cmd_data
) {
4308 const gles2::cmds::DeleteVertexArraysOESImmediate
& c
=
4309 *static_cast<const gles2::cmds::DeleteVertexArraysOESImmediate
*>(
4312 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4314 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4315 return error::kOutOfBounds
;
4317 const GLuint
* arrays
=
4318 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
4319 if (arrays
== NULL
) {
4320 return error::kOutOfBounds
;
4322 DeleteVertexArraysOESHelper(n
, arrays
);
4323 return error::kNoError
;
4326 error::Error
GLES2DecoderImpl::HandleIsVertexArrayOES(
4327 uint32_t immediate_data_size
,
4328 const void* cmd_data
) {
4329 const gles2::cmds::IsVertexArrayOES
& c
=
4330 *static_cast<const gles2::cmds::IsVertexArrayOES
*>(cmd_data
);
4332 GLuint array
= c
.array
;
4333 typedef cmds::IsVertexArrayOES::Result Result
;
4334 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
4335 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
4337 return error::kOutOfBounds
;
4339 *result_dst
= DoIsVertexArrayOES(array
);
4340 return error::kNoError
;
4343 error::Error
GLES2DecoderImpl::HandleBindVertexArrayOES(
4344 uint32_t immediate_data_size
,
4345 const void* cmd_data
) {
4346 const gles2::cmds::BindVertexArrayOES
& c
=
4347 *static_cast<const gles2::cmds::BindVertexArrayOES
*>(cmd_data
);
4349 GLuint array
= c
.array
;
4350 DoBindVertexArrayOES(array
);
4351 return error::kNoError
;
4354 error::Error
GLES2DecoderImpl::HandleSwapBuffers(uint32_t immediate_data_size
,
4355 const void* cmd_data
) {
4356 const gles2::cmds::SwapBuffers
& c
=
4357 *static_cast<const gles2::cmds::SwapBuffers
*>(cmd_data
);
4360 return error::kNoError
;
4363 error::Error
GLES2DecoderImpl::HandleGetMaxValueInBufferCHROMIUM(
4364 uint32_t immediate_data_size
,
4365 const void* cmd_data
) {
4366 const gles2::cmds::GetMaxValueInBufferCHROMIUM
& c
=
4367 *static_cast<const gles2::cmds::GetMaxValueInBufferCHROMIUM
*>(cmd_data
);
4369 GLuint buffer_id
= c
.buffer_id
;
4370 GLsizei count
= static_cast<GLsizei
>(c
.count
);
4371 GLenum type
= static_cast<GLenum
>(c
.type
);
4372 GLuint offset
= static_cast<GLuint
>(c
.offset
);
4373 typedef cmds::GetMaxValueInBufferCHROMIUM::Result Result
;
4374 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
4375 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
4377 return error::kOutOfBounds
;
4380 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glGetMaxValueInBufferCHROMIUM",
4382 return error::kNoError
;
4384 if (!validators_
->get_max_index_type
.IsValid(type
)) {
4385 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetMaxValueInBufferCHROMIUM", type
,
4387 return error::kNoError
;
4389 *result_dst
= DoGetMaxValueInBufferCHROMIUM(buffer_id
, count
, type
, offset
);
4390 return error::kNoError
;
4393 error::Error
GLES2DecoderImpl::HandleTexImageIOSurface2DCHROMIUM(
4394 uint32_t immediate_data_size
,
4395 const void* cmd_data
) {
4396 const gles2::cmds::TexImageIOSurface2DCHROMIUM
& c
=
4397 *static_cast<const gles2::cmds::TexImageIOSurface2DCHROMIUM
*>(cmd_data
);
4399 GLenum target
= static_cast<GLenum
>(c
.target
);
4400 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4401 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4402 GLuint ioSurfaceId
= static_cast<GLuint
>(c
.ioSurfaceId
);
4403 GLuint plane
= static_cast<GLuint
>(c
.plane
);
4404 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4405 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexImageIOSurface2DCHROMIUM", target
,
4407 return error::kNoError
;
4410 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexImageIOSurface2DCHROMIUM",
4412 return error::kNoError
;
4415 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexImageIOSurface2DCHROMIUM",
4417 return error::kNoError
;
4419 DoTexImageIOSurface2DCHROMIUM(target
, width
, height
, ioSurfaceId
, plane
);
4420 return error::kNoError
;
4423 error::Error
GLES2DecoderImpl::HandleCopyTextureCHROMIUM(
4424 uint32_t immediate_data_size
,
4425 const void* cmd_data
) {
4426 const gles2::cmds::CopyTextureCHROMIUM
& c
=
4427 *static_cast<const gles2::cmds::CopyTextureCHROMIUM
*>(cmd_data
);
4429 GLenum target
= static_cast<GLenum
>(c
.target
);
4430 GLenum source_id
= static_cast<GLenum
>(c
.source_id
);
4431 GLenum dest_id
= static_cast<GLenum
>(c
.dest_id
);
4432 GLint internalformat
= static_cast<GLint
>(c
.internalformat
);
4433 GLenum dest_type
= static_cast<GLenum
>(c
.dest_type
);
4434 if (!validators_
->texture_internal_format
.IsValid(internalformat
)) {
4435 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTextureCHROMIUM",
4436 "internalformat GL_INVALID_VALUE");
4437 return error::kNoError
;
4439 if (!validators_
->pixel_type
.IsValid(dest_type
)) {
4440 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTextureCHROMIUM", dest_type
,
4442 return error::kNoError
;
4444 DoCopyTextureCHROMIUM(target
, source_id
, dest_id
, internalformat
, dest_type
);
4445 return error::kNoError
;
4448 error::Error
GLES2DecoderImpl::HandleCopySubTextureCHROMIUM(
4449 uint32_t immediate_data_size
,
4450 const void* cmd_data
) {
4451 const gles2::cmds::CopySubTextureCHROMIUM
& c
=
4452 *static_cast<const gles2::cmds::CopySubTextureCHROMIUM
*>(cmd_data
);
4454 GLenum target
= static_cast<GLenum
>(c
.target
);
4455 GLenum source_id
= static_cast<GLenum
>(c
.source_id
);
4456 GLenum dest_id
= static_cast<GLenum
>(c
.dest_id
);
4457 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
4458 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
4459 DoCopySubTextureCHROMIUM(target
, source_id
, dest_id
, xoffset
, yoffset
);
4460 return error::kNoError
;
4463 error::Error
GLES2DecoderImpl::HandleProduceTextureCHROMIUMImmediate(
4464 uint32_t immediate_data_size
,
4465 const void* cmd_data
) {
4466 const gles2::cmds::ProduceTextureCHROMIUMImmediate
& c
=
4467 *static_cast<const gles2::cmds::ProduceTextureCHROMIUMImmediate
*>(
4470 GLenum target
= static_cast<GLenum
>(c
.target
);
4472 if (!ComputeDataSize(1, sizeof(GLbyte
), 64, &data_size
)) {
4473 return error::kOutOfBounds
;
4475 if (data_size
> immediate_data_size
) {
4476 return error::kOutOfBounds
;
4478 const GLbyte
* mailbox
=
4479 GetImmediateDataAs
<const GLbyte
*>(c
, data_size
, immediate_data_size
);
4480 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4481 LOCAL_SET_GL_ERROR_INVALID_ENUM("glProduceTextureCHROMIUM", target
,
4483 return error::kNoError
;
4485 if (mailbox
== NULL
) {
4486 return error::kOutOfBounds
;
4488 DoProduceTextureCHROMIUM(target
, mailbox
);
4489 return error::kNoError
;
4492 error::Error
GLES2DecoderImpl::HandleProduceTextureDirectCHROMIUMImmediate(
4493 uint32_t immediate_data_size
,
4494 const void* cmd_data
) {
4495 const gles2::cmds::ProduceTextureDirectCHROMIUMImmediate
& c
=
4496 *static_cast<const gles2::cmds::ProduceTextureDirectCHROMIUMImmediate
*>(
4499 GLuint texture
= c
.texture
;
4500 GLenum target
= static_cast<GLenum
>(c
.target
);
4502 if (!ComputeDataSize(1, sizeof(GLbyte
), 64, &data_size
)) {
4503 return error::kOutOfBounds
;
4505 if (data_size
> immediate_data_size
) {
4506 return error::kOutOfBounds
;
4508 const GLbyte
* mailbox
=
4509 GetImmediateDataAs
<const GLbyte
*>(c
, data_size
, immediate_data_size
);
4510 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4511 LOCAL_SET_GL_ERROR_INVALID_ENUM("glProduceTextureDirectCHROMIUM", target
,
4513 return error::kNoError
;
4515 if (mailbox
== NULL
) {
4516 return error::kOutOfBounds
;
4518 DoProduceTextureDirectCHROMIUM(texture
, target
, mailbox
);
4519 return error::kNoError
;
4522 error::Error
GLES2DecoderImpl::HandleConsumeTextureCHROMIUMImmediate(
4523 uint32_t immediate_data_size
,
4524 const void* cmd_data
) {
4525 const gles2::cmds::ConsumeTextureCHROMIUMImmediate
& c
=
4526 *static_cast<const gles2::cmds::ConsumeTextureCHROMIUMImmediate
*>(
4529 GLenum target
= static_cast<GLenum
>(c
.target
);
4531 if (!ComputeDataSize(1, sizeof(GLbyte
), 64, &data_size
)) {
4532 return error::kOutOfBounds
;
4534 if (data_size
> immediate_data_size
) {
4535 return error::kOutOfBounds
;
4537 const GLbyte
* mailbox
=
4538 GetImmediateDataAs
<const GLbyte
*>(c
, data_size
, immediate_data_size
);
4539 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4540 LOCAL_SET_GL_ERROR_INVALID_ENUM("glConsumeTextureCHROMIUM", target
,
4542 return error::kNoError
;
4544 if (mailbox
== NULL
) {
4545 return error::kOutOfBounds
;
4547 DoConsumeTextureCHROMIUM(target
, mailbox
);
4548 return error::kNoError
;
4551 error::Error
GLES2DecoderImpl::HandleGenValuebuffersCHROMIUMImmediate(
4552 uint32_t immediate_data_size
,
4553 const void* cmd_data
) {
4554 const gles2::cmds::GenValuebuffersCHROMIUMImmediate
& c
=
4555 *static_cast<const gles2::cmds::GenValuebuffersCHROMIUMImmediate
*>(
4558 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4560 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4561 return error::kOutOfBounds
;
4564 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
4565 if (buffers
== NULL
) {
4566 return error::kOutOfBounds
;
4568 if (!GenValuebuffersCHROMIUMHelper(n
, buffers
)) {
4569 return error::kInvalidArguments
;
4571 return error::kNoError
;
4574 error::Error
GLES2DecoderImpl::HandleDeleteValuebuffersCHROMIUMImmediate(
4575 uint32_t immediate_data_size
,
4576 const void* cmd_data
) {
4577 const gles2::cmds::DeleteValuebuffersCHROMIUMImmediate
& c
=
4578 *static_cast<const gles2::cmds::DeleteValuebuffersCHROMIUMImmediate
*>(
4581 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4583 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4584 return error::kOutOfBounds
;
4586 const GLuint
* valuebuffers
=
4587 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
4588 if (valuebuffers
== NULL
) {
4589 return error::kOutOfBounds
;
4591 DeleteValuebuffersCHROMIUMHelper(n
, valuebuffers
);
4592 return error::kNoError
;
4595 error::Error
GLES2DecoderImpl::HandleIsValuebufferCHROMIUM(
4596 uint32_t immediate_data_size
,
4597 const void* cmd_data
) {
4598 const gles2::cmds::IsValuebufferCHROMIUM
& c
=
4599 *static_cast<const gles2::cmds::IsValuebufferCHROMIUM
*>(cmd_data
);
4601 GLuint valuebuffer
= c
.valuebuffer
;
4602 typedef cmds::IsValuebufferCHROMIUM::Result Result
;
4603 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
4604 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
4606 return error::kOutOfBounds
;
4608 *result_dst
= DoIsValuebufferCHROMIUM(valuebuffer
);
4609 return error::kNoError
;
4612 error::Error
GLES2DecoderImpl::HandleBindValuebufferCHROMIUM(
4613 uint32_t immediate_data_size
,
4614 const void* cmd_data
) {
4615 const gles2::cmds::BindValuebufferCHROMIUM
& c
=
4616 *static_cast<const gles2::cmds::BindValuebufferCHROMIUM
*>(cmd_data
);
4618 GLenum target
= static_cast<GLenum
>(c
.target
);
4619 GLuint valuebuffer
= c
.valuebuffer
;
4620 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4621 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindValuebufferCHROMIUM", target
,
4623 return error::kNoError
;
4625 DoBindValueBufferCHROMIUM(target
, valuebuffer
);
4626 return error::kNoError
;
4629 error::Error
GLES2DecoderImpl::HandleSubscribeValueCHROMIUM(
4630 uint32_t immediate_data_size
,
4631 const void* cmd_data
) {
4632 const gles2::cmds::SubscribeValueCHROMIUM
& c
=
4633 *static_cast<const gles2::cmds::SubscribeValueCHROMIUM
*>(cmd_data
);
4635 GLenum target
= static_cast<GLenum
>(c
.target
);
4636 GLenum subscription
= static_cast<GLenum
>(c
.subscription
);
4637 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4638 LOCAL_SET_GL_ERROR_INVALID_ENUM("glSubscribeValueCHROMIUM", target
,
4640 return error::kNoError
;
4642 if (!validators_
->subscription_target
.IsValid(subscription
)) {
4643 LOCAL_SET_GL_ERROR_INVALID_ENUM("glSubscribeValueCHROMIUM", subscription
,
4645 return error::kNoError
;
4647 DoSubscribeValueCHROMIUM(target
, subscription
);
4648 return error::kNoError
;
4651 error::Error
GLES2DecoderImpl::HandlePopulateSubscribedValuesCHROMIUM(
4652 uint32_t immediate_data_size
,
4653 const void* cmd_data
) {
4654 const gles2::cmds::PopulateSubscribedValuesCHROMIUM
& c
=
4655 *static_cast<const gles2::cmds::PopulateSubscribedValuesCHROMIUM
*>(
4658 GLenum target
= static_cast<GLenum
>(c
.target
);
4659 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4660 LOCAL_SET_GL_ERROR_INVALID_ENUM("glPopulateSubscribedValuesCHROMIUM",
4662 return error::kNoError
;
4664 DoPopulateSubscribedValuesCHROMIUM(target
);
4665 return error::kNoError
;
4668 error::Error
GLES2DecoderImpl::HandleUniformValuebufferCHROMIUM(
4669 uint32_t immediate_data_size
,
4670 const void* cmd_data
) {
4671 const gles2::cmds::UniformValuebufferCHROMIUM
& c
=
4672 *static_cast<const gles2::cmds::UniformValuebufferCHROMIUM
*>(cmd_data
);
4674 GLint location
= static_cast<GLint
>(c
.location
);
4675 GLenum target
= static_cast<GLenum
>(c
.target
);
4676 GLenum subscription
= static_cast<GLenum
>(c
.subscription
);
4677 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4678 LOCAL_SET_GL_ERROR_INVALID_ENUM("glUniformValuebufferCHROMIUM", target
,
4680 return error::kNoError
;
4682 if (!validators_
->subscription_target
.IsValid(subscription
)) {
4683 LOCAL_SET_GL_ERROR_INVALID_ENUM("glUniformValuebufferCHROMIUM",
4684 subscription
, "subscription");
4685 return error::kNoError
;
4687 DoUniformValueBufferCHROMIUM(location
, target
, subscription
);
4688 return error::kNoError
;
4691 error::Error
GLES2DecoderImpl::HandleBindTexImage2DCHROMIUM(
4692 uint32_t immediate_data_size
,
4693 const void* cmd_data
) {
4694 const gles2::cmds::BindTexImage2DCHROMIUM
& c
=
4695 *static_cast<const gles2::cmds::BindTexImage2DCHROMIUM
*>(cmd_data
);
4697 GLenum target
= static_cast<GLenum
>(c
.target
);
4698 GLint imageId
= static_cast<GLint
>(c
.imageId
);
4699 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4700 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTexImage2DCHROMIUM", target
,
4702 return error::kNoError
;
4704 DoBindTexImage2DCHROMIUM(target
, imageId
);
4705 return error::kNoError
;
4708 error::Error
GLES2DecoderImpl::HandleReleaseTexImage2DCHROMIUM(
4709 uint32_t immediate_data_size
,
4710 const void* cmd_data
) {
4711 const gles2::cmds::ReleaseTexImage2DCHROMIUM
& c
=
4712 *static_cast<const gles2::cmds::ReleaseTexImage2DCHROMIUM
*>(cmd_data
);
4714 GLenum target
= static_cast<GLenum
>(c
.target
);
4715 GLint imageId
= static_cast<GLint
>(c
.imageId
);
4716 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4717 LOCAL_SET_GL_ERROR_INVALID_ENUM("glReleaseTexImage2DCHROMIUM", target
,
4719 return error::kNoError
;
4721 DoReleaseTexImage2DCHROMIUM(target
, imageId
);
4722 return error::kNoError
;
4725 error::Error
GLES2DecoderImpl::HandleTraceEndCHROMIUM(
4726 uint32_t immediate_data_size
,
4727 const void* cmd_data
) {
4728 const gles2::cmds::TraceEndCHROMIUM
& c
=
4729 *static_cast<const gles2::cmds::TraceEndCHROMIUM
*>(cmd_data
);
4731 DoTraceEndCHROMIUM();
4732 return error::kNoError
;
4735 error::Error
GLES2DecoderImpl::HandleDiscardFramebufferEXTImmediate(
4736 uint32_t immediate_data_size
,
4737 const void* cmd_data
) {
4738 const gles2::cmds::DiscardFramebufferEXTImmediate
& c
=
4739 *static_cast<const gles2::cmds::DiscardFramebufferEXTImmediate
*>(
4742 if (!features().ext_discard_framebuffer
) {
4743 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glDiscardFramebufferEXT",
4744 "function not available");
4745 return error::kNoError
;
4748 GLenum target
= static_cast<GLenum
>(c
.target
);
4749 GLsizei count
= static_cast<GLsizei
>(c
.count
);
4751 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
4752 return error::kOutOfBounds
;
4754 if (data_size
> immediate_data_size
) {
4755 return error::kOutOfBounds
;
4757 const GLenum
* attachments
=
4758 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
4760 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glDiscardFramebufferEXT",
4762 return error::kNoError
;
4764 if (attachments
== NULL
) {
4765 return error::kOutOfBounds
;
4767 DoDiscardFramebufferEXT(target
, count
, attachments
);
4768 return error::kNoError
;
4771 error::Error
GLES2DecoderImpl::HandleLoseContextCHROMIUM(
4772 uint32_t immediate_data_size
,
4773 const void* cmd_data
) {
4774 const gles2::cmds::LoseContextCHROMIUM
& c
=
4775 *static_cast<const gles2::cmds::LoseContextCHROMIUM
*>(cmd_data
);
4777 GLenum current
= static_cast<GLenum
>(c
.current
);
4778 GLenum other
= static_cast<GLenum
>(c
.other
);
4779 if (!validators_
->reset_status
.IsValid(current
)) {
4780 LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", current
,
4782 return error::kNoError
;
4784 if (!validators_
->reset_status
.IsValid(other
)) {
4785 LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", other
, "other");
4786 return error::kNoError
;
4788 DoLoseContextCHROMIUM(current
, other
);
4789 return error::kNoError
;
4792 error::Error
GLES2DecoderImpl::HandleDrawBuffersEXTImmediate(
4793 uint32_t immediate_data_size
,
4794 const void* cmd_data
) {
4795 const gles2::cmds::DrawBuffersEXTImmediate
& c
=
4796 *static_cast<const gles2::cmds::DrawBuffersEXTImmediate
*>(cmd_data
);
4798 GLsizei count
= static_cast<GLsizei
>(c
.count
);
4800 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
4801 return error::kOutOfBounds
;
4803 if (data_size
> immediate_data_size
) {
4804 return error::kOutOfBounds
;
4806 const GLenum
* bufs
=
4807 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
4809 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glDrawBuffersEXT", "count < 0");
4810 return error::kNoError
;
4813 return error::kOutOfBounds
;
4815 DoDrawBuffersEXT(count
, bufs
);
4816 return error::kNoError
;
4819 error::Error
GLES2DecoderImpl::HandleSwapInterval(uint32_t immediate_data_size
,
4820 const void* cmd_data
) {
4821 const gles2::cmds::SwapInterval
& c
=
4822 *static_cast<const gles2::cmds::SwapInterval
*>(cmd_data
);
4824 GLint interval
= static_cast<GLint
>(c
.interval
);
4825 DoSwapInterval(interval
);
4826 return error::kNoError
;
4829 error::Error
GLES2DecoderImpl::HandleMatrixLoadfCHROMIUMImmediate(
4830 uint32_t immediate_data_size
,
4831 const void* cmd_data
) {
4832 const gles2::cmds::MatrixLoadfCHROMIUMImmediate
& c
=
4833 *static_cast<const gles2::cmds::MatrixLoadfCHROMIUMImmediate
*>(cmd_data
);
4835 if (!features().chromium_path_rendering
) {
4836 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glMatrixLoadfCHROMIUM",
4837 "function not available");
4838 return error::kNoError
;
4841 GLenum matrixMode
= static_cast<GLenum
>(c
.matrixMode
);
4843 if (!ComputeDataSize(1, sizeof(GLfloat
), 16, &data_size
)) {
4844 return error::kOutOfBounds
;
4846 if (data_size
> immediate_data_size
) {
4847 return error::kOutOfBounds
;
4850 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
4851 if (!validators_
->matrix_mode
.IsValid(matrixMode
)) {
4852 LOCAL_SET_GL_ERROR_INVALID_ENUM("glMatrixLoadfCHROMIUM", matrixMode
,
4854 return error::kNoError
;
4857 return error::kOutOfBounds
;
4859 DoMatrixLoadfCHROMIUM(matrixMode
, m
);
4860 return error::kNoError
;
4863 error::Error
GLES2DecoderImpl::HandleMatrixLoadIdentityCHROMIUM(
4864 uint32_t immediate_data_size
,
4865 const void* cmd_data
) {
4866 const gles2::cmds::MatrixLoadIdentityCHROMIUM
& c
=
4867 *static_cast<const gles2::cmds::MatrixLoadIdentityCHROMIUM
*>(cmd_data
);
4869 if (!features().chromium_path_rendering
) {
4870 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glMatrixLoadIdentityCHROMIUM",
4871 "function not available");
4872 return error::kNoError
;
4875 GLenum matrixMode
= static_cast<GLenum
>(c
.matrixMode
);
4876 if (!validators_
->matrix_mode
.IsValid(matrixMode
)) {
4877 LOCAL_SET_GL_ERROR_INVALID_ENUM("glMatrixLoadIdentityCHROMIUM", matrixMode
,
4879 return error::kNoError
;
4881 DoMatrixLoadIdentityCHROMIUM(matrixMode
);
4882 return error::kNoError
;
4885 error::Error
GLES2DecoderImpl::HandleBlendBarrierKHR(
4886 uint32_t immediate_data_size
,
4887 const void* cmd_data
) {
4888 const gles2::cmds::BlendBarrierKHR
& c
=
4889 *static_cast<const gles2::cmds::BlendBarrierKHR
*>(cmd_data
);
4891 if (!features().blend_equation_advanced
) {
4892 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBlendBarrierKHR",
4893 "function not available");
4894 return error::kNoError
;
4897 glBlendBarrierKHR();
4898 return error::kNoError
;
4901 bool GLES2DecoderImpl::SetCapabilityState(GLenum cap
, bool enabled
) {
4904 state_
.enable_flags
.blend
= enabled
;
4905 if (state_
.enable_flags
.cached_blend
!= enabled
||
4906 state_
.ignore_cached_state
) {
4907 state_
.enable_flags
.cached_blend
= enabled
;
4912 state_
.enable_flags
.cull_face
= enabled
;
4913 if (state_
.enable_flags
.cached_cull_face
!= enabled
||
4914 state_
.ignore_cached_state
) {
4915 state_
.enable_flags
.cached_cull_face
= enabled
;
4920 state_
.enable_flags
.depth_test
= enabled
;
4921 if (state_
.enable_flags
.cached_depth_test
!= enabled
||
4922 state_
.ignore_cached_state
) {
4923 framebuffer_state_
.clear_state_dirty
= true;
4927 state_
.enable_flags
.dither
= enabled
;
4928 if (state_
.enable_flags
.cached_dither
!= enabled
||
4929 state_
.ignore_cached_state
) {
4930 state_
.enable_flags
.cached_dither
= enabled
;
4934 case GL_POLYGON_OFFSET_FILL
:
4935 state_
.enable_flags
.polygon_offset_fill
= enabled
;
4936 if (state_
.enable_flags
.cached_polygon_offset_fill
!= enabled
||
4937 state_
.ignore_cached_state
) {
4938 state_
.enable_flags
.cached_polygon_offset_fill
= enabled
;
4942 case GL_SAMPLE_ALPHA_TO_COVERAGE
:
4943 state_
.enable_flags
.sample_alpha_to_coverage
= enabled
;
4944 if (state_
.enable_flags
.cached_sample_alpha_to_coverage
!= enabled
||
4945 state_
.ignore_cached_state
) {
4946 state_
.enable_flags
.cached_sample_alpha_to_coverage
= enabled
;
4950 case GL_SAMPLE_COVERAGE
:
4951 state_
.enable_flags
.sample_coverage
= enabled
;
4952 if (state_
.enable_flags
.cached_sample_coverage
!= enabled
||
4953 state_
.ignore_cached_state
) {
4954 state_
.enable_flags
.cached_sample_coverage
= enabled
;
4958 case GL_SCISSOR_TEST
:
4959 state_
.enable_flags
.scissor_test
= enabled
;
4960 if (state_
.enable_flags
.cached_scissor_test
!= enabled
||
4961 state_
.ignore_cached_state
) {
4962 state_
.enable_flags
.cached_scissor_test
= enabled
;
4966 case GL_STENCIL_TEST
:
4967 state_
.enable_flags
.stencil_test
= enabled
;
4968 if (state_
.enable_flags
.cached_stencil_test
!= enabled
||
4969 state_
.ignore_cached_state
) {
4970 framebuffer_state_
.clear_state_dirty
= true;
4973 case GL_RASTERIZER_DISCARD
:
4974 state_
.enable_flags
.rasterizer_discard
= enabled
;
4975 if (state_
.enable_flags
.cached_rasterizer_discard
!= enabled
||
4976 state_
.ignore_cached_state
) {
4977 state_
.enable_flags
.cached_rasterizer_discard
= enabled
;
4981 case GL_PRIMITIVE_RESTART_FIXED_INDEX
:
4982 state_
.enable_flags
.primitive_restart_fixed_index
= enabled
;
4983 if (state_
.enable_flags
.cached_primitive_restart_fixed_index
!= enabled
||
4984 state_
.ignore_cached_state
) {
4985 state_
.enable_flags
.cached_primitive_restart_fixed_index
= enabled
;
4994 #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_