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

Side by Side Diff: content/renderer/android/synchronous_compositor_frame_sink.cc

Issue 2848223003: Enforce constant size and device scale factor for surfaces (Closed)
Patch Set: Fixed Android Created 3 years, 7 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "content/renderer/android/synchronous_compositor_frame_sink.h" 5 #include "content/renderer/android/synchronous_compositor_frame_sink.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 return; 235 return;
236 } 236 }
237 237
238 cc::CompositorFrame submit_frame; 238 cc::CompositorFrame submit_frame;
239 239
240 if (in_software_draw_) { 240 if (in_software_draw_) {
241 // The frame we send to the client is actually just the metadata. Preserve 241 // The frame we send to the client is actually just the metadata. Preserve
242 // the |frame| for the software path below. 242 // the |frame| for the software path below.
243 submit_frame.metadata = frame.metadata.Clone(); 243 submit_frame.metadata = frame.metadata.Clone();
244 244
245 if (!root_local_surface_id_.is_valid()) {
246 root_local_surface_id_ = local_surface_id_allocator_->GenerateId();
247 child_local_surface_id_ = local_surface_id_allocator_->GenerateId();
248 }
249
250 display_->SetLocalSurfaceId(root_local_surface_id_,
251 frame.metadata.device_scale_factor);
252
253 // The layer compositor should be giving a frame that covers the 245 // The layer compositor should be giving a frame that covers the
254 // |sw_viewport_for_current_draw_| but at 0,0. 246 // |sw_viewport_for_current_draw_| but at 0,0.
255 gfx::Size child_size = sw_viewport_for_current_draw_.size(); 247 gfx::Size child_size = sw_viewport_for_current_draw_.size();
256 DCHECK(gfx::Rect(child_size) == frame.render_pass_list.back()->output_rect); 248 DCHECK(gfx::Rect(child_size) == frame.render_pass_list.back()->output_rect);
257 249
258 // Make a size that covers from 0,0 and includes the area coming from the 250 // Make a size that covers from 0,0 and includes the area coming from the
259 // layer compositor. 251 // layer compositor.
260 gfx::Size display_size(sw_viewport_for_current_draw_.right(), 252 gfx::Size display_size(sw_viewport_for_current_draw_.right(),
261 sw_viewport_for_current_draw_.bottom()); 253 sw_viewport_for_current_draw_.bottom());
262 display_->Resize(display_size); 254 display_->Resize(display_size);
263 255
256 if (!root_local_surface_id_.is_valid() || display_size_ != display_size ||
257 device_scale_factor_ != frame.metadata.device_scale_factor) {
258 root_local_surface_id_ = local_surface_id_allocator_->GenerateId();
259 display_size_ = display_size;
260 device_scale_factor_ = frame.metadata.device_scale_factor;
261 }
262
263 if (!child_local_surface_id_.is_valid() || child_size_ != child_size ||
264 device_scale_factor_ != frame.metadata.device_scale_factor) {
265 child_local_surface_id_ = local_surface_id_allocator_->GenerateId();
266 child_size_ = child_size;
267 device_scale_factor_ = frame.metadata.device_scale_factor;
268 }
269
270 display_->SetLocalSurfaceId(root_local_surface_id_,
271 frame.metadata.device_scale_factor);
272
264 // The offset for the child frame relative to the origin of the canvas being 273 // The offset for the child frame relative to the origin of the canvas being
265 // drawn into. 274 // drawn into.
266 gfx::Transform child_transform; 275 gfx::Transform child_transform;
267 child_transform.Translate( 276 child_transform.Translate(
268 gfx::Vector2dF(sw_viewport_for_current_draw_.OffsetFromOrigin())); 277 gfx::Vector2dF(sw_viewport_for_current_draw_.OffsetFromOrigin()));
269 278
270 // Make a root frame that embeds the frame coming from the layer compositor 279 // Make a root frame that embeds the frame coming from the layer compositor
271 // and positions it based on the provided viewport. 280 // and positions it based on the provided viewport.
272 // TODO(danakj): We could apply the transform here instead of passing it to 281 // TODO(danakj): We could apply the transform here instead of passing it to
273 // the CompositorFrameSink client too? (We'd have to do the same for 282 // the CompositorFrameSink client too? (We'd have to do the same for
274 // hardware frames in SurfacesInstance?) 283 // hardware frames in SurfacesInstance?)
275 cc::CompositorFrame embed_frame; 284 cc::CompositorFrame embed_frame;
276 embed_frame.metadata.begin_frame_ack = frame.metadata.begin_frame_ack; 285 embed_frame.metadata.begin_frame_ack = frame.metadata.begin_frame_ack;
286 embed_frame.metadata.device_scale_factor =
287 frame.metadata.device_scale_factor;
277 embed_frame.render_pass_list.push_back(cc::RenderPass::Create()); 288 embed_frame.render_pass_list.push_back(cc::RenderPass::Create());
278 289
279 // The embedding RenderPass covers the entire Display's area. 290 // The embedding RenderPass covers the entire Display's area.
280 const auto& embed_render_pass = embed_frame.render_pass_list.back(); 291 const auto& embed_render_pass = embed_frame.render_pass_list.back();
281 embed_render_pass->SetNew(1, gfx::Rect(display_size), 292 embed_render_pass->SetNew(1, gfx::Rect(display_size),
282 gfx::Rect(display_size), gfx::Transform()); 293 gfx::Rect(display_size), gfx::Transform());
283 embed_render_pass->has_transparent_background = false; 294 embed_render_pass->has_transparent_background = false;
284 295
285 // The RenderPass has a single SurfaceDrawQuad (and SharedQuadState for it). 296 // The RenderPass has a single SurfaceDrawQuad (and SharedQuadState for it).
286 auto* shared_quad_state = 297 auto* shared_quad_state =
287 embed_render_pass->CreateAndAppendSharedQuadState(); 298 embed_render_pass->CreateAndAppendSharedQuadState();
288 auto* surface_quad = 299 auto* surface_quad =
289 embed_render_pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); 300 embed_render_pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>();
290 shared_quad_state->SetAll( 301 shared_quad_state->SetAll(
291 child_transform, gfx::Rect(child_size), gfx::Rect(child_size), 302 child_transform, gfx::Rect(child_size), gfx::Rect(child_size),
292 gfx::Rect() /* clip_rect */, false /* is_clipped */, 1.f /* opacity */, 303 gfx::Rect() /* clip_rect */, false /* is_clipped */, 1.f /* opacity */,
293 SkBlendMode::kSrcOver, 0 /* sorting_context_id */); 304 SkBlendMode::kSrcOver, 0 /* sorting_context_id */);
294 surface_quad->SetNew( 305 surface_quad->SetNew(
295 shared_quad_state, gfx::Rect(child_size), gfx::Rect(child_size), 306 shared_quad_state, gfx::Rect(child_size), gfx::Rect(child_size),
296 cc::SurfaceId(kChildFrameSinkId, child_local_surface_id_), 307 cc::SurfaceId(kChildFrameSinkId, child_local_surface_id_),
297 cc::SurfaceDrawQuadType::PRIMARY, nullptr); 308 cc::SurfaceDrawQuadType::PRIMARY, nullptr);
298 309
299 child_support_->SubmitCompositorFrame(child_local_surface_id_, 310 DCHECK(child_support_->SubmitCompositorFrame(child_local_surface_id_,
danakj 2017/05/19 19:00:59 and here
Saman Sami 2017/05/19 19:26:46 Done.
300 std::move(frame)); 311 std::move(frame)));
301 root_support_->SubmitCompositorFrame(root_local_surface_id_, 312 DCHECK(root_support_->SubmitCompositorFrame(root_local_surface_id_,
302 std::move(embed_frame)); 313 std::move(embed_frame)));
303 display_->DrawAndSwap(); 314 display_->DrawAndSwap();
304 } else { 315 } else {
305 // For hardware draws we send the whole frame to the client so it can draw 316 // For hardware draws we send the whole frame to the client so it can draw
306 // the content in it. 317 // the content in it.
307 submit_frame = std::move(frame); 318 submit_frame = std::move(frame);
308 } 319 }
309 320
310 sync_client_->SubmitCompositorFrame(compositor_frame_sink_id_, 321 sync_client_->SubmitCompositorFrame(compositor_frame_sink_id_,
311 std::move(submit_frame)); 322 std::move(submit_frame));
312 DeliverMessages(); 323 DeliverMessages();
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 const cc::ReturnedResourceArray& resources) { 485 const cc::ReturnedResourceArray& resources) {
475 DCHECK(resources.empty()); 486 DCHECK(resources.empty());
476 client_->ReclaimResources(resources); 487 client_->ReclaimResources(resources);
477 } 488 }
478 489
479 void SynchronousCompositorFrameSink::WillDrawSurface( 490 void SynchronousCompositorFrameSink::WillDrawSurface(
480 const cc::LocalSurfaceId& local_surface_id, 491 const cc::LocalSurfaceId& local_surface_id,
481 const gfx::Rect& damage_rect) {} 492 const gfx::Rect& damage_rect) {}
482 493
483 } // namespace content 494 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698