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