OpenTTD Source  20240917-master-g9ab0a47812
VideoDriver Class Referenceabstract

The base of all video drivers. More...

#include <video_driver.hpp>

Inheritance diagram for VideoDriver:
Driver VideoDriver_Allegro VideoDriver_Cocoa VideoDriver_Dedicated VideoDriver_Null VideoDriver_SDL VideoDriver_SDL_Base VideoDriver_Win32Base VideoDriver_CocoaOpenGL VideoDriver_CocoaQuartz VideoDriver_SDL_Default VideoDriver_SDL_OpenGL VideoDriver_Win32GDI

Data Structures

struct  VideoBufferLocker
 Helper struct to ensure the video buffer is locked and ready for drawing. More...
 

Public Member Functions

 VideoDriver (bool uses_hardware_acceleration=false)
 
virtual void MakeDirty (int left, int top, int width, int height)=0
 Mark a particular area dirty. More...
 
virtual void MainLoop ()=0
 Perform the actual drawing.
 
virtual bool ChangeResolution (int w, int h)=0
 Change the resolution of the window. More...
 
virtual bool ToggleFullscreen (bool fullscreen)=0
 Change the full screen setting. More...
 
virtual void ToggleVsync ([[maybe_unused]] bool vsync)
 Change the vsync setting. More...
 
virtual bool AfterBlitterChange ()
 Callback invoked after the blitter was changed. More...
 
virtual bool ClaimMousePointer ()
 
virtual bool UseSystemCursor ()
 Get whether the mouse cursor is drawn by the video driver. More...
 
virtual void PopulateSystemSprites ()
 Populate all sprites in cache.
 
virtual void ClearSystemSprites ()
 Clear all cached sprites.
 
virtual bool HasGUI () const
 Whether the driver has a graphical user interface with the end user. More...
 
virtual bool HasEfficient8Bpp () const
 Has this video driver an efficient code path for palette animated 8-bpp sprites? More...
 
virtual bool HasAnimBuffer ()
 Does this video driver support a separate animation buffer in addition to the colour buffer? More...
 
virtual uint8_t * GetAnimBuffer ()
 Get a pointer to the animation buffer of the video back-end. More...
 
virtual void EditBoxLostFocus ()
 An edit box lost the input focus. More...
 
virtual void EditBoxGainedFocus ()
 An edit box gained the input focus.
 
virtual std::vector< int > GetListOfMonitorRefreshRates ()
 Get a list of refresh rates of each available monitor. More...
 
virtual int GetSuggestedUIScale ()
 Get a suggested default GUI scale taking screen DPI into account.
 
virtual std::string_view GetInfoString () const
 
void QueueOnMainThread (std::function< void()> &&func)
 Queue a function to be called on the main thread with game state lock held and video buffer locked. More...
 
void GameLoopPause ()
 Pause the game-loop for a bit, releasing the game-state lock. More...
 
- Public Member Functions inherited from Driver
virtual std::optional< std::string_view > Start (const StringList &parm)=0
 Start this driver. More...
 
virtual void Stop ()=0
 Stop this driver.
 
virtual std::string_view GetName () const =0
 Get the name of this driver. More...
 

Static Public Member Functions

static VideoDriverGetInstance ()
 Get the currently active instance of the video driver.
 
static std::string GetCaption ()
 Get the caption to use for the game's title bar. More...
 

Protected Member Functions

virtual Dimension GetScreenSize () const
 Get the resolution of the main screen.
 
virtual float GetDPIScale ()
 Get DPI scaling factor of the screen OTTD is displayed on. More...
 
void UpdateAutoResolution ()
 Apply resolution auto-detection and clamp to sensible defaults.
 
virtual void InputLoop ()
 Handle input logic, is CTRL pressed, should we fast-forward, etc.
 
virtual bool LockVideoBuffer ()
 Make sure the video buffer is ready for drawing. More...
 
virtual void UnlockVideoBuffer ()
 Unlock a previously locked video buffer.
 
virtual void Paint ()
 Paint the window.
 
virtual void CheckPaletteAnim ()
 Process any pending palette animation.
 
virtual bool PollEvent ()
 Process a single system event. More...
 
void StartGameThread ()
 Start the loop for game-tick.
 
void StopGameThread ()
 Stop the loop for the game-tick. More...
 
void Tick ()
 Give the video-driver a tick. More...
 
void SleepTillNextTick ()
 Sleep till the next tick is about to happen.
 
std::chrono::steady_clock::duration GetGameInterval ()
 
std::chrono::steady_clock::duration GetDrawInterval ()
 
void DrainCommandQueue ()
 Execute all queued commands.
 

Static Protected Member Functions

static void GameThreadThunk (VideoDriver *drv)
 

Protected Attributes

