| OLD | NEW |
| 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 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 } | 257 } |
| 258 | 258 |
| 259 void CompositorEngine::HitTest( | 259 void CompositorEngine::HitTest( |
| 260 RendererState* renderer_state, | 260 RendererState* renderer_state, |
| 261 mojo::PointPtr point, | 261 mojo::PointPtr point, |
| 262 const mojo::gfx::composition::HitTester::HitTestCallback& callback) { | 262 const mojo::gfx::composition::HitTester::HitTestCallback& callback) { |
| 263 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 263 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
| 264 DCHECK(point); | 264 DCHECK(point); |
| 265 DVLOG(1) << "HitTest: renderer=" << renderer_state << ", point=" << point; | 265 DVLOG(1) << "HitTest: renderer=" << renderer_state << ", point=" << point; |
| 266 | 266 |
| 267 mojo::gfx::composition::HitTestResultPtr result; | 267 // TODO(jeffbrown): hit tests on scenes |
| 268 if (renderer_state->frame()) { | 268 auto result = mojo::gfx::composition::HitTestResult::New(); |
| 269 result = | |
| 270 renderer_state->frame()->HitTest(SkPoint::Make(point->x, point->y)); | |
| 271 } | |
| 272 if (!result) { | |
| 273 result = mojo::gfx::composition::HitTestResult::New(); | |
| 274 result->hits.resize(0u); | |
| 275 } | |
| 276 | |
| 277 callback.Run(result.Pass()); | 269 callback.Run(result.Pass()); |
| 278 } | 270 } |
| 279 | 271 |
| 280 SceneDef* CompositorEngine::ResolveSceneReference( | 272 base::WeakPtr<SceneDef> CompositorEngine::ResolveSceneReference( |
| 281 mojo::gfx::composition::SceneToken* scene_token) { | 273 const mojo::gfx::composition::SceneToken& scene_token) { |
| 282 SceneState* scene_state = FindScene(scene_token->value); | 274 SceneState* scene_state = FindScene(scene_token.value); |
| 283 return scene_state ? scene_state->scene_def() : nullptr; | 275 return scene_state ? scene_state->scene_def()->GetWeakPtr() |
| 276 : base::WeakPtr<SceneDef>(); |
| 284 } | 277 } |
| 285 | 278 |
| 286 void CompositorEngine::SendResourceUnavailable(SceneState* scene_state, | 279 void CompositorEngine::SendResourceUnavailable(SceneState* scene_state, |
| 287 uint32_t resource_id) { | 280 uint32_t resource_id) { |
| 288 DCHECK(IsSceneStateRegisteredDebug(scene_state)); | 281 DCHECK(IsSceneStateRegisteredDebug(scene_state)); |
| 289 DVLOG(2) << "SendResourceUnavailable: resource_id=" << resource_id; | 282 DVLOG(2) << "SendResourceUnavailable: resource_id=" << resource_id; |
| 290 | 283 |
| 291 // TODO: Detect ANRs | 284 // TODO: Detect ANRs |
| 292 if (scene_state->scene_listener()) { | 285 if (scene_state->scene_listener()) { |
| 293 scene_state->scene_listener()->OnResourceUnavailable( | 286 scene_state->scene_listener()->OnResourceUnavailable( |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 | 347 |
| 355 void CompositorEngine::SnapshotRenderer( | 348 void CompositorEngine::SnapshotRenderer( |
| 356 RendererState* renderer_state, | 349 RendererState* renderer_state, |
| 357 const mojo::gfx::composition::FrameInfo& frame_info) { | 350 const mojo::gfx::composition::FrameInfo& frame_info) { |
| 358 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 351 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
| 359 DVLOG(2) << "SnapshotRenderer: renderer_state=" << renderer_state; | 352 DVLOG(2) << "SnapshotRenderer: renderer_state=" << renderer_state; |
| 360 | 353 |
| 361 if (VLOG_IS_ON(2)) { | 354 if (VLOG_IS_ON(2)) { |
| 362 std::ostringstream block_log; | 355 std::ostringstream block_log; |
| 363 SnapshotRendererInner(renderer_state, frame_info, &block_log); | 356 SnapshotRendererInner(renderer_state, frame_info, &block_log); |
| 364 if (!renderer_state->valid()) { | 357 if (!renderer_state->frame()) { |
| 365 DVLOG(2) << "Rendering completely blocked: " << block_log.str(); | 358 DVLOG(2) << "Rendering completely blocked: " << block_log.str(); |
| 366 } else if (!block_log.str().empty()) { | 359 } else if (!block_log.str().empty()) { |
| 367 DVLOG(2) << "Rendering partially blocked: " << block_log.str(); | 360 DVLOG(2) << "Rendering partially blocked: " << block_log.str(); |
| 368 } else { | 361 } else { |
| 369 DVLOG(2) << "Rendering unblocked"; | 362 DVLOG(2) << "Rendering unblocked"; |
| 370 } | 363 } |
| 371 } else { | 364 } else { |
| 372 SnapshotRendererInner(renderer_state, frame_info, nullptr); | 365 SnapshotRendererInner(renderer_state, frame_info, nullptr); |
| 373 } | 366 } |
| 374 } | 367 } |
| 375 | 368 |
| 376 void CompositorEngine::SnapshotRendererInner( | 369 void CompositorEngine::SnapshotRendererInner( |
| 377 RendererState* renderer_state, | 370 RendererState* renderer_state, |
| 378 const mojo::gfx::composition::FrameInfo& frame_info, | 371 const mojo::gfx::composition::FrameInfo& frame_info, |
| 379 std::ostream* block_log) { | 372 std::ostream* block_log) { |
| 380 if (!renderer_state->root_scene()) { | 373 if (!renderer_state->root_scene()) { |
| 381 if (block_log) | 374 if (block_log) |
| 382 *block_log << "No root scene" << std::endl; | 375 *block_log << "No root scene" << std::endl; |
| 383 renderer_state->SetSnapshot(nullptr); | 376 renderer_state->SetSnapshot(nullptr); |
| 384 return; | 377 return; |
| 385 } | 378 } |
| 386 | 379 |
| 387 SnapshotBuilder builder(block_log); | 380 SnapshotBuilder builder(block_log); |
| 388 renderer_state->SetSnapshot( | 381 renderer_state->SetSnapshot( |
| 389 builder.Build(renderer_state->root_scene()->scene_def(), | 382 builder.Build(renderer_state->root_scene()->scene_def(), |
| 390 renderer_state->root_scene_viewport(), frame_info)); | 383 renderer_state->root_scene_viewport(), frame_info)); |
| 391 | 384 |
| 392 if (renderer_state->valid()) | 385 if (renderer_state->frame()) |
| 393 renderer_state->output()->SubmitFrame(renderer_state->frame()); | 386 renderer_state->output()->SubmitFrame(renderer_state->frame()); |
| 394 } | 387 } |
| 395 | 388 |
| 396 void CompositorEngine::ScheduleFrameForRenderer( | 389 void CompositorEngine::ScheduleFrameForRenderer( |
| 397 RendererState* renderer_state, | 390 RendererState* renderer_state, |
| 398 Scheduler::SchedulingMode scheduling_mode) { | 391 Scheduler::SchedulingMode scheduling_mode) { |
| 399 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 392 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
| 400 renderer_state->output()->GetScheduler()->ScheduleFrame(scheduling_mode); | 393 renderer_state->output()->GetScheduler()->ScheduleFrame(scheduling_mode); |
| 401 } | 394 } |
| 402 | 395 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 | 443 |
| 451 SceneDef::Disposition disposition = | 444 SceneDef::Disposition disposition = |
| 452 PresentScene(scene_state, presentation_time); | 445 PresentScene(scene_state, presentation_time); |
| 453 if (disposition == SceneDef::Disposition::kFailed) | 446 if (disposition == SceneDef::Disposition::kFailed) |
| 454 DestroyScene(scene_state); | 447 DestroyScene(scene_state); |
| 455 else if (disposition == SceneDef::Disposition::kSucceeded) | 448 else if (disposition == SceneDef::Disposition::kSucceeded) |
| 456 InvalidateScene(scene_state); | 449 InvalidateScene(scene_state); |
| 457 } | 450 } |
| 458 | 451 |
| 459 } // namespace compositor | 452 } // namespace compositor |
| OLD | NEW |