Loading...
Searching...
No Matches
RdmaPlayoutProbe.hpp File Reference

Content-verified one-time probe of the GPU->peer (playout) P2P path. More...

Detailed Description

Content-verified one-time probe of the GPU->peer (playout) P2P path.

Pinning a CUDA buffer for a capture card only proves nvidia_p2p_get_pages accepted the range. It does not prove the card can actually read that memory over PCIe: with the IOMMU in full-translation mode, or with the card and the GPU behind different host bridges, the transfer is silently dropped while every SDK call still returns success. The card then plays out whatever its framestore already held — a constant frame — and the pump reports a full frame count with zero drops.

The capture direction is already content-verified by its vendor adapter (seed the pinned buffer, run a real card->GPU transfer, check the bytes changed). This is the playout counterpart, and it lives here rather than in an addon so every vendor gets the same assertion: seed the pinned buffer with a known non-degenerate pattern, ask the vendor to push it to the device, ask the vendor to read it back, and compare 1:1.

The GPU seeding is injected (RdmaPlayoutProbeIo) so the decision table is exercisable without a CUDA driver.

Go to the source code of this file.

Classes

struct  score::gfx::interop::RdmaPlayoutProbeIo
 

Namespaces

namespace  score
 Base toolkit upon which the software is built.
 
namespace  score::gfx
 Graphics rendering pipeline for ossia score.
 

Enumerations

enum class  score::gfx::interop::RdmaPlayoutProbeResult {
  Delivered , Unverified , NoProbe , SeedFailed ,
  TransferFailed , ReadbackFailed , ContentMismatch
}
 

Functions

unsigned char score::gfx::interop::rdmaPlayoutProbeByte (std::uint32_t index) noexcept
 
RdmaPlayoutProbeResult score::gfx::interop::rdmaProbePlayoutPath (void *pinnedGpuPtr, std::uint32_t frameByteSize, const VendorDmaRegistrar &registrar, const RdmaPlayoutProbeIo &io) noexcept
 Run the probe. pinnedGpuPtr must already be pinned by the vendor.
 
bool score::gfx::interop::rdmaPlayoutProbeEngages (RdmaPlayoutProbeResult r) noexcept
 True for the results on which an RDMA output rung may engage.
 
const char * score::gfx::interop::rdmaPlayoutProbeMessage (RdmaPlayoutProbeResult r) noexcept
 

Variables

constexpr std::uint32_t score::gfx::interop::rdmaPlayoutProbeMaxBytes = 64u * 1024u
 

Enumeration Type Documentation

◆ RdmaPlayoutProbeResult

Enumerator
Delivered 

Pushed and read back byte-identical: the peer really reads GPU memory.

Unverified 

Pushed successfully, but the vendor supplied no readback hook, so delivery rests on a return code alone.

NoProbe 

The vendor supplied no verifyTransfer at all — nothing was probed.

SeedFailed 

The pattern could not be written into the pinned GPU buffer.

TransferFailed 

verifyTransfer returned false.

ReadbackFailed 

readbackTransfer returned false.

ContentMismatch 

The peer returned bytes that are not the ones it was given.

Function Documentation

◆ rdmaPlayoutProbeByte()

unsigned char score::gfx::interop::rdmaPlayoutProbeByte ( std::uint32_t  index)
noexcept

Deterministic, non-degenerate pattern. Never constant and never all-zero, so a dropped transfer (stale framestore, zero-filled scratch) cannot alias a correct result.

Variable Documentation

◆ rdmaPlayoutProbeMaxBytes

constexpr std::uint32_t score::gfx::interop::rdmaPlayoutProbeMaxBytes = 64u * 1024u
inlineconstexpr

Bytes the probe seeds and compares: enough to cross several GPU pages, capped so the probe stays cheap at 8K rasters.