pub struct D3d11Renderer { /* private fields */ }d3d11 and (crate features d3d11 or d3d12 or wasapi-renderer) only.Expand description
Terminal sink that submits Pixel::D3D11 video frames to a
caller-supplied D3d11FrameRenderer — the D3D11 sibling of
crate::elements::D3d12Renderer. Only built with the
d3d11 feature.
Every producer in this crate’s D3D11 stack
(crate::elements::D3d11Upload, crate::elements::D3d11Decoder,
crate::elements::DxgiCaptureSource’s GPU capture mode) is meant to
share one ID3D11Device (and its one immediate context) with
whatever D3d11FrameRenderer impl this wraps. That single-context
requirement is what makes zero-copy here need no explicit fence,
unlike crate::elements::D3d12Renderer’s submit_nv12_texture
(which needs one because the D3D12 decoder and renderer are genuinely
different devices/queues with nothing else to serialize them): an
ID3D11Device created without D3D11_CREATE_DEVICE_SINGLETHREADED has
its immediate context auto-serialized by the runtime across threads,
and as long as every element funnels its GPU commands through that one
context, the driver executes them in submission order — no separate
sync object needed. This only holds because everything shares the
same context; a second ID3D11Device in the mix would need its own
explicit synchronization, same as the D3D12 case.
Dispatches on the texture’s own DXGI_FORMAT (via GetDesc), not on
any extra tag carried by the frame. D3d11Upload and GPU screen capture
wrap manually-created textures, while D3d11Decoder receives textures
from FFmpeg’s D3D11VA frame pool; reading the actual texture description
gives all of those producer paths one reliable source of truth for the
pixel layout.
Implementations§
Source§impl D3d11Renderer
impl D3d11Renderer
Sourcepub fn new(
name: impl Into<String>,
renderer: Box<dyn D3d11FrameRenderer>,
) -> Self
pub fn new( name: impl Into<String>, renderer: Box<dyn D3d11FrameRenderer>, ) -> Self
renderer is whatever the caller’s own D3d11FrameRenderer
implementation is — already constructed and pointed at a real
window/device by the time it gets here.
Trait Implementations§
Source§impl Element for D3d11Renderer
impl Element for D3d11Renderer
Source§fn name(&self) -> Arc<str> ⓘ
fn name(&self) -> Arc<str> ⓘ
crate::bus::BusEvent stores names as
Arc<str> for exactly this reason: a hot path like
crate::queue::Queue posting BusEvent::Dropped once per
overflowed buffer shouldn’t pay for a fresh heap allocation every
time it wants to report which element it is.Source§fn element_type(&self) -> ElementType
fn element_type(&self) -> ElementType
ElementType.Source§fn pp_log(&self) -> &PpLog
fn pp_log(&self) -> &PpLog
crate::bus::Bus::post — same
id/name as Element::name, just already wrapped as the
crate::pp_log::PpLog its pp_info!/pp_warn!/pp_error! macros need. A
stored private field, not built fresh per call, for the same reason
name() returns a cheap Arc<str> clone instead of a fresh String
— see its own docs.Source§fn pp_log_mut(&mut self) -> &mut PpLog
fn pp_log_mut(&mut self) -> &mut PpLog
Element::pp_log reads — used by
crate::pipeline::ChainBuilder to stamp the owning
crate::pipeline::Pipeline’s id onto every element that
passes through it, via element_pp_log. Not meant to be called
from anywhere else.Source§impl Sink for D3d11Renderer
impl Sink for D3d11Renderer
fn consume(&mut self, buf: MediaBuffer) -> Result<()>
Source§fn control(&mut self, _msg: ControlMsg) -> Result<()>
fn control(&mut self, _msg: ControlMsg) -> Result<()>
ControlMsg (pause/resume/stop) and, for anything
with a downstream of its own, forwards it on — same shape as
consume, just a separate channel from MediaBuffer so it can
reach every element (not just ones that already know how to
interpret a data buffer) and, at a crate::queue::Queue, jump
ahead of whatever data is backed up instead of waiting behind it.
No default: every Sink has to consciously decide what this means
for it, rather than silently dropping it.