| Index: gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
|
| ===================================================================
|
| --- gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc (revision 54850)
|
| +++ gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc (working copy)
|
| @@ -2285,6 +2285,281 @@
|
| EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
| }
|
|
|
| +// Check that if a renderbuffer is attached and GL returns
|
| +// GL_FRAMEBUFFER_COMPLETE that the buffer is cleared and state is restored.
|
| +TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearColor) {
|
| + DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| + kServiceFramebufferId);
|
| + ClearColor color_cmd;
|
| + ColorMask color_mask_cmd;
|
| + Enable enable_cmd;
|
| + FramebufferRenderbuffer cmd;
|
| + color_cmd.Init(0.1f, 0.2f, 0.3f, 0.4f);
|
| + color_mask_cmd.Init(0, 1, 0, 1);
|
| + enable_cmd.Init(GL_SCISSOR_TEST);
|
| + cmd.Init(
|
| + GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| + client_renderbuffer_id_);
|
| + InSequence sequence;
|
| + EXPECT_CALL(*gl_, ClearColor(0.1f, 0.2f, 0.3f, 0.4f))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ColorMask(0, 1, 0, 1))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| + GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| + kServiceRenderbufferId))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
|
| + .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearColor(0, 0, 0, 0))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ColorMask(1, 1, 1, 1))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, Clear(GL_COLOR_BUFFER_BIT))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearColor(0.1f, 0.2f, 0.3f, 0.4f))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ColorMask(0, 1, 0, 1))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearStencil(0))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, static_cast<GLuint>(-1)))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, static_cast<GLuint>(-1)))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearDepth(1.0f))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, DepthMask(1))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(color_cmd));
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(color_mask_cmd));
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(enable_cmd));
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepth) {
|
| + DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| + kServiceFramebufferId);
|
| + ClearDepthf depth_cmd;
|
| + DepthMask depth_mask_cmd;
|
| + FramebufferRenderbuffer cmd;
|
| + depth_cmd.Init(0.5f);
|
| + depth_mask_cmd.Init(false);
|
| + cmd.Init(
|
| + GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
|
| + client_renderbuffer_id_);
|
| + InSequence sequence;
|
| + EXPECT_CALL(*gl_, ClearDepth(0.5f))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, DepthMask(0))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| + GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
|
| + kServiceRenderbufferId))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
|
| + .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearDepth(1.0f))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, DepthMask(1))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, Clear(GL_DEPTH_BUFFER_BIT))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearColor(0, 0, 0, 0))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ColorMask(1, 1, 1, 1))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearStencil(0))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, static_cast<GLuint>(-1)))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, static_cast<GLuint>(-1)))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearDepth(0.5f))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, DepthMask(0))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd));
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(depth_mask_cmd));
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearStencil) {
|
| + DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| + kServiceFramebufferId);
|
| + ClearStencil stencil_cmd;
|
| + StencilMaskSeparate stencil_mask_separate_cmd;
|
| + FramebufferRenderbuffer cmd;
|
| + stencil_cmd.Init(123);
|
| + stencil_mask_separate_cmd.Init(GL_BACK, 0x1234u);
|
| + cmd.Init(
|
| + GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
|
| + client_renderbuffer_id_);
|
| + InSequence sequence;
|
| + EXPECT_CALL(*gl_, ClearStencil(123))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, 0x1234u))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| + GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
|
| + kServiceRenderbufferId))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
|
| + .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearStencil(0))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, StencilMask(static_cast<GLuint>(-1)))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, Clear(GL_STENCIL_BUFFER_BIT))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearColor(0, 0, 0, 0))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ColorMask(1, 1, 1, 1))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearStencil(123))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, static_cast<GLuint>(-1)))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, 0x1234u))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearDepth(1.0f))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, DepthMask(1))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd));
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_mask_separate_cmd));
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| +}
|
| +
|
| +#if 0 // Turn this test on once we allow GL_DEPTH_STENCIL_ATTACHMENT
|
| +TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepthStencil) {
|
| + DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| + kServiceFramebufferId);
|
| + ClearDepthf depth_cmd;
|
| + ClearStencil stencil_cmd;
|
| + FramebufferRenderbuffer cmd;
|
| + depth_cmd.Init(0.5f);
|
| + stencil_cmd.Init(123);
|
| + cmd.Init(
|
| + GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
|
| + client_renderbuffer_id_);
|
| + InSequence sequence;
|
| + EXPECT_CALL(*gl_, ClearDepth(0.5f))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearStencil(123))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(
|
| + GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
|
| + kServiceRenderbufferId))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
|
| + .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearStencil(0))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, StencilMask(static_cast<GLuint>(-1)))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearDepth(1.0f))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, DepthMask(1))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, Clear(GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearColor(0, 0, 0, 0))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ColorMask(1, 1, 1, 1))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearStencil(123))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, static_cast<GLuint>(-1)))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, static_cast<GLuint>(-1)))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, ClearDepth(0.5f))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_CALL(*gl_, DepthMask(1))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd));
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd));
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| +}
|
| +#endif
|
| +
|
| // TODO(gman): BufferData
|
|
|
| // TODO(gman): BufferDataImmediate
|
|
|