Index: cc/trees/layer_tree_host_impl_unittest.cc |
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc |
index 37e62fb3c520d32ca0c50dd789f28836d7a9dc36..cffc90d33ed59532d7063cfac4bb29097b8cb74a 100644 |
--- a/cc/trees/layer_tree_host_impl_unittest.cc |
+++ b/cc/trees/layer_tree_host_impl_unittest.cc |
@@ -57,11 +57,13 @@ |
#include "cc/test/gpu_rasterization_enabled_settings.h" |
#include "cc/test/layer_test_common.h" |
#include "cc/test/layer_tree_test.h" |
+#include "cc/test/test_delegating_output_surface.h" |
#include "cc/test/test_gpu_memory_buffer_manager.h" |
#include "cc/test/test_shared_bitmap_manager.h" |
#include "cc/test/test_task_graph_runner.h" |
#include "cc/test/test_web_graphics_context_3d.h" |
#include "cc/trees/effect_node.h" |
+#include "cc/trees/layer_tree_host_common.h" |
#include "cc/trees/layer_tree_impl.h" |
#include "cc/trees/single_thread_proxy.h" |
#include "cc/trees/transform_node.h" |
@@ -456,6 +458,7 @@ class LayerTreeHostImplTest : public testing::Test, |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
host_impl_->DidDrawAllLayers(frame); |
+ host_impl_->SwapBuffers(frame); |
} |
void pinch_zoom_pan_viewport_forces_commit_redraw(float device_scale_factor); |
@@ -470,7 +473,7 @@ class LayerTreeHostImplTest : public testing::Test, |
protected: |
virtual std::unique_ptr<OutputSurface> CreateOutputSurface() { |
- return FakeOutputSurface::Create3d(); |
+ return FakeOutputSurface::CreateDelegating3d(); |
} |
void DrawOneFrame() { |
@@ -570,7 +573,7 @@ TEST_F(LayerTreeHostImplTest, NotifyIfCanDrawChanged) { |
TEST_F(LayerTreeHostImplTest, ResourcelessDrawWithEmptyViewport) { |
CreateHostImpl(DefaultSettings(), |
- FakeOutputSurface::CreateSoftware( |
+ FakeOutputSurface::CreateDelegatingSoftware( |
base::WrapUnique(new SoftwareOutputDevice()))); |
SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
@@ -733,9 +736,9 @@ TEST_F(LayerTreeHostImplTest, ScrollWithoutRenderer) { |
context_owned->set_context_lost(true); |
// Initialization will fail. |
- EXPECT_FALSE( |
- CreateHostImpl(DefaultSettings(), |
- FakeOutputSurface::Create3d(std::move(context_owned)))); |
+ EXPECT_FALSE(CreateHostImpl( |
+ DefaultSettings(), |
+ FakeOutputSurface::CreateDelegating3d(std::move(context_owned)))); |
SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
@@ -3428,6 +3431,7 @@ TEST_F(LayerTreeHostImplTest, WillDrawReturningFalseDoesNotCall) { |
LayerTreeHostImpl::FrameData frame; |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
host_impl_->DidDrawAllLayers(frame); |
EXPECT_TRUE(layer->will_draw_called()); |
@@ -3445,6 +3449,7 @@ TEST_F(LayerTreeHostImplTest, WillDrawReturningFalseDoesNotCall) { |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
host_impl_->DidDrawAllLayers(frame); |
EXPECT_TRUE(layer->will_draw_called()); |
@@ -3478,6 +3483,7 @@ TEST_F(LayerTreeHostImplTest, DidDrawNotCalledOnHiddenLayer) { |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
host_impl_->DidDrawAllLayers(frame); |
EXPECT_FALSE(layer->will_draw_called()); |
@@ -3495,6 +3501,7 @@ TEST_F(LayerTreeHostImplTest, DidDrawNotCalledOnHiddenLayer) { |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
host_impl_->DidDrawAllLayers(frame); |
EXPECT_TRUE(layer->will_draw_called()); |
@@ -3537,6 +3544,7 @@ TEST_F(LayerTreeHostImplTest, WillDrawNotCalledOnOccludedLayer) { |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
host_impl_->DidDrawAllLayers(frame); |
EXPECT_FALSE(occluded_layer->will_draw_called()); |
@@ -3575,6 +3583,7 @@ TEST_F(LayerTreeHostImplTest, DidDrawCalledOnAllLayers) { |
*host_impl_->active_tree()->begin()); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
host_impl_->DidDrawAllLayers(frame); |
EXPECT_TRUE(root->did_draw_called()); |
@@ -3791,7 +3800,7 @@ TEST_F(LayerTreeHostImplTest, PrepareToDrawSucceedsAndFails) { |
TEST_F(LayerTreeHostImplTest, |
PrepareToDrawWhenDrawAndSwapFullViewportEveryFrame) { |
CreateHostImpl(DefaultSettings(), |
- FakeOutputSurface::CreateSoftware( |
+ FakeOutputSurface::CreateDelegatingSoftware( |
base::WrapUnique(new SoftwareOutputDevice()))); |
const gfx::Transform external_transform; |
@@ -6473,6 +6482,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->DrawLayers(&frame); |
EXPECT_TRUE(layer1->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
+ host_impl_->SwapBuffers(frame); |
// Layer with translucent content and painting, so drawn with blending. |
layer1->SetContentsOpaque(false); |
@@ -6481,6 +6491,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6493,6 +6504,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6505,6 +6517,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6528,6 +6541,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
EXPECT_TRUE(layer2->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6542,6 +6556,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
EXPECT_TRUE(layer2->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6557,6 +6572,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
EXPECT_TRUE(layer2->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6579,6 +6595,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
EXPECT_TRUE(layer2->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6599,6 +6616,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
EXPECT_TRUE(layer2->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6617,6 +6635,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
EXPECT_TRUE(layer2->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6636,6 +6655,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
EXPECT_TRUE(layer2->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6650,6 +6670,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6663,6 +6684,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6676,6 +6698,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
@@ -6690,6 +6713,7 @@ TEST_F(LayerTreeHostImplTest, BlendingOffWhenDrawingOpaqueLayers) { |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
+ host_impl_->SwapBuffers(frame); |
EXPECT_TRUE(layer1->quads_appended()); |
host_impl_->DidDrawAllLayers(frame); |
} |
@@ -6703,10 +6727,10 @@ class LayerTreeHostImplViewportCoveredTest : public LayerTreeHostImplTest { |
std::unique_ptr<OutputSurface> CreateFakeOutputSurface(bool software) { |
if (software) { |
- return FakeOutputSurface::CreateSoftware( |
+ return FakeOutputSurface::CreateDelegatingSoftware( |
base::WrapUnique(new SoftwareOutputDevice())); |
} |
- return FakeOutputSurface::Create3d(); |
+ return FakeOutputSurface::CreateDelegating3d(); |
} |
void SetupActiveTreeLayers() { |
@@ -7006,59 +7030,6 @@ class FakeDrawableLayerImpl: public LayerImpl { |
: LayerImpl(tree_impl, id) {} |
}; |
-// Only reshape when we know we are going to draw. Otherwise, the reshape |
-// can leave the window at the wrong size if we never draw and the proper |
-// viewport size is never set. |
-TEST_F(LayerTreeHostImplTest, ReshapeNotCalledUntilDraw) { |
- scoped_refptr<TestContextProvider> provider(TestContextProvider::Create()); |
- std::unique_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(provider)); |
- CreateHostImpl(DefaultSettings(), std::move(output_surface)); |
- |
- std::unique_ptr<LayerImpl> root = |
- FakeDrawableLayerImpl::Create(host_impl_->active_tree(), 1); |
- root->SetBounds(gfx::Size(10, 10)); |
- root->SetDrawsContent(true); |
- root->test_properties()->force_render_surface = true; |
- host_impl_->active_tree()->SetRootLayerForTesting(std::move(root)); |
- host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
- |
- EXPECT_FALSE(provider->TestContext3d()->reshape_called()); |
- provider->TestContext3d()->clear_reshape_called(); |
- |
- LayerTreeHostImpl::FrameData frame; |
- host_impl_->SetViewportSize(gfx::Size(10, 10)); |
- host_impl_->active_tree()->SetDeviceScaleFactor(1.f); |
- EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
- host_impl_->DrawLayers(&frame); |
- EXPECT_TRUE(provider->TestContext3d()->reshape_called()); |
- EXPECT_EQ(provider->TestContext3d()->width(), 10); |
- EXPECT_EQ(provider->TestContext3d()->height(), 10); |
- EXPECT_EQ(provider->TestContext3d()->scale_factor(), 1.f); |
- host_impl_->DidDrawAllLayers(frame); |
- provider->TestContext3d()->clear_reshape_called(); |
- |
- host_impl_->SetViewportSize(gfx::Size(20, 30)); |
- EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
- host_impl_->DrawLayers(&frame); |
- EXPECT_TRUE(provider->TestContext3d()->reshape_called()); |
- EXPECT_EQ(provider->TestContext3d()->width(), 20); |
- EXPECT_EQ(provider->TestContext3d()->height(), 30); |
- EXPECT_EQ(provider->TestContext3d()->scale_factor(), 1.f); |
- host_impl_->DidDrawAllLayers(frame); |
- provider->TestContext3d()->clear_reshape_called(); |
- |
- host_impl_->active_tree()->SetDeviceScaleFactor(2.f); |
- EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
- host_impl_->DrawLayers(&frame); |
- EXPECT_TRUE(provider->TestContext3d()->reshape_called()); |
- EXPECT_EQ(provider->TestContext3d()->width(), 20); |
- EXPECT_EQ(provider->TestContext3d()->height(), 30); |
- EXPECT_EQ(provider->TestContext3d()->scale_factor(), 2.f); |
- host_impl_->DidDrawAllLayers(frame); |
- provider->TestContext3d()->clear_reshape_called(); |
-} |
- |
// Make sure damage tracking propagates all the way to the graphics context, |
// where it should request to swap only the sub-buffer that is damaged. |
TEST_F(LayerTreeHostImplTest, PartialSwapReceivesDamageRect) { |
@@ -7068,7 +7039,7 @@ TEST_F(LayerTreeHostImplTest, PartialSwapReceivesDamageRect) { |
context_provider->TestContext3d()->set_have_post_sub_buffer(true); |
std::unique_ptr<FakeOutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_provider)); |
+ FakeOutputSurface::CreateDelegating3d(context_provider)); |
FakeOutputSurface* fake_output_surface = output_surface.get(); |
// This test creates its own LayerTreeHostImpl, so |
@@ -7107,14 +7078,12 @@ TEST_F(LayerTreeHostImplTest, PartialSwapReceivesDamageRect) { |
layer_tree_host_impl->DrawLayers(&frame); |
layer_tree_host_impl->DidDrawAllLayers(frame); |
layer_tree_host_impl->SwapBuffers(frame); |
- gfx::Rect expected_swap_rect(0, 0, 500, 500); |
+ gfx::Rect expected_swap_rect(500, 500); |
EXPECT_EQ(expected_swap_rect.ToString(), |
fake_output_surface->last_swap_rect().ToString()); |
// Second frame, only the damaged area should get swapped. Damage should be |
- // the union of old and new child rects. |
- // expected damage rect: gfx::Rect(26, 28); |
- // expected swap rect: vertically flipped, with origin at bottom left corner. |
+ // the union of old and new child rects: gfx::Rect(26, 28). |
layer_tree_host_impl->active_tree() |
->root_layer_for_testing() |
->test_properties() |
@@ -7131,10 +7100,7 @@ TEST_F(LayerTreeHostImplTest, PartialSwapReceivesDamageRect) { |
host_impl_->DidDrawAllLayers(frame); |
layer_tree_host_impl->SwapBuffers(frame); |
- // Make sure that partial swap is constrained to the viewport dimensions |
- // expected damage rect: gfx::Rect(500, 500); |
- // expected swap rect: flipped damage rect, but also clamped to viewport |
- expected_swap_rect = gfx::Rect(0, 500-28, 26, 28); |
+ expected_swap_rect = gfx::Rect(26, 28); |
EXPECT_EQ(expected_swap_rect.ToString(), |
fake_output_surface->last_swap_rect().ToString()); |
@@ -7148,7 +7114,7 @@ TEST_F(LayerTreeHostImplTest, PartialSwapReceivesDamageRect) { |
host_impl_->DidDrawAllLayers(frame); |
layer_tree_host_impl->SwapBuffers(frame); |
- expected_swap_rect = gfx::Rect(0, 0, 10, 10); |
+ expected_swap_rect = gfx::Rect(10, 10); |
EXPECT_EQ(expected_swap_rect.ToString(), |
fake_output_surface->last_swap_rect().ToString()); |
@@ -7204,174 +7170,6 @@ class FakeLayerWithQuads : public LayerImpl { |
: LayerImpl(tree_impl, id) {} |
}; |
-class MockContext : public TestWebGraphicsContext3D { |
- public: |
- MOCK_METHOD1(useProgram, void(GLuint program)); |
- MOCK_METHOD5(uniform4f, void(GLint location, |
- GLfloat x, |
- GLfloat y, |
- GLfloat z, |
- GLfloat w)); |
- MOCK_METHOD4(uniformMatrix4fv, void(GLint location, |
- GLsizei count, |
- GLboolean transpose, |
- const GLfloat* value)); |
- MOCK_METHOD4(drawElements, void(GLenum mode, |
- GLsizei count, |
- GLenum type, |
- GLintptr offset)); |
- MOCK_METHOD1(enable, void(GLenum cap)); |
- MOCK_METHOD1(disable, void(GLenum cap)); |
- MOCK_METHOD4(scissor, void(GLint x, |
- GLint y, |
- GLsizei width, |
- GLsizei height)); |
-}; |
- |
-class MockContextHarness { |
- private: |
- MockContext* context_; |
- |
- public: |
- explicit MockContextHarness(MockContext* context) |
- : context_(context) { |
- context_->set_have_post_sub_buffer(true); |
- |
- // Catch "uninteresting" calls |
- EXPECT_CALL(*context_, useProgram(_)) |
- .Times(0); |
- |
- EXPECT_CALL(*context_, drawElements(_, _, _, _)) |
- .Times(0); |
- |
- // These are not asserted |
- EXPECT_CALL(*context_, uniformMatrix4fv(_, _, _, _)) |
- .WillRepeatedly(Return()); |
- |
- EXPECT_CALL(*context_, uniform4f(_, _, _, _, _)) |
- .WillRepeatedly(Return()); |
- |
- // Any un-sanctioned calls to enable() are OK |
- EXPECT_CALL(*context_, enable(_)) |
- .WillRepeatedly(Return()); |
- |
- // Any un-sanctioned calls to disable() are OK |
- EXPECT_CALL(*context_, disable(_)) |
- .WillRepeatedly(Return()); |
- } |
- |
- void MustDrawSolidQuad() { |
- EXPECT_CALL(*context_, drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0)) |
- .WillOnce(Return()) |
- .RetiresOnSaturation(); |
- |
- EXPECT_CALL(*context_, useProgram(_)) |
- .WillOnce(Return()) |
- .RetiresOnSaturation(); |
- } |
- |
- void MustSetScissor(int x, int y, int width, int height) { |
- EXPECT_CALL(*context_, enable(GL_SCISSOR_TEST)) |
- .WillRepeatedly(Return()); |
- |
- EXPECT_CALL(*context_, scissor(x, y, width, height)) |
- .Times(AtLeast(1)) |
- .WillRepeatedly(Return()); |
- } |
- |
- void MustSetNoScissor() { |
- EXPECT_CALL(*context_, disable(GL_SCISSOR_TEST)) |
- .WillRepeatedly(Return()); |
- |
- EXPECT_CALL(*context_, enable(GL_SCISSOR_TEST)) |
- .Times(0); |
- |
- EXPECT_CALL(*context_, scissor(_, _, _, _)) |
- .Times(0); |
- } |
-}; |
- |
-TEST_F(LayerTreeHostImplTest, NoPartialSwap) { |
- std::unique_ptr<MockContext> mock_context_owned(new MockContext); |
- MockContext* mock_context = mock_context_owned.get(); |
- MockContextHarness harness(mock_context); |
- |
- // Run test case |
- LayerTreeSettings settings = DefaultSettings(); |
- settings.renderer_settings.partial_swap_enabled = false; |
- CreateHostImpl(settings, |
- FakeOutputSurface::Create3d(std::move(mock_context_owned))); |
- SetupRootLayerImpl(FakeLayerWithQuads::Create(host_impl_->active_tree(), 1)); |
- host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
- |
- // Without partial swap, and no clipping, no scissor is set. |
- harness.MustDrawSolidQuad(); |
- harness.MustSetNoScissor(); |
- { |
- LayerTreeHostImpl::FrameData frame; |
- EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
- host_impl_->DrawLayers(&frame); |
- host_impl_->DidDrawAllLayers(frame); |
- } |
- Mock::VerifyAndClearExpectations(&mock_context); |
- |
- // Without partial swap, but a layer does clip its subtree, one scissor is |
- // set. |
- auto* root = host_impl_->active_tree()->root_layer_for_testing(); |
- root->SetMasksToBounds(true); |
- host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
- root->NoteLayerPropertyChanged(); |
- harness.MustDrawSolidQuad(); |
- harness.MustSetScissor(0, 0, 10, 10); |
- { |
- LayerTreeHostImpl::FrameData frame; |
- EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
- host_impl_->DrawLayers(&frame); |
- host_impl_->DidDrawAllLayers(frame); |
- } |
- Mock::VerifyAndClearExpectations(&mock_context); |
-} |
- |
-TEST_F(LayerTreeHostImplTest, PartialSwap) { |
- std::unique_ptr<MockContext> context_owned(new MockContext); |
- MockContext* mock_context = context_owned.get(); |
- MockContextHarness harness(mock_context); |
- |
- LayerTreeSettings settings = DefaultSettings(); |
- settings.renderer_settings.partial_swap_enabled = true; |
- CreateHostImpl(settings, |
- FakeOutputSurface::Create3d(std::move(context_owned))); |
- SetupRootLayerImpl(FakeLayerWithQuads::Create(host_impl_->active_tree(), 1)); |
- host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
- |
- // The first frame is not a partially-swapped one. No scissor should be set. |
- harness.MustSetNoScissor(); |
- harness.MustDrawSolidQuad(); |
- { |
- LayerTreeHostImpl::FrameData frame; |
- EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
- host_impl_->DrawLayers(&frame); |
- host_impl_->DidDrawAllLayers(frame); |
- } |
- Mock::VerifyAndClearExpectations(&mock_context); |
- |
- // Damage a portion of the frame. |
- auto* root = host_impl_->active_tree()->root_layer_for_testing(); |
- root->SetUpdateRect(gfx::Rect(0, 0, 2, 3)); |
- host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
- |
- // The second frame will be partially-swapped (the y coordinates are flipped). |
- harness.MustSetScissor(0, 7, 2, 3); |
- harness.MustDrawSolidQuad(); |
- { |
- LayerTreeHostImpl::FrameData frame; |
- EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
- host_impl_->DrawLayers(&frame); |
- host_impl_->DidDrawAllLayers(frame); |
- } |
- Mock::VerifyAndClearExpectations(&mock_context); |
-} |
- |
static std::unique_ptr<LayerTreeHostImpl> SetupLayersForOpacity( |
LayerTreeSettings settings, |
bool partial_swap, |
@@ -7454,7 +7252,7 @@ TEST_F(LayerTreeHostImplTest, ContributingLayerEmptyScissorPartialSwap) { |
provider->BindToCurrentThread(); |
provider->TestContext3d()->set_have_post_sub_buffer(true); |
std::unique_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(provider)); |
+ FakeOutputSurface::CreateDelegating3d(provider)); |
std::unique_ptr<LayerTreeHostImpl> my_host_impl = SetupLayersForOpacity( |
DefaultSettings(), true, this, &task_runner_provider_, |
&shared_bitmap_manager, &task_graph_runner, &stats_instrumentation_, |
@@ -7485,7 +7283,7 @@ TEST_F(LayerTreeHostImplTest, ContributingLayerEmptyScissorNoPartialSwap) { |
provider->BindToCurrentThread(); |
provider->TestContext3d()->set_have_post_sub_buffer(true); |
std::unique_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(provider)); |
+ FakeOutputSurface::CreateDelegating3d(provider)); |
std::unique_ptr<LayerTreeHostImpl> my_host_impl = SetupLayersForOpacity( |
DefaultSettings(), false, this, &task_runner_provider_, |
&shared_bitmap_manager, &task_graph_runner, &stats_instrumentation_, |
@@ -7514,7 +7312,7 @@ TEST_F(LayerTreeHostImplTest, LayersFreeTextures) { |
TestWebGraphicsContext3D::Create(); |
TestWebGraphicsContext3D* context3d = context.get(); |
std::unique_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(std::move(context))); |
+ FakeOutputSurface::CreateDelegating3d(std::move(context))); |
CreateHostImpl(DefaultSettings(), std::move(output_surface)); |
std::unique_ptr<LayerImpl> root_layer = |
@@ -7562,15 +7360,6 @@ class MockDrawQuadsToFillScreenContext : public TestWebGraphicsContext3D { |
}; |
TEST_F(LayerTreeHostImplTest, HasTransparentBackground) { |
- std::unique_ptr<MockDrawQuadsToFillScreenContext> mock_context_owned( |
- new MockDrawQuadsToFillScreenContext); |
- MockDrawQuadsToFillScreenContext* mock_context = mock_context_owned.get(); |
- |
- // Run test case |
- LayerTreeSettings settings = DefaultSettings(); |
- settings.renderer_settings.partial_swap_enabled = false; |
- CreateHostImpl(settings, |
- FakeOutputSurface::Create3d(std::move(mock_context_owned))); |
SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1)); |
host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
@@ -7578,23 +7367,31 @@ TEST_F(LayerTreeHostImplTest, HasTransparentBackground) { |
// Verify one quad is drawn when transparent background set is not set. |
host_impl_->active_tree()->set_has_transparent_background(false); |
- EXPECT_CALL(*mock_context, useProgram(_)) |
- .Times(1); |
- EXPECT_CALL(*mock_context, drawElements(_, _, _, _)) |
- .Times(1); |
LayerTreeHostImpl::FrameData frame; |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
+ { |
+ const auto& root_pass = frame.render_passes.back(); |
+ ASSERT_EQ(1u, root_pass->quad_list.size()); |
+ EXPECT_EQ(DrawQuad::SOLID_COLOR, root_pass->quad_list.front()->material); |
+ } |
host_impl_->DrawLayers(&frame); |
host_impl_->DidDrawAllLayers(frame); |
- Mock::VerifyAndClearExpectations(&mock_context); |
+ host_impl_->SwapBuffers(frame); |
+ |
+ // Cause damage so we would draw something if possible. |
+ host_impl_->SetFullRootLayerDamage(); |
// Verify no quads are drawn when transparent background is set. |
host_impl_->active_tree()->set_has_transparent_background(true); |
host_impl_->SetFullRootLayerDamage(); |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
+ { |
+ const auto& root_pass = frame.render_passes.back(); |
+ ASSERT_EQ(0u, root_pass->quad_list.size()); |
+ } |
host_impl_->DrawLayers(&frame); |
host_impl_->DidDrawAllLayers(frame); |
- Mock::VerifyAndClearExpectations(&mock_context); |
+ host_impl_->SwapBuffers(frame); |
} |
class LayerTreeHostImplTestWithDelegatingRenderer |
@@ -7810,44 +7607,11 @@ class CountingSoftwareDevice : public SoftwareOutputDevice { |
int frames_began_, frames_ended_; |
}; |
-TEST_F(LayerTreeHostImplTest, ForcedDrawToSoftwareDeviceBasicRender) { |
- // No main thread evictions in resourceless software mode. |
- set_reduce_memory_result(false); |
- CountingSoftwareDevice* software_device = new CountingSoftwareDevice(); |
- EXPECT_TRUE(CreateHostImpl( |
- DefaultSettings(), |
- FakeOutputSurface::CreateSoftware(base::WrapUnique(software_device)))); |
- host_impl_->SetViewportSize(gfx::Size(50, 50)); |
- |
- SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
- |
- const gfx::Transform external_transform; |
- const gfx::Rect external_viewport; |
- const gfx::Rect external_clip; |
- const bool resourceless_software_draw = true; |
- host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
- external_transform); |
- |
- EXPECT_EQ(0, software_device->frames_began_); |
- EXPECT_EQ(0, software_device->frames_ended_); |
- |
- host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
- resourceless_software_draw); |
- |
- EXPECT_EQ(1, software_device->frames_began_); |
- EXPECT_EQ(1, software_device->frames_ended_); |
- |
- // Call another API method that is likely to hit nullptr in this mode. |
- std::unique_ptr<base::trace_event::TracedValue> state( |
- new base::trace_event::TracedValue()); |
- host_impl_->ActivationStateAsValueInto(state.get()); |
-} |
- |
TEST_F(LayerTreeHostImplTest, |
ForcedDrawToSoftwareDeviceSkipsUnsupportedLayers) { |
set_reduce_memory_result(false); |
EXPECT_TRUE(CreateHostImpl( |
- DefaultSettings(), FakeOutputSurface::CreateSoftware( |
+ DefaultSettings(), FakeOutputSurface::CreateDelegatingSoftware( |
base::WrapUnique(new CountingSoftwareDevice)))); |
const gfx::Transform external_transform; |
@@ -7892,7 +7656,7 @@ TEST_F(LayerTreeHostImplTest, DefaultMemoryAllocation) { |
AnimationHost::CreateForTesting(ThreadInstance::IMPL), 0); |
output_surface_ = |
- FakeOutputSurface::Create3d(TestWebGraphicsContext3D::Create()); |
+ FakeOutputSurface::CreateDelegating3d(TestWebGraphicsContext3D::Create()); |
host_impl_->SetVisible(true); |
host_impl_->InitializeRenderer(output_surface_.get()); |
EXPECT_LT(0ul, host_impl_->memory_allocation_limit_bytes()); |
@@ -7977,7 +7741,7 @@ TEST_F(LayerTreeHostImplTest, UIResourceManagement) { |
TestWebGraphicsContext3D::Create(); |
TestWebGraphicsContext3D* context3d = context.get(); |
std::unique_ptr<FakeOutputSurface> output_surface = |
- FakeOutputSurface::Create3d(); |
+ FakeOutputSurface::CreateDelegating3d(); |
CreateHostImpl(DefaultSettings(), std::move(output_surface)); |
EXPECT_EQ(0u, context3d->NumTextures()); |
@@ -8020,7 +7784,7 @@ TEST_F(LayerTreeHostImplTest, CreateETC1UIResource) { |
std::unique_ptr<TestWebGraphicsContext3D> context = |
TestWebGraphicsContext3D::Create(); |
TestWebGraphicsContext3D* context3d = context.get(); |
- CreateHostImpl(DefaultSettings(), FakeOutputSurface::Create3d()); |
+ CreateHostImpl(DefaultSettings(), FakeOutputSurface::CreateDelegating3d()); |
EXPECT_EQ(0u, context3d->NumTextures()); |
@@ -8047,8 +7811,13 @@ TEST_F(LayerTreeHostImplTest, ShutdownReleasesContext) { |
scoped_refptr<TestContextProvider> context_provider = |
TestContextProvider::Create(); |
- CreateHostImpl(DefaultSettings(), |
- FakeOutputSurface::Create3d(context_provider)); |
+ CreateHostImpl( |
+ DefaultSettings(), |
+ base::MakeUnique<TestDelegatingOutputSurface>( |
+ context_provider, TestContextProvider::CreateWorker(), |
+ FakeOutputSurface::Create3d(context_provider), nullptr, nullptr, |
+ RendererSettings(), base::ThreadTaskRunnerHandle::Get().get(), |
+ true /* synchronous_composite */)); |
SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1)); |
@@ -8062,6 +7831,7 @@ TEST_F(LayerTreeHostImplTest, ShutdownReleasesContext) { |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
host_impl_->DrawLayers(&frame); |
host_impl_->DidDrawAllLayers(frame); |
+ host_impl_->SwapBuffers(frame); |
// The CopyOutputResult's callback has a ref on the ContextProvider and a |
// texture in a texture mailbox. |
@@ -10787,7 +10557,8 @@ TEST_F(LayerTreeHostImplTest, GpuRasterizationStatusModes) { |
LayerTreeSettings msaaSettings = GpuRasterizationEnabledSettings(); |
msaaSettings.gpu_rasterization_msaa_sample_count = 4; |
EXPECT_TRUE(CreateHostImpl( |
- msaaSettings, FakeOutputSurface::Create3d(std::move(context_with_msaa)))); |
+ msaaSettings, |
+ FakeOutputSurface::CreateDelegating3d(std::move(context_with_msaa)))); |
host_impl_->SetHasGpuRasterizationTrigger(true); |
host_impl_->SetContentIsSuitableForGpuRasterization(false); |
EXPECT_EQ(GpuRasterizationStatus::MSAA_CONTENT, |
@@ -10797,7 +10568,8 @@ TEST_F(LayerTreeHostImplTest, GpuRasterizationStatusModes) { |
LayerTreeSettings settings = DefaultSettings(); |
settings.gpu_rasterization_enabled = false; |
- EXPECT_TRUE(CreateHostImpl(settings, FakeOutputSurface::Create3d())); |
+ EXPECT_TRUE( |
+ CreateHostImpl(settings, FakeOutputSurface::CreateDelegating3d())); |
host_impl_->SetHasGpuRasterizationTrigger(true); |
host_impl_->SetContentIsSuitableForGpuRasterization(true); |
EXPECT_EQ(GpuRasterizationStatus::OFF_DEVICE, |
@@ -10805,7 +10577,8 @@ TEST_F(LayerTreeHostImplTest, GpuRasterizationStatusModes) { |
EXPECT_FALSE(host_impl_->use_gpu_rasterization()); |
settings.gpu_rasterization_forced = true; |
- EXPECT_TRUE(CreateHostImpl(settings, FakeOutputSurface::Create3d())); |
+ EXPECT_TRUE( |
+ CreateHostImpl(settings, FakeOutputSurface::CreateDelegating3d())); |
host_impl_->SetHasGpuRasterizationTrigger(false); |
host_impl_->SetContentIsSuitableForGpuRasterization(false); |
@@ -10824,7 +10597,7 @@ class MsaaIsSlowLayerTreeHostImplTest : public LayerTreeHostImplTest { |
context_provider->UnboundTestContext3d()->SetMaxSamples(4); |
context_provider->UnboundTestContext3d()->set_msaa_is_slow(msaa_is_slow); |
auto msaa_is_normal_output_surface = |
- FakeOutputSurface::Create3d(context_provider); |
+ FakeOutputSurface::CreateDelegating3d(context_provider); |
EXPECT_TRUE( |
CreateHostImpl(settings, std::move(msaa_is_normal_output_surface))); |
} |
@@ -11046,12 +10819,12 @@ TEST_F(LayerTreeHostImplTest, RecomputeGpuRasterOnOutputSurfaceChange) { |
// InitializeRenderer with a gpu-raster enabled output surface. |
auto gpu_raster_output_surface = |
- FakeOutputSurface::Create3d(TestWebGraphicsContext3D::Create()); |
+ FakeOutputSurface::CreateDelegating3d(TestWebGraphicsContext3D::Create()); |
host_impl_->InitializeRenderer(gpu_raster_output_surface.get()); |
EXPECT_TRUE(host_impl_->use_gpu_rasterization()); |
// Re-initialize with a software output surface. |
- output_surface_ = FakeOutputSurface::CreateSoftware( |
+ output_surface_ = FakeOutputSurface::CreateDelegatingSoftware( |
base::WrapUnique(new SoftwareOutputDevice)); |
host_impl_->InitializeRenderer(output_surface_.get()); |
EXPECT_FALSE(host_impl_->use_gpu_rasterization()); |