269 Commits

Author SHA1 Message Date
Colin Snover
5c855a0a5a BACKENDS: Fix shake position getting stuck
If a game is doing a screen shake (for example, DOTT when the
stereo is on), and the user does an RTL, the screen shake offset
may get stuck if the engine does not reset it on shutdown. To
avoid this in all cases, just always reset the screen shake
whenever the graphics manager is told to switch to a new graphics
mode.
2017-12-01 19:43:12 -06:00
Colin Snover
5d8cf6ba42 BACKENDS: Fix GraphicsManager handling of empty cursors
The SDL graphics manager was just ignoring calls from CursorMan to
set the cursor to a blank cursor, which meant engines that did not
immediately send a cursor to CursorMan at startup would still show
the launcher's cursor (usually with a broken palette).

The OpenGL graphics manager would try to generate and draw an
invalid cursor surface when receiving an empty cursor.
2017-10-15 13:24:20 -05:00
Colin Snover
da0a8db704 BACKENDS: Also hide mouse cursor outside game area when an engine has hidden the cursor
The only reason we show the system cursor outside the game area is
to show users where their mouse is when the window is resized and
the mouse is outside the game area. If the game cannot be
interacted with, then the mouse also does not need to be shown in
the black areas.
2017-10-15 13:24:20 -05:00
Colin Snover
de2bbe3b97 BACKENDS: Refactor OpenGL & SDL graphics backends
This patch refactors the OpenGL and SDL graphics backends,
primarily to unify window scaling and mouse handling, and to
fix coordinate mapping between the ScummVM window and the
virtual game screen when they have different aspect ratios.

Unified code for these two backends has been moved to a new
header-only WindowedGraphicsManager class, so named because it
contains code for managing graphics managers that interact with
a windowing system and render virtual screens within a larger
physical content window.

The biggest behavioral change here is with the coordinate
system mapping:

Previously, mouse offsets were converted by mapping the whole
space within the window as input to the virtual game screen
without maintaining aspect ratio. This was done to prevent
'stickiness' when the mouse cursor was within the window but
outside of the virtual game screen, but it caused noticeable
distortion of mouse movement speed on the axis with blank
space.

Instead of introducing mouse speed distortion to prevent
stickiness, this patch changes coordinate transformation to
show the system cursor when the mouse moves outside of the virtual
game screen when mouse grab is off, or by holding the mouse inside
the virtual game screen (instead of the entire window) when mouse
grab is on.

This patch also improves some other properties of the
GraphicsManager/PaletteManager interfaces:

* Nullipotent operations (getWidth, getHeight, etc.) of the
  PaletteManager/GraphicsManager interfaces are now const
* Methods marked `virtual` but not inherited by any subclass have
  been de-virtualized
* Extra unnecessary calculations of hardware height in
  SurfaceSdlGraphicsManager have been removed
* Methods have been renamed where appropriate for clarity
  (setWindowSize -> handleResize, etc.)
* C++11 support improved with `override` specifier added on
  overridden virtual methods in subclasses (primarily to avoid
  myself accidentally creating new methods in the subclasses
  by changing types/names during refactoring)

Additional refactoring can and should be done at some point to
continue to deduplicate code between the OpenGL and SDL backends.
Since the primary goal here was to improve the coordinate mapping,
full refactoring of these backends was not completed here.
2017-10-15 13:24:20 -05:00
Colin Snover
b53020f704 BACKENDS: Fix some comment typos 2017-10-15 13:24:20 -05:00
Bastien Bouclet
8e4697946e OPENGL: Always clear the whole backbuffer
Previously we were clearing the whole backbuffer for 3 frames after a
window size change, and then only clearing the game area. This assumes
the OpenGL driver uses at most 3 render buffer and uses them in
sequential order. This does not seem to be the case on Linux when using
an Intel integrated GPU.
Instead we now clear the whole backbuffer on each frame to make sure
there are no leftovers remaining on the screen. All semi-recent GPUs
should have hardware clear anyway so this should not impact negatively
performance.

