Source code for libretro.drivers.video.software.base

"""
Abstract base class for software-rendered :class:`.VideoDriver` implementations.

.. seealso::

    :class:`.VideoDriver`
        The protocol the base class implements.
"""

from abc import ABC
from collections.abc import Set
from typing import Literal, final, override

from libretro.api.video.context import HardwareContext, retro_hw_render_callback
from libretro.api.video.render import retro_hw_render_interface

from ..driver import UnsupportedContextError, VideoDriver

_EMPTY = frozenset((HardwareContext.NONE,))


[docs] class SoftwareVideoDriver(VideoDriver, ABC): """ A base class for software-only video drivers. Provides common overrides that would be the same for all software-only drivers. """ @property @override @final def supported_contexts(self) -> Set[Literal[HardwareContext.NONE]]: """:return: A set containing only :attr:`.HardwareContext.NONE`.""" return _EMPTY @property @override @final def active_context(self) -> Literal[HardwareContext.NONE]: """ Always returns :attr:`.HardwareContext.NONE`, as software-rendered drivers lack a hardware context. :return: :attr:`.HardwareContext.NONE`. """ return HardwareContext.NONE @property @override @final def preferred_context(self) -> Literal[HardwareContext.NONE]: return HardwareContext.NONE
[docs] @override @final def set_context(self, callback: retro_hw_render_callback) -> None: """No-op if the context type is ``HardwareContext.NONE``; raises a RuntimeError otherwise.""" if callback.context_type != HardwareContext.NONE: raise UnsupportedContextError( "Software-rendered drivers only support HardwareContext.NONE" )
@property @override @final def current_framebuffer(self) -> None: """:return: ``None``, as software-rendered drivers don't have a hardware framebuffer.""" return None
[docs] @override @final def get_proc_address(self, sym: bytes) -> None: """:return: ``None``, as software-rendered drivers don't have any hardware functions to call.""" return None
@property @override @final def can_dupe(self) -> bool | None: return True @property @override @final def hw_render_interface(self) -> retro_hw_render_interface | None: return None @property @override @final def shared_context(self) -> bool: return False @shared_context.setter @override @final def shared_context(self, value: bool) -> None: # Software-rendered drivers don't need any hardware context raise NotImplementedError("Shared context is not supported by software-rendered drivers")
__all__ = ["SoftwareVideoDriver"]