| 615 | if (context == nullptr) { |
| 616 | return; |
| 617 | } |
| 618 | |
| 619 | auto taskIdOptional = context->enqueueRenderRequest(renderRequest); |
| 620 | |
| 621 | if (taskIdOptional && !_autoRenderDisabled) { |
| 622 | getMainThreadManager().dispatch( |
| 623 | context, [context, taskId = taskIdOptional.value()]() { context->runRenderRequest(taskId); }); |
| 624 | } |
| 625 | } |
| 626 | |
| 627 | void Runtime::processRenderRequest(const Ref<RenderRequest>& rawRenderRequest) { |
| 628 | snap::utils::time::StopWatch sw; |
| 629 | sw.start(); |
| 630 | |
| 631 | if (_debugRequests) { |
| 632 | VALDI_INFO(*_logger, |
| 633 | "Rendering context {} with render request: {}", |
| 634 | rawRenderRequest->getContextId(), |
| 635 | rawRenderRequest->serialize(_attributeIds).toString(true)); |
| 636 | } |
| 637 | auto viewNodeTree = getOrCreateViewNodeTreeForContextId(rawRenderRequest->getContextId()); |
| 638 | if (viewNodeTree == nullptr) { |
| 639 | VALDI_INFO(*_logger, "Ignoring render for invalid or destroyed context {}", rawRenderRequest->getContextId()); |
| 640 | return; |
| 641 | } |
| 642 | |
| 643 | #if VALDI_DEBUG_TREE_UPDATES |
| 644 | std::string renderTrigger = getRenderRequestAttributeNamesTrigger(*rawRenderRequest, _attributeIds); |
| 645 | viewNodeTree->scheduleExclusiveUpdate( |
| 646 | [=]() { |
| 647 | VALDI_TRACE_META("Valdi.processRenderRequest", std::to_string(rawRenderRequest->getEntriesSize())); |
| 648 | |
| 649 | ViewNodeRenderer renderer(*viewNodeTree, viewNodeTree->getContext()->getLogger(), _limitToViewportDisabled); |
| 650 | |
| 651 | renderer.render(*rawRenderRequest); |
| 652 | |
| 653 | if (Valdi::traceRenderingPerformance) { |
| 654 | VALDI_INFO( |
| 655 | *_logger, "Finished rendering {} in {}", viewNodeTree->getContext()->getPath(), sw.elapsed()); |
| 656 | } |
| 657 | |
| 658 | if (rawRenderRequest->getEntriesSize() >= Valdi::kEmitProcessRequestLatencyEntriesThreshold) { |
| 659 | const auto& metrics = getMetrics(); |
| 660 | if (metrics != nullptr) { |
| 661 | metrics->emitProcessRequestLatency(viewNodeTree->getContext()->getPath().getResourceId().bundleName, |
| 662 | sw.elapsed()); |
| 663 | } |
| 664 | } |
| 665 | |
| 666 | viewNodeTree->getContext()->onRendered(); |
| 667 | }, |
| 668 | [=]() { |
| 669 | if (_listener != nullptr) { |
| 670 | _listener->onContextRendered(*this, viewNodeTree->getContext()); |
| 671 | } |
| 672 | }, |
| 673 | std::move(renderTrigger)); |
| 674 | #else |