Possibly fixes #10025.
2017-08-05 08:36:32 +02:00
Eugene Sandulenko
940b2a20f1 Revert "COMMON: Change way the Singleton instances are instantiated"
This reverts commit eefa72afa1978a9dea10f5b1833fcc8f58a3468e.

With this patch ConfigManager is broken.
2017-07-10 21:17:41 +02:00
Thierry Crozat
eefa72afa1 COMMON: Change way the Singleton instances are instantiated
This fixes tons of warnings with clang from a recent xcode version on
macOS (and possibly other systems) complaining that an instantiation
of _singleton is required but no definition is available.
2017-07-10 21:11:20 +02:00
Colin Snover
fa0bb7dd5a BACKENDS: Compress screenshots using PNG if available
Closes gh-948.
2017-05-21 15:55:39 -05:00
Bastien Bouclet
23abcffbc5 OPENGL: Don't update the cursor's texture when the cursor is invisible
Updating the cursor's texture is not necessary if it is not going to be drawn.

Fixes glDrawArrays sometimes failing due to using a framebuffer with an
incomplete color attachment. In SCI32 games, the framebuffer is incomplete
because the engine does not define pixel data for the cursor.
2017-05-08 06:50:30 +02:00
Thierry Crozat
a9ae691513 SDL: Improve debug and warning messages when saving screenshots
In particular this adds a warning when failing to save a screenshot
in OpenGL mode (there was already one in SurfaceSDL mode).
2017-04-24 01:07:16 +01:00
Thierry Crozat
cbfa598446 OPENGL: Remove hack to avoid issues with OSD messages from other threads 2016-10-29 15:13:32 +01:00
Thierry Crozat
c6ce1c8002 OPENGL: Add support for filtering feature
This replaces the two graphics modes "OpenGL (No filtering)" and
"OpenGL". Now there is a single "OpenGL" mode and filtering is
controlled by the kFeatureFilteringMode.
2016-10-13 01:45:01 +01:00
Bastien Bouclet
5e133cdd34 OPENGL: Make sure the cloud icon is cleared immediatly after it is hidden 2016-09-18 17:55:09 +02:00
Bastien Bouclet
75599a4c25 OPENGL: Remove multithread support from displayActivityIconOnOSD
It is no longer being called by another thread.
2016-09-18 17:55:09 +02:00
Thierry Crozat
2d651fd0f4 OPENGL: Fix dereferencing null pointer in OpenGLGraphicsManager
This fixes a crash when calling displayActivityIconOnOSD with a
NULL icon, which is used to remove the current activity icon.
2016-09-13 22:58:13 +01:00
Bastien Bouclet
9cbaad6140 SDL: Switch the OpenGL renderer to use small textures to draw the OSD 2016-09-13 20:41:26 +02:00
Thierry Crozat
a8cb3c8404 OPENGL: Implement getOSDFormat and copyRectToOSD 2016-09-05 21:40:45 +01:00
Thierry Crozat
65d3c15b01 OPENGL: Add missing USE_OSD defined checks around OSD code 2016-09-05 21:21:32 +01:00
Alexander Tkachev
1b9987ddc9 GUI: Add getOSDFormat() and make OSD 32 bpp 2016-08-24 16:07:55 +06:00
Alexander Tkachev
2a15b8b280 GUI: Add clearOSD() method
So one can erase everything from OSD and then blit something on it.
2016-08-24 16:07:55 +06:00
Alexander Tkachev
7ff1f91808 GUI: Add copyRectToOSD()
I was lazy to implement that in OpenGLGraphicsManager and I'm not sure
it's implemented correctly in SurfaceSdlGraphicsManager, but it works
for me.
2016-08-24 16:07:55 +06:00
Ori Avtalion
4d120800fa ALL: Don't use 'defined' in macro definitions
This is undefined behavior and clang warns about it.
See <http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20160118/147239.html>.
2016-07-23 16:18:51 +03:00
Johannes Schickel
8ff5329b49 OPENGL: Assure color attributes for shader pipeline are always set. 2016-05-03 20:43:18 +02:00
Eugene Sandulenko
050a1cd605 OPENGL: Fix potential crash 2016-05-02 15:19:07 +02:00
Johannes Schickel
8161effc68 OPENGL: Add assertions to check for valid attribute state. 2016-03-23 22:37:16 +01:00
Johannes Schickel
2ebffd2da5 OPENGL: Fix black screen for some GL implementations with shaders.
For compatibility location 0 is used to decide whether fixed function style
vertex information is used in old GL contexts. In some cases drivers might
assign the color information to be passed through attribute 0. This caused
the array attribute status for location 0 to be disabled and resulted in
wrong vertex data to be used.
2016-03-23 22:30:25 +01:00
Johannes Schickel
6b2424b635 OPENGL: Log extensions available on debuglevel 5+. 2016-03-16 21:03:43 +01:00
Johannes Schickel
b7a269947f OPENGL: Flag texture dirty on allocation. 2016-03-16 20:29:31 +01:00
Johannes Schickel
17b1124a5a OPENGL: Do not keep uniform state for nonexistent uniforms. 2016-03-16 20:29:31 +01:00
Johannes Schickel
1e1272a8c4 OPENGL: Store logical texture dimensions in GLTexture. 2016-03-16 20:29:31 +01:00
Johannes Schickel
2b3340474e OPENGL: Introduce convenience wrappers for get*Location in Shader. 2016-03-16 20:29:31 +01:00
Johannes Schickel
39100b6132 OPENGL: Do not hardcode any uniform/attribute handling in Shader. 2016-03-16 20:29:31 +01:00
Johannes Schickel
baca885cfc OPENGL: Let Shader store the uniform state. 2016-03-16 20:29:31 +01:00
Johannes Schickel
6dacc96d1f OPENGL: Only set projection matrix once on pipeline activation. 2016-03-16 20:29:31 +01:00
Johannes Schickel
8b80e9d36c OPENGL: Properly deactivate old pipeline. 2016-03-16 20:29:31 +01:00
Johannes Schickel
3f9852eb20 OPENGL: Make shader pipelines use fixed shaders. 2016-03-16 20:29:31 +01:00
Johannes Schickel
26f106497a OPENGL: Implement CLUT8 look up as Pipeline. 2016-03-16 20:29:30 +01:00
Johannes Schickel
8a4938f82b OPENGL: Move pipeline code to pipelines/. 2016-03-16 20:29:30 +01:00
Johannes Schickel
bec2088d6c OPENGL: Only allow Pipeline to switch active Framebuffers. 2016-03-16 20:29:30 +01:00
Johannes Schickel
ed6689d4fc OPENGL: Do not allow direct access to Context::activePipeline. 2016-03-16 20:29:27 +01:00
Johannes Schickel
b17c035642 OPENGL: Implement texture drawing in Pipeline instead of Surface. 2016-03-16 20:29:27 +01:00
Johannes Schickel
0fe580d10c OPENGL: Make shader/framebuffer part of pipeline state. 2016-03-16 20:29:27 +01:00
Johannes Schickel
0b46af2f0e OPENGL: Don't prefix maxTextureSize variable for consistency. 2016-03-16 20:29:27 +01:00
Johannes Schickel
c4e65732be OPENGL: Introduce abstraction for framebuffer.
This allows us to use various framebuffer settings easily. Now the GPU
accelerated CLUT8 surface implementation does not need to query former
framebuffer state anymore.
2016-03-16 20:29:26 +01:00
Johannes Schickel
5498982a37 OPENGL: Introduce ShaderManager to handle builtin shaders. 2016-03-16 20:29:26 +01:00
Johannes Schickel
f5f1b6eba0 OPENGL: Introduce pipeline abstraction to cleanup code. 2016-03-16 20:29:26 +01:00
Johannes Schickel
08553a09cf OPENGL: Support GLSL based CLUT8 look up for GLES2+. 2016-03-16 20:29:26 +01:00
Johannes Schickel
bf2735cd53 OPENGL: Detect NPOT support for GLES.
For GLES1+ there exists GL_OES_texture_npot, which indicates that there is
NPOT support.

GLES2 always had (limited) NPOT support, which is all we require, thus we
always enable it.
2016-03-16 20:29:26 +01:00
Johannes Schickel
18306ee206 OPENGL: Simplify shader support checks. 2016-03-16 20:29:26 +01:00