1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/resources/prioritized_tile_set.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <algorithm> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/resources/managed_tile_state.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/resources/tile.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace cc { 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass BinComparator { 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool operator()(const Tile* a, 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Tile* b) const { 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ManagedTileState& ams = a->managed_state(); 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ManagedTileState& bms = b->managed_state(); 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (ams.priority_bin != bms.priority_bin) 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ams.priority_bin < bms.priority_bin; 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (ams.required_for_activation != bms.required_for_activation) 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ams.required_for_activation; 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (ams.resolution != bms.resolution) 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ams.resolution < bms.resolution; 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (ams.distance_to_visible != bms.distance_to_visible) 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ams.distance_to_visible < bms.distance_to_visible; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Rect a_rect = a->content_rect(); 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Rect b_rect = b->content_rect(); 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (a_rect.y() != b_rect.y()) 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return a_rect.y() < b_rect.y(); 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return a_rect.x() < b_rect.x(); 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool TilePriorityTieBreaker(const Tile* tile_i, const Tile* tile_j) { 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // When two tiles has same priority use Id as tie breaker. 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return tile_i->id() < tile_j->id(); 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdochtypedef std::vector<Tile*> TileVector; 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SortBinTiles(ManagedTileBin bin, TileVector* tiles) { 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (bin) { 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case NEVER_BIN: 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case NOW_AND_READY_TO_DRAW_BIN: 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::sort(tiles->begin(), tiles->end(), TilePriorityTieBreaker); 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) break; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case NOW_BIN: 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case SOON_BIN: 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case EVENTUALLY_AND_ACTIVE_BIN: 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case EVENTUALLY_BIN: 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case AT_LAST_AND_ACTIVE_BIN: 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case AT_LAST_BIN: 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::sort(tiles->begin(), tiles->end(), BinComparator()); 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 72116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPrioritizedTileSet::PrioritizedTileSet() { 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (int bin = 0; bin < NUM_BINS; ++bin) 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bin_sorted_[bin] = true; 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 77116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPrioritizedTileSet::~PrioritizedTileSet() {} 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrioritizedTileSet::InsertTile(Tile* tile, ManagedTileBin bin) { 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tiles_[bin].push_back(tile); 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bin_sorted_[bin] = false; 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrioritizedTileSet::Clear() { 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (int bin = 0; bin < NUM_BINS; ++bin) { 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tiles_[bin].clear(); 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bin_sorted_[bin] = true; 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool PrioritizedTileSet::IsEmpty() { 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (int bin = 0; bin < NUM_BINS; ++bin) 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!tiles_[bin].empty()) 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return false; 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrioritizedTileSet::SortBinIfNeeded(ManagedTileBin bin) { 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!bin_sorted_[bin]) { 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SortBinTiles(bin, &tiles_[bin]); 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bin_sorted_[bin] = true; 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 106116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPrioritizedTileSet::Iterator::Iterator( 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PrioritizedTileSet* tile_set, bool use_priority_ordering) 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : tile_set_(tile_set), 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_bin_(NOW_AND_READY_TO_DRAW_BIN), 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch use_priority_ordering_(use_priority_ordering) { 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (use_priority_ordering_) 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tile_set_->SortBinIfNeeded(current_bin_); 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iterator_ = tile_set->tiles_[current_bin_].begin(); 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iterator_ == tile_set_->tiles_[current_bin_].end()) 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AdvanceList(); 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 118116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPrioritizedTileSet::Iterator::~Iterator() {} 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrioritizedTileSet::Iterator::DisablePriorityOrdering() { 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch use_priority_ordering_ = false; 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 124116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPrioritizedTileSet::Iterator& 125116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPrioritizedTileSet::Iterator::operator++() { 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We can't increment past the end of the tiles. 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(iterator_ != tile_set_->tiles_[current_bin_].end()); 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++iterator_; 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iterator_ == tile_set_->tiles_[current_bin_].end()) 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AdvanceList(); 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return *this; 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 135116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTile* PrioritizedTileSet::Iterator::operator*() { 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(iterator_ != tile_set_->tiles_[current_bin_].end()); 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return *iterator_; 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrioritizedTileSet::Iterator::AdvanceList() { 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(iterator_ == tile_set_->tiles_[current_bin_].end()); 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch while (current_bin_ != NEVER_BIN) { 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch current_bin_ = static_cast<ManagedTileBin>(current_bin_ + 1); 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (use_priority_ordering_) 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tile_set_->SortBinIfNeeded(current_bin_); 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iterator_ = tile_set_->tiles_[current_bin_].begin(); 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iterator_ != tile_set_->tiles_[current_bin_].end()) 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace cc 156