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

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 compile fix Created 3 years, 10 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/raster/raster_buffer_provider.h ('k') | cc/raster/zero_copy_raster_buffer_provider.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 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, 1.f, settings); 86 gfx::Rect(1, 1), new_content_id, 1.f, settings);
86 } 87 }
87 88
88 // Overridden from TileTask: 89 // Overridden from TileTask:
89 void OnTaskCompleted() override { 90 void OnTaskCompleted() override {
90 completion_handler_->OnRasterTaskCompleted(std::move(raster_buffer_), id_, 91 completion_handler_->OnRasterTaskCompleted(std::move(raster_buffer_), id_,
91 state().IsCanceled()); 92 state().IsCanceled());
92 } 93 }
93 94
94 protected: 95 protected:
95 ~TestRasterTaskImpl() override {} 96 ~TestRasterTaskImpl() override {}
96 97
97 private: 98 private:
98 TestRasterTaskCompletionHandler* completion_handler_; 99 TestRasterTaskCompletionHandler* completion_handler_;
99 std::unique_ptr<ScopedResource> resource_;
100 unsigned id_; 100 unsigned id_;
101 std::unique_ptr<RasterBuffer> raster_buffer_; 101 std::unique_ptr<RasterBuffer> raster_buffer_;
102 scoped_refptr<RasterSource> raster_source_; 102 scoped_refptr<RasterSource> raster_source_;
103 103
104 DISALLOW_COPY_AND_ASSIGN(TestRasterTaskImpl); 104 DISALLOW_COPY_AND_ASSIGN(TestRasterTaskImpl);
105 }; 105 };
106 106
107 class BlockingTestRasterTaskImpl : public TestRasterTaskImpl { 107 class BlockingTestRasterTaskImpl : public TestRasterTaskImpl {
108 public: 108 public:
109 BlockingTestRasterTaskImpl( 109 BlockingTestRasterTaskImpl(
110 TestRasterTaskCompletionHandler* completion_handler, 110 TestRasterTaskCompletionHandler* completion_handler,
111 std::unique_ptr<ScopedResource> resource,
112 unsigned id, 111 unsigned id,
113 std::unique_ptr<RasterBuffer> raster_buffer, 112 std::unique_ptr<RasterBuffer> raster_buffer,
114 base::Lock* lock, 113 base::Lock* lock,
115 TileTask::Vector* dependencies) 114 TileTask::Vector* dependencies)
116 : TestRasterTaskImpl(completion_handler, 115 : TestRasterTaskImpl(completion_handler,
117 std::move(resource),
118 id, 116 id,
119 std::move(raster_buffer), 117 std::move(raster_buffer),
120 dependencies), 118 dependencies),
121 lock_(lock) {} 119 lock_(lock) {}
122 120
123 // Overridden from Task: 121 // Overridden from Task:
124 void RunOnWorkerThread() override { 122 void RunOnWorkerThread() override {
125 base::AutoLock lock(*lock_); 123 base::AutoLock lock(*lock_);
126 TestRasterTaskImpl::RunOnWorkerThread(); 124 TestRasterTaskImpl::RunOnWorkerThread();
127 } 125 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 resource_provider_.get(), PlatformColor::BestTextureFormat()); 163 resource_provider_.get(), PlatformColor::BestTextureFormat());
166 break; 164 break;
167 case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY: 165 case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY:
168 Create3dResourceProvider(); 166 Create3dResourceProvider();
169 raster_buffer_provider_ = base::MakeUnique<OneCopyRasterBufferProvider>( 167 raster_buffer_provider_ = base::MakeUnique<OneCopyRasterBufferProvider>(
170 base::ThreadTaskRunnerHandle::Get().get(), context_provider_.get(), 168 base::ThreadTaskRunnerHandle::Get().get(), context_provider_.get(),
171 worker_context_provider_.get(), resource_provider_.get(), 169 worker_context_provider_.get(), resource_provider_.get(),
172 kMaxBytesPerCopyOperation, false, kMaxStagingBuffers, 170 kMaxBytesPerCopyOperation, false, kMaxStagingBuffers,
173 PlatformColor::BestTextureFormat(), false); 171 PlatformColor::BestTextureFormat(), false);
174 break; 172 break;
173 case RASTER_BUFFER_PROVIDER_TYPE_ASYNC_ONE_COPY:
174 Create3dResourceProvider();
175 raster_buffer_provider_ = base::MakeUnique<OneCopyRasterBufferProvider>(
176 base::ThreadTaskRunnerHandle::Get().get(), context_provider_.get(),
177 worker_context_provider_.get(), resource_provider_.get(),
178 kMaxBytesPerCopyOperation, false, kMaxStagingBuffers,
179 PlatformColor::BestTextureFormat(), true);
180 break;
175 case RASTER_BUFFER_PROVIDER_TYPE_GPU: 181 case RASTER_BUFFER_PROVIDER_TYPE_GPU:
176 Create3dResourceProvider(); 182 Create3dResourceProvider();
177 raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>( 183 raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>(
178 context_provider_.get(), worker_context_provider_.get(), 184 context_provider_.get(), worker_context_provider_.get(),
179 resource_provider_.get(), false, 0, false); 185 resource_provider_.get(), false, 0, false);
180 break; 186 break;
187 case RASTER_BUFFER_PROVIDER_TYPE_ASYNC_GPU:
188 Create3dResourceProvider();
189 raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>(
190 context_provider_.get(), worker_context_provider_.get(),
191 resource_provider_.get(), false, 0, true);
192 break;
181 case RASTER_BUFFER_PROVIDER_TYPE_BITMAP: 193 case RASTER_BUFFER_PROVIDER_TYPE_BITMAP:
182 CreateSoftwareResourceProvider(); 194 CreateSoftwareResourceProvider();
183 raster_buffer_provider_ = 195 raster_buffer_provider_ =
184 BitmapRasterBufferProvider::Create(resource_provider_.get()); 196 BitmapRasterBufferProvider::Create(resource_provider_.get());
185 break; 197 break;
186 } 198 }
187 199
188 DCHECK(raster_buffer_provider_); 200 DCHECK(raster_buffer_provider_);
189 201
190 tile_task_manager_ = TileTaskManagerImpl::Create(&task_graph_runner_); 202 tile_task_manager_ = TileTaskManagerImpl::Create(&task_graph_runner_);
191 } 203 }
192 204
193 void TearDown() override { 205 void TearDown() override {
206 resources_.clear();
194 tile_task_manager_->Shutdown(); 207 tile_task_manager_->Shutdown();
195 tile_task_manager_->CheckForCompletedTasks(); 208 tile_task_manager_->CheckForCompletedTasks();
196 209
197 raster_buffer_provider_->Shutdown(); 210 raster_buffer_provider_->Shutdown();
198 } 211 }
199 212
200 void AllTileTasksFinished() { 213 void AllTileTasksFinished() {
201 tile_task_manager_->CheckForCompletedTasks(); 214 tile_task_manager_->CheckForCompletedTasks();
202 base::MessageLoop::current()->QuitWhenIdle(); 215 base::MessageLoop::current()->QuitWhenIdle();
203 } 216 }
(...skipping 22 matching lines...) Expand all
226 std::unique_ptr<ScopedResource> resource( 239 std::unique_ptr<ScopedResource> resource(
227 ScopedResource::Create(resource_provider_.get())); 240 ScopedResource::Create(resource_provider_.get()));
228 resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, 241 resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
229 RGBA_8888, gfx::ColorSpace()); 242 RGBA_8888, gfx::ColorSpace());
230 243
231 // The raster buffer has no tile ids associated with it for partial update, 244 // The raster buffer has no tile ids associated with it for partial update,
232 // so doesn't need to provide a valid dirty rect. 245 // so doesn't need to provide a valid dirty rect.
233 std::unique_ptr<RasterBuffer> raster_buffer = 246 std::unique_ptr<RasterBuffer> raster_buffer =
234 raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0); 247 raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0);
235 TileTask::Vector empty; 248 TileTask::Vector empty;
236 tasks_.push_back(new TestRasterTaskImpl(this, std::move(resource), id, 249 tasks_.push_back(
237 std::move(raster_buffer), &empty)); 250 new TestRasterTaskImpl(this, id, std::move(raster_buffer), &empty));
251 resources_.push_back(std::move(resource));
238 } 252 }
239 253
240 void AppendTask(unsigned id) { AppendTask(id, gfx::Size(1, 1)); } 254 void AppendTask(unsigned id) { AppendTask(id, gfx::Size(1, 1)); }
241 255
242 void AppendBlockingTask(unsigned id, base::Lock* lock) { 256 void AppendBlockingTask(unsigned id, base::Lock* lock) {
243 const gfx::Size size(1, 1); 257 const gfx::Size size(1, 1);
244 258
245 std::unique_ptr<ScopedResource> resource( 259 std::unique_ptr<ScopedResource> resource(
246 ScopedResource::Create(resource_provider_.get())); 260 ScopedResource::Create(resource_provider_.get()));
247 resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, 261 resource->Allocate(size, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
248 RGBA_8888, gfx::ColorSpace()); 262 RGBA_8888, gfx::ColorSpace());
249 263
250 std::unique_ptr<RasterBuffer> raster_buffer = 264 std::unique_ptr<RasterBuffer> raster_buffer =
251 raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0); 265 raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0);
252 TileTask::Vector empty; 266 TileTask::Vector empty;
253 tasks_.push_back(new BlockingTestRasterTaskImpl( 267 tasks_.push_back(new BlockingTestRasterTaskImpl(
254 this, std::move(resource), id, std::move(raster_buffer), lock, &empty)); 268 this, id, std::move(raster_buffer), lock, &empty));
269 resources_.push_back(std::move(resource));
255 } 270 }
256 271
257 const std::vector<RasterTaskResult>& completed_tasks() const { 272 const std::vector<RasterTaskResult>& completed_tasks() const {
258 return completed_tasks_; 273 return completed_tasks_;
259 } 274 }
260 275
261 void LoseContext(ContextProvider* context_provider) { 276 void LoseContext(ContextProvider* context_provider) {
262 if (!context_provider) 277 if (!context_provider)
263 return; 278 return;
264 context_provider->ContextGL()->LoseContextCHROMIUM( 279 context_provider->ContextGL()->LoseContextCHROMIUM(
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 std::unique_ptr<RasterBufferProvider> raster_buffer_provider_; 321 std::unique_ptr<RasterBufferProvider> raster_buffer_provider_;
307 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; 322 TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
308 TestSharedBitmapManager shared_bitmap_manager_; 323 TestSharedBitmapManager shared_bitmap_manager_;
309 SynchronousTaskGraphRunner task_graph_runner_; 324 SynchronousTaskGraphRunner task_graph_runner_;
310 base::CancelableClosure timeout_; 325 base::CancelableClosure timeout_;
311 UniqueNotifier all_tile_tasks_finished_; 326 UniqueNotifier all_tile_tasks_finished_;
312 int timeout_seconds_; 327 int timeout_seconds_;
313 bool timed_out_; 328 bool timed_out_;
314 RasterTaskVector tasks_; 329 RasterTaskVector tasks_;
315 std::vector<RasterTaskResult> completed_tasks_; 330 std::vector<RasterTaskResult> completed_tasks_;
331 std::vector<std::unique_ptr<ScopedResource>> resources_;
316 TaskGraph graph_; 332 TaskGraph graph_;
317 }; 333 };
318 334
319 TEST_P(RasterBufferProviderTest, Basic) { 335 TEST_P(RasterBufferProviderTest, Basic) {
320 AppendTask(0u); 336 AppendTask(0u);
321 AppendTask(1u); 337 AppendTask(1u);
322 ScheduleTasks(); 338 ScheduleTasks();
323 339
324 RunMessageLoopUntilAllTasksHaveCompleted(); 340 RunMessageLoopUntilAllTasksHaveCompleted();
325 341
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 AppendTask(1u); 391 AppendTask(1u);
376 ScheduleTasks(); 392 ScheduleTasks();
377 393
378 RunMessageLoopUntilAllTasksHaveCompleted(); 394 RunMessageLoopUntilAllTasksHaveCompleted();
379 395
380 ASSERT_EQ(2u, completed_tasks().size()); 396 ASSERT_EQ(2u, completed_tasks().size());
381 EXPECT_FALSE(completed_tasks()[0].canceled); 397 EXPECT_FALSE(completed_tasks()[0].canceled);
382 EXPECT_FALSE(completed_tasks()[1].canceled); 398 EXPECT_FALSE(completed_tasks()[1].canceled);
383 } 399 }
384 400
385 INSTANTIATE_TEST_CASE_P(RasterBufferProviderTests, 401 TEST_P(RasterBufferProviderTest, ReadyToDrawCallback) {
386 RasterBufferProviderTest, 402 AppendTask(0u);
387 ::testing::Values(RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY, 403 ScheduleTasks();
388 RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY, 404 RunMessageLoopUntilAllTasksHaveCompleted();
389 RASTER_BUFFER_PROVIDER_TYPE_GPU, 405
390 RASTER_BUFFER_PROVIDER_TYPE_BITMAP)); 406 ResourceProvider::ResourceIdArray array;
407 for (const auto& resource : resources_) {
408 array.push_back(resource->id());
409 }
410 base::RunLoop run_loop;
411 uint64_t callback_id = raster_buffer_provider_->SetReadyToDrawCallback(
412 array,
413 base::Bind([](base::RunLoop* run_loop) { run_loop->Quit(); }, &run_loop),
414 0);
415
416 if (GetParam() == RASTER_BUFFER_PROVIDER_TYPE_ASYNC_GPU ||
417 GetParam() == RASTER_BUFFER_PROVIDER_TYPE_ASYNC_ONE_COPY)
418 EXPECT_TRUE(callback_id);
419
420 if (!callback_id)
421 return;
422
423 run_loop.Run();
424 }
425
426 TEST_P(RasterBufferProviderTest, ReadyToDrawCallbackNoDuplicate) {
427 AppendTask(0u);
428 ScheduleTasks();
429 RunMessageLoopUntilAllTasksHaveCompleted();
430
431 ResourceProvider::ResourceIdArray array;
432 for (const auto& resource : resources_) {
433 array.push_back(resource->id());
434 }
435
436 uint64_t callback_id = raster_buffer_provider_->SetReadyToDrawCallback(
437 array, base::Bind([]() {}), 0);
438
439 // Calling SetReadyToDrawCallback a second time for the same resources
440 // should return the same callback ID.
441 uint64_t callback_id_2 = raster_buffer_provider_->SetReadyToDrawCallback(
442 array, base::Bind([]() {}), 0);
443
444 EXPECT_EQ(callback_id, callback_id_2);
445
446 if (GetParam() == RASTER_BUFFER_PROVIDER_TYPE_ASYNC_GPU ||
447 GetParam() == RASTER_BUFFER_PROVIDER_TYPE_ASYNC_ONE_COPY)
448 EXPECT_TRUE(callback_id);
449 }
450
451 INSTANTIATE_TEST_CASE_P(
452 RasterBufferProviderTests,
453 RasterBufferProviderTest,
454 ::testing::Values(RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY,
455 RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY,
456 RASTER_BUFFER_PROVIDER_TYPE_ASYNC_ONE_COPY,
457 RASTER_BUFFER_PROVIDER_TYPE_GPU,
458 RASTER_BUFFER_PROVIDER_TYPE_ASYNC_GPU,
459 RASTER_BUFFER_PROVIDER_TYPE_BITMAP));
391 460
392 } // namespace 461 } // namespace
393 } // namespace cc 462 } // namespace cc
OLDNEW
« no previous file with comments | « cc/raster/raster_buffer_provider.h ('k') | cc/raster/zero_copy_raster_buffer_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698