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 DoBindBufferBase(target
, index
, buffer
);
63 return error::kNoError
;
66 error::Error
GLES2DecoderImpl::HandleBindBufferRange(
67 uint32_t immediate_data_size
,
68 const void* cmd_data
) {
69 if (!unsafe_es3_apis_enabled())
70 return error::kUnknownCommand
;
71 const gles2::cmds::BindBufferRange
& c
=
72 *static_cast<const gles2::cmds::BindBufferRange
*>(cmd_data
);
74 GLenum target
= static_cast<GLenum
>(c
.target
);
75 GLuint index
= static_cast<GLuint
>(c
.index
);
76 GLuint buffer
= c
.buffer
;
77 GLintptr offset
= static_cast<GLintptr
>(c
.offset
);
78 GLsizeiptr size
= static_cast<GLsizeiptr
>(c
.size
);
79 DoBindBufferRange(target
, index
, buffer
, offset
, size
);
80 return error::kNoError
;
83 error::Error
GLES2DecoderImpl::HandleBindFramebuffer(
84 uint32_t immediate_data_size
,
85 const void* cmd_data
) {
86 const gles2::cmds::BindFramebuffer
& c
=
87 *static_cast<const gles2::cmds::BindFramebuffer
*>(cmd_data
);
89 GLenum target
= static_cast<GLenum
>(c
.target
);
90 GLuint framebuffer
= c
.framebuffer
;
91 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
92 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindFramebuffer", target
, "target");
93 return error::kNoError
;
95 DoBindFramebuffer(target
, framebuffer
);
96 return error::kNoError
;
99 error::Error
GLES2DecoderImpl::HandleBindRenderbuffer(
100 uint32_t immediate_data_size
,
101 const void* cmd_data
) {
102 const gles2::cmds::BindRenderbuffer
& c
=
103 *static_cast<const gles2::cmds::BindRenderbuffer
*>(cmd_data
);
105 GLenum target
= static_cast<GLenum
>(c
.target
);
106 GLuint renderbuffer
= c
.renderbuffer
;
107 if (!validators_
->render_buffer_target
.IsValid(target
)) {
108 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindRenderbuffer", target
, "target");
109 return error::kNoError
;
111 DoBindRenderbuffer(target
, renderbuffer
);
112 return error::kNoError
;
115 error::Error
GLES2DecoderImpl::HandleBindSampler(uint32_t immediate_data_size
,
116 const void* cmd_data
) {
117 if (!unsafe_es3_apis_enabled())
118 return error::kUnknownCommand
;
119 const gles2::cmds::BindSampler
& c
=
120 *static_cast<const gles2::cmds::BindSampler
*>(cmd_data
);
122 GLuint unit
= static_cast<GLuint
>(c
.unit
);
123 GLuint sampler
= c
.sampler
;
125 glBindSampler(unit
, sampler
);
126 return error::kNoError
;
128 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
129 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBindSampler",
130 "invalid sampler id");
131 return error::kNoError
;
133 glBindSampler(unit
, sampler
);
134 return error::kNoError
;
137 error::Error
GLES2DecoderImpl::HandleBindTexture(uint32_t immediate_data_size
,
138 const void* cmd_data
) {
139 const gles2::cmds::BindTexture
& c
=
140 *static_cast<const gles2::cmds::BindTexture
*>(cmd_data
);
142 GLenum target
= static_cast<GLenum
>(c
.target
);
143 GLuint texture
= c
.texture
;
144 if (!validators_
->texture_bind_target
.IsValid(target
)) {
145 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTexture", target
, "target");
146 return error::kNoError
;
148 DoBindTexture(target
, texture
);
149 return error::kNoError
;
152 error::Error
GLES2DecoderImpl::HandleBindTransformFeedback(
153 uint32_t immediate_data_size
,
154 const void* cmd_data
) {
155 if (!unsafe_es3_apis_enabled())
156 return error::kUnknownCommand
;
157 const gles2::cmds::BindTransformFeedback
& c
=
158 *static_cast<const gles2::cmds::BindTransformFeedback
*>(cmd_data
);
160 GLenum target
= static_cast<GLenum
>(c
.target
);
161 GLuint transformfeedback
= c
.transformfeedback
;
162 if (!group_
->GetTransformFeedbackServiceId(transformfeedback
,
163 &transformfeedback
)) {
164 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBindTransformFeedback",
165 "invalid transformfeedback id");
166 return error::kNoError
;
168 glBindTransformFeedback(target
, transformfeedback
);
169 return error::kNoError
;
172 error::Error
GLES2DecoderImpl::HandleBlendColor(uint32_t immediate_data_size
,
173 const void* cmd_data
) {
174 const gles2::cmds::BlendColor
& c
=
175 *static_cast<const gles2::cmds::BlendColor
*>(cmd_data
);
177 GLclampf red
= static_cast<GLclampf
>(c
.red
);
178 GLclampf green
= static_cast<GLclampf
>(c
.green
);
179 GLclampf blue
= static_cast<GLclampf
>(c
.blue
);
180 GLclampf alpha
= static_cast<GLclampf
>(c
.alpha
);
181 if (state_
.blend_color_red
!= red
|| state_
.blend_color_green
!= green
||
182 state_
.blend_color_blue
!= blue
|| state_
.blend_color_alpha
!= alpha
) {
183 state_
.blend_color_red
= red
;
184 state_
.blend_color_green
= green
;
185 state_
.blend_color_blue
= blue
;
186 state_
.blend_color_alpha
= alpha
;
187 glBlendColor(red
, green
, blue
, alpha
);
189 return error::kNoError
;
192 error::Error
GLES2DecoderImpl::HandleBlendEquation(uint32_t immediate_data_size
,
193 const void* cmd_data
) {
194 const gles2::cmds::BlendEquation
& c
=
195 *static_cast<const gles2::cmds::BlendEquation
*>(cmd_data
);
197 GLenum mode
= static_cast<GLenum
>(c
.mode
);
198 if (!validators_
->equation
.IsValid(mode
)) {
199 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendEquation", mode
, "mode");
200 return error::kNoError
;
202 if (state_
.blend_equation_rgb
!= mode
||
203 state_
.blend_equation_alpha
!= mode
) {
204 state_
.blend_equation_rgb
= mode
;
205 state_
.blend_equation_alpha
= mode
;
206 glBlendEquation(mode
);
208 return error::kNoError
;
211 error::Error
GLES2DecoderImpl::HandleBlendEquationSeparate(
212 uint32_t immediate_data_size
,
213 const void* cmd_data
) {
214 const gles2::cmds::BlendEquationSeparate
& c
=
215 *static_cast<const gles2::cmds::BlendEquationSeparate
*>(cmd_data
);
217 GLenum modeRGB
= static_cast<GLenum
>(c
.modeRGB
);
218 GLenum modeAlpha
= static_cast<GLenum
>(c
.modeAlpha
);
219 if (!validators_
->equation
.IsValid(modeRGB
)) {
220 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendEquationSeparate", modeRGB
,
222 return error::kNoError
;
224 if (!validators_
->equation
.IsValid(modeAlpha
)) {
225 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendEquationSeparate", modeAlpha
,
227 return error::kNoError
;
229 if (state_
.blend_equation_rgb
!= modeRGB
||
230 state_
.blend_equation_alpha
!= modeAlpha
) {
231 state_
.blend_equation_rgb
= modeRGB
;
232 state_
.blend_equation_alpha
= modeAlpha
;
233 glBlendEquationSeparate(modeRGB
, modeAlpha
);
235 return error::kNoError
;
238 error::Error
GLES2DecoderImpl::HandleBlendFunc(uint32_t immediate_data_size
,
239 const void* cmd_data
) {
240 const gles2::cmds::BlendFunc
& c
=
241 *static_cast<const gles2::cmds::BlendFunc
*>(cmd_data
);
243 GLenum sfactor
= static_cast<GLenum
>(c
.sfactor
);
244 GLenum dfactor
= static_cast<GLenum
>(c
.dfactor
);
245 if (!validators_
->src_blend_factor
.IsValid(sfactor
)) {
246 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFunc", sfactor
, "sfactor");
247 return error::kNoError
;
249 if (!validators_
->dst_blend_factor
.IsValid(dfactor
)) {
250 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFunc", dfactor
, "dfactor");
251 return error::kNoError
;
253 if (state_
.blend_source_rgb
!= sfactor
|| state_
.blend_dest_rgb
!= dfactor
||
254 state_
.blend_source_alpha
!= sfactor
||
255 state_
.blend_dest_alpha
!= dfactor
) {
256 state_
.blend_source_rgb
= sfactor
;
257 state_
.blend_dest_rgb
= dfactor
;
258 state_
.blend_source_alpha
= sfactor
;
259 state_
.blend_dest_alpha
= dfactor
;
260 glBlendFunc(sfactor
, dfactor
);
262 return error::kNoError
;
265 error::Error
GLES2DecoderImpl::HandleBlendFuncSeparate(
266 uint32_t immediate_data_size
,
267 const void* cmd_data
) {
268 const gles2::cmds::BlendFuncSeparate
& c
=
269 *static_cast<const gles2::cmds::BlendFuncSeparate
*>(cmd_data
);
271 GLenum srcRGB
= static_cast<GLenum
>(c
.srcRGB
);
272 GLenum dstRGB
= static_cast<GLenum
>(c
.dstRGB
);
273 GLenum srcAlpha
= static_cast<GLenum
>(c
.srcAlpha
);
274 GLenum dstAlpha
= static_cast<GLenum
>(c
.dstAlpha
);
275 if (!validators_
->src_blend_factor
.IsValid(srcRGB
)) {
276 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", srcRGB
, "srcRGB");
277 return error::kNoError
;
279 if (!validators_
->dst_blend_factor
.IsValid(dstRGB
)) {
280 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", dstRGB
, "dstRGB");
281 return error::kNoError
;
283 if (!validators_
->src_blend_factor
.IsValid(srcAlpha
)) {
284 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", srcAlpha
,
286 return error::kNoError
;
288 if (!validators_
->dst_blend_factor
.IsValid(dstAlpha
)) {
289 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", dstAlpha
,
291 return error::kNoError
;
293 if (state_
.blend_source_rgb
!= srcRGB
|| state_
.blend_dest_rgb
!= dstRGB
||
294 state_
.blend_source_alpha
!= srcAlpha
||
295 state_
.blend_dest_alpha
!= dstAlpha
) {
296 state_
.blend_source_rgb
= srcRGB
;
297 state_
.blend_dest_rgb
= dstRGB
;
298 state_
.blend_source_alpha
= srcAlpha
;
299 state_
.blend_dest_alpha
= dstAlpha
;
300 glBlendFuncSeparate(srcRGB
, dstRGB
, srcAlpha
, dstAlpha
);
302 return error::kNoError
;
305 error::Error
GLES2DecoderImpl::HandleBufferSubData(uint32_t immediate_data_size
,
306 const void* cmd_data
) {
307 const gles2::cmds::BufferSubData
& c
=
308 *static_cast<const gles2::cmds::BufferSubData
*>(cmd_data
);
310 GLenum target
= static_cast<GLenum
>(c
.target
);
311 GLintptr offset
= static_cast<GLintptr
>(c
.offset
);
312 GLsizeiptr size
= static_cast<GLsizeiptr
>(c
.size
);
313 uint32_t data_size
= size
;
314 const void* data
= GetSharedMemoryAs
<const void*>(
315 c
.data_shm_id
, c
.data_shm_offset
, data_size
);
316 if (!validators_
->buffer_target
.IsValid(target
)) {
317 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBufferSubData", target
, "target");
318 return error::kNoError
;
321 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glBufferSubData", "size < 0");
322 return error::kNoError
;
325 return error::kOutOfBounds
;
327 DoBufferSubData(target
, offset
, size
, data
);
328 return error::kNoError
;
331 error::Error
GLES2DecoderImpl::HandleCheckFramebufferStatus(
332 uint32_t immediate_data_size
,
333 const void* cmd_data
) {
334 const gles2::cmds::CheckFramebufferStatus
& c
=
335 *static_cast<const gles2::cmds::CheckFramebufferStatus
*>(cmd_data
);
337 GLenum target
= static_cast<GLenum
>(c
.target
);
338 typedef cmds::CheckFramebufferStatus::Result Result
;
339 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
340 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
342 return error::kOutOfBounds
;
344 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
345 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCheckFramebufferStatus", target
,
347 return error::kNoError
;
349 *result_dst
= DoCheckFramebufferStatus(target
);
350 return error::kNoError
;
353 error::Error
GLES2DecoderImpl::HandleClear(uint32_t immediate_data_size
,
354 const void* cmd_data
) {
355 const gles2::cmds::Clear
& c
=
356 *static_cast<const gles2::cmds::Clear
*>(cmd_data
);
359 error
= WillAccessBoundFramebufferForDraw();
360 if (error
!= error::kNoError
)
362 GLbitfield mask
= static_cast<GLbitfield
>(c
.mask
);
364 return error::kNoError
;
367 error::Error
GLES2DecoderImpl::HandleClearBufferfi(uint32_t immediate_data_size
,
368 const void* cmd_data
) {
369 if (!unsafe_es3_apis_enabled())
370 return error::kUnknownCommand
;
371 const gles2::cmds::ClearBufferfi
& c
=
372 *static_cast<const gles2::cmds::ClearBufferfi
*>(cmd_data
);
374 GLenum buffer
= static_cast<GLenum
>(c
.buffer
);
375 GLint drawbuffers
= static_cast<GLint
>(c
.drawbuffers
);
376 GLfloat depth
= static_cast<GLfloat
>(c
.depth
);
377 GLint stencil
= static_cast<GLint
>(c
.stencil
);
378 DoClearBufferfi(buffer
, drawbuffers
, depth
, stencil
);
379 return error::kNoError
;
382 error::Error
GLES2DecoderImpl::HandleClearBufferfvImmediate(
383 uint32_t immediate_data_size
,
384 const void* cmd_data
) {
385 if (!unsafe_es3_apis_enabled())
386 return error::kUnknownCommand
;
387 const gles2::cmds::ClearBufferfvImmediate
& c
=
388 *static_cast<const gles2::cmds::ClearBufferfvImmediate
*>(cmd_data
);
390 GLenum buffer
= static_cast<GLenum
>(c
.buffer
);
391 GLint drawbuffers
= static_cast<GLint
>(c
.drawbuffers
);
393 if (!ComputeDataSize(1, sizeof(GLfloat
), 4, &data_size
)) {
394 return error::kOutOfBounds
;
396 if (data_size
> immediate_data_size
) {
397 return error::kOutOfBounds
;
399 const GLfloat
* value
=
400 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
402 return error::kOutOfBounds
;
404 DoClearBufferfv(buffer
, drawbuffers
, value
);
405 return error::kNoError
;
408 error::Error
GLES2DecoderImpl::HandleClearBufferivImmediate(
409 uint32_t immediate_data_size
,
410 const void* cmd_data
) {
411 if (!unsafe_es3_apis_enabled())
412 return error::kUnknownCommand
;
413 const gles2::cmds::ClearBufferivImmediate
& c
=
414 *static_cast<const gles2::cmds::ClearBufferivImmediate
*>(cmd_data
);
416 GLenum buffer
= static_cast<GLenum
>(c
.buffer
);
417 GLint drawbuffers
= static_cast<GLint
>(c
.drawbuffers
);
419 if (!ComputeDataSize(1, sizeof(GLint
), 4, &data_size
)) {
420 return error::kOutOfBounds
;
422 if (data_size
> immediate_data_size
) {
423 return error::kOutOfBounds
;
426 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
428 return error::kOutOfBounds
;
430 DoClearBufferiv(buffer
, drawbuffers
, value
);
431 return error::kNoError
;
434 error::Error
GLES2DecoderImpl::HandleClearBufferuivImmediate(
435 uint32_t immediate_data_size
,
436 const void* cmd_data
) {
437 if (!unsafe_es3_apis_enabled())
438 return error::kUnknownCommand
;
439 const gles2::cmds::ClearBufferuivImmediate
& c
=
440 *static_cast<const gles2::cmds::ClearBufferuivImmediate
*>(cmd_data
);
442 GLenum buffer
= static_cast<GLenum
>(c
.buffer
);
443 GLint drawbuffers
= static_cast<GLint
>(c
.drawbuffers
);
445 if (!ComputeDataSize(1, sizeof(GLuint
), 4, &data_size
)) {
446 return error::kOutOfBounds
;
448 if (data_size
> immediate_data_size
) {
449 return error::kOutOfBounds
;
451 const GLuint
* value
=
452 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
454 return error::kOutOfBounds
;
456 DoClearBufferuiv(buffer
, drawbuffers
, value
);
457 return error::kNoError
;
460 error::Error
GLES2DecoderImpl::HandleClearColor(uint32_t immediate_data_size
,
461 const void* cmd_data
) {
462 const gles2::cmds::ClearColor
& c
=
463 *static_cast<const gles2::cmds::ClearColor
*>(cmd_data
);
465 GLclampf red
= static_cast<GLclampf
>(c
.red
);
466 GLclampf green
= static_cast<GLclampf
>(c
.green
);
467 GLclampf blue
= static_cast<GLclampf
>(c
.blue
);
468 GLclampf alpha
= static_cast<GLclampf
>(c
.alpha
);
469 if (state_
.color_clear_red
!= red
|| state_
.color_clear_green
!= green
||
470 state_
.color_clear_blue
!= blue
|| state_
.color_clear_alpha
!= alpha
) {
471 state_
.color_clear_red
= red
;
472 state_
.color_clear_green
= green
;
473 state_
.color_clear_blue
= blue
;
474 state_
.color_clear_alpha
= alpha
;
475 glClearColor(red
, green
, blue
, alpha
);
477 return error::kNoError
;
480 error::Error
GLES2DecoderImpl::HandleClearDepthf(uint32_t immediate_data_size
,
481 const void* cmd_data
) {
482 const gles2::cmds::ClearDepthf
& c
=
483 *static_cast<const gles2::cmds::ClearDepthf
*>(cmd_data
);
485 GLclampf depth
= static_cast<GLclampf
>(c
.depth
);
486 if (state_
.depth_clear
!= depth
) {
487 state_
.depth_clear
= depth
;
490 return error::kNoError
;
493 error::Error
GLES2DecoderImpl::HandleClearStencil(uint32_t immediate_data_size
,
494 const void* cmd_data
) {
495 const gles2::cmds::ClearStencil
& c
=
496 *static_cast<const gles2::cmds::ClearStencil
*>(cmd_data
);
498 GLint s
= static_cast<GLint
>(c
.s
);
499 if (state_
.stencil_clear
!= s
) {
500 state_
.stencil_clear
= s
;
503 return error::kNoError
;
506 error::Error
GLES2DecoderImpl::HandleColorMask(uint32_t immediate_data_size
,
507 const void* cmd_data
) {
508 const gles2::cmds::ColorMask
& c
=
509 *static_cast<const gles2::cmds::ColorMask
*>(cmd_data
);
511 GLboolean red
= static_cast<GLboolean
>(c
.red
);
512 GLboolean green
= static_cast<GLboolean
>(c
.green
);
513 GLboolean blue
= static_cast<GLboolean
>(c
.blue
);
514 GLboolean alpha
= static_cast<GLboolean
>(c
.alpha
);
515 if (state_
.color_mask_red
!= red
|| state_
.color_mask_green
!= green
||
516 state_
.color_mask_blue
!= blue
|| state_
.color_mask_alpha
!= alpha
) {
517 state_
.color_mask_red
= red
;
518 state_
.color_mask_green
= green
;
519 state_
.color_mask_blue
= blue
;
520 state_
.color_mask_alpha
= alpha
;
521 framebuffer_state_
.clear_state_dirty
= true;
523 return error::kNoError
;
526 error::Error
GLES2DecoderImpl::HandleCompileShader(uint32_t immediate_data_size
,
527 const void* cmd_data
) {
528 const gles2::cmds::CompileShader
& c
=
529 *static_cast<const gles2::cmds::CompileShader
*>(cmd_data
);
531 GLuint shader
= c
.shader
;
532 DoCompileShader(shader
);
533 return error::kNoError
;
536 error::Error
GLES2DecoderImpl::HandleCompressedTexSubImage2D(
537 uint32_t immediate_data_size
,
538 const void* cmd_data
) {
539 const gles2::cmds::CompressedTexSubImage2D
& c
=
540 *static_cast<const gles2::cmds::CompressedTexSubImage2D
*>(cmd_data
);
542 GLenum target
= static_cast<GLenum
>(c
.target
);
543 GLint level
= static_cast<GLint
>(c
.level
);
544 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
545 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
546 GLsizei width
= static_cast<GLsizei
>(c
.width
);
547 GLsizei height
= static_cast<GLsizei
>(c
.height
);
548 GLenum format
= static_cast<GLenum
>(c
.format
);
549 GLsizei imageSize
= static_cast<GLsizei
>(c
.imageSize
);
550 uint32_t data_size
= imageSize
;
551 const void* data
= GetSharedMemoryAs
<const void*>(
552 c
.data_shm_id
, c
.data_shm_offset
, data_size
);
553 if (!validators_
->texture_target
.IsValid(target
)) {
554 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCompressedTexSubImage2D", target
,
556 return error::kNoError
;
559 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCompressedTexSubImage2D",
561 return error::kNoError
;
564 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCompressedTexSubImage2D",
566 return error::kNoError
;
568 if (!validators_
->compressed_texture_format
.IsValid(format
)) {
569 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCompressedTexSubImage2D", format
,
571 return error::kNoError
;
574 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCompressedTexSubImage2D",
576 return error::kNoError
;
579 return error::kOutOfBounds
;
581 DoCompressedTexSubImage2D(target
, level
, xoffset
, yoffset
, width
, height
,
582 format
, imageSize
, data
);
583 return error::kNoError
;
586 error::Error
GLES2DecoderImpl::HandleCompressedTexSubImage3D(
587 uint32_t immediate_data_size
,
588 const void* cmd_data
) {
589 if (!unsafe_es3_apis_enabled())
590 return error::kUnknownCommand
;
591 const gles2::cmds::CompressedTexSubImage3D
& c
=
592 *static_cast<const gles2::cmds::CompressedTexSubImage3D
*>(cmd_data
);
594 GLenum target
= static_cast<GLenum
>(c
.target
);
595 GLint level
= static_cast<GLint
>(c
.level
);
596 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
597 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
598 GLint zoffset
= static_cast<GLint
>(c
.zoffset
);
599 GLsizei width
= static_cast<GLsizei
>(c
.width
);
600 GLsizei height
= static_cast<GLsizei
>(c
.height
);
601 GLsizei depth
= static_cast<GLsizei
>(c
.depth
);
602 GLenum format
= static_cast<GLenum
>(c
.format
);
603 GLsizei imageSize
= static_cast<GLsizei
>(c
.imageSize
);
604 uint32_t data_size
= imageSize
;
605 const void* data
= GetSharedMemoryAs
<const void*>(
606 c
.data_shm_id
, c
.data_shm_offset
, data_size
);
608 return error::kOutOfBounds
;
610 DoCompressedTexSubImage3D(target
, level
, xoffset
, yoffset
, zoffset
, width
,
611 height
, depth
, format
, imageSize
, data
);
612 return error::kNoError
;
615 error::Error
GLES2DecoderImpl::HandleCopyBufferSubData(
616 uint32_t immediate_data_size
,
617 const void* cmd_data
) {
618 if (!unsafe_es3_apis_enabled())
619 return error::kUnknownCommand
;
620 const gles2::cmds::CopyBufferSubData
& c
=
621 *static_cast<const gles2::cmds::CopyBufferSubData
*>(cmd_data
);
623 GLenum readtarget
= static_cast<GLenum
>(c
.readtarget
);
624 GLenum writetarget
= static_cast<GLenum
>(c
.writetarget
);
625 GLintptr readoffset
= static_cast<GLintptr
>(c
.readoffset
);
626 GLintptr writeoffset
= static_cast<GLintptr
>(c
.writeoffset
);
627 GLsizeiptr size
= static_cast<GLsizeiptr
>(c
.size
);
628 glCopyBufferSubData(readtarget
, writetarget
, readoffset
, writeoffset
, size
);
629 return error::kNoError
;
632 error::Error
GLES2DecoderImpl::HandleCopyTexImage2D(
633 uint32_t immediate_data_size
,
634 const void* cmd_data
) {
635 const gles2::cmds::CopyTexImage2D
& c
=
636 *static_cast<const gles2::cmds::CopyTexImage2D
*>(cmd_data
);
639 error
= WillAccessBoundFramebufferForRead();
640 if (error
!= error::kNoError
)
642 GLenum target
= static_cast<GLenum
>(c
.target
);
643 GLint level
= static_cast<GLint
>(c
.level
);
644 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
645 GLint x
= static_cast<GLint
>(c
.x
);
646 GLint y
= static_cast<GLint
>(c
.y
);
647 GLsizei width
= static_cast<GLsizei
>(c
.width
);
648 GLsizei height
= static_cast<GLsizei
>(c
.height
);
649 GLint border
= static_cast<GLint
>(c
.border
);
650 if (!validators_
->texture_target
.IsValid(target
)) {
651 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexImage2D", target
, "target");
652 return error::kNoError
;
654 if (!validators_
->texture_internal_format
.IsValid(internalformat
)) {
655 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexImage2D", internalformat
,
657 return error::kNoError
;
660 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexImage2D", "width < 0");
661 return error::kNoError
;
664 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexImage2D", "height < 0");
665 return error::kNoError
;
667 DoCopyTexImage2D(target
, level
, internalformat
, x
, y
, width
, height
, border
);
668 return error::kNoError
;
671 error::Error
GLES2DecoderImpl::HandleCopyTexSubImage2D(
672 uint32_t immediate_data_size
,
673 const void* cmd_data
) {
674 const gles2::cmds::CopyTexSubImage2D
& c
=
675 *static_cast<const gles2::cmds::CopyTexSubImage2D
*>(cmd_data
);
678 error
= WillAccessBoundFramebufferForRead();
679 if (error
!= error::kNoError
)
681 GLenum target
= static_cast<GLenum
>(c
.target
);
682 GLint level
= static_cast<GLint
>(c
.level
);
683 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
684 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
685 GLint x
= static_cast<GLint
>(c
.x
);
686 GLint y
= static_cast<GLint
>(c
.y
);
687 GLsizei width
= static_cast<GLsizei
>(c
.width
);
688 GLsizei height
= static_cast<GLsizei
>(c
.height
);
689 if (!validators_
->texture_target
.IsValid(target
)) {
690 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexSubImage2D", target
, "target");
691 return error::kNoError
;
694 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexSubImage2D", "width < 0");
695 return error::kNoError
;
698 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTexSubImage2D", "height < 0");
699 return error::kNoError
;
701 DoCopyTexSubImage2D(target
, level
, xoffset
, yoffset
, x
, y
, width
, height
);
702 return error::kNoError
;
705 error::Error
GLES2DecoderImpl::HandleCopyTexSubImage3D(
706 uint32_t immediate_data_size
,
707 const void* cmd_data
) {
708 if (!unsafe_es3_apis_enabled())
709 return error::kUnknownCommand
;
710 const gles2::cmds::CopyTexSubImage3D
& c
=
711 *static_cast<const gles2::cmds::CopyTexSubImage3D
*>(cmd_data
);
714 error
= WillAccessBoundFramebufferForRead();
715 if (error
!= error::kNoError
)
717 GLenum target
= static_cast<GLenum
>(c
.target
);
718 GLint level
= static_cast<GLint
>(c
.level
);
719 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
720 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
721 GLint zoffset
= static_cast<GLint
>(c
.zoffset
);
722 GLint x
= static_cast<GLint
>(c
.x
);
723 GLint y
= static_cast<GLint
>(c
.y
);
724 GLsizei width
= static_cast<GLsizei
>(c
.width
);
725 GLsizei height
= static_cast<GLsizei
>(c
.height
);
726 glCopyTexSubImage3D(target
, level
, xoffset
, yoffset
, zoffset
, x
, y
, width
,
728 return error::kNoError
;
731 error::Error
GLES2DecoderImpl::HandleCreateProgram(uint32_t immediate_data_size
,
732 const void* cmd_data
) {
733 const gles2::cmds::CreateProgram
& c
=
734 *static_cast<const gles2::cmds::CreateProgram
*>(cmd_data
);
736 uint32_t client_id
= c
.client_id
;
737 if (GetProgram(client_id
)) {
738 return error::kInvalidArguments
;
740 GLuint service_id
= glCreateProgram();
742 CreateProgram(client_id
, service_id
);
744 return error::kNoError
;
747 error::Error
GLES2DecoderImpl::HandleCreateShader(uint32_t immediate_data_size
,
748 const void* cmd_data
) {
749 const gles2::cmds::CreateShader
& c
=
750 *static_cast<const gles2::cmds::CreateShader
*>(cmd_data
);
752 GLenum type
= static_cast<GLenum
>(c
.type
);
753 if (!validators_
->shader_type
.IsValid(type
)) {
754 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCreateShader", type
, "type");
755 return error::kNoError
;
757 uint32_t client_id
= c
.client_id
;
758 if (GetShader(client_id
)) {
759 return error::kInvalidArguments
;
761 GLuint service_id
= glCreateShader(type
);
763 CreateShader(client_id
, service_id
, type
);
765 return error::kNoError
;
768 error::Error
GLES2DecoderImpl::HandleCullFace(uint32_t immediate_data_size
,
769 const void* cmd_data
) {
770 const gles2::cmds::CullFace
& c
=
771 *static_cast<const gles2::cmds::CullFace
*>(cmd_data
);
773 GLenum mode
= static_cast<GLenum
>(c
.mode
);
774 if (!validators_
->face_type
.IsValid(mode
)) {
775 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCullFace", mode
, "mode");
776 return error::kNoError
;
778 if (state_
.cull_mode
!= mode
) {
779 state_
.cull_mode
= mode
;
782 return error::kNoError
;
785 error::Error
GLES2DecoderImpl::HandleDeleteBuffersImmediate(
786 uint32_t immediate_data_size
,
787 const void* cmd_data
) {
788 const gles2::cmds::DeleteBuffersImmediate
& c
=
789 *static_cast<const gles2::cmds::DeleteBuffersImmediate
*>(cmd_data
);
791 GLsizei n
= static_cast<GLsizei
>(c
.n
);
793 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
794 return error::kOutOfBounds
;
796 const GLuint
* buffers
=
797 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
798 if (buffers
== NULL
) {
799 return error::kOutOfBounds
;
801 DeleteBuffersHelper(n
, buffers
);
802 return error::kNoError
;
805 error::Error
GLES2DecoderImpl::HandleDeleteFramebuffersImmediate(
806 uint32_t immediate_data_size
,
807 const void* cmd_data
) {
808 const gles2::cmds::DeleteFramebuffersImmediate
& c
=
809 *static_cast<const gles2::cmds::DeleteFramebuffersImmediate
*>(cmd_data
);
811 GLsizei n
= static_cast<GLsizei
>(c
.n
);
813 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
814 return error::kOutOfBounds
;
816 const GLuint
* framebuffers
=
817 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
818 if (framebuffers
== NULL
) {
819 return error::kOutOfBounds
;
821 DeleteFramebuffersHelper(n
, framebuffers
);
822 return error::kNoError
;
825 error::Error
GLES2DecoderImpl::HandleDeleteRenderbuffersImmediate(
826 uint32_t immediate_data_size
,
827 const void* cmd_data
) {
828 const gles2::cmds::DeleteRenderbuffersImmediate
& c
=
829 *static_cast<const gles2::cmds::DeleteRenderbuffersImmediate
*>(cmd_data
);
831 GLsizei n
= static_cast<GLsizei
>(c
.n
);
833 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
834 return error::kOutOfBounds
;
836 const GLuint
* renderbuffers
=
837 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
838 if (renderbuffers
== NULL
) {
839 return error::kOutOfBounds
;
841 DeleteRenderbuffersHelper(n
, renderbuffers
);
842 return error::kNoError
;
845 error::Error
GLES2DecoderImpl::HandleDeleteSamplersImmediate(
846 uint32_t immediate_data_size
,
847 const void* cmd_data
) {
848 if (!unsafe_es3_apis_enabled())
849 return error::kUnknownCommand
;
850 const gles2::cmds::DeleteSamplersImmediate
& c
=
851 *static_cast<const gles2::cmds::DeleteSamplersImmediate
*>(cmd_data
);
853 GLsizei n
= static_cast<GLsizei
>(c
.n
);
855 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
856 return error::kOutOfBounds
;
858 const GLuint
* samplers
=
859 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
860 if (samplers
== NULL
) {
861 return error::kOutOfBounds
;
863 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
864 GLuint service_id
= 0;
865 if (group_
->GetSamplerServiceId(samplers
[ii
], &service_id
)) {
866 glDeleteSamplers(1, &service_id
);
867 group_
->RemoveSamplerId(samplers
[ii
]);
870 return error::kNoError
;
873 error::Error
GLES2DecoderImpl::HandleDeleteSync(uint32_t immediate_data_size
,
874 const void* cmd_data
) {
875 if (!unsafe_es3_apis_enabled())
876 return error::kUnknownCommand
;
877 const gles2::cmds::DeleteSync
& c
=
878 *static_cast<const gles2::cmds::DeleteSync
*>(cmd_data
);
880 GLuint sync
= c
.sync
;
881 GLsync service_id
= 0;
882 if (group_
->GetSyncServiceId(sync
, &service_id
)) {
883 glDeleteSync(service_id
);
884 group_
->RemoveSyncId(sync
);
886 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glDeleteSync", "unknown sync");
888 return error::kNoError
;
891 error::Error
GLES2DecoderImpl::HandleDeleteTexturesImmediate(
892 uint32_t immediate_data_size
,
893 const void* cmd_data
) {
894 const gles2::cmds::DeleteTexturesImmediate
& c
=
895 *static_cast<const gles2::cmds::DeleteTexturesImmediate
*>(cmd_data
);
897 GLsizei n
= static_cast<GLsizei
>(c
.n
);
899 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
900 return error::kOutOfBounds
;
902 const GLuint
* textures
=
903 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
904 if (textures
== NULL
) {
905 return error::kOutOfBounds
;
907 DeleteTexturesHelper(n
, textures
);
908 return error::kNoError
;
911 error::Error
GLES2DecoderImpl::HandleDeleteTransformFeedbacksImmediate(
912 uint32_t immediate_data_size
,
913 const void* cmd_data
) {
914 if (!unsafe_es3_apis_enabled())
915 return error::kUnknownCommand
;
916 const gles2::cmds::DeleteTransformFeedbacksImmediate
& c
=
917 *static_cast<const gles2::cmds::DeleteTransformFeedbacksImmediate
*>(
920 GLsizei n
= static_cast<GLsizei
>(c
.n
);
922 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
923 return error::kOutOfBounds
;
926 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
928 return error::kOutOfBounds
;
930 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
931 GLuint service_id
= 0;
932 if (group_
->GetTransformFeedbackServiceId(ids
[ii
], &service_id
)) {
933 glDeleteTransformFeedbacks(1, &service_id
);
934 group_
->RemoveTransformFeedbackId(ids
[ii
]);
937 return error::kNoError
;
940 error::Error
GLES2DecoderImpl::HandleDepthFunc(uint32_t immediate_data_size
,
941 const void* cmd_data
) {
942 const gles2::cmds::DepthFunc
& c
=
943 *static_cast<const gles2::cmds::DepthFunc
*>(cmd_data
);
945 GLenum func
= static_cast<GLenum
>(c
.func
);
946 if (!validators_
->cmp_function
.IsValid(func
)) {
947 LOCAL_SET_GL_ERROR_INVALID_ENUM("glDepthFunc", func
, "func");
948 return error::kNoError
;
950 if (state_
.depth_func
!= func
) {
951 state_
.depth_func
= func
;
954 return error::kNoError
;
957 error::Error
GLES2DecoderImpl::HandleDepthMask(uint32_t immediate_data_size
,
958 const void* cmd_data
) {
959 const gles2::cmds::DepthMask
& c
=
960 *static_cast<const gles2::cmds::DepthMask
*>(cmd_data
);
962 GLboolean flag
= static_cast<GLboolean
>(c
.flag
);
963 if (state_
.depth_mask
!= flag
) {
964 state_
.depth_mask
= flag
;
965 framebuffer_state_
.clear_state_dirty
= true;
967 return error::kNoError
;
970 error::Error
GLES2DecoderImpl::HandleDepthRangef(uint32_t immediate_data_size
,
971 const void* cmd_data
) {
972 const gles2::cmds::DepthRangef
& c
=
973 *static_cast<const gles2::cmds::DepthRangef
*>(cmd_data
);
975 GLclampf zNear
= static_cast<GLclampf
>(c
.zNear
);
976 GLclampf zFar
= static_cast<GLclampf
>(c
.zFar
);
977 DoDepthRangef(zNear
, zFar
);
978 return error::kNoError
;
981 error::Error
GLES2DecoderImpl::HandleDetachShader(uint32_t immediate_data_size
,
982 const void* cmd_data
) {
983 const gles2::cmds::DetachShader
& c
=
984 *static_cast<const gles2::cmds::DetachShader
*>(cmd_data
);
986 GLuint program
= c
.program
;
987 GLuint shader
= c
.shader
;
988 DoDetachShader(program
, shader
);
989 return error::kNoError
;
992 error::Error
GLES2DecoderImpl::HandleDisable(uint32_t immediate_data_size
,
993 const void* cmd_data
) {
994 const gles2::cmds::Disable
& c
=
995 *static_cast<const gles2::cmds::Disable
*>(cmd_data
);
997 GLenum cap
= static_cast<GLenum
>(c
.cap
);
998 if (!validators_
->capability
.IsValid(cap
)) {
999 LOCAL_SET_GL_ERROR_INVALID_ENUM("glDisable", cap
, "cap");
1000 return error::kNoError
;
1003 return error::kNoError
;
1006 error::Error
GLES2DecoderImpl::HandleDisableVertexAttribArray(
1007 uint32_t immediate_data_size
,
1008 const void* cmd_data
) {
1009 const gles2::cmds::DisableVertexAttribArray
& c
=
1010 *static_cast<const gles2::cmds::DisableVertexAttribArray
*>(cmd_data
);
1012 GLuint index
= static_cast<GLuint
>(c
.index
);
1013 DoDisableVertexAttribArray(index
);
1014 return error::kNoError
;
1017 error::Error
GLES2DecoderImpl::HandleEnable(uint32_t immediate_data_size
,
1018 const void* cmd_data
) {
1019 const gles2::cmds::Enable
& c
=
1020 *static_cast<const gles2::cmds::Enable
*>(cmd_data
);
1022 GLenum cap
= static_cast<GLenum
>(c
.cap
);
1023 if (!validators_
->capability
.IsValid(cap
)) {
1024 LOCAL_SET_GL_ERROR_INVALID_ENUM("glEnable", cap
, "cap");
1025 return error::kNoError
;
1028 return error::kNoError
;
1031 error::Error
GLES2DecoderImpl::HandleEnableVertexAttribArray(
1032 uint32_t immediate_data_size
,
1033 const void* cmd_data
) {
1034 const gles2::cmds::EnableVertexAttribArray
& c
=
1035 *static_cast<const gles2::cmds::EnableVertexAttribArray
*>(cmd_data
);
1037 GLuint index
= static_cast<GLuint
>(c
.index
);
1038 DoEnableVertexAttribArray(index
);
1039 return error::kNoError
;
1042 error::Error
GLES2DecoderImpl::HandleFenceSync(uint32_t immediate_data_size
,
1043 const void* cmd_data
) {
1044 if (!unsafe_es3_apis_enabled())
1045 return error::kUnknownCommand
;
1046 const gles2::cmds::FenceSync
& c
=
1047 *static_cast<const gles2::cmds::FenceSync
*>(cmd_data
);
1049 GLenum condition
= static_cast<GLenum
>(c
.condition
);
1050 GLbitfield flags
= static_cast<GLbitfield
>(c
.flags
);
1051 uint32_t client_id
= c
.client_id
;
1052 GLsync service_id
= 0;
1053 if (group_
->GetSyncServiceId(client_id
, &service_id
)) {
1054 return error::kInvalidArguments
;
1056 service_id
= glFenceSync(condition
, flags
);
1058 group_
->AddSyncId(client_id
, service_id
);
1060 return error::kNoError
;
1063 error::Error
GLES2DecoderImpl::HandleFinish(uint32_t immediate_data_size
,
1064 const void* cmd_data
) {
1065 const gles2::cmds::Finish
& c
=
1066 *static_cast<const gles2::cmds::Finish
*>(cmd_data
);
1069 error
= WillAccessBoundFramebufferForRead();
1070 if (error
!= error::kNoError
)
1073 return error::kNoError
;
1076 error::Error
GLES2DecoderImpl::HandleFlush(uint32_t immediate_data_size
,
1077 const void* cmd_data
) {
1078 const gles2::cmds::Flush
& c
=
1079 *static_cast<const gles2::cmds::Flush
*>(cmd_data
);
1082 return error::kNoError
;
1085 error::Error
GLES2DecoderImpl::HandleFramebufferRenderbuffer(
1086 uint32_t immediate_data_size
,
1087 const void* cmd_data
) {
1088 const gles2::cmds::FramebufferRenderbuffer
& c
=
1089 *static_cast<const gles2::cmds::FramebufferRenderbuffer
*>(cmd_data
);
1091 GLenum target
= static_cast<GLenum
>(c
.target
);
1092 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1093 GLenum renderbuffertarget
= static_cast<GLenum
>(c
.renderbuffertarget
);
1094 GLuint renderbuffer
= c
.renderbuffer
;
1095 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
1096 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer", target
,
1098 return error::kNoError
;
1100 if (!validators_
->attachment
.IsValid(attachment
)) {
1101 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer", attachment
,
1103 return error::kNoError
;
1105 if (!validators_
->render_buffer_target
.IsValid(renderbuffertarget
)) {
1106 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer",
1107 renderbuffertarget
, "renderbuffertarget");
1108 return error::kNoError
;
1110 DoFramebufferRenderbuffer(target
, attachment
, renderbuffertarget
,
1112 return error::kNoError
;
1115 error::Error
GLES2DecoderImpl::HandleFramebufferTexture2D(
1116 uint32_t immediate_data_size
,
1117 const void* cmd_data
) {
1118 const gles2::cmds::FramebufferTexture2D
& c
=
1119 *static_cast<const gles2::cmds::FramebufferTexture2D
*>(cmd_data
);
1121 GLenum target
= static_cast<GLenum
>(c
.target
);
1122 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1123 GLenum textarget
= static_cast<GLenum
>(c
.textarget
);
1124 GLuint texture
= c
.texture
;
1125 GLint level
= static_cast<GLint
>(c
.level
);
1126 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
1127 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", target
, "target");
1128 return error::kNoError
;
1130 if (!validators_
->attachment
.IsValid(attachment
)) {
1131 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", attachment
,
1133 return error::kNoError
;
1135 if (!validators_
->texture_target
.IsValid(textarget
)) {
1136 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", textarget
,
1138 return error::kNoError
;
1140 DoFramebufferTexture2D(target
, attachment
, textarget
, texture
, level
);
1141 return error::kNoError
;
1144 error::Error
GLES2DecoderImpl::HandleFramebufferTextureLayer(
1145 uint32_t immediate_data_size
,
1146 const void* cmd_data
) {
1147 if (!unsafe_es3_apis_enabled())
1148 return error::kUnknownCommand
;
1149 const gles2::cmds::FramebufferTextureLayer
& c
=
1150 *static_cast<const gles2::cmds::FramebufferTextureLayer
*>(cmd_data
);
1152 GLenum target
= static_cast<GLenum
>(c
.target
);
1153 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1154 GLuint texture
= c
.texture
;
1155 GLint level
= static_cast<GLint
>(c
.level
);
1156 GLint layer
= static_cast<GLint
>(c
.layer
);
1157 DoFramebufferTextureLayer(target
, attachment
, texture
, level
, layer
);
1158 return error::kNoError
;
1161 error::Error
GLES2DecoderImpl::HandleFrontFace(uint32_t immediate_data_size
,
1162 const void* cmd_data
) {
1163 const gles2::cmds::FrontFace
& c
=
1164 *static_cast<const gles2::cmds::FrontFace
*>(cmd_data
);
1166 GLenum mode
= static_cast<GLenum
>(c
.mode
);
1167 if (!validators_
->face_mode
.IsValid(mode
)) {
1168 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFrontFace", mode
, "mode");
1169 return error::kNoError
;
1171 if (state_
.front_face
!= mode
) {
1172 state_
.front_face
= mode
;
1175 return error::kNoError
;
1178 error::Error
GLES2DecoderImpl::HandleGenBuffersImmediate(
1179 uint32_t immediate_data_size
,
1180 const void* cmd_data
) {
1181 const gles2::cmds::GenBuffersImmediate
& c
=
1182 *static_cast<const gles2::cmds::GenBuffersImmediate
*>(cmd_data
);
1184 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1186 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1187 return error::kOutOfBounds
;
1190 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1191 if (buffers
== NULL
) {
1192 return error::kOutOfBounds
;
1194 if (!GenBuffersHelper(n
, buffers
)) {
1195 return error::kInvalidArguments
;
1197 return error::kNoError
;
1200 error::Error
GLES2DecoderImpl::HandleGenerateMipmap(
1201 uint32_t immediate_data_size
,
1202 const void* cmd_data
) {
1203 const gles2::cmds::GenerateMipmap
& c
=
1204 *static_cast<const gles2::cmds::GenerateMipmap
*>(cmd_data
);
1206 GLenum target
= static_cast<GLenum
>(c
.target
);
1207 if (!validators_
->texture_bind_target
.IsValid(target
)) {
1208 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGenerateMipmap", target
, "target");
1209 return error::kNoError
;
1211 DoGenerateMipmap(target
);
1212 return error::kNoError
;
1215 error::Error
GLES2DecoderImpl::HandleGenFramebuffersImmediate(
1216 uint32_t immediate_data_size
,
1217 const void* cmd_data
) {
1218 const gles2::cmds::GenFramebuffersImmediate
& c
=
1219 *static_cast<const gles2::cmds::GenFramebuffersImmediate
*>(cmd_data
);
1221 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1223 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1224 return error::kOutOfBounds
;
1226 GLuint
* framebuffers
=
1227 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1228 if (framebuffers
== NULL
) {
1229 return error::kOutOfBounds
;
1231 if (!GenFramebuffersHelper(n
, framebuffers
)) {
1232 return error::kInvalidArguments
;
1234 return error::kNoError
;
1237 error::Error
GLES2DecoderImpl::HandleGenRenderbuffersImmediate(
1238 uint32_t immediate_data_size
,
1239 const void* cmd_data
) {
1240 const gles2::cmds::GenRenderbuffersImmediate
& c
=
1241 *static_cast<const gles2::cmds::GenRenderbuffersImmediate
*>(cmd_data
);
1243 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1245 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1246 return error::kOutOfBounds
;
1248 GLuint
* renderbuffers
=
1249 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1250 if (renderbuffers
== NULL
) {
1251 return error::kOutOfBounds
;
1253 if (!GenRenderbuffersHelper(n
, renderbuffers
)) {
1254 return error::kInvalidArguments
;
1256 return error::kNoError
;
1259 error::Error
GLES2DecoderImpl::HandleGenSamplersImmediate(
1260 uint32_t immediate_data_size
,
1261 const void* cmd_data
) {
1262 if (!unsafe_es3_apis_enabled())
1263 return error::kUnknownCommand
;
1264 const gles2::cmds::GenSamplersImmediate
& c
=
1265 *static_cast<const gles2::cmds::GenSamplersImmediate
*>(cmd_data
);
1267 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1269 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1270 return error::kOutOfBounds
;
1273 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1274 if (samplers
== NULL
) {
1275 return error::kOutOfBounds
;
1277 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1278 if (group_
->GetSamplerServiceId(samplers
[ii
], NULL
)) {
1279 return error::kInvalidArguments
;
1282 scoped_ptr
<GLuint
[]> service_ids(new GLuint
[n
]);
1283 glGenSamplers(n
, service_ids
.get());
1284 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1285 group_
->AddSamplerId(samplers
[ii
], service_ids
[ii
]);
1287 return error::kNoError
;
1290 error::Error
GLES2DecoderImpl::HandleGenTexturesImmediate(
1291 uint32_t immediate_data_size
,
1292 const void* cmd_data
) {
1293 const gles2::cmds::GenTexturesImmediate
& c
=
1294 *static_cast<const gles2::cmds::GenTexturesImmediate
*>(cmd_data
);
1296 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1298 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1299 return error::kOutOfBounds
;
1302 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1303 if (textures
== NULL
) {
1304 return error::kOutOfBounds
;
1306 if (!GenTexturesHelper(n
, textures
)) {
1307 return error::kInvalidArguments
;
1309 return error::kNoError
;
1312 error::Error
GLES2DecoderImpl::HandleGenTransformFeedbacksImmediate(
1313 uint32_t immediate_data_size
,
1314 const void* cmd_data
) {
1315 if (!unsafe_es3_apis_enabled())
1316 return error::kUnknownCommand
;
1317 const gles2::cmds::GenTransformFeedbacksImmediate
& c
=
1318 *static_cast<const gles2::cmds::GenTransformFeedbacksImmediate
*>(
1321 GLsizei n
= static_cast<GLsizei
>(c
.n
);
1323 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
1324 return error::kOutOfBounds
;
1326 GLuint
* ids
= GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
1328 return error::kOutOfBounds
;
1330 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1331 if (group_
->GetTransformFeedbackServiceId(ids
[ii
], NULL
)) {
1332 return error::kInvalidArguments
;
1335 scoped_ptr
<GLuint
[]> service_ids(new GLuint
[n
]);
1336 glGenTransformFeedbacks(n
, service_ids
.get());
1337 for (GLsizei ii
= 0; ii
< n
; ++ii
) {
1338 group_
->AddTransformFeedbackId(ids
[ii
], service_ids
[ii
]);
1340 return error::kNoError
;
1343 error::Error
GLES2DecoderImpl::HandleGetBooleanv(uint32_t immediate_data_size
,
1344 const void* cmd_data
) {
1345 const gles2::cmds::GetBooleanv
& c
=
1346 *static_cast<const gles2::cmds::GetBooleanv
*>(cmd_data
);
1348 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1349 typedef cmds::GetBooleanv::Result Result
;
1350 GLsizei num_values
= 0;
1351 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1352 Result
* result
= GetSharedMemoryAs
<Result
*>(
1353 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1354 GLboolean
* params
= result
? result
->GetData() : NULL
;
1355 if (!validators_
->g_l_state
.IsValid(pname
)) {
1356 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBooleanv", pname
, "pname");
1357 return error::kNoError
;
1359 if (params
== NULL
) {
1360 return error::kOutOfBounds
;
1362 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetBooleanv");
1363 // Check that the client initialized the result.
1364 if (result
->size
!= 0) {
1365 return error::kInvalidArguments
;
1367 DoGetBooleanv(pname
, params
);
1368 GLenum error
= LOCAL_PEEK_GL_ERROR("GetBooleanv");
1369 if (error
== GL_NO_ERROR
) {
1370 result
->SetNumResults(num_values
);
1372 return error::kNoError
;
1375 error::Error
GLES2DecoderImpl::HandleGetBufferParameteri64v(
1376 uint32_t immediate_data_size
,
1377 const void* cmd_data
) {
1378 if (!unsafe_es3_apis_enabled())
1379 return error::kUnknownCommand
;
1380 const gles2::cmds::GetBufferParameteri64v
& c
=
1381 *static_cast<const gles2::cmds::GetBufferParameteri64v
*>(cmd_data
);
1383 GLenum target
= static_cast<GLenum
>(c
.target
);
1384 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1385 typedef cmds::GetBufferParameteri64v::Result Result
;
1386 GLsizei num_values
= 0;
1387 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1388 Result
* result
= GetSharedMemoryAs
<Result
*>(
1389 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1390 GLint64
* params
= result
? result
->GetData() : NULL
;
1391 if (params
== NULL
) {
1392 return error::kOutOfBounds
;
1394 // Check that the client initialized the result.
1395 if (result
->size
!= 0) {
1396 return error::kInvalidArguments
;
1398 DoGetBufferParameteri64v(target
, pname
, params
);
1399 result
->SetNumResults(num_values
);
1400 return error::kNoError
;
1402 error::Error
GLES2DecoderImpl::HandleGetBufferParameteriv(
1403 uint32_t immediate_data_size
,
1404 const void* cmd_data
) {
1405 const gles2::cmds::GetBufferParameteriv
& c
=
1406 *static_cast<const gles2::cmds::GetBufferParameteriv
*>(cmd_data
);
1408 GLenum target
= static_cast<GLenum
>(c
.target
);
1409 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1410 typedef cmds::GetBufferParameteriv::Result Result
;
1411 GLsizei num_values
= 0;
1412 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1413 Result
* result
= GetSharedMemoryAs
<Result
*>(
1414 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1415 GLint
* params
= result
? result
->GetData() : NULL
;
1416 if (!validators_
->buffer_target
.IsValid(target
)) {
1417 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", target
, "target");
1418 return error::kNoError
;
1420 if (!validators_
->buffer_parameter
.IsValid(pname
)) {
1421 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", pname
, "pname");
1422 return error::kNoError
;
1424 if (params
== NULL
) {
1425 return error::kOutOfBounds
;
1427 // Check that the client initialized the result.
1428 if (result
->size
!= 0) {
1429 return error::kInvalidArguments
;
1431 DoGetBufferParameteriv(target
, pname
, params
);
1432 result
->SetNumResults(num_values
);
1433 return error::kNoError
;
1435 error::Error
GLES2DecoderImpl::HandleGetError(uint32_t immediate_data_size
,
1436 const void* cmd_data
) {
1437 const gles2::cmds::GetError
& c
=
1438 *static_cast<const gles2::cmds::GetError
*>(cmd_data
);
1440 typedef cmds::GetError::Result Result
;
1441 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
1442 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
1444 return error::kOutOfBounds
;
1446 *result_dst
= GetErrorState()->GetGLError();
1447 return error::kNoError
;
1450 error::Error
GLES2DecoderImpl::HandleGetFloatv(uint32_t immediate_data_size
,
1451 const void* cmd_data
) {
1452 const gles2::cmds::GetFloatv
& c
=
1453 *static_cast<const gles2::cmds::GetFloatv
*>(cmd_data
);
1455 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1456 typedef cmds::GetFloatv::Result Result
;
1457 GLsizei num_values
= 0;
1458 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1459 Result
* result
= GetSharedMemoryAs
<Result
*>(
1460 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1461 GLfloat
* params
= result
? result
->GetData() : NULL
;
1462 if (!validators_
->g_l_state
.IsValid(pname
)) {
1463 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFloatv", pname
, "pname");
1464 return error::kNoError
;
1466 if (params
== NULL
) {
1467 return error::kOutOfBounds
;
1469 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetFloatv");
1470 // Check that the client initialized the result.
1471 if (result
->size
!= 0) {
1472 return error::kInvalidArguments
;
1474 DoGetFloatv(pname
, params
);
1475 GLenum error
= LOCAL_PEEK_GL_ERROR("GetFloatv");
1476 if (error
== GL_NO_ERROR
) {
1477 result
->SetNumResults(num_values
);
1479 return error::kNoError
;
1482 error::Error
GLES2DecoderImpl::HandleGetFramebufferAttachmentParameteriv(
1483 uint32_t immediate_data_size
,
1484 const void* cmd_data
) {
1485 const gles2::cmds::GetFramebufferAttachmentParameteriv
& c
=
1486 *static_cast<const gles2::cmds::GetFramebufferAttachmentParameteriv
*>(
1489 GLenum target
= static_cast<GLenum
>(c
.target
);
1490 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
1491 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1492 typedef cmds::GetFramebufferAttachmentParameteriv::Result Result
;
1493 GLsizei num_values
= 0;
1494 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1495 Result
* result
= GetSharedMemoryAs
<Result
*>(
1496 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1497 GLint
* params
= result
? result
->GetData() : NULL
;
1498 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
1499 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv",
1501 return error::kNoError
;
1503 if (!validators_
->attachment
.IsValid(attachment
)) {
1504 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv",
1505 attachment
, "attachment");
1506 return error::kNoError
;
1508 if (!validators_
->frame_buffer_parameter
.IsValid(pname
)) {
1509 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv",
1511 return error::kNoError
;
1513 if (params
== NULL
) {
1514 return error::kOutOfBounds
;
1516 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetFramebufferAttachmentParameteriv");
1517 // Check that the client initialized the result.
1518 if (result
->size
!= 0) {
1519 return error::kInvalidArguments
;
1521 DoGetFramebufferAttachmentParameteriv(target
, attachment
, pname
, params
);
1522 GLenum error
= LOCAL_PEEK_GL_ERROR("GetFramebufferAttachmentParameteriv");
1523 if (error
== GL_NO_ERROR
) {
1524 result
->SetNumResults(num_values
);
1526 return error::kNoError
;
1529 error::Error
GLES2DecoderImpl::HandleGetInteger64v(uint32_t immediate_data_size
,
1530 const void* cmd_data
) {
1531 if (!unsafe_es3_apis_enabled())
1532 return error::kUnknownCommand
;
1533 const gles2::cmds::GetInteger64v
& c
=
1534 *static_cast<const gles2::cmds::GetInteger64v
*>(cmd_data
);
1536 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1537 typedef cmds::GetInteger64v::Result Result
;
1538 GLsizei num_values
= 0;
1539 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1540 Result
* result
= GetSharedMemoryAs
<Result
*>(
1541 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1542 GLint64
* params
= result
? result
->GetData() : NULL
;
1543 if (params
== NULL
) {
1544 return error::kOutOfBounds
;
1546 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetInteger64v");
1547 // Check that the client initialized the result.
1548 if (result
->size
!= 0) {
1549 return error::kInvalidArguments
;
1551 DoGetInteger64v(pname
, params
);
1552 GLenum error
= LOCAL_PEEK_GL_ERROR("GetInteger64v");
1553 if (error
== GL_NO_ERROR
) {
1554 result
->SetNumResults(num_values
);
1556 return error::kNoError
;
1559 error::Error
GLES2DecoderImpl::HandleGetIntegeri_v(uint32_t immediate_data_size
,
1560 const void* cmd_data
) {
1561 if (!unsafe_es3_apis_enabled())
1562 return error::kUnknownCommand
;
1563 const gles2::cmds::GetIntegeri_v
& c
=
1564 *static_cast<const gles2::cmds::GetIntegeri_v
*>(cmd_data
);
1566 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1567 GLuint index
= static_cast<GLuint
>(c
.index
);
1568 typedef cmds::GetIntegeri_v::Result Result
;
1569 GLsizei num_values
= 0;
1570 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1571 Result
* result
= GetSharedMemoryAs
<Result
*>(c
.data_shm_id
, c
.data_shm_offset
,
1572 Result::ComputeSize(num_values
));
1573 GLint
* data
= result
? result
->GetData() : NULL
;
1575 return error::kOutOfBounds
;
1577 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetIntegeri_v");
1578 // Check that the client initialized the result.
1579 if (result
->size
!= 0) {
1580 return error::kInvalidArguments
;
1582 glGetIntegeri_v(pname
, index
, data
);
1583 GLenum error
= LOCAL_PEEK_GL_ERROR("GetIntegeri_v");
1584 if (error
== GL_NO_ERROR
) {
1585 result
->SetNumResults(num_values
);
1587 return error::kNoError
;
1590 error::Error
GLES2DecoderImpl::HandleGetInteger64i_v(
1591 uint32_t immediate_data_size
,
1592 const void* cmd_data
) {
1593 if (!unsafe_es3_apis_enabled())
1594 return error::kUnknownCommand
;
1595 const gles2::cmds::GetInteger64i_v
& c
=
1596 *static_cast<const gles2::cmds::GetInteger64i_v
*>(cmd_data
);
1598 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1599 GLuint index
= static_cast<GLuint
>(c
.index
);
1600 typedef cmds::GetInteger64i_v::Result Result
;
1601 GLsizei num_values
= 0;
1602 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1603 Result
* result
= GetSharedMemoryAs
<Result
*>(c
.data_shm_id
, c
.data_shm_offset
,
1604 Result::ComputeSize(num_values
));
1605 GLint64
* data
= result
? result
->GetData() : NULL
;
1607 return error::kOutOfBounds
;
1609 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetInteger64i_v");
1610 // Check that the client initialized the result.
1611 if (result
->size
!= 0) {
1612 return error::kInvalidArguments
;
1614 glGetInteger64i_v(pname
, index
, data
);
1615 GLenum error
= LOCAL_PEEK_GL_ERROR("GetInteger64i_v");
1616 if (error
== GL_NO_ERROR
) {
1617 result
->SetNumResults(num_values
);
1619 return error::kNoError
;
1622 error::Error
GLES2DecoderImpl::HandleGetIntegerv(uint32_t immediate_data_size
,
1623 const void* cmd_data
) {
1624 const gles2::cmds::GetIntegerv
& c
=
1625 *static_cast<const gles2::cmds::GetIntegerv
*>(cmd_data
);
1627 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1628 typedef cmds::GetIntegerv::Result Result
;
1629 GLsizei num_values
= 0;
1630 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1631 Result
* result
= GetSharedMemoryAs
<Result
*>(
1632 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1633 GLint
* params
= result
? result
->GetData() : NULL
;
1634 if (!validators_
->g_l_state
.IsValid(pname
)) {
1635 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetIntegerv", pname
, "pname");
1636 return error::kNoError
;
1638 if (params
== NULL
) {
1639 return error::kOutOfBounds
;
1641 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetIntegerv");
1642 // Check that the client initialized the result.
1643 if (result
->size
!= 0) {
1644 return error::kInvalidArguments
;
1646 DoGetIntegerv(pname
, params
);
1647 GLenum error
= LOCAL_PEEK_GL_ERROR("GetIntegerv");
1648 if (error
== GL_NO_ERROR
) {
1649 result
->SetNumResults(num_values
);
1651 return error::kNoError
;
1654 error::Error
GLES2DecoderImpl::HandleGetProgramiv(uint32_t immediate_data_size
,
1655 const void* cmd_data
) {
1656 const gles2::cmds::GetProgramiv
& c
=
1657 *static_cast<const gles2::cmds::GetProgramiv
*>(cmd_data
);
1659 GLuint program
= c
.program
;
1660 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1661 typedef cmds::GetProgramiv::Result Result
;
1662 GLsizei num_values
= 0;
1663 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1664 Result
* result
= GetSharedMemoryAs
<Result
*>(
1665 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1666 GLint
* params
= result
? result
->GetData() : NULL
;
1667 if (!validators_
->program_parameter
.IsValid(pname
)) {
1668 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetProgramiv", pname
, "pname");
1669 return error::kNoError
;
1671 if (params
== NULL
) {
1672 return error::kOutOfBounds
;
1674 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetProgramiv");
1675 // Check that the client initialized the result.
1676 if (result
->size
!= 0) {
1677 return error::kInvalidArguments
;
1679 DoGetProgramiv(program
, pname
, params
);
1680 GLenum error
= LOCAL_PEEK_GL_ERROR("GetProgramiv");
1681 if (error
== GL_NO_ERROR
) {
1682 result
->SetNumResults(num_values
);
1684 return error::kNoError
;
1687 error::Error
GLES2DecoderImpl::HandleGetRenderbufferParameteriv(
1688 uint32_t immediate_data_size
,
1689 const void* cmd_data
) {
1690 const gles2::cmds::GetRenderbufferParameteriv
& c
=
1691 *static_cast<const gles2::cmds::GetRenderbufferParameteriv
*>(cmd_data
);
1693 GLenum target
= static_cast<GLenum
>(c
.target
);
1694 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1695 typedef cmds::GetRenderbufferParameteriv::Result Result
;
1696 GLsizei num_values
= 0;
1697 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1698 Result
* result
= GetSharedMemoryAs
<Result
*>(
1699 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1700 GLint
* params
= result
? result
->GetData() : NULL
;
1701 if (!validators_
->render_buffer_target
.IsValid(target
)) {
1702 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetRenderbufferParameteriv", target
,
1704 return error::kNoError
;
1706 if (!validators_
->render_buffer_parameter
.IsValid(pname
)) {
1707 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetRenderbufferParameteriv", pname
,
1709 return error::kNoError
;
1711 if (params
== NULL
) {
1712 return error::kOutOfBounds
;
1714 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetRenderbufferParameteriv");
1715 // Check that the client initialized the result.
1716 if (result
->size
!= 0) {
1717 return error::kInvalidArguments
;
1719 DoGetRenderbufferParameteriv(target
, pname
, params
);
1720 GLenum error
= LOCAL_PEEK_GL_ERROR("GetRenderbufferParameteriv");
1721 if (error
== GL_NO_ERROR
) {
1722 result
->SetNumResults(num_values
);
1724 return error::kNoError
;
1727 error::Error
GLES2DecoderImpl::HandleGetSamplerParameterfv(
1728 uint32_t immediate_data_size
,
1729 const void* cmd_data
) {
1730 if (!unsafe_es3_apis_enabled())
1731 return error::kUnknownCommand
;
1732 const gles2::cmds::GetSamplerParameterfv
& c
=
1733 *static_cast<const gles2::cmds::GetSamplerParameterfv
*>(cmd_data
);
1735 GLuint sampler
= c
.sampler
;
1736 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1737 typedef cmds::GetSamplerParameterfv::Result Result
;
1738 GLsizei num_values
= 0;
1739 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1740 Result
* result
= GetSharedMemoryAs
<Result
*>(
1741 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1742 GLfloat
* params
= result
? result
->GetData() : NULL
;
1743 if (params
== NULL
) {
1744 return error::kOutOfBounds
;
1746 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetSamplerParameterfv");
1747 // Check that the client initialized the result.
1748 if (result
->size
!= 0) {
1749 return error::kInvalidArguments
;
1751 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
1752 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glGetSamplerParameterfv",
1753 "invalid sampler id");
1754 return error::kNoError
;
1756 glGetSamplerParameterfv(sampler
, pname
, params
);
1757 GLenum error
= LOCAL_PEEK_GL_ERROR("GetSamplerParameterfv");
1758 if (error
== GL_NO_ERROR
) {
1759 result
->SetNumResults(num_values
);
1761 return error::kNoError
;
1764 error::Error
GLES2DecoderImpl::HandleGetSamplerParameteriv(
1765 uint32_t immediate_data_size
,
1766 const void* cmd_data
) {
1767 if (!unsafe_es3_apis_enabled())
1768 return error::kUnknownCommand
;
1769 const gles2::cmds::GetSamplerParameteriv
& c
=
1770 *static_cast<const gles2::cmds::GetSamplerParameteriv
*>(cmd_data
);
1772 GLuint sampler
= c
.sampler
;
1773 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1774 typedef cmds::GetSamplerParameteriv::Result Result
;
1775 GLsizei num_values
= 0;
1776 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1777 Result
* result
= GetSharedMemoryAs
<Result
*>(
1778 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1779 GLint
* params
= result
? result
->GetData() : NULL
;
1780 if (params
== NULL
) {
1781 return error::kOutOfBounds
;
1783 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetSamplerParameteriv");
1784 // Check that the client initialized the result.
1785 if (result
->size
!= 0) {
1786 return error::kInvalidArguments
;
1788 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
1789 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glGetSamplerParameteriv",
1790 "invalid sampler id");
1791 return error::kNoError
;
1793 glGetSamplerParameteriv(sampler
, pname
, params
);
1794 GLenum error
= LOCAL_PEEK_GL_ERROR("GetSamplerParameteriv");
1795 if (error
== GL_NO_ERROR
) {
1796 result
->SetNumResults(num_values
);
1798 return error::kNoError
;
1801 error::Error
GLES2DecoderImpl::HandleGetShaderiv(uint32_t immediate_data_size
,
1802 const void* cmd_data
) {
1803 const gles2::cmds::GetShaderiv
& c
=
1804 *static_cast<const gles2::cmds::GetShaderiv
*>(cmd_data
);
1806 GLuint shader
= c
.shader
;
1807 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1808 typedef cmds::GetShaderiv::Result Result
;
1809 GLsizei num_values
= 0;
1810 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1811 Result
* result
= GetSharedMemoryAs
<Result
*>(
1812 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1813 GLint
* params
= result
? result
->GetData() : NULL
;
1814 if (!validators_
->shader_parameter
.IsValid(pname
)) {
1815 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetShaderiv", pname
, "pname");
1816 return error::kNoError
;
1818 if (params
== NULL
) {
1819 return error::kOutOfBounds
;
1821 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetShaderiv");
1822 // Check that the client initialized the result.
1823 if (result
->size
!= 0) {
1824 return error::kInvalidArguments
;
1826 DoGetShaderiv(shader
, pname
, params
);
1827 GLenum error
= LOCAL_PEEK_GL_ERROR("GetShaderiv");
1828 if (error
== GL_NO_ERROR
) {
1829 result
->SetNumResults(num_values
);
1831 return error::kNoError
;
1834 error::Error
GLES2DecoderImpl::HandleGetSynciv(uint32_t immediate_data_size
,
1835 const void* cmd_data
) {
1836 if (!unsafe_es3_apis_enabled())
1837 return error::kUnknownCommand
;
1838 const gles2::cmds::GetSynciv
& c
=
1839 *static_cast<const gles2::cmds::GetSynciv
*>(cmd_data
);
1841 GLuint sync
= static_cast<GLuint
>(c
.sync
);
1842 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1843 typedef cmds::GetSynciv::Result Result
;
1844 GLsizei num_values
= 0;
1845 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1846 Result
* result
= GetSharedMemoryAs
<Result
*>(
1847 c
.values_shm_id
, c
.values_shm_offset
, Result::ComputeSize(num_values
));
1848 GLint
* values
= result
? result
->GetData() : NULL
;
1849 if (values
== NULL
) {
1850 return error::kOutOfBounds
;
1852 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetSynciv");
1853 // Check that the client initialized the result.
1854 if (result
->size
!= 0) {
1855 return error::kInvalidArguments
;
1857 GLsync service_sync
= 0;
1858 if (!group_
->GetSyncServiceId(sync
, &service_sync
)) {
1859 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glGetSynciv", "invalid sync id");
1860 return error::kNoError
;
1862 glGetSynciv(service_sync
, pname
, num_values
, nullptr, values
);
1863 GLenum error
= LOCAL_PEEK_GL_ERROR("GetSynciv");
1864 if (error
== GL_NO_ERROR
) {
1865 result
->SetNumResults(num_values
);
1867 return error::kNoError
;
1870 error::Error
GLES2DecoderImpl::HandleGetTexParameterfv(
1871 uint32_t immediate_data_size
,
1872 const void* cmd_data
) {
1873 const gles2::cmds::GetTexParameterfv
& c
=
1874 *static_cast<const gles2::cmds::GetTexParameterfv
*>(cmd_data
);
1876 GLenum target
= static_cast<GLenum
>(c
.target
);
1877 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1878 typedef cmds::GetTexParameterfv::Result Result
;
1879 GLsizei num_values
= 0;
1880 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1881 Result
* result
= GetSharedMemoryAs
<Result
*>(
1882 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1883 GLfloat
* params
= result
? result
->GetData() : NULL
;
1884 if (!validators_
->get_tex_param_target
.IsValid(target
)) {
1885 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameterfv", target
, "target");
1886 return error::kNoError
;
1888 if (!validators_
->texture_parameter
.IsValid(pname
)) {
1889 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameterfv", pname
, "pname");
1890 return error::kNoError
;
1892 if (params
== NULL
) {
1893 return error::kOutOfBounds
;
1895 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetTexParameterfv");
1896 // Check that the client initialized the result.
1897 if (result
->size
!= 0) {
1898 return error::kInvalidArguments
;
1900 DoGetTexParameterfv(target
, pname
, params
);
1901 GLenum error
= LOCAL_PEEK_GL_ERROR("GetTexParameterfv");
1902 if (error
== GL_NO_ERROR
) {
1903 result
->SetNumResults(num_values
);
1905 return error::kNoError
;
1908 error::Error
GLES2DecoderImpl::HandleGetTexParameteriv(
1909 uint32_t immediate_data_size
,
1910 const void* cmd_data
) {
1911 const gles2::cmds::GetTexParameteriv
& c
=
1912 *static_cast<const gles2::cmds::GetTexParameteriv
*>(cmd_data
);
1914 GLenum target
= static_cast<GLenum
>(c
.target
);
1915 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1916 typedef cmds::GetTexParameteriv::Result Result
;
1917 GLsizei num_values
= 0;
1918 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1919 Result
* result
= GetSharedMemoryAs
<Result
*>(
1920 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1921 GLint
* params
= result
? result
->GetData() : NULL
;
1922 if (!validators_
->get_tex_param_target
.IsValid(target
)) {
1923 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameteriv", target
, "target");
1924 return error::kNoError
;
1926 if (!validators_
->texture_parameter
.IsValid(pname
)) {
1927 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetTexParameteriv", pname
, "pname");
1928 return error::kNoError
;
1930 if (params
== NULL
) {
1931 return error::kOutOfBounds
;
1933 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetTexParameteriv");
1934 // Check that the client initialized the result.
1935 if (result
->size
!= 0) {
1936 return error::kInvalidArguments
;
1938 DoGetTexParameteriv(target
, pname
, params
);
1939 GLenum error
= LOCAL_PEEK_GL_ERROR("GetTexParameteriv");
1940 if (error
== GL_NO_ERROR
) {
1941 result
->SetNumResults(num_values
);
1943 return error::kNoError
;
1946 error::Error
GLES2DecoderImpl::HandleGetVertexAttribfv(
1947 uint32_t immediate_data_size
,
1948 const void* cmd_data
) {
1949 const gles2::cmds::GetVertexAttribfv
& c
=
1950 *static_cast<const gles2::cmds::GetVertexAttribfv
*>(cmd_data
);
1952 GLuint index
= static_cast<GLuint
>(c
.index
);
1953 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1954 typedef cmds::GetVertexAttribfv::Result Result
;
1955 GLsizei num_values
= 0;
1956 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1957 Result
* result
= GetSharedMemoryAs
<Result
*>(
1958 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1959 GLfloat
* params
= result
? result
->GetData() : NULL
;
1960 if (!validators_
->vertex_attribute
.IsValid(pname
)) {
1961 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribfv", pname
, "pname");
1962 return error::kNoError
;
1964 if (params
== NULL
) {
1965 return error::kOutOfBounds
;
1967 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribfv");
1968 // Check that the client initialized the result.
1969 if (result
->size
!= 0) {
1970 return error::kInvalidArguments
;
1972 DoGetVertexAttribfv(index
, pname
, params
);
1973 GLenum error
= LOCAL_PEEK_GL_ERROR("GetVertexAttribfv");
1974 if (error
== GL_NO_ERROR
) {
1975 result
->SetNumResults(num_values
);
1977 return error::kNoError
;
1980 error::Error
GLES2DecoderImpl::HandleGetVertexAttribiv(
1981 uint32_t immediate_data_size
,
1982 const void* cmd_data
) {
1983 const gles2::cmds::GetVertexAttribiv
& c
=
1984 *static_cast<const gles2::cmds::GetVertexAttribiv
*>(cmd_data
);
1986 GLuint index
= static_cast<GLuint
>(c
.index
);
1987 GLenum pname
= static_cast<GLenum
>(c
.pname
);
1988 typedef cmds::GetVertexAttribiv::Result Result
;
1989 GLsizei num_values
= 0;
1990 GetNumValuesReturnedForGLGet(pname
, &num_values
);
1991 Result
* result
= GetSharedMemoryAs
<Result
*>(
1992 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
1993 GLint
* params
= result
? result
->GetData() : NULL
;
1994 if (!validators_
->vertex_attribute
.IsValid(pname
)) {
1995 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribiv", pname
, "pname");
1996 return error::kNoError
;
1998 if (params
== NULL
) {
1999 return error::kOutOfBounds
;
2001 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribiv");
2002 // Check that the client initialized the result.
2003 if (result
->size
!= 0) {
2004 return error::kInvalidArguments
;
2006 DoGetVertexAttribiv(index
, pname
, params
);
2007 GLenum error
= LOCAL_PEEK_GL_ERROR("GetVertexAttribiv");
2008 if (error
== GL_NO_ERROR
) {
2009 result
->SetNumResults(num_values
);
2011 return error::kNoError
;
2014 error::Error
GLES2DecoderImpl::HandleGetVertexAttribIiv(
2015 uint32_t immediate_data_size
,
2016 const void* cmd_data
) {
2017 if (!unsafe_es3_apis_enabled())
2018 return error::kUnknownCommand
;
2019 const gles2::cmds::GetVertexAttribIiv
& c
=
2020 *static_cast<const gles2::cmds::GetVertexAttribIiv
*>(cmd_data
);
2022 GLuint index
= static_cast<GLuint
>(c
.index
);
2023 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2024 typedef cmds::GetVertexAttribIiv::Result Result
;
2025 GLsizei num_values
= 0;
2026 GetNumValuesReturnedForGLGet(pname
, &num_values
);
2027 Result
* result
= GetSharedMemoryAs
<Result
*>(
2028 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
2029 GLint
* params
= result
? result
->GetData() : NULL
;
2030 if (params
== NULL
) {
2031 return error::kOutOfBounds
;
2033 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribIiv");
2034 // Check that the client initialized the result.
2035 if (result
->size
!= 0) {
2036 return error::kInvalidArguments
;
2038 DoGetVertexAttribIiv(index
, pname
, params
);
2039 GLenum error
= LOCAL_PEEK_GL_ERROR("GetVertexAttribIiv");
2040 if (error
== GL_NO_ERROR
) {
2041 result
->SetNumResults(num_values
);
2043 return error::kNoError
;
2046 error::Error
GLES2DecoderImpl::HandleGetVertexAttribIuiv(
2047 uint32_t immediate_data_size
,
2048 const void* cmd_data
) {
2049 if (!unsafe_es3_apis_enabled())
2050 return error::kUnknownCommand
;
2051 const gles2::cmds::GetVertexAttribIuiv
& c
=
2052 *static_cast<const gles2::cmds::GetVertexAttribIuiv
*>(cmd_data
);
2054 GLuint index
= static_cast<GLuint
>(c
.index
);
2055 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2056 typedef cmds::GetVertexAttribIuiv::Result Result
;
2057 GLsizei num_values
= 0;
2058 GetNumValuesReturnedForGLGet(pname
, &num_values
);
2059 Result
* result
= GetSharedMemoryAs
<Result
*>(
2060 c
.params_shm_id
, c
.params_shm_offset
, Result::ComputeSize(num_values
));
2061 GLuint
* params
= result
? result
->GetData() : NULL
;
2062 if (params
== NULL
) {
2063 return error::kOutOfBounds
;
2065 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetVertexAttribIuiv");
2066 // Check that the client initialized the result.
2067 if (result
->size
!= 0) {
2068 return error::kInvalidArguments
;
2070 DoGetVertexAttribIuiv(index
, pname
, params
);
2071 GLenum error
= LOCAL_PEEK_GL_ERROR("GetVertexAttribIuiv");
2072 if (error
== GL_NO_ERROR
) {
2073 result
->SetNumResults(num_values
);
2075 return error::kNoError
;
2078 error::Error
GLES2DecoderImpl::HandleHint(uint32_t immediate_data_size
,
2079 const void* cmd_data
) {
2080 const gles2::cmds::Hint
& c
= *static_cast<const gles2::cmds::Hint
*>(cmd_data
);
2082 GLenum target
= static_cast<GLenum
>(c
.target
);
2083 GLenum mode
= static_cast<GLenum
>(c
.mode
);
2084 if (!validators_
->hint_target
.IsValid(target
)) {
2085 LOCAL_SET_GL_ERROR_INVALID_ENUM("glHint", target
, "target");
2086 return error::kNoError
;
2088 if (!validators_
->hint_mode
.IsValid(mode
)) {
2089 LOCAL_SET_GL_ERROR_INVALID_ENUM("glHint", mode
, "mode");
2090 return error::kNoError
;
2093 case GL_GENERATE_MIPMAP_HINT
:
2094 if (state_
.hint_generate_mipmap
!= mode
) {
2095 state_
.hint_generate_mipmap
= mode
;
2096 glHint(target
, mode
);
2099 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES
:
2100 if (state_
.hint_fragment_shader_derivative
!= mode
) {
2101 state_
.hint_fragment_shader_derivative
= mode
;
2102 glHint(target
, mode
);
2108 return error::kNoError
;
2111 error::Error
GLES2DecoderImpl::HandleInvalidateFramebufferImmediate(
2112 uint32_t immediate_data_size
,
2113 const void* cmd_data
) {
2114 if (!unsafe_es3_apis_enabled())
2115 return error::kUnknownCommand
;
2116 const gles2::cmds::InvalidateFramebufferImmediate
& c
=
2117 *static_cast<const gles2::cmds::InvalidateFramebufferImmediate
*>(
2120 GLenum target
= static_cast<GLenum
>(c
.target
);
2121 GLsizei count
= static_cast<GLsizei
>(c
.count
);
2123 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
2124 return error::kOutOfBounds
;
2126 if (data_size
> immediate_data_size
) {
2127 return error::kOutOfBounds
;
2129 const GLenum
* attachments
=
2130 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
2131 if (attachments
== NULL
) {
2132 return error::kOutOfBounds
;
2134 glInvalidateFramebuffer(target
, count
, attachments
);
2135 return error::kNoError
;
2138 error::Error
GLES2DecoderImpl::HandleInvalidateSubFramebufferImmediate(
2139 uint32_t immediate_data_size
,
2140 const void* cmd_data
) {
2141 if (!unsafe_es3_apis_enabled())
2142 return error::kUnknownCommand
;
2143 const gles2::cmds::InvalidateSubFramebufferImmediate
& c
=
2144 *static_cast<const gles2::cmds::InvalidateSubFramebufferImmediate
*>(
2147 GLenum target
= static_cast<GLenum
>(c
.target
);
2148 GLsizei count
= static_cast<GLsizei
>(c
.count
);
2150 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
2151 return error::kOutOfBounds
;
2153 if (data_size
> immediate_data_size
) {
2154 return error::kOutOfBounds
;
2156 const GLenum
* attachments
=
2157 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
2158 GLint x
= static_cast<GLint
>(c
.x
);
2159 GLint y
= static_cast<GLint
>(c
.y
);
2160 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2161 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2162 if (attachments
== NULL
) {
2163 return error::kOutOfBounds
;
2165 glInvalidateSubFramebuffer(target
, count
, attachments
, x
, y
, width
, height
);
2166 return error::kNoError
;
2169 error::Error
GLES2DecoderImpl::HandleIsBuffer(uint32_t immediate_data_size
,
2170 const void* cmd_data
) {
2171 const gles2::cmds::IsBuffer
& c
=
2172 *static_cast<const gles2::cmds::IsBuffer
*>(cmd_data
);
2174 GLuint buffer
= c
.buffer
;
2175 typedef cmds::IsBuffer::Result Result
;
2176 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2177 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2179 return error::kOutOfBounds
;
2181 *result_dst
= DoIsBuffer(buffer
);
2182 return error::kNoError
;
2185 error::Error
GLES2DecoderImpl::HandleIsEnabled(uint32_t immediate_data_size
,
2186 const void* cmd_data
) {
2187 const gles2::cmds::IsEnabled
& c
=
2188 *static_cast<const gles2::cmds::IsEnabled
*>(cmd_data
);
2190 GLenum cap
= static_cast<GLenum
>(c
.cap
);
2191 typedef cmds::IsEnabled::Result Result
;
2192 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2193 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2195 return error::kOutOfBounds
;
2197 if (!validators_
->capability
.IsValid(cap
)) {
2198 LOCAL_SET_GL_ERROR_INVALID_ENUM("glIsEnabled", cap
, "cap");
2199 return error::kNoError
;
2201 *result_dst
= DoIsEnabled(cap
);
2202 return error::kNoError
;
2205 error::Error
GLES2DecoderImpl::HandleIsFramebuffer(uint32_t immediate_data_size
,
2206 const void* cmd_data
) {
2207 const gles2::cmds::IsFramebuffer
& c
=
2208 *static_cast<const gles2::cmds::IsFramebuffer
*>(cmd_data
);
2210 GLuint framebuffer
= c
.framebuffer
;
2211 typedef cmds::IsFramebuffer::Result Result
;
2212 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2213 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2215 return error::kOutOfBounds
;
2217 *result_dst
= DoIsFramebuffer(framebuffer
);
2218 return error::kNoError
;
2221 error::Error
GLES2DecoderImpl::HandleIsProgram(uint32_t immediate_data_size
,
2222 const void* cmd_data
) {
2223 const gles2::cmds::IsProgram
& c
=
2224 *static_cast<const gles2::cmds::IsProgram
*>(cmd_data
);
2226 GLuint program
= c
.program
;
2227 typedef cmds::IsProgram::Result Result
;
2228 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2229 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2231 return error::kOutOfBounds
;
2233 *result_dst
= DoIsProgram(program
);
2234 return error::kNoError
;
2237 error::Error
GLES2DecoderImpl::HandleIsRenderbuffer(
2238 uint32_t immediate_data_size
,
2239 const void* cmd_data
) {
2240 const gles2::cmds::IsRenderbuffer
& c
=
2241 *static_cast<const gles2::cmds::IsRenderbuffer
*>(cmd_data
);
2243 GLuint renderbuffer
= c
.renderbuffer
;
2244 typedef cmds::IsRenderbuffer::Result Result
;
2245 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2246 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2248 return error::kOutOfBounds
;
2250 *result_dst
= DoIsRenderbuffer(renderbuffer
);
2251 return error::kNoError
;
2254 error::Error
GLES2DecoderImpl::HandleIsSampler(uint32_t immediate_data_size
,
2255 const void* cmd_data
) {
2256 if (!unsafe_es3_apis_enabled())
2257 return error::kUnknownCommand
;
2258 const gles2::cmds::IsSampler
& c
=
2259 *static_cast<const gles2::cmds::IsSampler
*>(cmd_data
);
2261 GLuint sampler
= c
.sampler
;
2262 typedef cmds::IsSampler::Result Result
;
2263 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2264 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2266 return error::kOutOfBounds
;
2268 GLuint service_sampler
= 0;
2269 *result_dst
= group_
->GetSamplerServiceId(sampler
, &service_sampler
);
2270 return error::kNoError
;
2273 error::Error
GLES2DecoderImpl::HandleIsShader(uint32_t immediate_data_size
,
2274 const void* cmd_data
) {
2275 const gles2::cmds::IsShader
& c
=
2276 *static_cast<const gles2::cmds::IsShader
*>(cmd_data
);
2278 GLuint shader
= c
.shader
;
2279 typedef cmds::IsShader::Result Result
;
2280 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2281 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2283 return error::kOutOfBounds
;
2285 *result_dst
= DoIsShader(shader
);
2286 return error::kNoError
;
2289 error::Error
GLES2DecoderImpl::HandleIsSync(uint32_t immediate_data_size
,
2290 const void* cmd_data
) {
2291 if (!unsafe_es3_apis_enabled())
2292 return error::kUnknownCommand
;
2293 const gles2::cmds::IsSync
& c
=
2294 *static_cast<const gles2::cmds::IsSync
*>(cmd_data
);
2296 GLuint sync
= c
.sync
;
2297 typedef cmds::IsSync::Result Result
;
2298 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2299 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2301 return error::kOutOfBounds
;
2303 GLsync service_sync
= 0;
2304 *result_dst
= group_
->GetSyncServiceId(sync
, &service_sync
);
2305 return error::kNoError
;
2308 error::Error
GLES2DecoderImpl::HandleIsTexture(uint32_t immediate_data_size
,
2309 const void* cmd_data
) {
2310 const gles2::cmds::IsTexture
& c
=
2311 *static_cast<const gles2::cmds::IsTexture
*>(cmd_data
);
2313 GLuint texture
= c
.texture
;
2314 typedef cmds::IsTexture::Result Result
;
2315 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2316 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2318 return error::kOutOfBounds
;
2320 *result_dst
= DoIsTexture(texture
);
2321 return error::kNoError
;
2324 error::Error
GLES2DecoderImpl::HandleIsTransformFeedback(
2325 uint32_t immediate_data_size
,
2326 const void* cmd_data
) {
2327 if (!unsafe_es3_apis_enabled())
2328 return error::kUnknownCommand
;
2329 const gles2::cmds::IsTransformFeedback
& c
=
2330 *static_cast<const gles2::cmds::IsTransformFeedback
*>(cmd_data
);
2332 GLuint transformfeedback
= c
.transformfeedback
;
2333 typedef cmds::IsTransformFeedback::Result Result
;
2334 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
2335 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
2337 return error::kOutOfBounds
;
2339 GLuint service_transformfeedback
= 0;
2340 *result_dst
= group_
->GetTransformFeedbackServiceId(
2341 transformfeedback
, &service_transformfeedback
);
2342 return error::kNoError
;
2345 error::Error
GLES2DecoderImpl::HandleLineWidth(uint32_t immediate_data_size
,
2346 const void* cmd_data
) {
2347 const gles2::cmds::LineWidth
& c
=
2348 *static_cast<const gles2::cmds::LineWidth
*>(cmd_data
);
2350 GLfloat width
= static_cast<GLfloat
>(c
.width
);
2351 if (width
<= 0.0f
|| std::isnan(width
)) {
2352 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "LineWidth", "width out of range");
2353 return error::kNoError
;
2355 if (state_
.line_width
!= width
) {
2356 state_
.line_width
= width
;
2359 return error::kNoError
;
2362 error::Error
GLES2DecoderImpl::HandleLinkProgram(uint32_t immediate_data_size
,
2363 const void* cmd_data
) {
2364 const gles2::cmds::LinkProgram
& c
=
2365 *static_cast<const gles2::cmds::LinkProgram
*>(cmd_data
);
2367 GLuint program
= c
.program
;
2368 DoLinkProgram(program
);
2369 return error::kNoError
;
2372 error::Error
GLES2DecoderImpl::HandlePauseTransformFeedback(
2373 uint32_t immediate_data_size
,
2374 const void* cmd_data
) {
2375 if (!unsafe_es3_apis_enabled())
2376 return error::kUnknownCommand
;
2377 const gles2::cmds::PauseTransformFeedback
& c
=
2378 *static_cast<const gles2::cmds::PauseTransformFeedback
*>(cmd_data
);
2380 glPauseTransformFeedback();
2381 return error::kNoError
;
2384 error::Error
GLES2DecoderImpl::HandlePolygonOffset(uint32_t immediate_data_size
,
2385 const void* cmd_data
) {
2386 const gles2::cmds::PolygonOffset
& c
=
2387 *static_cast<const gles2::cmds::PolygonOffset
*>(cmd_data
);
2389 GLfloat factor
= static_cast<GLfloat
>(c
.factor
);
2390 GLfloat units
= static_cast<GLfloat
>(c
.units
);
2391 if (state_
.polygon_offset_factor
!= factor
||
2392 state_
.polygon_offset_units
!= units
) {
2393 state_
.polygon_offset_factor
= factor
;
2394 state_
.polygon_offset_units
= units
;
2395 glPolygonOffset(factor
, units
);
2397 return error::kNoError
;
2400 error::Error
GLES2DecoderImpl::HandleReadBuffer(uint32_t immediate_data_size
,
2401 const void* cmd_data
) {
2402 if (!unsafe_es3_apis_enabled())
2403 return error::kUnknownCommand
;
2404 const gles2::cmds::ReadBuffer
& c
=
2405 *static_cast<const gles2::cmds::ReadBuffer
*>(cmd_data
);
2407 GLenum src
= static_cast<GLenum
>(c
.src
);
2409 return error::kNoError
;
2412 error::Error
GLES2DecoderImpl::HandleReleaseShaderCompiler(
2413 uint32_t immediate_data_size
,
2414 const void* cmd_data
) {
2415 const gles2::cmds::ReleaseShaderCompiler
& c
=
2416 *static_cast<const gles2::cmds::ReleaseShaderCompiler
*>(cmd_data
);
2418 DoReleaseShaderCompiler();
2419 return error::kNoError
;
2422 error::Error
GLES2DecoderImpl::HandleRenderbufferStorage(
2423 uint32_t immediate_data_size
,
2424 const void* cmd_data
) {
2425 const gles2::cmds::RenderbufferStorage
& c
=
2426 *static_cast<const gles2::cmds::RenderbufferStorage
*>(cmd_data
);
2428 GLenum target
= static_cast<GLenum
>(c
.target
);
2429 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
2430 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2431 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2432 if (!validators_
->render_buffer_target
.IsValid(target
)) {
2433 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorage", target
, "target");
2434 return error::kNoError
;
2436 if (!validators_
->render_buffer_format
.IsValid(internalformat
)) {
2437 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorage", internalformat
,
2439 return error::kNoError
;
2442 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorage", "width < 0");
2443 return error::kNoError
;
2446 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorage", "height < 0");
2447 return error::kNoError
;
2449 DoRenderbufferStorage(target
, internalformat
, width
, height
);
2450 return error::kNoError
;
2453 error::Error
GLES2DecoderImpl::HandleResumeTransformFeedback(
2454 uint32_t immediate_data_size
,
2455 const void* cmd_data
) {
2456 if (!unsafe_es3_apis_enabled())
2457 return error::kUnknownCommand
;
2458 const gles2::cmds::ResumeTransformFeedback
& c
=
2459 *static_cast<const gles2::cmds::ResumeTransformFeedback
*>(cmd_data
);
2461 glResumeTransformFeedback();
2462 return error::kNoError
;
2465 error::Error
GLES2DecoderImpl::HandleSampleCoverage(
2466 uint32_t immediate_data_size
,
2467 const void* cmd_data
) {
2468 const gles2::cmds::SampleCoverage
& c
=
2469 *static_cast<const gles2::cmds::SampleCoverage
*>(cmd_data
);
2471 GLclampf value
= static_cast<GLclampf
>(c
.value
);
2472 GLboolean invert
= static_cast<GLboolean
>(c
.invert
);
2473 DoSampleCoverage(value
, invert
);
2474 return error::kNoError
;
2477 error::Error
GLES2DecoderImpl::HandleSamplerParameterf(
2478 uint32_t immediate_data_size
,
2479 const void* cmd_data
) {
2480 if (!unsafe_es3_apis_enabled())
2481 return error::kUnknownCommand
;
2482 const gles2::cmds::SamplerParameterf
& c
=
2483 *static_cast<const gles2::cmds::SamplerParameterf
*>(cmd_data
);
2485 GLuint sampler
= c
.sampler
;
2486 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2487 GLfloat param
= static_cast<GLfloat
>(c
.param
);
2488 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
2489 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glSamplerParameterf",
2490 "invalid sampler id");
2491 return error::kNoError
;
2493 glSamplerParameterf(sampler
, pname
, param
);
2494 return error::kNoError
;
2497 error::Error
GLES2DecoderImpl::HandleSamplerParameterfvImmediate(
2498 uint32_t immediate_data_size
,
2499 const void* cmd_data
) {
2500 if (!unsafe_es3_apis_enabled())
2501 return error::kUnknownCommand
;
2502 const gles2::cmds::SamplerParameterfvImmediate
& c
=
2503 *static_cast<const gles2::cmds::SamplerParameterfvImmediate
*>(cmd_data
);
2505 GLuint sampler
= c
.sampler
;
2506 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2508 if (!ComputeDataSize(1, sizeof(GLfloat
), 1, &data_size
)) {
2509 return error::kOutOfBounds
;
2511 if (data_size
> immediate_data_size
) {
2512 return error::kOutOfBounds
;
2514 const GLfloat
* params
=
2515 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
2516 if (params
== NULL
) {
2517 return error::kOutOfBounds
;
2519 group_
->GetSamplerServiceId(sampler
, &sampler
);
2520 DoSamplerParameterfv(sampler
, pname
, params
);
2521 return error::kNoError
;
2524 error::Error
GLES2DecoderImpl::HandleSamplerParameteri(
2525 uint32_t immediate_data_size
,
2526 const void* cmd_data
) {
2527 if (!unsafe_es3_apis_enabled())
2528 return error::kUnknownCommand
;
2529 const gles2::cmds::SamplerParameteri
& c
=
2530 *static_cast<const gles2::cmds::SamplerParameteri
*>(cmd_data
);
2532 GLuint sampler
= c
.sampler
;
2533 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2534 GLint param
= static_cast<GLint
>(c
.param
);
2535 if (!group_
->GetSamplerServiceId(sampler
, &sampler
)) {
2536 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glSamplerParameteri",
2537 "invalid sampler id");
2538 return error::kNoError
;
2540 glSamplerParameteri(sampler
, pname
, param
);
2541 return error::kNoError
;
2544 error::Error
GLES2DecoderImpl::HandleSamplerParameterivImmediate(
2545 uint32_t immediate_data_size
,
2546 const void* cmd_data
) {
2547 if (!unsafe_es3_apis_enabled())
2548 return error::kUnknownCommand
;
2549 const gles2::cmds::SamplerParameterivImmediate
& c
=
2550 *static_cast<const gles2::cmds::SamplerParameterivImmediate
*>(cmd_data
);
2552 GLuint sampler
= c
.sampler
;
2553 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2555 if (!ComputeDataSize(1, sizeof(GLint
), 1, &data_size
)) {
2556 return error::kOutOfBounds
;
2558 if (data_size
> immediate_data_size
) {
2559 return error::kOutOfBounds
;
2561 const GLint
* params
=
2562 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
2563 if (params
== NULL
) {
2564 return error::kOutOfBounds
;
2566 DoSamplerParameteriv(sampler
, pname
, params
);
2567 return error::kNoError
;
2570 error::Error
GLES2DecoderImpl::HandleScissor(uint32_t immediate_data_size
,
2571 const void* cmd_data
) {
2572 const gles2::cmds::Scissor
& c
=
2573 *static_cast<const gles2::cmds::Scissor
*>(cmd_data
);
2575 GLint x
= static_cast<GLint
>(c
.x
);
2576 GLint y
= static_cast<GLint
>(c
.y
);
2577 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2578 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2580 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glScissor", "width < 0");
2581 return error::kNoError
;
2584 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glScissor", "height < 0");
2585 return error::kNoError
;
2587 if (state_
.scissor_x
!= x
|| state_
.scissor_y
!= y
||
2588 state_
.scissor_width
!= width
|| state_
.scissor_height
!= height
) {
2589 state_
.scissor_x
= x
;
2590 state_
.scissor_y
= y
;
2591 state_
.scissor_width
= width
;
2592 state_
.scissor_height
= height
;
2593 glScissor(x
, y
, width
, height
);
2595 return error::kNoError
;
2598 error::Error
GLES2DecoderImpl::HandleShaderSourceBucket(
2599 uint32_t immediate_data_size
,
2600 const void* cmd_data
) {
2601 const gles2::cmds::ShaderSourceBucket
& c
=
2602 *static_cast<const gles2::cmds::ShaderSourceBucket
*>(cmd_data
);
2604 GLuint shader
= static_cast<GLuint
>(c
.shader
);
2606 Bucket
* bucket
= GetBucket(c
.str_bucket_id
);
2608 return error::kInvalidArguments
;
2611 std::vector
<char*> strs
;
2612 std::vector
<GLint
> len
;
2613 if (!bucket
->GetAsStrings(&count
, &strs
, &len
)) {
2614 return error::kInvalidArguments
;
2617 strs
.size() > 0 ? const_cast<const char**>(&strs
[0]) : NULL
;
2618 const GLint
* length
=
2619 len
.size() > 0 ? const_cast<const GLint
*>(&len
[0]) : NULL
;
2621 DoShaderSource(shader
, count
, str
, length
);
2622 return error::kNoError
;
2625 error::Error
GLES2DecoderImpl::HandleStencilFunc(uint32_t immediate_data_size
,
2626 const void* cmd_data
) {
2627 const gles2::cmds::StencilFunc
& c
=
2628 *static_cast<const gles2::cmds::StencilFunc
*>(cmd_data
);
2630 GLenum func
= static_cast<GLenum
>(c
.func
);
2631 GLint ref
= static_cast<GLint
>(c
.ref
);
2632 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2633 if (!validators_
->cmp_function
.IsValid(func
)) {
2634 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFunc", func
, "func");
2635 return error::kNoError
;
2637 if (state_
.stencil_front_func
!= func
|| state_
.stencil_front_ref
!= ref
||
2638 state_
.stencil_front_mask
!= mask
|| state_
.stencil_back_func
!= func
||
2639 state_
.stencil_back_ref
!= ref
|| state_
.stencil_back_mask
!= mask
) {
2640 state_
.stencil_front_func
= func
;
2641 state_
.stencil_front_ref
= ref
;
2642 state_
.stencil_front_mask
= mask
;
2643 state_
.stencil_back_func
= func
;
2644 state_
.stencil_back_ref
= ref
;
2645 state_
.stencil_back_mask
= mask
;
2646 glStencilFunc(func
, ref
, mask
);
2648 return error::kNoError
;
2651 error::Error
GLES2DecoderImpl::HandleStencilFuncSeparate(
2652 uint32_t immediate_data_size
,
2653 const void* cmd_data
) {
2654 const gles2::cmds::StencilFuncSeparate
& c
=
2655 *static_cast<const gles2::cmds::StencilFuncSeparate
*>(cmd_data
);
2657 GLenum face
= static_cast<GLenum
>(c
.face
);
2658 GLenum func
= static_cast<GLenum
>(c
.func
);
2659 GLint ref
= static_cast<GLint
>(c
.ref
);
2660 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2661 if (!validators_
->face_type
.IsValid(face
)) {
2662 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFuncSeparate", face
, "face");
2663 return error::kNoError
;
2665 if (!validators_
->cmp_function
.IsValid(func
)) {
2666 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFuncSeparate", func
, "func");
2667 return error::kNoError
;
2669 bool changed
= false;
2670 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2671 changed
|= state_
.stencil_front_func
!= func
||
2672 state_
.stencil_front_ref
!= ref
||
2673 state_
.stencil_front_mask
!= mask
;
2675 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2676 changed
|= state_
.stencil_back_func
!= func
||
2677 state_
.stencil_back_ref
!= ref
||
2678 state_
.stencil_back_mask
!= mask
;
2681 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2682 state_
.stencil_front_func
= func
;
2683 state_
.stencil_front_ref
= ref
;
2684 state_
.stencil_front_mask
= mask
;
2686 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2687 state_
.stencil_back_func
= func
;
2688 state_
.stencil_back_ref
= ref
;
2689 state_
.stencil_back_mask
= mask
;
2691 glStencilFuncSeparate(face
, func
, ref
, mask
);
2693 return error::kNoError
;
2696 error::Error
GLES2DecoderImpl::HandleStencilMask(uint32_t immediate_data_size
,
2697 const void* cmd_data
) {
2698 const gles2::cmds::StencilMask
& c
=
2699 *static_cast<const gles2::cmds::StencilMask
*>(cmd_data
);
2701 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2702 if (state_
.stencil_front_writemask
!= mask
||
2703 state_
.stencil_back_writemask
!= mask
) {
2704 state_
.stencil_front_writemask
= mask
;
2705 state_
.stencil_back_writemask
= mask
;
2706 framebuffer_state_
.clear_state_dirty
= true;
2708 return error::kNoError
;
2711 error::Error
GLES2DecoderImpl::HandleStencilMaskSeparate(
2712 uint32_t immediate_data_size
,
2713 const void* cmd_data
) {
2714 const gles2::cmds::StencilMaskSeparate
& c
=
2715 *static_cast<const gles2::cmds::StencilMaskSeparate
*>(cmd_data
);
2717 GLenum face
= static_cast<GLenum
>(c
.face
);
2718 GLuint mask
= static_cast<GLuint
>(c
.mask
);
2719 if (!validators_
->face_type
.IsValid(face
)) {
2720 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilMaskSeparate", face
, "face");
2721 return error::kNoError
;
2723 bool changed
= false;
2724 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2725 changed
|= state_
.stencil_front_writemask
!= mask
;
2727 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2728 changed
|= state_
.stencil_back_writemask
!= mask
;
2731 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2732 state_
.stencil_front_writemask
= mask
;
2734 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2735 state_
.stencil_back_writemask
= mask
;
2737 framebuffer_state_
.clear_state_dirty
= true;
2739 return error::kNoError
;
2742 error::Error
GLES2DecoderImpl::HandleStencilOp(uint32_t immediate_data_size
,
2743 const void* cmd_data
) {
2744 const gles2::cmds::StencilOp
& c
=
2745 *static_cast<const gles2::cmds::StencilOp
*>(cmd_data
);
2747 GLenum fail
= static_cast<GLenum
>(c
.fail
);
2748 GLenum zfail
= static_cast<GLenum
>(c
.zfail
);
2749 GLenum zpass
= static_cast<GLenum
>(c
.zpass
);
2750 if (!validators_
->stencil_op
.IsValid(fail
)) {
2751 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", fail
, "fail");
2752 return error::kNoError
;
2754 if (!validators_
->stencil_op
.IsValid(zfail
)) {
2755 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", zfail
, "zfail");
2756 return error::kNoError
;
2758 if (!validators_
->stencil_op
.IsValid(zpass
)) {
2759 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOp", zpass
, "zpass");
2760 return error::kNoError
;
2762 if (state_
.stencil_front_fail_op
!= fail
||
2763 state_
.stencil_front_z_fail_op
!= zfail
||
2764 state_
.stencil_front_z_pass_op
!= zpass
||
2765 state_
.stencil_back_fail_op
!= fail
||
2766 state_
.stencil_back_z_fail_op
!= zfail
||
2767 state_
.stencil_back_z_pass_op
!= zpass
) {
2768 state_
.stencil_front_fail_op
= fail
;
2769 state_
.stencil_front_z_fail_op
= zfail
;
2770 state_
.stencil_front_z_pass_op
= zpass
;
2771 state_
.stencil_back_fail_op
= fail
;
2772 state_
.stencil_back_z_fail_op
= zfail
;
2773 state_
.stencil_back_z_pass_op
= zpass
;
2774 glStencilOp(fail
, zfail
, zpass
);
2776 return error::kNoError
;
2779 error::Error
GLES2DecoderImpl::HandleStencilOpSeparate(
2780 uint32_t immediate_data_size
,
2781 const void* cmd_data
) {
2782 const gles2::cmds::StencilOpSeparate
& c
=
2783 *static_cast<const gles2::cmds::StencilOpSeparate
*>(cmd_data
);
2785 GLenum face
= static_cast<GLenum
>(c
.face
);
2786 GLenum fail
= static_cast<GLenum
>(c
.fail
);
2787 GLenum zfail
= static_cast<GLenum
>(c
.zfail
);
2788 GLenum zpass
= static_cast<GLenum
>(c
.zpass
);
2789 if (!validators_
->face_type
.IsValid(face
)) {
2790 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", face
, "face");
2791 return error::kNoError
;
2793 if (!validators_
->stencil_op
.IsValid(fail
)) {
2794 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", fail
, "fail");
2795 return error::kNoError
;
2797 if (!validators_
->stencil_op
.IsValid(zfail
)) {
2798 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", zfail
, "zfail");
2799 return error::kNoError
;
2801 if (!validators_
->stencil_op
.IsValid(zpass
)) {
2802 LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilOpSeparate", zpass
, "zpass");
2803 return error::kNoError
;
2805 bool changed
= false;
2806 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2807 changed
|= state_
.stencil_front_fail_op
!= fail
||
2808 state_
.stencil_front_z_fail_op
!= zfail
||
2809 state_
.stencil_front_z_pass_op
!= zpass
;
2811 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2812 changed
|= state_
.stencil_back_fail_op
!= fail
||
2813 state_
.stencil_back_z_fail_op
!= zfail
||
2814 state_
.stencil_back_z_pass_op
!= zpass
;
2817 if (face
== GL_FRONT
|| face
== GL_FRONT_AND_BACK
) {
2818 state_
.stencil_front_fail_op
= fail
;
2819 state_
.stencil_front_z_fail_op
= zfail
;
2820 state_
.stencil_front_z_pass_op
= zpass
;
2822 if (face
== GL_BACK
|| face
== GL_FRONT_AND_BACK
) {
2823 state_
.stencil_back_fail_op
= fail
;
2824 state_
.stencil_back_z_fail_op
= zfail
;
2825 state_
.stencil_back_z_pass_op
= zpass
;
2827 glStencilOpSeparate(face
, fail
, zfail
, zpass
);
2829 return error::kNoError
;
2832 error::Error
GLES2DecoderImpl::HandleTexParameterf(uint32_t immediate_data_size
,
2833 const void* cmd_data
) {
2834 const gles2::cmds::TexParameterf
& c
=
2835 *static_cast<const gles2::cmds::TexParameterf
*>(cmd_data
);
2837 GLenum target
= static_cast<GLenum
>(c
.target
);
2838 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2839 GLfloat param
= static_cast<GLfloat
>(c
.param
);
2840 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2841 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterf", target
, "target");
2842 return error::kNoError
;
2844 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2845 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterf", pname
, "pname");
2846 return error::kNoError
;
2848 DoTexParameterf(target
, pname
, param
);
2849 return error::kNoError
;
2852 error::Error
GLES2DecoderImpl::HandleTexParameterfvImmediate(
2853 uint32_t immediate_data_size
,
2854 const void* cmd_data
) {
2855 const gles2::cmds::TexParameterfvImmediate
& c
=
2856 *static_cast<const gles2::cmds::TexParameterfvImmediate
*>(cmd_data
);
2858 GLenum target
= static_cast<GLenum
>(c
.target
);
2859 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2861 if (!ComputeDataSize(1, sizeof(GLfloat
), 1, &data_size
)) {
2862 return error::kOutOfBounds
;
2864 if (data_size
> immediate_data_size
) {
2865 return error::kOutOfBounds
;
2867 const GLfloat
* params
=
2868 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
2869 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2870 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", target
, "target");
2871 return error::kNoError
;
2873 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2874 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", pname
, "pname");
2875 return error::kNoError
;
2877 if (params
== NULL
) {
2878 return error::kOutOfBounds
;
2880 DoTexParameterfv(target
, pname
, params
);
2881 return error::kNoError
;
2884 error::Error
GLES2DecoderImpl::HandleTexParameteri(uint32_t immediate_data_size
,
2885 const void* cmd_data
) {
2886 const gles2::cmds::TexParameteri
& c
=
2887 *static_cast<const gles2::cmds::TexParameteri
*>(cmd_data
);
2889 GLenum target
= static_cast<GLenum
>(c
.target
);
2890 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2891 GLint param
= static_cast<GLint
>(c
.param
);
2892 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2893 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", target
, "target");
2894 return error::kNoError
;
2896 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2897 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteri", pname
, "pname");
2898 return error::kNoError
;
2900 DoTexParameteri(target
, pname
, param
);
2901 return error::kNoError
;
2904 error::Error
GLES2DecoderImpl::HandleTexParameterivImmediate(
2905 uint32_t immediate_data_size
,
2906 const void* cmd_data
) {
2907 const gles2::cmds::TexParameterivImmediate
& c
=
2908 *static_cast<const gles2::cmds::TexParameterivImmediate
*>(cmd_data
);
2910 GLenum target
= static_cast<GLenum
>(c
.target
);
2911 GLenum pname
= static_cast<GLenum
>(c
.pname
);
2913 if (!ComputeDataSize(1, sizeof(GLint
), 1, &data_size
)) {
2914 return error::kOutOfBounds
;
2916 if (data_size
> immediate_data_size
) {
2917 return error::kOutOfBounds
;
2919 const GLint
* params
=
2920 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
2921 if (!validators_
->texture_bind_target
.IsValid(target
)) {
2922 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", target
, "target");
2923 return error::kNoError
;
2925 if (!validators_
->texture_parameter
.IsValid(pname
)) {
2926 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", pname
, "pname");
2927 return error::kNoError
;
2929 if (params
== NULL
) {
2930 return error::kOutOfBounds
;
2932 DoTexParameteriv(target
, pname
, params
);
2933 return error::kNoError
;
2936 error::Error
GLES2DecoderImpl::HandleTexStorage3D(uint32_t immediate_data_size
,
2937 const void* cmd_data
) {
2938 if (!unsafe_es3_apis_enabled())
2939 return error::kUnknownCommand
;
2940 const gles2::cmds::TexStorage3D
& c
=
2941 *static_cast<const gles2::cmds::TexStorage3D
*>(cmd_data
);
2943 GLenum target
= static_cast<GLenum
>(c
.target
);
2944 GLsizei levels
= static_cast<GLsizei
>(c
.levels
);
2945 GLenum internalFormat
= static_cast<GLenum
>(c
.internalFormat
);
2946 GLsizei width
= static_cast<GLsizei
>(c
.width
);
2947 GLsizei height
= static_cast<GLsizei
>(c
.height
);
2948 GLsizei depth
= static_cast<GLsizei
>(c
.depth
);
2949 glTexStorage3D(target
, levels
, internalFormat
, width
, height
, depth
);
2950 return error::kNoError
;
2953 error::Error
GLES2DecoderImpl::HandleTransformFeedbackVaryingsBucket(
2954 uint32_t immediate_data_size
,
2955 const void* cmd_data
) {
2956 if (!unsafe_es3_apis_enabled())
2957 return error::kUnknownCommand
;
2958 const gles2::cmds::TransformFeedbackVaryingsBucket
& c
=
2959 *static_cast<const gles2::cmds::TransformFeedbackVaryingsBucket
*>(
2962 GLuint program
= static_cast<GLuint
>(c
.program
);
2964 Bucket
* bucket
= GetBucket(c
.varyings_bucket_id
);
2966 return error::kInvalidArguments
;
2969 std::vector
<char*> strs
;
2970 std::vector
<GLint
> len
;
2971 if (!bucket
->GetAsStrings(&count
, &strs
, &len
)) {
2972 return error::kInvalidArguments
;
2974 const char** varyings
=
2975 strs
.size() > 0 ? const_cast<const char**>(&strs
[0]) : NULL
;
2976 const GLint
* length
=
2977 len
.size() > 0 ? const_cast<const GLint
*>(&len
[0]) : NULL
;
2979 GLenum buffermode
= static_cast<GLenum
>(c
.buffermode
);
2980 DoTransformFeedbackVaryings(program
, count
, varyings
, buffermode
);
2981 return error::kNoError
;
2984 error::Error
GLES2DecoderImpl::HandleUniform1f(uint32_t immediate_data_size
,
2985 const void* cmd_data
) {
2986 const gles2::cmds::Uniform1f
& c
=
2987 *static_cast<const gles2::cmds::Uniform1f
*>(cmd_data
);
2989 GLint location
= static_cast<GLint
>(c
.location
);
2990 GLfloat x
= static_cast<GLfloat
>(c
.x
);
2994 DoUniform1fv(location
, 1, &temp
[0]);
2995 return error::kNoError
;
2998 error::Error
GLES2DecoderImpl::HandleUniform1fvImmediate(
2999 uint32_t immediate_data_size
,
3000 const void* cmd_data
) {
3001 const gles2::cmds::Uniform1fvImmediate
& c
=
3002 *static_cast<const gles2::cmds::Uniform1fvImmediate
*>(cmd_data
);
3004 GLint location
= static_cast<GLint
>(c
.location
);
3005 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3007 if (!ComputeDataSize(count
, sizeof(GLfloat
), 1, &data_size
)) {
3008 return error::kOutOfBounds
;
3010 if (data_size
> immediate_data_size
) {
3011 return error::kOutOfBounds
;
3014 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3016 return error::kOutOfBounds
;
3018 DoUniform1fv(location
, count
, v
);
3019 return error::kNoError
;
3022 error::Error
GLES2DecoderImpl::HandleUniform1i(uint32_t immediate_data_size
,
3023 const void* cmd_data
) {
3024 const gles2::cmds::Uniform1i
& c
=
3025 *static_cast<const gles2::cmds::Uniform1i
*>(cmd_data
);
3027 GLint location
= static_cast<GLint
>(c
.location
);
3028 GLint x
= static_cast<GLint
>(c
.x
);
3029 DoUniform1i(location
, x
);
3030 return error::kNoError
;
3033 error::Error
GLES2DecoderImpl::HandleUniform1ivImmediate(
3034 uint32_t immediate_data_size
,
3035 const void* cmd_data
) {
3036 const gles2::cmds::Uniform1ivImmediate
& c
=
3037 *static_cast<const gles2::cmds::Uniform1ivImmediate
*>(cmd_data
);
3039 GLint location
= static_cast<GLint
>(c
.location
);
3040 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3042 if (!ComputeDataSize(count
, sizeof(GLint
), 1, &data_size
)) {
3043 return error::kOutOfBounds
;
3045 if (data_size
> immediate_data_size
) {
3046 return error::kOutOfBounds
;
3049 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3051 return error::kOutOfBounds
;
3053 DoUniform1iv(location
, count
, v
);
3054 return error::kNoError
;
3057 error::Error
GLES2DecoderImpl::HandleUniform1ui(uint32_t immediate_data_size
,
3058 const void* cmd_data
) {
3059 if (!unsafe_es3_apis_enabled())
3060 return error::kUnknownCommand
;
3061 const gles2::cmds::Uniform1ui
& c
=
3062 *static_cast<const gles2::cmds::Uniform1ui
*>(cmd_data
);
3064 GLint location
= static_cast<GLint
>(c
.location
);
3065 GLuint x
= static_cast<GLuint
>(c
.x
);
3069 DoUniform1uiv(location
, 1, &temp
[0]);
3070 return error::kNoError
;
3073 error::Error
GLES2DecoderImpl::HandleUniform1uivImmediate(
3074 uint32_t immediate_data_size
,
3075 const void* cmd_data
) {
3076 if (!unsafe_es3_apis_enabled())
3077 return error::kUnknownCommand
;
3078 const gles2::cmds::Uniform1uivImmediate
& c
=
3079 *static_cast<const gles2::cmds::Uniform1uivImmediate
*>(cmd_data
);
3081 GLint location
= static_cast<GLint
>(c
.location
);
3082 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3084 if (!ComputeDataSize(count
, sizeof(GLuint
), 1, &data_size
)) {
3085 return error::kOutOfBounds
;
3087 if (data_size
> immediate_data_size
) {
3088 return error::kOutOfBounds
;
3091 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3093 return error::kOutOfBounds
;
3095 DoUniform1uiv(location
, count
, v
);
3096 return error::kNoError
;
3099 error::Error
GLES2DecoderImpl::HandleUniform2f(uint32_t immediate_data_size
,
3100 const void* cmd_data
) {
3101 const gles2::cmds::Uniform2f
& c
=
3102 *static_cast<const gles2::cmds::Uniform2f
*>(cmd_data
);
3104 GLint location
= static_cast<GLint
>(c
.location
);
3105 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3106 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3110 DoUniform2fv(location
, 1, &temp
[0]);
3111 return error::kNoError
;
3114 error::Error
GLES2DecoderImpl::HandleUniform2fvImmediate(
3115 uint32_t immediate_data_size
,
3116 const void* cmd_data
) {
3117 const gles2::cmds::Uniform2fvImmediate
& c
=
3118 *static_cast<const gles2::cmds::Uniform2fvImmediate
*>(cmd_data
);
3120 GLint location
= static_cast<GLint
>(c
.location
);
3121 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3123 if (!ComputeDataSize(count
, sizeof(GLfloat
), 2, &data_size
)) {
3124 return error::kOutOfBounds
;
3126 if (data_size
> immediate_data_size
) {
3127 return error::kOutOfBounds
;
3130 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3132 return error::kOutOfBounds
;
3134 DoUniform2fv(location
, count
, v
);
3135 return error::kNoError
;
3138 error::Error
GLES2DecoderImpl::HandleUniform2i(uint32_t immediate_data_size
,
3139 const void* cmd_data
) {
3140 const gles2::cmds::Uniform2i
& c
=
3141 *static_cast<const gles2::cmds::Uniform2i
*>(cmd_data
);
3143 GLint location
= static_cast<GLint
>(c
.location
);
3144 GLint x
= static_cast<GLint
>(c
.x
);
3145 GLint y
= static_cast<GLint
>(c
.y
);
3149 DoUniform2iv(location
, 1, &temp
[0]);
3150 return error::kNoError
;
3153 error::Error
GLES2DecoderImpl::HandleUniform2ivImmediate(
3154 uint32_t immediate_data_size
,
3155 const void* cmd_data
) {
3156 const gles2::cmds::Uniform2ivImmediate
& c
=
3157 *static_cast<const gles2::cmds::Uniform2ivImmediate
*>(cmd_data
);
3159 GLint location
= static_cast<GLint
>(c
.location
);
3160 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3162 if (!ComputeDataSize(count
, sizeof(GLint
), 2, &data_size
)) {
3163 return error::kOutOfBounds
;
3165 if (data_size
> immediate_data_size
) {
3166 return error::kOutOfBounds
;
3169 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3171 return error::kOutOfBounds
;
3173 DoUniform2iv(location
, count
, v
);
3174 return error::kNoError
;
3177 error::Error
GLES2DecoderImpl::HandleUniform2ui(uint32_t immediate_data_size
,
3178 const void* cmd_data
) {
3179 if (!unsafe_es3_apis_enabled())
3180 return error::kUnknownCommand
;
3181 const gles2::cmds::Uniform2ui
& c
=
3182 *static_cast<const gles2::cmds::Uniform2ui
*>(cmd_data
);
3184 GLint location
= static_cast<GLint
>(c
.location
);
3185 GLuint x
= static_cast<GLuint
>(c
.x
);
3186 GLuint y
= static_cast<GLuint
>(c
.y
);
3190 DoUniform2uiv(location
, 1, &temp
[0]);
3191 return error::kNoError
;
3194 error::Error
GLES2DecoderImpl::HandleUniform2uivImmediate(
3195 uint32_t immediate_data_size
,
3196 const void* cmd_data
) {
3197 if (!unsafe_es3_apis_enabled())
3198 return error::kUnknownCommand
;
3199 const gles2::cmds::Uniform2uivImmediate
& c
=
3200 *static_cast<const gles2::cmds::Uniform2uivImmediate
*>(cmd_data
);
3202 GLint location
= static_cast<GLint
>(c
.location
);
3203 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3205 if (!ComputeDataSize(count
, sizeof(GLuint
), 2, &data_size
)) {
3206 return error::kOutOfBounds
;
3208 if (data_size
> immediate_data_size
) {
3209 return error::kOutOfBounds
;
3212 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3214 return error::kOutOfBounds
;
3216 DoUniform2uiv(location
, count
, v
);
3217 return error::kNoError
;
3220 error::Error
GLES2DecoderImpl::HandleUniform3f(uint32_t immediate_data_size
,
3221 const void* cmd_data
) {
3222 const gles2::cmds::Uniform3f
& c
=
3223 *static_cast<const gles2::cmds::Uniform3f
*>(cmd_data
);
3225 GLint location
= static_cast<GLint
>(c
.location
);
3226 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3227 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3228 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3232 DoUniform3fv(location
, 1, &temp
[0]);
3233 return error::kNoError
;
3236 error::Error
GLES2DecoderImpl::HandleUniform3fvImmediate(
3237 uint32_t immediate_data_size
,
3238 const void* cmd_data
) {
3239 const gles2::cmds::Uniform3fvImmediate
& c
=
3240 *static_cast<const gles2::cmds::Uniform3fvImmediate
*>(cmd_data
);
3242 GLint location
= static_cast<GLint
>(c
.location
);
3243 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3245 if (!ComputeDataSize(count
, sizeof(GLfloat
), 3, &data_size
)) {
3246 return error::kOutOfBounds
;
3248 if (data_size
> immediate_data_size
) {
3249 return error::kOutOfBounds
;
3252 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3254 return error::kOutOfBounds
;
3256 DoUniform3fv(location
, count
, v
);
3257 return error::kNoError
;
3260 error::Error
GLES2DecoderImpl::HandleUniform3i(uint32_t immediate_data_size
,
3261 const void* cmd_data
) {
3262 const gles2::cmds::Uniform3i
& c
=
3263 *static_cast<const gles2::cmds::Uniform3i
*>(cmd_data
);
3265 GLint location
= static_cast<GLint
>(c
.location
);
3266 GLint x
= static_cast<GLint
>(c
.x
);
3267 GLint y
= static_cast<GLint
>(c
.y
);
3268 GLint z
= static_cast<GLint
>(c
.z
);
3272 DoUniform3iv(location
, 1, &temp
[0]);
3273 return error::kNoError
;
3276 error::Error
GLES2DecoderImpl::HandleUniform3ivImmediate(
3277 uint32_t immediate_data_size
,
3278 const void* cmd_data
) {
3279 const gles2::cmds::Uniform3ivImmediate
& c
=
3280 *static_cast<const gles2::cmds::Uniform3ivImmediate
*>(cmd_data
);
3282 GLint location
= static_cast<GLint
>(c
.location
);
3283 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3285 if (!ComputeDataSize(count
, sizeof(GLint
), 3, &data_size
)) {
3286 return error::kOutOfBounds
;
3288 if (data_size
> immediate_data_size
) {
3289 return error::kOutOfBounds
;
3292 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3294 return error::kOutOfBounds
;
3296 DoUniform3iv(location
, count
, v
);
3297 return error::kNoError
;
3300 error::Error
GLES2DecoderImpl::HandleUniform3ui(uint32_t immediate_data_size
,
3301 const void* cmd_data
) {
3302 if (!unsafe_es3_apis_enabled())
3303 return error::kUnknownCommand
;
3304 const gles2::cmds::Uniform3ui
& c
=
3305 *static_cast<const gles2::cmds::Uniform3ui
*>(cmd_data
);
3307 GLint location
= static_cast<GLint
>(c
.location
);
3308 GLuint x
= static_cast<GLuint
>(c
.x
);
3309 GLuint y
= static_cast<GLuint
>(c
.y
);
3310 GLuint z
= static_cast<GLuint
>(c
.z
);
3314 DoUniform3uiv(location
, 1, &temp
[0]);
3315 return error::kNoError
;
3318 error::Error
GLES2DecoderImpl::HandleUniform3uivImmediate(
3319 uint32_t immediate_data_size
,
3320 const void* cmd_data
) {
3321 if (!unsafe_es3_apis_enabled())
3322 return error::kUnknownCommand
;
3323 const gles2::cmds::Uniform3uivImmediate
& c
=
3324 *static_cast<const gles2::cmds::Uniform3uivImmediate
*>(cmd_data
);
3326 GLint location
= static_cast<GLint
>(c
.location
);
3327 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3329 if (!ComputeDataSize(count
, sizeof(GLuint
), 3, &data_size
)) {
3330 return error::kOutOfBounds
;
3332 if (data_size
> immediate_data_size
) {
3333 return error::kOutOfBounds
;
3336 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3338 return error::kOutOfBounds
;
3340 DoUniform3uiv(location
, count
, v
);
3341 return error::kNoError
;
3344 error::Error
GLES2DecoderImpl::HandleUniform4f(uint32_t immediate_data_size
,
3345 const void* cmd_data
) {
3346 const gles2::cmds::Uniform4f
& c
=
3347 *static_cast<const gles2::cmds::Uniform4f
*>(cmd_data
);
3349 GLint location
= static_cast<GLint
>(c
.location
);
3350 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3351 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3352 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3353 GLfloat w
= static_cast<GLfloat
>(c
.w
);
3357 DoUniform4fv(location
, 1, &temp
[0]);
3358 return error::kNoError
;
3361 error::Error
GLES2DecoderImpl::HandleUniform4fvImmediate(
3362 uint32_t immediate_data_size
,
3363 const void* cmd_data
) {
3364 const gles2::cmds::Uniform4fvImmediate
& c
=
3365 *static_cast<const gles2::cmds::Uniform4fvImmediate
*>(cmd_data
);
3367 GLint location
= static_cast<GLint
>(c
.location
);
3368 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3370 if (!ComputeDataSize(count
, sizeof(GLfloat
), 4, &data_size
)) {
3371 return error::kOutOfBounds
;
3373 if (data_size
> immediate_data_size
) {
3374 return error::kOutOfBounds
;
3377 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3379 return error::kOutOfBounds
;
3381 DoUniform4fv(location
, count
, v
);
3382 return error::kNoError
;
3385 error::Error
GLES2DecoderImpl::HandleUniform4i(uint32_t immediate_data_size
,
3386 const void* cmd_data
) {
3387 const gles2::cmds::Uniform4i
& c
=
3388 *static_cast<const gles2::cmds::Uniform4i
*>(cmd_data
);
3390 GLint location
= static_cast<GLint
>(c
.location
);
3391 GLint x
= static_cast<GLint
>(c
.x
);
3392 GLint y
= static_cast<GLint
>(c
.y
);
3393 GLint z
= static_cast<GLint
>(c
.z
);
3394 GLint w
= static_cast<GLint
>(c
.w
);
3398 DoUniform4iv(location
, 1, &temp
[0]);
3399 return error::kNoError
;
3402 error::Error
GLES2DecoderImpl::HandleUniform4ivImmediate(
3403 uint32_t immediate_data_size
,
3404 const void* cmd_data
) {
3405 const gles2::cmds::Uniform4ivImmediate
& c
=
3406 *static_cast<const gles2::cmds::Uniform4ivImmediate
*>(cmd_data
);
3408 GLint location
= static_cast<GLint
>(c
.location
);
3409 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3411 if (!ComputeDataSize(count
, sizeof(GLint
), 4, &data_size
)) {
3412 return error::kOutOfBounds
;
3414 if (data_size
> immediate_data_size
) {
3415 return error::kOutOfBounds
;
3418 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3420 return error::kOutOfBounds
;
3422 DoUniform4iv(location
, count
, v
);
3423 return error::kNoError
;
3426 error::Error
GLES2DecoderImpl::HandleUniform4ui(uint32_t immediate_data_size
,
3427 const void* cmd_data
) {
3428 if (!unsafe_es3_apis_enabled())
3429 return error::kUnknownCommand
;
3430 const gles2::cmds::Uniform4ui
& c
=
3431 *static_cast<const gles2::cmds::Uniform4ui
*>(cmd_data
);
3433 GLint location
= static_cast<GLint
>(c
.location
);
3434 GLuint x
= static_cast<GLuint
>(c
.x
);
3435 GLuint y
= static_cast<GLuint
>(c
.y
);
3436 GLuint z
= static_cast<GLuint
>(c
.z
);
3437 GLuint w
= static_cast<GLuint
>(c
.w
);
3441 DoUniform4uiv(location
, 1, &temp
[0]);
3442 return error::kNoError
;
3445 error::Error
GLES2DecoderImpl::HandleUniform4uivImmediate(
3446 uint32_t immediate_data_size
,
3447 const void* cmd_data
) {
3448 if (!unsafe_es3_apis_enabled())
3449 return error::kUnknownCommand
;
3450 const gles2::cmds::Uniform4uivImmediate
& c
=
3451 *static_cast<const gles2::cmds::Uniform4uivImmediate
*>(cmd_data
);
3453 GLint location
= static_cast<GLint
>(c
.location
);
3454 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3456 if (!ComputeDataSize(count
, sizeof(GLuint
), 4, &data_size
)) {
3457 return error::kOutOfBounds
;
3459 if (data_size
> immediate_data_size
) {
3460 return error::kOutOfBounds
;
3463 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3465 return error::kOutOfBounds
;
3467 DoUniform4uiv(location
, count
, v
);
3468 return error::kNoError
;
3471 error::Error
GLES2DecoderImpl::HandleUniformMatrix2fvImmediate(
3472 uint32_t immediate_data_size
,
3473 const void* cmd_data
) {
3474 const gles2::cmds::UniformMatrix2fvImmediate
& c
=
3475 *static_cast<const gles2::cmds::UniformMatrix2fvImmediate
*>(cmd_data
);
3477 GLint location
= static_cast<GLint
>(c
.location
);
3478 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3479 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3481 if (!ComputeDataSize(count
, sizeof(GLfloat
), 4, &data_size
)) {
3482 return error::kOutOfBounds
;
3484 if (data_size
> immediate_data_size
) {
3485 return error::kOutOfBounds
;
3487 const GLfloat
* value
=
3488 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3489 if (value
== NULL
) {
3490 return error::kOutOfBounds
;
3492 DoUniformMatrix2fv(location
, count
, transpose
, value
);
3493 return error::kNoError
;
3496 error::Error
GLES2DecoderImpl::HandleUniformMatrix2x3fvImmediate(
3497 uint32_t immediate_data_size
,
3498 const void* cmd_data
) {
3499 if (!unsafe_es3_apis_enabled())
3500 return error::kUnknownCommand
;
3501 const gles2::cmds::UniformMatrix2x3fvImmediate
& c
=
3502 *static_cast<const gles2::cmds::UniformMatrix2x3fvImmediate
*>(cmd_data
);
3504 GLint location
= static_cast<GLint
>(c
.location
);
3505 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3506 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3508 if (!ComputeDataSize(count
, sizeof(GLfloat
), 6, &data_size
)) {
3509 return error::kOutOfBounds
;
3511 if (data_size
> immediate_data_size
) {
3512 return error::kOutOfBounds
;
3514 const GLfloat
* value
=
3515 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3516 if (value
== NULL
) {
3517 return error::kOutOfBounds
;
3519 DoUniformMatrix2x3fv(location
, count
, transpose
, value
);
3520 return error::kNoError
;
3523 error::Error
GLES2DecoderImpl::HandleUniformMatrix2x4fvImmediate(
3524 uint32_t immediate_data_size
,
3525 const void* cmd_data
) {
3526 if (!unsafe_es3_apis_enabled())
3527 return error::kUnknownCommand
;
3528 const gles2::cmds::UniformMatrix2x4fvImmediate
& c
=
3529 *static_cast<const gles2::cmds::UniformMatrix2x4fvImmediate
*>(cmd_data
);
3531 GLint location
= static_cast<GLint
>(c
.location
);
3532 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3533 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3535 if (!ComputeDataSize(count
, sizeof(GLfloat
), 8, &data_size
)) {
3536 return error::kOutOfBounds
;
3538 if (data_size
> immediate_data_size
) {
3539 return error::kOutOfBounds
;
3541 const GLfloat
* value
=
3542 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3543 if (value
== NULL
) {
3544 return error::kOutOfBounds
;
3546 DoUniformMatrix2x4fv(location
, count
, transpose
, value
);
3547 return error::kNoError
;
3550 error::Error
GLES2DecoderImpl::HandleUniformMatrix3fvImmediate(
3551 uint32_t immediate_data_size
,
3552 const void* cmd_data
) {
3553 const gles2::cmds::UniformMatrix3fvImmediate
& c
=
3554 *static_cast<const gles2::cmds::UniformMatrix3fvImmediate
*>(cmd_data
);
3556 GLint location
= static_cast<GLint
>(c
.location
);
3557 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3558 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3560 if (!ComputeDataSize(count
, sizeof(GLfloat
), 9, &data_size
)) {
3561 return error::kOutOfBounds
;
3563 if (data_size
> immediate_data_size
) {
3564 return error::kOutOfBounds
;
3566 const GLfloat
* value
=
3567 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3568 if (value
== NULL
) {
3569 return error::kOutOfBounds
;
3571 DoUniformMatrix3fv(location
, count
, transpose
, value
);
3572 return error::kNoError
;
3575 error::Error
GLES2DecoderImpl::HandleUniformMatrix3x2fvImmediate(
3576 uint32_t immediate_data_size
,
3577 const void* cmd_data
) {
3578 if (!unsafe_es3_apis_enabled())
3579 return error::kUnknownCommand
;
3580 const gles2::cmds::UniformMatrix3x2fvImmediate
& c
=
3581 *static_cast<const gles2::cmds::UniformMatrix3x2fvImmediate
*>(cmd_data
);
3583 GLint location
= static_cast<GLint
>(c
.location
);
3584 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3585 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3587 if (!ComputeDataSize(count
, sizeof(GLfloat
), 6, &data_size
)) {
3588 return error::kOutOfBounds
;
3590 if (data_size
> immediate_data_size
) {
3591 return error::kOutOfBounds
;
3593 const GLfloat
* value
=
3594 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3595 if (value
== NULL
) {
3596 return error::kOutOfBounds
;
3598 DoUniformMatrix3x2fv(location
, count
, transpose
, value
);
3599 return error::kNoError
;
3602 error::Error
GLES2DecoderImpl::HandleUniformMatrix3x4fvImmediate(
3603 uint32_t immediate_data_size
,
3604 const void* cmd_data
) {
3605 if (!unsafe_es3_apis_enabled())
3606 return error::kUnknownCommand
;
3607 const gles2::cmds::UniformMatrix3x4fvImmediate
& c
=
3608 *static_cast<const gles2::cmds::UniformMatrix3x4fvImmediate
*>(cmd_data
);
3610 GLint location
= static_cast<GLint
>(c
.location
);
3611 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3612 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3614 if (!ComputeDataSize(count
, sizeof(GLfloat
), 12, &data_size
)) {
3615 return error::kOutOfBounds
;
3617 if (data_size
> immediate_data_size
) {
3618 return error::kOutOfBounds
;
3620 const GLfloat
* value
=
3621 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3622 if (value
== NULL
) {
3623 return error::kOutOfBounds
;
3625 DoUniformMatrix3x4fv(location
, count
, transpose
, value
);
3626 return error::kNoError
;
3629 error::Error
GLES2DecoderImpl::HandleUniformMatrix4fvImmediate(
3630 uint32_t immediate_data_size
,
3631 const void* cmd_data
) {
3632 const gles2::cmds::UniformMatrix4fvImmediate
& c
=
3633 *static_cast<const gles2::cmds::UniformMatrix4fvImmediate
*>(cmd_data
);
3635 GLint location
= static_cast<GLint
>(c
.location
);
3636 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3637 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3639 if (!ComputeDataSize(count
, sizeof(GLfloat
), 16, &data_size
)) {
3640 return error::kOutOfBounds
;
3642 if (data_size
> immediate_data_size
) {
3643 return error::kOutOfBounds
;
3645 const GLfloat
* value
=
3646 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3647 if (value
== NULL
) {
3648 return error::kOutOfBounds
;
3650 DoUniformMatrix4fv(location
, count
, transpose
, value
);
3651 return error::kNoError
;
3654 error::Error
GLES2DecoderImpl::HandleUniformMatrix4x2fvImmediate(
3655 uint32_t immediate_data_size
,
3656 const void* cmd_data
) {
3657 if (!unsafe_es3_apis_enabled())
3658 return error::kUnknownCommand
;
3659 const gles2::cmds::UniformMatrix4x2fvImmediate
& c
=
3660 *static_cast<const gles2::cmds::UniformMatrix4x2fvImmediate
*>(cmd_data
);
3662 GLint location
= static_cast<GLint
>(c
.location
);
3663 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3664 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3666 if (!ComputeDataSize(count
, sizeof(GLfloat
), 8, &data_size
)) {
3667 return error::kOutOfBounds
;
3669 if (data_size
> immediate_data_size
) {
3670 return error::kOutOfBounds
;
3672 const GLfloat
* value
=
3673 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3674 if (value
== NULL
) {
3675 return error::kOutOfBounds
;
3677 DoUniformMatrix4x2fv(location
, count
, transpose
, value
);
3678 return error::kNoError
;
3681 error::Error
GLES2DecoderImpl::HandleUniformMatrix4x3fvImmediate(
3682 uint32_t immediate_data_size
,
3683 const void* cmd_data
) {
3684 if (!unsafe_es3_apis_enabled())
3685 return error::kUnknownCommand
;
3686 const gles2::cmds::UniformMatrix4x3fvImmediate
& c
=
3687 *static_cast<const gles2::cmds::UniformMatrix4x3fvImmediate
*>(cmd_data
);
3689 GLint location
= static_cast<GLint
>(c
.location
);
3690 GLsizei count
= static_cast<GLsizei
>(c
.count
);
3691 GLboolean transpose
= static_cast<GLboolean
>(c
.transpose
);
3693 if (!ComputeDataSize(count
, sizeof(GLfloat
), 12, &data_size
)) {
3694 return error::kOutOfBounds
;
3696 if (data_size
> immediate_data_size
) {
3697 return error::kOutOfBounds
;
3699 const GLfloat
* value
=
3700 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3701 if (value
== NULL
) {
3702 return error::kOutOfBounds
;
3704 DoUniformMatrix4x3fv(location
, count
, transpose
, value
);
3705 return error::kNoError
;
3708 error::Error
GLES2DecoderImpl::HandleUseProgram(uint32_t immediate_data_size
,
3709 const void* cmd_data
) {
3710 const gles2::cmds::UseProgram
& c
=
3711 *static_cast<const gles2::cmds::UseProgram
*>(cmd_data
);
3713 GLuint program
= c
.program
;
3714 DoUseProgram(program
);
3715 return error::kNoError
;
3718 error::Error
GLES2DecoderImpl::HandleValidateProgram(
3719 uint32_t immediate_data_size
,
3720 const void* cmd_data
) {
3721 const gles2::cmds::ValidateProgram
& c
=
3722 *static_cast<const gles2::cmds::ValidateProgram
*>(cmd_data
);
3724 GLuint program
= c
.program
;
3725 DoValidateProgram(program
);
3726 return error::kNoError
;
3729 error::Error
GLES2DecoderImpl::HandleVertexAttrib1f(
3730 uint32_t immediate_data_size
,
3731 const void* cmd_data
) {
3732 const gles2::cmds::VertexAttrib1f
& c
=
3733 *static_cast<const gles2::cmds::VertexAttrib1f
*>(cmd_data
);
3735 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3736 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3737 DoVertexAttrib1f(indx
, x
);
3738 return error::kNoError
;
3741 error::Error
GLES2DecoderImpl::HandleVertexAttrib1fvImmediate(
3742 uint32_t immediate_data_size
,
3743 const void* cmd_data
) {
3744 const gles2::cmds::VertexAttrib1fvImmediate
& c
=
3745 *static_cast<const gles2::cmds::VertexAttrib1fvImmediate
*>(cmd_data
);
3747 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3749 if (!ComputeDataSize(1, sizeof(GLfloat
), 1, &data_size
)) {
3750 return error::kOutOfBounds
;
3752 if (data_size
> immediate_data_size
) {
3753 return error::kOutOfBounds
;
3755 const GLfloat
* values
=
3756 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3757 if (values
== NULL
) {
3758 return error::kOutOfBounds
;
3760 DoVertexAttrib1fv(indx
, values
);
3761 return error::kNoError
;
3764 error::Error
GLES2DecoderImpl::HandleVertexAttrib2f(
3765 uint32_t immediate_data_size
,
3766 const void* cmd_data
) {
3767 const gles2::cmds::VertexAttrib2f
& c
=
3768 *static_cast<const gles2::cmds::VertexAttrib2f
*>(cmd_data
);
3770 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3771 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3772 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3773 DoVertexAttrib2f(indx
, x
, y
);
3774 return error::kNoError
;
3777 error::Error
GLES2DecoderImpl::HandleVertexAttrib2fvImmediate(
3778 uint32_t immediate_data_size
,
3779 const void* cmd_data
) {
3780 const gles2::cmds::VertexAttrib2fvImmediate
& c
=
3781 *static_cast<const gles2::cmds::VertexAttrib2fvImmediate
*>(cmd_data
);
3783 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3785 if (!ComputeDataSize(1, sizeof(GLfloat
), 2, &data_size
)) {
3786 return error::kOutOfBounds
;
3788 if (data_size
> immediate_data_size
) {
3789 return error::kOutOfBounds
;
3791 const GLfloat
* values
=
3792 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3793 if (values
== NULL
) {
3794 return error::kOutOfBounds
;
3796 DoVertexAttrib2fv(indx
, values
);
3797 return error::kNoError
;
3800 error::Error
GLES2DecoderImpl::HandleVertexAttrib3f(
3801 uint32_t immediate_data_size
,
3802 const void* cmd_data
) {
3803 const gles2::cmds::VertexAttrib3f
& c
=
3804 *static_cast<const gles2::cmds::VertexAttrib3f
*>(cmd_data
);
3806 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3807 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3808 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3809 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3810 DoVertexAttrib3f(indx
, x
, y
, z
);
3811 return error::kNoError
;
3814 error::Error
GLES2DecoderImpl::HandleVertexAttrib3fvImmediate(
3815 uint32_t immediate_data_size
,
3816 const void* cmd_data
) {
3817 const gles2::cmds::VertexAttrib3fvImmediate
& c
=
3818 *static_cast<const gles2::cmds::VertexAttrib3fvImmediate
*>(cmd_data
);
3820 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3822 if (!ComputeDataSize(1, sizeof(GLfloat
), 3, &data_size
)) {
3823 return error::kOutOfBounds
;
3825 if (data_size
> immediate_data_size
) {
3826 return error::kOutOfBounds
;
3828 const GLfloat
* values
=
3829 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3830 if (values
== NULL
) {
3831 return error::kOutOfBounds
;
3833 DoVertexAttrib3fv(indx
, values
);
3834 return error::kNoError
;
3837 error::Error
GLES2DecoderImpl::HandleVertexAttrib4f(
3838 uint32_t immediate_data_size
,
3839 const void* cmd_data
) {
3840 const gles2::cmds::VertexAttrib4f
& c
=
3841 *static_cast<const gles2::cmds::VertexAttrib4f
*>(cmd_data
);
3843 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3844 GLfloat x
= static_cast<GLfloat
>(c
.x
);
3845 GLfloat y
= static_cast<GLfloat
>(c
.y
);
3846 GLfloat z
= static_cast<GLfloat
>(c
.z
);
3847 GLfloat w
= static_cast<GLfloat
>(c
.w
);
3848 DoVertexAttrib4f(indx
, x
, y
, z
, w
);
3849 return error::kNoError
;
3852 error::Error
GLES2DecoderImpl::HandleVertexAttrib4fvImmediate(
3853 uint32_t immediate_data_size
,
3854 const void* cmd_data
) {
3855 const gles2::cmds::VertexAttrib4fvImmediate
& c
=
3856 *static_cast<const gles2::cmds::VertexAttrib4fvImmediate
*>(cmd_data
);
3858 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3860 if (!ComputeDataSize(1, sizeof(GLfloat
), 4, &data_size
)) {
3861 return error::kOutOfBounds
;
3863 if (data_size
> immediate_data_size
) {
3864 return error::kOutOfBounds
;
3866 const GLfloat
* values
=
3867 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
3868 if (values
== NULL
) {
3869 return error::kOutOfBounds
;
3871 DoVertexAttrib4fv(indx
, values
);
3872 return error::kNoError
;
3875 error::Error
GLES2DecoderImpl::HandleVertexAttribI4i(
3876 uint32_t immediate_data_size
,
3877 const void* cmd_data
) {
3878 if (!unsafe_es3_apis_enabled())
3879 return error::kUnknownCommand
;
3880 const gles2::cmds::VertexAttribI4i
& c
=
3881 *static_cast<const gles2::cmds::VertexAttribI4i
*>(cmd_data
);
3883 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3884 GLint x
= static_cast<GLint
>(c
.x
);
3885 GLint y
= static_cast<GLint
>(c
.y
);
3886 GLint z
= static_cast<GLint
>(c
.z
);
3887 GLint w
= static_cast<GLint
>(c
.w
);
3888 DoVertexAttribI4i(indx
, x
, y
, z
, w
);
3889 return error::kNoError
;
3892 error::Error
GLES2DecoderImpl::HandleVertexAttribI4ivImmediate(
3893 uint32_t immediate_data_size
,
3894 const void* cmd_data
) {
3895 if (!unsafe_es3_apis_enabled())
3896 return error::kUnknownCommand
;
3897 const gles2::cmds::VertexAttribI4ivImmediate
& c
=
3898 *static_cast<const gles2::cmds::VertexAttribI4ivImmediate
*>(cmd_data
);
3900 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3902 if (!ComputeDataSize(1, sizeof(GLint
), 4, &data_size
)) {
3903 return error::kOutOfBounds
;
3905 if (data_size
> immediate_data_size
) {
3906 return error::kOutOfBounds
;
3908 const GLint
* values
=
3909 GetImmediateDataAs
<const GLint
*>(c
, data_size
, immediate_data_size
);
3910 if (values
== NULL
) {
3911 return error::kOutOfBounds
;
3913 DoVertexAttribI4iv(indx
, values
);
3914 return error::kNoError
;
3917 error::Error
GLES2DecoderImpl::HandleVertexAttribI4ui(
3918 uint32_t immediate_data_size
,
3919 const void* cmd_data
) {
3920 if (!unsafe_es3_apis_enabled())
3921 return error::kUnknownCommand
;
3922 const gles2::cmds::VertexAttribI4ui
& c
=
3923 *static_cast<const gles2::cmds::VertexAttribI4ui
*>(cmd_data
);
3925 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3926 GLuint x
= static_cast<GLuint
>(c
.x
);
3927 GLuint y
= static_cast<GLuint
>(c
.y
);
3928 GLuint z
= static_cast<GLuint
>(c
.z
);
3929 GLuint w
= static_cast<GLuint
>(c
.w
);
3930 DoVertexAttribI4ui(indx
, x
, y
, z
, w
);
3931 return error::kNoError
;
3934 error::Error
GLES2DecoderImpl::HandleVertexAttribI4uivImmediate(
3935 uint32_t immediate_data_size
,
3936 const void* cmd_data
) {
3937 if (!unsafe_es3_apis_enabled())
3938 return error::kUnknownCommand
;
3939 const gles2::cmds::VertexAttribI4uivImmediate
& c
=
3940 *static_cast<const gles2::cmds::VertexAttribI4uivImmediate
*>(cmd_data
);
3942 GLuint indx
= static_cast<GLuint
>(c
.indx
);
3944 if (!ComputeDataSize(1, sizeof(GLuint
), 4, &data_size
)) {
3945 return error::kOutOfBounds
;
3947 if (data_size
> immediate_data_size
) {
3948 return error::kOutOfBounds
;
3950 const GLuint
* values
=
3951 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
3952 if (values
== NULL
) {
3953 return error::kOutOfBounds
;
3955 DoVertexAttribI4uiv(indx
, values
);
3956 return error::kNoError
;
3959 error::Error
GLES2DecoderImpl::HandleViewport(uint32_t immediate_data_size
,
3960 const void* cmd_data
) {
3961 const gles2::cmds::Viewport
& c
=
3962 *static_cast<const gles2::cmds::Viewport
*>(cmd_data
);
3964 GLint x
= static_cast<GLint
>(c
.x
);
3965 GLint y
= static_cast<GLint
>(c
.y
);
3966 GLsizei width
= static_cast<GLsizei
>(c
.width
);
3967 GLsizei height
= static_cast<GLsizei
>(c
.height
);
3969 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glViewport", "width < 0");
3970 return error::kNoError
;
3973 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glViewport", "height < 0");
3974 return error::kNoError
;
3976 DoViewport(x
, y
, width
, height
);
3977 return error::kNoError
;
3980 error::Error
GLES2DecoderImpl::HandleBlitFramebufferCHROMIUM(
3981 uint32_t immediate_data_size
,
3982 const void* cmd_data
) {
3983 const gles2::cmds::BlitFramebufferCHROMIUM
& c
=
3984 *static_cast<const gles2::cmds::BlitFramebufferCHROMIUM
*>(cmd_data
);
3986 if (!features().chromium_framebuffer_multisample
) {
3987 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBlitFramebufferCHROMIUM",
3988 "function not available");
3989 return error::kNoError
;
3993 error
= WillAccessBoundFramebufferForDraw();
3994 if (error
!= error::kNoError
)
3996 error
= WillAccessBoundFramebufferForRead();
3997 if (error
!= error::kNoError
)
3999 GLint srcX0
= static_cast<GLint
>(c
.srcX0
);
4000 GLint srcY0
= static_cast<GLint
>(c
.srcY0
);
4001 GLint srcX1
= static_cast<GLint
>(c
.srcX1
);
4002 GLint srcY1
= static_cast<GLint
>(c
.srcY1
);
4003 GLint dstX0
= static_cast<GLint
>(c
.dstX0
);
4004 GLint dstY0
= static_cast<GLint
>(c
.dstY0
);
4005 GLint dstX1
= static_cast<GLint
>(c
.dstX1
);
4006 GLint dstY1
= static_cast<GLint
>(c
.dstY1
);
4007 GLbitfield mask
= static_cast<GLbitfield
>(c
.mask
);
4008 GLenum filter
= static_cast<GLenum
>(c
.filter
);
4009 if (!validators_
->blit_filter
.IsValid(filter
)) {
4010 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlitFramebufferCHROMIUM", filter
,
4012 return error::kNoError
;
4014 DoBlitFramebufferCHROMIUM(srcX0
, srcY0
, srcX1
, srcY1
, dstX0
, dstY0
, dstX1
,
4015 dstY1
, mask
, filter
);
4016 return error::kNoError
;
4019 error::Error
GLES2DecoderImpl::HandleRenderbufferStorageMultisampleCHROMIUM(
4020 uint32_t immediate_data_size
,
4021 const void* cmd_data
) {
4022 const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM
& c
=
4023 *static_cast<const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM
*>(
4026 if (!features().chromium_framebuffer_multisample
) {
4027 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
,
4028 "glRenderbufferStorageMultisampleCHROMIUM",
4029 "function not available");
4030 return error::kNoError
;
4033 GLenum target
= static_cast<GLenum
>(c
.target
);
4034 GLsizei samples
= static_cast<GLsizei
>(c
.samples
);
4035 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
4036 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4037 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4038 if (!validators_
->render_buffer_target
.IsValid(target
)) {
4039 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleCHROMIUM",
4041 return error::kNoError
;
4044 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
,
4045 "glRenderbufferStorageMultisampleCHROMIUM",
4047 return error::kNoError
;
4049 if (!validators_
->render_buffer_format
.IsValid(internalformat
)) {
4050 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleCHROMIUM",
4051 internalformat
, "internalformat");
4052 return error::kNoError
;
4055 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
,
4056 "glRenderbufferStorageMultisampleCHROMIUM", "width < 0");
4057 return error::kNoError
;
4060 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
,
4061 "glRenderbufferStorageMultisampleCHROMIUM",
4063 return error::kNoError
;
4065 DoRenderbufferStorageMultisampleCHROMIUM(target
, samples
, internalformat
,
4067 return error::kNoError
;
4070 error::Error
GLES2DecoderImpl::HandleRenderbufferStorageMultisampleEXT(
4071 uint32_t immediate_data_size
,
4072 const void* cmd_data
) {
4073 const gles2::cmds::RenderbufferStorageMultisampleEXT
& c
=
4074 *static_cast<const gles2::cmds::RenderbufferStorageMultisampleEXT
*>(
4077 if (!features().multisampled_render_to_texture
) {
4078 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
,
4079 "glRenderbufferStorageMultisampleEXT",
4080 "function not available");
4081 return error::kNoError
;
4084 GLenum target
= static_cast<GLenum
>(c
.target
);
4085 GLsizei samples
= static_cast<GLsizei
>(c
.samples
);
4086 GLenum internalformat
= static_cast<GLenum
>(c
.internalformat
);
4087 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4088 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4089 if (!validators_
->render_buffer_target
.IsValid(target
)) {
4090 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleEXT",
4092 return error::kNoError
;
4095 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorageMultisampleEXT",
4097 return error::kNoError
;
4099 if (!validators_
->render_buffer_format
.IsValid(internalformat
)) {
4100 LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleEXT",
4101 internalformat
, "internalformat");
4102 return error::kNoError
;
4105 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorageMultisampleEXT",
4107 return error::kNoError
;
4110 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glRenderbufferStorageMultisampleEXT",
4112 return error::kNoError
;
4114 DoRenderbufferStorageMultisampleEXT(target
, samples
, internalformat
, width
,
4116 return error::kNoError
;
4119 error::Error
GLES2DecoderImpl::HandleFramebufferTexture2DMultisampleEXT(
4120 uint32_t immediate_data_size
,
4121 const void* cmd_data
) {
4122 const gles2::cmds::FramebufferTexture2DMultisampleEXT
& c
=
4123 *static_cast<const gles2::cmds::FramebufferTexture2DMultisampleEXT
*>(
4126 if (!features().multisampled_render_to_texture
) {
4127 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
,
4128 "glFramebufferTexture2DMultisampleEXT",
4129 "function not available");
4130 return error::kNoError
;
4133 GLenum target
= static_cast<GLenum
>(c
.target
);
4134 GLenum attachment
= static_cast<GLenum
>(c
.attachment
);
4135 GLenum textarget
= static_cast<GLenum
>(c
.textarget
);
4136 GLuint texture
= c
.texture
;
4137 GLint level
= static_cast<GLint
>(c
.level
);
4138 GLsizei samples
= static_cast<GLsizei
>(c
.samples
);
4139 if (!validators_
->frame_buffer_target
.IsValid(target
)) {
4140 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT",
4142 return error::kNoError
;
4144 if (!validators_
->attachment
.IsValid(attachment
)) {
4145 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT",
4146 attachment
, "attachment");
4147 return error::kNoError
;
4149 if (!validators_
->texture_target
.IsValid(textarget
)) {
4150 LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT",
4151 textarget
, "textarget");
4152 return error::kNoError
;
4155 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glFramebufferTexture2DMultisampleEXT",
4157 return error::kNoError
;
4159 DoFramebufferTexture2DMultisample(target
, attachment
, textarget
, texture
,
4161 return error::kNoError
;
4164 error::Error
GLES2DecoderImpl::HandleTexStorage2DEXT(
4165 uint32_t immediate_data_size
,
4166 const void* cmd_data
) {
4167 const gles2::cmds::TexStorage2DEXT
& c
=
4168 *static_cast<const gles2::cmds::TexStorage2DEXT
*>(cmd_data
);
4170 GLenum target
= static_cast<GLenum
>(c
.target
);
4171 GLsizei levels
= static_cast<GLsizei
>(c
.levels
);
4172 GLenum internalFormat
= static_cast<GLenum
>(c
.internalFormat
);
4173 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4174 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4175 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4176 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DEXT", target
, "target");
4177 return error::kNoError
;
4180 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexStorage2DEXT", "levels < 0");
4181 return error::kNoError
;
4183 if (!validators_
->texture_internal_format_storage
.IsValid(internalFormat
)) {
4184 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DEXT", internalFormat
,
4186 return error::kNoError
;
4189 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexStorage2DEXT", "width < 0");
4190 return error::kNoError
;
4193 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexStorage2DEXT", "height < 0");
4194 return error::kNoError
;
4196 DoTexStorage2DEXT(target
, levels
, internalFormat
, width
, height
);
4197 return error::kNoError
;
4200 error::Error
GLES2DecoderImpl::HandleGenQueriesEXTImmediate(
4201 uint32_t immediate_data_size
,
4202 const void* cmd_data
) {
4203 const gles2::cmds::GenQueriesEXTImmediate
& c
=
4204 *static_cast<const gles2::cmds::GenQueriesEXTImmediate
*>(cmd_data
);
4206 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4208 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4209 return error::kOutOfBounds
;
4212 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
4213 if (queries
== NULL
) {
4214 return error::kOutOfBounds
;
4216 if (!GenQueriesEXTHelper(n
, queries
)) {
4217 return error::kInvalidArguments
;
4219 return error::kNoError
;
4222 error::Error
GLES2DecoderImpl::HandleDeleteQueriesEXTImmediate(
4223 uint32_t immediate_data_size
,
4224 const void* cmd_data
) {
4225 const gles2::cmds::DeleteQueriesEXTImmediate
& c
=
4226 *static_cast<const gles2::cmds::DeleteQueriesEXTImmediate
*>(cmd_data
);
4228 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4230 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4231 return error::kOutOfBounds
;
4233 const GLuint
* queries
=
4234 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
4235 if (queries
== NULL
) {
4236 return error::kOutOfBounds
;
4238 DeleteQueriesEXTHelper(n
, queries
);
4239 return error::kNoError
;
4242 error::Error
GLES2DecoderImpl::HandleBeginTransformFeedback(
4243 uint32_t immediate_data_size
,
4244 const void* cmd_data
) {
4245 if (!unsafe_es3_apis_enabled())
4246 return error::kUnknownCommand
;
4247 const gles2::cmds::BeginTransformFeedback
& c
=
4248 *static_cast<const gles2::cmds::BeginTransformFeedback
*>(cmd_data
);
4250 GLenum primitivemode
= static_cast<GLenum
>(c
.primitivemode
);
4251 glBeginTransformFeedback(primitivemode
);
4252 return error::kNoError
;
4255 error::Error
GLES2DecoderImpl::HandleEndTransformFeedback(
4256 uint32_t immediate_data_size
,
4257 const void* cmd_data
) {
4258 if (!unsafe_es3_apis_enabled())
4259 return error::kUnknownCommand
;
4260 const gles2::cmds::EndTransformFeedback
& c
=
4261 *static_cast<const gles2::cmds::EndTransformFeedback
*>(cmd_data
);
4263 glEndTransformFeedback();
4264 return error::kNoError
;
4267 error::Error
GLES2DecoderImpl::HandleInsertEventMarkerEXT(
4268 uint32_t immediate_data_size
,
4269 const void* cmd_data
) {
4270 const gles2::cmds::InsertEventMarkerEXT
& c
=
4271 *static_cast<const gles2::cmds::InsertEventMarkerEXT
*>(cmd_data
);
4274 GLuint bucket_id
= static_cast<GLuint
>(c
.bucket_id
);
4275 Bucket
* bucket
= GetBucket(bucket_id
);
4276 if (!bucket
|| bucket
->size() == 0) {
4277 return error::kInvalidArguments
;
4280 if (!bucket
->GetAsString(&str
)) {
4281 return error::kInvalidArguments
;
4283 DoInsertEventMarkerEXT(0, str
.c_str());
4284 return error::kNoError
;
4287 error::Error
GLES2DecoderImpl::HandlePushGroupMarkerEXT(
4288 uint32_t immediate_data_size
,
4289 const void* cmd_data
) {
4290 const gles2::cmds::PushGroupMarkerEXT
& c
=
4291 *static_cast<const gles2::cmds::PushGroupMarkerEXT
*>(cmd_data
);
4294 GLuint bucket_id
= static_cast<GLuint
>(c
.bucket_id
);
4295 Bucket
* bucket
= GetBucket(bucket_id
);
4296 if (!bucket
|| bucket
->size() == 0) {
4297 return error::kInvalidArguments
;
4300 if (!bucket
->GetAsString(&str
)) {
4301 return error::kInvalidArguments
;
4303 DoPushGroupMarkerEXT(0, str
.c_str());
4304 return error::kNoError
;
4307 error::Error
GLES2DecoderImpl::HandlePopGroupMarkerEXT(
4308 uint32_t immediate_data_size
,
4309 const void* cmd_data
) {
4310 const gles2::cmds::PopGroupMarkerEXT
& c
=
4311 *static_cast<const gles2::cmds::PopGroupMarkerEXT
*>(cmd_data
);
4313 DoPopGroupMarkerEXT();
4314 return error::kNoError
;
4317 error::Error
GLES2DecoderImpl::HandleGenVertexArraysOESImmediate(
4318 uint32_t immediate_data_size
,
4319 const void* cmd_data
) {
4320 const gles2::cmds::GenVertexArraysOESImmediate
& c
=
4321 *static_cast<const gles2::cmds::GenVertexArraysOESImmediate
*>(cmd_data
);
4323 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4325 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4326 return error::kOutOfBounds
;
4329 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
4330 if (arrays
== NULL
) {
4331 return error::kOutOfBounds
;
4333 if (!GenVertexArraysOESHelper(n
, arrays
)) {
4334 return error::kInvalidArguments
;
4336 return error::kNoError
;
4339 error::Error
GLES2DecoderImpl::HandleDeleteVertexArraysOESImmediate(
4340 uint32_t immediate_data_size
,
4341 const void* cmd_data
) {
4342 const gles2::cmds::DeleteVertexArraysOESImmediate
& c
=
4343 *static_cast<const gles2::cmds::DeleteVertexArraysOESImmediate
*>(
4346 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4348 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4349 return error::kOutOfBounds
;
4351 const GLuint
* arrays
=
4352 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
4353 if (arrays
== NULL
) {
4354 return error::kOutOfBounds
;
4356 DeleteVertexArraysOESHelper(n
, arrays
);
4357 return error::kNoError
;
4360 error::Error
GLES2DecoderImpl::HandleIsVertexArrayOES(
4361 uint32_t immediate_data_size
,
4362 const void* cmd_data
) {
4363 const gles2::cmds::IsVertexArrayOES
& c
=
4364 *static_cast<const gles2::cmds::IsVertexArrayOES
*>(cmd_data
);
4366 GLuint array
= c
.array
;
4367 typedef cmds::IsVertexArrayOES::Result Result
;
4368 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
4369 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
4371 return error::kOutOfBounds
;
4373 *result_dst
= DoIsVertexArrayOES(array
);
4374 return error::kNoError
;
4377 error::Error
GLES2DecoderImpl::HandleBindVertexArrayOES(
4378 uint32_t immediate_data_size
,
4379 const void* cmd_data
) {
4380 const gles2::cmds::BindVertexArrayOES
& c
=
4381 *static_cast<const gles2::cmds::BindVertexArrayOES
*>(cmd_data
);
4383 GLuint array
= c
.array
;
4384 DoBindVertexArrayOES(array
);
4385 return error::kNoError
;
4388 error::Error
GLES2DecoderImpl::HandleSwapBuffers(uint32_t immediate_data_size
,
4389 const void* cmd_data
) {
4390 const gles2::cmds::SwapBuffers
& c
=
4391 *static_cast<const gles2::cmds::SwapBuffers
*>(cmd_data
);
4394 return error::kNoError
;
4397 error::Error
GLES2DecoderImpl::HandleGetMaxValueInBufferCHROMIUM(
4398 uint32_t immediate_data_size
,
4399 const void* cmd_data
) {
4400 const gles2::cmds::GetMaxValueInBufferCHROMIUM
& c
=
4401 *static_cast<const gles2::cmds::GetMaxValueInBufferCHROMIUM
*>(cmd_data
);
4403 GLuint buffer_id
= c
.buffer_id
;
4404 GLsizei count
= static_cast<GLsizei
>(c
.count
);
4405 GLenum type
= static_cast<GLenum
>(c
.type
);
4406 GLuint offset
= static_cast<GLuint
>(c
.offset
);
4407 typedef cmds::GetMaxValueInBufferCHROMIUM::Result Result
;
4408 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
4409 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
4411 return error::kOutOfBounds
;
4414 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glGetMaxValueInBufferCHROMIUM",
4416 return error::kNoError
;
4418 if (!validators_
->get_max_index_type
.IsValid(type
)) {
4419 LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetMaxValueInBufferCHROMIUM", type
,
4421 return error::kNoError
;
4423 *result_dst
= DoGetMaxValueInBufferCHROMIUM(buffer_id
, count
, type
, offset
);
4424 return error::kNoError
;
4427 error::Error
GLES2DecoderImpl::HandleTexImageIOSurface2DCHROMIUM(
4428 uint32_t immediate_data_size
,
4429 const void* cmd_data
) {
4430 const gles2::cmds::TexImageIOSurface2DCHROMIUM
& c
=
4431 *static_cast<const gles2::cmds::TexImageIOSurface2DCHROMIUM
*>(cmd_data
);
4433 GLenum target
= static_cast<GLenum
>(c
.target
);
4434 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4435 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4436 GLuint ioSurfaceId
= static_cast<GLuint
>(c
.ioSurfaceId
);
4437 GLuint plane
= static_cast<GLuint
>(c
.plane
);
4438 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4439 LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexImageIOSurface2DCHROMIUM", target
,
4441 return error::kNoError
;
4444 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexImageIOSurface2DCHROMIUM",
4446 return error::kNoError
;
4449 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glTexImageIOSurface2DCHROMIUM",
4451 return error::kNoError
;
4453 DoTexImageIOSurface2DCHROMIUM(target
, width
, height
, ioSurfaceId
, plane
);
4454 return error::kNoError
;
4457 error::Error
GLES2DecoderImpl::HandleCopyTextureCHROMIUM(
4458 uint32_t immediate_data_size
,
4459 const void* cmd_data
) {
4460 const gles2::cmds::CopyTextureCHROMIUM
& c
=
4461 *static_cast<const gles2::cmds::CopyTextureCHROMIUM
*>(cmd_data
);
4463 GLenum target
= static_cast<GLenum
>(c
.target
);
4464 GLenum source_id
= static_cast<GLenum
>(c
.source_id
);
4465 GLenum dest_id
= static_cast<GLenum
>(c
.dest_id
);
4466 GLint internalformat
= static_cast<GLint
>(c
.internalformat
);
4467 GLenum dest_type
= static_cast<GLenum
>(c
.dest_type
);
4468 GLboolean unpack_flip_y
= static_cast<GLboolean
>(c
.unpack_flip_y
);
4469 GLboolean unpack_premultiply_alpha
=
4470 static_cast<GLboolean
>(c
.unpack_premultiply_alpha
);
4471 GLboolean unpack_unmultiply_alpha
=
4472 static_cast<GLboolean
>(c
.unpack_unmultiply_alpha
);
4473 if (!validators_
->texture_internal_format
.IsValid(internalformat
)) {
4474 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopyTextureCHROMIUM",
4475 "internalformat GL_INVALID_VALUE");
4476 return error::kNoError
;
4478 if (!validators_
->pixel_type
.IsValid(dest_type
)) {
4479 LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTextureCHROMIUM", dest_type
,
4481 return error::kNoError
;
4483 DoCopyTextureCHROMIUM(target
, source_id
, dest_id
, internalformat
, dest_type
,
4484 unpack_flip_y
, unpack_premultiply_alpha
,
4485 unpack_unmultiply_alpha
);
4486 return error::kNoError
;
4489 error::Error
GLES2DecoderImpl::HandleCopySubTextureCHROMIUM(
4490 uint32_t immediate_data_size
,
4491 const void* cmd_data
) {
4492 const gles2::cmds::CopySubTextureCHROMIUM
& c
=
4493 *static_cast<const gles2::cmds::CopySubTextureCHROMIUM
*>(cmd_data
);
4495 GLenum target
= static_cast<GLenum
>(c
.target
);
4496 GLenum source_id
= static_cast<GLenum
>(c
.source_id
);
4497 GLenum dest_id
= static_cast<GLenum
>(c
.dest_id
);
4498 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
4499 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
4500 GLint x
= static_cast<GLint
>(c
.x
);
4501 GLint y
= static_cast<GLint
>(c
.y
);
4502 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4503 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4504 GLboolean unpack_flip_y
= static_cast<GLboolean
>(c
.unpack_flip_y
);
4505 GLboolean unpack_premultiply_alpha
=
4506 static_cast<GLboolean
>(c
.unpack_premultiply_alpha
);
4507 GLboolean unpack_unmultiply_alpha
=
4508 static_cast<GLboolean
>(c
.unpack_unmultiply_alpha
);
4510 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopySubTextureCHROMIUM",
4512 return error::kNoError
;
4515 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCopySubTextureCHROMIUM",
4517 return error::kNoError
;
4519 DoCopySubTextureCHROMIUM(target
, source_id
, dest_id
, xoffset
, yoffset
, x
, y
,
4520 width
, height
, unpack_flip_y
,
4521 unpack_premultiply_alpha
, unpack_unmultiply_alpha
);
4522 return error::kNoError
;
4525 error::Error
GLES2DecoderImpl::HandleCompressedCopyTextureCHROMIUM(
4526 uint32_t immediate_data_size
,
4527 const void* cmd_data
) {
4528 const gles2::cmds::CompressedCopyTextureCHROMIUM
& c
=
4529 *static_cast<const gles2::cmds::CompressedCopyTextureCHROMIUM
*>(cmd_data
);
4531 GLenum target
= static_cast<GLenum
>(c
.target
);
4532 GLenum source_id
= static_cast<GLenum
>(c
.source_id
);
4533 GLenum dest_id
= static_cast<GLenum
>(c
.dest_id
);
4534 DoCompressedCopyTextureCHROMIUM(target
, source_id
, dest_id
);
4535 return error::kNoError
;
4538 error::Error
GLES2DecoderImpl::HandleCompressedCopySubTextureCHROMIUM(
4539 uint32_t immediate_data_size
,
4540 const void* cmd_data
) {
4541 const gles2::cmds::CompressedCopySubTextureCHROMIUM
& c
=
4542 *static_cast<const gles2::cmds::CompressedCopySubTextureCHROMIUM
*>(
4545 GLenum target
= static_cast<GLenum
>(c
.target
);
4546 GLenum source_id
= static_cast<GLenum
>(c
.source_id
);
4547 GLenum dest_id
= static_cast<GLenum
>(c
.dest_id
);
4548 GLint xoffset
= static_cast<GLint
>(c
.xoffset
);
4549 GLint yoffset
= static_cast<GLint
>(c
.yoffset
);
4550 GLint x
= static_cast<GLint
>(c
.x
);
4551 GLint y
= static_cast<GLint
>(c
.y
);
4552 GLsizei width
= static_cast<GLsizei
>(c
.width
);
4553 GLsizei height
= static_cast<GLsizei
>(c
.height
);
4555 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCompressedCopySubTextureCHROMIUM",
4557 return error::kNoError
;
4560 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glCompressedCopySubTextureCHROMIUM",
4562 return error::kNoError
;
4564 DoCompressedCopySubTextureCHROMIUM(target
, source_id
, dest_id
, xoffset
,
4565 yoffset
, x
, y
, width
, height
);
4566 return error::kNoError
;
4569 error::Error
GLES2DecoderImpl::HandleProduceTextureCHROMIUMImmediate(
4570 uint32_t immediate_data_size
,
4571 const void* cmd_data
) {
4572 const gles2::cmds::ProduceTextureCHROMIUMImmediate
& c
=
4573 *static_cast<const gles2::cmds::ProduceTextureCHROMIUMImmediate
*>(
4576 GLenum target
= static_cast<GLenum
>(c
.target
);
4578 if (!ComputeDataSize(1, sizeof(GLbyte
), 64, &data_size
)) {
4579 return error::kOutOfBounds
;
4581 if (data_size
> immediate_data_size
) {
4582 return error::kOutOfBounds
;
4584 const GLbyte
* mailbox
=
4585 GetImmediateDataAs
<const GLbyte
*>(c
, data_size
, immediate_data_size
);
4586 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4587 LOCAL_SET_GL_ERROR_INVALID_ENUM("glProduceTextureCHROMIUM", target
,
4589 return error::kNoError
;
4591 if (mailbox
== NULL
) {
4592 return error::kOutOfBounds
;
4594 DoProduceTextureCHROMIUM(target
, mailbox
);
4595 return error::kNoError
;
4598 error::Error
GLES2DecoderImpl::HandleProduceTextureDirectCHROMIUMImmediate(
4599 uint32_t immediate_data_size
,
4600 const void* cmd_data
) {
4601 const gles2::cmds::ProduceTextureDirectCHROMIUMImmediate
& c
=
4602 *static_cast<const gles2::cmds::ProduceTextureDirectCHROMIUMImmediate
*>(
4605 GLuint texture
= c
.texture
;
4606 GLenum target
= static_cast<GLenum
>(c
.target
);
4608 if (!ComputeDataSize(1, sizeof(GLbyte
), 64, &data_size
)) {
4609 return error::kOutOfBounds
;
4611 if (data_size
> immediate_data_size
) {
4612 return error::kOutOfBounds
;
4614 const GLbyte
* mailbox
=
4615 GetImmediateDataAs
<const GLbyte
*>(c
, data_size
, immediate_data_size
);
4616 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4617 LOCAL_SET_GL_ERROR_INVALID_ENUM("glProduceTextureDirectCHROMIUM", target
,
4619 return error::kNoError
;
4621 if (mailbox
== NULL
) {
4622 return error::kOutOfBounds
;
4624 DoProduceTextureDirectCHROMIUM(texture
, target
, mailbox
);
4625 return error::kNoError
;
4628 error::Error
GLES2DecoderImpl::HandleConsumeTextureCHROMIUMImmediate(
4629 uint32_t immediate_data_size
,
4630 const void* cmd_data
) {
4631 const gles2::cmds::ConsumeTextureCHROMIUMImmediate
& c
=
4632 *static_cast<const gles2::cmds::ConsumeTextureCHROMIUMImmediate
*>(
4635 GLenum target
= static_cast<GLenum
>(c
.target
);
4637 if (!ComputeDataSize(1, sizeof(GLbyte
), 64, &data_size
)) {
4638 return error::kOutOfBounds
;
4640 if (data_size
> immediate_data_size
) {
4641 return error::kOutOfBounds
;
4643 const GLbyte
* mailbox
=
4644 GetImmediateDataAs
<const GLbyte
*>(c
, data_size
, immediate_data_size
);
4645 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4646 LOCAL_SET_GL_ERROR_INVALID_ENUM("glConsumeTextureCHROMIUM", target
,
4648 return error::kNoError
;
4650 if (mailbox
== NULL
) {
4651 return error::kOutOfBounds
;
4653 DoConsumeTextureCHROMIUM(target
, mailbox
);
4654 return error::kNoError
;
4657 error::Error
GLES2DecoderImpl::HandleGenValuebuffersCHROMIUMImmediate(
4658 uint32_t immediate_data_size
,
4659 const void* cmd_data
) {
4660 const gles2::cmds::GenValuebuffersCHROMIUMImmediate
& c
=
4661 *static_cast<const gles2::cmds::GenValuebuffersCHROMIUMImmediate
*>(
4664 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4666 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4667 return error::kOutOfBounds
;
4670 GetImmediateDataAs
<GLuint
*>(c
, data_size
, immediate_data_size
);
4671 if (buffers
== NULL
) {
4672 return error::kOutOfBounds
;
4674 if (!GenValuebuffersCHROMIUMHelper(n
, buffers
)) {
4675 return error::kInvalidArguments
;
4677 return error::kNoError
;
4680 error::Error
GLES2DecoderImpl::HandleDeleteValuebuffersCHROMIUMImmediate(
4681 uint32_t immediate_data_size
,
4682 const void* cmd_data
) {
4683 const gles2::cmds::DeleteValuebuffersCHROMIUMImmediate
& c
=
4684 *static_cast<const gles2::cmds::DeleteValuebuffersCHROMIUMImmediate
*>(
4687 GLsizei n
= static_cast<GLsizei
>(c
.n
);
4689 if (!SafeMultiplyUint32(n
, sizeof(GLuint
), &data_size
)) {
4690 return error::kOutOfBounds
;
4692 const GLuint
* valuebuffers
=
4693 GetImmediateDataAs
<const GLuint
*>(c
, data_size
, immediate_data_size
);
4694 if (valuebuffers
== NULL
) {
4695 return error::kOutOfBounds
;
4697 DeleteValuebuffersCHROMIUMHelper(n
, valuebuffers
);
4698 return error::kNoError
;
4701 error::Error
GLES2DecoderImpl::HandleIsValuebufferCHROMIUM(
4702 uint32_t immediate_data_size
,
4703 const void* cmd_data
) {
4704 const gles2::cmds::IsValuebufferCHROMIUM
& c
=
4705 *static_cast<const gles2::cmds::IsValuebufferCHROMIUM
*>(cmd_data
);
4707 GLuint valuebuffer
= c
.valuebuffer
;
4708 typedef cmds::IsValuebufferCHROMIUM::Result Result
;
4709 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
4710 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
4712 return error::kOutOfBounds
;
4714 *result_dst
= DoIsValuebufferCHROMIUM(valuebuffer
);
4715 return error::kNoError
;
4718 error::Error
GLES2DecoderImpl::HandleBindValuebufferCHROMIUM(
4719 uint32_t immediate_data_size
,
4720 const void* cmd_data
) {
4721 const gles2::cmds::BindValuebufferCHROMIUM
& c
=
4722 *static_cast<const gles2::cmds::BindValuebufferCHROMIUM
*>(cmd_data
);
4724 GLenum target
= static_cast<GLenum
>(c
.target
);
4725 GLuint valuebuffer
= c
.valuebuffer
;
4726 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4727 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindValuebufferCHROMIUM", target
,
4729 return error::kNoError
;
4731 DoBindValueBufferCHROMIUM(target
, valuebuffer
);
4732 return error::kNoError
;
4735 error::Error
GLES2DecoderImpl::HandleSubscribeValueCHROMIUM(
4736 uint32_t immediate_data_size
,
4737 const void* cmd_data
) {
4738 const gles2::cmds::SubscribeValueCHROMIUM
& c
=
4739 *static_cast<const gles2::cmds::SubscribeValueCHROMIUM
*>(cmd_data
);
4741 GLenum target
= static_cast<GLenum
>(c
.target
);
4742 GLenum subscription
= static_cast<GLenum
>(c
.subscription
);
4743 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4744 LOCAL_SET_GL_ERROR_INVALID_ENUM("glSubscribeValueCHROMIUM", target
,
4746 return error::kNoError
;
4748 if (!validators_
->subscription_target
.IsValid(subscription
)) {
4749 LOCAL_SET_GL_ERROR_INVALID_ENUM("glSubscribeValueCHROMIUM", subscription
,
4751 return error::kNoError
;
4753 DoSubscribeValueCHROMIUM(target
, subscription
);
4754 return error::kNoError
;
4757 error::Error
GLES2DecoderImpl::HandlePopulateSubscribedValuesCHROMIUM(
4758 uint32_t immediate_data_size
,
4759 const void* cmd_data
) {
4760 const gles2::cmds::PopulateSubscribedValuesCHROMIUM
& c
=
4761 *static_cast<const gles2::cmds::PopulateSubscribedValuesCHROMIUM
*>(
4764 GLenum target
= static_cast<GLenum
>(c
.target
);
4765 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4766 LOCAL_SET_GL_ERROR_INVALID_ENUM("glPopulateSubscribedValuesCHROMIUM",
4768 return error::kNoError
;
4770 DoPopulateSubscribedValuesCHROMIUM(target
);
4771 return error::kNoError
;
4774 error::Error
GLES2DecoderImpl::HandleUniformValuebufferCHROMIUM(
4775 uint32_t immediate_data_size
,
4776 const void* cmd_data
) {
4777 const gles2::cmds::UniformValuebufferCHROMIUM
& c
=
4778 *static_cast<const gles2::cmds::UniformValuebufferCHROMIUM
*>(cmd_data
);
4780 GLint location
= static_cast<GLint
>(c
.location
);
4781 GLenum target
= static_cast<GLenum
>(c
.target
);
4782 GLenum subscription
= static_cast<GLenum
>(c
.subscription
);
4783 if (!validators_
->value_buffer_target
.IsValid(target
)) {
4784 LOCAL_SET_GL_ERROR_INVALID_ENUM("glUniformValuebufferCHROMIUM", target
,
4786 return error::kNoError
;
4788 if (!validators_
->subscription_target
.IsValid(subscription
)) {
4789 LOCAL_SET_GL_ERROR_INVALID_ENUM("glUniformValuebufferCHROMIUM",
4790 subscription
, "subscription");
4791 return error::kNoError
;
4793 DoUniformValueBufferCHROMIUM(location
, target
, subscription
);
4794 return error::kNoError
;
4797 error::Error
GLES2DecoderImpl::HandleBindTexImage2DCHROMIUM(
4798 uint32_t immediate_data_size
,
4799 const void* cmd_data
) {
4800 const gles2::cmds::BindTexImage2DCHROMIUM
& c
=
4801 *static_cast<const gles2::cmds::BindTexImage2DCHROMIUM
*>(cmd_data
);
4803 GLenum target
= static_cast<GLenum
>(c
.target
);
4804 GLint imageId
= static_cast<GLint
>(c
.imageId
);
4805 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4806 LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTexImage2DCHROMIUM", target
,
4808 return error::kNoError
;
4810 DoBindTexImage2DCHROMIUM(target
, imageId
);
4811 return error::kNoError
;
4814 error::Error
GLES2DecoderImpl::HandleReleaseTexImage2DCHROMIUM(
4815 uint32_t immediate_data_size
,
4816 const void* cmd_data
) {
4817 const gles2::cmds::ReleaseTexImage2DCHROMIUM
& c
=
4818 *static_cast<const gles2::cmds::ReleaseTexImage2DCHROMIUM
*>(cmd_data
);
4820 GLenum target
= static_cast<GLenum
>(c
.target
);
4821 GLint imageId
= static_cast<GLint
>(c
.imageId
);
4822 if (!validators_
->texture_bind_target
.IsValid(target
)) {
4823 LOCAL_SET_GL_ERROR_INVALID_ENUM("glReleaseTexImage2DCHROMIUM", target
,
4825 return error::kNoError
;
4827 DoReleaseTexImage2DCHROMIUM(target
, imageId
);
4828 return error::kNoError
;
4831 error::Error
GLES2DecoderImpl::HandleTraceEndCHROMIUM(
4832 uint32_t immediate_data_size
,
4833 const void* cmd_data
) {
4834 const gles2::cmds::TraceEndCHROMIUM
& c
=
4835 *static_cast<const gles2::cmds::TraceEndCHROMIUM
*>(cmd_data
);
4837 DoTraceEndCHROMIUM();
4838 return error::kNoError
;
4841 error::Error
GLES2DecoderImpl::HandleDiscardFramebufferEXTImmediate(
4842 uint32_t immediate_data_size
,
4843 const void* cmd_data
) {
4844 const gles2::cmds::DiscardFramebufferEXTImmediate
& c
=
4845 *static_cast<const gles2::cmds::DiscardFramebufferEXTImmediate
*>(
4848 if (!features().ext_discard_framebuffer
) {
4849 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glDiscardFramebufferEXT",
4850 "function not available");
4851 return error::kNoError
;
4854 GLenum target
= static_cast<GLenum
>(c
.target
);
4855 GLsizei count
= static_cast<GLsizei
>(c
.count
);
4857 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
4858 return error::kOutOfBounds
;
4860 if (data_size
> immediate_data_size
) {
4861 return error::kOutOfBounds
;
4863 const GLenum
* attachments
=
4864 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
4866 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glDiscardFramebufferEXT",
4868 return error::kNoError
;
4870 if (attachments
== NULL
) {
4871 return error::kOutOfBounds
;
4873 DoDiscardFramebufferEXT(target
, count
, attachments
);
4874 return error::kNoError
;
4877 error::Error
GLES2DecoderImpl::HandleLoseContextCHROMIUM(
4878 uint32_t immediate_data_size
,
4879 const void* cmd_data
) {
4880 const gles2::cmds::LoseContextCHROMIUM
& c
=
4881 *static_cast<const gles2::cmds::LoseContextCHROMIUM
*>(cmd_data
);
4883 GLenum current
= static_cast<GLenum
>(c
.current
);
4884 GLenum other
= static_cast<GLenum
>(c
.other
);
4885 if (!validators_
->reset_status
.IsValid(current
)) {
4886 LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", current
,
4888 return error::kNoError
;
4890 if (!validators_
->reset_status
.IsValid(other
)) {
4891 LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", other
, "other");
4892 return error::kNoError
;
4894 DoLoseContextCHROMIUM(current
, other
);
4895 return error::kNoError
;
4898 error::Error
GLES2DecoderImpl::HandleDrawBuffersEXTImmediate(
4899 uint32_t immediate_data_size
,
4900 const void* cmd_data
) {
4901 const gles2::cmds::DrawBuffersEXTImmediate
& c
=
4902 *static_cast<const gles2::cmds::DrawBuffersEXTImmediate
*>(cmd_data
);
4904 GLsizei count
= static_cast<GLsizei
>(c
.count
);
4906 if (!ComputeDataSize(count
, sizeof(GLenum
), 1, &data_size
)) {
4907 return error::kOutOfBounds
;
4909 if (data_size
> immediate_data_size
) {
4910 return error::kOutOfBounds
;
4912 const GLenum
* bufs
=
4913 GetImmediateDataAs
<const GLenum
*>(c
, data_size
, immediate_data_size
);
4915 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE
, "glDrawBuffersEXT", "count < 0");
4916 return error::kNoError
;
4919 return error::kOutOfBounds
;
4921 DoDrawBuffersEXT(count
, bufs
);
4922 return error::kNoError
;
4925 error::Error
GLES2DecoderImpl::HandleSwapInterval(uint32_t immediate_data_size
,
4926 const void* cmd_data
) {
4927 const gles2::cmds::SwapInterval
& c
=
4928 *static_cast<const gles2::cmds::SwapInterval
*>(cmd_data
);
4930 GLint interval
= static_cast<GLint
>(c
.interval
);
4931 DoSwapInterval(interval
);
4932 return error::kNoError
;
4935 error::Error
GLES2DecoderImpl::HandleFlushDriverCachesCHROMIUM(
4936 uint32_t immediate_data_size
,
4937 const void* cmd_data
) {
4938 const gles2::cmds::FlushDriverCachesCHROMIUM
& c
=
4939 *static_cast<const gles2::cmds::FlushDriverCachesCHROMIUM
*>(cmd_data
);
4941 DoFlushDriverCachesCHROMIUM();
4942 return error::kNoError
;
4945 error::Error
GLES2DecoderImpl::HandleMatrixLoadfCHROMIUMImmediate(
4946 uint32_t immediate_data_size
,
4947 const void* cmd_data
) {
4948 const gles2::cmds::MatrixLoadfCHROMIUMImmediate
& c
=
4949 *static_cast<const gles2::cmds::MatrixLoadfCHROMIUMImmediate
*>(cmd_data
);
4951 if (!features().chromium_path_rendering
) {
4952 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glMatrixLoadfCHROMIUM",
4953 "function not available");
4954 return error::kNoError
;
4957 GLenum matrixMode
= static_cast<GLenum
>(c
.matrixMode
);
4959 if (!ComputeDataSize(1, sizeof(GLfloat
), 16, &data_size
)) {
4960 return error::kOutOfBounds
;
4962 if (data_size
> immediate_data_size
) {
4963 return error::kOutOfBounds
;
4966 GetImmediateDataAs
<const GLfloat
*>(c
, data_size
, immediate_data_size
);
4967 if (!validators_
->matrix_mode
.IsValid(matrixMode
)) {
4968 LOCAL_SET_GL_ERROR_INVALID_ENUM("glMatrixLoadfCHROMIUM", matrixMode
,
4970 return error::kNoError
;
4973 return error::kOutOfBounds
;
4975 DoMatrixLoadfCHROMIUM(matrixMode
, m
);
4976 return error::kNoError
;
4979 error::Error
GLES2DecoderImpl::HandleMatrixLoadIdentityCHROMIUM(
4980 uint32_t immediate_data_size
,
4981 const void* cmd_data
) {
4982 const gles2::cmds::MatrixLoadIdentityCHROMIUM
& c
=
4983 *static_cast<const gles2::cmds::MatrixLoadIdentityCHROMIUM
*>(cmd_data
);
4985 if (!features().chromium_path_rendering
) {
4986 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glMatrixLoadIdentityCHROMIUM",
4987 "function not available");
4988 return error::kNoError
;
4991 GLenum matrixMode
= static_cast<GLenum
>(c
.matrixMode
);
4992 if (!validators_
->matrix_mode
.IsValid(matrixMode
)) {
4993 LOCAL_SET_GL_ERROR_INVALID_ENUM("glMatrixLoadIdentityCHROMIUM", matrixMode
,
4995 return error::kNoError
;
4997 DoMatrixLoadIdentityCHROMIUM(matrixMode
);
4998 return error::kNoError
;
5001 error::Error
GLES2DecoderImpl::HandleIsPathCHROMIUM(
5002 uint32_t immediate_data_size
,
5003 const void* cmd_data
) {
5004 const gles2::cmds::IsPathCHROMIUM
& c
=
5005 *static_cast<const gles2::cmds::IsPathCHROMIUM
*>(cmd_data
);
5007 if (!features().chromium_path_rendering
) {
5008 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glIsPathCHROMIUM",
5009 "function not available");
5010 return error::kNoError
;
5013 GLuint path
= c
.path
;
5014 typedef cmds::IsPathCHROMIUM::Result Result
;
5015 Result
* result_dst
= GetSharedMemoryAs
<Result
*>(
5016 c
.result_shm_id
, c
.result_shm_offset
, sizeof(*result_dst
));
5018 return error::kOutOfBounds
;
5020 *result_dst
= DoIsPathCHROMIUM(path
);
5021 return error::kNoError
;
5024 error::Error
GLES2DecoderImpl::HandlePathStencilFuncCHROMIUM(
5025 uint32_t immediate_data_size
,
5026 const void* cmd_data
) {
5027 const gles2::cmds::PathStencilFuncCHROMIUM
& c
=
5028 *static_cast<const gles2::cmds::PathStencilFuncCHROMIUM
*>(cmd_data
);
5030 if (!features().chromium_path_rendering
) {
5031 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glPathStencilFuncCHROMIUM",
5032 "function not available");
5033 return error::kNoError
;
5036 GLenum func
= static_cast<GLenum
>(c
.func
);
5037 GLint ref
= static_cast<GLint
>(c
.ref
);
5038 GLuint mask
= static_cast<GLuint
>(c
.mask
);
5039 if (!validators_
->cmp_function
.IsValid(func
)) {
5040 LOCAL_SET_GL_ERROR_INVALID_ENUM("glPathStencilFuncCHROMIUM", func
, "func");
5041 return error::kNoError
;
5043 if (state_
.stencil_path_func
!= func
|| state_
.stencil_path_ref
!= ref
||
5044 state_
.stencil_path_mask
!= mask
) {
5045 state_
.stencil_path_func
= func
;
5046 state_
.stencil_path_ref
= ref
;
5047 state_
.stencil_path_mask
= mask
;
5048 glPathStencilFuncNV(func
, ref
, mask
);
5050 return error::kNoError
;
5053 error::Error
GLES2DecoderImpl::HandleBlendBarrierKHR(
5054 uint32_t immediate_data_size
,
5055 const void* cmd_data
) {
5056 const gles2::cmds::BlendBarrierKHR
& c
=
5057 *static_cast<const gles2::cmds::BlendBarrierKHR
*>(cmd_data
);
5059 if (!features().blend_equation_advanced
) {
5060 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
, "glBlendBarrierKHR",
5061 "function not available");
5062 return error::kNoError
;
5065 glBlendBarrierKHR();
5066 return error::kNoError
;
5069 error::Error
GLES2DecoderImpl::HandleApplyScreenSpaceAntialiasingCHROMIUM(
5070 uint32_t immediate_data_size
,
5071 const void* cmd_data
) {
5072 const gles2::cmds::ApplyScreenSpaceAntialiasingCHROMIUM
& c
=
5073 *static_cast<const gles2::cmds::ApplyScreenSpaceAntialiasingCHROMIUM
*>(
5076 if (!features().chromium_screen_space_antialiasing
) {
5077 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION
,
5078 "glApplyScreenSpaceAntialiasingCHROMIUM",
5079 "function not available");
5080 return error::kNoError
;
5083 DoApplyScreenSpaceAntialiasingCHROMIUM();
5084 return error::kNoError
;
5087 bool GLES2DecoderImpl::SetCapabilityState(GLenum cap
, bool enabled
) {
5090 state_
.enable_flags
.blend
= enabled
;
5091 if (state_
.enable_flags
.cached_blend
!= enabled
||
5092 state_
.ignore_cached_state
) {
5093 state_
.enable_flags
.cached_blend
= enabled
;
5098 state_
.enable_flags
.cull_face
= enabled
;
5099 if (state_
.enable_flags
.cached_cull_face
!= enabled
||
5100 state_
.ignore_cached_state
) {
5101 state_
.enable_flags
.cached_cull_face
= enabled
;
5106 state_
.enable_flags
.depth_test
= enabled
;
5107 if (state_
.enable_flags
.cached_depth_test
!= enabled
||
5108 state_
.ignore_cached_state
) {
5109 framebuffer_state_
.clear_state_dirty
= true;
5113 state_
.enable_flags
.dither
= enabled
;
5114 if (state_
.enable_flags
.cached_dither
!= enabled
||
5115 state_
.ignore_cached_state
) {
5116 state_
.enable_flags
.cached_dither
= enabled
;
5120 case GL_POLYGON_OFFSET_FILL
:
5121 state_
.enable_flags
.polygon_offset_fill
= enabled
;
5122 if (state_
.enable_flags
.cached_polygon_offset_fill
!= enabled
||
5123 state_
.ignore_cached_state
) {
5124 state_
.enable_flags
.cached_polygon_offset_fill
= enabled
;
5128 case GL_SAMPLE_ALPHA_TO_COVERAGE
:
5129 state_
.enable_flags
.sample_alpha_to_coverage
= enabled
;
5130 if (state_
.enable_flags
.cached_sample_alpha_to_coverage
!= enabled
||
5131 state_
.ignore_cached_state
) {
5132 state_
.enable_flags
.cached_sample_alpha_to_coverage
= enabled
;
5136 case GL_SAMPLE_COVERAGE
:
5137 state_
.enable_flags
.sample_coverage
= enabled
;
5138 if (state_
.enable_flags
.cached_sample_coverage
!= enabled
||
5139 state_
.ignore_cached_state
) {
5140 state_
.enable_flags
.cached_sample_coverage
= enabled
;
5144 case GL_SCISSOR_TEST
:
5145 state_
.enable_flags
.scissor_test
= enabled
;
5146 if (state_
.enable_flags
.cached_scissor_test
!= enabled
||
5147 state_
.ignore_cached_state
) {
5148 state_
.enable_flags
.cached_scissor_test
= enabled
;
5152 case GL_STENCIL_TEST
:
5153 state_
.enable_flags
.stencil_test
= enabled
;
5154 if (state_
.enable_flags
.cached_stencil_test
!= enabled
||
5155 state_
.ignore_cached_state
) {
5156 framebuffer_state_
.clear_state_dirty
= true;
5159 case GL_RASTERIZER_DISCARD
:
5160 state_
.enable_flags
.rasterizer_discard
= enabled
;
5161 if (state_
.enable_flags
.cached_rasterizer_discard
!= enabled
||
5162 state_
.ignore_cached_state
) {
5163 state_
.enable_flags
.cached_rasterizer_discard
= enabled
;
5167 case GL_PRIMITIVE_RESTART_FIXED_INDEX
:
5168 state_
.enable_flags
.primitive_restart_fixed_index
= enabled
;
5169 if (state_
.enable_flags
.cached_primitive_restart_fixed_index
!= enabled
||
5170 state_
.ignore_cached_state
) {
5171 state_
.enable_flags
.cached_primitive_restart_fixed_index
= enabled
;
5180 #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_