const uint ALLOWED_DRIFT = 5
 How many times videodriver can miss deadlines without it being overly compensated.
 
std::chrono::steady_clock::time_point next_game_tick
 
std::chrono::steady_clock::time_point next_draw_tick
 
bool fast_forward_key_pressed
 The fast-forward key is being pressed.
 
bool fast_forward_via_key
 The fast-forward was enabled by key press.
 
bool is_game_threaded
 
std::thread game_thread
 
std::mutex game_state_mutex
 
std::mutex game_thread_wait_mutex
 
bool uses_hardware_acceleration
 

Private Member Functions

void GameLoop ()
 
void GameThread ()
 

Private Attributes

const uint DEFAULT_WINDOW_WIDTH = 640u
 Default window width.
 
const uint DEFAULT_WINDOW_HEIGHT = 480u
 Default window height.
 
std::mutex cmd_queue_mutex
 
std::vector< std::function< void()> > cmd_queue
 

Additional Inherited Members

- Public Types inherited from Driver
enum  Type {
  DT_BEGIN = 0, DT_MUSIC = 0, DT_SOUND, DT_VIDEO,
  DT_END
}
 The type of driver. More...
 

Detailed Description

The base of all video drivers.

Definition at line 34 of file video_driver.hpp.

Member Function Documentation

◆ AfterBlitterChange()

virtual bool VideoDriver::AfterBlitterChange ( )
inlinevirtual

Callback invoked after the blitter was changed.

Returns
True if no error.

Reimplemented in VideoDriver_Win32GDI, VideoDriver_Cocoa, VideoDriver_SDL_Base, VideoDriver_Allegro, and VideoDriver_SDL.

Definition at line 80 of file video_driver.hpp.

◆ ChangeResolution()

virtual bool VideoDriver::ChangeResolution ( int  w,
int  h 
)
pure virtual

Change the resolution of the window.

Parameters
wThe new width.
hThe new height.
Returns
True if the change succeeded.

Implemented in VideoDriver_Cocoa, VideoDriver_SDL_Base, VideoDriver_Null, VideoDriver_Win32Base, VideoDriver_Allegro, VideoDriver_Dedicated, and VideoDriver_SDL.

◆ EditBoxLostFocus()

virtual void VideoDriver::EditBoxLostFocus ( )
inlinevirtual

An edit box lost the input focus.

Abort character compositing if necessary.

Reimplemented in VideoDriver_Cocoa, VideoDriver_SDL_Base, and VideoDriver_Win32Base.

Definition at line 152 of file video_driver.hpp.

Referenced by OskWindow::OnFocusLost(), IConsoleWindow::OnFocusLost(), Window::OnFocusLost(), Window::SetFocusedWidget(), and Window::UnfocusFocusedWidget().

◆ GameLoopPause()

void VideoDriver::GameLoopPause ( )

Pause the game-loop for a bit, releasing the game-state lock.

This allows, if the draw-tick requested this, the drawing to happen.

Definition at line 66 of file video_driver.cpp.

References lock.

◆ GetAnimBuffer()

virtual uint8_t* VideoDriver::GetAnimBuffer ( )
inlinevirtual

Get a pointer to the animation buffer of the video back-end.

Returns
Pointer to the buffer or nullptr if no animation buffer is supported.

Reimplemented in VideoDriver_CocoaOpenGL, and VideoDriver_SDL_OpenGL.

Definition at line 144 of file video_driver.hpp.

Referenced by Blitter_40bppAnim::CopyImageToBuffer(), and Blitter_40bppAnim::DrawColourMappingRect().

◆ GetCaption()

std::string VideoDriver::GetCaption ( )
static

Get the caption to use for the game's title bar.

Returns
The caption.

Definition at line 189 of file video_driver.cpp.

◆ GetDPIScale()

virtual float VideoDriver::GetDPIScale ( )
inlineprotectedvirtual

Get DPI scaling factor of the screen OTTD is displayed on.

Returns
1.0 for default platform DPI, > 1.0 for higher DPI values, and < 1.0 for smaller DPI values.

Reimplemented in VideoDriver_Cocoa, and VideoDriver_Win32Base.

Definition at line 239 of file video_driver.hpp.

Referenced by GetSuggestedUIScale().

◆ GetListOfMonitorRefreshRates()

virtual std::vector<int> VideoDriver::GetListOfMonitorRefreshRates ( )
inlinevirtual

Get a list of refresh rates of each available monitor.

Returns
A vector of the refresh rates of all available monitors.

Reimplemented in VideoDriver_Cocoa, VideoDriver_SDL_Base, VideoDriver_Win32Base, and VideoDriver_Allegro.

Definition at line 163 of file video_driver.hpp.

◆ HasAnimBuffer()

virtual bool VideoDriver::HasAnimBuffer ( )
inlinevirtual

