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

Unified Diff: cc/layers/heads_up_display_layer_impl.cc

Issue 491783003: cc: Resource list for headup display (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: the patch with ScopedPtrVector Created 6 years, 4 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/layers/heads_up_display_layer_impl.cc
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc
index fcb2733aee90279959fff97e43148cba86413eb4..772e99ca2c4f647e01c8f51a26455421d5daffd6 100644
--- a/cc/layers/heads_up_display_layer_impl.cc
+++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -81,26 +81,46 @@ scoped_ptr<LayerImpl> HeadsUpDisplayLayerImpl::CreateLayerImpl(
return HeadsUpDisplayLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
}
+void HeadsUpDisplayLayerImpl::AcquireResource(
+ ResourceProvider* resource_provider) {
+ for (ScopedPtrVector<ScopedResource>::iterator it = resources_.begin();
+ it != resources_.end();
+ ++it) {
+ if (!resource_provider->InUseByConsumer((*it)->id())) {
+ resources_.swap(it, resources_.end() - 1);
+ return;
+ }
+ }
+
+ scoped_ptr<ScopedResource> resource =
+ ScopedResource::Create(resource_provider);
+ resource->Allocate(
+ content_bounds(), ResourceProvider::TextureHintImmutable, RGBA_8888);
+ resources_.push_back(resource.Pass());
+}
+
+void HeadsUpDisplayLayerImpl::ReleaseUnmatchedSizeResources(
+ ResourceProvider* resource_provider) {
+ ScopedPtrVector<ScopedResource> to_be_kept;
+ for (ScopedPtrVector<ScopedResource>::iterator it = resources_.begin();
+ it != resources_.end();
+ ++it) {
+ if ((*it)->size() == content_bounds())
+ to_be_kept.push_back(resources_.take(it));
danakj 2014/08/27 13:25:01 i feel like the common case will be that we keep a
JungJik 2014/08/28 15:55:38 thanks for the kind explanation. however for two r
+ }
+ resources_.clear();
+
+ resources_.insert_and_take(resources_.begin(), to_be_kept);
+}
+
bool HeadsUpDisplayLayerImpl::WillDraw(DrawMode draw_mode,
ResourceProvider* resource_provider) {
if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE)
return false;
- if (!hud_resource_)
- hud_resource_ = ScopedResource::Create(resource_provider);
+ ReleaseUnmatchedSizeResources(resource_provider);
danakj 2014/08/27 13:25:01 nit: drop whitespace
- // TODO(danakj): The HUD could swap between two textures instead of creating a
- // texture every frame in ubercompositor.
- if (hud_resource_->size() != content_bounds() ||
- (hud_resource_->id() &&
- resource_provider->InUseByConsumer(hud_resource_->id()))) {
- hud_resource_->Free();
- }
-
- if (!hud_resource_->id()) {
- hud_resource_->Allocate(
- content_bounds(), ResourceProvider::TextureHintImmutable, RGBA_8888);
- }
+ AcquireResource(resource_provider);
danakj 2014/08/27 13:25:01 nit: drop whitespace
return LayerImpl::WillDraw(draw_mode, resource_provider);
}
@@ -109,7 +129,7 @@ void HeadsUpDisplayLayerImpl::AppendQuads(
RenderPass* render_pass,
const OcclusionTracker<LayerImpl>& occlusion_tracker,
AppendQuadsData* append_quads_data) {
- if (!hud_resource_->id())
+ if (!resources_.back()->id())
return;
SharedQuadState* shared_quad_state =
@@ -130,7 +150,7 @@ void HeadsUpDisplayLayerImpl::AppendQuads(
quad_rect,
opaque_rect,
visible_quad_rect,
- hud_resource_->id(),
+ resources_.back()->id(),
premultiplied_alpha,
uv_top_left,
uv_bottom_right,
@@ -142,7 +162,7 @@ void HeadsUpDisplayLayerImpl::AppendQuads(
void HeadsUpDisplayLayerImpl::UpdateHudTexture(
DrawMode draw_mode,
ResourceProvider* resource_provider) {
- if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE || !hud_resource_->id())
+ if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE || !resources_.back()->id())
return;
SkISize canvas_size;
@@ -179,14 +199,16 @@ void HeadsUpDisplayLayerImpl::UpdateHudTexture(
DCHECK(pixels);
gfx::Rect content_rect(content_bounds());
DCHECK(info.colorType() == kN32_SkColorType);
- resource_provider->SetPixels(hud_resource_->id(),
+ resource_provider->SetPixels(resources_.back()->id(),
static_cast<const uint8_t*>(pixels),
content_rect,
content_rect,
gfx::Vector2d());
}
-void HeadsUpDisplayLayerImpl::ReleaseResources() { hud_resource_.reset(); }
+void HeadsUpDisplayLayerImpl::ReleaseResources() {
+ resources_.clear();
+}
void HeadsUpDisplayLayerImpl::UpdateHudContents() {
const LayerTreeDebugState& debug_state = layer_tree_impl()->debug_state();
« cc/layers/heads_up_display_layer_impl.h ('K') | « cc/layers/heads_up_display_layer_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698