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

Side by Side Diff: services/gfx/compositor/compositor_engine.cc

Issue 1778793002: Mozart: Make Snapshot immutable. (Closed) Base URL: git@github.com:domokit/mojo.git@moz-2
Patch Set: Created 4 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
« no previous file with comments | « no previous file | services/gfx/compositor/graph/node_def.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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "services/gfx/compositor/compositor_engine.h" 5 #include "services/gfx/compositor/compositor_engine.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <sstream> 8 #include <sstream>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 scenes_by_token_.erase(scene_state->scene_token()->value); 97 scenes_by_token_.erase(scene_state->scene_token()->value);
98 delete scene_state; 98 delete scene_state;
99 } 99 }
100 100
101 void CompositorEngine::CreateRenderer( 101 void CompositorEngine::CreateRenderer(
102 mojo::InterfaceHandle<mojo::ContextProvider> context_provider, 102 mojo::InterfaceHandle<mojo::ContextProvider> context_provider,
103 mojo::InterfaceRequest<mojo::gfx::composition::Renderer> renderer_request, 103 mojo::InterfaceRequest<mojo::gfx::composition::Renderer> renderer_request,
104 const mojo::String& label) { 104 const mojo::String& label) {
105 DCHECK(context_provider); 105 DCHECK(context_provider);
106 uint32_t renderer_id = next_renderer_id_++; 106 uint32_t renderer_id = next_renderer_id_++;
107 CHECK(renderer_id);
107 108
108 // Create the state and bind implementation to it. 109 // Create the state and bind implementation to it.
109 RendererState* renderer_state = 110 RendererState* renderer_state =
110 new RendererState(renderer_id, SanitizeLabel(label)); 111 new RendererState(renderer_id, SanitizeLabel(label));
111 RendererImpl* renderer_impl = 112 RendererImpl* renderer_impl =
112 new RendererImpl(this, renderer_state, renderer_request.Pass()); 113 new RendererImpl(this, renderer_state, renderer_request.Pass());
113 renderer_state->set_renderer_impl(renderer_impl); 114 renderer_state->set_renderer_impl(renderer_impl);
114 renderer_impl->set_connection_error_handler( 115 renderer_impl->set_connection_error_handler(
115 base::Bind(&CompositorEngine::OnRendererConnectionError, 116 base::Bind(&CompositorEngine::OnRendererConnectionError,
116 base::Unretained(this), renderer_state)); 117 base::Unretained(this), renderer_state));
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 SceneState* CompositorEngine::FindScene(uint32_t scene_token) { 303 SceneState* CompositorEngine::FindScene(uint32_t scene_token) {
303 auto it = scenes_by_token_.find(scene_token); 304 auto it = scenes_by_token_.find(scene_token);
304 return it != scenes_by_token_.end() ? it->second : nullptr; 305 return it != scenes_by_token_.end() ? it->second : nullptr;
305 } 306 }
306 307
307 void CompositorEngine::InvalidateScene(SceneState* scene_state) { 308 void CompositorEngine::InvalidateScene(SceneState* scene_state) {
308 DCHECK(IsSceneStateRegisteredDebug(scene_state)); 309 DCHECK(IsSceneStateRegisteredDebug(scene_state));
309 DVLOG(2) << "InvalidateScene: scene=" << scene_state; 310 DVLOG(2) << "InvalidateScene: scene=" << scene_state;
310 311
311 for (auto& renderer : renderers_) { 312 for (auto& renderer : renderers_) {
312 if (renderer->snapshot() && 313 if (renderer->current_snapshot() &&
313 renderer->snapshot()->InvalidateScene(scene_state->scene_def())) { 314 renderer->current_snapshot()->HasDependency(scene_state->scene_def())) {
314 ScheduleFrameForRenderer(renderer, Scheduler::SchedulingMode::kSnapshot); 315 ScheduleFrameForRenderer(renderer, Scheduler::SchedulingMode::kSnapshot);
315 } 316 }
316 } 317 }
317 } 318 }
318 319
319 SceneDef::Disposition CompositorEngine::PresentScene( 320 SceneDef::Disposition CompositorEngine::PresentScene(
320 SceneState* scene_state, 321 SceneState* scene_state,
321 int64_t presentation_time) { 322 int64_t presentation_time) {
322 DCHECK(IsSceneStateRegisteredDebug(scene_state)); 323 DCHECK(IsSceneStateRegisteredDebug(scene_state));
323 DVLOG(2) << "PresentScene: scene=" << scene_state; 324 DVLOG(2) << "PresentScene: scene=" << scene_state;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 359
359 void CompositorEngine::SnapshotRenderer( 360 void CompositorEngine::SnapshotRenderer(
360 RendererState* renderer_state, 361 RendererState* renderer_state,
361 const mojo::gfx::composition::FrameInfo& frame_info) { 362 const mojo::gfx::composition::FrameInfo& frame_info) {
362 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); 363 DCHECK(IsRendererStateRegisteredDebug(renderer_state));
363 DVLOG(2) << "SnapshotRenderer: renderer_state=" << renderer_state; 364 DVLOG(2) << "SnapshotRenderer: renderer_state=" << renderer_state;
364 365
365 if (VLOG_IS_ON(2)) { 366 if (VLOG_IS_ON(2)) {
366 std::ostringstream block_log; 367 std::ostringstream block_log;
367 SnapshotRendererInner(renderer_state, frame_info, &block_log); 368 SnapshotRendererInner(renderer_state, frame_info, &block_log);
368 if (!renderer_state->frame()) { 369 if (!renderer_state->current_snapshot() ||
370 renderer_state->current_snapshot()->is_blocked()) {
369 DVLOG(2) << "Rendering completely blocked: " << block_log.str(); 371 DVLOG(2) << "Rendering completely blocked: " << block_log.str();
370 } else if (!block_log.str().empty()) { 372 } else if (!block_log.str().empty()) {
371 DVLOG(2) << "Rendering partially blocked: " << block_log.str(); 373 DVLOG(2) << "Rendering partially blocked: " << block_log.str();
372 } else { 374 } else {
373 DVLOG(2) << "Rendering unblocked"; 375 DVLOG(2) << "Rendering unblocked";
374 } 376 }
375 } else { 377 } else {
376 SnapshotRendererInner(renderer_state, frame_info, nullptr); 378 SnapshotRendererInner(renderer_state, frame_info, nullptr);
377 } 379 }
380
381 if (renderer_state->current_snapshot() &&
382 !renderer_state->current_snapshot()->is_blocked()) {
383 renderer_state->output()->SubmitFrame(
384 renderer_state->current_snapshot()->CreateFrame(
385 renderer_state->root_scene_viewport(), frame_info));
386 }
378 } 387 }
379 388
380 void CompositorEngine::SnapshotRendererInner( 389 void CompositorEngine::SnapshotRendererInner(
381 RendererState* renderer_state, 390 RendererState* renderer_state,
382 const mojo::gfx::composition::FrameInfo& frame_info, 391 const mojo::gfx::composition::FrameInfo& frame_info,
383 std::ostream* block_log) { 392 std::ostream* block_log) {
384 if (!renderer_state->root_scene()) { 393 if (!renderer_state->root_scene()) {
385 if (block_log) 394 if (block_log)
386 *block_log << "No root scene" << std::endl; 395 *block_log << "No root scene" << std::endl;
387 renderer_state->SetSnapshot(nullptr); 396 renderer_state->SetSnapshot(nullptr);
388 return; 397 return;
389 } 398 }
390 399
391 SnapshotBuilder builder(block_log); 400 SnapshotBuilder builder(block_log);
392 renderer_state->SetSnapshot( 401 renderer_state->SetSnapshot(
393 builder.Build(renderer_state->root_scene()->scene_def(), 402 builder.Build(renderer_state->root_scene()->scene_def()));
394 renderer_state->root_scene_viewport(), frame_info));
395
396 if (renderer_state->frame())
397 renderer_state->output()->SubmitFrame(renderer_state->frame());
398 } 403 }
399 404
400 void CompositorEngine::ScheduleFrameForRenderer( 405 void CompositorEngine::ScheduleFrameForRenderer(
401 RendererState* renderer_state, 406 RendererState* renderer_state,
402 Scheduler::SchedulingMode scheduling_mode) { 407 Scheduler::SchedulingMode scheduling_mode) {
403 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); 408 DCHECK(IsRendererStateRegisteredDebug(renderer_state));
404 renderer_state->output()->GetScheduler()->ScheduleFrame(scheduling_mode); 409 renderer_state->output()->GetScheduler()->ScheduleFrame(scheduling_mode);
405 } 410 }
406 411
407 void CompositorEngine::OnOutputError( 412 void CompositorEngine::OnOutputError(
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 459
455 SceneDef::Disposition disposition = 460 SceneDef::Disposition disposition =
456 PresentScene(scene_state, presentation_time); 461 PresentScene(scene_state, presentation_time);
457 if (disposition == SceneDef::Disposition::kFailed) 462 if (disposition == SceneDef::Disposition::kFailed)
458 DestroyScene(scene_state); 463 DestroyScene(scene_state);
459 else if (disposition == SceneDef::Disposition::kSucceeded) 464 else if (disposition == SceneDef::Disposition::kSucceeded)
460 InvalidateScene(scene_state); 465 InvalidateScene(scene_state);
461 } 466 }
462 467
463 } // namespace compositor 468 } // namespace compositor
OLDNEW
« no previous file with comments | « no previous file | services/gfx/compositor/graph/node_def.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698