forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Revert 278654 "cc: Start using raster/eviction iterators in tile..."
> cc: Start using raster/eviction iterators in tile manager > > This patch is a part of the series that enables raster > and eviction iterators in cc. In particular, this patch > actually starts using the iterators that have landed > previously. There should be a perf improvement for the > manage tiles case. Other than that, there should be no perf > impact. > > This patch's main contribution is that it opens the door for > more optimizations to be done in the future. As well, it > simplifies the logic we have in tile manager. > > BUG=329686 > R=enne, reveman > > Review URL: https://codereview.chromium.org/246673005 BUG=329686, 387669, 387652 TBR=vmpstr@chromium.org Review URL: https://codereview.chromium.org/354463002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@279160 0039d316-1c4b-4281-b951-d872f2087c98
- Loading branch information
vmpstr@google.com
committed
Jun 23, 2014
1 parent
b465946
commit 847389f
Showing
17 changed files
with
1,839 additions
and
235 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
// Copyright 2013 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#include "cc/resources/prioritized_tile_set.h" | ||
|
||
#include <algorithm> | ||
|
||
#include "cc/resources/managed_tile_state.h" | ||
#include "cc/resources/tile.h" | ||
|
||
namespace cc { | ||
|
||
class BinComparator { | ||
public: | ||
bool operator()(const Tile* a, | ||
const Tile* b) const { | ||
const ManagedTileState& ams = a->managed_state(); | ||
const ManagedTileState& bms = b->managed_state(); | ||
|
||
if (ams.priority_bin != bms.priority_bin) | ||
return ams.priority_bin < bms.priority_bin; | ||
|
||
if (ams.required_for_activation != bms.required_for_activation) | ||
return ams.required_for_activation; | ||
|
||
if (ams.resolution != bms.resolution) | ||
return ams.resolution < bms.resolution; | ||
|
||
if (ams.distance_to_visible != bms.distance_to_visible) | ||
return ams.distance_to_visible < bms.distance_to_visible; | ||
|
||
gfx::Rect a_rect = a->content_rect(); | ||
gfx::Rect b_rect = b->content_rect(); | ||
if (a_rect.y() != b_rect.y()) | ||
return a_rect.y() < b_rect.y(); | ||
return a_rect.x() < b_rect.x(); | ||
} | ||
}; | ||
|
||
namespace { | ||
|
||
typedef std::vector<Tile*> TileVector; | ||
|
||
void SortBinTiles(ManagedTileBin bin, TileVector* tiles) { | ||
switch (bin) { | ||
case NOW_AND_READY_TO_DRAW_BIN: | ||
case NEVER_BIN: | ||
break; | ||
case NOW_BIN: | ||
case SOON_BIN: | ||
case EVENTUALLY_AND_ACTIVE_BIN: | ||
case EVENTUALLY_BIN: | ||
case AT_LAST_AND_ACTIVE_BIN: | ||
case AT_LAST_BIN: | ||
std::sort(tiles->begin(), tiles->end(), BinComparator()); | ||
break; | ||
default: | ||
NOTREACHED(); | ||
} | ||
} | ||
|
||
} // namespace | ||
|
||
PrioritizedTileSet::PrioritizedTileSet() { | ||
for (int bin = 0; bin < NUM_BINS; ++bin) | ||
bin_sorted_[bin] = true; | ||
} | ||
|
||
PrioritizedTileSet::~PrioritizedTileSet() {} | ||
|
||
void PrioritizedTileSet::InsertTile(Tile* tile, ManagedTileBin bin) { | ||
tiles_[bin].push_back(tile); | ||
bin_sorted_[bin] = false; | ||
} | ||
|
||
void PrioritizedTileSet::Clear() { | ||
for (int bin = 0; bin < NUM_BINS; ++bin) { | ||
tiles_[bin].clear(); | ||
bin_sorted_[bin] = true; | ||
} | ||
} | ||
|
||
void PrioritizedTileSet::SortBinIfNeeded(ManagedTileBin bin) { | ||
if (!bin_sorted_[bin]) { | ||
SortBinTiles(bin, &tiles_[bin]); | ||
bin_sorted_[bin] = true; | ||
} | ||
} | ||
|
||
PrioritizedTileSet::Iterator::Iterator( | ||
PrioritizedTileSet* tile_set, bool use_priority_ordering) | ||
: tile_set_(tile_set), | ||
current_bin_(NOW_AND_READY_TO_DRAW_BIN), | ||
use_priority_ordering_(use_priority_ordering) { | ||
if (use_priority_ordering_) | ||
tile_set_->SortBinIfNeeded(current_bin_); | ||
iterator_ = tile_set->tiles_[current_bin_].begin(); | ||
if (iterator_ == tile_set_->tiles_[current_bin_].end()) | ||
AdvanceList(); | ||
} | ||
|
||
PrioritizedTileSet::Iterator::~Iterator() {} | ||
|
||
void PrioritizedTileSet::Iterator::DisablePriorityOrdering() { | ||
use_priority_ordering_ = false; | ||
} | ||
|
||
PrioritizedTileSet::Iterator& | ||
PrioritizedTileSet::Iterator::operator++() { | ||
// We can't increment past the end of the tiles. | ||
DCHECK(iterator_ != tile_set_->tiles_[current_bin_].end()); | ||
|
||
++iterator_; | ||
if (iterator_ == tile_set_->tiles_[current_bin_].end()) | ||
AdvanceList(); | ||
return *this; | ||
} | ||
|
||
Tile* PrioritizedTileSet::Iterator::operator*() { | ||
DCHECK(iterator_ != tile_set_->tiles_[current_bin_].end()); | ||
return *iterator_; | ||
} | ||
|
||
void PrioritizedTileSet::Iterator::AdvanceList() { | ||
DCHECK(iterator_ == tile_set_->tiles_[current_bin_].end()); | ||
|
||
while (current_bin_ != NEVER_BIN) { | ||
current_bin_ = static_cast<ManagedTileBin>(current_bin_ + 1); | ||
|
||
if (use_priority_ordering_) | ||
tile_set_->SortBinIfNeeded(current_bin_); | ||
|
||
iterator_ = tile_set_->tiles_[current_bin_].begin(); | ||
if (iterator_ != tile_set_->tiles_[current_bin_].end()) | ||
break; | ||
} | ||
} | ||
|
||
} // namespace cc |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
// Copyright 2013 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef CC_RESOURCES_PRIORITIZED_TILE_SET_H_ | ||
#define CC_RESOURCES_PRIORITIZED_TILE_SET_H_ | ||
|
||
#include <vector> | ||
|
||
#include "cc/base/cc_export.h" | ||
#include "cc/resources/managed_tile_state.h" | ||
|
||
namespace cc { | ||
class Tile; | ||
|
||
class CC_EXPORT PrioritizedTileSet { | ||
public: | ||
PrioritizedTileSet(); | ||
~PrioritizedTileSet(); | ||
|
||
void InsertTile(Tile* tile, ManagedTileBin bin); | ||
void Clear(); | ||
|
||
class CC_EXPORT Iterator { | ||
public: | ||
Iterator(PrioritizedTileSet* set, bool use_priority_ordering); | ||
|
||
~Iterator(); | ||
|
||
void DisablePriorityOrdering(); | ||
|
||
Iterator& operator++(); | ||
Tile* operator->() { return *(*this); } | ||
Tile* operator*(); | ||
operator bool() const { | ||
return iterator_ != tile_set_->tiles_[current_bin_].end(); | ||
} | ||
|
||
private: | ||
void AdvanceList(); | ||
|
||
PrioritizedTileSet* tile_set_; | ||
ManagedTileBin current_bin_; | ||
std::vector<Tile*>::iterator iterator_; | ||
bool use_priority_ordering_; | ||
}; | ||
|
||
private: | ||
friend class Iterator; | ||
|
||
void SortBinIfNeeded(ManagedTileBin bin); | ||
|
||
std::vector<Tile*> tiles_[NUM_BINS]; | ||
bool bin_sorted_[NUM_BINS]; | ||
}; | ||
|
||
} // namespace cc | ||
|
||
#endif // CC_RESOURCES_PRIORITIZED_TILE_SET_H_ |
Oops, something went wrong.