Does this video driver support a separate animation buffer in addition to the colour buffer?

Returns
True if a separate animation buffer is supported.

Reimplemented in VideoDriver_CocoaOpenGL, and VideoDriver_SDL_OpenGL.

Definition at line 135 of file video_driver.hpp.

Referenced by FBlitter_40bppAnim::IsUsable().

◆ HasEfficient8Bpp()

virtual bool VideoDriver::HasEfficient8Bpp ( ) const
inlinevirtual

Has this video driver an efficient code path for palette animated 8-bpp sprites?

Returns
True if the driver has an efficient code path for 8-bpp.

Reimplemented in VideoDriver_CocoaOpenGL, and VideoDriver_SDL_OpenGL.

Definition at line 126 of file video_driver.hpp.

◆ HasGUI()

virtual bool VideoDriver::HasGUI ( ) const
inlinevirtual

Whether the driver has a graphical user interface with the end user.

Or in other words, whether we should spawn a thread for world generation and NewGRF scanning so the graphical updates can keep coming. Otherwise progress has to be shown on the console, which uses by definition another thread/process for display purposes.

Returns
True for all drivers except null and dedicated.

Reimplemented in VideoDriver_Null, and VideoDriver_Dedicated.

Definition at line 117 of file video_driver.hpp.

Referenced by Tick().

◆ LockVideoBuffer()

virtual bool VideoDriver::LockVideoBuffer ( )
inlineprotectedvirtual

Make sure the video buffer is ready for drawing.

Returns
True if the video buffer has to be unlocked.

Reimplemented in VideoDriver_Cocoa, VideoDriver_SDL_Base, and VideoDriver_Win32Base.

Definition at line 265 of file video_driver.hpp.

Referenced by Tick().

◆ MakeDirty()

virtual void VideoDriver::MakeDirty ( int  left,
int  top,
int  width,
int  height 
)
pure virtual

Mark a particular area dirty.

Parameters
leftThe left most line of the dirty area.
topThe top most line of the dirty area.
widthThe width of the dirty area.
heightThe height of the dirty area.

Implemented in VideoDriver_Cocoa, VideoDriver_SDL_Base, VideoDriver_Null, VideoDriver_Win32Base, VideoDriver_Allegro, VideoDriver_Dedicated, and VideoDriver_SDL.

◆ PollEvent()

virtual bool VideoDriver::PollEvent ( )
inlineprotectedvirtual

Process a single system event.

Returns
False if there are no more events to process.

Reimplemented in VideoDriver_Cocoa, VideoDriver_SDL_Base, VideoDriver_Win32Base, VideoDriver_Allegro, and VideoDriver_SDL.

Definition at line 289 of file video_driver.hpp.

◆ QueueOnMainThread()

void VideoDriver::QueueOnMainThread ( std::function< void()> &&  func)
inline

Queue a function to be called on the main thread with game state lock held and video buffer locked.

Queued functions will be executed on the next draw tick.

Parameters
funcFunction to call.

Definition at line 189 of file video_driver.hpp.

References lock.

Referenced by MakeScreenshot().

◆ StopGameThread()

void VideoDriver::StopGameThread ( )
protected

Stop the loop for the game-tick.

This can still tick at most one time before truly shutting down.

Definition at line 95 of file video_driver.cpp.

◆ Tick()

void VideoDriver::Tick ( )
protected

Give the video-driver a tick.

It will process any potential game-tick and/or draw-tick, and/or any other video-driver related event.

Definition at line 102 of file video_driver.cpp.

References HasGUI(), InputLoop(), LockVideoBuffer(), and UpdateWindows().

◆ ToggleFullscreen()

virtual bool VideoDriver::ToggleFullscreen ( bool  fullscreen)
pure virtual

Change the full screen setting.

Parameters
fullscreenThe new setting.
Returns
True if the change succeeded.

Implemented in VideoDriver_Cocoa, VideoDriver_SDL_Base, VideoDriver_Null, VideoDriver_Win32Base, VideoDriver_Allegro, VideoDriver_Dedicated, and VideoDriver_SDL.

◆ ToggleVsync()

virtual void VideoDriver::ToggleVsync ( [[maybe_unused] ] bool  vsync)
inlinevirtual

Change the vsync setting.

Parameters
vsyncThe new setting.

Definition at line 74 of file video_driver.hpp.

◆ UseSystemCursor()

virtual bool VideoDriver::UseSystemCursor ( )
inlinevirtual

Get whether the mouse cursor is drawn by the video driver.

Returns
True if cursor drawing is done by the video driver.

Reimplemented in VideoDriver_CocoaOpenGL, and VideoDriver_SDL_OpenGL.

Definition at line 94 of file video_driver.hpp.


The documentation for this class was generated from the following files: