Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(265)

Side by Side Diff: cc/surfaces/display_unittest.cc

Issue 1821863002: Hook up ui::Compositor to Display's BeginFrameSource (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix Display member destruction order Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/surfaces/display_scheduler.cc ('k') | cc/surfaces/onscreen_display_client.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/surfaces/display.h" 5 #include "cc/surfaces/display.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/test/null_task_runner.h" 9 #include "base/test/null_task_runner.h"
10 #include "cc/output/compositor_frame.h" 10 #include "cc/output/compositor_frame.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 TestSoftwareOutputDevice() {} 50 TestSoftwareOutputDevice() {}
51 51
52 gfx::Rect damage_rect() const { return damage_rect_; } 52 gfx::Rect damage_rect() const { return damage_rect_; }
53 gfx::Size viewport_pixel_size() const { return viewport_pixel_size_; } 53 gfx::Size viewport_pixel_size() const { return viewport_pixel_size_; }
54 }; 54 };
55 55
56 class DisplayTest : public testing::Test { 56 class DisplayTest : public testing::Test {
57 public: 57 public:
58 DisplayTest() 58 DisplayTest()
59 : factory_(&manager_, &surface_factory_client_), 59 : factory_(&manager_, &surface_factory_client_),
60 id_allocator_(kArbitrarySurfaceNamespace),
60 software_output_device_(nullptr), 61 software_output_device_(nullptr),
61 task_runner_(new base::NullTaskRunner) {} 62 task_runner_(new base::NullTaskRunner) {
63 id_allocator_.RegisterSurfaceIdNamespace(&manager_);
64 }
62 65
63 protected: 66 protected:
64 void SetUpContext(std::unique_ptr<TestWebGraphicsContext3D> context) { 67 void SetUpContext(std::unique_ptr<TestWebGraphicsContext3D> context) {
65 if (context) { 68 if (context) {
66 output_surface_ = FakeOutputSurface::Create3d( 69 output_surface_ = FakeOutputSurface::Create3d(
67 TestContextProvider::Create(std::move(context))); 70 TestContextProvider::Create(std::move(context)));
68 } else { 71 } else {
69 std::unique_ptr<TestSoftwareOutputDevice> output_device( 72 std::unique_ptr<TestSoftwareOutputDevice> output_device(
70 new TestSoftwareOutputDevice); 73 new TestSoftwareOutputDevice);
71 software_output_device_ = output_device.get(); 74 software_output_device_ = output_device.get();
72 output_surface_ = 75 output_surface_ =
73 FakeOutputSurface::CreateSoftware(std::move(output_device)); 76 FakeOutputSurface::CreateSoftware(std::move(output_device));
74 } 77 }
75 shared_bitmap_manager_.reset(new TestSharedBitmapManager); 78 shared_bitmap_manager_.reset(new TestSharedBitmapManager);
76 output_surface_ptr_ = output_surface_.get(); 79 output_surface_ptr_ = output_surface_.get();
77 } 80 }
78 81
79 void SubmitCompositorFrame(RenderPassList* pass_list, SurfaceId surface_id) { 82 void SubmitCompositorFrame(RenderPassList* pass_list, SurfaceId surface_id) {
80 std::unique_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); 83 std::unique_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData);
81 pass_list->swap(frame_data->render_pass_list); 84 pass_list->swap(frame_data->render_pass_list);
82 85
83 std::unique_ptr<CompositorFrame> frame(new CompositorFrame); 86 std::unique_ptr<CompositorFrame> frame(new CompositorFrame);
84 frame->delegated_frame_data = std::move(frame_data); 87 frame->delegated_frame_data = std::move(frame_data);
85 88
86 factory_.SubmitCompositorFrame(surface_id, std::move(frame), 89 factory_.SubmitCompositorFrame(surface_id, std::move(frame),
87 SurfaceFactory::DrawCallback()); 90 SurfaceFactory::DrawCallback());
88 } 91 }
89 92
93 enum { kArbitrarySurfaceNamespace = 3 };
94
90 SurfaceManager manager_; 95 SurfaceManager manager_;
91 FakeSurfaceFactoryClient surface_factory_client_; 96 FakeSurfaceFactoryClient surface_factory_client_;
92 SurfaceFactory factory_; 97 SurfaceFactory factory_;
98 SurfaceIdAllocator id_allocator_;
93 TestSoftwareOutputDevice* software_output_device_; 99 TestSoftwareOutputDevice* software_output_device_;
94 std::unique_ptr<FakeOutputSurface> output_surface_; 100 std::unique_ptr<FakeOutputSurface> output_surface_;
95 FakeOutputSurface* output_surface_ptr_; 101 FakeOutputSurface* output_surface_ptr_;
96 FakeBeginFrameSource fake_begin_frame_source_;
97 scoped_refptr<base::NullTaskRunner> task_runner_; 102 scoped_refptr<base::NullTaskRunner> task_runner_;
98 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; 103 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_;
99 }; 104 };
100 105
101 class TestDisplayClient : public DisplayClient { 106 class TestDisplayClient : public DisplayClient {
102 public: 107 public:
103 TestDisplayClient() {} 108 TestDisplayClient() {}
104 ~TestDisplayClient() override {} 109 ~TestDisplayClient() override {}
105 110
106 void CommitVSyncParameters(base::TimeTicks timebase,
107 base::TimeDelta interval) override {}
108 void OutputSurfaceLost() override {} 111 void OutputSurfaceLost() override {}
109 void SetMemoryPolicy(const ManagedMemoryPolicy& policy) override {} 112 void SetMemoryPolicy(const ManagedMemoryPolicy& policy) override {}
110 }; 113 };
111 114
112 class TestDisplayScheduler : public DisplayScheduler { 115 class TestDisplayScheduler : public DisplayScheduler {
113 public: 116 public:
114 TestDisplayScheduler(DisplaySchedulerClient* client, 117 TestDisplayScheduler(DisplaySchedulerClient* client,
115 BeginFrameSource* begin_frame_source, 118 BeginFrameSource* begin_frame_source,
116 base::NullTaskRunner* task_runner) 119 base::SingleThreadTaskRunner* task_runner)
117 : DisplayScheduler(client, begin_frame_source, task_runner, 1), 120 : DisplayScheduler(client, begin_frame_source, task_runner, 1),
118 damaged(false), 121 damaged(false),
119 display_resized_(false), 122 display_resized_(false),
120 has_new_root_surface(false), 123 has_new_root_surface(false),
121 swapped(false) { 124 swapped(false) {}
122 begin_frame_source_for_children_.reset(new FakeBeginFrameSource);
123 }
124 125
125 ~TestDisplayScheduler() override {} 126 ~TestDisplayScheduler() override {}
126 127
127 void DisplayResized() override { display_resized_ = true; } 128 void DisplayResized() override { display_resized_ = true; }
128 129
129 void SetNewRootSurface(SurfaceId root_surface_id) override { 130 void SetNewRootSurface(SurfaceId root_surface_id) override {
130 has_new_root_surface = true; 131 has_new_root_surface = true;
131 } 132 }
132 133
133 void SurfaceDamaged(SurfaceId surface_id) override { 134 void SurfaceDamaged(SurfaceId surface_id) override {
134 damaged = true; 135 damaged = true;
135 needs_draw_ = true; 136 needs_draw_ = true;
136 } 137 }
137 138
138 void DidSwapBuffers() override { swapped = true; } 139 void DidSwapBuffers() override { swapped = true; }
139 140
140 void ResetDamageForTest() { 141 void ResetDamageForTest() {
141 damaged = false; 142 damaged = false;
142 display_resized_ = false; 143 display_resized_ = false;
143 has_new_root_surface = false; 144 has_new_root_surface = false;
144 } 145 }
145 146
146 bool damaged; 147 bool damaged;
147 bool display_resized_; 148 bool display_resized_;
148 bool has_new_root_surface; 149 bool has_new_root_surface;
149 bool swapped; 150 bool swapped;
151
152 private:
153 RendererSettings settings_;
154 };
155
156 class TestDisplay : public Display {
157 public:
158 TestDisplay(DisplayClient* client,
159 SurfaceManager* manager,
160 SharedBitmapManager* bitmap_manager,
161 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
162 const RendererSettings& settings,
163 uint32_t compositor_surface_namespace)
164 : Display(client,
165 manager,
166 bitmap_manager,
167 gpu_memory_buffer_manager,
168 settings,
169 compositor_surface_namespace) {}
170
171 TestDisplayScheduler& scheduler() {
172 return *static_cast<TestDisplayScheduler*>(scheduler_.get());
173 }
174
175 protected:
176 void CreateScheduler(base::SingleThreadTaskRunner* task_runner) override {
177 scheduler_.reset(
178 new TestDisplayScheduler(this, vsync_begin_frame_source_, task_runner));
179 }
150 }; 180 };
151 181
152 void CopyCallback(bool* called, std::unique_ptr<CopyOutputResult> result) { 182 void CopyCallback(bool* called, std::unique_ptr<CopyOutputResult> result) {
153 *called = true; 183 *called = true;
154 } 184 }
155 185
156 // Check that frame is damaged and swapped only under correct conditions. 186 // Check that frame is damaged and swapped only under correct conditions.
157 TEST_F(DisplayTest, DisplayDamaged) { 187 TEST_F(DisplayTest, DisplayDamaged) {
158 SetUpContext(nullptr); 188 SetUpContext(nullptr);
159 TestDisplayClient client; 189 TestDisplayClient client;
160 RendererSettings settings; 190 RendererSettings settings;
161 settings.partial_swap_enabled = true; 191 settings.partial_swap_enabled = true;
162 settings.finish_rendering_on_resize = true; 192 settings.finish_rendering_on_resize = true;
163 Display display(&client, &manager_, shared_bitmap_manager_.get(), nullptr, 193 TestDisplay display(&client, &manager_, shared_bitmap_manager_.get(), nullptr,
164 settings); 194 settings, id_allocator_.id_namespace());
195 display.Initialize(std::move(output_surface_), task_runner_.get());
196 TestDisplayScheduler& scheduler = display.scheduler();
165 197
166 TestDisplayScheduler scheduler(&display, &fake_begin_frame_source_, 198 SurfaceId surface_id(id_allocator_.GenerateId());
167 task_runner_.get());
168 display.Initialize(std::move(output_surface_), &scheduler);
169
170 SurfaceId surface_id(7u);
171 EXPECT_FALSE(scheduler.damaged); 199 EXPECT_FALSE(scheduler.damaged);
172 EXPECT_FALSE(scheduler.has_new_root_surface); 200 EXPECT_FALSE(scheduler.has_new_root_surface);
173 display.SetSurfaceId(surface_id, 1.f); 201 display.SetSurfaceId(surface_id, 1.f);
174 EXPECT_FALSE(scheduler.damaged); 202 EXPECT_FALSE(scheduler.damaged);
175 EXPECT_FALSE(scheduler.display_resized_); 203 EXPECT_FALSE(scheduler.display_resized_);
176 EXPECT_TRUE(scheduler.has_new_root_surface); 204 EXPECT_TRUE(scheduler.has_new_root_surface);
177 205
178 scheduler.ResetDamageForTest(); 206 scheduler.ResetDamageForTest();
179 display.Resize(gfx::Size(100, 100)); 207 display.Resize(gfx::Size(100, 100));
180 EXPECT_FALSE(scheduler.damaged); 208 EXPECT_FALSE(scheduler.damaged);
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 public: 443 public:
416 MOCK_METHOD0(shallowFinishCHROMIUM, void()); 444 MOCK_METHOD0(shallowFinishCHROMIUM, void());
417 }; 445 };
418 446
419 TEST_F(DisplayTest, Finish) { 447 TEST_F(DisplayTest, Finish) {
420 std::unique_ptr<MockedContext> context(new MockedContext()); 448 std::unique_ptr<MockedContext> context(new MockedContext());
421 MockedContext* context_ptr = context.get(); 449 MockedContext* context_ptr = context.get();
422 SetUpContext(std::move(context)); 450 SetUpContext(std::move(context));
423 451
424 EXPECT_CALL(*context_ptr, shallowFinishCHROMIUM()).Times(0); 452 EXPECT_CALL(*context_ptr, shallowFinishCHROMIUM()).Times(0);
453
454 SurfaceId surface_id(id_allocator_.GenerateId());
455
425 TestDisplayClient client; 456 TestDisplayClient client;
426 RendererSettings settings; 457 RendererSettings settings;
427 settings.partial_swap_enabled = true; 458 settings.partial_swap_enabled = true;
428 settings.finish_rendering_on_resize = true; 459 settings.finish_rendering_on_resize = true;
429 Display display(&client, &manager_, shared_bitmap_manager_.get(), nullptr, 460 TestDisplay display(&client, &manager_, shared_bitmap_manager_.get(), nullptr,
430 settings); 461 settings, surface_id.id_namespace());
462 display.Initialize(std::move(output_surface_), task_runner_.get());
431 463
432 TestDisplayScheduler scheduler(&display, &fake_begin_frame_source_,
433 task_runner_.get());
434 display.Initialize(std::move(output_surface_), &scheduler);
435
436 SurfaceId surface_id(7u);
437 display.SetSurfaceId(surface_id, 1.f); 464 display.SetSurfaceId(surface_id, 1.f);
438 465
439 display.Resize(gfx::Size(100, 100)); 466 display.Resize(gfx::Size(100, 100));
440 factory_.Create(surface_id); 467 factory_.Create(surface_id);
441 468
442 { 469 {
443 RenderPassList pass_list; 470 RenderPassList pass_list;
444 std::unique_ptr<RenderPass> pass = RenderPass::Create(); 471 std::unique_ptr<RenderPass> pass = RenderPass::Create();
445 pass->output_rect = gfx::Rect(0, 0, 100, 100); 472 pass->output_rect = gfx::Rect(0, 0, 100, 100);
446 pass->damage_rect = gfx::Rect(10, 10, 1, 1); 473 pass->damage_rect = gfx::Rect(10, 10, 1, 1);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 509
483 EXPECT_CALL(*context_ptr, shallowFinishCHROMIUM()); 510 EXPECT_CALL(*context_ptr, shallowFinishCHROMIUM());
484 display.Resize(gfx::Size(250, 250)); 511 display.Resize(gfx::Size(250, 250));
485 testing::Mock::VerifyAndClearExpectations(context_ptr); 512 testing::Mock::VerifyAndClearExpectations(context_ptr);
486 513
487 factory_.Destroy(surface_id); 514 factory_.Destroy(surface_id);
488 } 515 }
489 516
490 } // namespace 517 } // namespace
491 } // namespace cc 518 } // namespace cc
OLDNEW
« no previous file with comments | « cc/surfaces/display_scheduler.cc ('k') | cc/surfaces/onscreen_display_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698