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

Unified Diff: cc/resources/tiling_set_raster_queue.cc

Issue 839143002: Roll Chrome into Mojo. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Rebase Created 5 years, 11 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
« no previous file with comments | « cc/resources/tiling_set_raster_queue.h ('k') | cc/scheduler/scheduler.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/resources/tiling_set_raster_queue.cc
diff --git a/cc/resources/tiling_set_raster_queue.cc b/cc/resources/tiling_set_raster_queue.cc
index 08f7642b8c55ed51921d49ccc462967f93971452..53fc992cccb980199e99f70ccfcdedfce1964698 100644
--- a/cc/resources/tiling_set_raster_queue.cc
+++ b/cc/resources/tiling_set_raster_queue.cc
@@ -4,6 +4,12 @@
#include "cc/resources/tiling_set_raster_queue.h"
+#include <utility>
+
+#include "cc/resources/picture_layer_tiling_set.h"
+#include "cc/resources/tile.h"
+#include "cc/resources/tile_priority.h"
+
namespace cc {
TilingSetRasterQueue::TilingSetRasterQueue()
@@ -24,15 +30,10 @@ TilingSetRasterQueue::TilingSetRasterQueue(PictureLayerTilingSet* tiling_set,
// Find high and low res tilings and initialize the iterators.
for (size_t i = 0; i < tiling_set_->num_tilings(); ++i) {
PictureLayerTiling* tiling = tiling_set_->tiling_at(i);
- if (tiling->resolution() == HIGH_RESOLUTION) {
- iterators_[HIGH_RES] =
- PictureLayerTiling::TilingRasterTileIterator(tiling);
- }
-
- if (prioritize_low_res && tiling->resolution() == LOW_RESOLUTION) {
- iterators_[LOW_RES] =
- PictureLayerTiling::TilingRasterTileIterator(tiling);
- }
+ if (tiling->resolution() == HIGH_RESOLUTION)
+ iterators_[HIGH_RES] = TilingIterator(tiling, &tiling->tiling_data_);
+ if (prioritize_low_res && tiling->resolution() == LOW_RESOLUTION)
+ iterators_[LOW_RES] = TilingIterator(tiling, &tiling->tiling_data_);
}
if (prioritize_low_res) {
@@ -57,7 +58,7 @@ TilingSetRasterQueue::TilingSetRasterQueue(PictureLayerTilingSet* tiling_set,
IteratorType index = stages_[current_stage_].iterator_type;
TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type;
- if (!iterators_[index] || iterators_[index].get_type() != tile_type)
+ if (!iterators_[index] || iterators_[index].type() != tile_type)
AdvanceToNextStage();
}
@@ -74,10 +75,10 @@ void TilingSetRasterQueue::Pop() {
// First advance the iterator.
DCHECK(iterators_[index]);
- DCHECK(iterators_[index].get_type() == tile_type);
+ DCHECK(iterators_[index].type() == tile_type);
++iterators_[index];
- if (!iterators_[index] || iterators_[index].get_type() != tile_type)
+ if (!iterators_[index] || iterators_[index].type() != tile_type)
AdvanceToNextStage();
}
@@ -86,7 +87,7 @@ Tile* TilingSetRasterQueue::Top() {
IteratorType index = stages_[current_stage_].iterator_type;
DCHECK(iterators_[index]);
- DCHECK(iterators_[index].get_type() == stages_[current_stage_].tile_type);
+ DCHECK(iterators_[index].type() == stages_[current_stage_].tile_type);
return *iterators_[index];
}
@@ -96,7 +97,7 @@ const Tile* TilingSetRasterQueue::Top() const {
IteratorType index = stages_[current_stage_].iterator_type;
DCHECK(iterators_[index]);
- DCHECK(iterators_[index].get_type() == stages_[current_stage_].tile_type);
+ DCHECK(iterators_[index].type() == stages_[current_stage_].tile_type);
return *iterators_[index];
}
@@ -108,10 +109,141 @@ void TilingSetRasterQueue::AdvanceToNextStage() {
IteratorType index = stages_[current_stage_].iterator_type;
TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type;
- if (iterators_[index] && iterators_[index].get_type() == tile_type)
+ if (iterators_[index] && iterators_[index].type() == tile_type)
break;
++current_stage_;
}
}
+TilingSetRasterQueue::TilingIterator::TilingIterator()
+ : tiling_(NULL), current_tile_(NULL) {
+}
+
+TilingSetRasterQueue::TilingIterator::TilingIterator(PictureLayerTiling* tiling,
+ TilingData* tiling_data)
+ : tiling_(tiling),
+ tiling_data_(tiling_data),
+ phase_(VISIBLE_RECT),
+ current_tile_(NULL) {
+ if (!tiling_->has_visible_rect_tiles()) {
+ AdvancePhase();
+ return;
+ }
+
+ visible_iterator_ =
+ TilingData::Iterator(tiling_data_, tiling_->current_visible_rect(),
+ false /* include_borders */);
+ if (!visible_iterator_) {
+ AdvancePhase();
+ return;
+ }
+
+ current_tile_ =
+ tiling_->TileAt(visible_iterator_.index_x(), visible_iterator_.index_y());
+ if (!current_tile_ || !TileNeedsRaster(current_tile_)) {
+ ++(*this);
+ return;
+ }
+ tiling_->UpdateTileAndTwinPriority(current_tile_);
+}
+
+TilingSetRasterQueue::TilingIterator::~TilingIterator() {
+}
+
+void TilingSetRasterQueue::TilingIterator::AdvancePhase() {
+ DCHECK_LT(phase_, EVENTUALLY_RECT);
+
+ do {
+ phase_ = static_cast<Phase>(phase_ + 1);
+ switch (phase_) {
+ case VISIBLE_RECT:
+ NOTREACHED();
+ return;
+ case SKEWPORT_RECT:
+ if (!tiling_->has_skewport_rect_tiles())
+ continue;
+
+ spiral_iterator_ = TilingData::SpiralDifferenceIterator(
+ tiling_data_, tiling_->current_skewport_rect(),
+ tiling_->current_visible_rect(), tiling_->current_visible_rect());
+ break;
+ case SOON_BORDER_RECT:
+ if (!tiling_->has_soon_border_rect_tiles())
+ continue;
+
+ spiral_iterator_ = TilingData::SpiralDifferenceIterator(
+ tiling_data_, tiling_->current_soon_border_rect(),
+ tiling_->current_skewport_rect(), tiling_->current_visible_rect());
+ break;
+ case EVENTUALLY_RECT:
+ if (!tiling_->has_eventually_rect_tiles()) {
+ current_tile_ = NULL;
+ return;
+ }
+
+ spiral_iterator_ = TilingData::SpiralDifferenceIterator(
+ tiling_data_, tiling_->current_eventually_rect(),
+ tiling_->current_skewport_rect(),
+ tiling_->current_soon_border_rect());
+ break;
+ }
+
+ while (spiral_iterator_) {
+ current_tile_ = tiling_->TileAt(spiral_iterator_.index_x(),
+ spiral_iterator_.index_y());
+ if (current_tile_ && TileNeedsRaster(current_tile_))
+ break;
+ ++spiral_iterator_;
+ }
+
+ if (!spiral_iterator_ && phase_ == EVENTUALLY_RECT) {
+ current_tile_ = NULL;
+ break;
+ }
+ } while (!spiral_iterator_);
+
+ if (current_tile_)
+ tiling_->UpdateTileAndTwinPriority(current_tile_);
+}
+
+TilingSetRasterQueue::TilingIterator& TilingSetRasterQueue::TilingIterator::
+operator++() {
+ current_tile_ = NULL;
+ while (!current_tile_ || !TileNeedsRaster(current_tile_)) {
+ std::pair<int, int> next_index;
+ switch (phase_) {
+ case VISIBLE_RECT:
+ ++visible_iterator_;
+ if (!visible_iterator_) {
+ AdvancePhase();
+ return *this;
+ }
+ next_index = visible_iterator_.index();
+ break;
+ case SKEWPORT_RECT:
+ case SOON_BORDER_RECT:
+ ++spiral_iterator_;
+ if (!spiral_iterator_) {
+ AdvancePhase();
+ return *this;
+ }
+ next_index = spiral_iterator_.index();
+ break;
+ case EVENTUALLY_RECT:
+ ++spiral_iterator_;
+ if (!spiral_iterator_) {
+ current_tile_ = NULL;
+ return *this;
+ }
+ next_index = spiral_iterator_.index();
+ break;
+ }
+ current_tile_ = tiling_->TileAt(next_index.first, next_index.second);
+ }
+
+ if (current_tile_)
+ tiling_->UpdateTileAndTwinPriority(current_tile_);
+ return *this;
+}
+
} // namespace cc
« no previous file with comments | « cc/resources/tiling_set_raster_queue.h ('k') | cc/scheduler/scheduler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698