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

Side by Side Diff: cc/layers/heads_up_display_layer_impl.cc

Issue 2961633002: cc: HUD handle context lost in Gpu raster.
Patch Set: update comments. Created 3 years, 5 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 unified diff | Download patch
« no previous file with comments | « cc/layers/heads_up_display_layer_impl.h ('k') | cc/trees/layer_tree_host_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layers/heads_up_display_layer_impl.h" 5 #include "cc/layers/heads_up_display_layer_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 current_upper_bound += (target_upper_bound - current_upper_bound) * 0.5; 70 current_upper_bound += (target_upper_bound - current_upper_bound) * 0.5;
71 return current_upper_bound; 71 return current_upper_bound;
72 } 72 }
73 73
74 HeadsUpDisplayLayerImpl::HeadsUpDisplayLayerImpl(LayerTreeImpl* tree_impl, 74 HeadsUpDisplayLayerImpl::HeadsUpDisplayLayerImpl(LayerTreeImpl* tree_impl,
75 int id) 75 int id)
76 : LayerImpl(tree_impl, id), 76 : LayerImpl(tree_impl, id),
77 internal_contents_scale_(1.f), 77 internal_contents_scale_(1.f),
78 fps_graph_(60.0, 80.0), 78 fps_graph_(60.0, 80.0),
79 paint_time_graph_(16.0, 48.0), 79 paint_time_graph_(16.0, 48.0),
80 fade_step_(0) { 80 fade_step_(0) {}
81 }
82 81
83 HeadsUpDisplayLayerImpl::~HeadsUpDisplayLayerImpl() {} 82 HeadsUpDisplayLayerImpl::~HeadsUpDisplayLayerImpl() {}
84 83
85 std::unique_ptr<LayerImpl> HeadsUpDisplayLayerImpl::CreateLayerImpl( 84 std::unique_ptr<LayerImpl> HeadsUpDisplayLayerImpl::CreateLayerImpl(
86 LayerTreeImpl* tree_impl) { 85 LayerTreeImpl* tree_impl) {
87 return HeadsUpDisplayLayerImpl::Create(tree_impl, id()); 86 return HeadsUpDisplayLayerImpl::Create(tree_impl, id());
88 } 87 }
89 88
90 void HeadsUpDisplayLayerImpl::AcquireResource( 89 void HeadsUpDisplayLayerImpl::AcquireResource(
91 ResourceProvider* resource_provider) { 90 ResourceProvider* resource_provider) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 bool nearest_neighbor = false; 150 bool nearest_neighbor = false;
152 TextureDrawQuad* quad = 151 TextureDrawQuad* quad =
153 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); 152 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
154 quad->SetNew(shared_quad_state, quad_rect, opaque_rect, visible_quad_rect, 153 quad->SetNew(shared_quad_state, quad_rect, opaque_rect, visible_quad_rect,
155 resources_.back()->id(), premultiplied_alpha, uv_top_left, 154 resources_.back()->id(), premultiplied_alpha, uv_top_left,
156 uv_bottom_right, SK_ColorTRANSPARENT, vertex_opacity, flipped, 155 uv_bottom_right, SK_ColorTRANSPARENT, vertex_opacity, flipped,
157 nearest_neighbor, false); 156 nearest_neighbor, false);
158 ValidateQuadResources(quad); 157 ValidateQuadResources(quad);
159 } 158 }
160 159
161 void HeadsUpDisplayLayerImpl::UpdateHudTexture( 160 ResourceId HeadsUpDisplayLayerImpl::UpdateHudTexture(
162 DrawMode draw_mode, 161 DrawMode draw_mode,
163 ResourceProvider* resource_provider, 162 ResourceProvider* resource_provider,
164 ContextProvider* context_provider) { 163 ContextProvider* context_provider) {
165 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE || !resources_.back()->id()) 164 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE || !resources_.back()->id())
166 return; 165 return 0U;
167 166
168 if (context_provider) { 167 if (context_provider) {
169 gpu::gles2::GLES2Interface* gl = context_provider->ContextGL(); 168 gpu::gles2::GLES2Interface* gl = context_provider->ContextGL();
170 DCHECK(gl); 169 DCHECK(gl);
171 ScopedGpuRaster gpu_raster(context_provider); 170 ScopedGpuRaster gpu_raster(context_provider);
172 bool using_worker_context = false; 171 bool using_worker_context = false;
173 ResourceProvider::ScopedWriteLockGL lock( 172 ResourceProvider::ScopedWriteLockGL lock(
174 resource_provider, resources_.back()->id(), using_worker_context); 173 resource_provider, resources_.back()->id(), using_worker_context);
175 174
176 TRACE_EVENT_BEGIN0("cc", "CreateHudCanvas"); 175 TRACE_EVENT_BEGIN0("cc", "CreateHudCanvas");
177 bool use_distance_field_text = false; 176 bool use_distance_field_text = false;
178 bool can_use_lcd_text = false; 177 bool can_use_lcd_text = false;
179 int msaa_sample_count = 0; 178 int msaa_sample_count = 0;
180 ResourceProvider::ScopedSkSurfaceProvider scoped_surface( 179 ResourceProvider::ScopedSkSurfaceProvider scoped_surface(
181 context_provider, &lock, using_worker_context, use_distance_field_text, 180 context_provider, &lock, using_worker_context, use_distance_field_text,
182 can_use_lcd_text, msaa_sample_count); 181 can_use_lcd_text, msaa_sample_count);
182 if (!scoped_surface.sk_surface())
183 return resources_.back()->id();
183 SkCanvas* gpu_raster_canvas = scoped_surface.sk_surface()->getCanvas(); 184 SkCanvas* gpu_raster_canvas = scoped_surface.sk_surface()->getCanvas();
184 TRACE_EVENT_END0("cc", "CreateHudCanvas"); 185 TRACE_EVENT_END0("cc", "CreateHudCanvas");
185 186
186 UpdateHudContents(); 187 UpdateHudContents();
187 188
188 DrawHudContents(gpu_raster_canvas); 189 DrawHudContents(gpu_raster_canvas);
189 190
190 TRACE_EVENT_BEGIN0("cc", "UploadHudTexture"); 191 TRACE_EVENT_BEGIN0("cc", "UploadHudTexture");
191 const uint64_t fence = gl->InsertFenceSyncCHROMIUM(); 192 const uint64_t fence = gl->InsertFenceSyncCHROMIUM();
192 gl->OrderingBarrierCHROMIUM(); 193 gl->OrderingBarrierCHROMIUM();
(...skipping 24 matching lines...) Expand all
217 218
218 TRACE_EVENT0("cc", "UploadHudTexture"); 219 TRACE_EVENT0("cc", "UploadHudTexture");
219 SkPixmap pixmap; 220 SkPixmap pixmap;
220 hud_surface_->peekPixels(&pixmap); 221 hud_surface_->peekPixels(&pixmap);
221 DCHECK(pixmap.addr()); 222 DCHECK(pixmap.addr());
222 DCHECK(pixmap.info().colorType() == kN32_SkColorType); 223 DCHECK(pixmap.info().colorType() == kN32_SkColorType);
223 resource_provider->CopyToResource( 224 resource_provider->CopyToResource(
224 resources_.back()->id(), static_cast<const uint8_t*>(pixmap.addr()), 225 resources_.back()->id(), static_cast<const uint8_t*>(pixmap.addr()),
225 internal_content_bounds_); 226 internal_content_bounds_);
226 } 227 }
228
229 return 0U;
227 } 230 }
228 231
229 void HeadsUpDisplayLayerImpl::ReleaseResources() { 232 void HeadsUpDisplayLayerImpl::ReleaseResources() {
230 resources_.clear(); 233 resources_.clear();
231 } 234 }
232 235
233 gfx::Rect HeadsUpDisplayLayerImpl::GetEnclosingRectInTargetSpace() const { 236 gfx::Rect HeadsUpDisplayLayerImpl::GetEnclosingRectInTargetSpace() const {
234 DCHECK_GT(internal_contents_scale_, 0.f); 237 DCHECK_GT(internal_contents_scale_, 0.f);
235 return GetScaledEnclosingRectInTargetSpace(internal_contents_scale_); 238 return GetScaledEnclosingRectInTargetSpace(internal_contents_scale_);
236 } 239 }
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 &paint, 816 &paint,
814 paint_rects_[i], 817 paint_rects_[i],
815 DebugColors::PaintRectBorderColor(fade_step_), 818 DebugColors::PaintRectBorderColor(fade_step_),
816 DebugColors::PaintRectFillColor(fade_step_), 819 DebugColors::PaintRectFillColor(fade_step_),
817 DebugColors::PaintRectBorderWidth(), 820 DebugColors::PaintRectBorderWidth(),
818 ""); 821 "");
819 } 822 }
820 } 823 }
821 } 824 }
822 825
826 void HeadsUpDisplayLayerImpl::EvictHudQuad(const RenderPassList& list) {
827 ResourceId evict_resource_id = resources_.back()->id();
828 // This iterates over the render pass list of quads to evict the hud quad
829 // appended during render pass preparation. We need this eviction when we
830 // have a context loss during SkSurface creation in UpdateHudTexture, and
831 // we early out without updating the Hud contents.
832 for (const auto& render_pass : list) {
833 for (auto it = render_pass->quad_list.begin();
834 it != render_pass->quad_list.end(); ++it) {
835 for (ResourceId resource_id : it->resources) {
836 if (resource_id == evict_resource_id) {
837 render_pass->quad_list.EraseAndInvalidateAllPointers(it);
838 return;
839 }
840 }
841 }
842 }
843 }
844
823 const char* HeadsUpDisplayLayerImpl::LayerTypeAsString() const { 845 const char* HeadsUpDisplayLayerImpl::LayerTypeAsString() const {
824 return "cc::HeadsUpDisplayLayerImpl"; 846 return "cc::HeadsUpDisplayLayerImpl";
825 } 847 }
826 848
827 void HeadsUpDisplayLayerImpl::AsValueInto( 849 void HeadsUpDisplayLayerImpl::AsValueInto(
828 base::trace_event::TracedValue* dict) const { 850 base::trace_event::TracedValue* dict) const {
829 LayerImpl::AsValueInto(dict); 851 LayerImpl::AsValueInto(dict);
830 dict->SetString("layer_name", "Heads Up Display Layer"); 852 dict->SetString("layer_name", "Heads Up Display Layer");
831 } 853 }
832 854
833 } // namespace cc 855 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/heads_up_display_layer_impl.h ('k') | cc/trees/layer_tree_host_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698