Commit 695d3e36 authored by jungjik.lee's avatar jungjik.lee Committed by Commit bot

cc: Resource list for headup display

Current HeadUpDisplayLayerImpl allocates one resource
and reuse it continuously. This patch is trying to
allocate two resources and swap one of them
which is available.
so HeadUpDisplayLayerImpl does not need free the resource
while the layer is alive.

Bug=None

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

Cr-Commit-Position: refs/heads/master@{#292690}
parent ae77f4ee
...@@ -81,27 +81,51 @@ scoped_ptr<LayerImpl> HeadsUpDisplayLayerImpl::CreateLayerImpl( ...@@ -81,27 +81,51 @@ scoped_ptr<LayerImpl> HeadsUpDisplayLayerImpl::CreateLayerImpl(
return HeadsUpDisplayLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>(); return HeadsUpDisplayLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
} }
bool HeadsUpDisplayLayerImpl::WillDraw(DrawMode draw_mode, void HeadsUpDisplayLayerImpl::AcquireResource(
ResourceProvider* resource_provider) { ResourceProvider* resource_provider) {
if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) for (ScopedPtrVector<ScopedResource>::iterator it = resources_.begin();
return false; it != resources_.end();
++it) {
if (!resource_provider->InUseByConsumer((*it)->id())) {
resources_.swap(it, resources_.end() - 1);
return;
}
}
if (!hud_resource_) scoped_ptr<ScopedResource> resource =
hud_resource_ = ScopedResource::Create(resource_provider); ScopedResource::Create(resource_provider);
resource->Allocate(
content_bounds(), ResourceProvider::TextureHintImmutable, RGBA_8888);
resources_.push_back(resource.Pass());
}
// TODO(danakj): The HUD could swap between two textures instead of creating a class ResourceSizeIsEqualTo {
// texture every frame in ubercompositor. public:
if (hud_resource_->size() != content_bounds() || explicit ResourceSizeIsEqualTo(const gfx::Size& size_)
(hud_resource_->id() && : compare_size_(size_) {}
resource_provider->InUseByConsumer(hud_resource_->id()))) {
hud_resource_->Free();
}
if (!hud_resource_->id()) { bool operator()(const ScopedResource* resource) {
hud_resource_->Allocate( return resource->size() == compare_size_;
content_bounds(), ResourceProvider::TextureHintImmutable, RGBA_8888);
} }
private:
const gfx::Size compare_size_;
};
void HeadsUpDisplayLayerImpl::ReleaseUnmatchedSizeResources(
ResourceProvider* resource_provider) {
ScopedPtrVector<ScopedResource>::iterator it_erase =
resources_.partition(ResourceSizeIsEqualTo(content_bounds()));
resources_.erase(it_erase, resources_.end());
}
bool HeadsUpDisplayLayerImpl::WillDraw(DrawMode draw_mode,
ResourceProvider* resource_provider) {
if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE)
return false;
ReleaseUnmatchedSizeResources(resource_provider);
AcquireResource(resource_provider);
return LayerImpl::WillDraw(draw_mode, resource_provider); return LayerImpl::WillDraw(draw_mode, resource_provider);
} }
...@@ -109,7 +133,7 @@ void HeadsUpDisplayLayerImpl::AppendQuads( ...@@ -109,7 +133,7 @@ void HeadsUpDisplayLayerImpl::AppendQuads(
RenderPass* render_pass, RenderPass* render_pass,
const OcclusionTracker<LayerImpl>& occlusion_tracker, const OcclusionTracker<LayerImpl>& occlusion_tracker,
AppendQuadsData* append_quads_data) { AppendQuadsData* append_quads_data) {
if (!hud_resource_->id()) if (!resources_.back()->id())
return; return;
SharedQuadState* shared_quad_state = SharedQuadState* shared_quad_state =
...@@ -130,7 +154,7 @@ void HeadsUpDisplayLayerImpl::AppendQuads( ...@@ -130,7 +154,7 @@ void HeadsUpDisplayLayerImpl::AppendQuads(
quad_rect, quad_rect,
opaque_rect, opaque_rect,
visible_quad_rect, visible_quad_rect,
hud_resource_->id(), resources_.back()->id(),
premultiplied_alpha, premultiplied_alpha,
uv_top_left, uv_top_left,
uv_bottom_right, uv_bottom_right,
...@@ -142,7 +166,7 @@ void HeadsUpDisplayLayerImpl::AppendQuads( ...@@ -142,7 +166,7 @@ void HeadsUpDisplayLayerImpl::AppendQuads(
void HeadsUpDisplayLayerImpl::UpdateHudTexture( void HeadsUpDisplayLayerImpl::UpdateHudTexture(
DrawMode draw_mode, DrawMode draw_mode,
ResourceProvider* resource_provider) { ResourceProvider* resource_provider) {
if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE || !hud_resource_->id()) if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE || !resources_.back()->id())
return; return;
SkISize canvas_size; SkISize canvas_size;
...@@ -179,14 +203,16 @@ void HeadsUpDisplayLayerImpl::UpdateHudTexture( ...@@ -179,14 +203,16 @@ void HeadsUpDisplayLayerImpl::UpdateHudTexture(
DCHECK(pixels); DCHECK(pixels);
gfx::Rect content_rect(content_bounds()); gfx::Rect content_rect(content_bounds());
DCHECK(info.colorType() == kN32_SkColorType); DCHECK(info.colorType() == kN32_SkColorType);
resource_provider->SetPixels(hud_resource_->id(), resource_provider->SetPixels(resources_.back()->id(),
static_cast<const uint8_t*>(pixels), static_cast<const uint8_t*>(pixels),
content_rect, content_rect,
content_rect, content_rect,
gfx::Vector2d()); gfx::Vector2d());
} }
void HeadsUpDisplayLayerImpl::ReleaseResources() { hud_resource_.reset(); } void HeadsUpDisplayLayerImpl::ReleaseResources() {
resources_.clear();
}
void HeadsUpDisplayLayerImpl::UpdateHudContents() { void HeadsUpDisplayLayerImpl::UpdateHudContents() {
const LayerTreeDebugState& debug_state = layer_tree_impl()->debug_state(); const LayerTreeDebugState& debug_state = layer_tree_impl()->debug_state();
......
...@@ -119,7 +119,10 @@ class CC_EXPORT HeadsUpDisplayLayerImpl : public LayerImpl { ...@@ -119,7 +119,10 @@ class CC_EXPORT HeadsUpDisplayLayerImpl : public LayerImpl {
const std::string& label_text) const; const std::string& label_text) const;
void DrawDebugRects(SkCanvas* canvas, DebugRectHistory* debug_rect_history); void DrawDebugRects(SkCanvas* canvas, DebugRectHistory* debug_rect_history);
scoped_ptr<ScopedResource> hud_resource_; void AcquireResource(ResourceProvider* resource_provider);
void ReleaseUnmatchedSizeResources(ResourceProvider* resource_provider);
ScopedPtrVector<ScopedResource> resources_;
scoped_ptr<SkCanvas> hud_canvas_; scoped_ptr<SkCanvas> hud_canvas_;
skia::RefPtr<SkTypeface> typeface_; skia::RefPtr<SkTypeface> typeface_;
......
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