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..b0b2d32f8b4fd78f4aea32b85d843dc85728f580 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" |
@@ -2329,11 +2330,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 +2618,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 +2658,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 +2771,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 +2799,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 +2842,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 +2858,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 +4656,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 +4701,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 +5230,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 +5303,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 +6008,7 @@ class LayerTreeHostTestOneActivatePerPrepareTiles : public LayerTreeHostTest { |
EndTestAfterDelayMs(100); |
} |
- void ScheduledActionPrepareTiles() override { |
+ void WillPrepareTilesOnThread(LayerTreeHostImpl* impl) override { |
++scheduled_prepare_tiles_count_; |
} |
@@ -6037,7 +6063,7 @@ class LayerTreeHostTestActivationCausesPrepareTiles : public LayerTreeHostTest { |
EndTest(); |
} |
- void ScheduledActionPrepareTiles() override { |
+ void WillPrepareTilesOnThread(LayerTreeHostImpl* impl) override { |
++scheduled_prepare_tiles_count_; |
} |