Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 2461023002: command buffer: audit validation of ES3 commands (part 2) (Closed)
Patch Set: update mocked unittests Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
6 6
7 #include <limits.h> 7 #include <limits.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 #include <stdio.h> 10 #include <stdio.h>
(...skipping 13404 matching lines...) Expand 10 before | Expand all | Expand 10 after
13415 &texture_state_, &state_, &framebuffer_state_, func_name, args); 13415 &texture_state_, &state_, &framebuffer_state_, func_name, args);
13416 13416
13417 // This may be a slow command. Exit command processing to allow for 13417 // This may be a slow command. Exit command processing to allow for
13418 // context preemption and GPU watchdog checks. 13418 // context preemption and GPU watchdog checks.
13419 ExitCommandProcessingEarly(); 13419 ExitCommandProcessingEarly();
13420 return error::kNoError; 13420 return error::kNoError;
13421 } 13421 }
13422 13422
13423 error::Error GLES2DecoderImpl::HandleTexImage3D(uint32_t immediate_data_size, 13423 error::Error GLES2DecoderImpl::HandleTexImage3D(uint32_t immediate_data_size,
13424 const volatile void* cmd_data) { 13424 const volatile void* cmd_data) {
13425 if (!unsafe_es3_apis_enabled()) 13425 if (!feature_info_->IsWebGL2OrES3Context())
13426 return error::kUnknownCommand; 13426 return error::kUnknownCommand;
13427 13427
13428 const char* func_name = "glTexImage3D"; 13428 const char* func_name = "glTexImage3D";
13429 const volatile gles2::cmds::TexImage3D& c = 13429 const volatile gles2::cmds::TexImage3D& c =
13430 *static_cast<const volatile gles2::cmds::TexImage3D*>(cmd_data); 13430 *static_cast<const volatile gles2::cmds::TexImage3D*>(cmd_data);
13431 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexImage3D", 13431 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexImage3D",
13432 "widthXheight", c.width * c.height, "depth", c.depth); 13432 "widthXheight", c.width * c.height, "depth", c.depth);
13433 // Set as failed for now, but if it successed, this will be set to not failed. 13433 // Set as failed for now, but if it successed, this will be set to not failed.
13434 texture_state_.tex_image_failed = true; 13434 texture_state_.tex_image_failed = true;
13435 GLenum target = static_cast<GLenum>(c.target); 13435 GLenum target = static_cast<GLenum>(c.target);
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after
14257 14257
14258 // This may be a slow command. Exit command processing to allow for 14258 // This may be a slow command. Exit command processing to allow for
14259 // context preemption and GPU watchdog checks. 14259 // context preemption and GPU watchdog checks.
14260 ExitCommandProcessingEarly(); 14260 ExitCommandProcessingEarly();
14261 return error::kNoError; 14261 return error::kNoError;
14262 } 14262 }
14263 14263
14264 error::Error GLES2DecoderImpl::HandleTexSubImage3D( 14264 error::Error GLES2DecoderImpl::HandleTexSubImage3D(
14265 uint32_t immediate_data_size, 14265 uint32_t immediate_data_size,
14266 const volatile void* cmd_data) { 14266 const volatile void* cmd_data) {
14267 if (!unsafe_es3_apis_enabled()) 14267 if (!feature_info_->IsWebGL2OrES3Context())
14268 return error::kUnknownCommand; 14268 return error::kUnknownCommand;
14269 14269
14270 const char* func_name = "glTexSubImage3D"; 14270 const char* func_name = "glTexSubImage3D";
14271 const volatile gles2::cmds::TexSubImage3D& c = 14271 const volatile gles2::cmds::TexSubImage3D& c =
14272 *static_cast<const volatile gles2::cmds::TexSubImage3D*>(cmd_data); 14272 *static_cast<const volatile gles2::cmds::TexSubImage3D*>(cmd_data);
14273 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexSubImage3D", 14273 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexSubImage3D",
14274 "widthXheight", c.width * c.height, "depth", c.depth); 14274 "widthXheight", c.width * c.height, "depth", c.depth);
14275 GLboolean internal = static_cast<GLboolean>(c.internal); 14275 GLboolean internal = static_cast<GLboolean>(c.internal);
14276 if (internal == GL_TRUE && texture_state_.tex_image_failed) 14276 if (internal == GL_TRUE && texture_state_.tex_image_failed)
14277 return error::kNoError; 14277 return error::kNoError;
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
14473 &result_size)) { 14473 &result_size)) {
14474 glGetUniformiv( 14474 glGetUniformiv(
14475 service_id, real_location, result->GetData()); 14475 service_id, real_location, result->GetData());
14476 } 14476 }
14477 return error; 14477 return error;
14478 } 14478 }
14479 14479
14480 error::Error GLES2DecoderImpl::HandleGetUniformuiv( 14480 error::Error GLES2DecoderImpl::HandleGetUniformuiv(
14481 uint32_t immediate_data_size, 14481 uint32_t immediate_data_size,
14482 const volatile void* cmd_data) { 14482 const volatile void* cmd_data) {
14483 if (!unsafe_es3_apis_enabled()) 14483 if (!feature_info_->IsWebGL2OrES3Context())
14484 return error::kUnknownCommand; 14484 return error::kUnknownCommand;
14485 14485
14486 const volatile gles2::cmds::GetUniformuiv& c = 14486 const volatile gles2::cmds::GetUniformuiv& c =
14487 *static_cast<const volatile gles2::cmds::GetUniformuiv*>(cmd_data); 14487 *static_cast<const volatile gles2::cmds::GetUniformuiv*>(cmd_data);
14488 GLuint program = c.program; 14488 GLuint program = c.program;
14489 GLint fake_location = c.location; 14489 GLint fake_location = c.location;
14490 GLuint service_id; 14490 GLuint service_id;
14491 GLenum result_type; 14491 GLenum result_type;
14492 GLsizei result_size; 14492 GLsizei result_size;
14493 GLint real_location = -1; 14493 GLint real_location = -1;
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
14650 result->size = uniform_info->size; 14650 result->size = uniform_info->size;
14651 result->type = uniform_info->type; 14651 result->type = uniform_info->type;
14652 Bucket* bucket = CreateBucket(name_bucket_id); 14652 Bucket* bucket = CreateBucket(name_bucket_id);
14653 bucket->SetFromString(uniform_info->name.c_str()); 14653 bucket->SetFromString(uniform_info->name.c_str());
14654 return error::kNoError; 14654 return error::kNoError;
14655 } 14655 }
14656 14656
14657 error::Error GLES2DecoderImpl::HandleGetActiveUniformBlockiv( 14657 error::Error GLES2DecoderImpl::HandleGetActiveUniformBlockiv(
14658 uint32_t immediate_data_size, 14658 uint32_t immediate_data_size,
14659 const volatile void* cmd_data) { 14659 const volatile void* cmd_data) {
14660 if (!unsafe_es3_apis_enabled()) 14660 if (!feature_info_->IsWebGL2OrES3Context())
14661 return error::kUnknownCommand; 14661 return error::kUnknownCommand;
14662 const volatile gles2::cmds::GetActiveUniformBlockiv& c = 14662 const volatile gles2::cmds::GetActiveUniformBlockiv& c =
14663 *static_cast<const volatile gles2::cmds::GetActiveUniformBlockiv*>( 14663 *static_cast<const volatile gles2::cmds::GetActiveUniformBlockiv*>(
14664 cmd_data); 14664 cmd_data);
14665 GLuint program_id = c.program; 14665 GLuint program_id = c.program;
14666 GLuint index = static_cast<GLuint>(c.index); 14666 GLuint index = static_cast<GLuint>(c.index);
14667 GLenum pname = static_cast<GLenum>(c.pname); 14667 GLenum pname = static_cast<GLenum>(c.pname);
14668 Program* program = GetProgramInfoNotShader( 14668 Program* program = GetProgramInfoNotShader(
14669 program_id, "glGetActiveUniformBlockiv"); 14669 program_id, "glGetActiveUniformBlockiv");
14670 if (!program) { 14670 if (!program) {
14671 return error::kNoError; 14671 return error::kNoError;
14672 } 14672 }
14673 GLuint service_id = program->service_id(); 14673 GLuint service_id = program->service_id();
14674 GLint link_status = GL_FALSE; 14674 GLint link_status = GL_FALSE;
14675 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status); 14675 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status);
14676 if (link_status != GL_TRUE) { 14676 if (link_status != GL_TRUE) {
14677 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, 14677 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
14678 "glGetActiveActiveUniformBlockiv", "program not linked"); 14678 "glGetActiveActiveUniformBlockiv", "program not linked");
14679 return error::kNoError; 14679 return error::kNoError;
14680 } 14680 }
14681 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetActiveUniformBlockiv"); 14681 if (index >= program->uniform_block_size_info().size()) {
14682 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glGetActiveUniformBlockiv",
14683 "uniformBlockIndex >= active uniform blocks");
14684 return error::kNoError;
14685 }
14682 GLsizei num_values = 1; 14686 GLsizei num_values = 1;
14683 if (pname == GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES) { 14687 if (pname == GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES) {
14684 GLint num = 0; 14688 GLint num = 0;
14685 glGetActiveUniformBlockiv( 14689 glGetActiveUniformBlockiv(
14686 service_id, index, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &num); 14690 service_id, index, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &num);
14687 GLenum error = glGetError(); 14691 GLenum error = glGetError();
14688 if (error != GL_NO_ERROR) { 14692 if (error != GL_NO_ERROR) {
14689 // Assume this will the same error if calling with pname. 14693 // Assume this will the same error if calling with pname.
14690 LOCAL_SET_GL_ERROR(error, "GetActiveUniformBlockiv", ""); 14694 LOCAL_SET_GL_ERROR(error, "GetActiveUniformBlockiv", "");
14691 return error::kNoError; 14695 return error::kNoError;
14692 } 14696 }
14693 num_values = static_cast<GLsizei>(num); 14697 num_values = static_cast<GLsizei>(num);
14694 } 14698 }
14695 typedef cmds::GetActiveUniformBlockiv::Result Result; 14699 typedef cmds::GetActiveUniformBlockiv::Result Result;
14696 Result* result = GetSharedMemoryAs<Result*>( 14700 Result* result = GetSharedMemoryAs<Result*>(
14697 c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values)); 14701 c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
14698 GLint* params = result ? result->GetData() : NULL; 14702 GLint* params = result ? result->GetData() : NULL;
14699 if (params == NULL) { 14703 if (params == NULL) {
14700 return error::kOutOfBounds; 14704 return error::kOutOfBounds;
14701 } 14705 }
14702 // Check that the client initialized the result. 14706 // Check that the client initialized the result.
14703 if (result->size != 0) { 14707 if (result->size != 0) {
14704 return error::kInvalidArguments; 14708 return error::kInvalidArguments;
14705 } 14709 }
14706 glGetActiveUniformBlockiv(service_id, index, pname, params); 14710 glGetActiveUniformBlockiv(service_id, index, pname, params);
14707 GLenum error = glGetError(); 14711 result->SetNumResults(num_values);
14708 if (error == GL_NO_ERROR) {
14709 result->SetNumResults(num_values);
14710 } else {
14711 LOCAL_SET_GL_ERROR(error, "GetActiveUniformBlockiv", "");
14712 }
14713 return error::kNoError; 14712 return error::kNoError;
14714 } 14713 }
14715 14714
14716 error::Error GLES2DecoderImpl::HandleGetActiveUniformBlockName( 14715 error::Error GLES2DecoderImpl::HandleGetActiveUniformBlockName(
14717 uint32_t immediate_data_size, 14716 uint32_t immediate_data_size,
14718 const volatile void* cmd_data) { 14717 const volatile void* cmd_data) {
14719 if (!unsafe_es3_apis_enabled()) 14718 if (!feature_info_->IsWebGL2OrES3Context())
14720 return error::kUnknownCommand; 14719 return error::kUnknownCommand;
14721 const volatile gles2::cmds::GetActiveUniformBlockName& c = 14720 const volatile gles2::cmds::GetActiveUniformBlockName& c =
14722 *static_cast<const volatile gles2::cmds::GetActiveUniformBlockName*>( 14721 *static_cast<const volatile gles2::cmds::GetActiveUniformBlockName*>(
14723 cmd_data); 14722 cmd_data);
14724 GLuint program_id = c.program; 14723 GLuint program_id = c.program;
14725 GLuint index = c.index; 14724 GLuint index = c.index;
14726 uint32_t name_bucket_id = c.name_bucket_id; 14725 uint32_t name_bucket_id = c.name_bucket_id;
14727 typedef cmds::GetActiveUniformBlockName::Result Result; 14726 typedef cmds::GetActiveUniformBlockName::Result Result;
14728 Result* result = GetSharedMemoryAs<Result*>( 14727 Result* result = GetSharedMemoryAs<Result*>(
14729 c.result_shm_id, c.result_shm_offset, sizeof(*result)); 14728 c.result_shm_id, c.result_shm_offset, sizeof(*result));
(...skipping 10 matching lines...) Expand all
14740 return error::kNoError; 14739 return error::kNoError;
14741 } 14740 }
14742 GLuint service_id = program->service_id(); 14741 GLuint service_id = program->service_id();
14743 GLint link_status = GL_FALSE; 14742 GLint link_status = GL_FALSE;
14744 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status); 14743 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status);
14745 if (link_status != GL_TRUE) { 14744 if (link_status != GL_TRUE) {
14746 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, 14745 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
14747 "glGetActiveActiveUniformBlockName", "program not linked"); 14746 "glGetActiveActiveUniformBlockName", "program not linked");
14748 return error::kNoError; 14747 return error::kNoError;
14749 } 14748 }
14749 if (index >= program->uniform_block_size_info().size()) {
14750 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glGetActiveUniformBlockName",
14751 "uniformBlockIndex >= active uniform blocks");
14752 return error::kNoError;
14753 }
14750 GLint max_length = 0; 14754 GLint max_length = 0;
14751 glGetProgramiv( 14755 glGetProgramiv(
14752 service_id, GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, &max_length); 14756 service_id, GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, &max_length);
14753 // Increase one so &buffer[0] is always valid. 14757 // Increase one so &buffer[0] is always valid.
14754 GLsizei buf_size = static_cast<GLsizei>(max_length) + 1; 14758 GLsizei buf_size = static_cast<GLsizei>(max_length) + 1;
14755 std::vector<char> buffer(buf_size); 14759 std::vector<char> buffer(buf_size);
14756 GLsizei length = 0; 14760 GLsizei length = 0;
14757 glGetActiveUniformBlockName( 14761 glGetActiveUniformBlockName(
14758 service_id, index, buf_size, &length, &buffer[0]); 14762 service_id, index, buf_size, &length, &buffer[0]);
14759 if (length == 0) { 14763 if (length == 0) {
14760 *result = 0; 14764 *result = 0;
14761 return error::kNoError; 14765 return error::kNoError;
14762 } 14766 }
14763 *result = 1; 14767 *result = 1;
14764 Bucket* bucket = CreateBucket(name_bucket_id); 14768 Bucket* bucket = CreateBucket(name_bucket_id);
14765 DCHECK_GT(buf_size, length); 14769 DCHECK_GT(buf_size, length);
14766 DCHECK_EQ(0, buffer[length]); 14770 DCHECK_EQ(0, buffer[length]);
14767 bucket->SetFromString(&buffer[0]); 14771 bucket->SetFromString(&buffer[0]);
14768 return error::kNoError; 14772 return error::kNoError;
14769 } 14773 }
14770 14774
14771 error::Error GLES2DecoderImpl::HandleGetActiveUniformsiv( 14775 error::Error GLES2DecoderImpl::HandleGetActiveUniformsiv(
14772 uint32_t immediate_data_size, 14776 uint32_t immediate_data_size,
14773 const volatile void* cmd_data) { 14777 const volatile void* cmd_data) {
14774 if (!unsafe_es3_apis_enabled()) 14778 if (!feature_info_->IsWebGL2OrES3Context())
14775 return error::kUnknownCommand; 14779 return error::kUnknownCommand;
14776 const volatile gles2::cmds::GetActiveUniformsiv& c = 14780 const volatile gles2::cmds::GetActiveUniformsiv& c =
14777 *static_cast<const volatile gles2::cmds::GetActiveUniformsiv*>(cmd_data); 14781 *static_cast<const volatile gles2::cmds::GetActiveUniformsiv*>(cmd_data);
14778 GLuint program_id = c.program; 14782 GLuint program_id = c.program;
14779 GLenum pname = static_cast<GLenum>(c.pname); 14783 GLenum pname = static_cast<GLenum>(c.pname);
14780 Bucket* bucket = GetBucket(c.indices_bucket_id); 14784 Bucket* bucket = GetBucket(c.indices_bucket_id);
14781 if (!bucket) { 14785 if (!bucket) {
14782 return error::kInvalidArguments; 14786 return error::kInvalidArguments;
14783 } 14787 }
14784 if (!validators_->uniform_parameter.IsValid(pname)) { 14788 if (!validators_->uniform_parameter.IsValid(pname)) {
(...skipping 11 matching lines...) Expand all
14796 } 14800 }
14797 // Check that the client initialized the result. 14801 // Check that the client initialized the result.
14798 if (result->size != 0) { 14802 if (result->size != 0) {
14799 return error::kInvalidArguments; 14803 return error::kInvalidArguments;
14800 } 14804 }
14801 Program* program = GetProgramInfoNotShader( 14805 Program* program = GetProgramInfoNotShader(
14802 program_id, "glGetActiveUniformsiv"); 14806 program_id, "glGetActiveUniformsiv");
14803 if (!program) { 14807 if (!program) {
14804 return error::kNoError; 14808 return error::kNoError;
14805 } 14809 }
14810 GLint activeUniforms = 0;
14811 program->GetProgramiv(GL_ACTIVE_UNIFORMS, &activeUniforms);
14812 for (int i = 0; i < count; i++) {
14813 if (indices[i] >= static_cast<GLuint>(activeUniforms)) {
14814 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
14815 "glGetActiveUniformsiv", "index >= active uniforms");
14816 return error::kNoError;
14817 }
14818 }
14806 GLuint service_id = program->service_id(); 14819 GLuint service_id = program->service_id();
14807 GLint link_status = GL_FALSE; 14820 GLint link_status = GL_FALSE;
14808 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status); 14821 glGetProgramiv(service_id, GL_LINK_STATUS, &link_status);
14809 if (link_status != GL_TRUE) { 14822 if (link_status != GL_TRUE) {
14810 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, 14823 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
14811 "glGetActiveUniformsiv", "program not linked"); 14824 "glGetActiveUniformsiv", "program not linked");
14812 return error::kNoError; 14825 return error::kNoError;
14813 } 14826 }
14814 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetActiveUniformsiv");
14815 glGetActiveUniformsiv(service_id, count, indices, pname, params); 14827 glGetActiveUniformsiv(service_id, count, indices, pname, params);
14816 GLenum error = glGetError(); 14828 result->SetNumResults(count);
14817 if (error == GL_NO_ERROR) {
14818 result->SetNumResults(count);
14819 } else {
14820 LOCAL_SET_GL_ERROR(error, "GetActiveUniformsiv", "");
14821 }
14822 return error::kNoError; 14829 return error::kNoError;
14823 } 14830 }
14824 14831
14825 error::Error GLES2DecoderImpl::HandleGetActiveAttrib( 14832 error::Error GLES2DecoderImpl::HandleGetActiveAttrib(
14826 uint32_t immediate_data_size, 14833 uint32_t immediate_data_size,
14827 const volatile void* cmd_data) { 14834 const volatile void* cmd_data) {
14828 const volatile gles2::cmds::GetActiveAttrib& c = 14835 const volatile gles2::cmds::GetActiveAttrib& c =
14829 *static_cast<const volatile gles2::cmds::GetActiveAttrib*>(cmd_data); 14836 *static_cast<const volatile gles2::cmds::GetActiveAttrib*>(cmd_data);
14830 GLuint program_id = c.program; 14837 GLuint program_id = c.program;
14831 GLuint index = c.index; 14838 GLuint index = c.index;
(...skipping 3928 matching lines...) Expand 10 before | Expand all | Expand 10 after
18760 } 18767 }
18761 18768
18762 // Include the auto-generated part of this file. We split this because it means 18769 // Include the auto-generated part of this file. We split this because it means
18763 // we can easily edit the non-auto generated parts right here in this file 18770 // we can easily edit the non-auto generated parts right here in this file
18764 // instead of having to edit some template or the code generator. 18771 // instead of having to edit some template or the code generator.
18765 #include "base/macros.h" 18772 #include "base/macros.h"
18766 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 18773 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
18767 18774
18768 } // namespace gles2 18775 } // namespace gles2
18769 } // namespace gpu 18776 } // namespace gpu
OLDNEW
« no previous file with comments | « no previous file | gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698