| 602 | } // ViewerInstance::getViewerArgsAndRenderViewer |
| 603 | |
| 604 | ViewerInstance::ViewerRenderRetCode |
| 605 | ViewerInstance::renderViewer(ViewIdx view, |
| 606 | bool singleThreaded, |
| 607 | bool isSequentialRender, |
| 608 | U64 viewerHash, |
| 609 | bool canAbort, |
| 610 | const NodePtr& rotoPaintNode, |
| 611 | bool useTLS, |
| 612 | ViewerArgsPtr args[2], |
| 613 | const ViewerCurrentFrameRequestSchedulerStartArgsPtr& request, |
| 614 | const RenderStatsPtr& stats) |
| 615 | { |
| 616 | if (!_imp->uiContext) { |
| 617 | return eViewerRenderRetCodeFail; |
| 618 | } |
| 619 | |
| 620 | /** |
| 621 | * When entering this code, we already know that the textures are not cached for the A and B inputs |
| 622 | * If the an input is not connected, it's args[i] will be NULL. |
| 623 | * If either one of the renders fails, that means we should block playback and clear to black the viewer |
| 624 | **/ |
| 625 | |
| 626 | ViewerInstance::ViewerRenderRetCode ret[2] = { |
| 627 | eViewerRenderRetCodeRedraw, eViewerRenderRetCodeRedraw |
| 628 | }; |
| 629 | for (int i = 0; i < 2; ++i) { |
| 630 | if (args[i] && args[i]->params) { |
| 631 | if ( (i == 1) && (_imp->uiContext->getCompositingOperator() == eViewerCompositingOperatorNone) ) { |
| 632 | args[i]->params->tiles.clear(); |
| 633 | break; |
| 634 | } |
| 635 | assert(args[i]->params->textureIndex == i); |
| 636 | |
| 637 | ///We enable render stats just for the A input (i == 0) otherwise we would get crappy results |
| 638 | |
| 639 | if (!isSequentialRender) { |
| 640 | if ( !_imp->addOngoingRender(args[i]->params->textureIndex, args[i]->params->abortInfo) ) { |
| 641 | /* |
| 642 | This may fail if another thread already pushed a more recent render in the render ages queue |
| 643 | */ |
| 644 | ret[i] = eViewerRenderRetCodeRedraw; |
| 645 | args[i].reset(); |
| 646 | } |
| 647 | } |
| 648 | if (args[i]) { |
| 649 | ret[i] = renderViewer_internal(view, singleThreaded, isSequentialRender, viewerHash, canAbort, rotoPaintNode, useTLS, request, |
| 650 | i == 0 ? stats : RenderStatsPtr(), |
| 651 | *args[i]); |
| 652 | |
| 653 | // Reset the rednering flag |
| 654 | args[i]->isRenderingFlag.reset(); |
| 655 | } |
| 656 | |
| 657 | if (ret[i] != eViewerRenderRetCodeRender) { |
| 658 | /* |
| 659 | Either failure, black or nothing, the texture is junk, remove it from the cache |
| 660 | */ |
| 661 | if (args[i] && args[i]->params) { |
no test coverage detected