Index: gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc |
index 2d034c3d5b6926a266221d71784e9f0c811969df..9fe38a5c2d157881c989249a517e89ca4ece4b97 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc |
@@ -1424,6 +1424,67 @@ TEST_P(GLES2DecoderTest, LoseContextCHROMIUMInvalidArgs1_0) { |
EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); |
} |
+TEST_P(GLES3DecoderTest, TransformFeedbackStates) { |
+ cmds::BeginTransformFeedback begin_cmd; |
+ begin_cmd.Init(GL_POINTS); |
+ cmds::EndTransformFeedback end_cmd; |
+ end_cmd.Init(); |
+ cmds::PauseTransformFeedback pause_cmd; |
+ pause_cmd.Init(); |
+ cmds::ResumeTransformFeedback resume_cmd; |
+ resume_cmd.Init(); |
+ |
+ // Before Begin: Pause, Resume, and End is invalid. |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+ |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(pause_cmd)); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+ |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(resume_cmd)); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+ |
+ // Begin |
+ EXPECT_CALL(*gl_, BeginTransformFeedback(GL_POINTS)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+ |
+ // Begin again is invalid. |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+ |
+ // Before Pause: Resume is invalid. |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(resume_cmd)); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+ |
+ // Pause |
+ EXPECT_CALL(*gl_, PauseTransformFeedback()) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(pause_cmd)); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+ |
+ // Pause again is invalid. |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(pause_cmd)); |
+ EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
+ |
+ // Resume |
+ EXPECT_CALL(*gl_, ResumeTransformFeedback()) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(resume_cmd)); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+ |
+ // End |
+ EXPECT_CALL(*gl_, EndTransformFeedback()) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+} |
+ |
class GLES2DecoderDoCommandsTest : public GLES2DecoderTest { |
public: |
GLES2DecoderDoCommandsTest() { |
@@ -1443,6 +1504,60 @@ class GLES2DecoderDoCommandsTest : public GLES2DecoderTest { |
int entries_per_cmd_; |
}; |
+TEST_P(GLES3DecoderTest, BindTransformFeedbackValidArgs) { |
+ EXPECT_CALL(*gl_, BindTransformFeedback(GL_TRANSFORM_FEEDBACK, |
+ kServiceTransformFeedbackId)); |
+ SpecializedSetup<cmds::BindTransformFeedback, 0>(true); |
+ cmds::BindTransformFeedback cmd; |
+ cmd.Init(GL_TRANSFORM_FEEDBACK, client_transformfeedback_id_); |
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+} |
+ |
+TEST_P(GLES3DecoderTest, GenDeleteTransformFeedbacksImmediateValidArgs) { |
+ EXPECT_CALL(*gl_, GenTransformFeedbacks(1, _)) |
+ .WillOnce(SetArgPointee<1>(kNewServiceId)); |
+ cmds::GenTransformFeedbacksImmediate* gen_cmd = |
+ GetImmediateAs<cmds::GenTransformFeedbacksImmediate>(); |
+ GLuint temp = kNewClientId; |
+ SpecializedSetup<cmds::GenTransformFeedbacksImmediate, 0>(true); |
+ gen_cmd->Init(1, &temp); |
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(*gen_cmd, sizeof(temp))); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+ EXPECT_TRUE(GetTransformFeedback(kNewClientId) != nullptr); |
+ |
+ EXPECT_CALL(*gl_, |
+ DeleteTransformFeedbacks(1, Pointee(kNewServiceId))) |
+ .Times(1); |
+ cmds::DeleteTransformFeedbacksImmediate& delete_cmd = |
+ *GetImmediateAs<cmds::DeleteTransformFeedbacksImmediate>(); |
+ SpecializedSetup<cmds::DeleteTransformFeedbacksImmediate, 0>(true); |
+ delete_cmd.Init(1, &temp); |
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(delete_cmd, sizeof(&temp))); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+ EXPECT_TRUE(GetTransformFeedback(kNewClientId) == nullptr); |
+} |
+ |
+TEST_P(GLES3DecoderTest, DeleteTransformFeedbacksImmediateInvalidArgs) { |
+ cmds::DeleteTransformFeedbacksImmediate& cmd = |
+ *GetImmediateAs<cmds::DeleteTransformFeedbacksImmediate>(); |
+ SpecializedSetup<cmds::DeleteTransformFeedbacksImmediate, 0>(false); |
+ GLuint temp = kInvalidClientId; |
+ cmd.Init(1, &temp); |
+ EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); |
+ EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
+} |
+ |
+TEST_P(GLES3DecoderTest, GenTransformFeedbacksImmediateInvalidArgs) { |
+ EXPECT_CALL(*gl_, GenTransformFeedbacks(_, _)).Times(0); |
+ cmds::GenTransformFeedbacksImmediate* cmd = |
+ GetImmediateAs<cmds::GenTransformFeedbacksImmediate>(); |
+ SpecializedSetup<cmds::GenTransformFeedbacksImmediate, 0>(false); |
+ cmd->Init(1, &client_transformfeedback_id_); |
+ EXPECT_EQ(error::kInvalidArguments, |
+ ExecuteImmediateCmd(*cmd, sizeof(&client_transformfeedback_id_))); |
+} |
+ |
// Test that processing with 0 entries does nothing. |
TEST_P(GLES2DecoderDoCommandsTest, DoCommandsOneOfZero) { |
int num_processed = -1; |