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

Side by Side Diff: cc/delegated_renderer_layer_impl.cc

Issue 12340095: cc: Make damage on delegated frame damage the host layer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nit Created 7 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « cc/delegated_renderer_layer_impl.h ('k') | cc/layer_impl.h » ('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/delegated_renderer_layer_impl.h" 5 #include "cc/delegated_renderer_layer_impl.h"
6 6
7 #include "cc/append_quads_data.h" 7 #include "cc/append_quads_data.h"
8 #include "cc/delegated_frame_data.h"
8 #include "cc/layer_tree_impl.h" 9 #include "cc/layer_tree_impl.h"
9 #include "cc/math_util.h" 10 #include "cc/math_util.h"
10 #include "cc/quad_sink.h" 11 #include "cc/quad_sink.h"
11 #include "cc/render_pass_draw_quad.h" 12 #include "cc/render_pass_draw_quad.h"
12 #include "cc/render_pass_sink.h" 13 #include "cc/render_pass_sink.h"
13 14
14 namespace cc { 15 namespace cc {
15 16
16 DelegatedRendererLayerImpl::DelegatedRendererLayerImpl( 17 DelegatedRendererLayerImpl::DelegatedRendererLayerImpl(
17 LayerTreeImpl* tree_impl, int id) 18 LayerTreeImpl* tree_impl, int id)
(...skipping 10 matching lines...) Expand all
28 return !render_passes_in_draw_order_.empty(); 29 return !render_passes_in_draw_order_.empty();
29 } 30 }
30 31
31 bool DelegatedRendererLayerImpl::hasContributingDelegatedRenderPasses() const { 32 bool DelegatedRendererLayerImpl::hasContributingDelegatedRenderPasses() const {
32 // The root RenderPass for the layer is merged with its target 33 // The root RenderPass for the layer is merged with its target
33 // RenderPass in each frame. So we only have extra RenderPasses 34 // RenderPass in each frame. So we only have extra RenderPasses
34 // to merge when we have a non-root RenderPass present. 35 // to merge when we have a non-root RenderPass present.
35 return render_passes_in_draw_order_.size() > 1; 36 return render_passes_in_draw_order_.size() > 1;
36 } 37 }
37 38
39 void DelegatedRendererLayerImpl::SetFrameData(
40 scoped_ptr<DelegatedFrameData> frame_data,
41 gfx::RectF damage_in_frame) {
42 CreateChildIdIfNeeded();
43 DCHECK(child_id_);
44
45 // Display size is already set so we can compute what the damage rect
46 // will be in layer space.
47 RenderPass* new_root_pass = frame_data->render_pass_list.empty() ?
48 NULL : frame_data->render_pass_list.back();
49 bool new_frame_is_empty = !new_root_pass;
50
51 RenderPass* old_root_pass = render_passes_in_draw_order_.empty() ?
52 NULL : render_passes_in_draw_order_.back();
53 bool old_frame_is_empty = !old_root_pass;
54
55 gfx::RectF damage_in_layer;
56 if (new_frame_is_empty) {
57 if (!old_frame_is_empty)
58 damage_in_layer = gfx::Rect(bounds());
59 } else {
60 DCHECK(!new_root_pass->output_rect.IsEmpty());
61 damage_in_layer = MathUtil::mapClippedRect(
62 DelegatedFrameToLayerSpaceTransform(new_root_pass->output_rect.size()),
63 damage_in_frame);
64 }
65 setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer));
66
67 // TODO(danakj): Convert the resource ids the render passes and return data
68 // for a frame ack.
69 SetRenderPasses(frame_data->render_pass_list);
70 }
71
72 void DelegatedRendererLayerImpl::SetDisplaySize(gfx::Size size) {
73 if (display_size_ == size)
74 return;
75 display_size_ = size;
76 noteLayerPropertyChanged();
77 }
78
38 void DelegatedRendererLayerImpl::SetRenderPasses( 79 void DelegatedRendererLayerImpl::SetRenderPasses(
39 ScopedPtrVector<RenderPass>& render_passes_in_draw_order) { 80 ScopedPtrVector<RenderPass>& render_passes_in_draw_order) {
40 gfx::RectF old_root_damage; 81 gfx::RectF old_root_damage;
41 if (!render_passes_in_draw_order_.empty()) 82 if (!render_passes_in_draw_order_.empty())
42 old_root_damage = render_passes_in_draw_order_.back()->damage_rect; 83 old_root_damage = render_passes_in_draw_order_.back()->damage_rect;
43 84
44 ClearRenderPasses(); 85 ClearRenderPasses();
45 86
46 for (size_t i = 0; i < render_passes_in_draw_order.size(); ++i) { 87 for (size_t i = 0; i < render_passes_in_draw_order.size(); ++i) {
47 render_passes_index_by_id_.insert( 88 render_passes_index_by_id_.insert(
(...skipping 18 matching lines...) Expand all
66 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::createLayerImpl( 107 scoped_ptr<LayerImpl> DelegatedRendererLayerImpl::createLayerImpl(
67 LayerTreeImpl* treeImpl) { 108 LayerTreeImpl* treeImpl) {
68 return DelegatedRendererLayerImpl::create(treeImpl, id()).PassAs<LayerImpl>(); 109 return DelegatedRendererLayerImpl::create(treeImpl, id()).PassAs<LayerImpl>();
69 } 110 }
70 111
71 void DelegatedRendererLayerImpl::didLoseOutputSurface() { 112 void DelegatedRendererLayerImpl::didLoseOutputSurface() {
72 ClearRenderPasses(); 113 ClearRenderPasses();
73 ClearChildId(); 114 ClearChildId();
74 } 115 }
75 116
117 gfx::Transform DelegatedRendererLayerImpl::DelegatedFrameToLayerSpaceTransform(
118 gfx::Size frame_size) const {
119 gfx::Size display_size = display_size_.IsEmpty() ? bounds() : display_size_;
120
121 gfx::Transform delegated_frame_to_layer_space_transform;
122 delegated_frame_to_layer_space_transform.Scale(
123 static_cast<double>(display_size.width()) / frame_size.width(),
124 static_cast<double>(display_size.height()) / frame_size.height());
125 return delegated_frame_to_layer_space_transform;
126 }
127
76 static inline int IndexToId(int index) { return index + 1; } 128 static inline int IndexToId(int index) { return index + 1; }
77 static inline int IdToIndex(int id) { return id - 1; } 129 static inline int IdToIndex(int id) { return id - 1; }
78 130
79 RenderPass::Id DelegatedRendererLayerImpl::firstContributingRenderPassId() 131 RenderPass::Id DelegatedRendererLayerImpl::firstContributingRenderPassId()
80 const { 132 const {
81 return RenderPass::Id(id(), IndexToId(0)); 133 return RenderPass::Id(id(), IndexToId(0));
82 } 134 }
83 135
84 RenderPass::Id DelegatedRendererLayerImpl::nextContributingRenderPassId( 136 RenderPass::Id DelegatedRendererLayerImpl::nextContributingRenderPassId(
85 RenderPass::Id previous) const { 137 RenderPass::Id previous) const {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 delegated_shared_quad_state = delegated_quad->shared_quad_state; 216 delegated_shared_quad_state = delegated_quad->shared_quad_state;
165 output_shared_quad_state = quad_sink->useSharedQuadState( 217 output_shared_quad_state = quad_sink->useSharedQuadState(
166 delegated_shared_quad_state->Copy()); 218 delegated_shared_quad_state->Copy());
167 219
168 bool is_root_delegated_render_pass = 220 bool is_root_delegated_render_pass =
169 delegated_render_pass == render_passes_in_draw_order_.back(); 221 delegated_render_pass == render_passes_in_draw_order_.back();
170 if (is_root_delegated_render_pass) { 222 if (is_root_delegated_render_pass) {
171 // Don't allow areas inside the bounds that are empty. 223 // Don't allow areas inside the bounds that are empty.
172 DCHECK(display_size_.IsEmpty() || 224 DCHECK(display_size_.IsEmpty() ||
173 gfx::Rect(display_size_).Contains(gfx::Rect(bounds()))); 225 gfx::Rect(display_size_).Contains(gfx::Rect(bounds())));
174 gfx::Size display_size =
175 display_size_.IsEmpty() ? bounds() : display_size_;
176
177 gfx::Transform delegated_frame_to_layer_space_transform;
178 delegated_frame_to_layer_space_transform.Scale(
179 static_cast<double>(display_size.width()) / frame_size.width(),
180 static_cast<double>(display_size.height()) / frame_size.height());
181
182 gfx::Transform delegated_frame_to_target_transform = 226 gfx::Transform delegated_frame_to_target_transform =
183 drawTransform() * delegated_frame_to_layer_space_transform; 227 drawTransform() * DelegatedFrameToLayerSpaceTransform(frame_size);
184 228
185 output_shared_quad_state->content_to_target_transform.ConcatTransform( 229 output_shared_quad_state->content_to_target_transform.ConcatTransform(
186 delegated_frame_to_target_transform); 230 delegated_frame_to_target_transform);
187 231
188 if (renderTarget() == this) { 232 if (renderTarget() == this) {
189 DCHECK(!isClipped()); 233 DCHECK(!isClipped());
190 DCHECK(renderSurface()); 234 DCHECK(renderSurface());
191 output_shared_quad_state->clip_rect = MathUtil::mapClippedRect( 235 output_shared_quad_state->clip_rect = MathUtil::mapClippedRect(
192 delegated_frame_to_target_transform, 236 delegated_frame_to_target_transform,
193 output_shared_quad_state->clip_rect); 237 output_shared_quad_state->clip_rect);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 void DelegatedRendererLayerImpl::ClearChildId() { 287 void DelegatedRendererLayerImpl::ClearChildId() {
244 if (!child_id_) 288 if (!child_id_)
245 return; 289 return;
246 290
247 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider(); 291 ResourceProvider* resource_provider = layerTreeImpl()->resource_provider();
248 resource_provider->destroyChild(child_id_); 292 resource_provider->destroyChild(child_id_);
249 child_id_ = 0; 293 child_id_ = 0;
250 } 294 }
251 295
252 } // namespace cc 296 } // namespace cc
OLDNEW
« no previous file with comments | « cc/delegated_renderer_layer_impl.h ('k') | cc/layer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698