()
| 602 | } |
| 603 | |
| 604 | function renderLoop() { |
| 605 | _rafId = null; |
| 606 | |
| 607 | const hasRenderer = |
| 608 | renderMode === "webgpu" |
| 609 | ? webgpuRenderer !== null |
| 610 | : offscreenCanvas !== null && offscreenCtx !== null; |
| 611 | |
| 612 | if (!hasRenderer) { |
| 613 | if (renderMode === "pending" && frameQueue.length > 0) { |
| 614 | _rafId = requestAnimationFrame(renderLoop); |
| 615 | return; |
| 616 | } |
| 617 | rafRunning = false; |
| 618 | return; |
| 619 | } |
| 620 | |
| 621 | if (useSharedBuffer && consumer && !consumer.isShutdown()) { |
| 622 | if (renderMode === "webgpu" && webgpuRenderer) { |
| 623 | const rendered = drainAndRenderLatestSharedWebGPU(8); |
| 624 | if (rendered) { |
| 625 | _rafId = requestAnimationFrame(renderLoop); |
| 626 | return; |
| 627 | } |
| 628 | } |
| 629 | |
| 630 | let polled = 0; |
| 631 | while (polled < 4 && tryPollSharedBuffer()) { |
| 632 | polled++; |
| 633 | } |
| 634 | } |
| 635 | |
| 636 | let frameToRender: PendingFrame | null = null; |
| 637 | let frameIndex = -1; |
| 638 | |
| 639 | for (let i = 0; i < frameQueue.length; i++) { |
| 640 | const frame = frameQueue[i]; |
| 641 | if ( |
| 642 | frameToRender === null || |
| 643 | frame.timing.frameNumber > frameToRender.timing.frameNumber |
| 644 | ) { |
| 645 | frameToRender = frame; |
| 646 | frameIndex = i; |
| 647 | } |
| 648 | } |
| 649 | |
| 650 | if (frameToRender !== null) { |
| 651 | for (let i = frameQueue.length - 1; i >= 0; i--) { |
| 652 | if (i !== frameIndex) { |
| 653 | const oldFrame = frameQueue[i]; |
| 654 | if (oldFrame.mode === "webgpu" && oldFrame.releaseCallback) { |
| 655 | oldFrame.releaseCallback(); |
| 656 | } |
| 657 | frameQueue.splice(i, 1); |
| 658 | if (i < frameIndex) { |
| 659 | frameIndex--; |
| 660 | } |
| 661 | } |
nothing calls this directly
no test coverage detected