a pin's stream on the kernel driver: the ring is the driver's, mapped into this process, and this client is a participant in it - it anchors a cursor where the indices stand and never resets them (dx::stream::cursor)
More...
template<typename device_t, typename circular_t = dx::circular, typename super_stream_t = dx::stream::control<dx::stream::object<device_t>>, typename event_t = dx::shared::event>
class dx::proxy::stream::stream< device_t, circular_t, super_stream_t, event_t >
a pin's stream on the kernel driver: the ring is the driver's, mapped into this process, and this client is a participant in it - it anchors a cursor where the indices stand and never resets them (dx::stream::cursor)
template<typename device_t, typename circular_t = dx::circular, typename super_stream_t = dx::stream::control<dx::stream::object<device_t>>, typename event_t = dx::shared::event>
start without touching the shared circular: the kernel hosting the ring resets it on its own session start - a client anchors its cursor to the indices as they stand; the group share, then the driver's own stream start IOCTL
template<typename device_t, typename circular_t = dx::circular, typename super_stream_t = dx::stream::control<dx::stream::object<device_t>>, typename event_t = dx::shared::event>
maps the driver's ring for this pin, sized as the request asks
The ring is the driver's: alloc() asks for it and keeps the mapping, free() gives it back - the driver unmaps it with this client's reference, so the base's ::free() must never see it. The pin's own direction event travels along as the broadcast the driver signals.
template<typename device_t, typename circular_t = dx::circular, typename super_stream_t = dx::stream::control<dx::stream::object<device_t>>, typename event_t = dx::shared::event>
template<typename channel_t>
| super & dx::proxy::stream::stream< device_t, circular_t, super_stream_t, event_t >::attach |
( |
channel_t ** | io[2], |
|
|
const std::vector< bool > & | channel_map, |
|
|
dx::stream< device_t, circular_t, super_stream_t, event_t >::direction::direction | direction ) |
|
inline |
takes the driver's planar channel buffers for one pin of this stream
Kernel streaming: the engine works on the driver's own double buffers instead of the ring, and the driver de-/interleaves them against it. The control block it returns carries the frame counter and the last two buffer switch timestamps.