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

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: 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..7d1be46f98fe97f4d91dd11c36bbab00669defce 100644
--- a/cc/layers/heads_up_display_layer_impl.cc
+++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -68,11 +68,13 @@ double HeadsUpDisplayLayerImpl::Graph::UpdateUpperBound() {
HeadsUpDisplayLayerImpl::HeadsUpDisplayLayerImpl(LayerTreeImpl* tree_impl,
int id)
: LayerImpl(tree_impl, id),
+ hud_resource_(NULL),
typeface_(skia::AdoptRef(
SkTypeface::CreateFromName("monospace", SkTypeface::kBold))),
fps_graph_(60.0, 80.0),
paint_time_graph_(16.0, 48.0),
- fade_step_(0) {}
+ fade_step_(0) {
+}
HeadsUpDisplayLayerImpl::~HeadsUpDisplayLayerImpl() {}
@@ -81,26 +83,57 @@ scoped_ptr<LayerImpl> HeadsUpDisplayLayerImpl::CreateLayerImpl(
return HeadsUpDisplayLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
}
+ScopedResource* HeadsUpDisplayLayerImpl::AcquireResource(
+ ResourceProvider* resource_provider) {
+ HUDResourceList::iterator iter;
+ for (iter = resources_.begin(); iter != resources_.end(); ++iter) {
+ if (!resource_provider->InUseByConsumer((*iter)->id()))
danakj 2014/08/25 14:51:21 how come this doesn't check content_bounds?
JungJik 2014/08/26 11:16:35 I was trying to remove all resources which have di
+ return *iter;
+ }
+
+ scoped_ptr<ScopedResource> resource =
+ ScopedResource::Create(resource_provider);
+ resource->Allocate(
+ content_bounds(), ResourceProvider::TextureHintImmutable, RGBA_8888);
+ resources_.push_back(resource.release());
+ return resources_.back();
+}
+
+void HeadsUpDisplayLayerImpl::ReleaseUnusedResources(
+ ResourceProvider* resource_provider) {
+ bool found_unused_resource = false;
+
+ HUDResourceList::iterator iter;
+ for (iter = resources_.begin(); iter != resources_.end(); ++iter) {
+ if ((*iter)->size() != content_bounds()) {
+ ReleaseResource(iter);
danakj 2014/08/25 14:51:21 calling erase during iteration, this invalidates t
+ continue;
+ }
+
+ if (!resource_provider->InUseByConsumer((*iter)->id())) {
+ if (found_unused_resource)
danakj 2014/08/25 14:51:21 if you make Acquire move the resource it chooses t
+ ReleaseResource(iter);
+ found_unused_resource = true;
+ }
+ }
+}
+
+void HeadsUpDisplayLayerImpl::ReleaseResource(HUDResourceList::iterator iter) {
+ ScopedResource* resource = *iter;
+ if (resource->id())
danakj 2014/08/25 14:51:21 why would we have a resource without an id in the
+ resource->Free();
danakj 2014/08/25 14:51:21 the destructor already calls Free, you just need t
+ resources_.erase(iter);
+ delete resource;
danakj 2014/08/25 14:51:21 manual memory management :( what if you put the S
JungJik 2014/08/26 11:16:35 thanks for comments. ScopedPtrVector, this is what
+}
+
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);
+ ReleaseUnusedResources(resource_provider);
- // 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);
- }
+ hud_resource_ = AcquireResource(resource_provider);
danakj 2014/08/25 14:51:21 how about just using the resources_.back() and mov
JungJik 2014/08/26 11:16:35 okay, I will apply it in next patch. thank you.
return LayerImpl::WillDraw(draw_mode, resource_provider);
}
@@ -186,7 +219,12 @@ void HeadsUpDisplayLayerImpl::UpdateHudTexture(
gfx::Vector2d());
}
-void HeadsUpDisplayLayerImpl::ReleaseResources() { hud_resource_.reset(); }
+void HeadsUpDisplayLayerImpl::ReleaseResources() {
+ HUDResourceList::iterator iter;
+ for (iter = resources_.begin(); iter != resources_.end(); ++iter)
+ ReleaseResource(iter);
danakj 2014/08/25 14:51:21 If you erase while iterating the same list, you're
JungJik 2014/08/26 11:16:35 I will remember it.
+ hud_resource_ = NULL;
+}
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