Still produce quad when tile OOM and on demand raster is not allowed

When on demand raster is not allowed, when tiles are OOM, checkerboard
or solid color quad should be produced rather than nothing.

Add a unittest for this exact same scenario.

BUG=402321

Review URL: https://codereview.chromium.org/468983002

Cr-Commit-Position: refs/heads/master@{#289480}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289480 0039d316-1c4b-4281-b951-d872f2087c98
parent 07892b2f
......@@ -281,6 +281,7 @@ void PictureLayerImpl::AppendQuads(
append_quads_data->visible_content_area +=
visible_geometry_rect.width() * visible_geometry_rect.height();
bool has_draw_quad = false;
if (*iter && iter->IsReadyToDraw()) {
const ManagedTileState::TileVersion& tile_version =
iter->GetTileVersionForDrawing();
......@@ -303,6 +304,7 @@ void PictureLayerImpl::AppendQuads(
texture_rect,
iter.texture_size(),
tile_version.contents_swizzled());
has_draw_quad = true;
break;
}
case ManagedTileState::TileVersion::PICTURE_PILE_MODE: {
......@@ -333,6 +335,7 @@ void PictureLayerImpl::AppendQuads(
iter->content_rect(),
iter->contents_scale(),
pile_);
has_draw_quad = true;
break;
}
case ManagedTileState::TileVersion::SOLID_COLOR_MODE: {
......@@ -343,10 +346,13 @@ void PictureLayerImpl::AppendQuads(
visible_geometry_rect,
tile_version.get_solid_color(),
false);
has_draw_quad = true;
break;
}
}
} else {
}
if (!has_draw_quad) {
if (draw_checkerboard_for_missing_tiles()) {
CheckerboardDrawQuad* quad =
render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
......
......@@ -3101,6 +3101,66 @@ TEST_F(PictureLayerImplTest, UpdateTilesForMasksWithNoVisibleContent) {
EXPECT_NE(0u, pending_mask_content->num_tilings());
}
class PictureLayerImplTestWithDelegatingRenderer : public PictureLayerImplTest {
public:
PictureLayerImplTestWithDelegatingRenderer() : PictureLayerImplTest() {}
virtual void InitializeRenderer() OVERRIDE {
host_impl_.InitializeRenderer(
FakeOutputSurface::CreateDelegating3d().PassAs<OutputSurface>());
}
};
TEST_F(PictureLayerImplTestWithDelegatingRenderer,
DelegatingRendererWithTileOOM) {
// This test is added for crbug.com/402321, where quad should be produced when
// raster on demand is not allowed and tile is OOM.
gfx::Size tile_size = host_impl_.settings().default_tile_size;
gfx::Size layer_bounds(1000, 1000);
// Create tiles.
scoped_refptr<FakePicturePileImpl> pending_pile =
FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
SetupPendingTree(pending_pile);
pending_layer_->SetBounds(layer_bounds);
host_impl_.SetViewportSize(layer_bounds);
ActivateTree();
host_impl_.active_tree()->UpdateDrawProperties();
std::vector<Tile*> tiles =
active_layer_->HighResTiling()->AllTilesForTesting();
host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles);
// Force tiles after max_tiles to be OOM. TileManager uses
// GlobalStateThatImpactsTilesPriority from LayerTreeHostImpl, and we cannot
// directly set state to host_impl_, so we set policy that would change the
// state. We also need to update tree priority separately.
GlobalStateThatImpactsTilePriority state;
size_t max_tiles = 1;
size_t memory_limit = max_tiles * 4 * tile_size.width() * tile_size.height();
size_t resource_limit = max_tiles;
ManagedMemoryPolicy policy(memory_limit,
gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING,
resource_limit);
host_impl_.SetMemoryPolicy(policy);
host_impl_.SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
host_impl_.ManageTiles();
MockOcclusionTracker<LayerImpl> occlusion_tracker;
scoped_ptr<RenderPass> render_pass = RenderPass::Create();
AppendQuadsData data;
active_layer_->WillDraw(DRAW_MODE_HARDWARE, NULL);
active_layer_->AppendQuads(render_pass.get(), occlusion_tracker, &data);
active_layer_->DidDraw(NULL);
// Even when OOM, quads should be produced, and should be different material
// from quads with resource.
EXPECT_LT(max_tiles, render_pass->quad_list.size());
EXPECT_EQ(DrawQuad::Material::TILED_CONTENT,
render_pass->quad_list.front()->material);
EXPECT_EQ(DrawQuad::Material::SOLID_COLOR,
render_pass->quad_list.back()->material);
}
class OcclusionTrackingSettings : public ImplSidePaintingSettings {
public:
OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; }
......
......@@ -1026,7 +1026,7 @@ scoped_refptr<RasterTask> TileManager::CreateRasterTask(Tile* tile) {
ManagedTileState& mts = tile->managed_state();
scoped_ptr<ScopedResource> resource =
resource_pool_->AcquireResource(tile->tile_size_.size());
resource_pool_->AcquireResource(tile->size());
const ScopedResource* const_resource = resource.get();
// Create and queue all image decode tasks that this tile depends on.
......
......@@ -123,7 +123,8 @@ class CC_EXPORT TileManager : public RasterizerClient,
ManagedTileState::TileVersion& tile_version =
mts.tile_versions[HIGH_QUALITY_RASTER_MODE];
tile_version.resource_ = resource_pool_->AcquireResource(gfx::Size(1, 1));
tile_version.resource_ =
resource_pool_->AcquireResource(tiles[i]->size());
bytes_releasable_ += BytesConsumedIfAllocated(tiles[i]);
++resources_releasable_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment