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

Side by Side Diff: cc/raster/raster_buffer_provider_unittest.cc

Issue 2555743004: Delay activation/draw on GPU tile work completion (Closed)
Patch Set: rebase Created 3 years, 11 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/raster/raster_buffer_provider.h" 5 #include "cc/raster/raster_buffer_provider.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
11 #include <limits> 11 #include <limits>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/cancelable_callback.h" 14 #include "base/cancelable_callback.h"
15 #include "base/location.h" 15 #include "base/location.h"
16 #include "base/macros.h" 16 #include "base/macros.h"
17 #include "base/memory/ptr_util.h" 17 #include "base/memory/ptr_util.h"
18 #include "base/message_loop/message_loop.h" 18 #include "base/message_loop/message_loop.h"
19 #include "base/run_loop.h"
19 #include "base/single_thread_task_runner.h" 20 #include "base/single_thread_task_runner.h"
20 #include "base/threading/thread_task_runner_handle.h" 21 #include "base/threading/thread_task_runner_handle.h"
21 #include "cc/base/unique_notifier.h" 22 #include "cc/base/unique_notifier.h"
22 #include "cc/raster/bitmap_raster_buffer_provider.h" 23 #include "cc/raster/bitmap_raster_buffer_provider.h"
23 #include "cc/raster/gpu_raster_buffer_provider.h" 24 #include "cc/raster/gpu_raster_buffer_provider.h"
24 #include "cc/raster/one_copy_raster_buffer_provider.h" 25 #include "cc/raster/one_copy_raster_buffer_provider.h"
25 #include "cc/raster/synchronous_task_graph_runner.h" 26 #include "cc/raster/synchronous_task_graph_runner.h"
26 #include "cc/raster/zero_copy_raster_buffer_provider.h" 27 #include "cc/raster/zero_copy_raster_buffer_provider.h"
27 #include "cc/resources/platform_color.h" 28 #include "cc/resources/platform_color.h"
28 #include "cc/resources/resource_pool.h" 29 #include "cc/resources/resource_pool.h"
(...skipping 11 matching lines...) Expand all
40 41
41 namespace cc { 42 namespace cc {
42 namespace { 43 namespace {
43 44
44 const size_t kMaxBytesPerCopyOperation = 1000U; 45 const size_t kMaxBytesPerCopyOperation = 1000U;
45 const size_t kMaxStagingBuffers = 32U; 46 const size_t kMaxStagingBuffers = 32U;
46 47
47 enum RasterBufferProviderType { 48 enum RasterBufferProviderType {
48 RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY, 49 RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY,
49 RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY, 50 RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY,
51 RASTER_BUFFER_PROVIDER_TYPE_ASYNC_ONE_COPY,
50 RASTER_BUFFER_PROVIDER_TYPE_GPU, 52 RASTER_BUFFER_PROVIDER_TYPE_GPU,
53 RASTER_BUFFER_PROVIDER_TYPE_ASYNC_GPU,
51 RASTER_BUFFER_PROVIDER_TYPE_BITMAP 54 RASTER_BUFFER_PROVIDER_TYPE_BITMAP
52 }; 55 };
53 56
54 class TestRasterTaskCompletionHandler { 57 class TestRasterTaskCompletionHandler {
55 public: 58 public:
56 virtual void OnRasterTaskCompleted( 59 virtual void OnRasterTaskCompleted(
57 std::unique_ptr<RasterBuffer> raster_buffer, 60 std::unique_ptr<RasterBuffer> raster_buffer,
58 unsigned id, 61 unsigned id,
59 bool was_canceled) = 0; 62 bool was_canceled) = 0;
60 }; 63 };
61 64
62 class TestRasterTaskImpl : public TileTask { 65 class TestRasterTaskImpl : public TileTask {
63 public: 66 public:
64 TestRasterTaskImpl(TestRasterTaskCompletionHandler* completion_handler, 67 TestRasterTaskImpl(TestRasterTaskCompletionHandler* completion_handler,
65 std::unique_ptr<ScopedResource> resource,
66 unsigned id, 68 unsigned id,
67 std::unique_ptr<RasterBuffer> raster_buffer, 69 std::unique_ptr<RasterBuffer> raster_buffer,
68 TileTask::Vector* dependencies) 70 TileTask::Vector* dependencies)
69 : TileTask(true, dependencies), 71 : TileTask(true, dependencies),
70 completion_handler_(completion_handler), 72 completion_handler_(completion_handler),
71 resource_(std::move(resource)),
72 id_(id), 73 id_(id),
73 raster_buffer_(std::move(raster_buffer)), 74 raster_buffer_(std::move(raster_buffer)),
74 raster_source_(FakeRasterSource::CreateFilled(gfx::Size(1, 1))) {} 75 raster_source_(FakeRasterSource::CreateFilled(gfx::Size(1, 1))) {}
75 76
76 // Overridden from Task: 77 // Overridden from Task:
77 void RunOnWorkerThread() override { 78 void RunOnWorkerThread() override {
78 // Don't use the image hijack canvas for these tests, as they have no image 79 // Don't use the image hijack canvas for these tests, as they have no image
79 // decode controller. 80 // decode controller.
80 RasterSource::PlaybackSettings settings; 81 RasterSource::PlaybackSettings settings;
81 settings.use_image_hijack_canvas = false; 82 settings.use_image_hijack_canvas = false;
82 83
83 uint64_t new_content_id = 0; 84 uint64_t new_content_id = 0;
84 raster_buffer_->Playback(raster_source_.get(), gfx::Rect(1, 1), 85 raster_buffer_->Playback(raster_source_.get(), gfx::Rect(1, 1),
85 gfx::Rect(1, 1), new_content_id, 86 gfx::Rect(1, 1), new_content_id,
86 gfx::SizeF(1.f, 1.f), settings); 87 gfx::SizeF(1.f, 1.f), settings);
87 } 88 }
88 89
89 // Overridden from TileTask: 90 // Overridden from TileTask:
90 void OnTaskCompleted() override { 91 void OnTaskCompleted() override {
91 completion_handler_->OnRasterTaskCompleted(std::move(raster_buffer_), id_, 92 completion_handler_->OnRasterTaskCompleted(std::move(raster_buffer_), id_,
92 state().IsCanceled()); 93 state().IsCanceled());
93 } 94 }
94 95
95 protected: 96 protected:
96 ~TestRasterTaskImpl() override {} 97 ~TestRasterTaskImpl() override {}
97 98
98 private: 99 private:
99 TestRasterTaskCompletionHandler* completion_handler_; 100 TestRasterTaskCompletionHandler* completion_handler_;
100 std::unique_ptr<ScopedResource> resource_;
101 unsigned id_; 101 unsigned id_;
102 std::unique_ptr<RasterBuffer> raster_buffer_; 102 std::unique_ptr<RasterBuffer> raster_buffer_;
103 scoped_refptr<RasterSource> raster_source_; 103 scoped_refptr<RasterSource> raster_source_;
104 104
105 DISALLOW_COPY_AND_ASSIGN(TestRasterTaskImpl); 105 DISALLOW_COPY_AND_ASSIGN(TestRasterTaskImpl);
106 }; 106 };
107 107
108 class BlockingTestRasterTaskImpl : public TestRasterTaskImpl { 108 class BlockingTestRasterTaskImpl : public TestRasterTaskImpl {
109 public: 109 public:
110 BlockingTestRasterTaskImpl( 110 BlockingTestRasterTaskImpl(
111 TestRasterTaskCompletionHandler* completion_handler, 111 TestRasterTaskCompletionHandler* completion_handler,
112 std::unique_ptr<ScopedResource> resource,
113 unsigned id, 112 unsigned id,
114 std::unique_ptr<RasterBuffer> raster_buffer, 113 std::unique_ptr<RasterBuffer> raster_buffer,
115 base::Lock* lock, 114 base::Lock* lock,
116 TileTask::Vector* dependencies) 115 TileTask::Vector* dependencies)
117 : TestRasterTaskImpl(completion_handler, 116 : TestRasterTaskImpl(completion_handler,
118 std::move(resource),
119 id, 117 id,
120 std::move(raster_buffer), 118 std::move(raster_buffer),
121 dependencies), 119 dependencies),
122 lock_(lock) {} 120 lock_(lock) {}
123 121
124 // Overridden from Task: 122 // Overridden from Task:
125 void RunOnWorkerThread() override { 123 void RunOnWorkerThread() override {
126 base::AutoLock lock(*lock_); 124 base::AutoLock lock(*lock_);
127 TestRasterTaskImpl::RunOnWorkerThread(); 125 TestRasterTaskImpl::RunOnWorkerThread();
128 } 126 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 resource_provider_.get(), PlatformColor::BestTextureFormat()); 164 resource_provider_.get(), PlatformColor::BestTextureFormat());
167 break; 165 break;
168 case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY: 166 case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY:
169 Create3dResourceProvider(); 167 Create3dResourceProvider();
170 raster_buffer_provider_ = base::MakeUnique<OneCopyRasterBufferProvider>( 168 raster_buffer_provider_ = base::MakeUnique<OneCopyRasterBufferProvider>(
171 base::ThreadTaskRunnerHandle::Get().get(), context_provider_.get(), 169 base::ThreadTaskRunnerHandle::Get().get(), context_provider_.get(),
172 worker_context_provider_.get(), resource_provider_.get(), 170 worker_context_provider_.get(), resource_provider_.get(),
173 kMaxBytesPerCopyOperation, false, kMaxStagingBuffers, 171 kMaxBytesPerCopyOperation, false, kMaxStagingBuffers,
174 PlatformColor::BestTextureFormat(), false); 172 PlatformColor::BestTextureFormat(), false);
175 break; 173 break;
174 case RASTER_BUFFER_PROVIDER_TYPE_ASYNC_ONE_COPY:
175 Create3dResourceProvider();
176 raster_buffer_provider_ = base::MakeUnique<OneCopyRasterBufferProvider>(
177 base::ThreadTaskRunnerHandle::Get().get(), context_provider_.get(),
178 worker_context_provider_.get(), resource_provider_.get(),
179 kMaxBytesPerCopyOperation, false, kMaxStagingBuffers,
180 PlatformColor::BestTextureFormat(), true);
181 break;
176 case RASTER_BUFFER_PROVIDER_TYPE_GPU: 182 case RASTER_BUFFER_PROVIDER_TYPE_GPU:
177 Create3dResourceProvider(); 183 Create3dResourceProvider();
178 raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>( 184 raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>(
179 context_provider_.get(), worker_context_provider_.get(), 185 context_provider_.get(), worker_context_provider_.get(),
180 resource_provider_.get(), false, 0, false); 186 resource_provider_.get(), false, 0, false);
181 break; 187 break;
188 case RASTER_BUFFER_PROVIDER_TYPE_ASYNC_GPU:
189 Create3dResourceProvider();
190 raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>(
191 context_provider_.get(), worker_context_provider_.get(),
192 resource_provider_.get(), false, 0, true);
193 break;
182 case RASTER_BUFFER_PROVIDER_TYPE_BITMAP: 194 case RASTER_BUFFER_PROVIDER_TYPE_BITMAP:
183 CreateSoftwareResourceProvider(); 195 CreateSoftwareResourceProvider();
184 raster_buffer_provider_ = 196 raster_buffer_provider_ =
185 BitmapRasterBufferProvider::Create(resource_provider_.get()); 197 BitmapRasterBufferProvider::Create(resource_provider_.get());
186 break; 198 break;
187 } 199 }
188 200
189 DCHECK(raster_buffer_provider_); 201 DCHECK(raster_buffer_provider_);
190 202
191 tile_task_manager_ = TileTaskManagerImpl::Create(&task_graph_runner_); 203 tile_task_manager_ = TileTaskManagerImpl::Create(&task_graph_runner_);
192 } 204 }
193 205
194 void TearDown() override { 206 void TearDown() override {
207 resources_.clear();
195 tile_task_manager_->Shutdown(); 208 tile_task_manager_->Shutdown();
196 tile_task_manager_->CheckForCompletedTasks(); 209 tile_task_manager_->CheckForCompletedTasks();
197 210
198 raster_buffer_provider_->Shutdown(); 211 raster_buffer_provider_->Shutdown();
199 } 212 }
200 213
201 void AllTileTasksFinished() { 214 void AllTileTasksFinished() {
202 tile_task_manager_->CheckForCompletedTasks(); 215 tile_task_manager_->CheckForCompletedTasks();
203 base::MessageLoop::current()->QuitWhenIdle(); 216 base::MessageLoop::current()->QuitWhenIdle();
204 } 217 }
(...skipping 22 matching lines...) Expand all
227 std::unique_ptr<ScopedResource> resource( 240 std::unique_ptr<ScopedResource> resource(
228 ScopedResource::Create(resource_provider_.get())); 241 ScopedResource::Create(resource_provider_.get()));
229 resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, 242 resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
230 RGBA_8888, gfx::ColorSpace()); 243 RGBA_8888, gfx::ColorSpace());
231 244
232 // The raster buffer has no tile ids associated with it for partial update, 245 // The raster buffer has no tile ids associated with it for partial update,
233 // so doesn't need to provide a valid dirty rect. 246 // so doesn't need to provide a valid dirty rect.
234 std::unique_ptr<RasterBuffer> raster_buffer = 247 std::unique_ptr<RasterBuffer> raster_buffer =
235 raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0); 248 raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0);
236 TileTask::Vector empty; 249 TileTask::Vector empty;
237 tasks_.push_back(new TestRasterTaskImpl(this, std::move(resource), id, 250 tasks_.push_back(
238 std::move(raster_buffer), &empty)); 251 new TestRasterTaskImpl(this, id, std::move(raster_buffer), &empty));
252 resources_.push_back(std::move(resource));
239 } 253 }
240 254
241 void AppendTask(unsigned id) { AppendTask(id, gfx::Size(1, 1)); } 255 void AppendTask(unsigned id) { AppendTask(id, gfx::Size(1, 1)); }
242 256
243 void AppendBlockingTask(unsigned id, base::Lock* lock) { 257 void AppendBlockingTask(unsigned id, base::Lock* lock) {
244 const gfx::Size size(1, 1); 258 const gfx::Size size(1, 1);
245 259
246 std::unique_ptr<ScopedResource> resource( 260 std::unique_ptr<ScopedResource> resource(
247 ScopedResource::Create(resource_provider_.get())); 261 ScopedResource::Create(resource_provider_.get()));
248 resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, 262 resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
249 RGBA_8888, gfx::ColorSpace()); 263 RGBA_8888, gfx::ColorSpace());
250 264
251 std::unique_ptr<RasterBuffer> raster_buffer = 265 std::unique_ptr<RasterBuffer> raster_buffer =
252 raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0); 266 raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0);
253 TileTask::Vector empty; 267 TileTask::Vector empty;
254 tasks_.push_back(new BlockingTestRasterTaskImpl( 268 tasks_.push_back(new BlockingTestRasterTaskImpl(
255 this, std::move(resource), id, std::move(raster_buffer), lock, &empty)); 269 this, id, std::move(raster_buffer), lock, &empty));
270 resources_.push_back(std::move(resource));
256 } 271 }
257 272
258 const std::vector<RasterTaskResult>& completed_tasks() const { 273 const std::vector<RasterTaskResult>& completed_tasks() const {
259 return completed_tasks_; 274 return completed_tasks_;
260 } 275 }
261 276
262 void LoseContext(ContextProvider* context_provider) { 277 void LoseContext(ContextProvider* context_provider) {
263 if (!context_provider) 278 if (!context_provider)
264 return; 279 return;
265 context_provider->ContextGL()->LoseContextCHROMIUM( 280 context_provider->ContextGL()->LoseContextCHROMIUM(
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 std::unique_ptr<RasterBufferProvider> raster_buffer_provider_; 322 std::unique_ptr<RasterBufferProvider> raster_buffer_provider_;
308 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; 323 TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
309 TestSharedBitmapManager shared_bitmap_manager_; 324 TestSharedBitmapManager shared_bitmap_manager_;
310 SynchronousTaskGraphRunner task_graph_runner_; 325 SynchronousTaskGraphRunner task_graph_runner_;
311 base::CancelableClosure timeout_; 326 base::CancelableClosure timeout_;
312 UniqueNotifier all_tile_tasks_finished_; 327 UniqueNotifier all_tile_tasks_finished_;
313 int timeout_seconds_; 328 int timeout_seconds_;
314 bool timed_out_; 329 bool timed_out_;
315 RasterTaskVector tasks_; 330 RasterTaskVector tasks_;
316 std::vector<RasterTaskResult> completed_tasks_; 331 std::vector<RasterTaskResult> completed_tasks_;
332 std::vector<std::unique_ptr<ScopedResource>> resources_;
317 TaskGraph graph_; 333 TaskGraph graph_;
318 }; 334 };
319 335
320 TEST_P(RasterBufferProviderTest, Basic) { 336 TEST_P(RasterBufferProviderTest, Basic) {
321 AppendTask(0u); 337 AppendTask(0u);
322 AppendTask(1u); 338 AppendTask(1u);
323 ScheduleTasks(); 339 ScheduleTasks();
324 340
325 RunMessageLoopUntilAllTasksHaveCompleted(); 341 RunMessageLoopUntilAllTasksHaveCompleted();
326 342
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 AppendTask(1u); 392 AppendTask(1u);
377 ScheduleTasks(); 393 ScheduleTasks();
378 394
379 RunMessageLoopUntilAllTasksHaveCompleted(); 395 RunMessageLoopUntilAllTasksHaveCompleted();
380 396
381 ASSERT_EQ(2u, completed_tasks().size()); 397 ASSERT_EQ(2u, completed_tasks().size());
382 EXPECT_FALSE(completed_tasks()[0].canceled); 398 EXPECT_FALSE(completed_tasks()[0].canceled);
383 EXPECT_FALSE(completed_tasks()[1].canceled); 399 EXPECT_FALSE(completed_tasks()[1].canceled);
384 } 400 }
385 401
386 INSTANTIATE_TEST_CASE_P(RasterBufferProviderTests, 402 TEST_P(RasterBufferProviderTest, ReadyToDrawCallback) {
387 RasterBufferProviderTest, 403 AppendTask(0u);
388 ::testing::Values(RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY, 404 ScheduleTasks();
389 RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY, 405 RunMessageLoopUntilAllTasksHaveCompleted();
390 RASTER_BUFFER_PROVIDER_TYPE_GPU, 406
391 RASTER_BUFFER_PROVIDER_TYPE_BITMAP)); 407 ResourceProvider::ResourceIdArray array;
408 for (const auto& resource : resources_) {
409 array.push_back(resource->id());
410 }
411 base::RunLoop run_loop;
412 uint64_t callback_id = raster_buffer_provider_->SetReadyToDrawCallback(
413 array,
414 base::Bind([](base::RunLoop* run_loop) { run_loop->Quit(); }, &run_loop),
415 0);
416
417 if (GetParam() == RASTER_BUFFER_PROVIDER_TYPE_ASYNC_GPU ||
418 GetParam() == RASTER_BUFFER_PROVIDER_TYPE_ASYNC_ONE_COPY)
419 EXPECT_TRUE(callback_id);
420
421 if (!callback_id)
422 return;
423
424 run_loop.Run();
425 }
426
427 TEST_P(RasterBufferProviderTest, ReadyToDrawCallbackNoDuplicate) {
428 AppendTask(0u);
429 ScheduleTasks();
430 RunMessageLoopUntilAllTasksHaveCompleted();
431
432 ResourceProvider::ResourceIdArray array;
433 for (const auto& resource : resources_) {
434 array.push_back(resource->id());
435 }
436
437 uint64_t callback_id = raster_buffer_provider_->SetReadyToDrawCallback(
438 array, base::Bind([]() {}), 0);
439
440 // Calling SetReadyToDrawCallback a second time for the same resources
441 // should return the same callback ID.
442 uint64_t callback_id_2 = raster_buffer_provider_->SetReadyToDrawCallback(
443 array, base::Bind([]() {}), 0);
444
445 EXPECT_EQ(callback_id, callback_id_2);
446
447 if (GetParam() == RASTER_BUFFER_PROVIDER_TYPE_ASYNC_GPU ||
448 GetParam() == RASTER_BUFFER_PROVIDER_TYPE_ASYNC_ONE_COPY)
449 EXPECT_TRUE(callback_id);
450 }
451
452 INSTANTIATE_TEST_CASE_P(
453 RasterBufferProviderTests,
454 RasterBufferProviderTest,
455 ::testing::Values(RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY,
456 RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY,
457 RASTER_BUFFER_PROVIDER_TYPE_ASYNC_ONE_COPY,
458 RASTER_BUFFER_PROVIDER_TYPE_GPU,
459 RASTER_BUFFER_PROVIDER_TYPE_ASYNC_GPU,
460 RASTER_BUFFER_PROVIDER_TYPE_BITMAP));
392 461
393 } // namespace 462 } // namespace
394 } // namespace cc 463 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698