MCPcopy Create free account
hub / github.com/RtlZeroMemory/Rezi / requestFrame

Function requestFrame

packages/node/src/backend/nodeBackend.ts:745–839  ·  view source on GitHub ↗
(drawlist: Uint8Array)

Source from the content-addressed store, hash-verified

743 },
744
745 requestFrame(drawlist: Uint8Array): Promise<void> {
746 if (disposed) return Promise.reject(new Error("NodeBackend: disposed"));
747 if (fatal !== null) return Promise.reject(fatal);
748 if (stopRequested) return Promise.reject(new Error("NodeBackend: stopped"));
749 if (!started) {
750 return backend.start().then(() => backend.requestFrame(drawlist));
751 }
752 if (worker === null) return Promise.reject(new Error("NodeBackend: worker not available"));
753
754 const frameSeq = nextFrameSeq++;
755 const framePromise = reserveFramePromise(frameTracking, frameSeq);
756
757 if (sabFrameTransport !== null && drawlist.byteLength <= sabFrameTransport.slotBytes) {
758 const slotIndex = acquireSabSlot(sabFrameTransport);
759 if (slotIndex >= 0) {
760 const slotToken = frameSeqToSlotToken(frameSeq);
761 registerFrameAudit(
762 frameTracking,
763 frameAudit,
764 frameSeq,
765 "requestFrame",
766 FRAME_TRANSPORT_SAB_V1,
767 drawlist,
768 slotIndex,
769 slotToken,
770 );
771 const slotOffset = slotIndex * sabFrameTransport.slotBytes;
772 sabFrameTransport.dataBytes.set(drawlist, slotOffset);
773 Atomics.store(sabFrameTransport.tokens, slotIndex, slotToken);
774 Atomics.store(sabFrameTransport.states, slotIndex, FRAME_SAB_SLOT_STATE_READY);
775 publishSabFrame(sabFrameTransport, frameSeq, slotIndex, slotToken, drawlist.byteLength);
776 if (frameAudit.enabled) {
777 frameAudit.emit("frame.sab.publish", {
778 frameSeq,
779 slotIndex,
780 slotToken,
781 byteLen: drawlist.byteLength,
782 });
783 }
784 // SAB consumers wake on futex notify instead of per-frame
785 // MessagePort frameKick round-trips.
786 Atomics.notify(sabFrameTransport.controlHeader, FRAME_SAB_CONTROL_PUBLISHED_SEQ_WORD, 1);
787 return framePromise;
788 }
789 if (frameAudit.enabled) {
790 frameAudit.emit("frame.sab.fallback_transfer", {
791 frameSeq,
792 byteLen: drawlist.byteLength,
793 reason: "no-slot-available",
794 });
795 }
796 }
797
798 // Transfer fallback participates in the same ACK model:
799 // - accepted ACK (hidden marker) can unblock app scheduling early
800 // - completion promise settles on worker completion/coalescing status
801 const buf = new ArrayBuffer(drawlist.byteLength);
802 copyInto(buf, drawlist);

Callers

nothing calls this directly

Calls 13

reserveFramePromiseFunction · 0.85
acquireSabSlotFunction · 0.85
frameSeqToSlotTokenFunction · 0.85
registerFrameAuditFunction · 0.85
copyIntoFunction · 0.85
sendFunction · 0.85
releaseFrameReservationFunction · 0.85
safeErrFunction · 0.85
startMethod · 0.65
requestFrameMethod · 0.65
publishSabFrameFunction · 0.50
setMethod · 0.45

Tested by

no test coverage detected