| 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 d50bb6ded1e6420c60729a2f74fedf052d88fdfe..05c4073d658699a5d82b851518ae95d1e8943109 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
|
| @@ -45,15 +45,6 @@ class GLES2DecoderTest : public GLES2DecoderTestBase {
|
| bool init);
|
| };
|
|
|
| -class GLES2DecoderRGBBackbufferTest : public GLES2DecoderTest {
|
| - public:
|
| - GLES2DecoderRGBBackbufferTest() { }
|
| -
|
| - virtual void SetUp() {
|
| - InitDecoder("", false);
|
| - }
|
| -};
|
| -
|
| class GLES2DecoderWithShaderTest : public GLES2DecoderWithShaderTestBase {
|
| public:
|
| GLES2DecoderWithShaderTest()
|
| @@ -89,9 +80,29 @@ class GLES2DecoderWithShaderTest : public GLES2DecoderWithShaderTestBase {
|
| }
|
| };
|
|
|
| +class GLES2DecoderRGBBackbufferTest : public GLES2DecoderWithShaderTest {
|
| + public:
|
| + GLES2DecoderRGBBackbufferTest() { }
|
| +
|
| + virtual void SetUp() {
|
| + InitDecoder("", false, false, false, false, false, false);
|
| + SetupDefaultProgram();
|
| + }
|
| +};
|
| +
|
| +class GLES2DecoderManualInitTest : public GLES2DecoderWithShaderTest {
|
| + public:
|
| + GLES2DecoderManualInitTest() { }
|
| +
|
| + // Override default setup so nothing gets setup.
|
| + virtual void SetUp() {
|
| + }
|
| +};
|
| +
|
| TEST_F(GLES2DecoderWithShaderTest, DrawArraysNoAttributesSucceeds) {
|
| SetupTexture();
|
| AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| + SetupExpectationsForApplyingDefaultDirtyState();
|
|
|
| EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| .Times(1)
|
| @@ -131,6 +142,7 @@ TEST_F(GLES2DecoderWithShaderTest, DrawArraysBadTextureUsesBlack) {
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| }
|
| + SetupExpectationsForApplyingDefaultDirtyState();
|
| DrawArrays cmd;
|
| cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| @@ -163,8 +175,10 @@ TEST_F(GLES2DecoderWithShaderTest,
|
| TEST_F(GLES2DecoderWithShaderTest, DrawArraysValidAttributesSucceeds) {
|
| SetupTexture();
|
| SetupVertexBuffer();
|
| + DoEnableVertexAttribArray(1);
|
| DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId);
|
| + SetupExpectationsForApplyingDefaultDirtyState();
|
|
|
| EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| .Times(1)
|
| @@ -191,6 +205,7 @@ TEST_F(GLES2DecoderWithShaderTest, DrawArraysDeletedBufferFails) {
|
| TEST_F(GLES2DecoderWithShaderTest, DrawArraysDeletedProgramSucceeds) {
|
| SetupTexture();
|
| AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| + SetupExpectationsForApplyingDefaultDirtyState();
|
| DoDeleteProgram(client_program_id_, kServiceProgramId);
|
|
|
| EXPECT_CALL(*gl_, DrawArrays(_, _, _))
|
| @@ -259,6 +274,7 @@ TEST_F(GLES2DecoderWithShaderTest, DrawElementsNoAttributesSucceeds) {
|
| SetupTexture();
|
| SetupIndexBuffer();
|
| AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0);
|
| + SetupExpectationsForApplyingDefaultDirtyState();
|
| EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount,
|
| GL_UNSIGNED_SHORT,
|
| BufferOffset(kValidIndexRangeStart * 2)))
|
| @@ -317,6 +333,7 @@ TEST_F(GLES2DecoderWithShaderTest, DrawElementsValidAttributesSucceeds) {
|
| SetupIndexBuffer();
|
| DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId);
|
| + SetupExpectationsForApplyingDefaultDirtyState();
|
|
|
| EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount,
|
| GL_UNSIGNED_SHORT,
|
| @@ -349,6 +366,7 @@ TEST_F(GLES2DecoderWithShaderTest, DrawElementsDeletedProgramSucceeds) {
|
| SetupTexture();
|
| SetupIndexBuffer();
|
| AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0);
|
| + SetupExpectationsForApplyingDefaultDirtyState();
|
| DoDeleteProgram(client_program_id_, kServiceProgramId);
|
|
|
| EXPECT_CALL(*gl_, DrawElements(_, _, _, _))
|
| @@ -1245,13 +1263,29 @@ TEST_F(GLES2DecoderTest, CheckFramebufferStatusWithNoBoundTarget) {
|
| EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), *result);
|
| }
|
|
|
| +TEST_F(GLES2DecoderWithShaderTest, BindAndDeleteFramebuffer) {
|
| + SetupTexture();
|
| + AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| + SetupExpectationsForApplyingDefaultDirtyState();
|
| + DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| + kServiceFramebufferId);
|
| + DoDeleteFramebuffer(client_framebuffer_id_, kServiceFramebufferId);
|
| + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + DrawArrays cmd;
|
| + cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +}
|
| +
|
| TEST_F(GLES2DecoderTest, FramebufferRenderbufferWithNoBoundTarget) {
|
| EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(_, _, _, _))
|
| .Times(0);
|
| FramebufferRenderbuffer cmd;
|
| cmd.Init(
|
| - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| - client_renderbuffer_id_);
|
| + GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| + client_renderbuffer_id_);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
| }
|
| @@ -1300,12 +1334,8 @@ TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithRenderbuffer) {
|
| SetupExpectationsForFramebufferAttachment(
|
| GL_COLOR_BUFFER_BIT, // clear bits
|
| 0, 0, 0, 0, // color
|
| - 0x1111, // color bits
|
| 0, // stencil
|
| - -1, // stencil mask back,
|
| - -1, // stencil mask front,
|
| 1.0f, // depth
|
| - 1, // depth mask
|
| false); // scissor test
|
| EXPECT_CALL(*gl_, GetError())
|
| .WillOnce(Return(GL_NO_ERROR))
|
| @@ -1360,12 +1390,8 @@ TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithTexture) {
|
| SetupExpectationsForFramebufferAttachment(
|
| 0, // clear bits
|
| 0, 0, 0, 0, // color
|
| - 0x1111, // color bits
|
| 0, // stencil
|
| - -1, // stencil mask back,
|
| - -1, // stencil mask front,
|
| 1.0f, // depth
|
| - 1, // depth mask
|
| false); // scissor test
|
| EXPECT_CALL(*gl_, GetError())
|
| .WillOnce(Return(GL_NO_ERROR))
|
| @@ -1542,12 +1568,8 @@ void GLES2DecoderTest::CheckReadPixelsOutOfRange(
|
| SetupExpectationsForFramebufferAttachment(
|
| 0, // clear bits
|
| 0, 0, 0, 0, // color
|
| - 0x1111, // color bits
|
| 0, // stencil
|
| - -1, // stencil mask back,
|
| - -1, // stencil mask front,
|
| 1.0f, // depth
|
| - 1, // depth mask
|
| false); // scissor test
|
| FramebufferTexture2D fbtex_cmd;
|
| fbtex_cmd.Init(
|
| @@ -2529,9 +2551,9 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearColor) {
|
| 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_, ColorMask(0, 1, 0, 1))
|
| +// .Times(0)
|
| +// .RetiresOnSaturation();
|
| EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST))
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| @@ -2549,12 +2571,8 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearColor) {
|
| SetupExpectationsForFramebufferAttachment(
|
| GL_COLOR_BUFFER_BIT, // clear bits
|
| 0.1f, 0.2f, 0.3f, 0.4f, // color
|
| - 0x0101, // color bits
|
| 0, // stencil
|
| - -1, // stencil mask back
|
| - -1, // stencil mask front
|
| 1.0f, // depth
|
| - 1, // depth mask
|
| true); // scissor test
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(color_cmd));
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(color_mask_cmd));
|
| @@ -2577,9 +2595,9 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepth) {
|
| EXPECT_CALL(*gl_, ClearDepth(0.5f))
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, DepthMask(0))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| +// EXPECT_CALL(*gl_, DepthMask(0))
|
| +// .Times(1)
|
| +// .RetiresOnSaturation();
|
| EXPECT_CALL(*gl_, GetError())
|
| .WillOnce(Return(GL_NO_ERROR))
|
| .RetiresOnSaturation();
|
| @@ -2594,12 +2612,8 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepth) {
|
| SetupExpectationsForFramebufferAttachment(
|
| GL_DEPTH_BUFFER_BIT, // clear bits
|
| 0, 0, 0, 0, // color
|
| - 0x1111, // color bits
|
| 0, // stencil
|
| - -1, // stencil mask back,
|
| - -1, // stencil mask front,
|
| 0.5f, // depth
|
| - 0, // depth mask
|
| false); // scissor test
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd));
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(depth_mask_cmd));
|
| @@ -2621,9 +2635,9 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearStencil) {
|
| EXPECT_CALL(*gl_, ClearStencil(123))
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| - EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, 0x1234u))
|
| - .Times(1)
|
| - .RetiresOnSaturation();
|
| +// EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, 0x1234u))
|
| +// .Times(1)
|
| +// .RetiresOnSaturation();
|
| EXPECT_CALL(*gl_, GetError())
|
| .WillOnce(Return(GL_NO_ERROR))
|
| .RetiresOnSaturation();
|
| @@ -2638,12 +2652,8 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearStencil) {
|
| SetupExpectationsForFramebufferAttachment(
|
| GL_STENCIL_BUFFER_BIT, // clear bits
|
| 0, 0, 0, 0, // color
|
| - 0x1111, // color bits
|
| 123, // stencil
|
| - -1, // stencil mask back,
|
| - 0x1234u, // stencil mask front,
|
| 1.0f, // depth
|
| - 1, // depth mask
|
| false); // scissor test
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd));
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_mask_separate_cmd));
|
| @@ -2725,12 +2735,8 @@ TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepthStencil) {
|
| SetupExpectationsForFramebufferAttachment(
|
| GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, // clear bits
|
| 0, 0, 0, 0, // color
|
| - 0x1111, // color bits
|
| 123, // stencil
|
| - -1, // stencil mask back,
|
| - -1, // stencil mask front,
|
| 0.5f, // depth
|
| - 1, // depth mask
|
| false); // scissor test
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd));
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd));
|
| @@ -2974,6 +2980,381 @@ TEST_F(GLES2DecoderTest,
|
| EXPECT_EQ(surface.get(), decoder_->GetGLSurface());
|
| }
|
|
|
| +// Test that with an RGB backbuffer if we set the color mask to 1,1,1,1 it is
|
| +// set to 1,1,1,0 at Draw time but is 1,1,1,1 at query time.
|
| +TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMask) {
|
| + ColorMask cmd;
|
| + cmd.Init(true, true, true, true);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + SetupTexture();
|
| + AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| + SetupExpectationsForApplyingDirtyState(
|
| + true, // Framebuffer is RGB
|
| + false, // Framebuffer has depth
|
| + false, // Framebuffer has stencil
|
| + 0x1110, // color bits
|
| + false, // depth mask
|
| + 0, // front stencil mask
|
| + 0); // back stencil mask
|
| +
|
| + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + DrawArrays draw_cmd;
|
| + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + typedef GetIntegerv::Result Result;
|
| + Result* result = static_cast<Result*>(shared_memory_address_);
|
| + EXPECT_CALL(*gl_, GetIntegerv(GL_COLOR_WRITEMASK, result->GetData()))
|
| + .Times(0);
|
| + result->size = 0;
|
| + GetIntegerv cmd2;
|
| + cmd2.Init(GL_COLOR_WRITEMASK, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| + EXPECT_EQ(
|
| + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_COLOR_WRITEMASK),
|
| + result->GetNumResults());
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(1, result->GetData()[0]);
|
| + EXPECT_EQ(1, result->GetData()[1]);
|
| + EXPECT_EQ(1, result->GetData()[2]);
|
| + EXPECT_EQ(1, result->GetData()[3]);
|
| +}
|
| +
|
| +// Test that with no depth if we set DepthMask true that it's set to false at
|
| +// draw time but querying it returns true.
|
| +TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferDepthMask) {
|
| + EXPECT_CALL(*gl_, DepthMask(true))
|
| + .Times(0)
|
| + .RetiresOnSaturation();
|
| + DepthMask cmd;
|
| + cmd.Init(true);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + SetupTexture();
|
| + AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| + SetupExpectationsForApplyingDirtyState(
|
| + true, // Framebuffer is RGB
|
| + false, // Framebuffer has depth
|
| + false, // Framebuffer has stencil
|
| + 0x1110, // color bits
|
| + false, // depth mask
|
| + 0, // front stencil mask
|
| + 0); // back stencil mask
|
| +
|
| + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + DrawArrays draw_cmd;
|
| + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + typedef GetIntegerv::Result Result;
|
| + Result* result = static_cast<Result*>(shared_memory_address_);
|
| + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_WRITEMASK, result->GetData()))
|
| + .Times(0);
|
| + result->size = 0;
|
| + GetIntegerv cmd2;
|
| + cmd2.Init(GL_DEPTH_WRITEMASK, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| + EXPECT_EQ(
|
| + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_WRITEMASK),
|
| + result->GetNumResults());
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(1, result->GetData()[0]);
|
| +}
|
| +
|
| +// Test that with no stencil if we set the stencil mask it's still set to 0 at
|
| +// draw time but gets our value if we query.
|
| +TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferStencilMask) {
|
| + const GLint kMask = 123;
|
| + EXPECT_CALL(*gl_, StencilMask(kMask))
|
| + .Times(0)
|
| + .RetiresOnSaturation();
|
| + StencilMask cmd;
|
| + cmd.Init(kMask);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + SetupTexture();
|
| + AddExpectationsForSimulatedAttrib0(kNumVertices, 0);
|
| + SetupExpectationsForApplyingDirtyState(
|
| + true, // Framebuffer is RGB
|
| + false, // Framebuffer has depth
|
| + false, // Framebuffer has stencil
|
| + 0x1110, // color bits
|
| + false, // depth mask
|
| + 0, // front stencil mask
|
| + 0); // back stencil mask
|
| + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + DrawArrays draw_cmd;
|
| + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + typedef GetIntegerv::Result Result;
|
| + Result* result = static_cast<Result*>(shared_memory_address_);
|
| + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, result->GetData()))
|
| + .Times(0);
|
| + result->size = 0;
|
| + GetIntegerv cmd2;
|
| + cmd2.Init(GL_STENCIL_WRITEMASK, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| + EXPECT_EQ(
|
| + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_WRITEMASK),
|
| + result->GetNumResults());
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(kMask, result->GetData()[0]);
|
| +}
|
| +
|
| +// Test that if an FBO is bound we get the correct masks.
|
| +TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMaskFBO) {
|
| + ColorMask cmd;
|
| + cmd.Init(true, true, true, true);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + SetupTexture();
|
| + SetupVertexBuffer();
|
| + DoEnableVertexAttribArray(0);
|
| + DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0);
|
| + DoEnableVertexAttribArray(1);
|
| + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0);
|
| + DoEnableVertexAttribArray(2);
|
| + DoVertexAttribPointer(2, 2, GL_FLOAT, 0, 0);
|
| + SetupExpectationsForApplyingDirtyState(
|
| + true, // Framebuffer is RGB
|
| + false, // Framebuffer has depth
|
| + false, // Framebuffer has stencil
|
| + 0x1110, // color bits
|
| + false, // depth mask
|
| + 0, // front stencil mask
|
| + 0); // back stencil mask
|
| +
|
| + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + DrawArrays draw_cmd;
|
| + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + // Check that no extra calls are made on the next draw.
|
| + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + // Setup Frame buffer.
|
| + DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_,
|
| + kServiceFramebufferId);
|
| + EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(_, _, _, _))
|
| + .Times(0);
|
| + FramebufferRenderbuffer fbrb_cmd;
|
| + fbrb_cmd.Init(
|
| + GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
|
| + client_renderbuffer_id_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| +
|
| + // This time state needs to be set.
|
| + SetupExpectationsForApplyingDirtyState(
|
| + false, // Framebuffer is RGB
|
| + false, // Framebuffer has depth
|
| + false, // Framebuffer has stencil
|
| + 0x1110, // color bits
|
| + false, // depth mask
|
| + 0, // front stencil mask
|
| + 0); // back stencil mask
|
| + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + // Check that no extra calls are made on the next draw.
|
| + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +
|
| + // Unbind
|
| + DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0);
|
| +
|
| + SetupExpectationsForApplyingDirtyState(
|
| + true, // Framebuffer is RGB
|
| + false, // Framebuffer has depth
|
| + false, // Framebuffer has stencil
|
| + 0x1110, // color bits
|
| + false, // depth mask
|
| + 0, // front stencil mask
|
| + 0); // back stencil mask
|
| +
|
| + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd));
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderManualInitTest, ActualAlphaMatchesRequestedAlpha) {
|
| + InitDecoder("", true, false, false, true, false, false);
|
| +
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + typedef GetIntegerv::Result Result;
|
| + Result* result = static_cast<Result*>(shared_memory_address_);
|
| + EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _))
|
| + .WillOnce(SetArgumentPointee<1>(8))
|
| + .RetiresOnSaturation();
|
| + result->size = 0;
|
| + GetIntegerv cmd2;
|
| + cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| + EXPECT_EQ(
|
| + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS),
|
| + result->GetNumResults());
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(8, result->GetData()[0]);
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderManualInitTest, ActualAlphaDoesNotMatchRequestedAlpha) {
|
| + InitDecoder("", true, false, false, false, false, false);
|
| +
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + typedef GetIntegerv::Result Result;
|
| + Result* result = static_cast<Result*>(shared_memory_address_);
|
| + EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _))
|
| + .WillOnce(SetArgumentPointee<1>(8))
|
| + .RetiresOnSaturation();
|
| + result->size = 0;
|
| + GetIntegerv cmd2;
|
| + cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| + EXPECT_EQ(
|
| + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS),
|
| + result->GetNumResults());
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(0, result->GetData()[0]);
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderManualInitTest, ActualDepthMatchesRequestedDepth) {
|
| + InitDecoder("", false, true, false, false, true, false);
|
| +
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + typedef GetIntegerv::Result Result;
|
| + Result* result = static_cast<Result*>(shared_memory_address_);
|
| + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _))
|
| + .WillOnce(SetArgumentPointee<1>(24))
|
| + .RetiresOnSaturation();
|
| + result->size = 0;
|
| + GetIntegerv cmd2;
|
| + cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| + EXPECT_EQ(
|
| + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS),
|
| + result->GetNumResults());
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(24, result->GetData()[0]);
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderManualInitTest, ActualDepthDoesNotMatchRequestedDepth) {
|
| + InitDecoder("", false, true, false, false, false, false);
|
| +
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + typedef GetIntegerv::Result Result;
|
| + Result* result = static_cast<Result*>(shared_memory_address_);
|
| + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _))
|
| + .WillOnce(SetArgumentPointee<1>(24))
|
| + .RetiresOnSaturation();
|
| + result->size = 0;
|
| + GetIntegerv cmd2;
|
| + cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| + EXPECT_EQ(
|
| + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS),
|
| + result->GetNumResults());
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(0, result->GetData()[0]);
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderManualInitTest, ActualStencilMatchesRequestedStencil) {
|
| + InitDecoder("", false, false, true, false, false, true);
|
| +
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + typedef GetIntegerv::Result Result;
|
| + Result* result = static_cast<Result*>(shared_memory_address_);
|
| + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _))
|
| + .WillOnce(SetArgumentPointee<1>(8))
|
| + .RetiresOnSaturation();
|
| + result->size = 0;
|
| + GetIntegerv cmd2;
|
| + cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| + EXPECT_EQ(
|
| + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS),
|
| + result->GetNumResults());
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(8, result->GetData()[0]);
|
| +}
|
| +
|
| +TEST_F(GLES2DecoderManualInitTest, ActualStencilDoesNotMatchRequestedStencil) {
|
| + InitDecoder("", false, false, true, false, false, false);
|
| +
|
| + EXPECT_CALL(*gl_, GetError())
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .WillOnce(Return(GL_NO_ERROR))
|
| + .RetiresOnSaturation();
|
| + typedef GetIntegerv::Result Result;
|
| + Result* result = static_cast<Result*>(shared_memory_address_);
|
| + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _))
|
| + .WillOnce(SetArgumentPointee<1>(8))
|
| + .RetiresOnSaturation();
|
| + result->size = 0;
|
| + GetIntegerv cmd2;
|
| + cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_);
|
| + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
| + EXPECT_EQ(
|
| + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS),
|
| + result->GetNumResults());
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_EQ(0, result->GetData()[0]);
|
| +}
|
|
|
| // TODO(gman): BufferData
|
|
|
|
|