OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
9 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 9 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
10 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 10 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 ASSERT_TRUE(bucket != NULL); | 74 ASSERT_TRUE(bucket != NULL); |
75 EXPECT_EQ(sizeof(ProgramInfoHeader), bucket->size()); | 75 EXPECT_EQ(sizeof(ProgramInfoHeader), bucket->size()); |
76 ProgramInfoHeader* info = | 76 ProgramInfoHeader* info = |
77 bucket->GetDataAs<ProgramInfoHeader*>(0, sizeof(ProgramInfoHeader)); | 77 bucket->GetDataAs<ProgramInfoHeader*>(0, sizeof(ProgramInfoHeader)); |
78 ASSERT_TRUE(info != 0); | 78 ASSERT_TRUE(info != 0); |
79 EXPECT_EQ(0u, info->link_status); | 79 EXPECT_EQ(0u, info->link_status); |
80 EXPECT_EQ(0u, info->num_attribs); | 80 EXPECT_EQ(0u, info->num_attribs); |
81 EXPECT_EQ(0u, info->num_uniforms); | 81 EXPECT_EQ(0u, info->num_uniforms); |
82 } | 82 } |
83 | 83 |
| 84 TEST_P(GLES2DecoderWithShaderTest, GetUniformBlocksCHROMIUMValidArgs) { |
| 85 const uint32 kBucketId = 123; |
| 86 GetUniformBlocksCHROMIUM cmd; |
| 87 cmd.Init(client_program_id_, kBucketId); |
| 88 EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _)) |
| 89 .WillOnce(SetArgPointee<2>(GL_TRUE)) |
| 90 .RetiresOnSaturation(); |
| 91 EXPECT_CALL(*gl_, |
| 92 GetProgramiv(kServiceProgramId, GL_ACTIVE_UNIFORM_BLOCKS, _)) |
| 93 .WillOnce(SetArgPointee<2>(0)) |
| 94 .RetiresOnSaturation(); |
| 95 decoder_->set_unsafe_es3_apis_enabled(true); |
| 96 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 97 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
| 98 EXPECT_EQ(sizeof(UniformBlocksHeader), bucket->size()); |
| 99 UniformBlocksHeader* header = |
| 100 bucket->GetDataAs<UniformBlocksHeader*>(0, sizeof(UniformBlocksHeader)); |
| 101 EXPECT_TRUE(header != NULL); |
| 102 EXPECT_EQ(0u, header->num_uniform_blocks); |
| 103 decoder_->set_unsafe_es3_apis_enabled(false); |
| 104 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
| 105 } |
| 106 |
| 107 TEST_P(GLES2DecoderWithShaderTest, GetUniformBlocksCHROMIUMInvalidArgs) { |
| 108 const uint32 kBucketId = 123; |
| 109 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
| 110 EXPECT_TRUE(bucket == NULL); |
| 111 GetUniformBlocksCHROMIUM cmd; |
| 112 cmd.Init(kInvalidClientId, kBucketId); |
| 113 decoder_->set_unsafe_es3_apis_enabled(true); |
| 114 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 115 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 116 bucket = decoder_->GetBucket(kBucketId); |
| 117 ASSERT_TRUE(bucket != NULL); |
| 118 EXPECT_EQ(sizeof(UniformBlocksHeader), bucket->size()); |
| 119 UniformBlocksHeader* header = |
| 120 bucket->GetDataAs<UniformBlocksHeader*>(0, sizeof(UniformBlocksHeader)); |
| 121 ASSERT_TRUE(header != NULL); |
| 122 EXPECT_EQ(0u, header->num_uniform_blocks); |
| 123 } |
| 124 |
84 TEST_P(GLES2DecoderWithShaderTest, GetUniformivSucceeds) { | 125 TEST_P(GLES2DecoderWithShaderTest, GetUniformivSucceeds) { |
85 GetUniformiv::Result* result = | 126 GetUniformiv::Result* result = |
86 static_cast<GetUniformiv::Result*>(shared_memory_address_); | 127 static_cast<GetUniformiv::Result*>(shared_memory_address_); |
87 result->size = 0; | 128 result->size = 0; |
88 GetUniformiv cmd; | 129 GetUniformiv cmd; |
89 cmd.Init(client_program_id_, | 130 cmd.Init(client_program_id_, |
90 kUniform2FakeLocation, | 131 kUniform2FakeLocation, |
91 kSharedMemoryId, | 132 kSharedMemoryId, |
92 kSharedMemoryOffset); | 133 kSharedMemoryOffset); |
93 EXPECT_CALL(*gl_, GetUniformiv(kServiceProgramId, kUniform2RealLocation, _)) | 134 EXPECT_CALL(*gl_, GetUniformiv(kServiceProgramId, kUniform2RealLocation, _)) |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 shared_memory_offset_); | 564 shared_memory_offset_); |
524 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 565 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
525 cmd.Init(client_program_id_, | 566 cmd.Init(client_program_id_, |
526 kUniformIndex, | 567 kUniformIndex, |
527 kBucketId, | 568 kBucketId, |
528 shared_memory_id_, | 569 shared_memory_id_, |
529 kInvalidSharedMemoryOffset); | 570 kInvalidSharedMemoryOffset); |
530 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 571 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
531 } | 572 } |
532 | 573 |
| 574 TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBlockNameSucceeds) { |
| 575 const uint32 kBucketId = 123; |
| 576 GetActiveUniformBlockName cmd; |
| 577 typedef GetActiveUniformBlockName::Result Result; |
| 578 Result* result = static_cast<Result*>(shared_memory_address_); |
| 579 *result = 0; |
| 580 cmd.Init(client_program_id_, |
| 581 0, |
| 582 kBucketId, |
| 583 shared_memory_id_, |
| 584 shared_memory_offset_); |
| 585 EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _)) |
| 586 .WillOnce(SetArgPointee<2>(GL_TRUE)) |
| 587 .RetiresOnSaturation(); |
| 588 const char kName[] = "HolyCow"; |
| 589 const GLsizei kMaxLength = strlen(kName) + 1; |
| 590 EXPECT_CALL(*gl_, |
| 591 GetProgramiv(kServiceProgramId, |
| 592 GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, _)) |
| 593 .WillOnce(SetArgPointee<2>(kMaxLength)) |
| 594 .RetiresOnSaturation(); |
| 595 EXPECT_CALL(*gl_, |
| 596 GetActiveUniformBlockName(kServiceProgramId, 0, _, _, _)) |
| 597 .WillOnce(DoAll(SetArgPointee<3>(strlen(kName)), |
| 598 SetArrayArgument<4>(kName, kName + strlen(kName) + 1))) |
| 599 .RetiresOnSaturation(); |
| 600 decoder_->set_unsafe_es3_apis_enabled(true); |
| 601 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 602 EXPECT_NE(0, *result); |
| 603 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 604 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); |
| 605 ASSERT_TRUE(bucket != NULL); |
| 606 EXPECT_EQ(0, |
| 607 memcmp(bucket->GetData(0, bucket->size()), kName, bucket->size())); |
| 608 decoder_->set_unsafe_es3_apis_enabled(false); |
| 609 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
| 610 } |
| 611 |
| 612 TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBlockNameUnlinkedProgram) { |
| 613 const uint32 kBucketId = 123; |
| 614 GetActiveUniformBlockName cmd; |
| 615 typedef GetActiveUniformBlockName::Result Result; |
| 616 Result* result = static_cast<Result*>(shared_memory_address_); |
| 617 *result = 0; |
| 618 cmd.Init(client_program_id_, |
| 619 0, |
| 620 kBucketId, |
| 621 shared_memory_id_, |
| 622 shared_memory_offset_); |
| 623 EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _)) |
| 624 .WillOnce(SetArgPointee<2>(GL_FALSE)) |
| 625 .RetiresOnSaturation(); |
| 626 decoder_->set_unsafe_es3_apis_enabled(true); |
| 627 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 628 EXPECT_EQ(0, *result); |
| 629 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 630 } |
| 631 |
| 632 TEST_P(GLES2DecoderWithShaderTest, |
| 633 GetActiveUniformBlockNameResultNotInitFails) { |
| 634 const uint32 kBucketId = 123; |
| 635 GetActiveUniformBlockName cmd; |
| 636 typedef GetActiveUniformBlockName::Result Result; |
| 637 Result* result = static_cast<Result*>(shared_memory_address_); |
| 638 *result = 1; |
| 639 cmd.Init(client_program_id_, |
| 640 0, |
| 641 kBucketId, |
| 642 shared_memory_id_, |
| 643 shared_memory_offset_); |
| 644 decoder_->set_unsafe_es3_apis_enabled(true); |
| 645 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 646 } |
| 647 |
| 648 TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBlockNameBadProgramFails) { |
| 649 const uint32 kBucketId = 123; |
| 650 GetActiveUniformBlockName cmd; |
| 651 typedef GetActiveUniformBlockName::Result Result; |
| 652 Result* result = static_cast<Result*>(shared_memory_address_); |
| 653 *result = 0; |
| 654 cmd.Init(kInvalidClientId, |
| 655 0, |
| 656 kBucketId, |
| 657 shared_memory_id_, |
| 658 shared_memory_offset_); |
| 659 decoder_->set_unsafe_es3_apis_enabled(true); |
| 660 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 661 EXPECT_EQ(0, *result); |
| 662 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 663 } |
| 664 |
| 665 TEST_P(GLES2DecoderWithShaderTest, |
| 666 GetActiveUniformBlockNameBadSharedMemoryFails) { |
| 667 const uint32 kBucketId = 123; |
| 668 GetActiveUniformBlockName cmd; |
| 669 decoder_->set_unsafe_es3_apis_enabled(true); |
| 670 cmd.Init(client_program_id_, |
| 671 0, |
| 672 kBucketId, |
| 673 kInvalidSharedMemoryId, |
| 674 shared_memory_offset_); |
| 675 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 676 cmd.Init(client_program_id_, |
| 677 0, |
| 678 kBucketId, |
| 679 shared_memory_id_, |
| 680 kInvalidSharedMemoryOffset); |
| 681 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 682 } |
| 683 |
533 TEST_P(GLES2DecoderWithShaderTest, GetActiveAttribSucceeds) { | 684 TEST_P(GLES2DecoderWithShaderTest, GetActiveAttribSucceeds) { |
534 const GLuint kAttribIndex = 1; | 685 const GLuint kAttribIndex = 1; |
535 const uint32 kBucketId = 123; | 686 const uint32 kBucketId = 123; |
536 GetActiveAttrib cmd; | 687 GetActiveAttrib cmd; |
537 typedef GetActiveAttrib::Result Result; | 688 typedef GetActiveAttrib::Result Result; |
538 Result* result = static_cast<Result*>(shared_memory_address_); | 689 Result* result = static_cast<Result*>(shared_memory_address_); |
539 result->success = 0; | 690 result->success = 0; |
540 cmd.Init(client_program_id_, | 691 cmd.Init(client_program_id_, |
541 kAttribIndex, | 692 kAttribIndex, |
542 kBucketId, | 693 kBucketId, |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
920 kInvalidSharedMemoryId, | 1071 kInvalidSharedMemoryId, |
921 kSharedMemoryOffset); | 1072 kSharedMemoryOffset); |
922 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 1073 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
923 cmd.Init(client_program_id_, | 1074 cmd.Init(client_program_id_, |
924 kBucketId, | 1075 kBucketId, |
925 kSharedMemoryId, | 1076 kSharedMemoryId, |
926 kInvalidSharedMemoryOffset); | 1077 kInvalidSharedMemoryOffset); |
927 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 1078 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
928 } | 1079 } |
929 | 1080 |
| 1081 TEST_P(GLES2DecoderWithShaderTest, GetUniformBlockIndex) { |
| 1082 const uint32 kBucketId = 123; |
| 1083 const GLuint kIndex = 10; |
| 1084 const char* kName = "color"; |
| 1085 typedef GetUniformBlockIndex::Result Result; |
| 1086 Result* result = GetSharedMemoryAs<Result*>(); |
| 1087 SetBucketAsCString(kBucketId, kName); |
| 1088 *result = GL_INVALID_INDEX; |
| 1089 GetUniformBlockIndex cmd; |
| 1090 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1091 EXPECT_CALL(*gl_, GetUniformBlockIndex(kServiceProgramId, StrEq(kName))) |
| 1092 .WillOnce(Return(kIndex)) |
| 1093 .RetiresOnSaturation(); |
| 1094 decoder_->set_unsafe_es3_apis_enabled(true); |
| 1095 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1096 EXPECT_EQ(kIndex, *result); |
| 1097 decoder_->set_unsafe_es3_apis_enabled(false); |
| 1098 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
| 1099 } |
| 1100 |
| 1101 TEST_P(GLES2DecoderWithShaderTest, GetUniformBlockIndexInvalidArgs) { |
| 1102 const uint32 kBucketId = 123; |
| 1103 typedef GetUniformBlockIndex::Result Result; |
| 1104 Result* result = GetSharedMemoryAs<Result*>(); |
| 1105 *result = GL_INVALID_INDEX; |
| 1106 GetUniformBlockIndex cmd; |
| 1107 decoder_->set_unsafe_es3_apis_enabled(true); |
| 1108 // Check no bucket |
| 1109 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1110 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1111 EXPECT_EQ(GL_INVALID_INDEX, *result); |
| 1112 // Check bad program id. |
| 1113 const char* kName = "color"; |
| 1114 SetBucketAsCString(kBucketId, kName); |
| 1115 cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1116 *result = GL_INVALID_INDEX; |
| 1117 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1118 EXPECT_EQ(GL_INVALID_INDEX, *result); |
| 1119 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1120 // Check bad memory |
| 1121 cmd.Init(client_program_id_, |
| 1122 kBucketId, |
| 1123 kInvalidSharedMemoryId, |
| 1124 kSharedMemoryOffset); |
| 1125 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1126 cmd.Init(client_program_id_, |
| 1127 kBucketId, |
| 1128 kSharedMemoryId, |
| 1129 kInvalidSharedMemoryOffset); |
| 1130 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1131 } |
| 1132 |
930 TEST_P(GLES2DecoderWithShaderTest, GetUniformLocation) { | 1133 TEST_P(GLES2DecoderWithShaderTest, GetUniformLocation) { |
931 const uint32 kBucketId = 123; | 1134 const uint32 kBucketId = 123; |
932 const char* kNonExistentName = "foobar"; | 1135 const char* kNonExistentName = "foobar"; |
933 typedef GetUniformLocation::Result Result; | 1136 typedef GetUniformLocation::Result Result; |
934 Result* result = GetSharedMemoryAs<Result*>(); | 1137 Result* result = GetSharedMemoryAs<Result*>(); |
935 SetBucketAsCString(kBucketId, kUniform2Name); | 1138 SetBucketAsCString(kBucketId, kUniform2Name); |
936 *result = -1; | 1139 *result = -1; |
937 GetUniformLocation cmd; | 1140 GetUniformLocation cmd; |
938 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); | 1141 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
939 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 1142 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1081 } | 1284 } |
1082 | 1285 |
1083 // TODO(gman): DeleteProgram | 1286 // TODO(gman): DeleteProgram |
1084 | 1287 |
1085 // TODO(gman): UseProgram | 1288 // TODO(gman): UseProgram |
1086 | 1289 |
1087 // TODO(gman): DeleteShader | 1290 // TODO(gman): DeleteShader |
1088 | 1291 |
1089 } // namespace gles2 | 1292 } // namespace gles2 |
1090 } // namespace gpu | 1293 } // namespace gpu |
OLD | NEW |