| 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 673 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 cmd.Init(kInvalidClientId); | 684 cmd.Init(kInvalidClientId); |
| 685 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 685 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 686 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 686 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 687 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS | 687 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 688 cmd.Init(client_program_id_); | 688 cmd.Init(client_program_id_); |
| 689 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 689 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 690 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 690 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 691 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS | 691 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 692 } | 692 } |
| 693 | 693 |
| 694 TEST_P(GLES2DecoderTest, ShaderSourceAndGetShaderSourceValidArgs) { | |
| 695 const uint32 kBucketId = 123; | |
| 696 const char kSource[] = "hello"; | |
| 697 const uint32 kSourceSize = sizeof(kSource) - 1; | |
| 698 memcpy(shared_memory_address_, kSource, kSourceSize); | |
| 699 ShaderSource cmd; | |
| 700 cmd.Init( | |
| 701 client_shader_id_, kSharedMemoryId, kSharedMemoryOffset, kSourceSize); | |
| 702 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 703 memset(shared_memory_address_, 0, kSourceSize); | |
| 704 GetShaderSource get_cmd; | |
| 705 get_cmd.Init(client_shader_id_, kBucketId); | |
| 706 EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); | |
| 707 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); | |
| 708 ASSERT_TRUE(bucket != NULL); | |
| 709 EXPECT_EQ(kSourceSize + 1, bucket->size()); | |
| 710 EXPECT_EQ( | |
| 711 0, memcmp(bucket->GetData(0, bucket->size()), kSource, bucket->size())); | |
| 712 } | |
| 713 | |
| 714 TEST_P(GLES2DecoderTest, ShaderSourceInvalidArgs) { | |
| 715 const char kSource[] = "hello"; | |
| 716 const uint32 kSourceSize = sizeof(kSource) - 1; | |
| 717 memcpy(shared_memory_address_, kSource, kSourceSize); | |
| 718 ShaderSource cmd; | |
| 719 cmd.Init(kInvalidClientId, kSharedMemoryId, kSharedMemoryOffset, kSourceSize); | |
| 720 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 721 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
| 722 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
| 723 cmd.Init( | |
| 724 client_program_id_, kSharedMemoryId, kSharedMemoryOffset, kSourceSize); | |
| 725 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 726 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
| 727 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
| 728 cmd.Init(client_shader_id_, | |
| 729 kInvalidSharedMemoryId, | |
| 730 kSharedMemoryOffset, | |
| 731 kSourceSize); | |
| 732 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 733 cmd.Init(client_shader_id_, | |
| 734 kSharedMemoryId, | |
| 735 kInvalidSharedMemoryOffset, | |
| 736 kSourceSize); | |
| 737 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 738 cmd.Init(client_shader_id_, | |
| 739 kSharedMemoryId, | |
| 740 kSharedMemoryOffset, | |
| 741 kSharedBufferSize); | |
| 742 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 743 } | |
| 744 | |
| 745 TEST_P(GLES2DecoderTest, ShaderSourceBucketAndGetShaderSourceValidArgs) { | 694 TEST_P(GLES2DecoderTest, ShaderSourceBucketAndGetShaderSourceValidArgs) { |
| 746 const uint32 kInBucketId = 123; | 695 const uint32 kInBucketId = 123; |
| 747 const uint32 kOutBucketId = 125; | 696 const uint32 kOutBucketId = 125; |
| 748 const char kSource[] = "hello"; | 697 const char kSource[] = "hello"; |
| 749 const uint32 kSourceSize = sizeof(kSource) - 1; | 698 const uint32 kSourceSize = sizeof(kSource) - 1; |
| 750 SetBucketAsCString(kInBucketId, kSource); | 699 SetBucketAsCString(kInBucketId, kSource); |
| 751 ShaderSourceBucket cmd; | 700 ShaderSourceBucket cmd; |
| 752 cmd.Init(client_shader_id_, kInBucketId); | 701 cmd.Init(client_shader_id_, kInBucketId); |
| 753 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 702 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 754 ClearSharedMemory(); | 703 ClearSharedMemory(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 769 memcpy(shared_memory_address_, kSource, kSourceSize); | 718 memcpy(shared_memory_address_, kSource, kSourceSize); |
| 770 ShaderSourceBucket cmd; | 719 ShaderSourceBucket cmd; |
| 771 // Test no bucket. | 720 // Test no bucket. |
| 772 cmd.Init(client_texture_id_, kBucketId); | 721 cmd.Init(client_texture_id_, kBucketId); |
| 773 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 722 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 774 // Test invalid client. | 723 // Test invalid client. |
| 775 SetBucketAsCString(kBucketId, kSource); | 724 SetBucketAsCString(kBucketId, kSource); |
| 776 cmd.Init(kInvalidClientId, kBucketId); | 725 cmd.Init(kInvalidClientId, kBucketId); |
| 777 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 726 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 778 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 727 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 728 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 729 SetBucketAsCString(kBucketId, kSource); |
| 730 cmd.Init( |
| 731 client_program_id_, kBucketId); |
| 732 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 733 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 734 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS |
| 779 } | 735 } |
| 780 | 736 |
| 781 TEST_P(GLES2DecoderTest, ShaderSourceStripComments) { | 737 TEST_P(GLES2DecoderTest, ShaderSourceStripComments) { |
| 782 const uint32 kInBucketId = 123; | 738 const uint32 kInBucketId = 123; |
| 783 const char kSource[] = "hello/*te\ast*/world//a\ab"; | 739 const char kSource[] = "hello/*te\ast*/world//a\ab"; |
| 784 SetBucketAsCString(kInBucketId, kSource); | 740 SetBucketAsCString(kInBucketId, kSource); |
| 785 ShaderSourceBucket cmd; | 741 ShaderSourceBucket cmd; |
| 786 cmd.Init(client_shader_id_, kInBucketId); | 742 cmd.Init(client_shader_id_, kInBucketId); |
| 787 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 743 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 788 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 744 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 | 794 |
| 839 TEST_P(GLES2DecoderWithShaderTest, Uniform1ivSamplerIsLimited) { | 795 TEST_P(GLES2DecoderWithShaderTest, Uniform1ivSamplerIsLimited) { |
| 840 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); | 796 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); |
| 841 Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); | 797 Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); |
| 842 GLint temp[] = {kNumTextureUnits}; | 798 GLint temp[] = {kNumTextureUnits}; |
| 843 cmd.Init(kUniform1FakeLocation, 1, &temp[0]); | 799 cmd.Init(kUniform1FakeLocation, 1, &temp[0]); |
| 844 EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); | 800 EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); |
| 845 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 801 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 846 } | 802 } |
| 847 | 803 |
| 848 TEST_P(GLES2DecoderTest, BindAttribLocation) { | |
| 849 const GLint kLocation = 2; | |
| 850 const char* kName = "testing"; | |
| 851 const uint32 kNameSize = strlen(kName); | |
| 852 EXPECT_CALL(*gl_, | |
| 853 BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) | |
| 854 .Times(1); | |
| 855 memcpy(shared_memory_address_, kName, kNameSize); | |
| 856 BindAttribLocation cmd; | |
| 857 cmd.Init(client_program_id_, | |
| 858 kLocation, | |
| 859 kSharedMemoryId, | |
| 860 kSharedMemoryOffset, | |
| 861 kNameSize); | |
| 862 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 863 } | |
| 864 | |
| 865 TEST_P(GLES2DecoderTest, BindAttribLocationInvalidArgs) { | |
| 866 const GLint kLocation = 2; | |
| 867 const char* kName = "testing"; | |
| 868 const char* kBadName = "test\aing"; | |
| 869 const uint32 kNameSize = strlen(kName); | |
| 870 const uint32 kBadNameSize = strlen(kBadName); | |
| 871 EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0); | |
| 872 memcpy(shared_memory_address_, kName, kNameSize); | |
| 873 BindAttribLocation cmd; | |
| 874 cmd.Init(kInvalidClientId, | |
| 875 kLocation, | |
| 876 kSharedMemoryId, | |
| 877 kSharedMemoryOffset, | |
| 878 kNameSize); | |
| 879 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 880 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
| 881 cmd.Init(client_program_id_, | |
| 882 kLocation, | |
| 883 kInvalidSharedMemoryId, | |
| 884 kSharedMemoryOffset, | |
| 885 kNameSize); | |
| 886 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 887 cmd.Init(client_program_id_, | |
| 888 kLocation, | |
| 889 kSharedMemoryId, | |
| 890 kInvalidSharedMemoryOffset, | |
| 891 kNameSize); | |
| 892 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 893 cmd.Init(client_program_id_, | |
| 894 kLocation, | |
| 895 kSharedMemoryId, | |
| 896 kSharedMemoryOffset, | |
| 897 kSharedBufferSize); | |
| 898 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 899 memcpy(shared_memory_address_, kBadName, kBadNameSize); | |
| 900 cmd.Init(client_program_id_, | |
| 901 kLocation, | |
| 902 kSharedMemoryId, | |
| 903 kSharedMemoryOffset, | |
| 904 kBadNameSize); | |
| 905 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 906 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
| 907 } | |
| 908 | |
| 909 TEST_P(GLES2DecoderTest, BindAttribLocationBucket) { | 804 TEST_P(GLES2DecoderTest, BindAttribLocationBucket) { |
| 910 const uint32 kBucketId = 123; | 805 const uint32 kBucketId = 123; |
| 911 const GLint kLocation = 2; | 806 const GLint kLocation = 2; |
| 912 const char* kName = "testing"; | 807 const char* kName = "testing"; |
| 913 EXPECT_CALL(*gl_, | 808 EXPECT_CALL(*gl_, |
| 914 BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) | 809 BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) |
| 915 .Times(1); | 810 .Times(1); |
| 916 SetBucketAsCString(kBucketId, kName); | 811 SetBucketAsCString(kBucketId, kName); |
| 917 BindAttribLocationBucket cmd; | 812 BindAttribLocationBucket cmd; |
| 918 cmd.Init(client_program_id_, kLocation, kBucketId); | 813 cmd.Init(client_program_id_, kLocation, kBucketId); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 933 cmd.Init(client_program_id_, kLocation, kBucketId); | 828 cmd.Init(client_program_id_, kLocation, kBucketId); |
| 934 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 829 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 935 // Check bad program id | 830 // Check bad program id |
| 936 SetBucketAsCString(kBucketId, kName); | 831 SetBucketAsCString(kBucketId, kName); |
| 937 cmd.Init(kInvalidClientId, kLocation, kBucketId); | 832 cmd.Init(kInvalidClientId, kLocation, kBucketId); |
| 938 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 833 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 939 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 834 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 940 } | 835 } |
| 941 | 836 |
| 942 TEST_P(GLES2DecoderWithShaderTest, GetAttribLocation) { | 837 TEST_P(GLES2DecoderWithShaderTest, GetAttribLocation) { |
| 943 const uint32 kNameSize = strlen(kAttrib2Name); | |
| 944 const char* kNonExistentName = "foobar"; | |
| 945 const uint32 kNonExistentNameSize = strlen(kNonExistentName); | |
| 946 typedef GetAttribLocation::Result Result; | |
| 947 Result* result = GetSharedMemoryAs<Result*>(); | |
| 948 *result = -1; | |
| 949 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); | |
| 950 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); | |
| 951 memcpy(name, kAttrib2Name, kNameSize); | |
| 952 GetAttribLocation cmd; | |
| 953 cmd.Init(client_program_id_, | |
| 954 kSharedMemoryId, | |
| 955 kNameOffset, | |
| 956 kSharedMemoryId, | |
| 957 kSharedMemoryOffset, | |
| 958 kNameSize); | |
| 959 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 960 EXPECT_EQ(kAttrib2Location, *result); | |
| 961 *result = -1; | |
| 962 memcpy(name, kNonExistentName, kNonExistentNameSize); | |
| 963 cmd.Init(client_program_id_, | |
| 964 kSharedMemoryId, | |
| 965 kNameOffset, | |
| 966 kSharedMemoryId, | |
| 967 kSharedMemoryOffset, | |
| 968 kNonExistentNameSize); | |
| 969 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 970 EXPECT_EQ(-1, *result); | |
| 971 } | |
| 972 | |
| 973 TEST_P(GLES2DecoderWithShaderTest, GetAttribLocationInvalidArgs) { | |
| 974 const uint32 kNameSize = strlen(kAttrib2Name); | |
| 975 const char* kBadName = "foo\abar"; | |
| 976 const uint32 kBadNameSize = strlen(kBadName); | |
| 977 typedef GetAttribLocation::Result Result; | |
| 978 Result* result = GetSharedMemoryAs<Result*>(); | |
| 979 *result = -1; | |
| 980 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); | |
| 981 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); | |
| 982 memcpy(name, kAttrib2Name, kNameSize); | |
| 983 GetAttribLocation cmd; | |
| 984 cmd.Init(kInvalidClientId, | |
| 985 kSharedMemoryId, | |
| 986 kNameOffset, | |
| 987 kSharedMemoryId, | |
| 988 kSharedMemoryOffset, | |
| 989 kNameSize); | |
| 990 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 991 EXPECT_EQ(-1, *result); | |
| 992 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
| 993 *result = -1; | |
| 994 cmd.Init(client_program_id_, | |
| 995 kInvalidSharedMemoryId, | |
| 996 kNameOffset, | |
| 997 kSharedMemoryId, | |
| 998 kSharedMemoryOffset, | |
| 999 kNameSize); | |
| 1000 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 1001 EXPECT_EQ(-1, *result); | |
| 1002 cmd.Init(client_program_id_, | |
| 1003 kSharedMemoryId, | |
| 1004 kInvalidSharedMemoryOffset, | |
| 1005 kSharedMemoryId, | |
| 1006 kSharedMemoryOffset, | |
| 1007 kNameSize); | |
| 1008 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 1009 EXPECT_EQ(-1, *result); | |
| 1010 cmd.Init(client_program_id_, | |
| 1011 kSharedMemoryId, | |
| 1012 kNameOffset, | |
| 1013 kInvalidSharedMemoryId, | |
| 1014 kSharedMemoryOffset, | |
| 1015 kNameSize); | |
| 1016 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 1017 EXPECT_EQ(-1, *result); | |
| 1018 cmd.Init(client_program_id_, | |
| 1019 kSharedMemoryId, | |
| 1020 kNameOffset, | |
| 1021 kSharedMemoryId, | |
| 1022 kInvalidSharedMemoryOffset, | |
| 1023 kNameSize); | |
| 1024 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 1025 EXPECT_EQ(-1, *result); | |
| 1026 cmd.Init(client_program_id_, | |
| 1027 kSharedMemoryId, | |
| 1028 kNameOffset, | |
| 1029 kSharedMemoryId, | |
| 1030 kSharedMemoryOffset, | |
| 1031 kSharedBufferSize); | |
| 1032 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 1033 EXPECT_EQ(-1, *result); | |
| 1034 memcpy(name, kBadName, kBadNameSize); | |
| 1035 cmd.Init(client_program_id_, | |
| 1036 kSharedMemoryId, | |
| 1037 kNameOffset, | |
| 1038 kSharedMemoryId, | |
| 1039 kSharedMemoryOffset, | |
| 1040 kBadNameSize); | |
| 1041 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 1042 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
| 1043 } | |
| 1044 | |
| 1045 TEST_P(GLES2DecoderWithShaderTest, GetAttribLocationBucket) { | |
| 1046 const uint32 kBucketId = 123; | 838 const uint32 kBucketId = 123; |
| 1047 const char* kNonExistentName = "foobar"; | 839 const char* kNonExistentName = "foobar"; |
| 1048 typedef GetAttribLocationBucket::Result Result; | 840 typedef GetAttribLocation::Result Result; |
| 1049 Result* result = GetSharedMemoryAs<Result*>(); | 841 Result* result = GetSharedMemoryAs<Result*>(); |
| 1050 SetBucketAsCString(kBucketId, kAttrib2Name); | 842 SetBucketAsCString(kBucketId, kAttrib2Name); |
| 1051 *result = -1; | 843 *result = -1; |
| 1052 GetAttribLocationBucket cmd; | 844 GetAttribLocation cmd; |
| 1053 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); | 845 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1054 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 846 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1055 EXPECT_EQ(kAttrib2Location, *result); | 847 EXPECT_EQ(kAttrib2Location, *result); |
| 1056 SetBucketAsCString(kBucketId, kNonExistentName); | 848 SetBucketAsCString(kBucketId, kNonExistentName); |
| 1057 *result = -1; | 849 *result = -1; |
| 1058 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); | 850 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1059 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 851 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1060 EXPECT_EQ(-1, *result); | 852 EXPECT_EQ(-1, *result); |
| 1061 } | 853 } |
| 1062 | 854 |
| 1063 TEST_P(GLES2DecoderWithShaderTest, GetAttribLocationBucketInvalidArgs) { | 855 TEST_P(GLES2DecoderWithShaderTest, GetAttribLocationInvalidArgs) { |
| 1064 const uint32 kBucketId = 123; | 856 const uint32 kBucketId = 123; |
| 1065 typedef GetAttribLocationBucket::Result Result; | 857 typedef GetAttribLocation::Result Result; |
| 1066 Result* result = GetSharedMemoryAs<Result*>(); | 858 Result* result = GetSharedMemoryAs<Result*>(); |
| 1067 *result = -1; | 859 *result = -1; |
| 1068 GetAttribLocationBucket cmd; | 860 GetAttribLocation cmd; |
| 1069 // Check no bucket | 861 // Check no bucket |
| 1070 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); | 862 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1071 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 863 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1072 EXPECT_EQ(-1, *result); | 864 EXPECT_EQ(-1, *result); |
| 1073 // Check bad program id. | 865 // Check bad program id. |
| 1074 SetBucketAsCString(kBucketId, kAttrib2Name); | 866 SetBucketAsCString(kBucketId, kAttrib2Name); |
| 1075 cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); | 867 cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1076 *result = -1; | 868 *result = -1; |
| 1077 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 869 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1078 EXPECT_EQ(-1, *result); | 870 EXPECT_EQ(-1, *result); |
| 1079 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 871 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1080 // Check bad memory | 872 // Check bad memory |
| 1081 cmd.Init(client_program_id_, | 873 cmd.Init(client_program_id_, |
| 1082 kBucketId, | 874 kBucketId, |
| 1083 kInvalidSharedMemoryId, | 875 kInvalidSharedMemoryId, |
| 1084 kSharedMemoryOffset); | 876 kSharedMemoryOffset); |
| 1085 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 877 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1086 cmd.Init(client_program_id_, | 878 cmd.Init(client_program_id_, |
| 1087 kBucketId, | 879 kBucketId, |
| 1088 kSharedMemoryId, | 880 kSharedMemoryId, |
| 1089 kInvalidSharedMemoryOffset); | 881 kInvalidSharedMemoryOffset); |
| 1090 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 882 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1091 } | 883 } |
| 1092 | 884 |
| 1093 TEST_P(GLES2DecoderWithShaderTest, GetUniformLocation) { | 885 TEST_P(GLES2DecoderWithShaderTest, GetUniformLocation) { |
| 1094 const uint32 kNameSize = strlen(kUniform2Name); | |
| 1095 const char* kNonExistentName = "foobar"; | |
| 1096 const uint32 kNonExistentNameSize = strlen(kNonExistentName); | |
| 1097 typedef GetUniformLocation::Result Result; | |
| 1098 Result* result = GetSharedMemoryAs<Result*>(); | |
| 1099 *result = -1; | |
| 1100 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); | |
| 1101 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); | |
| 1102 memcpy(name, kUniform2Name, kNameSize); | |
| 1103 GetUniformLocation cmd; | |
| 1104 cmd.Init(client_program_id_, | |
| 1105 kSharedMemoryId, | |
| 1106 kNameOffset, | |
| 1107 kSharedMemoryId, | |
| 1108 kSharedMemoryOffset, | |
| 1109 kNameSize); | |
| 1110 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 1111 EXPECT_EQ(kUniform2FakeLocation, *result); | |
| 1112 memcpy(name, kNonExistentName, kNonExistentNameSize); | |
| 1113 *result = -1; | |
| 1114 cmd.Init(client_program_id_, | |
| 1115 kSharedMemoryId, | |
| 1116 kNameOffset, | |
| 1117 kSharedMemoryId, | |
| 1118 kSharedMemoryOffset, | |
| 1119 kNonExistentNameSize); | |
| 1120 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 1121 EXPECT_EQ(-1, *result); | |
| 1122 } | |
| 1123 | |
| 1124 TEST_P(GLES2DecoderWithShaderTest, GetUniformLocationInvalidArgs) { | |
| 1125 const uint32 kNameSize = strlen(kUniform2Name); | |
| 1126 const char* kBadName = "foo\abar"; | |
| 1127 const uint32 kBadNameSize = strlen(kBadName); | |
| 1128 typedef GetUniformLocation::Result Result; | |
| 1129 Result* result = GetSharedMemoryAs<Result*>(); | |
| 1130 *result = -1; | |
| 1131 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); | |
| 1132 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); | |
| 1133 memcpy(name, kUniform2Name, kNameSize); | |
| 1134 GetUniformLocation cmd; | |
| 1135 cmd.Init(kInvalidClientId, | |
| 1136 kSharedMemoryId, | |
| 1137 kNameOffset, | |
| 1138 kSharedMemoryId, | |
| 1139 kSharedMemoryOffset, | |
| 1140 kNameSize); | |
| 1141 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 1142 EXPECT_EQ(-1, *result); | |
| 1143 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
| 1144 *result = -1; | |
| 1145 cmd.Init(client_program_id_, | |
| 1146 kInvalidSharedMemoryId, | |
| 1147 kNameOffset, | |
| 1148 kSharedMemoryId, | |
| 1149 kSharedMemoryOffset, | |
| 1150 kNameSize); | |
| 1151 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 1152 EXPECT_EQ(-1, *result); | |
| 1153 cmd.Init(client_program_id_, | |
| 1154 kSharedMemoryId, | |
| 1155 kInvalidSharedMemoryOffset, | |
| 1156 kSharedMemoryId, | |
| 1157 kSharedMemoryOffset, | |
| 1158 kNameSize); | |
| 1159 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 1160 EXPECT_EQ(-1, *result); | |
| 1161 cmd.Init(client_program_id_, | |
| 1162 kSharedMemoryId, | |
| 1163 kNameOffset, | |
| 1164 kInvalidSharedMemoryId, | |
| 1165 kSharedMemoryOffset, | |
| 1166 kNameSize); | |
| 1167 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 1168 EXPECT_EQ(-1, *result); | |
| 1169 cmd.Init(client_program_id_, | |
| 1170 kSharedMemoryId, | |
| 1171 kNameOffset, | |
| 1172 kSharedMemoryId, | |
| 1173 kInvalidSharedMemoryOffset, | |
| 1174 kNameSize); | |
| 1175 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 1176 EXPECT_EQ(-1, *result); | |
| 1177 cmd.Init(client_program_id_, | |
| 1178 kSharedMemoryId, | |
| 1179 kNameOffset, | |
| 1180 kSharedMemoryId, | |
| 1181 kSharedMemoryOffset, | |
| 1182 kSharedBufferSize); | |
| 1183 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
| 1184 EXPECT_EQ(-1, *result); | |
| 1185 memcpy(name, kBadName, kBadNameSize); | |
| 1186 cmd.Init(client_program_id_, | |
| 1187 kSharedMemoryId, | |
| 1188 kNameOffset, | |
| 1189 kSharedMemoryId, | |
| 1190 kSharedMemoryOffset, | |
| 1191 kBadNameSize); | |
| 1192 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
| 1193 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
| 1194 } | |
| 1195 | |
| 1196 TEST_P(GLES2DecoderWithShaderTest, GetUniformLocationBucket) { | |
| 1197 const uint32 kBucketId = 123; | 886 const uint32 kBucketId = 123; |
| 1198 const char* kNonExistentName = "foobar"; | 887 const char* kNonExistentName = "foobar"; |
| 1199 typedef GetUniformLocationBucket::Result Result; | 888 typedef GetUniformLocation::Result Result; |
| 1200 Result* result = GetSharedMemoryAs<Result*>(); | 889 Result* result = GetSharedMemoryAs<Result*>(); |
| 1201 SetBucketAsCString(kBucketId, kUniform2Name); | 890 SetBucketAsCString(kBucketId, kUniform2Name); |
| 1202 *result = -1; | 891 *result = -1; |
| 1203 GetUniformLocationBucket cmd; | 892 GetUniformLocation cmd; |
| 1204 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); | 893 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1205 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 894 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1206 EXPECT_EQ(kUniform2FakeLocation, *result); | 895 EXPECT_EQ(kUniform2FakeLocation, *result); |
| 1207 SetBucketAsCString(kBucketId, kNonExistentName); | 896 SetBucketAsCString(kBucketId, kNonExistentName); |
| 1208 *result = -1; | 897 *result = -1; |
| 1209 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); | 898 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1210 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 899 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1211 EXPECT_EQ(-1, *result); | 900 EXPECT_EQ(-1, *result); |
| 1212 } | 901 } |
| 1213 | 902 |
| 1214 TEST_P(GLES2DecoderWithShaderTest, GetUniformLocationBucketInvalidArgs) { | 903 TEST_P(GLES2DecoderWithShaderTest, GetUniformLocationInvalidArgs) { |
| 1215 const uint32 kBucketId = 123; | 904 const uint32 kBucketId = 123; |
| 1216 typedef GetUniformLocationBucket::Result Result; | 905 typedef GetUniformLocation::Result Result; |
| 1217 Result* result = GetSharedMemoryAs<Result*>(); | 906 Result* result = GetSharedMemoryAs<Result*>(); |
| 1218 *result = -1; | 907 *result = -1; |
| 1219 GetUniformLocationBucket cmd; | 908 GetUniformLocation cmd; |
| 1220 // Check no bucket | 909 // Check no bucket |
| 1221 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); | 910 cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1222 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 911 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1223 EXPECT_EQ(-1, *result); | 912 EXPECT_EQ(-1, *result); |
| 1224 // Check bad program id. | 913 // Check bad program id. |
| 1225 SetBucketAsCString(kBucketId, kUniform2Name); | 914 SetBucketAsCString(kBucketId, kUniform2Name); |
| 1226 cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); | 915 cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); |
| 1227 *result = -1; | 916 *result = -1; |
| 1228 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 917 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1229 EXPECT_EQ(-1, *result); | 918 EXPECT_EQ(-1, *result); |
| 1230 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 919 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1231 // Check bad memory | 920 // Check bad memory |
| 1232 cmd.Init(client_program_id_, | 921 cmd.Init(client_program_id_, |
| 1233 kBucketId, | 922 kBucketId, |
| 1234 kInvalidSharedMemoryId, | 923 kInvalidSharedMemoryId, |
| 1235 kSharedMemoryOffset); | 924 kSharedMemoryOffset); |
| 1236 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 925 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1237 cmd.Init(client_program_id_, | 926 cmd.Init(client_program_id_, |
| 1238 kBucketId, | 927 kBucketId, |
| 1239 kSharedMemoryId, | 928 kSharedMemoryId, |
| 1240 kInvalidSharedMemoryOffset); | 929 kInvalidSharedMemoryOffset); |
| 1241 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 930 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 1242 } | 931 } |
| 1243 | 932 |
| 1244 TEST_P(GLES2DecoderWithShaderTest, BindUniformLocationCHROMIUM) { | 933 TEST_P(GLES2DecoderWithShaderTest, BindUniformLocationCHROMIUMBucket) { |
| 934 const uint32 kBucketId = 123; |
| 1245 const GLint kLocation = 2; | 935 const GLint kLocation = 2; |
| 1246 const char* kName = "testing"; | 936 const char* kName = "testing"; |
| 1247 const uint32 kNameSize = strlen(kName); | |
| 1248 const char* kBadName1 = "gl_testing"; | 937 const char* kBadName1 = "gl_testing"; |
| 1249 const uint32 kBadName1Size = strlen(kBadName1); | |
| 1250 const char* kBadName2 = "testing[1]"; | 938 const char* kBadName2 = "testing[1]"; |
| 1251 const uint32 kBadName2Size = strlen(kBadName2); | 939 |
| 1252 memcpy(shared_memory_address_, kName, kNameSize); | 940 SetBucketAsCString(kBucketId, kName); |
| 1253 BindUniformLocationCHROMIUM cmd; | 941 BindUniformLocationCHROMIUMBucket cmd; |
| 1254 cmd.Init(client_program_id_, | 942 cmd.Init(client_program_id_, |
| 1255 kLocation, | 943 kLocation, |
| 1256 kSharedMemoryId, | 944 kBucketId); |
| 1257 kSharedMemoryOffset, | |
| 1258 kNameSize); | |
| 1259 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 945 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1260 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 946 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 1261 // check negative location | 947 // check negative location |
| 1262 memcpy(shared_memory_address_, kName, kNameSize); | 948 SetBucketAsCString(kBucketId, kName); |
| 1263 cmd.Init( | 949 cmd.Init(client_program_id_, -1, kBucketId); |
| 1264 client_program_id_, -1, kSharedMemoryId, kSharedMemoryOffset, kNameSize); | |
| 1265 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 950 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1266 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 951 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1267 // check highest location | 952 // check highest location |
| 1268 memcpy(shared_memory_address_, kName, kNameSize); | 953 SetBucketAsCString(kBucketId, kName); |
| 1269 GLint kMaxLocation = | 954 GLint kMaxLocation = |
| 1270 (kMaxFragmentUniformVectors + kMaxVertexUniformVectors) * 4 - 1; | 955 (kMaxFragmentUniformVectors + kMaxVertexUniformVectors) * 4 - 1; |
| 1271 cmd.Init(client_program_id_, | 956 cmd.Init(client_program_id_, |
| 1272 kMaxLocation, | 957 kMaxLocation, |
| 1273 kSharedMemoryId, | 958 kBucketId); |
| 1274 kSharedMemoryOffset, | |
| 1275 kNameSize); | |
| 1276 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 959 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1277 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 960 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 1278 // check too high location | 961 // check too high location |
| 1279 memcpy(shared_memory_address_, kName, kNameSize); | 962 SetBucketAsCString(kBucketId, kName); |
| 1280 cmd.Init(client_program_id_, | 963 cmd.Init(client_program_id_, |
| 1281 kMaxLocation + 1, | 964 kMaxLocation + 1, |
| 1282 kSharedMemoryId, | 965 kBucketId); |
| 1283 kSharedMemoryOffset, | |
| 1284 kNameSize); | |
| 1285 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 966 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1286 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 967 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1287 // check bad name "gl_..." | 968 // check bad name "gl_..." |
| 1288 memcpy(shared_memory_address_, kBadName1, kBadName1Size); | 969 SetBucketAsCString(kBucketId, kBadName1); |
| 1289 cmd.Init(client_program_id_, | 970 cmd.Init(client_program_id_, |
| 1290 kLocation, | 971 kLocation, |
| 1291 kSharedMemoryId, | 972 kBucketId); |
| 1292 kSharedMemoryOffset, | |
| 1293 kBadName1Size); | |
| 1294 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 973 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1295 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 974 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 1296 // check bad name "name[1]" non zero | 975 // check bad name "name[1]" non zero |
| 1297 memcpy(shared_memory_address_, kBadName2, kBadName2Size); | 976 SetBucketAsCString(kBucketId, kBadName2); |
| 1298 cmd.Init(client_program_id_, | 977 cmd.Init(client_program_id_, |
| 1299 kLocation, | 978 kLocation, |
| 1300 kSharedMemoryId, | 979 kBucketId); |
| 1301 kSharedMemoryOffset, | |
| 1302 kBadName2Size); | |
| 1303 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 980 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 1304 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 981 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 1305 } | 982 } |
| 1306 | 983 |
| 1307 TEST_P(GLES2DecoderManualInitTest, ClearUniformsBeforeFirstProgramUse) { | 984 TEST_P(GLES2DecoderManualInitTest, ClearUniformsBeforeFirstProgramUse) { |
| 1308 CommandLine command_line(0, NULL); | 985 CommandLine command_line(0, NULL); |
| 1309 command_line.AppendSwitchASCII( | 986 command_line.AppendSwitchASCII( |
| 1310 switches::kGpuDriverBugWorkarounds, | 987 switches::kGpuDriverBugWorkarounds, |
| 1311 base::IntToString(gpu::CLEAR_UNIFORMS_BEFORE_FIRST_PROGRAM_USE)); | 988 base::IntToString(gpu::CLEAR_UNIFORMS_BEFORE_FIRST_PROGRAM_USE)); |
| 1312 InitState init; | 989 InitState init; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1360 } | 1037 } |
| 1361 | 1038 |
| 1362 // TODO(gman): DeleteProgram | 1039 // TODO(gman): DeleteProgram |
| 1363 | 1040 |
| 1364 // TODO(gman): UseProgram | 1041 // TODO(gman): UseProgram |
| 1365 | 1042 |
| 1366 // TODO(gman): DeleteShader | 1043 // TODO(gman): DeleteShader |
| 1367 | 1044 |
| 1368 } // namespace gles2 | 1045 } // namespace gles2 |
| 1369 } // namespace gpu | 1046 } // namespace gpu |
| OLD | NEW |