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
3// found in the LICENSE file.
4
5#ifndef CC_RESOURCES_ZERO_COPY_RASTER_WORKER_POOL_H_
6#define CC_RESOURCES_ZERO_COPY_RASTER_WORKER_POOL_H_
7
8#include "base/memory/weak_ptr.h"
9#include "base/values.h"
10#include "cc/resources/raster_worker_pool.h"
11#include "cc/resources/rasterizer.h"
12
13namespace base {
14namespace debug {
15class ConvertableToTraceFormat;
16}
17}
18
19namespace cc {
20class ResourceProvider;
21
22class CC_EXPORT ZeroCopyRasterWorkerPool : public RasterWorkerPool,
23                                           public Rasterizer,
24                                           public RasterizerTaskClient {
25 public:
26  virtual ~ZeroCopyRasterWorkerPool();
27
28  static scoped_ptr<RasterWorkerPool> Create(
29      base::SequencedTaskRunner* task_runner,
30      TaskGraphRunner* task_graph_runner,
31      ResourceProvider* resource_provider);
32
33  // Overridden from RasterWorkerPool:
34  virtual Rasterizer* AsRasterizer() OVERRIDE;
35
36  // Overridden from Rasterizer:
37  virtual void SetClient(RasterizerClient* client) OVERRIDE;
38  virtual void Shutdown() OVERRIDE;
39  virtual void ScheduleTasks(RasterTaskQueue* queue) OVERRIDE;
40  virtual void CheckForCompletedTasks() OVERRIDE;
41
42  // Overridden from RasterizerTaskClient:
43  virtual scoped_ptr<RasterBuffer> AcquireBufferForRaster(
44      const Resource* resource) OVERRIDE;
45  virtual void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) OVERRIDE;
46
47 protected:
48  ZeroCopyRasterWorkerPool(base::SequencedTaskRunner* task_runner,
49                           TaskGraphRunner* task_graph_runner,
50                           ResourceProvider* resource_provider);
51
52 private:
53  void OnRasterFinished(TaskSet task_set);
54  scoped_refptr<base::debug::ConvertableToTraceFormat> StateAsValue() const;
55
56  scoped_refptr<base::SequencedTaskRunner> task_runner_;
57  TaskGraphRunner* task_graph_runner_;
58  const NamespaceToken namespace_token_;
59  RasterizerClient* client_;
60  ResourceProvider* resource_provider_;
61
62  TaskSetCollection raster_pending_;
63
64  scoped_refptr<RasterizerTask> raster_finished_tasks_[kNumberOfTaskSets];
65
66  // Task graph used when scheduling tasks and vector used to gather
67  // completed tasks.
68  TaskGraph graph_;
69  Task::Vector completed_tasks_;
70
71  base::WeakPtrFactory<ZeroCopyRasterWorkerPool>
72      raster_finished_weak_ptr_factory_;
73
74  DISALLOW_COPY_AND_ASSIGN(ZeroCopyRasterWorkerPool);
75};
76
77}  // namespace cc
78
79#endif  // CC_RESOURCES_ZERO_COPY_RASTER_WORKER_POOL_H_
80