summaryrefslogtreecommitdiff
path: root/src/video/sdl2_v.cpp
AgeCommit message (Collapse)Author
2021-03-09Add: Display refresh rate game option (#8813)sean
2021-03-08Add: [Video] move GameLoop into its own threadPatric Stout
This allows drawing to happen while the GameLoop is doing an iteration too. Sadly, not much drawing currently can be done while the GameLoop is running, as for example PollEvent() or UpdateWindows() can influence the game-state. As such, they first need to acquire a lock on the game-state before they can be called. Currently, the main advantage is the time spend in Paint(), which for non-OpenGL drivers can be a few milliseconds. For OpenGL this is more like 0.05 milliseconds; in these instances this change doesn't add any benefits for now. This is an alternative to the former "draw-thread", which moved the drawing in a thread for some OSes. It has similar performance gain as this does, although this implementation allows for more finer control over what suffers when the GameLoop takes too long: drawing or the next GameLoop. For now they both suffer equally.
2021-03-08Remove: [Video] no longer draw in a threadPatric Stout
Drawing in a thread is a bit odd, and often leads to surprising issues. For example, OpenGL would only allow it if you move the full context to the thread. Which is not always easily done on all OSes. In general, the advise is to handle system events and drawing from the main thread, and do everything else in other threads. So, let's be more like other games. Additionally, putting the drawing routine in a thread was only done for a few targets. Upcoming commit will move the GameLoop in a thread, which will work for all targets.
2021-03-08Fix #8784: using alt+enter didn't update the fullscreen toggle visibly (#8820)Patric Stout
Basically, the window was not invalidated, so it was never redrawn. This made it look like it wasn't working, but it really was.
2021-02-28Add: settings to limit your fast-forward game speedPatric Stout
By default this setting is set to 2500% normal game speed.
2021-02-24Codechange: [Video] move InteractiveRandom() to the VideoDriverPatric Stout
2021-02-24Codechange: [Video] make the prototype of PollEvent() the same for all driversPatric Stout
Additionally, call it from the draw-tick.
2021-02-22Codechange: [SDL2] Split driver in base-part and default backendMichael Lutz
2021-02-22Codechange: [SDL] Move dirty_rect to class scope.Michael Lutz
2021-02-22Codechange: [SDL2] Allow several places to hook into the SDL driverPatric Stout
This allows future subdrivers to use these to manage their own flow.
2021-02-22Codechange: [SDL2] Move functions and variables to class-scopePatric Stout
This allows future subdrivers to override them.
2021-02-22Codechange: [SDL2] Move SDLSurface code to its own functionPatric Stout
This increases readability, and allow future subdrivers to not use SDLSurface to draw.
2021-02-22Codechange: [SDL2] Split Start() in a few more functionsPatric Stout
This makes it a bit easier to follow what is going on, and allow future subdrivers to hook into a few of these functions. Reworked the code slighly while at it, to return early where possible.
2021-02-20Codechange: Use C++-ism for zeroing.Michael Lutz
2021-02-20Codechange: deduplicate tick-handlers of all video driversPatric Stout
They were all identical, so better put this in a single place hoping it is less likely to break.
2021-02-20Codechange: be consistent in what CheckPaletteAnim() does and when it is calledPatric Stout
Additionally, make sure this is a class method. Later commits will make use of this.
2021-02-20Codechange: be consistent in naming the paint function Paint()Patric Stout
Also move this function to be a class member. This to allow further deduplicating of code in a later commit.
2021-02-20Codechange: use (Un)LockVideoBuffer() to manage video bufferPatric Stout
2021-02-20Codechange: move all input-handling of video-drivers into InputLoopPatric Stout
2021-02-19Fix fa170b9: [SDL2] forgot to use GetGameInterval where neededPatric Stout
2021-02-19Fix: during switching of game-mode, drawing could show closed windows that ↵Patric Stout
shouldn't be closed yet The higher your refresh-rate, the more likely this is. Mostly you notice this when creating a new game or when abandoning a game. This is a bit of a hack to keep the old behaviour, as before this patch the game was already freezing your mouse while it was changing game-mode, and it does this too after this patch. Just now it freezes too a few frames earlier, to prevent not drawing windows people still expect to see.
2021-02-19Feature: configurable refresh-rate and change default to 60fpsPatric Stout
Most modern games run on 60 fps, and for good reason. This gives a much smoother experiences. As some people have monitors that can do 144Hz or even 240Hz, allow people to configure the refresh rate. Of course, the higher you set the value, the more time the game spends on drawing pixels instead of simulating the game, which has an effect on simulation speed. The simulation will still always run at 33.33 fps, and is not influences by this setting.
2021-02-19Change: sleep till the next tick in the main loopPatric Stout
Sleep for 1ms (which is always (a lot) more than 1ms) is just randomly guessing and hoping you hit your deadline, give or take. But given we can calculate when our next frame is happening, we can just sleep for that exact amount. As these values are often a bit larger, it is also more likely the OS can schedule us back in close to our requested target. This means it is more likely we hit our deadlines, which makes the FPS a lot more stable.
2021-02-19Change: allow video-drivers to miss deadlines slightlyPatric Stout
Before, every next frame was calculated from the current time. If for some reason the current frame was drifting a bit, the next would too, and the next more, etc etc. This meant we rarely hit the targets we would like, like 33.33fps. Instead, allow video-drivers to drift slightly, and schedule the next frame based on the time the last should have happened. Only if the drift gets too much, that deadlines are missed for longer period of times, schedule the next frame based on the current time. This makes the FPS a lot smoother, as sleeps aren't as exact as you might think.
2021-02-19Add: draw the screen at a steady pace, also during fast-forwardPatric Stout
During fast-forward, the game was drawing as fast as it could. This means that the fast-forward was limited also by how fast we could draw, something that people in general don't expect. To give an extreme case, if you are fully zoomed out on a busy map, fast-forward would be mostly limited because of the time it takes to draw the screen. By decoupling the draw-tick and game-tick, we can keep the pace of the draw-tick the same while speeding up the game-tick. To use the extreme case as example again, if you are fully zoomed out now, the screen only redraws 33.33 times per second, fast-forwarding or not. This means fast-forward is much more likely to go at the same speed, no matter what you are looking at.
2021-02-19Codechange: track _realtime_tick more accuratePatric Stout
_realtime_tick was reset every time the diff was calculated. This means if it would trigger, say, every N.9 milliseconds, it would after two iterations already drift a millisecond. This adds up pretty quick.
2021-02-19Codechange: switch all video drivers to std::chrono for keeping timePatric Stout
On all OSes we tested the std::chrono::steady_clock is of a high enough resolution to do millisecond measurements, which is all we need. By accident, this fixes a Win32 driver bug, where we would never hit our targets, as the resolution of the clock was too low to do accurate millisecond measurements with (it was ~16ms resolution instead).
2021-02-17Fix: [SDL2] simplify what to redraw to prevent tearing (#8685)Patric Stout
When there are a lot of rects to redraw, of which one of the last ones is almost the full screen, visual tearing happens over the vertical axis. This is most visible when scrolling the map. This can be prevented by using less rects. To simplify the situation, and as solutions like OpenGL need this anyway, keep a single rect that shows the biggest size that updates everything correctly. Although this means it needs a bit more time redrawing where it is strictly seen not needed, it also means less commands have to be executed in the backend. In the end, this is a trade-off, and from experiments it seems the approach of this commit gives a better result.
2021-02-17Fix 52317bb7: [SDL2] ensure we don't try to blit out of bounds (#8684)Patric Stout
During resizing, there can still be dirty-rects ready to blit based on the old dimensions. X11 with shared memory enabled crashes if you try to do this. So, instead, if we resize, reset the dirty-rects. This is fine, as moments later we mark the whole (new) screen as dirty anyway.
2021-02-14Fix: VkMapping declarations violated C++ ODR rule.milek7
2021-02-11Change: [SDL2] Remove unneeded delay of redrawing the screenPatric Stout
In testing, I could find no reason why this statement is here. The comment is rather unclear (it states what it does, but not why it would be needed). This line of code was introduced with f4f40448, which gives no further insight on why it would be needed to have it here. As such, let's remove it and see if anyone else reports any problems with it. If so, this commit can be reverted and a more clear comment should be added what this line of code is dealing with (the WHY, not the WHAT).
2021-02-11Codechange: [SDL2] Don't use globals if we can do with localsPatric Stout
2021-02-11Codechange: [SDL2] Name paint function Paint(), like other drivers doPatric Stout
This reduces confusion when reading different drivers.
2021-02-11Fix 30e69c51: palette was not marked dirty when creating a newPatric Stout
This means the code depended that the caller did this for us before MakePalette() is executed, which is neither a requirement nor a promise the code makes.
2021-02-06Fix #8029: [SDL2] disable draw-thread on wayland SDL video driver (#8648)Patric Stout
When the wayland SDL video driver is used, an EGL context is created in the main thread. It is not allowed to update this context from another thread, which is exactly what our draw-thread is trying. The other solution would be to move all of SDL into the draw-thread, but that would introduce a whole scala of different problems. The wayland SDL backend is significantly faster than the X11 SDL backend, but there is a performance hit nevertheless.
2021-02-05Codechange: Apply coding style (#8640)SamuXarick
* Fix: Missing or needed spaces * Codechange: Remove space * Codechange: Remove space * Codechange: More missing spaces * Codechange: Missing spaces * Codechange: Remove space * Codechange: Remove space
2021-01-30Codechange: [SDL2] Use MakeDirty() to force a redrawPatric Stout
The original code is "strictly correct", but just reads really weird, and we use MakeDirty() in several other places instead too.
2021-01-30Codechange: [SDL2] Rework how palette is updatedPatric Stout
It now follows more what the Win32 driver does, and has far less exceptions and special casing. MakePalette creates the Palette and prepares surface. UpdatePalette updates the Palette. CheckPaletteAnim checks if UpdatePalette needs to be called and marks the whole screen dirty so DrawSurfaceToScreen will do a full redraw.
2021-01-30Fix: [SDL2] Display why SDL_CreateWindow() failed in case it doesPatric Stout
All SDL_NNN errors print SDL_GetError, except for this one place.
2021-01-30Codechange: [SDL2] Split away CreateMainWindow from CreateMainSurfacePatric Stout
This makes the code a bit more readable, as both intentions are more clear, and there is less nesting in the main function.
2021-01-30Codechange: [SDL2] reworked the different surfaces to make it more readablePatric Stout
2021-01-30Codechange: [SDL2] Only prepare "caption" if you are going to us itPatric Stout
2021-01-30Codechange: [SDL2] Minor code cleanup to remove silly variablePatric Stout
2021-01-30Codechange: [SDL2] Only set _cur_palette, never _local_palettePatric Stout
2021-01-30Codechange: [SDL2] Move FindStartupDisplay to its own functionPatric Stout
2021-01-30Codechange: [SDL2] reworked FindResolutions to be more like the restPatric Stout
There was no default resolution fallback, and the code was different from the win32 driver. It is now named the same and much more similar.
2021-01-30Codechange: [SDL2] remove include-protectionPatric Stout
This is already done by CMake: if SDL2 is not detected, this file is not included.
2021-01-17Codechange: [SDL2/Win32] Be consistent how 0bpp blitters are not allowedPatric Stout
Sometimes it returned an usererror(), sometimes Start() failed. Now it always fails on Start(), so nothing else has to check again what blitter is used. AfterBlitterChange() can never change to a 0bpp, so it is sufficient to guard this with an assert().
2021-01-16Fix 0e62a398c7f: Only center the window, when it is smaller than the screen. ↵frosch
(#8581)
2021-01-14Add: [SDL2] video driver parameter to put OpenTTD on a particular display on ↵frosch
start. By default use the display where the mouse cursor is. (#8572)