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::HandleCompressedTexSubImage3D(
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::CompressedTexSubImage3D
& c
=
608 *static_cast<const gles2::cmds::CompressedTexSubImage3D
*>(cmd_data
);
610 GLenum target
= static_cast<GLenum
>(c
.target
);
611 GLint level
= static_cast<GLint
>(c
.level
);
612 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
613 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
614 GLint zoffset
= static_cast<GLint
>(c
.zoffset
);
615 GLsizei width
= static_cast<GLsizei
>(c
.width
);
616 GLsizei height
= static_cast<GLsizei
>(c
.height
);
617 GLsizei depth
= static_cast<GLsizei
>(c
.depth
);
618 GLenum format
= static_cast<GLenum
>(c
.format
);
619 GLsizei imageSize
= static_cast<GLsizei
>(c
.imageSize
);
620 uint32_t data_size
= imageSize
;
621 const void* data
= GetSharedMemoryAs
<const void*>(
622 c
.data_shm_id
, c
.data_shm_offset
, data_size
);
624 return error::kOutOfBounds
;
626 DoCompressedTexSubImage3D(target
, level
, xoffset
, yoffset
, zoffset
, width
,
627 height
, depth
, format
, imageSize
, data
);
628 return error::kNoError
;
631 error::Error
GLES2DecoderImpl::HandleCopyBufferSubData(
632 uint32_t immediate_data_size
,
633 const void* cmd_data
) {
634 if (!unsafe_es3_apis_enabled())
635 return error::kUnknownCommand
;
636 const gles2::cmds::CopyBufferSubData
& c
=
637 *static_cast<const gles2::cmds::CopyBufferSubData
*>(cmd_data
);
639 GLenum readtarget
= static_cast<GLenum
>(c
.readtarget
);
640 GLenum writetarget
= static_cast<GLenum
>(c
.writetarget
);
641 GLintptr readoffset
= static_cast<GLintptr
>(c
.readoffset
);
642 GLintptr writeoffset
= static_cast<GLintptr
>(c
.writeoffset
);
643 GLsizeiptr size
= static_cast<GLsizeiptr
>(c
.size
);
644 glCopyBufferSubData(readtarget
, writetarget
, readoffset
, writeoffset
, size
);
645 return error::kNoError
;
648 error::Error
GLES2DecoderImpl::HandleCopyTexImage2D(
649 uint32_t immediate_data_size
,
650 const void* cmd_data
) {
651 const gles2::cmds::CopyTexImage2D
& c
=
652 *static_cast<const gles2::cmds::CopyTexImage2D
*>(cmd_data
);
655 error
= WillAccessBoundFramebufferForRead();
656 if (error
!= error::kNoError
)
658 GLenum target
= static_cast<GLenum
>(c
.target
);
659 GLint level
= static_cast<GLint
>(c
.level
);
660 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
661 GLint x
= static_cast<GLint
>(c
.x
);
662 GLint y
= static_cast<GLint
>(c
.y
);
663 GLsizei width
= static_cast<GLsizei
>(c
.width
);
664 GLsizei height
= static_cast<GLsizei
>(c
.height
);
665 GLint border
= static_cast<GLint
>(c
.border
);
666 if (!validators_
->texture_target
.IsValid(target
)) {
667 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexImage2D", target
, "target");
668 return error::kNoError
;
670 if (!validators_
->texture_internal_format
.IsValid(internalformat
)) {
671 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexImage2D", internalformat
,
673 return error::kNoError
;
676 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexImage2D", "width < 0");
677 return error::kNoError
;
680 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexImage2D", "height < 0");
681 return error::kNoError
;
683 DoCopyTexImage2D(target
, level
, internalformat
, x
, y
, width
, height
, border
);
684 return error::kNoError
;
687 error::Error
GLES2DecoderImpl::HandleCopyTexSubImage2D(
688 uint32_t immediate_data_size
,
689 const void* cmd_data
) {
690 const gles2::cmds::CopyTexSubImage2D
& c
=
691 *static_cast<const gles2::cmds::CopyTexSubImage2D
*>(cmd_data
);
694 error
= WillAccessBoundFramebufferForRead();
695 if (error
!= error::kNoError
)
697 GLenum target
= static_cast<GLenum
>(c
.target
);
698 GLint level
= static_cast<GLint
>(c
.level
);
699 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
700 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
701 GLint x
= static_cast<GLint
>(c
.x
);
702 GLint y
= static_cast<GLint
>(c
.y
);
703 GLsizei width
= static_cast<GLsizei
>(c
.width
);
704 GLsizei height
= static_cast<GLsizei
>(c
.height
);
705 if (!validators_
->texture_target
.IsValid(target
)) {
706 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexSubImage2D", target
, "target");
707 return error::kNoError
;
710 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexSubImage2D", "width < 0");
711 return error::kNoError
;
714 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexSubImage2D", "height < 0");
715 return error::kNoError
;
717 DoCopyTexSubImage2D(target
, level
, xoffset
, yoffset
, x
, y
, width
, height
);
718 return error::kNoError
;
721 error::Error
GLES2DecoderImpl::HandleCopyTexSubImage3D(
722 uint32_t immediate_data_size
,
723 const void* cmd_data
) {
724 if (!unsafe_es3_apis_enabled())
725 return error::kUnknownCommand
;
726 const gles2::cmds::CopyTexSubImage3D
& c
=
727 *static_cast<const gles2::cmds::CopyTexSubImage3D
*>(cmd_data
);
730 error
= WillAccessBoundFramebufferForRead();
731 if (error
!= error::kNoError
)
733 GLenum target
= static_cast<GLenum
>(c
.target
);
734 GLint level
= static_cast<GLint
>(c
.level
);
735 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
736 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
737 GLint zoffset
= static_cast<GLint
>(c
.zoffset
);
738 GLint x
= static_cast<GLint
>(c
.x
);
739 GLint y
= static_cast<GLint
>(c
.y
);
740 GLsizei width
= static_cast<GLsizei
>(c
.width
);
741 GLsizei height
= static_cast<GLsizei
>(c
.height
);
742 glCopyTexSubImage3D(target
, level
, xoffset
, yoffset
, zoffset
, x
, y
, width
,
744 return error::kNoError
;
747 error::Error
GLES2DecoderImpl::HandleCreateProgram(uint32_t immediate_data_size
,
748 const void* cmd_data
) {
749 const gles2::cmds::CreateProgram
& c
=
750 *static_cast<const gles2::cmds::CreateProgram
*>(cmd_data
);
752 uint32_t client_id
= c
.client_id
;
753 if (GetProgram(client_id
)) {
754 return error::kInvalidArguments
;
756 GLuint service_id
= glCreateProgram();
758 CreateProgram(client_id
, service_id
);
760 return error::kNoError
;
763 error::Error
GLES2DecoderImpl::HandleCreateShader(uint32_t immediate_data_size
,
764 const void* cmd_data
) {
765 const gles2::cmds::CreateShader
& c
=
766 *static_cast<const gles2::cmds::CreateShader
*>(cmd_data
);
768 GLenum type
= static_cast<GLenum
>(c
.type
);
769 if (!validators_
->shader_type
.IsValid(type
)) {
770 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCreateShader", type
, "type");
771 return error::kNoError
;
773 uint32_t client_id
= c
.client_id
;
774 if (GetShader(client_id
)) {
775 return error::kInvalidArguments
;
777 GLuint service_id
= glCreateShader(type
);
779 CreateShader(client_id
, service_id
, type
);
781 return error::kNoError
;
784 error::Error
GLES2DecoderImpl::HandleCullFace(uint32_t immediate_data_size
,
785 const void* cmd_data
) {
786 const gles2::cmds::CullFace
& c
=
787 *static_cast<const gles2::cmds::CullFace
*>(cmd_data
);
789 GLenum mode
= static_cast<GLenum
>(c
.mode
);
790 if (!validators_
->face_type
.IsValid(mode
)) {
791 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCullFace", mode
, "mode");
792 return error::kNoError
;
794 if (state_
.cull_mode
!= mode
) {
795 state_
.cull_mode
= mode
;
798 return error::kNoError
;
801 error::Error
GLES2DecoderImpl::HandleDeleteBuffersImmediate(
802 uint32_t immediate_data_size
,
803 const void* cmd_data
) {
804 const gles2::cmds::DeleteBuffersImmediate
& c
=
805 *static_cast<const gles2::cmds::DeleteBuffersImmediate
*>(cmd_data
);
807 GLsizei n
= static_cast<GLsizei
>(c
.n
);
809 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
810 return error::kOutOfBounds
;
812 const GLuint
* buffers
=
813 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
814 if (buffers
== NULL
) {
815 return error::kOutOfBounds
;
817 DeleteBuffersHelper(n
, buffers
);
818 return error::kNoError
;
821 error::Error
GLES2DecoderImpl::HandleDeleteFramebuffersImmediate(
822 uint32_t immediate_data_size
,
823 const void* cmd_data
) {
824 const gles2::cmds::DeleteFramebuffersImmediate
& c
=
825 *static_cast<const gles2::cmds::DeleteFramebuffersImmediate
*>(cmd_data
);
827 GLsizei n
= static_cast<GLsizei
>(c
.n
);
829 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
830 return error::kOutOfBounds
;
832 const GLuint
* framebuffers
=
833 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
834 if (framebuffers
== NULL
) {
835 return error::kOutOfBounds
;
837 DeleteFramebuffersHelper(n
, framebuffers
);
838 return error::kNoError
;
841 error::Error
GLES2DecoderImpl::HandleDeleteRenderbuffersImmediate(
842 uint32_t immediate_data_size
,
843 const void* cmd_data
) {
844 const gles2::cmds::DeleteRenderbuffersImmediate
& c
=
845 *static_cast<const gles2::cmds::DeleteRenderbuffersImmediate
*>(cmd_data
);
847 GLsizei n
= static_cast<GLsizei
>(c
.n
);
849 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
850 return error::kOutOfBounds
;
852 const GLuint
* renderbuffers
=
853 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
854 if (renderbuffers
== NULL
) {
855 return error::kOutOfBounds
;
857 DeleteRenderbuffersHelper(n
, renderbuffers
);
858 return error::kNoError
;
861 error::Error
GLES2DecoderImpl::HandleDeleteSamplersImmediate(
862 uint32_t immediate_data_size
,
863 const void* cmd_data
) {
864 if (!unsafe_es3_apis_enabled())
865 return error::kUnknownCommand
;
866 const gles2::cmds::DeleteSamplersImmediate
& c
=
867 *static_cast<const gles2::cmds::DeleteSamplersImmediate
*>(cmd_data
);
869 GLsizei n
= static_cast<GLsizei
>(c
.n
);
871 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
872 return error::kOutOfBounds
;
874 const GLuint
* samplers
=
875 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
876 if (samplers
== NULL
) {
877 return error::kOutOfBounds
;
879 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
880 GLuint service_id
= 0;
881 if (group_
->GetSamplerServiceId(samplers
[ii
], &service_id
)) {
882 glDeleteSamplers(1, &service_id
);
883 group_
->RemoveSamplerId(samplers
[ii
]);
886 return error::kNoError
;
889 error::Error
GLES2DecoderImpl::HandleDeleteSync(uint32_t immediate_data_size
,
890 const void* cmd_data
) {
891 if (!unsafe_es3_apis_enabled())
892 return error::kUnknownCommand
;
893 const gles2::cmds::DeleteSync
& c
=
894 *static_cast<const gles2::cmds::DeleteSync
*>(cmd_data
);
896 GLuint sync
= c
.sync
;
897 GLsync service_id
= 0;
898 if (group_
->GetSyncServiceId(sync
, &service_id
)) {
899 glDeleteSync(service_id
);
900 group_
->RemoveSyncId(sync
);
902 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glDeleteSync", "unknown sync");
904 return error::kNoError
;
907 error::Error
GLES2DecoderImpl::HandleDeleteTexturesImmediate(
908 uint32_t immediate_data_size
,
909 const void* cmd_data
) {
910 const gles2::cmds::DeleteTexturesImmediate
& c
=
911 *static_cast<const gles2::cmds::DeleteTexturesImmediate
*>(cmd_data
);
913 GLsizei n
= static_cast<GLsizei
>(c
.n
);
915 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
916 return error::kOutOfBounds
;
918 const GLuint
* textures
=
919 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
920 if (textures
== NULL
) {
921 return error::kOutOfBounds
;
923 DeleteTexturesHelper(n
, textures
);
924 return error::kNoError
;
927 error::Error
GLES2DecoderImpl::HandleDeleteTransformFeedbacksImmediate(
928 uint32_t immediate_data_size
,
929 const void* cmd_data
) {
930 if (!unsafe_es3_apis_enabled())
931 return error::kUnknownCommand
;
932 const gles2::cmds::DeleteTransformFeedbacksImmediate
& c
=
933 *static_cast<const gles2::cmds::DeleteTransformFeedbacksImmediate
*>(
936 GLsizei n
= static_cast<GLsizei
>(c
.n
);
938 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
939 return error::kOutOfBounds
;
942 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
944 return error::kOutOfBounds
;
946 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
947 GLuint service_id
= 0;
948 if (group_
->GetTransformFeedbackServiceId(ids
[ii
], &service_id
)) {
949 glDeleteTransformFeedbacks(1, &service_id
);
950 group_
->RemoveTransformFeedbackId(ids
[ii
]);
953 return error::kNoError
;
956 error::Error
GLES2DecoderImpl::HandleDepthFunc(uint32_t immediate_data_size
,
957 const void* cmd_data
) {
958 const gles2::cmds::DepthFunc
& c
=
959 *static_cast<const gles2::cmds::DepthFunc
*>(cmd_data
);
961 GLenum func
= static_cast<GLenum
>(c
.func
);
962 if (!validators_
->cmp_function
.IsValid(func
)) {
963 LOCAL_SET_GL_ERROR_INVALID_ENUM("glDepthFunc", func
, "func");
964 return error::kNoError
;
966 if (state_
.depth_func
!= func
) {
967 state_
.depth_func
= func
;
970 return error::kNoError
;
973 error::Error
GLES2DecoderImpl::HandleDepthMask(uint32_t immediate_data_size
,
974 const void* cmd_data
) {
975 const gles2::cmds::DepthMask
& c
=
976 *static_cast<const gles2::cmds::DepthMask
*>(cmd_data
);
978 GLboolean flag
= static_cast<GLboolean
>(c
.flag
);
979 if (state_
.depth_mask
!= flag
) {
980 state_
.depth_mask
= flag
;
981 framebuffer_state_
.clear_state_dirty
= true;
983 return error::kNoError
;
986 error::Error
GLES2DecoderImpl::HandleDepthRangef(uint32_t immediate_data_size
,
987 const void* cmd_data
) {
988 const gles2::cmds::DepthRangef
& c
=
989 *static_cast<const gles2::cmds::DepthRangef
*>(cmd_data
);
991 GLclampf zNear
= static_cast<GLclampf
>(c
.zNear
);
992 GLclampf zFar
= static_cast<GLclampf
>(c
.zFar
);
993 DoDepthRangef(zNear
, zFar
);
994 return error::kNoError
;
997 error::Error
GLES2DecoderImpl::HandleDetachShader(uint32_t immediate_data_size
,
998 const void* cmd_data
) {
999 const gles2::cmds::DetachShader
& c
=
1000 *static_cast<const gles2::cmds::DetachShader
*>(cmd_data
);
1002 GLuint program
= c
.program
;
1003 GLuint shader
= c
.shader
;
1004 DoDetachShader(program
, shader
);
1005 return error::kNoError
;
1008 error::Error
GLES2DecoderImpl::HandleDisable(uint32_t immediate_data_size
,
1009 const void* cmd_data
) {
1010 const gles2::cmds::Disable
& c
=
1011 *static_cast<const gles2::cmds::Disable
*>(cmd_data
);
1013 GLenum cap
= static_cast<GLenum
>(c
.cap
);
1014 if (!validators_
->capability
.IsValid(cap
)) {
1015 LOCAL_SET_GL_ERROR_INVALID_ENUM("glDisable", cap
, "cap");
1016 return error::kNoError
;
1019 return error::kNoError
;
1022 error::Error
GLES2DecoderImpl::HandleDisableVertexAttribArray(
1023 uint32_t immediate_data_size
,
1024 const void* cmd_data
) {
1025 const gles2::cmds::DisableVertexAttribArray
& c
=
1026 *static_cast<const gles2::cmds::DisableVertexAttribArray
*>(cmd_data
);
1028 GLuint index
= static_cast<GLuint
>(c
.index
);
1029 DoDisableVertexAttribArray(index
);
1030 return error::kNoError
;
1033 error::Error
GLES2DecoderImpl::HandleEnable(uint32_t immediate_data_size
,
1034 const void* cmd_data
) {
1035 const gles2::cmds::Enable
& c
=
1036 *static_cast<const gles2::cmds::Enable
*>(cmd_data
);
1038 GLenum cap
= static_cast<GLenum
>(c
.cap
);
1039 if (!validators_
->capability
.IsValid(cap
)) {
1040 LOCAL_SET_GL_ERROR_INVALID_ENUM("glEnable", cap
, "cap");
1041 return error::kNoError
;
1044 return error::kNoError
;
1047 error::Error
GLES2DecoderImpl::HandleEnableVertexAttribArray(
1048 uint32_t immediate_data_size
,
1049 const void* cmd_data
) {
1050 const gles2::cmds::EnableVertexAttribArray
& c
=
1051 *static_cast<const gles2::cmds::EnableVertexAttribArray
*>(cmd_data
);
1053 GLuint index
= static_cast<GLuint
>(c
.index
);
1054 DoEnableVertexAttribArray(index
);
1055 return error::kNoError
;
1058 error::Error
GLES2DecoderImpl::HandleFenceSync(uint32_t immediate_data_size
,
1059 const void* cmd_data
) {
1060 if (!unsafe_es3_apis_enabled())
1061 return error::kUnknownCommand
;
1062 const gles2::cmds::FenceSync
& c
=
1063 *static_cast<const gles2::cmds::FenceSync
*>(cmd_data
);
1065 GLenum condition
= static_cast<GLenum
>(c
.condition
);
1066 GLbitfield flags
= static_cast<GLbitfield
>(c
.flags
);
1067 uint32_t client_id
= c
.client_id
;
1068 GLsync service_id
= 0;
1069 if (group_
->GetSyncServiceId(client_id
, &service_id
)) {
1070 return error::kInvalidArguments
;
1072 service_id
= glFenceSync(condition
, flags
);
1074 group_
->AddSyncId(client_id
, service_id
);
1076 return error::kNoError
;
1079 error::Error
GLES2DecoderImpl::HandleFinish(uint32_t immediate_data_size
,
1080 const void* cmd_data
) {
1081 const gles2::cmds::Finish
& c
=
1082 *static_cast<const gles2::cmds::Finish
*>(cmd_data
);
1085 error
= WillAccessBoundFramebufferForRead();
1086 if (error
!= error::kNoError
)
1089 return error::kNoError
;
1092 error::Error
GLES2DecoderImpl::HandleFlush(uint32_t immediate_data_size
,
1093 const void* cmd_data
) {
1094 const gles2::cmds::Flush
& c
=
1095 *static_cast<const gles2::cmds::Flush
*>(cmd_data
);
1098 return error::kNoError
;
1101 error::Error
GLES2DecoderImpl::HandleFramebufferRenderbuffer(
1102 uint32_t immediate_data_size
,
1103 const void* cmd_data
) {
1104 const gles2::cmds::FramebufferRenderbuffer
& c
=
1105 *static_cast<const gles2::cmds::FramebufferRenderbuffer
*>(cmd_data
);
1107 GLenum target
= static_cast<GLenum
>(c
.target
);
1108 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1109 GLenum renderbuffertarget
= static_cast<GLenum
>(c
.renderbuffertarget
);
1110 GLuint renderbuffer
= c
.renderbuffer
;
1111 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
1112 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer", target
,
1114 return error::kNoError
;
1116 if (!validators_
->attachment
.IsValid(attachment
)) {
1117 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer", attachment
,
1119 return error::kNoError
;
1121 if (!validators_
->render_buffer_target
.IsValid(renderbuffertarget
)) {
1122 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer",
1123 renderbuffertarget
, "renderbuffertarget");
1124 return error::kNoError
;
1126 DoFramebufferRenderbuffer(target
, attachment
, renderbuffertarget
,
1128 return error::kNoError
;
1131 error::Error
GLES2DecoderImpl::HandleFramebufferTexture2D(
1132 uint32_t immediate_data_size
,
1133 const void* cmd_data
) {
1134 const gles2::cmds::FramebufferTexture2D
& c
=
1135 *static_cast<const gles2::cmds::FramebufferTexture2D
*>(cmd_data
);
1137 GLenum target
= static_cast<GLenum
>(c
.target
);
1138 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1139 GLenum textarget
= static_cast<GLenum
>(c
.textarget
);
1140 GLuint texture
= c
.texture
;
1141 GLint level
= static_cast<GLint
>(c
.level
);
1142 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
1143 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", target
, "target");
1144 return error::kNoError
;
1146 if (!validators_
->attachment
.IsValid(attachment
)) {
1147 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", attachment
,
1149 return error::kNoError
;
1151 if (!validators_
->texture_target
.IsValid(textarget
)) {
1152 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", textarget
,
1154 return error::kNoError
;
1156 DoFramebufferTexture2D(target
, attachment
, textarget
, texture
, level
);
1157 return error::kNoError
;
1160 error::Error
GLES2DecoderImpl::HandleFramebufferTextureLayer(
1161 uint32_t immediate_data_size
,
1162 const void* cmd_data
) {
1163 if (!unsafe_es3_apis_enabled())
1164 return error::kUnknownCommand
;
1165 const gles2::cmds::FramebufferTextureLayer
& c
=
1166 *static_cast<const gles2::cmds::FramebufferTextureLayer
*>(cmd_data
);
1168 GLenum target
= static_cast<GLenum
>(c
.target
);
1169 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1170 GLuint texture
= c
.texture
;
1171 GLint level
= static_cast<GLint
>(c
.level
);
1172 GLint layer
= static_cast<GLint
>(c
.layer
);
1173 DoFramebufferTextureLayer(target
, attachment
, texture
, level
, layer
);
1174 return error::kNoError
;
1177 error::Error
GLES2DecoderImpl::HandleFrontFace(uint32_t immediate_data_size
,
1178 const void* cmd_data
) {
1179 const gles2::cmds::FrontFace
& c
=
1180 *static_cast<const gles2::cmds::FrontFace
*>(cmd_data
);
1182 GLenum mode
= static_cast<GLenum
>(c
.mode
);
1183 if (!validators_
->face_mode
.IsValid(mode
)) {
1184 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFrontFace", mode
, "mode");
1185 return error::kNoError
;
1187 if (state_
.front_face
!= mode
) {
1188 state_
.front_face
= mode
;
1191 return error::kNoError
;
1194 error::Error
GLES2DecoderImpl::HandleGenBuffersImmediate(
1195 uint32_t immediate_data_size
,
1196 const void* cmd_data
) {
1197 const gles2::cmds::GenBuffersImmediate
& c
=
1198 *static_cast<const gles2::cmds::GenBuffersImmediate
*>(cmd_data
);
1200 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1202 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1203 return error::kOutOfBounds
;
1206 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1207 if (buffers
== NULL
) {
1208 return error::kOutOfBounds
;
1210 if (!GenBuffersHelper(n
, buffers
)) {
1211 return error::kInvalidArguments
;
1213 return error::kNoError
;
1216 error::Error
GLES2DecoderImpl::HandleGenerateMipmap(
1217 uint32_t immediate_data_size
,
1218 const void* cmd_data
) {
1219 const gles2::cmds::GenerateMipmap
& c
=
1220 *static_cast<const gles2::cmds::GenerateMipmap
*>(cmd_data
);
1222 GLenum target
= static_cast<GLenum
>(c
.target
);
1223 if (!validators_
->texture_bind_target
.IsValid(target
)) {
1224 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGenerateMipmap", target
, "target");
1225 return error::kNoError
;
1227 DoGenerateMipmap(target
);
1228 return error::kNoError
;
1231 error::Error
GLES2DecoderImpl::HandleGenFramebuffersImmediate(
1232 uint32_t immediate_data_size
,
1233 const void* cmd_data
) {
1234 const gles2::cmds::GenFramebuffersImmediate
& c
=
1235 *static_cast<const gles2::cmds::GenFramebuffersImmediate
*>(cmd_data
);
1237 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1239 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1240 return error::kOutOfBounds
;
1242 GLuint
* framebuffers
=
1243 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1244 if (framebuffers
== NULL
) {
1245 return error::kOutOfBounds
;
1247 if (!GenFramebuffersHelper(n
, framebuffers
)) {
1248 return error::kInvalidArguments
;
1250 return error::kNoError
;
1253 error::Error
GLES2DecoderImpl::HandleGenRenderbuffersImmediate(
1254 uint32_t immediate_data_size
,
1255 const void* cmd_data
) {
1256 const gles2::cmds::GenRenderbuffersImmediate
& c
=
1257 *static_cast<const gles2::cmds::GenRenderbuffersImmediate
*>(cmd_data
);
1259 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1261 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1262 return error::kOutOfBounds
;
1264 GLuint
* renderbuffers
=
1265 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1266 if (renderbuffers
== NULL
) {
1267 return error::kOutOfBounds
;
1269 if (!GenRenderbuffersHelper(n
, renderbuffers
)) {
1270 return error::kInvalidArguments
;
1272 return error::kNoError
;
1275 error::Error
GLES2DecoderImpl::HandleGenSamplersImmediate(
1276 uint32_t immediate_data_size
,
1277 const void* cmd_data
) {
1278 if (!unsafe_es3_apis_enabled())
1279 return error::kUnknownCommand
;
1280 const gles2::cmds::GenSamplersImmediate
& c
=
1281 *static_cast<const gles2::cmds::GenSamplersImmediate
*>(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 (samplers
== NULL
) {
1291 return error::kOutOfBounds
;
1293 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1294 if (group_
->GetSamplerServiceId(samplers
[ii
], NULL
)) {
1295 return error::kInvalidArguments
;
1298 scoped_ptr
<GLuint
[]> service_ids(new GLuint
[n
]);
1299 glGenSamplers(n
, service_ids
.get());
1300 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1301 group_
->AddSamplerId(samplers
[ii
], service_ids
[ii
]);
1303 return error::kNoError
;
1306 error::Error
GLES2DecoderImpl::HandleGenTexturesImmediate(
1307 uint32_t immediate_data_size
,
1308 const void* cmd_data
) {
1309 const gles2::cmds::GenTexturesImmediate
& c
=
1310 *static_cast<const gles2::cmds::GenTexturesImmediate
*>(cmd_data
);
1312 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1314 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1315 return error::kOutOfBounds
;
1318 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1319 if (textures
== NULL
) {
1320 return error::kOutOfBounds
;
1322 if (!GenTexturesHelper(n
, textures
)) {
1323 return error::kInvalidArguments
;
1325 return error::kNoError
;
1328 error::Error
GLES2DecoderImpl::HandleGenTransformFeedbacksImmediate(
1329 uint32_t immediate_data_size
,
1330 const void* cmd_data
) {
1331 if (!unsafe_es3_apis_enabled())
1332 return error::kUnknownCommand
;
1333 const gles2::cmds::GenTransformFeedbacksImmediate
& c
=
1334 *static_cast<const gles2::cmds::GenTransformFeedbacksImmediate
*>(
1337 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1339 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1340 return error::kOutOfBounds
;
1342 GLuint
* ids
= GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1344 return error::kOutOfBounds
;
1346 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1347 if (group_
->GetTransformFeedbackServiceId(ids
[ii
], NULL
)) {
1348 return error::kInvalidArguments
;
1351 scoped_ptr
<GLuint
[]> service_ids(new GLuint
[n
]);
1352 glGenTransformFeedbacks(n
, service_ids
.get());
1353 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1354 group_
->AddTransformFeedbackId(ids
[ii
], service_ids
[ii
]);
1356 return error::kNoError
;
1359 error::Error
GLES2DecoderImpl::HandleGetBooleanv(uint32_t immediate_data_size
,
1360 const void* cmd_data
) {
1361 const gles2::cmds::GetBooleanv
& c
=
1362 *static_cast<const gles2::cmds::GetBooleanv
*>(cmd_data
);
1364 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1365 typedef cmds::GetBooleanv::Result Result
;
1366 GLsizei num_values
= 0;
1367 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1368 Result
* result
= GetSharedMemoryAs
<Result
*>(
1369 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1370 GLboolean
* params
= result
? result
->GetData() : NULL
;
1371 if (!validators_
->g_l_state
.IsValid(pname
)) {
1372 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBooleanv", pname
, "pname");
1373 return error::kNoError
;
1375 if (params
== NULL
) {
1376 return error::kOutOfBounds
;
1378 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetBooleanv");
1379 // Check that the client initialized the result.
1380 if (result
->size
!= 0) {
1381 return error::kInvalidArguments
;
1383 DoGetBooleanv(pname
, params
);
1384 GLenum error
= glGetError();
1385 if (error
== GL_NO_ERROR
) {
1386 result
->SetNumResults(num_values
);
1388 LOCAL_SET_GL_ERROR(error
, "GetBooleanv", "");
1390 return error::kNoError
;
1393 error::Error
GLES2DecoderImpl::HandleGetBufferParameteriv(
1394 uint32_t immediate_data_size
,
1395 const void* cmd_data
) {
1396 const gles2::cmds::GetBufferParameteriv
& c
=
1397 *static_cast<const gles2::cmds::GetBufferParameteriv
*>(cmd_data
);
1399 GLenum target
= static_cast<GLenum
>(c
.target
);
1400 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1401 typedef cmds::GetBufferParameteriv::Result Result
;
1402 GLsizei num_values
= 0;
1403 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1404 Result
* result
= GetSharedMemoryAs
<Result
*>(
1405 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1406 GLint
* params
= result
? result
->GetData() : NULL
;
1407 if (!validators_
->buffer_target
.IsValid(target
)) {
1408 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", target
, "target");
1409 return error::kNoError
;
1411 if (!validators_
->buffer_parameter
.IsValid(pname
)) {
1412 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", pname
, "pname");
1413 return error::kNoError
;
1415 if (params
== NULL
) {
1416 return error::kOutOfBounds
;
1418 // Check that the client initialized the result.
1419 if (result
->size
!= 0) {
1420 return error::kInvalidArguments
;
1422 DoGetBufferParameteriv(target
, pname
, params
);
1423 result
->SetNumResults(num_values
);
1424 return error::kNoError
;
1426 error::Error
GLES2DecoderImpl::HandleGetError(uint32_t immediate_data_size
,
1427 const void* cmd_data
) {
1428 const gles2::cmds::GetError
& c
=
1429 *static_cast<const gles2::cmds::GetError
*>(cmd_data
);
1431 typedef cmds::GetError::Result Result
;
1432 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
1433 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
1435 return error::kOutOfBounds
;
1437 *result_dst
= GetErrorState()->GetGLError();
1438 return error::kNoError
;
1441 error::Error
GLES2DecoderImpl::HandleGetFloatv(uint32_t immediate_data_size
,
1442 const void* cmd_data
) {
1443 const gles2::cmds::GetFloatv
& c
=
1444 *static_cast<const gles2::cmds::GetFloatv
*>(cmd_data
);
1446 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1447 typedef cmds::GetFloatv::Result Result
;
1448 GLsizei num_values
= 0;
1449 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1450 Result
* result
= GetSharedMemoryAs
<Result
*>(
1451 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1452 GLfloat
* params
= result
? result
->GetData() : NULL
;
1453 if (!validators_
->g_l_state
.IsValid(pname
)) {
1454 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFloatv", pname
, "pname");
1455 return error::kNoError
;
1457 if (params
== NULL
) {
1458 return error::kOutOfBounds
;
1460 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetFloatv");
1461 // Check that the client initialized the result.
1462 if (result
->size
!= 0) {
1463 return error::kInvalidArguments
;
1465 DoGetFloatv(pname
, params
);
1466 GLenum error
= glGetError();
1467 if (error
== GL_NO_ERROR
) {
1468 result
->SetNumResults(num_values
);
1470 LOCAL_SET_GL_ERROR(error
, "GetFloatv", "");
1472 return error::kNoError
;
1475 error::Error
GLES2DecoderImpl::HandleGetFramebufferAttachmentParameteriv(
1476 uint32_t immediate_data_size
,
1477 const void* cmd_data
) {
1478 const gles2::cmds::GetFramebufferAttachmentParameteriv
& c
=
1479 *static_cast<const gles2::cmds::GetFramebufferAttachmentParameteriv
*>(
1482 GLenum target
= static_cast<GLenum
>(c
.target
);
1483 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1484 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1485 typedef cmds::GetFramebufferAttachmentParameteriv::Result Result
;
1486 GLsizei num_values
= 0;
1487 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1488 Result
* result
= GetSharedMemoryAs
<Result
*>(
1489 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1490 GLint
* params
= result
? result
->GetData() : NULL
;
1491 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
1492 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv",
1494 return error::kNoError
;
1496 if (!validators_
->attachment
.IsValid(attachment
)) {
1497 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv",
1498 attachment
, "attachment");
1499 return error::kNoError
;
1501 if (!validators_
->frame_buffer_parameter
.IsValid(pname
)) {
1502 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv",
1504 return error::kNoError
;
1506 if (params
== NULL
) {
1507 return error::kOutOfBounds
;
1509 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetFramebufferAttachmentParameteriv");
1510 // Check that the client initialized the result.
1511 if (result
->size
!= 0) {
1512 return error::kInvalidArguments
;
1514 DoGetFramebufferAttachmentParameteriv(target
, attachment
, pname
, params
);
1515 GLenum error
= glGetError();
1516 if (error
== GL_NO_ERROR
) {
1517 result
->SetNumResults(num_values
);
1519 LOCAL_SET_GL_ERROR(error
, "GetFramebufferAttachmentParameteriv", "");
1521 return error::kNoError
;
1524 error::Error
GLES2DecoderImpl::HandleGetInteger64v(uint32_t immediate_data_size
,
1525 const void* cmd_data
) {
1526 if (!unsafe_es3_apis_enabled())
1527 return error::kUnknownCommand
;
1528 const gles2::cmds::GetInteger64v
& c
=
1529 *static_cast<const gles2::cmds::GetInteger64v
*>(cmd_data
);
1531 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1532 typedef cmds::GetInteger64v::Result Result
;
1533 GLsizei num_values
= 0;
1534 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1535 Result
* result
= GetSharedMemoryAs
<Result
*>(
1536 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1537 GLint64
* params
= result
? result
->GetData() : NULL
;
1538 if (params
== NULL
) {
1539 return error::kOutOfBounds
;
1541 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetInteger64v");
1542 // Check that the client initialized the result.
1543 if (result
->size
!= 0) {
1544 return error::kInvalidArguments
;
1546 DoGetInteger64v(pname
, params
);
1547 GLenum error
= glGetError();
1548 if (error
== GL_NO_ERROR
) {
1549 result
->SetNumResults(num_values
);
1551 LOCAL_SET_GL_ERROR(error
, "GetInteger64v", "");
1553 return error::kNoError
;
1556 error::Error
GLES2DecoderImpl::HandleGetIntegeri_v(uint32_t immediate_data_size
,
1557 const void* cmd_data
) {
1558 if (!unsafe_es3_apis_enabled())
1559 return error::kUnknownCommand
;
1560 const gles2::cmds::GetIntegeri_v
& c
=
1561 *static_cast<const gles2::cmds::GetIntegeri_v
*>(cmd_data
);
1563 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1564 GLuint index
= static_cast<GLuint
>(c
.index
);
1565 typedef cmds::GetIntegeri_v::Result Result
;
1566 GLsizei num_values
= 0;
1567 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1568 Result
* result
= GetSharedMemoryAs
<Result
*>(c
.data_shm_id
, c
.data_shm_offset
,
1569 Result::ComputeSize(num_values
));
1570 GLint
* data
= result
? result
->GetData() : NULL
;
1572 return error::kOutOfBounds
;
1574 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetIntegeri_v");
1575 // Check that the client initialized the result.
1576 if (result
->size
!= 0) {
1577 return error::kInvalidArguments
;
1579 glGetIntegeri_v(pname
, index
, data
);
1580 GLenum error
= glGetError();
1581 if (error
== GL_NO_ERROR
) {
1582 result
->SetNumResults(num_values
);
1584 LOCAL_SET_GL_ERROR(error
, "GetIntegeri_v", "");
1586 return error::kNoError
;
1589 error::Error
GLES2DecoderImpl::HandleGetInteger64i_v(
1590 uint32_t immediate_data_size
,
1591 const void* cmd_data
) {
1592 if (!unsafe_es3_apis_enabled())
1593 return error::kUnknownCommand
;
1594 const gles2::cmds::GetInteger64i_v
& c
=
1595 *static_cast<const gles2::cmds::GetInteger64i_v
*>(cmd_data
);
1597 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1598 GLuint index
= static_cast<GLuint
>(c
.index
);
1599 typedef cmds::GetInteger64i_v::Result Result
;
1600 GLsizei num_values
= 0;
1601 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1602 Result
* result
= GetSharedMemoryAs
<Result
*>(c
.data_shm_id
, c
.data_shm_offset
,
1603 Result::ComputeSize(num_values
));
1604 GLint64
* data
= result
? result
->GetData() : NULL
;
1606 return error::kOutOfBounds
;
1608 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetInteger64i_v");
1609 // Check that the client initialized the result.
1610 if (result
->size
!= 0) {
1611 return error::kInvalidArguments
;
1613 glGetInteger64i_v(pname
, index
, data
);
1614 GLenum error
= glGetError();
1615 if (error
== GL_NO_ERROR
) {
1616 result
->SetNumResults(num_values
);
1618 LOCAL_SET_GL_ERROR(error
, "GetInteger64i_v", "");
1620 return error::kNoError
;
1623 error::Error
GLES2DecoderImpl::HandleGetIntegerv(uint32_t immediate_data_size
,
1624 const void* cmd_data
) {
1625 const gles2::cmds::GetIntegerv
& c
=
1626 *static_cast<const gles2::cmds::GetIntegerv
*>(cmd_data
);
1628 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1629 typedef cmds::GetIntegerv::Result Result
;
1630 GLsizei num_values
= 0;
1631 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1632 Result
* result
= GetSharedMemoryAs
<Result
*>(
1633 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1634 GLint
* params
= result
? result
->GetData() : NULL
;
1635 if (!validators_
->g_l_state
.IsValid(pname
)) {
1636 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetIntegerv", pname
, "pname");
1637 return error::kNoError
;
1639 if (params
== NULL
) {
1640 return error::kOutOfBounds
;
1642 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetIntegerv");
1643 // Check that the client initialized the result.
1644 if (result
->size
!= 0) {
1645 return error::kInvalidArguments
;
1647 DoGetIntegerv(pname
, params
);
1648 GLenum error
= glGetError();
1649 if (error
== GL_NO_ERROR
) {
1650 result
->SetNumResults(num_values
);
1652 LOCAL_SET_GL_ERROR(error
, "GetIntegerv", "");
1654 return error::kNoError
;
1657 error::Error
GLES2DecoderImpl::HandleGetInternalformativ(
1658 uint32_t immediate_data_size
,
1659 const void* cmd_data
) {
1660 if (!unsafe_es3_apis_enabled())
1661 return error::kUnknownCommand
;
1662 const gles2::cmds::GetInternalformativ
& c
=
1663 *static_cast<const gles2::cmds::GetInternalformativ
*>(cmd_data
);
1665 GLenum target
= static_cast<GLenum
>(c
.target
);
1666 GLenum format
= static_cast<GLenum
>(c
.format
);
1667 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1668 GLsizei bufSize
= static_cast<GLsizei
>(c
.bufSize
);
1669 typedef cmds::GetInternalformativ::Result Result
;
1670 GLsizei num_values
= 0;
1671 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1672 Result
* result
= GetSharedMemoryAs
<Result
*>(
1673 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1674 GLint
* params
= result
? result
->GetData() : NULL
;
1675 if (params
== NULL
) {
1676 return error::kOutOfBounds
;
1678 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetInternalformativ");
1679 // Check that the client initialized the result.
1680 if (result
->size
!= 0) {
1681 return error::kInvalidArguments
;
1683 glGetInternalformativ(target
, format
, pname
, bufSize
, params
);
1684 GLenum error
= glGetError();
1685 if (error
== GL_NO_ERROR
) {
1686 result
->SetNumResults(num_values
);
1688 LOCAL_SET_GL_ERROR(error
, "GetInternalformativ", "");
1690 return error::kNoError
;
1693 error::Error
GLES2DecoderImpl::HandleGetProgramiv(uint32_t immediate_data_size
,
1694 const void* cmd_data
) {
1695 const gles2::cmds::GetProgramiv
& c
=
1696 *static_cast<const gles2::cmds::GetProgramiv
*>(cmd_data
);
1698 GLuint program
= c
.program
;
1699 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1700 typedef cmds::GetProgramiv::Result Result
;
1701 GLsizei num_values
= 0;
1702 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1703 Result
* result
= GetSharedMemoryAs
<Result
*>(
1704 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1705 GLint
* params
= result
? result
->GetData() : NULL
;
1706 if (!validators_
->program_parameter
.IsValid(pname
)) {
1707 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetProgramiv", pname
, "pname");
1708 return error::kNoError
;
1710 if (params
== NULL
) {
1711 return error::kOutOfBounds
;
1713 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetProgramiv");
1714 // Check that the client initialized the result.
1715 if (result
->size
!= 0) {
1716 return error::kInvalidArguments
;
1718 DoGetProgramiv(program
, pname
, params
);
1719 GLenum error
= glGetError();
1720 if (error
== GL_NO_ERROR
) {
1721 result
->SetNumResults(num_values
);
1723 LOCAL_SET_GL_ERROR(error
, "GetProgramiv", "");
1725 return error::kNoError
;
1728 error::Error
GLES2DecoderImpl::HandleGetRenderbufferParameteriv(
1729 uint32_t immediate_data_size
,
1730 const void* cmd_data
) {
1731 const gles2::cmds::GetRenderbufferParameteriv
& c
=
1732 *static_cast<const gles2::cmds::GetRenderbufferParameteriv
*>(cmd_data
);
1734 GLenum target
= static_cast<GLenum
>(c
.target
);
1735 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1736 typedef cmds::GetRenderbufferParameteriv::Result Result
;
1737 GLsizei num_values
= 0;
1738 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1739 Result
* result
= GetSharedMemoryAs
<Result
*>(
1740 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1741 GLint
* params
= result
? result
->GetData() : NULL
;
1742 if (!validators_
->render_buffer_target
.IsValid(target
)) {
1743 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetRenderbufferParameteriv", target
,
1745 return error::kNoError
;
1747 if (!validators_
->render_buffer_parameter
.IsValid(pname
)) {
1748 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetRenderbufferParameteriv", pname
,
1750 return error::kNoError
;
1752 if (params
== NULL
) {
1753 return error::kOutOfBounds
;
1755 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetRenderbufferParameteriv");
1756 // Check that the client initialized the result.
1757 if (result
->size
!= 0) {
1758 return error::kInvalidArguments
;
1760 DoGetRenderbufferParameteriv(target
, pname
, params
);
1761 GLenum error
= glGetError();
1762 if (error
== GL_NO_ERROR
) {
1763 result
->SetNumResults(num_values
);
1765 LOCAL_SET_GL_ERROR(error
, "GetRenderbufferParameteriv", "");
1767 return error::kNoError
;
1770 error::Error
GLES2DecoderImpl::HandleGetSamplerParameterfv(
1771 uint32_t immediate_data_size
,
1772 const void* cmd_data
) {
1773 if (!unsafe_es3_apis_enabled())
1774 return error::kUnknownCommand
;
1775 const gles2::cmds::GetSamplerParameterfv
& c
=
1776 *static_cast<const gles2::cmds::GetSamplerParameterfv
*>(cmd_data
);
1778 GLuint sampler
= c
.sampler
;
1779 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1780 typedef cmds::GetSamplerParameterfv::Result Result
;
1781 GLsizei num_values
= 0;
1782 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1783 Result
* result
= GetSharedMemoryAs
<Result
*>(
1784 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1785 GLfloat
* params
= result
? result
->GetData() : NULL
;
1786 if (params
== NULL
) {
1787 return error::kOutOfBounds
;
1789 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetSamplerParameterfv");
1790 // Check that the client initialized the result.
1791 if (result
->size
!= 0) {
1792 return error::kInvalidArguments
;
1794 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
1795 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glGetSamplerParameterfv",
1796 "invalid sampler id");
1797 return error::kNoError
;
1799 glGetSamplerParameterfv(sampler
, pname
, params
);
1800 GLenum error
= glGetError();
1801 if (error
== GL_NO_ERROR
) {
1802 result
->SetNumResults(num_values
);
1804 LOCAL_SET_GL_ERROR(error
, "GetSamplerParameterfv", "");
1806 return error::kNoError
;
1809 error::Error
GLES2DecoderImpl::HandleGetSamplerParameteriv(
1810 uint32_t immediate_data_size
,
1811 const void* cmd_data
) {
1812 if (!unsafe_es3_apis_enabled())
1813 return error::kUnknownCommand
;
1814 const gles2::cmds::GetSamplerParameteriv
& c
=
1815 *static_cast<const gles2::cmds::GetSamplerParameteriv
*>(cmd_data
);
1817 GLuint sampler
= c
.sampler
;
1818 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1819 typedef cmds::GetSamplerParameteriv::Result Result
;
1820 GLsizei num_values
= 0;
1821 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1822 Result
* result
= GetSharedMemoryAs
<Result
*>(
1823 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1824 GLint
* params
= result
? result
->GetData() : NULL
;
1825 if (params
== NULL
) {
1826 return error::kOutOfBounds
;
1828 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetSamplerParameteriv");
1829 // Check that the client initialized the result.
1830 if (result
->size
!= 0) {
1831 return error::kInvalidArguments
;
1833 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
1834 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glGetSamplerParameteriv",
1835 "invalid sampler id");
1836 return error::kNoError
;
1838 glGetSamplerParameteriv(sampler
, pname
, params
);
1839 GLenum error
= glGetError();
1840 if (error
== GL_NO_ERROR
) {
1841 result
->SetNumResults(num_values
);
1843 LOCAL_SET_GL_ERROR(error
, "GetSamplerParameteriv", "");
1845 return error::kNoError
;
1848 error::Error
GLES2DecoderImpl::HandleGetShaderiv(uint32_t immediate_data_size
,
1849 const void* cmd_data
) {
1850 const gles2::cmds::GetShaderiv
& c
=
1851 *static_cast<const gles2::cmds::GetShaderiv
*>(cmd_data
);
1853 GLuint shader
= c
.shader
;
1854 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1855 typedef cmds::GetShaderiv::Result Result
;
1856 GLsizei num_values
= 0;
1857 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1858 Result
* result
= GetSharedMemoryAs
<Result
*>(
1859 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1860 GLint
* params
= result
? result
->GetData() : NULL
;
1861 if (!validators_
->shader_parameter
.IsValid(pname
)) {
1862 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetShaderiv", pname
, "pname");
1863 return error::kNoError
;
1865 if (params
== NULL
) {
1866 return error::kOutOfBounds
;
1868 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetShaderiv");
1869 // Check that the client initialized the result.
1870 if (result
->size
!= 0) {
1871 return error::kInvalidArguments
;
1873 DoGetShaderiv(shader
, pname
, params
);
1874 GLenum error
= glGetError();
1875 if (error
== GL_NO_ERROR
) {
1876 result
->SetNumResults(num_values
);
1878 LOCAL_SET_GL_ERROR(error
, "GetShaderiv", "");
1880 return error::kNoError
;
1883 error::Error
GLES2DecoderImpl::HandleGetSynciv(uint32_t immediate_data_size
,
1884 const void* cmd_data
) {
1885 if (!unsafe_es3_apis_enabled())
1886 return error::kUnknownCommand
;
1887 const gles2::cmds::GetSynciv
& c
=
1888 *static_cast<const gles2::cmds::GetSynciv
*>(cmd_data
);
1890 GLuint sync
= static_cast<GLuint
>(c
.sync
);
1891 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1892 typedef cmds::GetSynciv::Result Result
;
1893 GLsizei num_values
= 0;
1894 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1895 Result
* result
= GetSharedMemoryAs
<Result
*>(
1896 c
.values_shm_id
, c
.values_shm_offset
, Result::ComputeSize(num_values
));
1897 GLint
* values
= result
? result
->GetData() : NULL
;
1898 if (values
== NULL
) {
1899 return error::kOutOfBounds
;
1901 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetSynciv");
1902 // Check that the client initialized the result.
1903 if (result
->size
!= 0) {
1904 return error::kInvalidArguments
;
1906 GLsync service_sync
= 0;
1907 if (!group_
->GetSyncServiceId(sync
, &service_sync
)) {
1908 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glGetSynciv", "invalid sync id");
1909 return error::kNoError
;
1911 glGetSynciv(service_sync
, pname
, num_values
, nullptr, values
);
1912 GLenum error
= glGetError();
1913 if (error
== GL_NO_ERROR
) {
1914 result
->SetNumResults(num_values
);
1916 LOCAL_SET_GL_ERROR(error
, "GetSynciv", "");
1918 return error::kNoError
;
1921 error::Error
GLES2DecoderImpl::HandleGetTexParameterfv(
1922 uint32_t immediate_data_size
,
1923 const void* cmd_data
) {
1924 const gles2::cmds::GetTexParameterfv
& c
=
1925 *static_cast<const gles2::cmds::GetTexParameterfv
*>(cmd_data
);
1927 GLenum target
= static_cast<GLenum
>(c
.target
);
1928 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1929 typedef cmds::GetTexParameterfv::Result Result
;
1930 GLsizei num_values
= 0;
1931 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1932 Result
* result
= GetSharedMemoryAs
<Result
*>(
1933 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1934 GLfloat
* params
= result
? result
->GetData() : NULL
;
1935 if (!validators_
->get_tex_param_target
.IsValid(target
)) {
1936 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameterfv", target
, "target");
1937 return error::kNoError
;
1939 if (!validators_
->texture_parameter
.IsValid(pname
)) {
1940 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameterfv", pname
, "pname");
1941 return error::kNoError
;
1943 if (params
== NULL
) {
1944 return error::kOutOfBounds
;
1946 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetTexParameterfv");
1947 // Check that the client initialized the result.
1948 if (result
->size
!= 0) {
1949 return error::kInvalidArguments
;
1951 DoGetTexParameterfv(target
, pname
, params
);
1952 GLenum error
= glGetError();
1953 if (error
== GL_NO_ERROR
) {
1954 result
->SetNumResults(num_values
);
1956 LOCAL_SET_GL_ERROR(error
, "GetTexParameterfv", "");
1958 return error::kNoError
;
1961 error::Error
GLES2DecoderImpl::HandleGetTexParameteriv(
1962 uint32_t immediate_data_size
,
1963 const void* cmd_data
) {
1964 const gles2::cmds::GetTexParameteriv
& c
=
1965 *static_cast<const gles2::cmds::GetTexParameteriv
*>(cmd_data
);
1967 GLenum target
= static_cast<GLenum
>(c
.target
);
1968 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1969 typedef cmds::GetTexParameteriv::Result Result
;
1970 GLsizei num_values
= 0;
1971 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1972 Result
* result
= GetSharedMemoryAs
<Result
*>(
1973 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1974 GLint
* params
= result
? result
->GetData() : NULL
;
1975 if (!validators_
->get_tex_param_target
.IsValid(target
)) {
1976 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameteriv", target
, "target");
1977 return error::kNoError
;
1979 if (!validators_
->texture_parameter
.IsValid(pname
)) {
1980 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameteriv", pname
, "pname");
1981 return error::kNoError
;
1983 if (params
== NULL
) {
1984 return error::kOutOfBounds
;
1986 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetTexParameteriv");
1987 // Check that the client initialized the result.
1988 if (result
->size
!= 0) {
1989 return error::kInvalidArguments
;
1991 DoGetTexParameteriv(target
, pname
, params
);
1992 GLenum error
= glGetError();
1993 if (error
== GL_NO_ERROR
) {
1994 result
->SetNumResults(num_values
);
1996 LOCAL_SET_GL_ERROR(error
, "GetTexParameteriv", "");
1998 return error::kNoError
;
2001 error::Error
GLES2DecoderImpl::HandleGetVertexAttribfv(
2002 uint32_t immediate_data_size
,
2003 const void* cmd_data
) {
2004 const gles2::cmds::GetVertexAttribfv
& c
=
2005 *static_cast<const gles2::cmds::GetVertexAttribfv
*>(cmd_data
);
2007 GLuint index
= static_cast<GLuint
>(c
.index
);
2008 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2009 typedef cmds::GetVertexAttribfv::Result Result
;
2010 GLsizei num_values
= 0;
2011 GetNumValuesReturnedForGLGet(pname
, &num_values
);
2012 Result
* result
= GetSharedMemoryAs
<Result
*>(
2013 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
2014 GLfloat
* params
= result
? result
->GetData() : NULL
;
2015 if (!validators_
->vertex_attribute
.IsValid(pname
)) {
2016 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribfv", pname
, "pname");
2017 return error::kNoError
;
2019 if (params
== NULL
) {
2020 return error::kOutOfBounds
;
2022 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribfv");
2023 // Check that the client initialized the result.
2024 if (result
->size
!= 0) {
2025 return error::kInvalidArguments
;
2027 DoGetVertexAttribfv(index
, pname
, params
);
2028 GLenum error
= glGetError();
2029 if (error
== GL_NO_ERROR
) {
2030 result
->SetNumResults(num_values
);
2032 LOCAL_SET_GL_ERROR(error
, "GetVertexAttribfv", "");
2034 return error::kNoError
;
2037 error::Error
GLES2DecoderImpl::HandleGetVertexAttribiv(
2038 uint32_t immediate_data_size
,
2039 const void* cmd_data
) {
2040 const gles2::cmds::GetVertexAttribiv
& c
=
2041 *static_cast<const gles2::cmds::GetVertexAttribiv
*>(cmd_data
);
2043 GLuint index
= static_cast<GLuint
>(c
.index
);
2044 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2045 typedef cmds::GetVertexAttribiv::Result Result
;
2046 GLsizei num_values
= 0;
2047 GetNumValuesReturnedForGLGet(pname
, &num_values
);
2048 Result
* result
= GetSharedMemoryAs
<Result
*>(
2049 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
2050 GLint
* params
= result
? result
->GetData() : NULL
;
2051 if (!validators_
->vertex_attribute
.IsValid(pname
)) {
2052 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribiv", pname
, "pname");
2053 return error::kNoError
;
2055 if (params
== NULL
) {
2056 return error::kOutOfBounds
;
2058 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribiv");
2059 // Check that the client initialized the result.
2060 if (result
->size
!= 0) {
2061 return error::kInvalidArguments
;
2063 DoGetVertexAttribiv(index
, pname
, params
);
2064 GLenum error
= glGetError();
2065 if (error
== GL_NO_ERROR
) {
2066 result
->SetNumResults(num_values
);
2068 LOCAL_SET_GL_ERROR(error
, "GetVertexAttribiv", "");
2070 return error::kNoError
;
2073 error::Error
GLES2DecoderImpl::HandleHint(uint32_t immediate_data_size
,
2074 const void* cmd_data
) {
2075 const gles2::cmds::Hint
& c
= *static_cast<const gles2::cmds::Hint
*>(cmd_data
);
2077 GLenum target
= static_cast<GLenum
>(c
.target
);
2078 GLenum mode
= static_cast<GLenum
>(c
.mode
);
2079 if (!validators_
->hint_target
.IsValid(target
)) {
2080 LOCAL_SET_GL_ERROR_INVALID_ENUM("glHint", target
, "target");
2081 return error::kNoError
;
2083 if (!validators_
->hint_mode
.IsValid(mode
)) {
2084 LOCAL_SET_GL_ERROR_INVALID_ENUM("glHint", mode
, "mode");
2085 return error::kNoError
;
2088 case GL_GENERATE_MIPMAP_HINT
:
2089 if (state_
.hint_generate_mipmap
!= mode
) {
2090 state_
.hint_generate_mipmap
= mode
;
2091 glHint(target
, mode
);
2094 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES
:
2095 if (state_
.hint_fragment_shader_derivative
!= mode
) {
2096 state_
.hint_fragment_shader_derivative
= mode
;
2097 glHint(target
, mode
);
2103 return error::kNoError
;
2106 error::Error
GLES2DecoderImpl::HandleInvalidateFramebufferImmediate(
2107 uint32_t immediate_data_size
,
2108 const void* cmd_data
) {
2109 if (!unsafe_es3_apis_enabled())
2110 return error::kUnknownCommand
;
2111 const gles2::cmds::InvalidateFramebufferImmediate
& c
=
2112 *static_cast<const gles2::cmds::InvalidateFramebufferImmediate
*>(
2115 GLenum target
= static_cast<GLenum
>(c
.target
);
2116 GLsizei count
= static_cast<GLsizei
>(c
.count
);
2118 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
2119 return error::kOutOfBounds
;
2121 if (data_size
> immediate_data_size
) {
2122 return error::kOutOfBounds
;
2124 const GLenum
* attachments
=
2125 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
2126 if (attachments
== NULL
) {
2127 return error::kOutOfBounds
;
2129 glInvalidateFramebuffer(target
, count
, attachments
);
2130 return error::kNoError
;
2133 error::Error
GLES2DecoderImpl::HandleInvalidateSubFramebufferImmediate(
2134 uint32_t immediate_data_size
,
2135 const void* cmd_data
) {
2136 if (!unsafe_es3_apis_enabled())
2137 return error::kUnknownCommand
;
2138 const gles2::cmds::InvalidateSubFramebufferImmediate
& c
=
2139 *static_cast<const gles2::cmds::InvalidateSubFramebufferImmediate
*>(
2142 GLenum target
= static_cast<GLenum
>(c
.target
);
2143 GLsizei count
= static_cast<GLsizei
>(c
.count
);
2145 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
2146 return error::kOutOfBounds
;
2148 if (data_size
> immediate_data_size
) {
2149 return error::kOutOfBounds
;
2151 const GLenum
* attachments
=
2152 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
2153 GLint x
= static_cast<GLint
>(c
.x
);
2154 GLint y
= static_cast<GLint
>(c
.y
);
2155 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2156 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2157 if (attachments
== NULL
) {
2158 return error::kOutOfBounds
;
2160 glInvalidateSubFramebuffer(target
, count
, attachments
, x
, y
, width
, height
);
2161 return error::kNoError
;
2164 error::Error
GLES2DecoderImpl::HandleIsBuffer(uint32_t immediate_data_size
,
2165 const void* cmd_data
) {
2166 const gles2::cmds::IsBuffer
& c
=
2167 *static_cast<const gles2::cmds::IsBuffer
*>(cmd_data
);
2169 GLuint buffer
= c
.buffer
;
2170 typedef cmds::IsBuffer::Result Result
;
2171 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2172 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2174 return error::kOutOfBounds
;
2176 *result_dst
= DoIsBuffer(buffer
);
2177 return error::kNoError
;
2180 error::Error
GLES2DecoderImpl::HandleIsEnabled(uint32_t immediate_data_size
,
2181 const void* cmd_data
) {
2182 const gles2::cmds::IsEnabled
& c
=
2183 *static_cast<const gles2::cmds::IsEnabled
*>(cmd_data
);
2185 GLenum cap
= static_cast<GLenum
>(c
.cap
);
2186 typedef cmds::IsEnabled::Result Result
;
2187 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2188 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2190 return error::kOutOfBounds
;
2192 if (!validators_
->capability
.IsValid(cap
)) {
2193 LOCAL_SET_GL_ERROR_INVALID_ENUM("glIsEnabled", cap
, "cap");
2194 return error::kNoError
;
2196 *result_dst
= DoIsEnabled(cap
);
2197 return error::kNoError
;
2200 error::Error
GLES2DecoderImpl::HandleIsFramebuffer(uint32_t immediate_data_size
,
2201 const void* cmd_data
) {
2202 const gles2::cmds::IsFramebuffer
& c
=
2203 *static_cast<const gles2::cmds::IsFramebuffer
*>(cmd_data
);
2205 GLuint framebuffer
= c
.framebuffer
;
2206 typedef cmds::IsFramebuffer::Result Result
;
2207 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2208 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2210 return error::kOutOfBounds
;
2212 *result_dst
= DoIsFramebuffer(framebuffer
);
2213 return error::kNoError
;
2216 error::Error
GLES2DecoderImpl::HandleIsProgram(uint32_t immediate_data_size
,
2217 const void* cmd_data
) {
2218 const gles2::cmds::IsProgram
& c
=
2219 *static_cast<const gles2::cmds::IsProgram
*>(cmd_data
);
2221 GLuint program
= c
.program
;
2222 typedef cmds::IsProgram::Result Result
;
2223 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2224 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2226 return error::kOutOfBounds
;
2228 *result_dst
= DoIsProgram(program
);
2229 return error::kNoError
;
2232 error::Error
GLES2DecoderImpl::HandleIsRenderbuffer(
2233 uint32_t immediate_data_size
,
2234 const void* cmd_data
) {
2235 const gles2::cmds::IsRenderbuffer
& c
=
2236 *static_cast<const gles2::cmds::IsRenderbuffer
*>(cmd_data
);
2238 GLuint renderbuffer
= c
.renderbuffer
;
2239 typedef cmds::IsRenderbuffer::Result Result
;
2240 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2241 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2243 return error::kOutOfBounds
;
2245 *result_dst
= DoIsRenderbuffer(renderbuffer
);
2246 return error::kNoError
;
2249 error::Error
GLES2DecoderImpl::HandleIsSampler(uint32_t immediate_data_size
,
2250 const void* cmd_data
) {
2251 if (!unsafe_es3_apis_enabled())
2252 return error::kUnknownCommand
;
2253 const gles2::cmds::IsSampler
& c
=
2254 *static_cast<const gles2::cmds::IsSampler
*>(cmd_data
);
2256 GLuint sampler
= c
.sampler
;
2257 typedef cmds::IsSampler::Result Result
;
2258 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2259 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2261 return error::kOutOfBounds
;
2263 GLuint service_sampler
= 0;
2264 *result_dst
= group_
->GetSamplerServiceId(sampler
, &service_sampler
);
2265 return error::kNoError
;
2268 error::Error
GLES2DecoderImpl::HandleIsShader(uint32_t immediate_data_size
,
2269 const void* cmd_data
) {
2270 const gles2::cmds::IsShader
& c
=
2271 *static_cast<const gles2::cmds::IsShader
*>(cmd_data
);
2273 GLuint shader
= c
.shader
;
2274 typedef cmds::IsShader::Result Result
;
2275 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2276 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2278 return error::kOutOfBounds
;
2280 *result_dst
= DoIsShader(shader
);
2281 return error::kNoError
;
2284 error::Error
GLES2DecoderImpl::HandleIsSync(uint32_t immediate_data_size
,
2285 const void* cmd_data
) {
2286 if (!unsafe_es3_apis_enabled())
2287 return error::kUnknownCommand
;
2288 const gles2::cmds::IsSync
& c
=
2289 *static_cast<const gles2::cmds::IsSync
*>(cmd_data
);
2291 GLuint sync
= c
.sync
;
2292 typedef cmds::IsSync::Result Result
;
2293 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2294 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2296 return error::kOutOfBounds
;
2298 GLsync service_sync
= 0;
2299 *result_dst
= group_
->GetSyncServiceId(sync
, &service_sync
);
2300 return error::kNoError
;
2303 error::Error
GLES2DecoderImpl::HandleIsTexture(uint32_t immediate_data_size
,
2304 const void* cmd_data
) {
2305 const gles2::cmds::IsTexture
& c
=
2306 *static_cast<const gles2::cmds::IsTexture
*>(cmd_data
);
2308 GLuint texture
= c
.texture
;
2309 typedef cmds::IsTexture::Result Result
;
2310 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2311 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2313 return error::kOutOfBounds
;
2315 *result_dst
= DoIsTexture(texture
);
2316 return error::kNoError
;
2319 error::Error
GLES2DecoderImpl::HandleIsTransformFeedback(
2320 uint32_t immediate_data_size
,
2321 const void* cmd_data
) {
2322 if (!unsafe_es3_apis_enabled())
2323 return error::kUnknownCommand
;
2324 const gles2::cmds::IsTransformFeedback
& c
=
2325 *static_cast<const gles2::cmds::IsTransformFeedback
*>(cmd_data
);
2327 GLuint transformfeedback
= c
.transformfeedback
;
2328 typedef cmds::IsTransformFeedback::Result Result
;
2329 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2330 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2332 return error::kOutOfBounds
;
2334 GLuint service_transformfeedback
= 0;
2335 *result_dst
= group_
->GetTransformFeedbackServiceId(
2336 transformfeedback
, &service_transformfeedback
);
2337 return error::kNoError
;
2340 error::Error
GLES2DecoderImpl::HandleLineWidth(uint32_t immediate_data_size
,
2341 const void* cmd_data
) {
2342 const gles2::cmds::LineWidth
& c
=
2343 *static_cast<const gles2::cmds::LineWidth
*>(cmd_data
);
2345 GLfloat width
= static_cast<GLfloat
>(c
.width
);
2346 if (width
<= 0.0f
|| std::isnan(width
)) {
2347 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "LineWidth", "width out of range");
2348 return error::kNoError
;
2350 if (state_
.line_width
!= width
) {
2351 state_
.line_width
= width
;
2354 return error::kNoError
;
2357 error::Error
GLES2DecoderImpl::HandleLinkProgram(uint32_t immediate_data_size
,
2358 const void* cmd_data
) {
2359 const gles2::cmds::LinkProgram
& c
=
2360 *static_cast<const gles2::cmds::LinkProgram
*>(cmd_data
);
2362 GLuint program
= c
.program
;
2363 DoLinkProgram(program
);
2364 return error::kNoError
;
2367 error::Error
GLES2DecoderImpl::HandlePauseTransformFeedback(
2368 uint32_t immediate_data_size
,
2369 const void* cmd_data
) {
2370 if (!unsafe_es3_apis_enabled())
2371 return error::kUnknownCommand
;
2372 const gles2::cmds::PauseTransformFeedback
& c
=
2373 *static_cast<const gles2::cmds::PauseTransformFeedback
*>(cmd_data
);
2375 glPauseTransformFeedback();
2376 return error::kNoError
;
2379 error::Error
GLES2DecoderImpl::HandlePolygonOffset(uint32_t immediate_data_size
,
2380 const void* cmd_data
) {
2381 const gles2::cmds::PolygonOffset
& c
=
2382 *static_cast<const gles2::cmds::PolygonOffset
*>(cmd_data
);
2384 GLfloat factor
= static_cast<GLfloat
>(c
.factor
);
2385 GLfloat units
= static_cast<GLfloat
>(c
.units
);
2386 if (state_
.polygon_offset_factor
!= factor
||
2387 state_
.polygon_offset_units
!= units
) {
2388 state_
.polygon_offset_factor
= factor
;
2389 state_
.polygon_offset_units
= units
;
2390 glPolygonOffset(factor
, units
);
2392 return error::kNoError
;
2395 error::Error
GLES2DecoderImpl::HandleReadBuffer(uint32_t immediate_data_size
,
2396 const void* cmd_data
) {
2397 if (!unsafe_es3_apis_enabled())
2398 return error::kUnknownCommand
;
2399 const gles2::cmds::ReadBuffer
& c
=
2400 *static_cast<const gles2::cmds::ReadBuffer
*>(cmd_data
);
2402 GLenum src
= static_cast<GLenum
>(c
.src
);
2404 return error::kNoError
;
2407 error::Error
GLES2DecoderImpl::HandleReleaseShaderCompiler(
2408 uint32_t immediate_data_size
,
2409 const void* cmd_data
) {
2410 const gles2::cmds::ReleaseShaderCompiler
& c
=
2411 *static_cast<const gles2::cmds::ReleaseShaderCompiler
*>(cmd_data
);
2413 DoReleaseShaderCompiler();
2414 return error::kNoError
;
2417 error::Error
GLES2DecoderImpl::HandleRenderbufferStorage(
2418 uint32_t immediate_data_size
,
2419 const void* cmd_data
) {
2420 const gles2::cmds::RenderbufferStorage
& c
=
2421 *static_cast<const gles2::cmds::RenderbufferStorage
*>(cmd_data
);
2423 GLenum target
= static_cast<GLenum
>(c
.target
);
2424 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
2425 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2426 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2427 if (!validators_
->render_buffer_target
.IsValid(target
)) {
2428 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorage", target
, "target");
2429 return error::kNoError
;
2431 if (!validators_
->render_buffer_format
.IsValid(internalformat
)) {
2432 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorage", internalformat
,
2434 return error::kNoError
;
2437 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorage", "width < 0");
2438 return error::kNoError
;
2441 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorage", "height < 0");
2442 return error::kNoError
;
2444 DoRenderbufferStorage(target
, internalformat
, width
, height
);
2445 return error::kNoError
;
2448 error::Error
GLES2DecoderImpl::HandleResumeTransformFeedback(
2449 uint32_t immediate_data_size
,
2450 const void* cmd_data
) {
2451 if (!unsafe_es3_apis_enabled())
2452 return error::kUnknownCommand
;
2453 const gles2::cmds::ResumeTransformFeedback
& c
=
2454 *static_cast<const gles2::cmds::ResumeTransformFeedback
*>(cmd_data
);
2456 glResumeTransformFeedback();
2457 return error::kNoError
;
2460 error::Error
GLES2DecoderImpl::HandleSampleCoverage(
2461 uint32_t immediate_data_size
,
2462 const void* cmd_data
) {
2463 const gles2::cmds::SampleCoverage
& c
=
2464 *static_cast<const gles2::cmds::SampleCoverage
*>(cmd_data
);
2466 GLclampf value
= static_cast<GLclampf
>(c
.value
);
2467 GLboolean invert
= static_cast<GLboolean
>(c
.invert
);
2468 DoSampleCoverage(value
, invert
);
2469 return error::kNoError
;
2472 error::Error
GLES2DecoderImpl::HandleSamplerParameterf(
2473 uint32_t immediate_data_size
,
2474 const void* cmd_data
) {
2475 if (!unsafe_es3_apis_enabled())
2476 return error::kUnknownCommand
;
2477 const gles2::cmds::SamplerParameterf
& c
=
2478 *static_cast<const gles2::cmds::SamplerParameterf
*>(cmd_data
);
2480 GLuint sampler
= c
.sampler
;
2481 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2482 GLfloat param
= static_cast<GLfloat
>(c
.param
);
2483 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
2484 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glSamplerParameterf",
2485 "invalid sampler id");
2486 return error::kNoError
;
2488 glSamplerParameterf(sampler
, pname
, param
);
2489 return error::kNoError
;
2492 error::Error
GLES2DecoderImpl::HandleSamplerParameterfvImmediate(
2493 uint32_t immediate_data_size
,
2494 const void* cmd_data
) {
2495 if (!unsafe_es3_apis_enabled())
2496 return error::kUnknownCommand
;
2497 const gles2::cmds::SamplerParameterfvImmediate
& c
=
2498 *static_cast<const gles2::cmds::SamplerParameterfvImmediate
*>(cmd_data
);
2500 GLuint sampler
= c
.sampler
;
2501 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2503 if (!ComputeDataSize(1, sizeof(GLfloat
), 1, &data_size
)) {
2504 return error::kOutOfBounds
;
2506 if (data_size
> immediate_data_size
) {
2507 return error::kOutOfBounds
;
2509 const GLfloat
* params
=
2510 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
2511 if (params
== NULL
) {
2512 return error::kOutOfBounds
;
2514 group_
->GetSamplerServiceId(sampler
, &sampler
);
2515 DoSamplerParameterfv(sampler
, pname
, params
);
2516 return error::kNoError
;
2519 error::Error
GLES2DecoderImpl::HandleSamplerParameteri(
2520 uint32_t immediate_data_size
,
2521 const void* cmd_data
) {
2522 if (!unsafe_es3_apis_enabled())
2523 return error::kUnknownCommand
;
2524 const gles2::cmds::SamplerParameteri
& c
=
2525 *static_cast<const gles2::cmds::SamplerParameteri
*>(cmd_data
);
2527 GLuint sampler
= c
.sampler
;
2528 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2529 GLint param
= static_cast<GLint
>(c
.param
);
2530 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
2531 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glSamplerParameteri",
2532 "invalid sampler id");
2533 return error::kNoError
;
2535 glSamplerParameteri(sampler
, pname
, param
);
2536 return error::kNoError
;
2539 error::Error
GLES2DecoderImpl::HandleSamplerParameterivImmediate(
2540 uint32_t immediate_data_size
,
2541 const void* cmd_data
) {
2542 if (!unsafe_es3_apis_enabled())
2543 return error::kUnknownCommand
;
2544 const gles2::cmds::SamplerParameterivImmediate
& c
=
2545 *static_cast<const gles2::cmds::SamplerParameterivImmediate
*>(cmd_data
);
2547 GLuint sampler
= c
.sampler
;
2548 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2550 if (!ComputeDataSize(1, sizeof(GLint
), 1, &data_size
)) {
2551 return error::kOutOfBounds
;
2553 if (data_size
> immediate_data_size
) {
2554 return error::kOutOfBounds
;
2556 const GLint
* params
=
2557 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
2558 if (params
== NULL
) {
2559 return error::kOutOfBounds
;
2561 DoSamplerParameteriv(sampler
, pname
, params
);
2562 return error::kNoError
;
2565 error::Error
GLES2DecoderImpl::HandleScissor(uint32_t immediate_data_size
,
2566 const void* cmd_data
) {
2567 const gles2::cmds::Scissor
& c
=
2568 *static_cast<const gles2::cmds::Scissor
*>(cmd_data
);
2570 GLint x
= static_cast<GLint
>(c
.x
);
2571 GLint y
= static_cast<GLint
>(c
.y
);
2572 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2573 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2575 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glScissor", "width < 0");
2576 return error::kNoError
;
2579 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glScissor", "height < 0");
2580 return error::kNoError
;
2582 if (state_
.scissor_x
!= x
|| state_
.scissor_y
!= y
||
2583 state_
.scissor_width
!= width
|| state_
.scissor_height
!= height
) {
2584 state_
.scissor_x
= x
;
2585 state_
.scissor_y
= y
;
2586 state_
.scissor_width
= width
;
2587 state_
.scissor_height
= height
;
2588 glScissor(x
, y
, width
, height
);
2590 return error::kNoError
;
2593 error::Error
GLES2DecoderImpl::HandleShaderSourceBucket(
2594 uint32_t immediate_data_size
,
2595 const void* cmd_data
) {
2596 const gles2::cmds::ShaderSourceBucket
& c
=
2597 *static_cast<const gles2::cmds::ShaderSourceBucket
*>(cmd_data
);
2599 GLuint shader
= static_cast<GLuint
>(c
.shader
);
2601 Bucket
* bucket
= GetBucket(c
.str_bucket_id
);
2603 return error::kInvalidArguments
;
2606 std::vector
<char*> strs
;
2607 std::vector
<GLint
> len
;
2608 if (!bucket
->GetAsStrings(&count
, &strs
, &len
)) {
2609 return error::kInvalidArguments
;
2612 strs
.size() > 0 ? const_cast<const char**>(&strs
[0]) : NULL
;
2613 const GLint
* length
=
2614 len
.size() > 0 ? const_cast<const GLint
*>(&len
[0]) : NULL
;
2616 DoShaderSource(shader
, count
, str
, length
);
2617 return error::kNoError
;
2620 error::Error
GLES2DecoderImpl::HandleStencilFunc(uint32_t immediate_data_size
,
2621 const void* cmd_data
) {
2622 const gles2::cmds::StencilFunc
& c
=
2623 *static_cast<const gles2::cmds::StencilFunc
*>(cmd_data
);
2625 GLenum func
= static_cast<GLenum
>(c
.func
);
2626 GLint ref
= static_cast<GLint
>(c
.ref
);
2627 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2628 if (!validators_
->cmp_function
.IsValid(func
)) {
2629 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFunc", func
, "func");
2630 return error::kNoError
;
2632 if (state_
.stencil_front_func
!= func
|| state_
.stencil_front_ref
!= ref
||
2633 state_
.stencil_front_mask
!= mask
|| state_
.stencil_back_func
!= func
||
2634 state_
.stencil_back_ref
!= ref
|| state_
.stencil_back_mask
!= mask
) {
2635 state_
.stencil_front_func
= func
;
2636 state_
.stencil_front_ref
= ref
;
2637 state_
.stencil_front_mask
= mask
;
2638 state_
.stencil_back_func
= func
;
2639 state_
.stencil_back_ref
= ref
;
2640 state_
.stencil_back_mask
= mask
;
2641 glStencilFunc(func
, ref
, mask
);
2643 return error::kNoError
;
2646 error::Error
GLES2DecoderImpl::HandleStencilFuncSeparate(
2647 uint32_t immediate_data_size
,
2648 const void* cmd_data
) {
2649 const gles2::cmds::StencilFuncSeparate
& c
=
2650 *static_cast<const gles2::cmds::StencilFuncSeparate
*>(cmd_data
);
2652 GLenum face
= static_cast<GLenum
>(c
.face
);
2653 GLenum func
= static_cast<GLenum
>(c
.func
);
2654 GLint ref
= static_cast<GLint
>(c
.ref
);
2655 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2656 if (!validators_
->face_type
.IsValid(face
)) {
2657 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFuncSeparate", face
, "face");
2658 return error::kNoError
;
2660 if (!validators_
->cmp_function
.IsValid(func
)) {
2661 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFuncSeparate", func
, "func");
2662 return error::kNoError
;
2664 bool changed
= false;
2665 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2666 changed
|= state_
.stencil_front_func
!= func
||
2667 state_
.stencil_front_ref
!= ref
||
2668 state_
.stencil_front_mask
!= mask
;
2670 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2671 changed
|= state_
.stencil_back_func
!= func
||
2672 state_
.stencil_back_ref
!= ref
||
2673 state_
.stencil_back_mask
!= mask
;
2676 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2677 state_
.stencil_front_func
= func
;
2678 state_
.stencil_front_ref
= ref
;
2679 state_
.stencil_front_mask
= mask
;
2681 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2682 state_
.stencil_back_func
= func
;
2683 state_
.stencil_back_ref
= ref
;
2684 state_
.stencil_back_mask
= mask
;
2686 glStencilFuncSeparate(face
, func
, ref
, mask
);
2688 return error::kNoError
;
2691 error::Error
GLES2DecoderImpl::HandleStencilMask(uint32_t immediate_data_size
,
2692 const void* cmd_data
) {
2693 const gles2::cmds::StencilMask
& c
=
2694 *static_cast<const gles2::cmds::StencilMask
*>(cmd_data
);
2696 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2697 if (state_
.stencil_front_writemask
!= mask
||
2698 state_
.stencil_back_writemask
!= mask
) {
2699 state_
.stencil_front_writemask
= mask
;
2700 state_
.stencil_back_writemask
= mask
;
2701 framebuffer_state_
.clear_state_dirty
= true;
2703 return error::kNoError
;
2706 error::Error
GLES2DecoderImpl::HandleStencilMaskSeparate(
2707 uint32_t immediate_data_size
,
2708 const void* cmd_data
) {
2709 const gles2::cmds::StencilMaskSeparate
& c
=
2710 *static_cast<const gles2::cmds::StencilMaskSeparate
*>(cmd_data
);
2712 GLenum face
= static_cast<GLenum
>(c
.face
);
2713 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2714 if (!validators_
->face_type
.IsValid(face
)) {
2715 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilMaskSeparate", face
, "face");
2716 return error::kNoError
;
2718 bool changed
= false;
2719 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2720 changed
|= state_
.stencil_front_writemask
!= mask
;
2722 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2723 changed
|= state_
.stencil_back_writemask
!= mask
;
2726 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2727 state_
.stencil_front_writemask
= mask
;
2729 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2730 state_
.stencil_back_writemask
= mask
;
2732 framebuffer_state_
.clear_state_dirty
= true;
2734 return error::kNoError
;
2737 error::Error
GLES2DecoderImpl::HandleStencilOp(uint32_t immediate_data_size
,
2738 const void* cmd_data
) {
2739 const gles2::cmds::StencilOp
& c
=
2740 *static_cast<const gles2::cmds::StencilOp
*>(cmd_data
);
2742 GLenum fail
= static_cast<GLenum
>(c
.fail
);
2743 GLenum zfail
= static_cast<GLenum
>(c
.zfail
);
2744 GLenum zpass
= static_cast<GLenum
>(c
.zpass
);
2745 if (!validators_
->stencil_op
.IsValid(fail
)) {
2746 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", fail
, "fail");
2747 return error::kNoError
;
2749 if (!validators_
->stencil_op
.IsValid(zfail
)) {
2750 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", zfail
, "zfail");
2751 return error::kNoError
;
2753 if (!validators_
->stencil_op
.IsValid(zpass
)) {
2754 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", zpass
, "zpass");
2755 return error::kNoError
;
2757 if (state_
.stencil_front_fail_op
!= fail
||
2758 state_
.stencil_front_z_fail_op
!= zfail
||
2759 state_
.stencil_front_z_pass_op
!= zpass
||
2760 state_
.stencil_back_fail_op
!= fail
||
2761 state_
.stencil_back_z_fail_op
!= zfail
||
2762 state_
.stencil_back_z_pass_op
!= zpass
) {
2763 state_
.stencil_front_fail_op
= fail
;
2764 state_
.stencil_front_z_fail_op
= zfail
;
2765 state_
.stencil_front_z_pass_op
= zpass
;
2766 state_
.stencil_back_fail_op
= fail
;
2767 state_
.stencil_back_z_fail_op
= zfail
;
2768 state_
.stencil_back_z_pass_op
= zpass
;
2769 glStencilOp(fail
, zfail
, zpass
);
2771 return error::kNoError
;
2774 error::Error
GLES2DecoderImpl::HandleStencilOpSeparate(
2775 uint32_t immediate_data_size
,
2776 const void* cmd_data
) {
2777 const gles2::cmds::StencilOpSeparate
& c
=
2778 *static_cast<const gles2::cmds::StencilOpSeparate
*>(cmd_data
);
2780 GLenum face
= static_cast<GLenum
>(c
.face
);
2781 GLenum fail
= static_cast<GLenum
>(c
.fail
);
2782 GLenum zfail
= static_cast<GLenum
>(c
.zfail
);
2783 GLenum zpass
= static_cast<GLenum
>(c
.zpass
);
2784 if (!validators_
->face_type
.IsValid(face
)) {
2785 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", face
, "face");
2786 return error::kNoError
;
2788 if (!validators_
->stencil_op
.IsValid(fail
)) {
2789 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", fail
, "fail");
2790 return error::kNoError
;
2792 if (!validators_
->stencil_op
.IsValid(zfail
)) {
2793 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", zfail
, "zfail");
2794 return error::kNoError
;
2796 if (!validators_
->stencil_op
.IsValid(zpass
)) {
2797 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", zpass
, "zpass");
2798 return error::kNoError
;
2800 bool changed
= false;
2801 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2802 changed
|= state_
.stencil_front_fail_op
!= fail
||
2803 state_
.stencil_front_z_fail_op
!= zfail
||
2804 state_
.stencil_front_z_pass_op
!= zpass
;
2806 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2807 changed
|= state_
.stencil_back_fail_op
!= fail
||
2808 state_
.stencil_back_z_fail_op
!= zfail
||
2809 state_
.stencil_back_z_pass_op
!= zpass
;
2812 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2813 state_
.stencil_front_fail_op
= fail
;
2814 state_
.stencil_front_z_fail_op
= zfail
;
2815 state_
.stencil_front_z_pass_op
= zpass
;
2817 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2818 state_
.stencil_back_fail_op
= fail
;
2819 state_
.stencil_back_z_fail_op
= zfail
;
2820 state_
.stencil_back_z_pass_op
= zpass
;
2822 glStencilOpSeparate(face
, fail
, zfail
, zpass
);
2824 return error::kNoError
;
2827 error::Error
GLES2DecoderImpl::HandleTexParameterf(uint32_t immediate_data_size
,
2828 const void* cmd_data
) {
2829 const gles2::cmds::TexParameterf
& c
=
2830 *static_cast<const gles2::cmds::TexParameterf
*>(cmd_data
);
2832 GLenum target
= static_cast<GLenum
>(c
.target
);
2833 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2834 GLfloat param
= static_cast<GLfloat
>(c
.param
);
2835 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2836 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterf", target
, "target");
2837 return error::kNoError
;
2839 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2840 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterf", pname
, "pname");
2841 return error::kNoError
;
2843 DoTexParameterf(target
, pname
, param
);
2844 return error::kNoError
;
2847 error::Error
GLES2DecoderImpl::HandleTexParameterfvImmediate(
2848 uint32_t immediate_data_size
,
2849 const void* cmd_data
) {
2850 const gles2::cmds::TexParameterfvImmediate
& c
=
2851 *static_cast<const gles2::cmds::TexParameterfvImmediate
*>(cmd_data
);
2853 GLenum target
= static_cast<GLenum
>(c
.target
);
2854 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2856 if (!ComputeDataSize(1, sizeof(GLfloat
), 1, &data_size
)) {
2857 return error::kOutOfBounds
;
2859 if (data_size
> immediate_data_size
) {
2860 return error::kOutOfBounds
;
2862 const GLfloat
* params
=
2863 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
2864 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2865 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", target
, "target");
2866 return error::kNoError
;
2868 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2869 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", pname
, "pname");
2870 return error::kNoError
;
2872 if (params
== NULL
) {
2873 return error::kOutOfBounds
;
2875 DoTexParameterfv(target
, pname
, params
);
2876 return error::kNoError
;
2879 error::Error
GLES2DecoderImpl::HandleTexParameteri(uint32_t immediate_data_size
,
2880 const void* cmd_data
) {
2881 const gles2::cmds::TexParameteri
& c
=
2882 *static_cast<const gles2::cmds::TexParameteri
*>(cmd_data
);
2884 GLenum target
= static_cast<GLenum
>(c
.target
);
2885 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2886 GLint param
= static_cast<GLint
>(c
.param
);
2887 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2888 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", target
, "target");
2889 return error::kNoError
;
2891 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2892 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", pname
, "pname");
2893 return error::kNoError
;
2895 DoTexParameteri(target
, pname
, param
);
2896 return error::kNoError
;
2899 error::Error
GLES2DecoderImpl::HandleTexParameterivImmediate(
2900 uint32_t immediate_data_size
,
2901 const void* cmd_data
) {
2902 const gles2::cmds::TexParameterivImmediate
& c
=
2903 *static_cast<const gles2::cmds::TexParameterivImmediate
*>(cmd_data
);
2905 GLenum target
= static_cast<GLenum
>(c
.target
);
2906 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2908 if (!ComputeDataSize(1, sizeof(GLint
), 1, &data_size
)) {
2909 return error::kOutOfBounds
;
2911 if (data_size
> immediate_data_size
) {
2912 return error::kOutOfBounds
;
2914 const GLint
* params
=
2915 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
2916 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2917 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", target
, "target");
2918 return error::kNoError
;
2920 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2921 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", pname
, "pname");
2922 return error::kNoError
;
2924 if (params
== NULL
) {
2925 return error::kOutOfBounds
;
2927 DoTexParameteriv(target
, pname
, params
);
2928 return error::kNoError
;
2931 error::Error
GLES2DecoderImpl::HandleTexStorage3D(uint32_t immediate_data_size
,
2932 const void* cmd_data
) {
2933 if (!unsafe_es3_apis_enabled())
2934 return error::kUnknownCommand
;
2935 const gles2::cmds::TexStorage3D
& c
=
2936 *static_cast<const gles2::cmds::TexStorage3D
*>(cmd_data
);
2938 GLenum target
= static_cast<GLenum
>(c
.target
);
2939 GLsizei levels
= static_cast<GLsizei
>(c
.levels
);
2940 GLenum internalFormat
= static_cast<GLenum
>(c
.internalFormat
);
2941 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2942 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2943 GLsizei depth
= static_cast<GLsizei
>(c
.depth
);
2944 glTexStorage3D(target
, levels
, internalFormat
, width
, height
, depth
);
2945 return error::kNoError
;
2948 error::Error
GLES2DecoderImpl::HandleTransformFeedbackVaryingsBucket(
2949 uint32_t immediate_data_size
,
2950 const void* cmd_data
) {
2951 if (!unsafe_es3_apis_enabled())
2952 return error::kUnknownCommand
;
2953 const gles2::cmds::TransformFeedbackVaryingsBucket
& c
=
2954 *static_cast<const gles2::cmds::TransformFeedbackVaryingsBucket
*>(
2957 GLuint program
= static_cast<GLuint
>(c
.program
);
2959 Bucket
* bucket
= GetBucket(c
.varyings_bucket_id
);
2961 return error::kInvalidArguments
;
2964 std::vector
<char*> strs
;
2965 std::vector
<GLint
> len
;
2966 if (!bucket
->GetAsStrings(&count
, &strs
, &len
)) {
2967 return error::kInvalidArguments
;
2969 const char** varyings
=
2970 strs
.size() > 0 ? const_cast<const char**>(&strs
[0]) : NULL
;
2971 const GLint
* length
=
2972 len
.size() > 0 ? const_cast<const GLint
*>(&len
[0]) : NULL
;
2974 GLenum buffermode
= static_cast<GLenum
>(c
.buffermode
);
2975 DoTransformFeedbackVaryings(program
, count
, varyings
, buffermode
);
2976 return error::kNoError
;
2979 error::Error
GLES2DecoderImpl::HandleUniform1f(uint32_t immediate_data_size
,
2980 const void* cmd_data
) {
2981 const gles2::cmds::Uniform1f
& c
=
2982 *static_cast<const gles2::cmds::Uniform1f
*>(cmd_data
);
2984 GLint location
= static_cast<GLint
>(c
.location
);
2985 GLfloat x
= static_cast<GLfloat
>(c
.x
);
2989 DoUniform1fv(location
, 1, &temp
[0]);
2990 return error::kNoError
;
2993 error::Error
GLES2DecoderImpl::HandleUniform1fvImmediate(
2994 uint32_t immediate_data_size
,
2995 const void* cmd_data
) {
2996 const gles2::cmds::Uniform1fvImmediate
& c
=
2997 *static_cast<const gles2::cmds::Uniform1fvImmediate
*>(cmd_data
);
2999 GLint location
= static_cast<GLint
>(c
.location
);
3000 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3002 if (!ComputeDataSize(count
, sizeof(GLfloat
), 1, &data_size
)) {
3003 return error::kOutOfBounds
;
3005 if (data_size
> immediate_data_size
) {
3006 return error::kOutOfBounds
;
3009 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3011 return error::kOutOfBounds
;
3013 DoUniform1fv(location
, count
, v
);
3014 return error::kNoError
;
3017 error::Error
GLES2DecoderImpl::HandleUniform1i(uint32_t immediate_data_size
,
3018 const void* cmd_data
) {
3019 const gles2::cmds::Uniform1i
& c
=
3020 *static_cast<const gles2::cmds::Uniform1i
*>(cmd_data
);
3022 GLint location
= static_cast<GLint
>(c
.location
);
3023 GLint x
= static_cast<GLint
>(c
.x
);
3024 DoUniform1i(location
, x
);
3025 return error::kNoError
;
3028 error::Error
GLES2DecoderImpl::HandleUniform1ivImmediate(
3029 uint32_t immediate_data_size
,
3030 const void* cmd_data
) {
3031 const gles2::cmds::Uniform1ivImmediate
& c
=
3032 *static_cast<const gles2::cmds::Uniform1ivImmediate
*>(cmd_data
);
3034 GLint location
= static_cast<GLint
>(c
.location
);
3035 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3037 if (!ComputeDataSize(count
, sizeof(GLint
), 1, &data_size
)) {
3038 return error::kOutOfBounds
;
3040 if (data_size
> immediate_data_size
) {
3041 return error::kOutOfBounds
;
3044 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3046 return error::kOutOfBounds
;
3048 DoUniform1iv(location
, count
, v
);
3049 return error::kNoError
;
3052 error::Error
GLES2DecoderImpl::HandleUniform1ui(uint32_t immediate_data_size
,
3053 const void* cmd_data
) {
3054 if (!unsafe_es3_apis_enabled())
3055 return error::kUnknownCommand
;
3056 const gles2::cmds::Uniform1ui
& c
=
3057 *static_cast<const gles2::cmds::Uniform1ui
*>(cmd_data
);
3059 GLint location
= static_cast<GLint
>(c
.location
);
3060 GLuint x
= static_cast<GLuint
>(c
.x
);
3064 glUniform1uiv(location
, 1, &temp
[0]);
3065 return error::kNoError
;
3068 error::Error
GLES2DecoderImpl::HandleUniform1uivImmediate(
3069 uint32_t immediate_data_size
,
3070 const void* cmd_data
) {
3071 if (!unsafe_es3_apis_enabled())
3072 return error::kUnknownCommand
;
3073 const gles2::cmds::Uniform1uivImmediate
& c
=
3074 *static_cast<const gles2::cmds::Uniform1uivImmediate
*>(cmd_data
);
3076 GLint location
= static_cast<GLint
>(c
.location
);
3077 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3079 if (!ComputeDataSize(count
, sizeof(GLuint
), 1, &data_size
)) {
3080 return error::kOutOfBounds
;
3082 if (data_size
> immediate_data_size
) {
3083 return error::kOutOfBounds
;
3086 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3088 return error::kOutOfBounds
;
3090 glUniform1uiv(location
, count
, v
);
3091 return error::kNoError
;
3094 error::Error
GLES2DecoderImpl::HandleUniform2f(uint32_t immediate_data_size
,
3095 const void* cmd_data
) {
3096 const gles2::cmds::Uniform2f
& c
=
3097 *static_cast<const gles2::cmds::Uniform2f
*>(cmd_data
);
3099 GLint location
= static_cast<GLint
>(c
.location
);
3100 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3101 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3105 DoUniform2fv(location
, 1, &temp
[0]);
3106 return error::kNoError
;
3109 error::Error
GLES2DecoderImpl::HandleUniform2fvImmediate(
3110 uint32_t immediate_data_size
,
3111 const void* cmd_data
) {
3112 const gles2::cmds::Uniform2fvImmediate
& c
=
3113 *static_cast<const gles2::cmds::Uniform2fvImmediate
*>(cmd_data
);
3115 GLint location
= static_cast<GLint
>(c
.location
);
3116 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3118 if (!ComputeDataSize(count
, sizeof(GLfloat
), 2, &data_size
)) {
3119 return error::kOutOfBounds
;
3121 if (data_size
> immediate_data_size
) {
3122 return error::kOutOfBounds
;
3125 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3127 return error::kOutOfBounds
;
3129 DoUniform2fv(location
, count
, v
);
3130 return error::kNoError
;
3133 error::Error
GLES2DecoderImpl::HandleUniform2i(uint32_t immediate_data_size
,
3134 const void* cmd_data
) {
3135 const gles2::cmds::Uniform2i
& c
=
3136 *static_cast<const gles2::cmds::Uniform2i
*>(cmd_data
);
3138 GLint location
= static_cast<GLint
>(c
.location
);
3139 GLint x
= static_cast<GLint
>(c
.x
);
3140 GLint y
= static_cast<GLint
>(c
.y
);
3144 DoUniform2iv(location
, 1, &temp
[0]);
3145 return error::kNoError
;
3148 error::Error
GLES2DecoderImpl::HandleUniform2ivImmediate(
3149 uint32_t immediate_data_size
,
3150 const void* cmd_data
) {
3151 const gles2::cmds::Uniform2ivImmediate
& c
=
3152 *static_cast<const gles2::cmds::Uniform2ivImmediate
*>(cmd_data
);
3154 GLint location
= static_cast<GLint
>(c
.location
);
3155 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3157 if (!ComputeDataSize(count
, sizeof(GLint
), 2, &data_size
)) {
3158 return error::kOutOfBounds
;
3160 if (data_size
> immediate_data_size
) {
3161 return error::kOutOfBounds
;
3164 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3166 return error::kOutOfBounds
;
3168 DoUniform2iv(location
, count
, v
);
3169 return error::kNoError
;
3172 error::Error
GLES2DecoderImpl::HandleUniform2ui(uint32_t immediate_data_size
,
3173 const void* cmd_data
) {
3174 if (!unsafe_es3_apis_enabled())
3175 return error::kUnknownCommand
;
3176 const gles2::cmds::Uniform2ui
& c
=
3177 *static_cast<const gles2::cmds::Uniform2ui
*>(cmd_data
);
3179 GLint location
= static_cast<GLint
>(c
.location
);
3180 GLuint x
= static_cast<GLuint
>(c
.x
);
3181 GLuint y
= static_cast<GLuint
>(c
.y
);
3185 glUniform2uiv(location
, 1, &temp
[0]);
3186 return error::kNoError
;
3189 error::Error
GLES2DecoderImpl::HandleUniform2uivImmediate(
3190 uint32_t immediate_data_size
,
3191 const void* cmd_data
) {
3192 if (!unsafe_es3_apis_enabled())
3193 return error::kUnknownCommand
;
3194 const gles2::cmds::Uniform2uivImmediate
& c
=
3195 *static_cast<const gles2::cmds::Uniform2uivImmediate
*>(cmd_data
);
3197 GLint location
= static_cast<GLint
>(c
.location
);
3198 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3200 if (!ComputeDataSize(count
, sizeof(GLuint
), 2, &data_size
)) {
3201 return error::kOutOfBounds
;
3203 if (data_size
> immediate_data_size
) {
3204 return error::kOutOfBounds
;
3207 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3209 return error::kOutOfBounds
;
3211 glUniform2uiv(location
, count
, v
);
3212 return error::kNoError
;
3215 error::Error
GLES2DecoderImpl::HandleUniform3f(uint32_t immediate_data_size
,
3216 const void* cmd_data
) {
3217 const gles2::cmds::Uniform3f
& c
=
3218 *static_cast<const gles2::cmds::Uniform3f
*>(cmd_data
);
3220 GLint location
= static_cast<GLint
>(c
.location
);
3221 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3222 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3223 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3227 DoUniform3fv(location
, 1, &temp
[0]);
3228 return error::kNoError
;
3231 error::Error
GLES2DecoderImpl::HandleUniform3fvImmediate(
3232 uint32_t immediate_data_size
,
3233 const void* cmd_data
) {
3234 const gles2::cmds::Uniform3fvImmediate
& c
=
3235 *static_cast<const gles2::cmds::Uniform3fvImmediate
*>(cmd_data
);
3237 GLint location
= static_cast<GLint
>(c
.location
);
3238 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3240 if (!ComputeDataSize(count
, sizeof(GLfloat
), 3, &data_size
)) {
3241 return error::kOutOfBounds
;
3243 if (data_size
> immediate_data_size
) {
3244 return error::kOutOfBounds
;
3247 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3249 return error::kOutOfBounds
;
3251 DoUniform3fv(location
, count
, v
);
3252 return error::kNoError
;
3255 error::Error
GLES2DecoderImpl::HandleUniform3i(uint32_t immediate_data_size
,
3256 const void* cmd_data
) {
3257 const gles2::cmds::Uniform3i
& c
=
3258 *static_cast<const gles2::cmds::Uniform3i
*>(cmd_data
);
3260 GLint location
= static_cast<GLint
>(c
.location
);
3261 GLint x
= static_cast<GLint
>(c
.x
);
3262 GLint y
= static_cast<GLint
>(c
.y
);
3263 GLint z
= static_cast<GLint
>(c
.z
);
3267 DoUniform3iv(location
, 1, &temp
[0]);
3268 return error::kNoError
;
3271 error::Error
GLES2DecoderImpl::HandleUniform3ivImmediate(
3272 uint32_t immediate_data_size
,
3273 const void* cmd_data
) {
3274 const gles2::cmds::Uniform3ivImmediate
& c
=
3275 *static_cast<const gles2::cmds::Uniform3ivImmediate
*>(cmd_data
);
3277 GLint location
= static_cast<GLint
>(c
.location
);
3278 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3280 if (!ComputeDataSize(count
, sizeof(GLint
), 3, &data_size
)) {
3281 return error::kOutOfBounds
;
3283 if (data_size
> immediate_data_size
) {
3284 return error::kOutOfBounds
;
3287 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3289 return error::kOutOfBounds
;
3291 DoUniform3iv(location
, count
, v
);
3292 return error::kNoError
;
3295 error::Error
GLES2DecoderImpl::HandleUniform3ui(uint32_t immediate_data_size
,
3296 const void* cmd_data
) {
3297 if (!unsafe_es3_apis_enabled())
3298 return error::kUnknownCommand
;
3299 const gles2::cmds::Uniform3ui
& c
=
3300 *static_cast<const gles2::cmds::Uniform3ui
*>(cmd_data
);
3302 GLint location
= static_cast<GLint
>(c
.location
);
3303 GLuint x
= static_cast<GLuint
>(c
.x
);
3304 GLuint y
= static_cast<GLuint
>(c
.y
);
3305 GLuint z
= static_cast<GLuint
>(c
.z
);
3309 glUniform3uiv(location
, 1, &temp
[0]);
3310 return error::kNoError
;
3313 error::Error
GLES2DecoderImpl::HandleUniform3uivImmediate(
3314 uint32_t immediate_data_size
,
3315 const void* cmd_data
) {
3316 if (!unsafe_es3_apis_enabled())
3317 return error::kUnknownCommand
;
3318 const gles2::cmds::Uniform3uivImmediate
& c
=
3319 *static_cast<const gles2::cmds::Uniform3uivImmediate
*>(cmd_data
);
3321 GLint location
= static_cast<GLint
>(c
.location
);
3322 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3324 if (!ComputeDataSize(count
, sizeof(GLuint
), 3, &data_size
)) {
3325 return error::kOutOfBounds
;
3327 if (data_size
> immediate_data_size
) {
3328 return error::kOutOfBounds
;
3331 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3333 return error::kOutOfBounds
;
3335 glUniform3uiv(location
, count
, v
);
3336 return error::kNoError
;
3339 error::Error
GLES2DecoderImpl::HandleUniform4f(uint32_t immediate_data_size
,
3340 const void* cmd_data
) {
3341 const gles2::cmds::Uniform4f
& c
=
3342 *static_cast<const gles2::cmds::Uniform4f
*>(cmd_data
);
3344 GLint location
= static_cast<GLint
>(c
.location
);
3345 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3346 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3347 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3348 GLfloat w
= static_cast<GLfloat
>(c
.w
);
3352 DoUniform4fv(location
, 1, &temp
[0]);
3353 return error::kNoError
;
3356 error::Error
GLES2DecoderImpl::HandleUniform4fvImmediate(
3357 uint32_t immediate_data_size
,
3358 const void* cmd_data
) {
3359 const gles2::cmds::Uniform4fvImmediate
& c
=
3360 *static_cast<const gles2::cmds::Uniform4fvImmediate
*>(cmd_data
);
3362 GLint location
= static_cast<GLint
>(c
.location
);
3363 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3365 if (!ComputeDataSize(count
, sizeof(GLfloat
), 4, &data_size
)) {
3366 return error::kOutOfBounds
;
3368 if (data_size
> immediate_data_size
) {
3369 return error::kOutOfBounds
;
3372 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3374 return error::kOutOfBounds
;
3376 DoUniform4fv(location
, count
, v
);
3377 return error::kNoError
;
3380 error::Error
GLES2DecoderImpl::HandleUniform4i(uint32_t immediate_data_size
,
3381 const void* cmd_data
) {
3382 const gles2::cmds::Uniform4i
& c
=
3383 *static_cast<const gles2::cmds::Uniform4i
*>(cmd_data
);
3385 GLint location
= static_cast<GLint
>(c
.location
);
3386 GLint x
= static_cast<GLint
>(c
.x
);
3387 GLint y
= static_cast<GLint
>(c
.y
);
3388 GLint z
= static_cast<GLint
>(c
.z
);
3389 GLint w
= static_cast<GLint
>(c
.w
);
3393 DoUniform4iv(location
, 1, &temp
[0]);
3394 return error::kNoError
;
3397 error::Error
GLES2DecoderImpl::HandleUniform4ivImmediate(
3398 uint32_t immediate_data_size
,
3399 const void* cmd_data
) {
3400 const gles2::cmds::Uniform4ivImmediate
& c
=
3401 *static_cast<const gles2::cmds::Uniform4ivImmediate
*>(cmd_data
);
3403 GLint location
= static_cast<GLint
>(c
.location
);
3404 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3406 if (!ComputeDataSize(count
, sizeof(GLint
), 4, &data_size
)) {
3407 return error::kOutOfBounds
;
3409 if (data_size
> immediate_data_size
) {
3410 return error::kOutOfBounds
;
3413 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3415 return error::kOutOfBounds
;
3417 DoUniform4iv(location
, count
, v
);
3418 return error::kNoError
;
3421 error::Error
GLES2DecoderImpl::HandleUniform4ui(uint32_t immediate_data_size
,
3422 const void* cmd_data
) {
3423 if (!unsafe_es3_apis_enabled())
3424 return error::kUnknownCommand
;
3425 const gles2::cmds::Uniform4ui
& c
=
3426 *static_cast<const gles2::cmds::Uniform4ui
*>(cmd_data
);
3428 GLint location
= static_cast<GLint
>(c
.location
);
3429 GLuint x
= static_cast<GLuint
>(c
.x
);
3430 GLuint y
= static_cast<GLuint
>(c
.y
);
3431 GLuint z
= static_cast<GLuint
>(c
.z
);
3432 GLuint w
= static_cast<GLuint
>(c
.w
);
3436 glUniform4uiv(location
, 1, &temp
[0]);
3437 return error::kNoError
;
3440 error::Error
GLES2DecoderImpl::HandleUniform4uivImmediate(
3441 uint32_t immediate_data_size
,
3442 const void* cmd_data
) {
3443 if (!unsafe_es3_apis_enabled())
3444 return error::kUnknownCommand
;
3445 const gles2::cmds::Uniform4uivImmediate
& c
=
3446 *static_cast<const gles2::cmds::Uniform4uivImmediate
*>(cmd_data
);
3448 GLint location
= static_cast<GLint
>(c
.location
);
3449 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3451 if (!ComputeDataSize(count
, sizeof(GLuint
), 4, &data_size
)) {
3452 return error::kOutOfBounds
;
3454 if (data_size
> immediate_data_size
) {
3455 return error::kOutOfBounds
;
3458 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3460 return error::kOutOfBounds
;
3462 glUniform4uiv(location
, count
, v
);
3463 return error::kNoError
;
3466 error::Error
GLES2DecoderImpl::HandleUniformMatrix2fvImmediate(
3467 uint32_t immediate_data_size
,
3468 const void* cmd_data
) {
3469 const gles2::cmds::UniformMatrix2fvImmediate
& c
=
3470 *static_cast<const gles2::cmds::UniformMatrix2fvImmediate
*>(cmd_data
);
3472 GLint location
= static_cast<GLint
>(c
.location
);
3473 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3474 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3476 if (!ComputeDataSize(count
, sizeof(GLfloat
), 4, &data_size
)) {
3477 return error::kOutOfBounds
;
3479 if (data_size
> immediate_data_size
) {
3480 return error::kOutOfBounds
;
3482 const GLfloat
* value
=
3483 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3484 if (value
== NULL
) {
3485 return error::kOutOfBounds
;
3487 DoUniformMatrix2fv(location
, count
, transpose
, value
);
3488 return error::kNoError
;
3491 error::Error
GLES2DecoderImpl::HandleUniformMatrix2x3fvImmediate(
3492 uint32_t immediate_data_size
,
3493 const void* cmd_data
) {
3494 if (!unsafe_es3_apis_enabled())
3495 return error::kUnknownCommand
;
3496 const gles2::cmds::UniformMatrix2x3fvImmediate
& c
=
3497 *static_cast<const gles2::cmds::UniformMatrix2x3fvImmediate
*>(cmd_data
);
3499 GLint location
= static_cast<GLint
>(c
.location
);
3500 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3501 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3503 if (!ComputeDataSize(count
, sizeof(GLfloat
), 6, &data_size
)) {
3504 return error::kOutOfBounds
;
3506 if (data_size
> immediate_data_size
) {
3507 return error::kOutOfBounds
;
3509 const GLfloat
* value
=
3510 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3511 if (value
== NULL
) {
3512 return error::kOutOfBounds
;
3514 glUniformMatrix2x3fv(location
, count
, transpose
, value
);
3515 return error::kNoError
;
3518 error::Error
GLES2DecoderImpl::HandleUniformMatrix2x4fvImmediate(
3519 uint32_t immediate_data_size
,
3520 const void* cmd_data
) {
3521 if (!unsafe_es3_apis_enabled())
3522 return error::kUnknownCommand
;
3523 const gles2::cmds::UniformMatrix2x4fvImmediate
& c
=
3524 *static_cast<const gles2::cmds::UniformMatrix2x4fvImmediate
*>(cmd_data
);
3526 GLint location
= static_cast<GLint
>(c
.location
);
3527 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3528 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3530 if (!ComputeDataSize(count
, sizeof(GLfloat
), 8, &data_size
)) {
3531 return error::kOutOfBounds
;
3533 if (data_size
> immediate_data_size
) {
3534 return error::kOutOfBounds
;
3536 const GLfloat
* value
=
3537 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3538 if (value
== NULL
) {
3539 return error::kOutOfBounds
;
3541 glUniformMatrix2x4fv(location
, count
, transpose
, value
);
3542 return error::kNoError
;
3545 error::Error
GLES2DecoderImpl::HandleUniformMatrix3fvImmediate(
3546 uint32_t immediate_data_size
,
3547 const void* cmd_data
) {
3548 const gles2::cmds::UniformMatrix3fvImmediate
& c
=
3549 *static_cast<const gles2::cmds::UniformMatrix3fvImmediate
*>(cmd_data
);
3551 GLint location
= static_cast<GLint
>(c
.location
);
3552 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3553 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3555 if (!ComputeDataSize(count
, sizeof(GLfloat
), 9, &data_size
)) {
3556 return error::kOutOfBounds
;
3558 if (data_size
> immediate_data_size
) {
3559 return error::kOutOfBounds
;
3561 const GLfloat
* value
=
3562 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3563 if (value
== NULL
) {
3564 return error::kOutOfBounds
;
3566 DoUniformMatrix3fv(location
, count
, transpose
, value
);
3567 return error::kNoError
;
3570 error::Error
GLES2DecoderImpl::HandleUniformMatrix3x2fvImmediate(
3571 uint32_t immediate_data_size
,
3572 const void* cmd_data
) {
3573 if (!unsafe_es3_apis_enabled())
3574 return error::kUnknownCommand
;
3575 const gles2::cmds::UniformMatrix3x2fvImmediate
& c
=
3576 *static_cast<const gles2::cmds::UniformMatrix3x2fvImmediate
*>(cmd_data
);
3578 GLint location
= static_cast<GLint
>(c
.location
);
3579 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3580 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3582 if (!ComputeDataSize(count
, sizeof(GLfloat
), 6, &data_size
)) {
3583 return error::kOutOfBounds
;
3585 if (data_size
> immediate_data_size
) {
3586 return error::kOutOfBounds
;
3588 const GLfloat
* value
=
3589 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3590 if (value
== NULL
) {
3591 return error::kOutOfBounds
;
3593 glUniformMatrix3x2fv(location
, count
, transpose
, value
);
3594 return error::kNoError
;
3597 error::Error
GLES2DecoderImpl::HandleUniformMatrix3x4fvImmediate(
3598 uint32_t immediate_data_size
,
3599 const void* cmd_data
) {
3600 if (!unsafe_es3_apis_enabled())
3601 return error::kUnknownCommand
;
3602 const gles2::cmds::UniformMatrix3x4fvImmediate
& c
=
3603 *static_cast<const gles2::cmds::UniformMatrix3x4fvImmediate
*>(cmd_data
);
3605 GLint location
= static_cast<GLint
>(c
.location
);
3606 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3607 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3609 if (!ComputeDataSize(count
, sizeof(GLfloat
), 12, &data_size
)) {
3610 return error::kOutOfBounds
;
3612 if (data_size
> immediate_data_size
) {
3613 return error::kOutOfBounds
;
3615 const GLfloat
* value
=
3616 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3617 if (value
== NULL
) {
3618 return error::kOutOfBounds
;
3620 glUniformMatrix3x4fv(location
, count
, transpose
, value
);
3621 return error::kNoError
;
3624 error::Error
GLES2DecoderImpl::HandleUniformMatrix4fvImmediate(
3625 uint32_t immediate_data_size
,
3626 const void* cmd_data
) {
3627 const gles2::cmds::UniformMatrix4fvImmediate
& c
=
3628 *static_cast<const gles2::cmds::UniformMatrix4fvImmediate
*>(cmd_data
);
3630 GLint location
= static_cast<GLint
>(c
.location
);
3631 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3632 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3634 if (!ComputeDataSize(count
, sizeof(GLfloat
), 16, &data_size
)) {
3635 return error::kOutOfBounds
;
3637 if (data_size
> immediate_data_size
) {
3638 return error::kOutOfBounds
;
3640 const GLfloat
* value
=
3641 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3642 if (value
== NULL
) {
3643 return error::kOutOfBounds
;
3645 DoUniformMatrix4fv(location
, count
, transpose
, value
);
3646 return error::kNoError
;
3649 error::Error
GLES2DecoderImpl::HandleUniformMatrix4x2fvImmediate(
3650 uint32_t immediate_data_size
,
3651 const void* cmd_data
) {
3652 if (!unsafe_es3_apis_enabled())
3653 return error::kUnknownCommand
;
3654 const gles2::cmds::UniformMatrix4x2fvImmediate
& c
=
3655 *static_cast<const gles2::cmds::UniformMatrix4x2fvImmediate
*>(cmd_data
);
3657 GLint location
= static_cast<GLint
>(c
.location
);
3658 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3659 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3661 if (!ComputeDataSize(count
, sizeof(GLfloat
), 8, &data_size
)) {
3662 return error::kOutOfBounds
;
3664 if (data_size
> immediate_data_size
) {
3665 return error::kOutOfBounds
;
3667 const GLfloat
* value
=
3668 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3669 if (value
== NULL
) {
3670 return error::kOutOfBounds
;
3672 glUniformMatrix4x2fv(location
, count
, transpose
, value
);
3673 return error::kNoError
;
3676 error::Error
GLES2DecoderImpl::HandleUniformMatrix4x3fvImmediate(
3677 uint32_t immediate_data_size
,
3678 const void* cmd_data
) {
3679 if (!unsafe_es3_apis_enabled())
3680 return error::kUnknownCommand
;
3681 const gles2::cmds::UniformMatrix4x3fvImmediate
& c
=
3682 *static_cast<const gles2::cmds::UniformMatrix4x3fvImmediate
*>(cmd_data
);
3684 GLint location
= static_cast<GLint
>(c
.location
);
3685 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3686 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3688 if (!ComputeDataSize(count
, sizeof(GLfloat
), 12, &data_size
)) {
3689 return error::kOutOfBounds
;
3691 if (data_size
> immediate_data_size
) {
3692 return error::kOutOfBounds
;
3694 const GLfloat
* value
=
3695 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3696 if (value
== NULL
) {
3697 return error::kOutOfBounds
;
3699 glUniformMatrix4x3fv(location
, count
, transpose
, value
);
3700 return error::kNoError
;
3703 error::Error
GLES2DecoderImpl::HandleUseProgram(uint32_t immediate_data_size
,
3704 const void* cmd_data
) {
3705 const gles2::cmds::UseProgram
& c
=
3706 *static_cast<const gles2::cmds::UseProgram
*>(cmd_data
);
3708 GLuint program
= c
.program
;
3709 DoUseProgram(program
);
3710 return error::kNoError
;
3713 error::Error
GLES2DecoderImpl::HandleValidateProgram(
3714 uint32_t immediate_data_size
,
3715 const void* cmd_data
) {
3716 const gles2::cmds::ValidateProgram
& c
=
3717 *static_cast<const gles2::cmds::ValidateProgram
*>(cmd_data
);
3719 GLuint program
= c
.program
;
3720 DoValidateProgram(program
);
3721 return error::kNoError
;
3724 error::Error
GLES2DecoderImpl::HandleVertexAttrib1f(
3725 uint32_t immediate_data_size
,
3726 const void* cmd_data
) {
3727 const gles2::cmds::VertexAttrib1f
& c
=
3728 *static_cast<const gles2::cmds::VertexAttrib1f
*>(cmd_data
);
3730 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3731 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3732 DoVertexAttrib1f(indx
, x
);
3733 return error::kNoError
;
3736 error::Error
GLES2DecoderImpl::HandleVertexAttrib1fvImmediate(
3737 uint32_t immediate_data_size
,
3738 const void* cmd_data
) {
3739 const gles2::cmds::VertexAttrib1fvImmediate
& c
=
3740 *static_cast<const gles2::cmds::VertexAttrib1fvImmediate
*>(cmd_data
);
3742 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3744 if (!ComputeDataSize(1, sizeof(GLfloat
), 1, &data_size
)) {
3745 return error::kOutOfBounds
;
3747 if (data_size
> immediate_data_size
) {
3748 return error::kOutOfBounds
;
3750 const GLfloat
* values
=
3751 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3752 if (values
== NULL
) {
3753 return error::kOutOfBounds
;
3755 DoVertexAttrib1fv(indx
, values
);
3756 return error::kNoError
;
3759 error::Error
GLES2DecoderImpl::HandleVertexAttrib2f(
3760 uint32_t immediate_data_size
,
3761 const void* cmd_data
) {
3762 const gles2::cmds::VertexAttrib2f
& c
=
3763 *static_cast<const gles2::cmds::VertexAttrib2f
*>(cmd_data
);
3765 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3766 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3767 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3768 DoVertexAttrib2f(indx
, x
, y
);
3769 return error::kNoError
;
3772 error::Error
GLES2DecoderImpl::HandleVertexAttrib2fvImmediate(
3773 uint32_t immediate_data_size
,
3774 const void* cmd_data
) {
3775 const gles2::cmds::VertexAttrib2fvImmediate
& c
=
3776 *static_cast<const gles2::cmds::VertexAttrib2fvImmediate
*>(cmd_data
);
3778 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3780 if (!ComputeDataSize(1, sizeof(GLfloat
), 2, &data_size
)) {
3781 return error::kOutOfBounds
;
3783 if (data_size
> immediate_data_size
) {
3784 return error::kOutOfBounds
;
3786 const GLfloat
* values
=
3787 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3788 if (values
== NULL
) {
3789 return error::kOutOfBounds
;
3791 DoVertexAttrib2fv(indx
, values
);
3792 return error::kNoError
;
3795 error::Error
GLES2DecoderImpl::HandleVertexAttrib3f(
3796 uint32_t immediate_data_size
,
3797 const void* cmd_data
) {
3798 const gles2::cmds::VertexAttrib3f
& c
=
3799 *static_cast<const gles2::cmds::VertexAttrib3f
*>(cmd_data
);
3801 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3802 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3803 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3804 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3805 DoVertexAttrib3f(indx
, x
, y
, z
);
3806 return error::kNoError
;
3809 error::Error
GLES2DecoderImpl::HandleVertexAttrib3fvImmediate(
3810 uint32_t immediate_data_size
,
3811 const void* cmd_data
) {
3812 const gles2::cmds::VertexAttrib3fvImmediate
& c
=
3813 *static_cast<const gles2::cmds::VertexAttrib3fvImmediate
*>(cmd_data
);
3815 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3817 if (!ComputeDataSize(1, sizeof(GLfloat
), 3, &data_size
)) {
3818 return error::kOutOfBounds
;
3820 if (data_size
> immediate_data_size
) {
3821 return error::kOutOfBounds
;
3823 const GLfloat
* values
=
3824 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3825 if (values
== NULL
) {
3826 return error::kOutOfBounds
;
3828 DoVertexAttrib3fv(indx
, values
);
3829 return error::kNoError
;
3832 error::Error
GLES2DecoderImpl::HandleVertexAttrib4f(
3833 uint32_t immediate_data_size
,
3834 const void* cmd_data
) {
3835 const gles2::cmds::VertexAttrib4f
& c
=
3836 *static_cast<const gles2::cmds::VertexAttrib4f
*>(cmd_data
);
3838 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3839 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3840 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3841 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3842 GLfloat w
= static_cast<GLfloat
>(c
.w
);
3843 DoVertexAttrib4f(indx
, x
, y
, z
, w
);
3844 return error::kNoError
;
3847 error::Error
GLES2DecoderImpl::HandleVertexAttrib4fvImmediate(
3848 uint32_t immediate_data_size
,
3849 const void* cmd_data
) {
3850 const gles2::cmds::VertexAttrib4fvImmediate
& c
=
3851 *static_cast<const gles2::cmds::VertexAttrib4fvImmediate
*>(cmd_data
);
3853 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3855 if (!ComputeDataSize(1, sizeof(GLfloat
), 4, &data_size
)) {
3856 return error::kOutOfBounds
;
3858 if (data_size
> immediate_data_size
) {
3859 return error::kOutOfBounds
;
3861 const GLfloat
* values
=
3862 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3863 if (values
== NULL
) {
3864 return error::kOutOfBounds
;
3866 DoVertexAttrib4fv(indx
, values
);
3867 return error::kNoError
;
3870 error::Error
GLES2DecoderImpl::HandleVertexAttribI4i(
3871 uint32_t immediate_data_size
,
3872 const void* cmd_data
) {
3873 if (!unsafe_es3_apis_enabled())
3874 return error::kUnknownCommand
;
3875 const gles2::cmds::VertexAttribI4i
& c
=
3876 *static_cast<const gles2::cmds::VertexAttribI4i
*>(cmd_data
);
3878 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3879 GLint x
= static_cast<GLint
>(c
.x
);
3880 GLint y
= static_cast<GLint
>(c
.y
);
3881 GLint z
= static_cast<GLint
>(c
.z
);
3882 GLint w
= static_cast<GLint
>(c
.w
);
3883 glVertexAttribI4i(indx
, x
, y
, z
, w
);
3884 return error::kNoError
;
3887 error::Error
GLES2DecoderImpl::HandleVertexAttribI4ivImmediate(
3888 uint32_t immediate_data_size
,
3889 const void* cmd_data
) {
3890 if (!unsafe_es3_apis_enabled())
3891 return error::kUnknownCommand
;
3892 const gles2::cmds::VertexAttribI4ivImmediate
& c
=
3893 *static_cast<const gles2::cmds::VertexAttribI4ivImmediate
*>(cmd_data
);
3895 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3897 if (!ComputeDataSize(1, sizeof(GLint
), 4, &data_size
)) {
3898 return error::kOutOfBounds
;
3900 if (data_size
> immediate_data_size
) {
3901 return error::kOutOfBounds
;
3903 const GLint
* values
=
3904 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3905 if (values
== NULL
) {
3906 return error::kOutOfBounds
;
3908 glVertexAttribI4iv(indx
, values
);
3909 return error::kNoError
;
3912 error::Error
GLES2DecoderImpl::HandleVertexAttribI4ui(
3913 uint32_t immediate_data_size
,
3914 const void* cmd_data
) {
3915 if (!unsafe_es3_apis_enabled())
3916 return error::kUnknownCommand
;
3917 const gles2::cmds::VertexAttribI4ui
& c
=
3918 *static_cast<const gles2::cmds::VertexAttribI4ui
*>(cmd_data
);
3920 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3921 GLuint x
= static_cast<GLuint
>(c
.x
);
3922 GLuint y
= static_cast<GLuint
>(c
.y
);
3923 GLuint z
= static_cast<GLuint
>(c
.z
);
3924 GLuint w
= static_cast<GLuint
>(c
.w
);
3925 glVertexAttribI4ui(indx
, x
, y
, z
, w
);
3926 return error::kNoError
;
3929 error::Error
GLES2DecoderImpl::HandleVertexAttribI4uivImmediate(
3930 uint32_t immediate_data_size
,
3931 const void* cmd_data
) {
3932 if (!unsafe_es3_apis_enabled())
3933 return error::kUnknownCommand
;
3934 const gles2::cmds::VertexAttribI4uivImmediate
& c
=
3935 *static_cast<const gles2::cmds::VertexAttribI4uivImmediate
*>(cmd_data
);
3937 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3939 if (!ComputeDataSize(1, sizeof(GLuint
), 4, &data_size
)) {
3940 return error::kOutOfBounds
;
3942 if (data_size
> immediate_data_size
) {
3943 return error::kOutOfBounds
;
3945 const GLuint
* values
=
3946 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3947 if (values
== NULL
) {
3948 return error::kOutOfBounds
;
3950 glVertexAttribI4uiv(indx
, values
);
3951 return error::kNoError
;
3954 error::Error
GLES2DecoderImpl::HandleViewport(uint32_t immediate_data_size
,
3955 const void* cmd_data
) {
3956 const gles2::cmds::Viewport
& c
=
3957 *static_cast<const gles2::cmds::Viewport
*>(cmd_data
);
3959 GLint x
= static_cast<GLint
>(c
.x
);
3960 GLint y
= static_cast<GLint
>(c
.y
);
3961 GLsizei width
= static_cast<GLsizei
>(c
.width
);
3962 GLsizei height
= static_cast<GLsizei
>(c
.height
);
3964 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glViewport", "width < 0");
3965 return error::kNoError
;
3968 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glViewport", "height < 0");
3969 return error::kNoError
;
3971 DoViewport(x
, y
, width
, height
);
3972 return error::kNoError
;
3975 error::Error
GLES2DecoderImpl::HandleBlitFramebufferCHROMIUM(
3976 uint32_t immediate_data_size
,
3977 const void* cmd_data
) {
3978 const gles2::cmds::BlitFramebufferCHROMIUM
& c
=
3979 *static_cast<const gles2::cmds::BlitFramebufferCHROMIUM
*>(cmd_data
);
3981 if (!features().chromium_framebuffer_multisample
) {
3982 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBlitFramebufferCHROMIUM",
3983 "function not available");
3984 return error::kNoError
;
3988 error
= WillAccessBoundFramebufferForDraw();
3989 if (error
!= error::kNoError
)
3991 error
= WillAccessBoundFramebufferForRead();
3992 if (error
!= error::kNoError
)
3994 GLint srcX0
= static_cast<GLint
>(c
.srcX0
);
3995 GLint srcY0
= static_cast<GLint
>(c
.srcY0
);
3996 GLint srcX1
= static_cast<GLint
>(c
.srcX1
);
3997 GLint srcY1
= static_cast<GLint
>(c
.srcY1
);
3998 GLint dstX0
= static_cast<GLint
>(c
.dstX0
);
3999 GLint dstY0
= static_cast<GLint
>(c
.dstY0
);
4000 GLint dstX1
= static_cast<GLint
>(c
.dstX1
);
4001 GLint dstY1
= static_cast<GLint
>(c
.dstY1
);
4002 GLbitfield mask
= static_cast<GLbitfield
>(c
.mask
);
4003 GLenum filter
= static_cast<GLenum
>(c
.filter
);
4004 if (!validators_
->blit_filter
.IsValid(filter
)) {
4005 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlitFramebufferCHROMIUM", filter
,
4007 return error::kNoError
;
4009 DoBlitFramebufferCHROMIUM(srcX0
, srcY0
, srcX1
, srcY1
, dstX0
, dstY0
, dstX1
,
4010 dstY1
, mask
, filter
);
4011 return error::kNoError
;
4014 error::Error
GLES2DecoderImpl::HandleRenderbufferStorageMultisampleCHROMIUM(
4015 uint32_t immediate_data_size
,
4016 const void* cmd_data
) {
4017 const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM
& c
=
4018 *static_cast<const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM
*>(
4021 if (!features().chromium_framebuffer_multisample
) {
4022 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
,
4023 "glRenderbufferStorageMultisampleCHROMIUM",
4024 "function not available");
4025 return error::kNoError
;
4028 GLenum target
= static_cast<GLenum
>(c
.target
);
4029 GLsizei samples
= static_cast<GLsizei
>(c
.samples
);
4030 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
4031 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4032 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4033 if (!validators_
->render_buffer_target
.IsValid(target
)) {
4034 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleCHROMIUM",
4036 return error::kNoError
;
4039 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
,
4040 "glRenderbufferStorageMultisampleCHROMIUM",
4042 return error::kNoError
;
4044 if (!validators_
->render_buffer_format
.IsValid(internalformat
)) {
4045 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleCHROMIUM",
4046 internalformat
, "internalformat");
4047 return error::kNoError
;
4050 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
,
4051 "glRenderbufferStorageMultisampleCHROMIUM", "width < 0");
4052 return error::kNoError
;
4055 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
,
4056 "glRenderbufferStorageMultisampleCHROMIUM",
4058 return error::kNoError
;
4060 DoRenderbufferStorageMultisampleCHROMIUM(target
, samples
, internalformat
,
4062 return error::kNoError
;
4065 error::Error
GLES2DecoderImpl::HandleRenderbufferStorageMultisampleEXT(
4066 uint32_t immediate_data_size
,
4067 const void* cmd_data
) {
4068 const gles2::cmds::RenderbufferStorageMultisampleEXT
& c
=
4069 *static_cast<const gles2::cmds::RenderbufferStorageMultisampleEXT
*>(
4072 if (!features().multisampled_render_to_texture
) {
4073 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
,
4074 "glRenderbufferStorageMultisampleEXT",
4075 "function not available");
4076 return error::kNoError
;
4079 GLenum target
= static_cast<GLenum
>(c
.target
);
4080 GLsizei samples
= static_cast<GLsizei
>(c
.samples
);
4081 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
4082 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4083 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4084 if (!validators_
->render_buffer_target
.IsValid(target
)) {
4085 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleEXT",
4087 return error::kNoError
;
4090 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorageMultisampleEXT",
4092 return error::kNoError
;
4094 if (!validators_
->render_buffer_format
.IsValid(internalformat
)) {
4095 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleEXT",
4096 internalformat
, "internalformat");
4097 return error::kNoError
;
4100 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorageMultisampleEXT",
4102 return error::kNoError
;
4105 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorageMultisampleEXT",
4107 return error::kNoError
;
4109 DoRenderbufferStorageMultisampleEXT(target
, samples
, internalformat
, width
,
4111 return error::kNoError
;
4114 error::Error
GLES2DecoderImpl::HandleFramebufferTexture2DMultisampleEXT(
4115 uint32_t immediate_data_size
,
4116 const void* cmd_data
) {
4117 const gles2::cmds::FramebufferTexture2DMultisampleEXT
& c
=
4118 *static_cast<const gles2::cmds::FramebufferTexture2DMultisampleEXT
*>(
4121 if (!features().multisampled_render_to_texture
) {
4122 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
,
4123 "glFramebufferTexture2DMultisampleEXT",
4124 "function not available");
4125 return error::kNoError
;
4128 GLenum target
= static_cast<GLenum
>(c
.target
);
4129 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
4130 GLenum textarget
= static_cast<GLenum
>(c
.textarget
);
4131 GLuint texture
= c
.texture
;
4132 GLint level
= static_cast<GLint
>(c
.level
);
4133 GLsizei samples
= static_cast<GLsizei
>(c
.samples
);
4134 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
4135 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT",
4137 return error::kNoError
;
4139 if (!validators_
->attachment
.IsValid(attachment
)) {
4140 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT",
4141 attachment
, "attachment");
4142 return error::kNoError
;
4144 if (!validators_
->texture_target
.IsValid(textarget
)) {
4145 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT",
4146 textarget
, "textarget");
4147 return error::kNoError
;
4150 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glFramebufferTexture2DMultisampleEXT",
4152 return error::kNoError
;
4154 DoFramebufferTexture2DMultisample(target
, attachment
, textarget
, texture
,
4156 return error::kNoError
;
4159 error::Error
GLES2DecoderImpl::HandleTexStorage2DEXT(
4160 uint32_t immediate_data_size
,
4161 const void* cmd_data
) {
4162 const gles2::cmds::TexStorage2DEXT
& c
=
4163 *static_cast<const gles2::cmds::TexStorage2DEXT
*>(cmd_data
);
4165 GLenum target
= static_cast<GLenum
>(c
.target
);
4166 GLsizei levels
= static_cast<GLsizei
>(c
.levels
);
4167 GLenum internalFormat
= static_cast<GLenum
>(c
.internalFormat
);
4168 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4169 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4170 if (!validators_
->texture_target
.IsValid(target
)) {
4171 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DEXT", target
, "target");
4172 return error::kNoError
;
4175 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexStorage2DEXT", "levels < 0");
4176 return error::kNoError
;
4178 if (!validators_
->texture_internal_format_storage
.IsValid(internalFormat
)) {
4179 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DEXT", internalFormat
,
4181 return error::kNoError
;
4184 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexStorage2DEXT", "width < 0");
4185 return error::kNoError
;
4188 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexStorage2DEXT", "height < 0");
4189 return error::kNoError
;
4191 DoTexStorage2DEXT(target
, levels
, internalFormat
, width
, height
);
4192 return error::kNoError
;
4195 error::Error
GLES2DecoderImpl::HandleGenQueriesEXTImmediate(
4196 uint32_t immediate_data_size
,
4197 const void* cmd_data
) {
4198 const gles2::cmds::GenQueriesEXTImmediate
& c
=
4199 *static_cast<const gles2::cmds::GenQueriesEXTImmediate
*>(cmd_data
);
4201 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4203 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4204 return error::kOutOfBounds
;
4207 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
4208 if (queries
== NULL
) {
4209 return error::kOutOfBounds
;
4211 if (!GenQueriesEXTHelper(n
, queries
)) {
4212 return error::kInvalidArguments
;
4214 return error::kNoError
;
4217 error::Error
GLES2DecoderImpl::HandleDeleteQueriesEXTImmediate(
4218 uint32_t immediate_data_size
,
4219 const void* cmd_data
) {
4220 const gles2::cmds::DeleteQueriesEXTImmediate
& c
=
4221 *static_cast<const gles2::cmds::DeleteQueriesEXTImmediate
*>(cmd_data
);
4223 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4225 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4226 return error::kOutOfBounds
;
4228 const GLuint
* queries
=
4229 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
4230 if (queries
== NULL
) {
4231 return error::kOutOfBounds
;
4233 DeleteQueriesEXTHelper(n
, queries
);
4234 return error::kNoError
;
4237 error::Error
GLES2DecoderImpl::HandleBeginTransformFeedback(
4238 uint32_t immediate_data_size
,
4239 const void* cmd_data
) {
4240 if (!unsafe_es3_apis_enabled())
4241 return error::kUnknownCommand
;
4242 const gles2::cmds::BeginTransformFeedback
& c
=
4243 *static_cast<const gles2::cmds::BeginTransformFeedback
*>(cmd_data
);
4245 GLenum primitivemode
= static_cast<GLenum
>(c
.primitivemode
);
4246 glBeginTransformFeedback(primitivemode
);
4247 return error::kNoError
;
4250 error::Error
GLES2DecoderImpl::HandleEndTransformFeedback(
4251 uint32_t immediate_data_size
,
4252 const void* cmd_data
) {
4253 if (!unsafe_es3_apis_enabled())
4254 return error::kUnknownCommand
;
4255 const gles2::cmds::EndTransformFeedback
& c
=
4256 *static_cast<const gles2::cmds::EndTransformFeedback
*>(cmd_data
);
4258 glEndTransformFeedback();
4259 return error::kNoError
;
4262 error::Error
GLES2DecoderImpl::HandleInsertEventMarkerEXT(
4263 uint32_t immediate_data_size
,
4264 const void* cmd_data
) {
4265 const gles2::cmds::InsertEventMarkerEXT
& c
=
4266 *static_cast<const gles2::cmds::InsertEventMarkerEXT
*>(cmd_data
);
4269 GLuint bucket_id
= static_cast<GLuint
>(c
.bucket_id
);
4270 Bucket
* bucket
= GetBucket(bucket_id
);
4271 if (!bucket
|| bucket
->size() == 0) {
4272 return error::kInvalidArguments
;
4275 if (!bucket
->GetAsString(&str
)) {
4276 return error::kInvalidArguments
;
4278 DoInsertEventMarkerEXT(0, str
.c_str());
4279 return error::kNoError
;
4282 error::Error
GLES2DecoderImpl::HandlePushGroupMarkerEXT(
4283 uint32_t immediate_data_size
,
4284 const void* cmd_data
) {
4285 const gles2::cmds::PushGroupMarkerEXT
& c
=
4286 *static_cast<const gles2::cmds::PushGroupMarkerEXT
*>(cmd_data
);
4289 GLuint bucket_id
= static_cast<GLuint
>(c
.bucket_id
);
4290 Bucket
* bucket
= GetBucket(bucket_id
);
4291 if (!bucket
|| bucket
->size() == 0) {
4292 return error::kInvalidArguments
;
4295 if (!bucket
->GetAsString(&str
)) {
4296 return error::kInvalidArguments
;
4298 DoPushGroupMarkerEXT(0, str
.c_str());
4299 return error::kNoError
;
4302 error::Error
GLES2DecoderImpl::HandlePopGroupMarkerEXT(
4303 uint32_t immediate_data_size
,
4304 const void* cmd_data
) {
4305 const gles2::cmds::PopGroupMarkerEXT
& c
=
4306 *static_cast<const gles2::cmds::PopGroupMarkerEXT
*>(cmd_data
);
4308 DoPopGroupMarkerEXT();
4309 return error::kNoError
;
4312 error::Error
GLES2DecoderImpl::HandleGenVertexArraysOESImmediate(
4313 uint32_t immediate_data_size
,
4314 const void* cmd_data
) {
4315 const gles2::cmds::GenVertexArraysOESImmediate
& c
=
4316 *static_cast<const gles2::cmds::GenVertexArraysOESImmediate
*>(cmd_data
);
4318 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4320 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4321 return error::kOutOfBounds
;
4324 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
4325 if (arrays
== NULL
) {
4326 return error::kOutOfBounds
;
4328 if (!GenVertexArraysOESHelper(n
, arrays
)) {
4329 return error::kInvalidArguments
;
4331 return error::kNoError
;
4334 error::Error
GLES2DecoderImpl::HandleDeleteVertexArraysOESImmediate(
4335 uint32_t immediate_data_size
,
4336 const void* cmd_data
) {
4337 const gles2::cmds::DeleteVertexArraysOESImmediate
& c
=
4338 *static_cast<const gles2::cmds::DeleteVertexArraysOESImmediate
*>(
4341 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4343 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4344 return error::kOutOfBounds
;
4346 const GLuint
* arrays
=
4347 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
4348 if (arrays
== NULL
) {
4349 return error::kOutOfBounds
;
4351 DeleteVertexArraysOESHelper(n
, arrays
);
4352 return error::kNoError
;
4355 error::Error
GLES2DecoderImpl::HandleIsVertexArrayOES(
4356 uint32_t immediate_data_size
,
4357 const void* cmd_data
) {
4358 const gles2::cmds::IsVertexArrayOES
& c
=
4359 *static_cast<const gles2::cmds::IsVertexArrayOES
*>(cmd_data
);
4361 GLuint array
= c
.array
;
4362 typedef cmds::IsVertexArrayOES::Result Result
;
4363 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
4364 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
4366 return error::kOutOfBounds
;
4368 *result_dst
= DoIsVertexArrayOES(array
);
4369 return error::kNoError
;
4372 error::Error
GLES2DecoderImpl::HandleBindVertexArrayOES(
4373 uint32_t immediate_data_size
,
4374 const void* cmd_data
) {
4375 const gles2::cmds::BindVertexArrayOES
& c
=
4376 *static_cast<const gles2::cmds::BindVertexArrayOES
*>(cmd_data
);
4378 GLuint array
= c
.array
;
4379 DoBindVertexArrayOES(array
);
4380 return error::kNoError
;
4383 error::Error
GLES2DecoderImpl::HandleSwapBuffers(uint32_t immediate_data_size
,
4384 const void* cmd_data
) {
4385 const gles2::cmds::SwapBuffers
& c
=
4386 *static_cast<const gles2::cmds::SwapBuffers
*>(cmd_data
);
4389 return error::kNoError
;
4392 error::Error
GLES2DecoderImpl::HandleGetMaxValueInBufferCHROMIUM(
4393 uint32_t immediate_data_size
,
4394 const void* cmd_data
) {
4395 const gles2::cmds::GetMaxValueInBufferCHROMIUM
& c
=
4396 *static_cast<const gles2::cmds::GetMaxValueInBufferCHROMIUM
*>(cmd_data
);
4398 GLuint buffer_id
= c
.buffer_id
;
4399 GLsizei count
= static_cast<GLsizei
>(c
.count
);
4400 GLenum type
= static_cast<GLenum
>(c
.type
);
4401 GLuint offset
= static_cast<GLuint
>(c
.offset
);
4402 typedef cmds::GetMaxValueInBufferCHROMIUM::Result Result
;
4403 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
4404 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
4406 return error::kOutOfBounds
;
4409 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glGetMaxValueInBufferCHROMIUM",
4411 return error::kNoError
;
4413 if (!validators_
->get_max_index_type
.IsValid(type
)) {
4414 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetMaxValueInBufferCHROMIUM", type
,
4416 return error::kNoError
;
4418 *result_dst
= DoGetMaxValueInBufferCHROMIUM(buffer_id
, count
, type
, offset
);
4419 return error::kNoError
;
4422 error::Error
GLES2DecoderImpl::HandleTexImageIOSurface2DCHROMIUM(
4423 uint32_t immediate_data_size
,
4424 const void* cmd_data
) {
4425 const gles2::cmds::TexImageIOSurface2DCHROMIUM
& c
=
4426 *static_cast<const gles2::cmds::TexImageIOSurface2DCHROMIUM
*>(cmd_data
);
4428 GLenum target
= static_cast<GLenum
>(c
.target
);
4429 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4430 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4431 GLuint ioSurfaceId
= static_cast<GLuint
>(c
.ioSurfaceId
);
4432 GLuint plane
= static_cast<GLuint
>(c
.plane
);
4433 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4434 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexImageIOSurface2DCHROMIUM", target
,
4436 return error::kNoError
;
4439 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexImageIOSurface2DCHROMIUM",
4441 return error::kNoError
;
4444 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexImageIOSurface2DCHROMIUM",
4446 return error::kNoError
;
4448 DoTexImageIOSurface2DCHROMIUM(target
, width
, height
, ioSurfaceId
, plane
);
4449 return error::kNoError
;
4452 error::Error
GLES2DecoderImpl::HandleCopyTextureCHROMIUM(
4453 uint32_t immediate_data_size
,
4454 const void* cmd_data
) {
4455 const gles2::cmds::CopyTextureCHROMIUM
& c
=
4456 *static_cast<const gles2::cmds::CopyTextureCHROMIUM
*>(cmd_data
);
4458 GLenum target
= static_cast<GLenum
>(c
.target
);
4459 GLenum source_id
= static_cast<GLenum
>(c
.source_id
);
4460 GLenum dest_id
= static_cast<GLenum
>(c
.dest_id
);
4461 GLint internalformat
= static_cast<GLint
>(c
.internalformat
);
4462 GLenum dest_type
= static_cast<GLenum
>(c
.dest_type
);
4463 if (!validators_
->texture_internal_format
.IsValid(internalformat
)) {
4464 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTextureCHROMIUM",
4465 "internalformat GL_INVALID_VALUE");
4466 return error::kNoError
;
4468 if (!validators_
->pixel_type
.IsValid(dest_type
)) {
4469 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTextureCHROMIUM", dest_type
,
4471 return error::kNoError
;
4473 DoCopyTextureCHROMIUM(target
, source_id
, dest_id
, internalformat
, dest_type
);
4474 return error::kNoError
;
4477 error::Error
GLES2DecoderImpl::HandleCopySubTextureCHROMIUM(
4478 uint32_t immediate_data_size
,
4479 const void* cmd_data
) {
4480 const gles2::cmds::CopySubTextureCHROMIUM
& c
=
4481 *static_cast<const gles2::cmds::CopySubTextureCHROMIUM
*>(cmd_data
);
4483 GLenum target
= static_cast<GLenum
>(c
.target
);
4484 GLenum source_id
= static_cast<GLenum
>(c
.source_id
);
4485 GLenum dest_id
= static_cast<GLenum
>(c
.dest_id
);
4486 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
4487 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
4488 DoCopySubTextureCHROMIUM(target
, source_id
, dest_id
, xoffset
, yoffset
);
4489 return error::kNoError
;
4492 error::Error
GLES2DecoderImpl::HandleProduceTextureCHROMIUMImmediate(
4493 uint32_t immediate_data_size
,
4494 const void* cmd_data
) {
4495 const gles2::cmds::ProduceTextureCHROMIUMImmediate
& c
=
4496 *static_cast<const gles2::cmds::ProduceTextureCHROMIUMImmediate
*>(
4499 GLenum target
= static_cast<GLenum
>(c
.target
);
4501 if (!ComputeDataSize(1, sizeof(GLbyte
), 64, &data_size
)) {
4502 return error::kOutOfBounds
;
4504 if (data_size
> immediate_data_size
) {
4505 return error::kOutOfBounds
;
4507 const GLbyte
* mailbox
=
4508 GetImmediateDataAs
<const GLbyte
*>(c
, data_size
, immediate_data_size
);
4509 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4510 LOCAL_SET_GL_ERROR_INVALID_ENUM("glProduceTextureCHROMIUM", target
,
4512 return error::kNoError
;
4514 if (mailbox
== NULL
) {
4515 return error::kOutOfBounds
;
4517 DoProduceTextureCHROMIUM(target
, mailbox
);
4518 return error::kNoError
;
4521 error::Error
GLES2DecoderImpl::HandleProduceTextureDirectCHROMIUMImmediate(
4522 uint32_t immediate_data_size
,
4523 const void* cmd_data
) {
4524 const gles2::cmds::ProduceTextureDirectCHROMIUMImmediate
& c
=
4525 *static_cast<const gles2::cmds::ProduceTextureDirectCHROMIUMImmediate
*>(
4528 GLuint texture
= c
.texture
;
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("glProduceTextureDirectCHROMIUM", target
,
4542 return error::kNoError
;
4544 if (mailbox
== NULL
) {
4545 return error::kOutOfBounds
;
4547 DoProduceTextureDirectCHROMIUM(texture
, target
, mailbox
);
4548 return error::kNoError
;
4551 error::Error
GLES2DecoderImpl::HandleConsumeTextureCHROMIUMImmediate(
4552 uint32_t immediate_data_size
,
4553 const void* cmd_data
) {
4554 const gles2::cmds::ConsumeTextureCHROMIUMImmediate
& c
=
4555 *static_cast<const gles2::cmds::ConsumeTextureCHROMIUMImmediate
*>(
4558 GLenum target
= static_cast<GLenum
>(c
.target
);
4560 if (!ComputeDataSize(1, sizeof(GLbyte
), 64, &data_size
)) {
4561 return error::kOutOfBounds
;
4563 if (data_size
> immediate_data_size
) {
4564 return error::kOutOfBounds
;
4566 const GLbyte
* mailbox
=
4567 GetImmediateDataAs
<const GLbyte
*>(c
, data_size
, immediate_data_size
);
4568 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4569 LOCAL_SET_GL_ERROR_INVALID_ENUM("glConsumeTextureCHROMIUM", target
,
4571 return error::kNoError
;
4573 if (mailbox
== NULL
) {
4574 return error::kOutOfBounds
;
4576 DoConsumeTextureCHROMIUM(target
, mailbox
);
4577 return error::kNoError
;
4580 error::Error
GLES2DecoderImpl::HandleGenValuebuffersCHROMIUMImmediate(
4581 uint32_t immediate_data_size
,
4582 const void* cmd_data
) {
4583 const gles2::cmds::GenValuebuffersCHROMIUMImmediate
& c
=
4584 *static_cast<const gles2::cmds::GenValuebuffersCHROMIUMImmediate
*>(
4587 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4589 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4590 return error::kOutOfBounds
;
4593 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
4594 if (buffers
== NULL
) {
4595 return error::kOutOfBounds
;
4597 if (!GenValuebuffersCHROMIUMHelper(n
, buffers
)) {
4598 return error::kInvalidArguments
;
4600 return error::kNoError
;
4603 error::Error
GLES2DecoderImpl::HandleDeleteValuebuffersCHROMIUMImmediate(
4604 uint32_t immediate_data_size
,
4605 const void* cmd_data
) {
4606 const gles2::cmds::DeleteValuebuffersCHROMIUMImmediate
& c
=
4607 *static_cast<const gles2::cmds::DeleteValuebuffersCHROMIUMImmediate
*>(
4610 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4612 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4613 return error::kOutOfBounds
;
4615 const GLuint
* valuebuffers
=
4616 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
4617 if (valuebuffers
== NULL
) {
4618 return error::kOutOfBounds
;
4620 DeleteValuebuffersCHROMIUMHelper(n
, valuebuffers
);
4621 return error::kNoError
;
4624 error::Error
GLES2DecoderImpl::HandleIsValuebufferCHROMIUM(
4625 uint32_t immediate_data_size
,
4626 const void* cmd_data
) {
4627 const gles2::cmds::IsValuebufferCHROMIUM
& c
=
4628 *static_cast<const gles2::cmds::IsValuebufferCHROMIUM
*>(cmd_data
);
4630 GLuint valuebuffer
= c
.valuebuffer
;
4631 typedef cmds::IsValuebufferCHROMIUM::Result Result
;
4632 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
4633 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
4635 return error::kOutOfBounds
;
4637 *result_dst
= DoIsValuebufferCHROMIUM(valuebuffer
);
4638 return error::kNoError
;
4641 error::Error
GLES2DecoderImpl::HandleBindValuebufferCHROMIUM(
4642 uint32_t immediate_data_size
,
4643 const void* cmd_data
) {
4644 const gles2::cmds::BindValuebufferCHROMIUM
& c
=
4645 *static_cast<const gles2::cmds::BindValuebufferCHROMIUM
*>(cmd_data
);
4647 GLenum target
= static_cast<GLenum
>(c
.target
);
4648 GLuint valuebuffer
= c
.valuebuffer
;
4649 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4650 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindValuebufferCHROMIUM", target
,
4652 return error::kNoError
;
4654 DoBindValueBufferCHROMIUM(target
, valuebuffer
);
4655 return error::kNoError
;
4658 error::Error
GLES2DecoderImpl::HandleSubscribeValueCHROMIUM(
4659 uint32_t immediate_data_size
,
4660 const void* cmd_data
) {
4661 const gles2::cmds::SubscribeValueCHROMIUM
& c
=
4662 *static_cast<const gles2::cmds::SubscribeValueCHROMIUM
*>(cmd_data
);
4664 GLenum target
= static_cast<GLenum
>(c
.target
);
4665 GLenum subscription
= static_cast<GLenum
>(c
.subscription
);
4666 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4667 LOCAL_SET_GL_ERROR_INVALID_ENUM("glSubscribeValueCHROMIUM", target
,
4669 return error::kNoError
;
4671 if (!validators_
->subscription_target
.IsValid(subscription
)) {
4672 LOCAL_SET_GL_ERROR_INVALID_ENUM("glSubscribeValueCHROMIUM", subscription
,
4674 return error::kNoError
;
4676 DoSubscribeValueCHROMIUM(target
, subscription
);
4677 return error::kNoError
;
4680 error::Error
GLES2DecoderImpl::HandlePopulateSubscribedValuesCHROMIUM(
4681 uint32_t immediate_data_size
,
4682 const void* cmd_data
) {
4683 const gles2::cmds::PopulateSubscribedValuesCHROMIUM
& c
=
4684 *static_cast<const gles2::cmds::PopulateSubscribedValuesCHROMIUM
*>(
4687 GLenum target
= static_cast<GLenum
>(c
.target
);
4688 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4689 LOCAL_SET_GL_ERROR_INVALID_ENUM("glPopulateSubscribedValuesCHROMIUM",
4691 return error::kNoError
;
4693 DoPopulateSubscribedValuesCHROMIUM(target
);
4694 return error::kNoError
;
4697 error::Error
GLES2DecoderImpl::HandleUniformValuebufferCHROMIUM(
4698 uint32_t immediate_data_size
,
4699 const void* cmd_data
) {
4700 const gles2::cmds::UniformValuebufferCHROMIUM
& c
=
4701 *static_cast<const gles2::cmds::UniformValuebufferCHROMIUM
*>(cmd_data
);
4703 GLint location
= static_cast<GLint
>(c
.location
);
4704 GLenum target
= static_cast<GLenum
>(c
.target
);
4705 GLenum subscription
= static_cast<GLenum
>(c
.subscription
);
4706 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4707 LOCAL_SET_GL_ERROR_INVALID_ENUM("glUniformValuebufferCHROMIUM", target
,
4709 return error::kNoError
;
4711 if (!validators_
->subscription_target
.IsValid(subscription
)) {
4712 LOCAL_SET_GL_ERROR_INVALID_ENUM("glUniformValuebufferCHROMIUM",
4713 subscription
, "subscription");
4714 return error::kNoError
;
4716 DoUniformValueBufferCHROMIUM(location
, target
, subscription
);
4717 return error::kNoError
;
4720 error::Error
GLES2DecoderImpl::HandleBindTexImage2DCHROMIUM(
4721 uint32_t immediate_data_size
,
4722 const void* cmd_data
) {
4723 const gles2::cmds::BindTexImage2DCHROMIUM
& c
=
4724 *static_cast<const gles2::cmds::BindTexImage2DCHROMIUM
*>(cmd_data
);
4726 GLenum target
= static_cast<GLenum
>(c
.target
);
4727 GLint imageId
= static_cast<GLint
>(c
.imageId
);
4728 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4729 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTexImage2DCHROMIUM", target
,
4731 return error::kNoError
;
4733 DoBindTexImage2DCHROMIUM(target
, imageId
);
4734 return error::kNoError
;
4737 error::Error
GLES2DecoderImpl::HandleReleaseTexImage2DCHROMIUM(
4738 uint32_t immediate_data_size
,
4739 const void* cmd_data
) {
4740 const gles2::cmds::ReleaseTexImage2DCHROMIUM
& c
=
4741 *static_cast<const gles2::cmds::ReleaseTexImage2DCHROMIUM
*>(cmd_data
);
4743 GLenum target
= static_cast<GLenum
>(c
.target
);
4744 GLint imageId
= static_cast<GLint
>(c
.imageId
);
4745 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4746 LOCAL_SET_GL_ERROR_INVALID_ENUM("glReleaseTexImage2DCHROMIUM", target
,
4748 return error::kNoError
;
4750 DoReleaseTexImage2DCHROMIUM(target
, imageId
);
4751 return error::kNoError
;
4754 error::Error
GLES2DecoderImpl::HandleTraceEndCHROMIUM(
4755 uint32_t immediate_data_size
,
4756 const void* cmd_data
) {
4757 const gles2::cmds::TraceEndCHROMIUM
& c
=
4758 *static_cast<const gles2::cmds::TraceEndCHROMIUM
*>(cmd_data
);
4760 DoTraceEndCHROMIUM();
4761 return error::kNoError
;
4764 error::Error
GLES2DecoderImpl::HandleDiscardFramebufferEXTImmediate(
4765 uint32_t immediate_data_size
,
4766 const void* cmd_data
) {
4767 const gles2::cmds::DiscardFramebufferEXTImmediate
& c
=
4768 *static_cast<const gles2::cmds::DiscardFramebufferEXTImmediate
*>(
4771 if (!features().ext_discard_framebuffer
) {
4772 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glDiscardFramebufferEXT",
4773 "function not available");
4774 return error::kNoError
;
4777 GLenum target
= static_cast<GLenum
>(c
.target
);
4778 GLsizei count
= static_cast<GLsizei
>(c
.count
);
4780 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
4781 return error::kOutOfBounds
;
4783 if (data_size
> immediate_data_size
) {
4784 return error::kOutOfBounds
;
4786 const GLenum
* attachments
=
4787 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
4789 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glDiscardFramebufferEXT",
4791 return error::kNoError
;
4793 if (attachments
== NULL
) {
4794 return error::kOutOfBounds
;
4796 DoDiscardFramebufferEXT(target
, count
, attachments
);
4797 return error::kNoError
;
4800 error::Error
GLES2DecoderImpl::HandleLoseContextCHROMIUM(
4801 uint32_t immediate_data_size
,
4802 const void* cmd_data
) {
4803 const gles2::cmds::LoseContextCHROMIUM
& c
=
4804 *static_cast<const gles2::cmds::LoseContextCHROMIUM
*>(cmd_data
);
4806 GLenum current
= static_cast<GLenum
>(c
.current
);
4807 GLenum other
= static_cast<GLenum
>(c
.other
);
4808 if (!validators_
->reset_status
.IsValid(current
)) {
4809 LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", current
,
4811 return error::kNoError
;
4813 if (!validators_
->reset_status
.IsValid(other
)) {
4814 LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", other
, "other");
4815 return error::kNoError
;
4817 DoLoseContextCHROMIUM(current
, other
);
4818 return error::kNoError
;
4821 error::Error
GLES2DecoderImpl::HandleDrawBuffersEXTImmediate(
4822 uint32_t immediate_data_size
,
4823 const void* cmd_data
) {
4824 const gles2::cmds::DrawBuffersEXTImmediate
& c
=
4825 *static_cast<const gles2::cmds::DrawBuffersEXTImmediate
*>(cmd_data
);
4827 GLsizei count
= static_cast<GLsizei
>(c
.count
);
4829 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
4830 return error::kOutOfBounds
;
4832 if (data_size
> immediate_data_size
) {
4833 return error::kOutOfBounds
;
4835 const GLenum
* bufs
=
4836 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
4838 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glDrawBuffersEXT", "count < 0");
4839 return error::kNoError
;
4842 return error::kOutOfBounds
;
4844 DoDrawBuffersEXT(count
, bufs
);
4845 return error::kNoError
;
4848 error::Error
GLES2DecoderImpl::HandleSwapInterval(uint32_t immediate_data_size
,
4849 const void* cmd_data
) {
4850 const gles2::cmds::SwapInterval
& c
=
4851 *static_cast<const gles2::cmds::SwapInterval
*>(cmd_data
);
4853 GLint interval
= static_cast<GLint
>(c
.interval
);
4854 DoSwapInterval(interval
);
4855 return error::kNoError
;
4858 error::Error
GLES2DecoderImpl::HandleMatrixLoadfCHROMIUMImmediate(
4859 uint32_t immediate_data_size
,
4860 const void* cmd_data
) {
4861 const gles2::cmds::MatrixLoadfCHROMIUMImmediate
& c
=
4862 *static_cast<const gles2::cmds::MatrixLoadfCHROMIUMImmediate
*>(cmd_data
);
4864 if (!features().chromium_path_rendering
) {
4865 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glMatrixLoadfCHROMIUM",
4866 "function not available");
4867 return error::kNoError
;
4870 GLenum matrixMode
= static_cast<GLenum
>(c
.matrixMode
);
4872 if (!ComputeDataSize(1, sizeof(GLfloat
), 16, &data_size
)) {
4873 return error::kOutOfBounds
;
4875 if (data_size
> immediate_data_size
) {
4876 return error::kOutOfBounds
;
4879 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
4880 if (!validators_
->matrix_mode
.IsValid(matrixMode
)) {
4881 LOCAL_SET_GL_ERROR_INVALID_ENUM("glMatrixLoadfCHROMIUM", matrixMode
,
4883 return error::kNoError
;
4886 return error::kOutOfBounds
;
4888 DoMatrixLoadfCHROMIUM(matrixMode
, m
);
4889 return error::kNoError
;
4892 error::Error
GLES2DecoderImpl::HandleMatrixLoadIdentityCHROMIUM(
4893 uint32_t immediate_data_size
,
4894 const void* cmd_data
) {
4895 const gles2::cmds::MatrixLoadIdentityCHROMIUM
& c
=
4896 *static_cast<const gles2::cmds::MatrixLoadIdentityCHROMIUM
*>(cmd_data
);
4898 if (!features().chromium_path_rendering
) {
4899 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glMatrixLoadIdentityCHROMIUM",
4900 "function not available");
4901 return error::kNoError
;
4904 GLenum matrixMode
= static_cast<GLenum
>(c
.matrixMode
);
4905 if (!validators_
->matrix_mode
.IsValid(matrixMode
)) {
4906 LOCAL_SET_GL_ERROR_INVALID_ENUM("glMatrixLoadIdentityCHROMIUM", matrixMode
,
4908 return error::kNoError
;
4910 DoMatrixLoadIdentityCHROMIUM(matrixMode
);
4911 return error::kNoError
;
4914 error::Error
GLES2DecoderImpl::HandleBlendBarrierKHR(
4915 uint32_t immediate_data_size
,
4916 const void* cmd_data
) {
4917 const gles2::cmds::BlendBarrierKHR
& c
=
4918 *static_cast<const gles2::cmds::BlendBarrierKHR
*>(cmd_data
);
4920 if (!features().blend_equation_advanced
) {
4921 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBlendBarrierKHR",
4922 "function not available");
4923 return error::kNoError
;
4926 glBlendBarrierKHR();
4927 return error::kNoError
;
4930 bool GLES2DecoderImpl::SetCapabilityState(GLenum cap
, bool enabled
) {
4933 state_
.enable_flags
.blend
= enabled
;
4934 if (state_
.enable_flags
.cached_blend
!= enabled
||
4935 state_
.ignore_cached_state
) {
4936 state_
.enable_flags
.cached_blend
= enabled
;
4941 state_
.enable_flags
.cull_face
= enabled
;
4942 if (state_
.enable_flags
.cached_cull_face
!= enabled
||
4943 state_
.ignore_cached_state
) {
4944 state_
.enable_flags
.cached_cull_face
= enabled
;
4949 state_
.enable_flags
.depth_test
= enabled
;
4950 if (state_
.enable_flags
.cached_depth_test
!= enabled
||
4951 state_
.ignore_cached_state
) {
4952 framebuffer_state_
.clear_state_dirty
= true;
4956 state_
.enable_flags
.dither
= enabled
;
4957 if (state_
.enable_flags
.cached_dither
!= enabled
||
4958 state_
.ignore_cached_state
) {
4959 state_
.enable_flags
.cached_dither
= enabled
;
4963 case GL_POLYGON_OFFSET_FILL
:
4964 state_
.enable_flags
.polygon_offset_fill
= enabled
;
4965 if (state_
.enable_flags
.cached_polygon_offset_fill
!= enabled
||
4966 state_
.ignore_cached_state
) {
4967 state_
.enable_flags
.cached_polygon_offset_fill
= enabled
;
4971 case GL_SAMPLE_ALPHA_TO_COVERAGE
:
4972 state_
.enable_flags
.sample_alpha_to_coverage
= enabled
;
4973 if (state_
.enable_flags
.cached_sample_alpha_to_coverage
!= enabled
||
4974 state_
.ignore_cached_state
) {
4975 state_
.enable_flags
.cached_sample_alpha_to_coverage
= enabled
;
4979 case GL_SAMPLE_COVERAGE
:
4980 state_
.enable_flags
.sample_coverage
= enabled
;
4981 if (state_
.enable_flags
.cached_sample_coverage
!= enabled
||
4982 state_
.ignore_cached_state
) {
4983 state_
.enable_flags
.cached_sample_coverage
= enabled
;
4987 case GL_SCISSOR_TEST
:
4988 state_
.enable_flags
.scissor_test
= enabled
;
4989 if (state_
.enable_flags
.cached_scissor_test
!= enabled
||
4990 state_
.ignore_cached_state
) {
4991 state_
.enable_flags
.cached_scissor_test
= enabled
;
4995 case GL_STENCIL_TEST
:
4996 state_
.enable_flags
.stencil_test
= enabled
;
4997 if (state_
.enable_flags
.cached_stencil_test
!= enabled
||
4998 state_
.ignore_cached_state
) {
4999 framebuffer_state_
.clear_state_dirty
= true;
5002 case GL_RASTERIZER_DISCARD
:
5003 state_
.enable_flags
.rasterizer_discard
= enabled
;
5004 if (state_
.enable_flags
.cached_rasterizer_discard
!= enabled
||
5005 state_
.ignore_cached_state
) {
5006 state_
.enable_flags
.cached_rasterizer_discard
= enabled
;
5010 case GL_PRIMITIVE_RESTART_FIXED_INDEX
:
5011 state_
.enable_flags
.primitive_restart_fixed_index
= enabled
;
5012 if (state_
.enable_flags
.cached_primitive_restart_fixed_index
!= enabled
||
5013 state_
.ignore_cached_state
) {
5014 state_
.enable_flags
.cached_primitive_restart_fixed_index
= enabled
;
5023 #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_