Index: gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc |
index c0e23649fc29fc965553f229d965371d737a7b82..199117236f0cd6f380a9f13c21644d93c4038541 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc |
@@ -681,6 +681,175 @@ TEST_P(GLES2DecoderWithShaderTest, |
EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
} |
+TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBlockivSucceeds) { |
+ GetActiveUniformBlockiv cmd; |
+ typedef GetActiveUniformBlockiv::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ GLenum kPname[] { |
+ GL_UNIFORM_BLOCK_BINDING, |
+ GL_UNIFORM_BLOCK_DATA_SIZE, |
+ GL_UNIFORM_BLOCK_NAME_LENGTH, |
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, |
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, |
+ GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER, |
+ GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER, |
+ }; |
+ for (size_t ii = 0; ii < arraysize(kPname); ++ii) { |
+ result->SetNumResults(0); |
+ cmd.Init(client_program_id_, |
+ 0, |
+ kPname[ii], |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_CALL(*gl_, GetError()) |
+ .WillOnce(Return(GL_NO_ERROR)) |
+ .WillOnce(Return(GL_NO_ERROR)) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _)) |
+ .WillOnce(SetArgPointee<2>(GL_TRUE)) |
+ .RetiresOnSaturation(); |
+ if (kPname[ii] == GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES) { |
+ EXPECT_CALL(*gl_, GetError()) |
+ .WillOnce(Return(GL_NO_ERROR)) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*gl_, |
+ GetActiveUniformBlockiv(kServiceProgramId, 0, |
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, _)) |
+ .WillOnce(SetArgPointee<3>(1)) |
+ .RetiresOnSaturation(); |
+ } |
+ EXPECT_CALL(*gl_, |
+ GetActiveUniformBlockiv( |
+ kServiceProgramId, 0, kPname[ii], _)) |
+ .WillOnce(SetArgPointee<3>(1976)) |
+ .RetiresOnSaturation(); |
+ decoder_->set_unsafe_es3_apis_enabled(true); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(1, result->GetNumResults()); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+ EXPECT_EQ(1976, result->GetData()[0]); |
+ decoder_->set_unsafe_es3_apis_enabled(false); |
+ EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
+ } |
+} |
+ |
+TEST_P(GLES2DecoderWithShaderTest, |
+ GetActiveUniformBlockivSucceedsZeroUniforms) { |
+ GetActiveUniformBlockiv cmd; |
+ typedef GetActiveUniformBlockiv::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->SetNumResults(0); |
+ cmd.Init(client_program_id_, |
+ 0, |
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_CALL(*gl_, GetError()) |
+ .WillOnce(Return(GL_NO_ERROR)) |
+ .WillOnce(Return(GL_NO_ERROR)) |
+ .WillOnce(Return(GL_NO_ERROR)) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _)) |
+ .WillOnce(SetArgPointee<2>(GL_TRUE)) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*gl_, |
+ GetActiveUniformBlockiv( |
+ kServiceProgramId, 0, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, _)) |
+ .WillOnce(SetArgPointee<3>(0)) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*gl_, |
+ GetActiveUniformBlockiv(kServiceProgramId, 0, |
+ GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, _)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ decoder_->set_unsafe_es3_apis_enabled(true); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0, result->GetNumResults()); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+} |
+ |
+TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBlockivUnlinkedProgram) { |
+ GetActiveUniformBlockiv cmd; |
+ typedef GetActiveUniformBlockiv::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->SetNumResults(0); |
+ cmd.Init(client_program_id_, |
+ 0, |
+ GL_UNIFORM_BLOCK_BINDING, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _)) |
+ .WillOnce(SetArgPointee<2>(GL_FALSE)) |
+ .RetiresOnSaturation(); |
+ decoder_->set_unsafe_es3_apis_enabled(true); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0, result->GetNumResults()); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+} |
+ |
+TEST_P(GLES2DecoderWithShaderTest, |
+ GetActiveUniformBlockivResultNotInitFails) { |
+ GetActiveUniformBlockiv cmd; |
+ typedef GetActiveUniformBlockiv::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->SetNumResults(1); // Should be initialized to 0. |
+ cmd.Init(client_program_id_, |
+ 0, |
+ GL_UNIFORM_BLOCK_BINDING, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ decoder_->set_unsafe_es3_apis_enabled(true); |
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _)) |
+ .WillOnce(SetArgPointee<2>(GL_TRUE)) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*gl_, GetError()) |
+ .WillOnce(Return(GL_NO_ERROR)) |
+ .RetiresOnSaturation(); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
+TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBlockivBadProgramFails) { |
+ GetActiveUniformBlockiv cmd; |
+ typedef GetActiveUniformBlockiv::Result Result; |
+ Result* result = static_cast<Result*>(shared_memory_address_); |
+ result->SetNumResults(0); |
+ cmd.Init(kInvalidClientId, |
+ 0, |
+ GL_UNIFORM_BLOCK_BINDING, |
+ shared_memory_id_, |
+ shared_memory_offset_); |
+ decoder_->set_unsafe_es3_apis_enabled(true); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(0, result->GetNumResults()); |
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
+} |
+ |
+TEST_P(GLES2DecoderWithShaderTest, |
+ GetActiveUniformBlockivBadSharedMemoryFails) { |
+ GetActiveUniformBlockiv cmd; |
+ decoder_->set_unsafe_es3_apis_enabled(true); |
+ EXPECT_CALL(*gl_, GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _)) |
+ .WillOnce(SetArgPointee<2>(GL_TRUE)) |
+ .WillOnce(SetArgPointee<2>(GL_TRUE)) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*gl_, GetError()) |
+ .WillOnce(Return(GL_NO_ERROR)) |
+ .WillOnce(Return(GL_NO_ERROR)) |
+ .RetiresOnSaturation(); |
+ cmd.Init(client_program_id_, |
+ 0, |
+ GL_UNIFORM_BLOCK_BINDING, |
+ kInvalidSharedMemoryId, |
+ shared_memory_offset_); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+ cmd.Init(client_program_id_, |
+ 0, |
+ GL_UNIFORM_BLOCK_BINDING, |
+ shared_memory_id_, |
+ kInvalidSharedMemoryOffset); |
+ EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
+} |
+ |
TEST_P(GLES2DecoderWithShaderTest, GetActiveAttribSucceeds) { |
const GLuint kAttribIndex = 1; |
const uint32 kBucketId = 123; |