OpenTTD Source 20241224-master-gf74b0cf984
|
The base of all video drivers. More...
#include <video_driver.hpp>
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. | |
virtual void | MainLoop ()=0 |
Perform the actual drawing. | |
virtual bool | ChangeResolution (int w, int h)=0 |
Change the resolution of the window. | |
virtual bool | ToggleFullscreen (bool fullscreen)=0 |
Change the full screen setting. | |
virtual void | ToggleVsync (bool vsync) |
Change the vsync setting. | |
virtual bool | AfterBlitterChange () |
Callback invoked after the blitter was changed. | |
virtual bool | ClaimMousePointer () |
virtual bool | UseSystemCursor () |
Get whether the mouse cursor is drawn by the video driver. | |
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. | |
virtual bool | HasEfficient8Bpp () const |
Has this video driver an efficient code path for palette animated 8-bpp sprites? | |
virtual bool | HasAnimBuffer () |
Does this video driver support a separate animation buffer in addition to the colour buffer? | |
virtual uint8_t * | GetAnimBuffer () |
Get a pointer to the animation buffer of the video back-end. | |
virtual void | EditBoxLostFocus () |
An edit box lost the input focus. | |
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. | |
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. | |
void | GameLoopPause () |
Pause the game-loop for a bit, releasing the game-state lock. | |
Public Member Functions inherited from Driver | |
virtual std::optional< std::string_view > | Start (const StringList &parm)=0 |
Start this driver. | |
virtual void | Stop ()=0 |
Stop this driver. | |
virtual std::string_view | GetName () const =0 |
Get the name of this driver. | |
Static Public Member Functions | |
static VideoDriver * | GetInstance () |
Get the currently active instance of the video driver. | |
static std::string | GetCaption () |
Get the caption to use for the game's title bar. | |
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. | |
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. | |
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. | |
void | StartGameThread () |
Start the loop for game-tick. | |
void | StopGameThread () |
Stop the loop for the game-tick. | |
void | Tick () |
Give the video-driver a tick. | |
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... | |
The base of all video drivers.
Definition at line 34 of file video_driver.hpp.
|
inline |
Definition at line 39 of file video_driver.hpp.
|
inlinevirtual |
Callback invoked after the blitter was changed.
Reimplemented in VideoDriver_Allegro, VideoDriver_Cocoa, VideoDriver_SDL_Base, VideoDriver_SDL, and VideoDriver_Win32GDI.
Definition at line 80 of file video_driver.hpp.
|
pure virtual |
Change the resolution of the window.
w | The new width. |
h | The new height. |
Implemented in VideoDriver_Allegro, VideoDriver_Cocoa, VideoDriver_Dedicated, VideoDriver_Null, VideoDriver_SDL_Base, VideoDriver_SDL, and VideoDriver_Win32Base.
|
inlineprotectedvirtual |
Process any pending palette animation.
Reimplemented in VideoDriver_Allegro, VideoDriver_CocoaQuartz, VideoDriver_SDL_Base, VideoDriver_SDL, and VideoDriver_Win32Base.
Definition at line 283 of file video_driver.hpp.
Referenced by Tick().
|
inlinevirtual |
Definition at line 85 of file video_driver.hpp.
|
inlinevirtual |
Clear all cached sprites.
Reimplemented in VideoDriver_CocoaOpenGL, VideoDriver_Cocoa, and VideoDriver_SDL_OpenGL.
Definition at line 107 of file video_driver.hpp.
Referenced by AdjustGUIZoom(), GfxClearSpriteCache(), and GfxLoadSprites().
|
inlineprotected |
Execute all queued commands.
Definition at line 337 of file video_driver.hpp.
References lock.
Referenced by VideoDriver_Dedicated::MainLoop(), and Tick().
|
inlinevirtual |
An edit box gained the input focus.
Reimplemented in VideoDriver_SDL_Base.
Definition at line 157 of file video_driver.hpp.
Referenced by Window::OnFocus(), IConsoleWindow::OnFocus(), and Window::SetFocusedWidget().
|
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 IConsoleWindow::Close(), Window::OnFocusLost(), OskWindow::OnFocusLost(), IConsoleWindow::OnFocusLost(), Window::SetFocusedWidget(), and Window::UnfocusFocusedWidget().
|
private |
Definition at line 28 of file video_driver.cpp.
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.
Referenced by GRFFileScanner::AddFile().
|
private |
Definition at line 43 of file video_driver.cpp.
|
staticprotected |
Definition at line 81 of file video_driver.cpp.
|
inlinevirtual |
Get a pointer to the animation buffer of the video back-end.
Reimplemented in VideoDriver_CocoaOpenGL, and VideoDriver_SDL_OpenGL.
Definition at line 144 of file video_driver.hpp.
Referenced by Blitter_40bppAnim::CopyFromBuffer(), Blitter_40bppAnim::CopyImageToBuffer(), Blitter_40bppAnim::CopyToBuffer(), Blitter_40bppAnim::Draw(), Blitter_40bppAnim::DrawColourMappingRect(), Blitter_40bppAnim::DrawLine(), Blitter_40bppAnim::DrawRect(), Blitter_40bppAnim::ScrollBuffer(), and Blitter_40bppAnim::SetPixel().
|
static |
Get the caption to use for the game's title bar.
Definition at line 189 of file video_driver.cpp.
Referenced by VideoDriver_SDL_Base::CreateMainWindow(), and VideoDriver_Win32Base::MakeWindow().
|
inlineprotectedvirtual |
Get DPI scaling factor of the screen OTTD is displayed on.
Reimplemented in VideoDriver_Cocoa, and VideoDriver_Win32Base.
Definition at line 239 of file video_driver.hpp.
Referenced by GetSuggestedUIScale().
|
inlineprotected |
Definition at line 329 of file video_driver.hpp.
|
inlineprotected |
Definition at line 313 of file video_driver.hpp.
|
inlinevirtual |
Definition at line 178 of file video_driver.hpp.
|
inlinestatic |
Get the currently active instance of the video driver.
Definition at line 201 of file video_driver.hpp.
References Driver::DT_VIDEO, and DriverFactoryBase::GetActiveDriver().
Referenced by AddCustomRefreshRates(), GRFFileScanner::AddFile(), AdjustGUIZoom(), CrashLog::AfterCrashLogCleanup(), IConsoleWindow::Close(), Blitter_40bppAnim::CopyFromBuffer(), Blitter_40bppAnim::CopyImageToBuffer(), Blitter_40bppAnim::CopyToBuffer(), Blitter_40bppAnim::Draw(), Blitter_40bppAnim::Draw(), Blitter_40bppAnim::DrawColourMappingRect(), Blitter_40bppAnim::DrawLine(), Blitter_40bppAnim::DrawRect(), GameOptionsWindow::DrawWidget(), FatalErrorI(), GfxClearSpriteCache(), GfxLoadSprites(), HandleBootstrap(), HandleCrash(), FBlitter_40bppAnim::IsUsable(), MakeScreenshot(), NetworkDrawChatMessage(), NetworkUndrawChatMessage(), GameOptionsWindow::OnClick(), Window::OnFocus(), IConsoleWindow::OnFocus(), Window::OnFocusLost(), OskWindow::OnFocusLost(), IConsoleWindow::OnFocusLost(), GameOptionsWindow::OnResize(), openttd_main(), Blitter_32bppAnim::PaletteAnimate(), RedrawScreenRect(), Blitter_40bppAnim::ScrollBuffer(), Window::SetFocusedWidget(), Blitter_40bppAnim::SetPixel(), MusicDriver_ExtMidi::Start(), SurveyConfiguration(), SwitchNewGRFBlitter(), Window::UnfocusFocusedWidget(), UpdateGUIZoom(), and UserErrorI().
|
inlinevirtual |
Get a list of refresh rates of each available monitor.
Reimplemented in VideoDriver_Allegro, VideoDriver_Cocoa, VideoDriver_SDL_Base, and VideoDriver_Win32Base.
Definition at line 163 of file video_driver.hpp.
Referenced by AddCustomRefreshRates().
|
inlineprotectedvirtual |
Get the resolution of the main screen.
Reimplemented in VideoDriver_Cocoa, VideoDriver_SDL_Base, and VideoDriver_Win32Base.
Definition at line 233 of file video_driver.hpp.
References DEFAULT_WINDOW_HEIGHT, and DEFAULT_WINDOW_WIDTH.
Referenced by VideoDriver_SDL_Base::GetScreenSize(), and UpdateAutoResolution().
|
inlinevirtual |
Get a suggested default GUI scale taking screen DPI into account.
Definition at line 171 of file video_driver.hpp.
References Clamp(), and GetDPIScale().
Referenced by UpdateGUIZoom().
|
inlinevirtual |
Does this video driver support a separate animation buffer in addition to the colour buffer?
Reimplemented in VideoDriver_CocoaOpenGL, and VideoDriver_SDL_OpenGL.
Definition at line 135 of file video_driver.hpp.
Referenced by FBlitter_40bppAnim::IsUsable().
|
inlinevirtual |
Has this video driver an efficient code path for palette animated 8-bpp sprites?
Reimplemented in VideoDriver_CocoaOpenGL, and VideoDriver_SDL_OpenGL.
Definition at line 126 of file video_driver.hpp.
|
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.
Reimplemented in VideoDriver_Dedicated, and VideoDriver_Null.
Definition at line 117 of file video_driver.hpp.
Referenced by Tick().
|
inlineprotectedvirtual |
Handle input logic, is CTRL pressed, should we fast-forward, etc.
Reimplemented in VideoDriver_Allegro, VideoDriver_Cocoa, VideoDriver_SDL_Base, VideoDriver_SDL, and VideoDriver_Win32Base.
Definition at line 259 of file video_driver.hpp.
Referenced by VideoDriver_Null::MainLoop(), and Tick().
|
inlineprotectedvirtual |
Make sure the video buffer is ready for drawing.
Reimplemented in VideoDriver_Cocoa, VideoDriver_SDL_Base, and VideoDriver_Win32Base.
Definition at line 265 of file video_driver.hpp.
Referenced by Tick().
|
pure virtual |
Perform the actual drawing.
Implemented in VideoDriver_Allegro, VideoDriver_Cocoa, VideoDriver_Dedicated, VideoDriver_Null, VideoDriver_SDL_Base, VideoDriver_SDL, and VideoDriver_Win32Base.
Referenced by HandleBootstrap(), and openttd_main().
|
pure virtual |
Mark a particular area dirty.
left | The left most line of the dirty area. |
top | The top most line of the dirty area. |
width | The width of the dirty area. |
height | The height of the dirty area. |
Implemented in VideoDriver_Allegro, VideoDriver_Cocoa, VideoDriver_Dedicated, VideoDriver_Null, VideoDriver_SDL_Base, VideoDriver_SDL, and VideoDriver_Win32Base.
Referenced by NetworkDrawChatMessage(), NetworkUndrawChatMessage(), Blitter_32bppAnim::PaletteAnimate(), and RedrawScreenRect().
|
inlineprotectedvirtual |
Paint the window.
Reimplemented in VideoDriver_Allegro, VideoDriver_CocoaOpenGL, VideoDriver_CocoaQuartz, VideoDriver_SDL_Default, VideoDriver_SDL_OpenGL, VideoDriver_SDL, and VideoDriver_Win32GDI.
Definition at line 278 of file video_driver.hpp.
Referenced by Tick().
|
inlineprotectedvirtual |
Process a single system event.
Reimplemented in VideoDriver_Allegro, VideoDriver_Cocoa, VideoDriver_SDL_Base, VideoDriver_SDL, and VideoDriver_Win32Base.
Definition at line 289 of file video_driver.hpp.
Referenced by Tick().
|
inlinevirtual |
Populate all sprites in cache.
Reimplemented in VideoDriver_CocoaOpenGL, VideoDriver_Cocoa, and VideoDriver_SDL_OpenGL.
Definition at line 102 of file video_driver.hpp.
Referenced by Tick().
|
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.
func | Function to call. |
Definition at line 189 of file video_driver.hpp.
References lock.
Referenced by MakeScreenshot(), and SwitchNewGRFBlitter().
|
protected |
Sleep till the next tick is about to happen.
Definition at line 171 of file video_driver.cpp.
Referenced by VideoDriver_Dedicated::MainLoop(), VideoDriver_SDL::MainLoop(), and VideoDriver_Win32Base::MainLoop().
|
protected |
Start the loop for game-tick.
Definition at line 86 of file video_driver.cpp.
References Debug, and StartNewThread().
Referenced by VideoDriver_SDL_Base::MainLoop(), VideoDriver_SDL::MainLoop(), and VideoDriver_Win32Base::MainLoop().
|
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.
Referenced by VideoDriver_SDL_Base::MainLoop(), VideoDriver_SDL::MainLoop(), and VideoDriver_Win32Base::MainLoop().
|
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 _networking, _switch_mode, CheckPaletteAnim(), DrainCommandQueue(), fast_forward_key_pressed, fast_forward_via_key, HasGUI(), HasModalProgress(), InputLoop(), LockVideoBuffer(), DriverFactoryBase::MarkVideoDriverOperational(), Paint(), PollEvent(), PopulateSystemSprites(), UnlockVideoBuffer(), and UpdateWindows().
Referenced by VideoDriver_Dedicated::MainLoop(), VideoDriver_SDL::MainLoop(), and VideoDriver_Win32Base::MainLoop().
|
pure virtual |
Change the full screen setting.
fullscreen | The new setting. |
Implemented in VideoDriver_Allegro, VideoDriver_Cocoa, VideoDriver_Dedicated, VideoDriver_Null, VideoDriver_SDL_Base, VideoDriver_SDL, and VideoDriver_Win32Base.
|
inlinevirtual |
Change the vsync setting.
vsync | The new setting. |
Reimplemented in VideoDriver_SDL_OpenGL.
Definition at line 74 of file video_driver.hpp.
Referenced by GameOptionsWindow::OnClick().
|
inlineprotectedvirtual |
Unlock a previously locked video buffer.
Reimplemented in VideoDriver_Cocoa, VideoDriver_SDL_Base, and VideoDriver_Win32Base.
Definition at line 273 of file video_driver.hpp.
Referenced by Tick().
|
inlineprotected |
Apply resolution auto-detection and clamp to sensible defaults.
Definition at line 244 of file video_driver.hpp.
References _cur_resolution, ClampU(), DEFAULT_WINDOW_HEIGHT, DEFAULT_WINDOW_WIDTH, and GetScreenSize().
Referenced by VideoDriver_Dedicated::Start(), VideoDriver_Null::Start(), and VideoDriver_SDL::Start().
|
inlinevirtual |
Get whether the mouse cursor is drawn by the video driver.
Reimplemented in VideoDriver_CocoaOpenGL, and VideoDriver_SDL_OpenGL.
Definition at line 94 of file video_driver.hpp.
|
protected |
How many times videodriver can miss deadlines without it being overly compensated.
Definition at line 228 of file video_driver.hpp.
|
private |
Definition at line 371 of file video_driver.hpp.
|
private |
Definition at line 370 of file video_driver.hpp.
|
private |
Default window height.
Definition at line 36 of file video_driver.hpp.
Referenced by GetScreenSize(), and UpdateAutoResolution().
|
private |
Default window width.
Definition at line 35 of file video_driver.hpp.
Referenced by GetScreenSize(), and UpdateAutoResolution().
|
protected |
The fast-forward key is being pressed.
Definition at line 357 of file video_driver.hpp.
Referenced by VideoDriver_SDL_Base::InputLoop(), VideoDriver_SDL::InputLoop(), VideoDriver_Win32Base::InputLoop(), and Tick().
|
protected |
The fast-forward was enabled by key press.
Definition at line 358 of file video_driver.hpp.
Referenced by Tick().
|
protected |
Definition at line 362 of file video_driver.hpp.
|
protected |
Definition at line 361 of file video_driver.hpp.
|
protected |
Definition at line 363 of file video_driver.hpp.
|
protected |
Definition at line 360 of file video_driver.hpp.
|
protected |
Definition at line 355 of file video_driver.hpp.
|
protected |
Definition at line 354 of file video_driver.hpp.
|
protected |
Definition at line 365 of file video_driver.hpp.