10#ifndef VIDEO_VIDEO_DRIVER_HPP
11#define VIDEO_VIDEO_DRIVER_HPP
15#include "../core/geometry_type.hpp"
16#include "../core/math_func.hpp"
17#include "../gfx_func.h"
18#include "../settings_type.h"
19#include "../zoom_type.h"
20#include "../network/network_func.h"
23#include <condition_variable>
49 virtual void MakeDirty(
int left,
int top,
int width,
int height) = 0;
86 virtual bool ClaimMousePointer()
169 virtual std::string_view GetInfoString()
const
182 std::lock_guard<std::mutex>
lock(this->cmd_queue_mutex);
184 this->cmd_queue.emplace_back(std::forward<std::function<
void()>>(func));
298 std::chrono::steady_clock::duration GetGameInterval()
300#ifdef DEBUG_DUMP_COMMANDS
302 extern bool _ddc_fastforward;
303 if (_ddc_fastforward)
return std::chrono::microseconds(0);
306 TicToc::Tick(
"GameTick");
311 if (
_game_speed == 0)
return std::chrono::microseconds(0);
316 std::chrono::steady_clock::duration GetDrawInterval()
318 TicToc::Tick(
"DrawTick");
321 if (
_video_vsync && this->uses_hardware_acceleration)
return std::chrono::microseconds(0);
328 std::vector<std::function<void()>> cmds{};
334 std::lock_guard<std::mutex>
lock(this->cmd_queue_mutex);
335 cmds.swap(this->cmd_queue);
338 for (
auto &f : cmds) {
343 std::chrono::steady_clock::time_point next_game_tick;
344 std::chrono::steady_clock::time_point next_draw_tick;
349 bool is_game_threaded;
350 std::thread game_thread;
351 std::mutex game_state_mutex;
352 std::mutex game_thread_wait_mutex;
354 bool uses_hardware_acceleration;
359 std::mutex cmd_queue_mutex;
360 std::vector<std::function<void()>> cmd_queue;
constexpr bool Any(const Timpl &other) const
Test if any of the given values are set.
static std::unique_ptr< Driver > & GetActiveDriver(Driver::Type type)
Get the active driver for the given type.
A driver for communicating with the user.
virtual std::string_view GetName() const =0
Get the name of this driver.
@ DT_VIDEO
A video driver.
The base of all video drivers.
virtual void InputLoop()
Handle input logic, is CTRL pressed, should we fast-forward, etc.
virtual bool ToggleFullscreen(bool fullscreen)=0
Change the full screen setting.
virtual Dimension GetScreenSize() const
Get the resolution of the main screen.
virtual void PopulateSystemSprites()
Populate all sprites in cache.
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.
const uint DEFAULT_WINDOW_WIDTH
Default window width.
bool fast_forward_key_pressed
The fast-forward key is being pressed.
virtual void ClearSystemSprites()
Clear all cached sprites.
virtual bool UseSystemCursor()
Get whether the mouse cursor is drawn by the video driver.
void Tick()
Give the video-driver a tick.
const uint DEFAULT_WINDOW_HEIGHT
Default window height.
virtual void MakeDirty(int left, int top, int width, int height)=0
Mark a particular area dirty.
void SleepTillNextTick()
Sleep till the next tick is about to happen.
void StartGameThread()
Start the loop for game-tick.
virtual void EditBoxLostFocus()
An edit box lost the input focus.
virtual bool HasAnimBuffer()
Does this video driver support a separate animation buffer in addition to the colour buffer?
virtual bool ChangeResolution(int w, int h)=0
Change the resolution of the window.
virtual bool HasGUI() const
Whether the driver has a graphical user interface with the end user.
static std::string GetCaption()
Get the caption to use for the game's title bar.
virtual void ToggleVsync(bool vsync)
Change the vsync setting.
virtual bool AfterBlitterChange()
Callback invoked after the blitter was changed.
void StopGameThread()
Stop the loop for the game-tick.
static VideoDriver * GetInstance()
Get the currently active instance of the video driver.
const uint ALLOWED_DRIFT
How many times videodriver can miss deadlines without it being overly compensated.
virtual void MainLoop()=0
Perform the actual drawing.
virtual void EditBoxGainedFocus()
An edit box gained the input focus.
virtual bool PollEvent()
Process a single system event.
virtual bool HasEfficient8Bpp() const
Has this video driver an efficient code path for palette animated 8-bpp sprites?
virtual void Paint()
Paint the window.
virtual void UnlockVideoBuffer()
Unlock a previously locked video buffer.
bool fast_forward_via_key
The fast-forward was enabled by key press.
virtual uint8_t * GetAnimBuffer()
Get a pointer to the animation buffer of the video back-end.
virtual std::vector< int > GetListOfMonitorRefreshRates()
Get a list of refresh rates of each available monitor.
virtual void CheckPaletteAnim()
Process any pending palette animation.
virtual bool LockVideoBuffer()
Make sure the video buffer is ready for drawing.
void GameLoopPause()
Pause the game-loop for a bit, releasing the game-state lock.
void DrainCommandQueue()
Execute all queued commands.
void UpdateAutoResolution()
Apply resolution auto-detection and clamp to sensible defaults.
uint16_t _game_speed
Current game-speed; 100 is 1x, 0 is infinite.
PauseModes _pause_mode
The current pause mode.
static const uint MILLISECONDS_PER_TICK
The number of milliseconds per game tick.
constexpr uint ClampU(const uint a, const uint min, const uint max)
Clamp an unsigned integer between an interval.
ClientSettings _settings_client
The current settings for this game.
GUISettings gui
settings related to the GUI
Dimensions (a width and height) of a rectangle in 2D.
uint16_t refresh_rate
How often we refresh the screen (time between draw-ticks).
Helper struct to ensure the video buffer is locked and ready for drawing.
bool unlock
Stores if the lock did anything that has to be undone.
bool _video_vsync
Whether we should use vsync (only if active video driver supports HW acceleration).
bool _video_hw_accel
Whether to consider hardware accelerated video drivers on startup.
std::string _ini_videodriver
The video driver a stored in the configuration file.
std::vector< Dimension > _resolutions
List of resolutions.
Dimension _cur_resolution
The current resolution.
bool _rightclick_emulate
Whether right clicking is emulated.
std::mutex lock
synchronization for playback status fields