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 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
704 GetShaderSource get_cmd; | 704 GetShaderSource get_cmd; |
705 get_cmd.Init(client_shader_id_, kOutBucketId); | 705 get_cmd.Init(client_shader_id_, kOutBucketId); |
706 EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); | 706 EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); |
707 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kOutBucketId); | 707 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kOutBucketId); |
708 ASSERT_TRUE(bucket != NULL); | 708 ASSERT_TRUE(bucket != NULL); |
709 EXPECT_EQ(sizeof(kSource0), bucket->size()); | 709 EXPECT_EQ(sizeof(kSource0), bucket->size()); |
710 EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), | 710 EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), |
711 kSource0, bucket->size())); | 711 kSource0, bucket->size())); |
712 } | 712 } |
713 | 713 |
714 TEST_P(GLES2DecoderTest, ShaderSourceBucketInvalidArgs) { | 714 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 715 TEST_P(GLES2DecoderTest, ShaderSourceBucketWithProgramId) { |
715 const uint32 kBucketId = 123; | 716 const uint32 kBucketId = 123; |
716 const char kSource0[] = "hello"; | 717 const char kSource0[] = "hello"; |
717 const char* kSource[] = { kSource0 }; | 718 const char* kSource[] = { kSource0 }; |
718 const char kValidStrEnd = 0; | 719 const char kValidStrEnd = 0; |
| 720 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); |
719 ShaderSourceBucket cmd; | 721 ShaderSourceBucket cmd; |
720 // Test no bucket. | 722 cmd.Init(client_program_id_, kBucketId); |
721 cmd.Init(client_shader_id_, kBucketId); | |
722 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
723 // Test invalid client. | |
724 SetBucketAsCStrings(kBucketId, 1, kSource, 1, kValidStrEnd); | |
725 cmd.Init(kInvalidClientId, kBucketId); | |
726 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
727 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
728 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
729 SetBucketAsCStrings(kBucketId, 1, kSource); | |
730 cmd.Init( | |
731 client_program_id_, kBucketId); | |
732 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 723 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
733 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 724 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 725 } |
734 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS | 726 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
735 } | |
736 | 727 |
737 TEST_P(GLES2DecoderTest, ShaderSourceStripComments) { | 728 TEST_P(GLES2DecoderTest, ShaderSourceStripComments) { |
738 const uint32 kInBucketId = 123; | 729 const uint32 kInBucketId = 123; |
739 const char kSource0[] = "hello/*te\ast*/world//a\ab"; | 730 const char kSource0[] = "hello/*te\ast*/world//a\ab"; |
740 const char* kSource[] = { kSource0 }; | 731 const char* kSource[] = { kSource0 }; |
741 const char kValidStrEnd = 0; | 732 const char kValidStrEnd = 0; |
742 SetBucketAsCStrings(kInBucketId, 1, kSource, 1, kValidStrEnd); | 733 SetBucketAsCStrings(kInBucketId, 1, kSource, 1, kValidStrEnd); |
743 ShaderSourceBucket cmd; | 734 ShaderSourceBucket cmd; |
744 cmd.Init(client_shader_id_, kInBucketId); | 735 cmd.Init(client_shader_id_, kInBucketId); |
745 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 736 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
746 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 737 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
747 } | 738 } |
748 | 739 |
749 TEST_P(GLES2DecoderTest, ShaderSourceInvalidHeader) { | |
750 const uint32 kInBucketId = 123; | |
751 const char kSource0[] = "hello"; | |
752 const char* kSource[] = { kSource0 }; | |
753 const char kValidStrEnd = 0; | |
754 const GLsizei kCount = 1; | |
755 const GLsizei kTests[] = { | |
756 kCount + 1, | |
757 0, | |
758 std::numeric_limits<GLsizei>::max(), | |
759 -1, | |
760 kCount | |
761 }; | |
762 size_t kTestCount = 5; | |
763 for (size_t ii = 0; ii < kTestCount; ++ii) { | |
764 SetBucketAsCStrings(kInBucketId, 1, kSource, kTests[ii], kValidStrEnd); | |
765 ShaderSourceBucket cmd; | |
766 cmd.Init(client_shader_id_, kInBucketId); | |
767 if (kTests[ii] == kCount) { | |
768 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
769 } else { | |
770 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); | |
771 } | |
772 } | |
773 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
774 } | |
775 | |
776 TEST_P(GLES2DecoderTest, ShaderSourceInvalidStringEnding) { | |
777 const uint32 kInBucketId = 123; | |
778 const char kSource0[] = "hello"; | |
779 const char* kSource[] = { kSource0 }; | |
780 const char kInvalidStrEnd = '*'; | |
781 SetBucketAsCStrings(kInBucketId, 1, kSource, 1, kInvalidStrEnd); | |
782 ShaderSourceBucket cmd; | |
783 cmd.Init(client_shader_id_, kInBucketId); | |
784 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); | |
785 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
786 } | |
787 | |
788 TEST_P(GLES2DecoderWithShaderTest, Uniform1iValidArgs) { | 740 TEST_P(GLES2DecoderWithShaderTest, Uniform1iValidArgs) { |
789 EXPECT_CALL(*gl_, Uniform1i(kUniform1RealLocation, 2)); | 741 EXPECT_CALL(*gl_, Uniform1i(kUniform1RealLocation, 2)); |
790 Uniform1i cmd; | 742 Uniform1i cmd; |
791 cmd.Init(kUniform1FakeLocation, 2); | 743 cmd.Init(kUniform1FakeLocation, 2); |
792 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 744 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
793 } | 745 } |
794 | 746 |
795 TEST_P(GLES2DecoderWithShaderTest, Uniform1ivImmediateValidArgs) { | 747 TEST_P(GLES2DecoderWithShaderTest, Uniform1ivImmediateValidArgs) { |
796 Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); | 748 Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); |
797 EXPECT_CALL(*gl_, | 749 EXPECT_CALL(*gl_, |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
916 kInvalidSharedMemoryId, | 868 kInvalidSharedMemoryId, |
917 kSharedMemoryOffset); | 869 kSharedMemoryOffset); |
918 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 870 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
919 cmd.Init(client_program_id_, | 871 cmd.Init(client_program_id_, |
920 kBucketId, | 872 kBucketId, |
921 kSharedMemoryId, | 873 kSharedMemoryId, |
922 kInvalidSharedMemoryOffset); | 874 kInvalidSharedMemoryOffset); |
923 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 875 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
924 } | 876 } |
925 | 877 |
| 878 TEST_P(GLES2DecoderWithShaderTest, GetFragDataLocation) { |
| 879 const uint32 kBucketId = 123; |
| 880 const GLint kLocation = 10; |
| 881 const char* kName = "color"; |
| 882 typedef GetFragDataLocation::Result Result; |
| 883 Result* result = GetSharedMemoryAs<Result*>(); |
| 884 SetBucketAsCString(kBucketId, kName); |
| 885 *result = -1; |
| 886 GetFragDataLocation cmd; |
| 887 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 888 EXPECT_CALL(*gl_, GetFragDataLocation(kServiceProgramId, StrEq(kName))) |
| 889 .WillOnce(Return(kLocation)) |
| 890 .RetiresOnSaturation(); |
| 891 decoder_->set_unsafe_es3_apis_enabled(true); |
| 892 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 893 EXPECT_EQ(kLocation, *result); |
| 894 decoder_->set_unsafe_es3_apis_enabled(false); |
| 895 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
| 896 } |
| 897 |
| 898 TEST_P(GLES2DecoderWithShaderTest, GetFragDataLocationInvalidArgs) { |
| 899 const uint32 kBucketId = 123; |
| 900 typedef GetFragDataLocation::Result Result; |
| 901 Result* result = GetSharedMemoryAs<Result*>(); |
| 902 *result = -1; |
| 903 GetFragDataLocation cmd; |
| 904 decoder_->set_unsafe_es3_apis_enabled(true); |
| 905 // Check no bucket |
| 906 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 907 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 908 EXPECT_EQ(-1, *result); |
| 909 // Check bad program id. |
| 910 const char* kName = "color"; |
| 911 SetBucketAsCString(kBucketId, kName); |
| 912 cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 913 *result = -1; |
| 914 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 915 EXPECT_EQ(-1, *result); |
| 916 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 917 // Check bad memory |
| 918 cmd.Init(client_program_id_, |
| 919 kBucketId, |
| 920 kInvalidSharedMemoryId, |
| 921 kSharedMemoryOffset); |
| 922 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 923 cmd.Init(client_program_id_, |
| 924 kBucketId, |
| 925 kSharedMemoryId, |
| 926 kInvalidSharedMemoryOffset); |
| 927 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 928 } |
| 929 |
926 TEST_P(GLES2DecoderWithShaderTest, GetUniformLocation) { | 930 TEST_P(GLES2DecoderWithShaderTest, GetUniformLocation) { |
927 const uint32 kBucketId = 123; | 931 const uint32 kBucketId = 123; |
928 const char* kNonExistentName = "foobar"; | 932 const char* kNonExistentName = "foobar"; |
929 typedef GetUniformLocation::Result Result; | 933 typedef GetUniformLocation::Result Result; |
930 Result* result = GetSharedMemoryAs<Result*>(); | 934 Result* result = GetSharedMemoryAs<Result*>(); |
931 SetBucketAsCString(kBucketId, kUniform2Name); | 935 SetBucketAsCString(kBucketId, kUniform2Name); |
932 *result = -1; | 936 *result = -1; |
933 GetUniformLocation cmd; | 937 GetUniformLocation cmd; |
934 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); | 938 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
935 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 939 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1078 } | 1082 } |
1079 | 1083 |
1080 // TODO(gman): DeleteProgram | 1084 // TODO(gman): DeleteProgram |
1081 | 1085 |
1082 // TODO(gman): UseProgram | 1086 // TODO(gman): UseProgram |
1083 | 1087 |
1084 // TODO(gman): DeleteShader | 1088 // TODO(gman): DeleteShader |
1085 | 1089 |
1086 } // namespace gles2 | 1090 } // namespace gles2 |
1087 } // namespace gpu | 1091 } // namespace gpu |
OLD | NEW |