| 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 |