| Index: cc/trees/layer_tree_host_unittest.cc
|
| diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
|
| index 711366c095ef51691e74f5b4efbb2e7b85670df6..1e3ac1b62b6925ea4bc467147d527db5a135619d 100644
|
| --- a/cc/trees/layer_tree_host_unittest.cc
|
| +++ b/cc/trees/layer_tree_host_unittest.cc
|
| @@ -50,6 +50,7 @@
|
| #include "cc/test/test_shared_bitmap_manager.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_host_impl.h"
|
| #include "cc/trees/layer_tree_impl.h"
|
| #include "cc/trees/single_thread_proxy.h"
|
| @@ -147,6 +148,7 @@ class LayerTreeHostTestFrameOrdering : public LayerTreeHostTest {
|
|
|
| enum ImplOrder : int {
|
| IMPL_START = 1,
|
| + IMPL_READY_TO_COMMIT,
|
| IMPL_COMMIT,
|
| IMPL_COMMIT_COMPLETE,
|
| IMPL_ACTIVATE,
|
| @@ -177,6 +179,10 @@ class LayerTreeHostTestFrameOrdering : public LayerTreeHostTest {
|
| EXPECT_TRUE(CheckStep(MAIN_DID_BEGIN_FRAME, &main_));
|
| }
|
|
|
| + void ReadyToCommitOnThread(LayerTreeHostImpl* impl) override {
|
| + EXPECT_TRUE(CheckStep(IMPL_READY_TO_COMMIT, &impl_));
|
| + }
|
| +
|
| void BeginCommitOnThread(LayerTreeHostImpl* impl) override {
|
| EXPECT_TRUE(CheckStep(IMPL_COMMIT, &impl_));
|
| }
|
| @@ -2329,11 +2335,11 @@ class LayerTreeHostTestDeferCommits : public LayerTreeHostTest {
|
| }
|
| }
|
|
|
| - void ScheduledActionSendBeginMainFrame() override {
|
| + void WillBeginMainFrame() override {
|
| num_send_begin_main_frame_++;
|
| switch (num_send_begin_main_frame_) {
|
| case 1:
|
| - PostSetDeferCommitsToMainThread(true);
|
| + layer_tree_host()->SetDeferCommits(true);
|
| break;
|
| case 2:
|
| EndTest();
|
| @@ -2617,6 +2623,38 @@ class LayerTreeHostTestAbortedCommitDoesntStall : public LayerTreeHostTest {
|
| int commit_complete_count_;
|
| };
|
|
|
| +class OnDrawOutputSurface : public OutputSurface {
|
| + public:
|
| + explicit OnDrawOutputSurface(base::Closure invalidate_callback)
|
| + : OutputSurface(TestContextProvider::Create(),
|
| + TestContextProvider::CreateWorker(),
|
| + nullptr),
|
| + invalidate_callback_(std::move(invalidate_callback)) {
|
| + capabilities_.delegated_rendering = true;
|
| + }
|
| +
|
| + // OutputSurface implementation.
|
| + void SwapBuffers(CompositorFrame frame) override { did_swap_ = true; }
|
| + uint32_t GetFramebufferCopyTextureFormat() override { return 0; }
|
| + void Invalidate() override { invalidate_callback_.Run(); }
|
| +
|
| + void OnDraw(bool resourceless_software_draw) {
|
| + gfx::Transform identity;
|
| + gfx::Rect empty_rect;
|
| + // SwapBuffers happens inside of OnDraw.
|
| + client_->OnDraw(identity, empty_rect, empty_rect,
|
| + resourceless_software_draw);
|
| + if (did_swap_) {
|
| + did_swap_ = false;
|
| + client_->DidSwapBuffersComplete();
|
| + }
|
| + }
|
| +
|
| + private:
|
| + bool did_swap_ = false;
|
| + base::Closure invalidate_callback_;
|
| +};
|
| +
|
| class LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor
|
| : public LayerTreeHostTestAbortedCommitDoesntStall {
|
| protected:
|
| @@ -2625,28 +2663,28 @@ class LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor
|
| settings->using_synchronous_renderer_compositor = true;
|
| }
|
|
|
| - void ScheduledActionInvalidateOutputSurface() override {
|
| - // Do not call ImplThreadTaskRunner after the test ended because of the
|
| - // possibility of use-after-free due to a race.
|
| - if (TestEnded())
|
| - return;
|
| - ImplThreadTaskRunner()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(
|
| - &LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor::
|
| - CallOnDraw,
|
| - base::Unretained(this)));
|
| + std::unique_ptr<OutputSurface> CreateOutputSurface() override {
|
| + auto output_surface = base::MakeUnique<OnDrawOutputSurface>(base::Bind(
|
| + &LayerTreeHostTestAbortedCommitDoesntStallSynchronousCompositor::
|
| + CallOnDraw,
|
| + base::Unretained(this)));
|
| + output_surface_ = output_surface.get();
|
| + return std::move(output_surface);
|
| }
|
|
|
| void CallOnDraw() {
|
| - // Synchronous compositor does not draw unless told to do so by the output
|
| - // surface.
|
| - gfx::Transform identity;
|
| - gfx::Rect empty_rect;
|
| - bool resourceless_software_draw = false;
|
| - fake_output_surface()->client()->OnDraw(identity, empty_rect, empty_rect,
|
| - resourceless_software_draw);
|
| + if (!TestEnded()) {
|
| + // Synchronous compositor does not draw unless told to do so by the output
|
| + // surface. But it needs to be done on a new stack frame.
|
| + bool resourceless_software_draw = false;
|
| + ImplThreadTaskRunner()->PostTask(
|
| + FROM_HERE, base::Bind(&OnDrawOutputSurface::OnDraw,
|
| + base::Unretained(output_surface_),
|
| + resourceless_software_draw));
|
| + }
|
| }
|
| +
|
| + OnDrawOutputSurface* output_surface_ = nullptr;
|
| };
|
|
|
| MULTI_THREAD_TEST_F(
|
| @@ -2738,7 +2776,7 @@ class LayerTreeHostTestNumFramesPending : public LayerTreeHostTest {
|
| SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNumFramesPending);
|
|
|
| class LayerTreeHostTestResourcelessSoftwareDraw : public LayerTreeHostTest {
|
| - public:
|
| + protected:
|
| void InitializeSettings(LayerTreeSettings* settings) override {
|
| settings->using_synchronous_renderer_compositor = true;
|
| }
|
| @@ -2766,36 +2804,27 @@ class LayerTreeHostTestResourcelessSoftwareDraw : public LayerTreeHostTest {
|
| }
|
|
|
| std::unique_ptr<OutputSurface> CreateOutputSurface() override {
|
| - auto output_surface = delegating_renderer()
|
| - ? FakeOutputSurface::CreateDelegatingSoftware(
|
| - base::WrapUnique(new SoftwareOutputDevice))
|
| - : FakeOutputSurface::CreateSoftware(
|
| - base::WrapUnique(new SoftwareOutputDevice));
|
| - software_output_surface_ = output_surface.get();
|
| + auto output_surface = base::MakeUnique<OnDrawOutputSurface>(
|
| + base::Bind(&LayerTreeHostTestResourcelessSoftwareDraw::CallOnDraw,
|
| + base::Unretained(this)));
|
| + output_surface_ = output_surface.get();
|
| return std::move(output_surface);
|
| }
|
|
|
| void BeginTest() override {
|
| PostSetNeedsCommitToMainThread();
|
| - swap_count_ = 0;
|
| - }
|
| -
|
| - void ScheduledActionInvalidateOutputSurface() override {
|
| - if (TestEnded())
|
| - return;
|
| -
|
| - ImplThreadTaskRunner()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&LayerTreeHostTestResourcelessSoftwareDraw::CallOnDraw,
|
| - base::Unretained(this)));
|
| }
|
|
|
| void CallOnDraw() {
|
| - gfx::Transform identity;
|
| - gfx::Rect empty_rect;
|
| - bool resourceless_software_draw = true;
|
| - software_output_surface_->client()->OnDraw(identity, empty_rect, empty_rect,
|
| - resourceless_software_draw);
|
| + if (!TestEnded()) {
|
| + // Synchronous compositor does not draw unless told to do so by the output
|
| + // surface. But it needs to be done on a new stack frame.
|
| + bool resourceless_software_draw = true;
|
| + ImplThreadTaskRunner()->PostTask(
|
| + FROM_HERE, base::Bind(&OnDrawOutputSurface::OnDraw,
|
| + base::Unretained(output_surface_),
|
| + resourceless_software_draw));
|
| + }
|
| }
|
|
|
| DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
|
| @@ -2818,8 +2847,8 @@ class LayerTreeHostTestResourcelessSoftwareDraw : public LayerTreeHostTest {
|
| }
|
|
|
| void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
|
| - swap_count_++;
|
| - switch (swap_count_) {
|
| + draw_count_++;
|
| + switch (draw_count_) {
|
| case 1:
|
| host_impl->SetNeedsRedraw();
|
| break;
|
| @@ -2834,12 +2863,12 @@ class LayerTreeHostTestResourcelessSoftwareDraw : public LayerTreeHostTest {
|
| void AfterTest() override {}
|
|
|
| private:
|
| - FakeOutputSurface* software_output_surface_ = nullptr;
|
| + OnDrawOutputSurface* output_surface_ = nullptr;
|
| FakeContentLayerClient client_;
|
| scoped_refptr<Layer> root_layer_;
|
| scoped_refptr<Layer> parent_layer_;
|
| scoped_refptr<Layer> child_layer_;
|
| - int swap_count_;
|
| + int draw_count_ = 0;
|
| };
|
|
|
| // Resourceless is not used for SingleThreadProxy, so it is unimplemented.
|
| @@ -4632,7 +4661,8 @@ class LayerTreeHostTestBreakSwapPromiseForVisibility
|
| layer_tree_host()->QueueSwapPromise(std::move(swap_promise));
|
| }
|
|
|
| - void ScheduledActionWillSendBeginMainFrame() override {
|
| + void WillBeginImplFrameOnThread(LayerTreeHostImpl* impl,
|
| + const BeginFrameArgs& args) override {
|
| MainThreadTaskRunner()->PostTask(
|
| FROM_HERE,
|
| base::Bind(&LayerTreeHostTestBreakSwapPromiseForVisibility
|
| @@ -4676,7 +4706,8 @@ class LayerTreeHostTestBreakSwapPromiseForContext : public LayerTreeHostTest {
|
| layer_tree_host()->QueueSwapPromise(std::move(swap_promise));
|
| }
|
|
|
| - void ScheduledActionWillSendBeginMainFrame() override {
|
| + void WillBeginImplFrameOnThread(LayerTreeHostImpl* impl,
|
| + const BeginFrameArgs& args) override {
|
| if (output_surface_lost_triggered_)
|
| return;
|
| output_surface_lost_triggered_ = true;
|
| @@ -5204,7 +5235,7 @@ class LayerTreeHostTestWillBeginImplFrameHasDidFinishImplFrame
|
| PostSetNeedsCommitToMainThread();
|
| }
|
|
|
| - void SendBeginMainFrameNotExpectedSoon() override { EndTest(); }
|
| + void BeginMainFrameNotExpectedSoon() override { EndTest(); }
|
|
|
| void AfterTest() override {
|
| EXPECT_GT(will_begin_impl_frame_count_, 0);
|
| @@ -5277,7 +5308,7 @@ class LayerTreeHostTestBeginMainFrameTimeIsAlsoImplTime
|
| EXPECT_PRED_FORMAT2(AssertFrameTimeContained, impl_frame_args_, args);
|
| }
|
|
|
| - void SendBeginMainFrameNotExpectedSoon() override { EndTest(); }
|
| + void BeginMainFrameNotExpectedSoon() override { EndTest(); }
|
|
|
| void AfterTest() override {
|
| EXPECT_GT(impl_frame_args_.size(), 0U);
|
| @@ -5982,7 +6013,7 @@ class LayerTreeHostTestOneActivatePerPrepareTiles : public LayerTreeHostTest {
|
| EndTestAfterDelayMs(100);
|
| }
|
|
|
| - void ScheduledActionPrepareTiles() override {
|
| + void WillPrepareTilesOnThread(LayerTreeHostImpl* impl) override {
|
| ++scheduled_prepare_tiles_count_;
|
| }
|
|
|
| @@ -6037,7 +6068,7 @@ class LayerTreeHostTestActivationCausesPrepareTiles : public LayerTreeHostTest {
|
| EndTest();
|
| }
|
|
|
| - void ScheduledActionPrepareTiles() override {
|
| + void WillPrepareTilesOnThread(LayerTreeHostImpl* impl) override {
|
| ++scheduled_prepare_tiles_count_;
|
| }
|
|
|
| @@ -6692,71 +6723,6 @@ class LayerTreeTestPageScaleFlags : public LayerTreeTest {
|
|
|
| SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeTestPageScaleFlags);
|
|
|
| -class LayerTreeHostScrollingAndScalingUpdatesLayers : public LayerTreeHostTest {
|
| - public:
|
| - LayerTreeHostScrollingAndScalingUpdatesLayers()
|
| - : requested_update_layers_(false), commit_count_(0) {}
|
| -
|
| - void SetupTree() override {
|
| - LayerTreeHostTest::SetupTree();
|
| - Layer* root_layer = layer_tree_host()->root_layer();
|
| - scoped_refptr<Layer> scroll_layer = Layer::Create();
|
| - CreateVirtualViewportLayers(root_layer, scroll_layer, root_layer->bounds(),
|
| - root_layer->bounds(), layer_tree_host());
|
| - }
|
| -
|
| - void BeginTest() override {
|
| - LayerTreeHostCommon::ScrollUpdateInfo scroll;
|
| - scroll.layer_id = layer_tree_host()->root_layer()->id();
|
| - scroll.scroll_delta = gfx::Vector2d(0, 33);
|
| - scroll_info_.scrolls.push_back(scroll);
|
| -
|
| - scale_info_.page_scale_delta = 2.71f;
|
| -
|
| - PostSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - void BeginMainFrame(const BeginFrameArgs& args) override {
|
| - switch (commit_count_) {
|
| - case 0:
|
| - requested_update_layers_ = false;
|
| - layer_tree_host()->ApplyScrollAndScale(&no_op_info_);
|
| - EXPECT_FALSE(requested_update_layers_);
|
| - break;
|
| - case 1:
|
| - requested_update_layers_ = false;
|
| - layer_tree_host()->ApplyScrollAndScale(&scale_info_);
|
| - EXPECT_TRUE(requested_update_layers_);
|
| - break;
|
| - case 2:
|
| - requested_update_layers_ = false;
|
| - layer_tree_host()->ApplyScrollAndScale(&scroll_info_);
|
| - EXPECT_TRUE(requested_update_layers_);
|
| - EndTest();
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - }
|
| -
|
| - void DidSetNeedsUpdateLayers() override { requested_update_layers_ = true; }
|
| -
|
| - void DidCommit() override {
|
| - if (++commit_count_ < 3)
|
| - PostSetNeedsCommitToMainThread();
|
| - }
|
| -
|
| - void AfterTest() override {}
|
| -
|
| - ScrollAndScaleSet scroll_info_;
|
| - ScrollAndScaleSet scale_info_;
|
| - ScrollAndScaleSet no_op_info_;
|
| - bool requested_update_layers_;
|
| - int commit_count_;
|
| -};
|
| -
|
| -MULTI_THREAD_TEST_F(LayerTreeHostScrollingAndScalingUpdatesLayers);
|
| -
|
| class LayerTreeHostTestDestroyWhileInitializingOutputSurface
|
| : public LayerTreeHostTest {
|
| protected:
|
|
|