# {py:mod}`simvx.graphics.gpu.multi_device` ```{py:module} simvx.graphics.gpu.multi_device ``` ```{autodoc2-docstring} simvx.graphics.gpu.multi_device :allowtitles: ``` ## Module Contents ### Classes ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`DeviceSlot ` - ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot :summary: ``` * - {py:obj}`MultiDeviceManager ` - ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager :summary: ``` * - {py:obj}`SRUAssignment ` - ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUAssignment :summary: ``` * - {py:obj}`TransferMethod ` - ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.TransferMethod :summary: ``` * - {py:obj}`CrossDeviceTransfer ` - ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer :summary: ``` * - {py:obj}`OffloadRoute ` - ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.OffloadRoute :summary: ``` * - {py:obj}`SRUOffloadCoordinator ` - ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUOffloadCoordinator :summary: ``` ```` ### Functions ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`assign_srus ` - ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.assign_srus :summary: ``` * - {py:obj}`select_transfer_method ` - ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.select_transfer_method :summary: ``` ```` ### Data ````{list-table} :class: autosummary longtable :align: left * - {py:obj}`log ` - ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.log :summary: ``` * - {py:obj}`__all__ ` - ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.__all__ :summary: ``` ```` ### API ````{py:data} log :canonical: simvx.graphics.gpu.multi_device.log :value: > 'getLogger(...)' ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.log ``` ```` ````{py:data} __all__ :canonical: simvx.graphics.gpu.multi_device.__all__ :value: > ['DeviceSlot', 'MultiDeviceManager', 'SRUAssignment', 'assign_srus', 'CrossDeviceTransfer', 'Transfe... ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.__all__ ``` ```` `````{py:class} DeviceSlot :canonical: simvx.graphics.gpu.multi_device.DeviceSlot ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot ``` ````{py:attribute} index :canonical: simvx.graphics.gpu.multi_device.DeviceSlot.index :type: int :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot.index ``` ```` ````{py:attribute} physical_device :canonical: simvx.graphics.gpu.multi_device.DeviceSlot.physical_device :type: typing.Any :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot.physical_device ``` ```` ````{py:attribute} queue_families :canonical: simvx.graphics.gpu.multi_device.DeviceSlot.queue_families :type: simvx.graphics.gpu.device.QueueFamilies :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot.queue_families ``` ```` ````{py:attribute} device :canonical: simvx.graphics.gpu.multi_device.DeviceSlot.device :type: typing.Any :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot.device ``` ```` ````{py:attribute} graphics_queue :canonical: simvx.graphics.gpu.multi_device.DeviceSlot.graphics_queue :type: typing.Any :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot.graphics_queue ``` ```` ````{py:attribute} present_queue :canonical: simvx.graphics.gpu.multi_device.DeviceSlot.present_queue :type: typing.Any :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot.present_queue ``` ```` ````{py:attribute} compute_queue :canonical: simvx.graphics.gpu.multi_device.DeviceSlot.compute_queue :type: typing.Any :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot.compute_queue ``` ```` ````{py:attribute} transfer_queue :canonical: simvx.graphics.gpu.multi_device.DeviceSlot.transfer_queue :type: typing.Any :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot.transfer_queue ``` ```` ````{py:attribute} name :canonical: simvx.graphics.gpu.multi_device.DeviceSlot.name :type: str :value: ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot.name ``` ```` ````{py:attribute} renderer :canonical: simvx.graphics.gpu.multi_device.DeviceSlot.renderer :type: typing.Any :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot.renderer ``` ```` ````{py:property} is_primary :canonical: simvx.graphics.gpu.multi_device.DeviceSlot.is_primary :type: bool ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.DeviceSlot.is_primary ``` ```` ````` `````{py:class} MultiDeviceManager(*, primary_physical_device: typing.Any, primary_queue_families: simvx.graphics.gpu.device.QueueFamilies, primary_device: typing.Any, primary_graphics_queue: typing.Any, primary_present_queue: typing.Any, physical_devices: list[typing.Any], enabled: bool, capabilities: simvx.graphics.gpu.capabilities.RenderCapabilities | None = None, primary_compute_queue: typing.Any = None, primary_transfer_queue: typing.Any = None, find_queue_families: typing.Any = None) :canonical: simvx.graphics.gpu.multi_device.MultiDeviceManager ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager.__init__ ``` ````{py:property} multi_gpu :canonical: simvx.graphics.gpu.multi_device.MultiDeviceManager.multi_gpu :type: bool ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager.multi_gpu ``` ```` ````{py:property} device_count :canonical: simvx.graphics.gpu.multi_device.MultiDeviceManager.device_count :type: int ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager.device_count ``` ```` ````{py:property} primary :canonical: simvx.graphics.gpu.multi_device.MultiDeviceManager.primary :type: simvx.graphics.gpu.multi_device.DeviceSlot ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager.primary ``` ```` ````{py:property} secondaries :canonical: simvx.graphics.gpu.multi_device.MultiDeviceManager.secondaries :type: list[simvx.graphics.gpu.multi_device.DeviceSlot] ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager.secondaries ``` ```` ````{py:property} slots :canonical: simvx.graphics.gpu.multi_device.MultiDeviceManager.slots :type: list[simvx.graphics.gpu.multi_device.DeviceSlot] ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager.slots ``` ```` ````{py:method} slot(index: int) -> simvx.graphics.gpu.multi_device.DeviceSlot :canonical: simvx.graphics.gpu.multi_device.MultiDeviceManager.slot ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager.slot ``` ```` ````{py:method} attach_renderer(index: int, renderer: typing.Any) -> None :canonical: simvx.graphics.gpu.multi_device.MultiDeviceManager.attach_renderer ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager.attach_renderer ``` ```` ````{py:method} register_teardown(hook: typing.Any) -> None :canonical: simvx.graphics.gpu.multi_device.MultiDeviceManager.register_teardown ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager.register_teardown ``` ```` ````{py:method} destroy() -> None :canonical: simvx.graphics.gpu.multi_device.MultiDeviceManager.destroy ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.MultiDeviceManager.destroy ``` ```` ````` `````{py:class} SRUAssignment :canonical: simvx.graphics.gpu.multi_device.SRUAssignment ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUAssignment ``` ````{py:attribute} sru_id :canonical: simvx.graphics.gpu.multi_device.SRUAssignment.sru_id :type: int :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUAssignment.sru_id ``` ```` ````{py:attribute} device_index :canonical: simvx.graphics.gpu.multi_device.SRUAssignment.device_index :type: int :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUAssignment.device_index ``` ```` ````{py:property} needs_transfer :canonical: simvx.graphics.gpu.multi_device.SRUAssignment.needs_transfer :type: bool ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUAssignment.needs_transfer ``` ```` ````` ````{py:function} assign_srus(srus: list[typing.Any], device_count: int, *, sru_id: typing.Any = None, cost: typing.Any = None) -> list[simvx.graphics.gpu.multi_device.SRUAssignment] :canonical: simvx.graphics.gpu.multi_device.assign_srus ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.assign_srus ``` ```` `````{py:class} TransferMethod :canonical: simvx.graphics.gpu.multi_device.TransferMethod ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.TransferMethod ``` ````{py:attribute} NONE :canonical: simvx.graphics.gpu.multi_device.TransferMethod.NONE :value: > 'none' ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.TransferMethod.NONE ``` ```` ````{py:attribute} STAGING_COPY :canonical: simvx.graphics.gpu.multi_device.TransferMethod.STAGING_COPY :value: > 'staging_copy' ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.TransferMethod.STAGING_COPY ``` ```` ````{py:attribute} DMABUF :canonical: simvx.graphics.gpu.multi_device.TransferMethod.DMABUF :value: > 'dmabuf' ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.TransferMethod.DMABUF ``` ```` ````` ````{py:function} select_transfer_method(assignment: simvx.graphics.gpu.multi_device.SRUAssignment, capabilities: simvx.graphics.gpu.capabilities.RenderCapabilities | None, *, prefer_dmabuf: bool = True) -> str :canonical: simvx.graphics.gpu.multi_device.select_transfer_method ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.select_transfer_method ``` ```` `````{py:class} CrossDeviceTransfer :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer ``` ````{py:attribute} src :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.src :type: simvx.graphics.gpu.multi_device.DeviceSlot :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.src ``` ```` ````{py:attribute} dst :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.dst :type: simvx.graphics.gpu.multi_device.DeviceSlot :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.dst ``` ```` ````{py:attribute} method :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.method :type: str :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.method ``` ```` ````{py:attribute} src_done :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.src_done :type: typing.Any :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.src_done ``` ```` ````{py:attribute} dst_ready :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.dst_ready :type: typing.Any :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.dst_ready ``` ```` ````{py:attribute} width :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.width :type: int :value: > 0 ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.width ``` ```` ````{py:attribute} height :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.height :type: int :value: > 0 ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.height ``` ```` ````{py:attribute} bytes_per_pixel :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.bytes_per_pixel :type: int :value: > 8 ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.bytes_per_pixel ``` ```` ````{py:attribute} extra :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.extra :type: dict :value: > 'field(...)' ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.extra ``` ```` ````{py:method} run(*, src_image: typing.Any = None, dst_image: typing.Any = None) -> None :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.run ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.run ``` ```` ````{py:method} run_staging_copy(*, src_image: typing.Any = None, dst_image: typing.Any = None) -> None :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.run_staging_copy ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.run_staging_copy ``` ```` ````{py:method} ensure_staging(src_command_pool: typing.Any, dst_command_pool: typing.Any) -> dict :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.ensure_staging ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.ensure_staging ``` ```` ````{py:method} destroy() -> None :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.destroy ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.destroy ``` ```` ````{py:method} run_dmabuf(*, src_image: typing.Any = None, dst_image: typing.Any = None) -> None :canonical: simvx.graphics.gpu.multi_device.CrossDeviceTransfer.run_dmabuf :abstractmethod: ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.CrossDeviceTransfer.run_dmabuf ``` ```` ````` `````{py:class} OffloadRoute :canonical: simvx.graphics.gpu.multi_device.OffloadRoute ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.OffloadRoute ``` ````{py:attribute} sru_id :canonical: simvx.graphics.gpu.multi_device.OffloadRoute.sru_id :type: int :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.OffloadRoute.sru_id ``` ```` ````{py:attribute} device_index :canonical: simvx.graphics.gpu.multi_device.OffloadRoute.device_index :type: int :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.OffloadRoute.device_index ``` ```` ````{py:attribute} transfer :canonical: simvx.graphics.gpu.multi_device.OffloadRoute.transfer :type: str :value: > None ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.OffloadRoute.transfer ``` ```` ````{py:property} offloaded :canonical: simvx.graphics.gpu.multi_device.OffloadRoute.offloaded :type: bool ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.OffloadRoute.offloaded ``` ```` ````` `````{py:class} SRUOffloadCoordinator(manager: simvx.graphics.gpu.multi_device.MultiDeviceManager, capabilities: simvx.graphics.gpu.capabilities.RenderCapabilities | None = None, *, prefer_dmabuf: bool = True, content_scale: tuple[float, float] = (1.0, 1.0), secondary_renderer_factory: typing.Any = None) :canonical: simvx.graphics.gpu.multi_device.SRUOffloadCoordinator ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUOffloadCoordinator ``` ```{rubric} Initialization ``` ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.__init__ ``` ````{py:property} active :canonical: simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.active :type: bool ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.active ``` ```` ````{py:method} plan(srus: list[typing.Any], *, sru_id: typing.Any = None, cost: typing.Any = None) -> list[simvx.graphics.gpu.multi_device.OffloadRoute] :canonical: simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.plan ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.plan ``` ```` ````{py:method} route_for(sru_id: int) -> simvx.graphics.gpu.multi_device.OffloadRoute | None :canonical: simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.route_for ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.route_for ``` ```` ````{py:method} transfer_for(route: simvx.graphics.gpu.multi_device.OffloadRoute, *, width: int = 0, height: int = 0) -> simvx.graphics.gpu.multi_device.CrossDeviceTransfer :canonical: simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.transfer_for ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.transfer_for ``` ```` ````{py:method} render_offloaded(route: simvx.graphics.gpu.multi_device.OffloadRoute) -> typing.Any :canonical: simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.render_offloaded ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.render_offloaded ``` ```` ````{py:method} render_sru_offloaded(sru: typing.Any, primary_dst_image: typing.Any) -> bool :canonical: simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.render_sru_offloaded ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.render_sru_offloaded ``` ```` ````{py:method} destroy() -> None :canonical: simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.destroy ```{autodoc2-docstring} simvx.graphics.gpu.multi_device.SRUOffloadCoordinator.destroy ``` ```` `````