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

Unified Diff: cc/resources/tile_manager.cc

Issue 165603002: cc: Move GPU raster to DirectRasterWorkerPool. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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 side-by-side diff with in-line comments
Download patch
Index: cc/resources/tile_manager.cc
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
index cd9adfaac1206a5b80d0f6ad18ae894beb086355..1be95d6943cb3aa3dbc06709fbb8041d764f535c 100644
--- a/cc/resources/tile_manager.cc
+++ b/cc/resources/tile_manager.cc
@@ -13,14 +13,13 @@
#include "base/logging.h"
#include "base/metrics/histogram.h"
#include "cc/debug/traced_value.h"
+#include "cc/resources/direct_raster_worker_pool.h"
#include "cc/resources/image_raster_worker_pool.h"
#include "cc/resources/pixel_buffer_raster_worker_pool.h"
#include "cc/resources/tile.h"
-#include "third_party/skia/include/core/SkCanvas.h"
#include "ui/gfx/rect_conversions.h"
namespace cc {
-
namespace {
// Memory limit policy works by mapping some bin states to the NEVER bin.
@@ -132,6 +131,68 @@ inline ManagedTileBin BinFromTilePriority(const TilePriority& prio) {
} // namespace
+class RasterWorkerPoolDelegate : public RasterWorkerPoolClient {
vmpstr 2014/02/14 17:16:51 Can you please make this a separate file? I was t
reveman 2014/02/14 23:30:52 Done.
+ public:
+ RasterWorkerPoolDelegate(
+ scoped_ptr<RasterWorkerPool> raster_worker_pool,
+ scoped_ptr<RasterWorkerPool> direct_raster_worker_pool)
+ : client_(NULL),
+ raster_worker_pool_(raster_worker_pool.Pass()),
+ direct_raster_worker_pool_(direct_raster_worker_pool.Pass()),
+ did_finish_running_tasks_pending_count_(0u),
+ did_finish_running_tasks_required_for_activation_pending_count_(0u) {
+ raster_worker_pool_->SetClient(this);
+ direct_raster_worker_pool_->SetClient(this);
+ }
+
+ void SetClient(RasterWorkerPoolClient* client) { client_ = client; }
+
+ void Shutdown() {
+ raster_worker_pool_->Shutdown();
+ direct_raster_worker_pool_->Shutdown();
+ }
+
+ void ScheduleTasks(RasterTaskQueue* raster_queue,
+ RasterTaskQueue* direct_raster_queue) {
+ raster_worker_pool_->ScheduleTasks(raster_queue);
+ direct_raster_worker_pool_->ScheduleTasks(direct_raster_queue);
+
+ did_finish_running_tasks_pending_count_ = 2u;
+ did_finish_running_tasks_required_for_activation_pending_count_ = 2u;
+ }
+
+ void CheckForCompletedTasks() {
+ raster_worker_pool_->CheckForCompletedTasks();
+ direct_raster_worker_pool_->CheckForCompletedTasks();
+ }
+
+ // Overriden from RasterWorkerPoolClient:
+ virtual bool ShouldForceTasksRequiredForActivationToComplete()
+ const OVERRIDE {
+ return client_->ShouldForceTasksRequiredForActivationToComplete();
+ }
+ virtual void DidFinishRunningTasks() OVERRIDE {
+ DCHECK_LT(0u, did_finish_running_tasks_pending_count_);
+ if (--did_finish_running_tasks_pending_count_)
+ return;
+ client_->DidFinishRunningTasks();
+ }
+ virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {
+ DCHECK_LT(0u,
+ did_finish_running_tasks_required_for_activation_pending_count_);
+ if (--did_finish_running_tasks_required_for_activation_pending_count_)
+ return;
+ client_->DidFinishRunningTasksRequiredForActivation();
+ }
+
+ private:
+ RasterWorkerPoolClient* client_;
+ scoped_ptr<RasterWorkerPool> raster_worker_pool_;
+ scoped_ptr<RasterWorkerPool> direct_raster_worker_pool_;
+ size_t did_finish_running_tasks_pending_count_;
+ size_t did_finish_running_tasks_required_for_activation_pending_count_;
+};
+
RasterTaskCompletionStats::RasterTaskCompletionStats()
: completed_count(0u), canceled_count(0u) {}
@@ -157,13 +218,12 @@ scoped_ptr<TileManager> TileManager::Create(
return make_scoped_ptr(new TileManager(
client,
resource_provider,
- use_map_image
- ? ImageRasterWorkerPool::Create(
- resource_provider, context_provider, map_image_texture_target)
- : PixelBufferRasterWorkerPool::Create(
- resource_provider,
- context_provider,
- max_transfer_buffer_usage_bytes),
+ context_provider,
+ use_map_image ? ImageRasterWorkerPool::Create(resource_provider,
+ map_image_texture_target)
+ : PixelBufferRasterWorkerPool::Create(
+ resource_provider, max_transfer_buffer_usage_bytes),
+ DirectRasterWorkerPool::Create(resource_provider, context_provider),
alokp 2014/02/14 18:50:59 I was under the impression that we would create a
reveman 2014/02/14 23:30:52 Yes, that might be what we want to do long term bu
max_raster_usage_bytes,
rendering_stats_instrumentation,
use_rasterize_on_demand));
@@ -172,16 +232,21 @@ scoped_ptr<TileManager> TileManager::Create(
TileManager::TileManager(
TileManagerClient* client,
ResourceProvider* resource_provider,
+ ContextProvider* context_provider,
scoped_ptr<RasterWorkerPool> raster_worker_pool,
+ scoped_ptr<RasterWorkerPool> direct_raster_worker_pool,
size_t max_raster_usage_bytes,
RenderingStatsInstrumentation* rendering_stats_instrumentation,
bool use_rasterize_on_demand)
: client_(client),
+ resource_format_(raster_worker_pool->GetResourceFormat()),
resource_pool_(
ResourcePool::Create(resource_provider,
raster_worker_pool->GetResourceTarget(),
- raster_worker_pool->GetResourceFormat())),
- raster_worker_pool_(raster_worker_pool.Pass()),
+ resource_format_)),
+ raster_worker_pool_(
+ new RasterWorkerPoolDelegate(raster_worker_pool.Pass(),
+ direct_raster_worker_pool.Pass())),
prioritized_tiles_dirty_(false),
all_tiles_that_need_to_be_rasterized_have_memory_(true),
all_tiles_required_for_activation_have_memory_(true),
@@ -206,8 +271,8 @@ TileManager::~TileManager() {
CleanUpReleasedTiles();
DCHECK_EQ(0u, tiles_.size());
- RasterWorkerPool::RasterTask::Queue empty;
- raster_worker_pool_->ScheduleTasks(&empty);
+ RasterTaskQueue empty;
+ raster_worker_pool_->ScheduleTasks(&empty, &empty);
// This should finish all pending tasks and release any uninitialized
// resources.
@@ -346,9 +411,8 @@ void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) {
const ManagedTileState::TileVersion& tile_version =
tile->GetTileVersionForDrawing();
bool tile_is_ready_to_draw = tile_version.IsReadyToDraw();
- bool tile_is_active =
- tile_is_ready_to_draw ||
- !mts.tile_versions[mts.raster_mode].raster_task_.is_null();
+ bool tile_is_active = tile_is_ready_to_draw ||
+ mts.tile_versions[mts.raster_mode].raster_task_;
// Get the active priority and bin.
TilePriority active_priority = tile->priority(ACTIVE_TREE);
@@ -664,7 +728,7 @@ void TileManager::AssignGpuMemoryToTiles(
if (raster_bytes_if_rastered <= max_raster_bytes) {
// If we don't have the required version, and it's not in flight
// then we'll have to pay to create a new task.
- if (!tile_version.resource_ && tile_version.raster_task_.is_null()) {
+ if (!tile_version.resource_ && !tile_version.raster_task_) {
tile_bytes += bytes_if_allocated;
tile_resources++;
}
@@ -776,7 +840,8 @@ void TileManager::ScheduleTasks(
DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
- raster_tasks_.Reset();
+ raster_queue_.Reset();
+ gpu_raster_queue_.Reset();
// Build a new task queue containing all task currently needed. Tasks
// are added in order of priority, highest priority task first.
@@ -791,11 +856,20 @@ void TileManager::ScheduleTasks(
DCHECK(tile_version.requires_resource());
DCHECK(!tile_version.resource_);
- if (tile_version.raster_task_.is_null())
+ if (!tile_version.raster_task_)
tile_version.raster_task_ = CreateRasterTask(tile);
- raster_tasks_.Append(tile_version.raster_task_,
- tile->required_for_activation());
+ if (tile->use_gpu_rasterization()) {
+ gpu_raster_queue_.tasks.push_back(RasterTaskQueue::Task(
+ tile_version.raster_task_.get(), tile->required_for_activation()));
+ gpu_raster_queue_.required_for_activation_count +=
+ tile->required_for_activation();
+ } else {
+ raster_queue_.tasks.push_back(RasterTaskQueue::Task(
+ tile_version.raster_task_.get(), tile->required_for_activation()));
+ raster_queue_.required_for_activation_count +=
+ tile->required_for_activation();
+ }
}
// We must reduce the amount of unused resoruces before calling
@@ -805,12 +879,12 @@ void TileManager::ScheduleTasks(
// Schedule running of |raster_tasks_|. This replaces any previously
// scheduled tasks and effectively cancels all tasks not present
// in |raster_tasks_|.
- raster_worker_pool_->ScheduleTasks(&raster_tasks_);
+ raster_worker_pool_->ScheduleTasks(&raster_queue_, &gpu_raster_queue_);
did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
}
-RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
+scoped_refptr<internal::WorkerPoolTask> TileManager::CreateImageDecodeTask(
Tile* tile,
SkPixelRef* pixel_ref) {
return RasterWorkerPool::CreateImageDecodeTask(
@@ -823,7 +897,8 @@ RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
base::Unretained(pixel_ref)));
}
-RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) {
+scoped_refptr<internal::RasterWorkerPoolTask> TileManager::CreateRasterTask(
+ Tile* tile) {
ManagedTileState& mts = tile->managed_state();
scoped_ptr<ScopedResource> resource =
@@ -831,7 +906,7 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) {
const ScopedResource* const_resource = resource.get();
// Create and queue all image decode tasks that this tile depends on.
- RasterWorkerPool::Task::Set decode_tasks;
+ internal::WorkerPoolTask::Vector decode_tasks;
PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()];
for (PicturePileImpl::PixelRefIterator iter(
tile->content_rect(), tile->contents_scale(), tile->picture_pile());
@@ -843,13 +918,14 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) {
// Append existing image decode task if available.
PixelRefTaskMap::iterator decode_task_it = existing_pixel_refs.find(id);
if (decode_task_it != existing_pixel_refs.end()) {
- decode_tasks.Insert(decode_task_it->second);
+ decode_tasks.push_back(decode_task_it->second);
continue;
}
// Create and append new image decode task for this pixel ref.
- RasterWorkerPool::Task decode_task = CreateImageDecodeTask(tile, pixel_ref);
- decode_tasks.Insert(decode_task);
+ scoped_refptr<internal::WorkerPoolTask> decode_task =
+ CreateImageDecodeTask(tile, pixel_ref);
+ decode_tasks.push_back(decode_task);
existing_pixel_refs[id] = decode_task;
}
@@ -863,14 +939,14 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) {
tile->layer_id(),
static_cast<const void*>(tile),
tile->source_frame_number(),
- tile->use_gpu_rasterization(),
rendering_stats_instrumentation_,
base::Bind(&TileManager::OnRasterTaskCompleted,
base::Unretained(this),
tile->id(),
base::Passed(&resource),
mts.raster_mode),
- &decode_tasks);
+ &decode_tasks,
+ context_provider_);
}
void TileManager::OnImageDecodeTaskCompleted(int layer_id,
@@ -910,8 +986,8 @@ void TileManager::OnRasterTaskCompleted(
Tile* tile = it->second;
ManagedTileState& mts = tile->managed_state();
ManagedTileState::TileVersion& tile_version = mts.tile_versions[raster_mode];
- DCHECK(!tile_version.raster_task_.is_null());
- tile_version.raster_task_.Reset();
+ DCHECK(tile_version.raster_task_);
+ tile_version.raster_task_ = NULL;
if (was_canceled) {
++update_visible_tiles_stats_.canceled_count;

Powered by Google App Engine
This is Rietveld 408576698