Geoffrey McRae
9dffde74b2
[client] main: skip duplicate frames
...
When a new client connects to our session the host will repeat the last
valid frame for the new client. This change will detect this and skip
the duplicated frame.
2021-07-25 13:46:48 +10:00
arcnmx
3b37898eb2
[all] use cmake FindPkgConfig IMPORTED_TARGETs
2021-07-24 12:35:48 +10:00
arcnmx
aa2ea05af9
[client] removed unused GMP dependency
2021-07-24 12:35:48 +10:00
arcnmx
38cb348201
[all] make OPTIMIZE_FOR_NATIVE a tristate option
2021-07-24 12:35:17 +10:00
arcnmx
be664c49c8
[all] cmake: use -march=x86-64-v2 when it becomes available
...
Moves the logic in 0525515
to a common cmake include, and applies it to
the other binaries.
2021-07-24 12:35:17 +10:00
Quantum
f09738678e
[client] fonts: remove font rendering machinery
2021-07-23 20:18:12 +10:00
Quantum
0c35d9b057
[client] opengl: remove font management
2021-07-23 20:18:12 +10:00
Quantum
cb9774bbd2
[client] egl: remove font management
2021-07-23 20:18:12 +10:00
Quantum
dd0edc1394
[client] renderers: remove alert handling
2021-07-23 20:18:12 +10:00
Quantum
be44249c05
[client] imgui: converted alerts to use imgui
2021-07-23 20:18:12 +10:00
Quantum
efb5019176
[client] overlay/help: switch to using ImGui's table facility
2021-07-23 18:04:05 +10:00
Quantum
5153d35bb5
[client] renderer: remove on_help from renderer interface
2021-07-23 18:04:05 +10:00
Quantum
036f16b9ef
[client] imgui: convert help overlay to use imgui
2021-07-23 18:04:05 +10:00
Quantum
436986d182
[client] imgui: make UI font and size configurable
2021-07-23 16:07:42 +10:00
Quantum
5d053128ac
[client] imgui: use improved high DPI rendering
...
This actually makes imgui render at a higher resolution, avoiding scaling
and resulting blurriness.
2021-07-23 16:07:42 +10:00
Quantum
b5c5ecc074
[client] imgui: support high DPI by scaling framebuffer
...
This allows overlays to render at correct positions on high DPI displays.
2021-07-23 16:07:42 +10:00
Quantum
56308fcbd1
[client] overlay: use utility function to get ImGui rectangle
2021-07-23 15:54:18 +10:00
Quantum
628bdab21b
[client] overlay: remove space checking
...
Every overlay is now guaranteed to be able to write MAX_OVERLAY_RECTS rects,
and running out of space is now an error.
2021-07-23 15:54:18 +10:00
Quantum
df0397b10b
[client] imgui: track last rectangles for overlays
...
This is necessary in case overlays change size. When this happens, we must
damage the larger of the overlays' rectangles this frame and last frame.
This erases the overlay from where it is no longer appears.
In order to do this, we must keep track of the rectangles for every overlay
with no exception. We cannot short-circuit the generation of rectangles if
we run out of buffer space, and we must allocate space for MAX_OVERLAY_RECTS
rectangles for every frame. Otherwise, we will not know where to erase the
overlay if it disappears.
2021-07-23 15:54:18 +10:00
Quantum
334bfeecea
[client] egl: correctly handle mixing imgui and non-imgui overlays
...
This allows the full frame to be damaged when both types are visible.
2021-07-23 15:53:59 +10:00
Quantum
b26067b0a0
[client] wayland: use new libdecor pkgconfig package name
2021-07-23 15:52:05 +10:00
Quantum
947eac52f6
[client] renderers: treat -1 as full damage and 0 as no overlay
...
This makes everything consistent.
2021-07-22 18:57:34 +10:00
Geoffrey McRae
eb5c588af9
[client] overlay: call igEnd before return
2021-07-22 18:38:32 +10:00
Geoffrey McRae
3b6ad957e3
[client] overlay: increment totalRects
2021-07-22 18:38:00 +10:00
Geoffrey McRae
4acbf2e9a0
[client] overlay: rework the interface to avoid possible race conditions
2021-07-22 18:33:50 +10:00
Geoffrey McRae
50f7a1a99c
[client] overlay: properly free the graphs before ll free
2021-07-22 18:32:28 +10:00
Quantum
515f08d2da
[client] egl: transform overlay damage coordinates
...
EGL uses bottom-up y-coordinate while we use top-down.
2021-07-22 18:32:18 +10:00
Quantum
58ab77d237
[client] egl: avoid overflowing damage buffer
...
We allocate 10 rectangles for overlay damage as agreed on Discord.
2021-07-22 18:32:18 +10:00
Geoffrey McRae
fdbdf6f167
[client] app: implement new overlay rendering framework
...
This change set implements a framework for overlays to be registered
that make use of ImGui. See `overlay/fps` for a simple implementation
example.
2021-07-22 17:27:30 +10:00
Geoffrey McRae
30c4a4786b
[client] overlay: cosmetic, fix typo
2021-07-22 14:50:10 +10:00
Geoffrey McRae
a34d3bbab4
[client] overlay: windowRects
is not an array of pointers
2021-07-22 14:48:08 +10:00
Geoffrey McRae
2310920e79
[client] overlay: added new interface for overlay windows using ImGui
2021-07-22 14:42:54 +10:00
Quantum
85f34602f4
[client] wayland: do not leak wp_presentation_feedback objects
2021-07-22 13:12:47 +10:00
Quantum
27e3be3778
[client] egl: free desktop damage after rendering
2021-07-22 13:12:07 +10:00
Quantum
bb60107a3b
[client] wayland: dispatch events through libdecor when using it
...
Currently, we dispatch the events on the wayland display server ourselves.
This is fine when using the cairo backend of libdecor, as it does the same
thign we do, but other backends may require other things to be dispatched.
This commit lets libdecor dispatch events instead through libdecor_get_fd
and libdecor_dispatch, which should hopefully makes things less sketchy.
2021-07-22 12:03:55 +10:00
Geoffrey McRae
08293c8721
[egl] damage: only update the damage vbo if there was a new frame
2021-07-21 17:29:46 +10:00
Geoffrey McRae
6389a06903
[client] main: let the renderer know if it's rendering a whole new frame
...
While the renderer can internally track this it would be better to
simply provide this information to the renderer directly so it can make
better decisions on how best to update the screen.
2021-07-21 17:26:48 +10:00
Geoffrey McRae
8cf444ef31
[client] main: sync to the ups if the ups exceeds minFrameTime
2021-07-21 16:56:49 +10:00
Geoffrey McRae
1c8af28f26
Revert "[client] main: increase the ups/fps update rate to once per 100ms"
...
This reverts commit b877bab48f
.
There is no need for this anymore after the prior commit which removed
this faulty implementation
2021-07-21 16:50:49 +10:00
Geoffrey McRae
9b472d62a9
[client] main: remove/fix faulty upsTime code
...
The implementation was flawed, instead we just update the presentation
time if there was not an early wakeup.
2021-07-21 16:47:37 +10:00
Quantum
1a88996c47
[client] opengl: don't include <GL/glx.h>
...
The OpenGL renderer backend should not depend on any particular
implementation of OpenGL, as it's used by both X11 and Wayland.
2021-07-21 12:33:01 +10:00
Geoffrey McRae
3c0ebd54ec
[client] main: improve frame rate sync lock with the guest
...
If the guest is not sending frames at a constant rate, the minimum FPS
timeout may expire drawing an additional frame. This change calculates
the average ups frame time over the past 100ms and adds this to the
timeout value allowing this value to be dynamic.
2021-07-20 15:41:56 +10:00
Geoffrey McRae
b877bab48f
[client] main: increase the ups/fps update rate to once per 100ms
...
This is so that we can use the ups information in the following commit.
2021-07-20 15:40:57 +10:00
Geoffrey McRae
e6e07e8f3f
[client] main: use the monotonic clock to calculate the ups/fps
...
The accumulated time is not the best way to do this as the timer
function callback may not be exactly every 1000ms, by using the
monotonic clock we will get more accurate results.
2021-07-20 15:40:51 +10:00
Quantum
3f7261d7d9
[client] wayland: do not crash when presentation time is unavailable
...
We don't need the presentation time protocol, so fail gracefully when
it's unavailable.
2021-07-20 14:23:08 +10:00
Quantum
563ad18f4e
[client] egl: improve cursor damage logic
...
1. Use atomics and return exact cursor positions from egl_cursor_render
to avoid race conditions between cursor render and update.
2. Instead of messing with lastCursorValid in various overlays, simply use
the hasOverlay/hadOverlay logic for cursor damage. This simplifies the
logic greatly.
As a result, I believe all cursor-related artifacts are fixed.
Note to reviewer: as atomic_init and atomic_store are implemented as macros,
it is currently not possible to pass structs as compound literals due to the
comma being interpreted as an argument separator by the preprocessor.
2021-07-20 11:29:13 +10:00
Quantum
b8effaf42c
[client] egl: use glGetError and codes for errors in gl* functions
...
We used to use DEBUG_EGL_ERROR for gl* functions, which just yields
EGL_SUCCESS even when there are errors.
2021-07-19 19:36:46 +10:00
Quantum
0cbc529640
[client] ds: refactor common EGL swap with damage logic
...
This commit creates a new utility library, eglutil.h, which contains code
to detect and use EGL_KHR_swap_buffers_with_damage or its EXT equivalent.
This logic used to be duplicated between the X11 and Wayland display servers,
which is not ideal.
2021-07-19 19:35:52 +10:00
Geoffrey McRae
2de9912ac0
[client] egl: EGL_KHR_swap_buffers_with_damage returns EGLBoolean
2021-07-19 13:32:56 +10:00
Geoffrey McRae
33bf668697
[client] app: correct FPS to use an actual per second value
2021-07-19 10:58:40 +10:00
Geoffrey McRae
e4e1451eaa
[client] app: give some transparency to the new FPS window
2021-07-18 21:22:16 +10:00
Quantum
7c872d2d9e
[client] egl: properly use OpenGL ES
...
Instead of using the desktop <GL/gl.h>, we properly use the OpenGL ES 3.x
headers. Also, we now use GL_EXT_buffer_storage for MAP_PERSISTENT_BIT_EXT
and MAP_COHERENT_BIT_EXT as the core versions are only available in desktop
OpenGL 4.4. Similarly, we need GL_EXT_texture_format_BGRA8888 for GL_BGRA_EXT
as GL_BGRA is desktop-only.
2021-07-18 20:44:32 +10:00
Geoffrey McRae
ab31040d5f
[client] all: use imgui for FPS/UPS display
2021-07-18 20:43:17 +10:00
Quantum
42d8f31eba
[client] imgui: use ES 3.0 and remove glew dependency
...
If we specifically tell ImGui's OpenGL 3.x backend to target OpenGL ES 3.0,
then no extension loader is necessary.
2021-07-18 18:50:12 +10:00
Quantum
c6a6230a56
[client] egl: revert "only copy damaged areas when using dmabuf"
...
This reverts commit a14de25661
.
Frame is sometimes incorrect.
2021-07-18 18:48:35 +10:00
Quantum
a14de25661
[client] egl: only copy damaged areas when using dmabuf
...
This speeds up the copy significantly when the frame only has small
amount of damage.
2021-07-18 17:41:29 +10:00
Quantum
09893fd728
[client] wayland: display swap to photon latency graph
2021-07-18 16:15:10 +10:00
Quantum
e87bc3a83e
[client] wayland: measure presentation time
2021-07-18 16:15:10 +10:00
Quantum
6da9428d85
[client] imgui: use struct for graph metrics instead of array
...
This allows the members to be named, making the code much easier to read.
2021-07-18 16:15:10 +10:00
Quantum
15bc6a1509
[client] imgui: support registering new graphs
...
Currently, our struct ll doesn't support removing elements from the middle,
so we will not be removing anything for now.
2021-07-18 16:15:10 +10:00
Quantum
a4bf3c8088
[client] egl: use debug context and make it configurable
...
The boolean option egl:debug is used to control whether we want debug
output or not. This defaults to true to aid in debugging.
2021-07-18 15:55:50 +10:00
Quantum
6472c28473
[client] egl: upload damage vertices with glBufferSubData
...
This avoids the issues surrounding glMapBuffer and glMapBufferRange in
OpenGL ES.
2021-07-18 15:55:27 +10:00
Quantum
f49f2af6cd
[client] egl: implement error reporting callback
...
This reports useful information from OpenGL on supported platforms.
2021-07-18 13:54:16 +10:00
Quantum
061b9ba6c2
[client] egl: use vertex array objects in model.c
...
This eliminates the need to bind the buffers and set up the vertices on
every frame.
2021-07-18 11:58:47 +10:00
Quantum
d4f8426ae4
[client] egl: correctly clean up vertex buffer objects
...
The code used to use hasBuffer, which was never set to true, so buffer
objects were always leaked instead.
2021-07-18 11:58:47 +10:00
Quantum
e0c9a71cd8
[client] spice: remove dpi which is no longer used
...
DPI was originally added to workaround cursor movement scaling, but since
due to changes with mouse handling, it's no longer required.
2021-07-18 10:50:57 +10:00
Geoffrey McRae
d44d87ee7f
[client] spice: update to use the new epoll version of PureSpice
2021-07-18 10:48:56 +10:00
Quantum
2b3f31700b
[client] egl: implement frame damage display
2021-07-18 10:41:50 +10:00
Quantum
12cb3e512f
[client] util: add function for merging overlapping rectangles
...
This will be used to merge overlapping rectangles in order to avoid copying
the same rectangles multiple times.
2021-07-18 10:41:50 +10:00
Quantum
00eb26a34f
[client] egl: do not use damage when overlays are visible
...
This allows the overlays to show up correctly.
2021-07-18 10:41:50 +10:00
Quantum
442ab318fd
[client] egl: use desktop frame damage information
2021-07-18 10:41:50 +10:00
Quantum
6695ca3f34
[client] ds: remove SDL display server
2021-07-18 10:34:41 +10:00
Quantum
eb357fa58a
[client] egl: use glCopyTexSubImage2D to copy when using DMA
...
This removes the need for the driver to allocate texture storage and deleting
the previous allocation on every frame update.
2021-07-18 10:34:21 +10:00
Quantum
39ec32b2ef
[client] cimgui: build as static library
2021-07-18 10:31:45 +10:00
Geoffrey McRae
df2f623599
[client] app: add keybind to toggle frame timing information display
2021-07-18 09:59:37 +10:00
Geoffrey McRae
73357988e6
[client] main: don't trigger redraws if the video feed is disabled
...
If the video feed is disabled we are not drawing the cursor, so don't
cause needless redraws
2021-07-17 21:09:51 +10:00
Geoffrey McRae
03c247a9ff
[client] x11: make use of eglSwapBuffersWithDamage if it's available
2021-07-17 21:09:51 +10:00
Geoffrey McRae
092ce61908
[client] main: copy & release KVMFR messages sooner
...
The renderer may take time to process the cursor update due to various
internal factors, as such it's best we copy the data and mark the
message as done ASAP. This prevents the host from filling up the queue
as easily when a high dpi mouse is in use.
2021-07-17 21:09:51 +10:00
Geoffrey McRae
b9d7674b20
[client] imgui: calculate min/max/avg/fps and add them to the plots
2021-07-17 21:09:51 +10:00
Geoffrey McRae
8e3df5a38f
[client] main: dont push an invalid value into the timings buffers
2021-07-17 21:09:51 +10:00
Geoffrey McRae
2e76c874cc
[client] app: initial imgui frame timings
2021-07-17 21:09:51 +10:00
Geoffrey McRae
c3bc5fb0ff
[client] app: collect render and frame timing information
2021-07-17 21:09:51 +10:00
Geoffrey McRae
bcffd70270
[client] app: init/destroy imgui context on run/shutdown
2021-07-17 21:09:51 +10:00
Geoffrey McRae
f08163fd72
[client] imgui: added imgui to the client and OpenGL/EGL renderers
2021-07-17 21:09:51 +10:00
Quantum
48ae5c69f4
[client] wayland: fix typo in warp usage
...
The unwanted ! was introduced in 4b99bba200
.
This basically caused warp to never be used.
2021-07-15 08:40:36 +10:00
Geoffrey McRae
59efa6f0ad
[client] config: default minimizeOnFocusLoss
to off
2021-07-08 08:49:00 +10:00
Geoffrey McRae
1effd5fddc
[common] debug: add color support to debug messages
...
People often miss the warnings about invalid arguments in their command
line, this last minute patch attempts to address this by making
warnings, errors, fixme's and fatal errors stand out if stdout is a TTY.
2021-07-07 23:05:46 +10:00
A.J. Ruckman
1a7b7ce01e
[client] Fix narrowing issues with win:shrinkOnUpscale param
...
Conversion from the float values srcW/srcH to the int values for the client window dimensions would sometimes round down, causing the client to scale instead of matching the host's resolution.
2021-07-06 01:46:33 +10:00
Geoffrey McRae
7c1e8a85cd
[client] egl: fix race on resolution change
...
A resolution switch could cause the renderer state to become invalid as
the texture format may change while it's being rendered. This fixes this
by adding a lock around the format change and render calls to the
renderer.
2021-07-04 21:56:16 +10:00
arcnmx
1345e92ec0
[client] install cmake target
2021-07-03 03:30:53 +10:00
Geoffrey McRae
7b95cc72ed
[client] opengl: do not render a sync pending texture
2021-07-02 21:48:31 +10:00
Geoffrey McRae
203ebc73eb
[client] x11/opengl: enable double buffering for OpenGL
...
Drawing to the front buffer directly requires special handling to
prevent seeing the draw progress (avoiding glClear, etc) and as a result
the output is quite bad unless a compositor is running. Also vsync if
enabled will not function without double buffering enabled.
As OpenGL is the legacy fallback, there are no plans to implement clean
front buffer draw support, so just enable double buffering.
2021-07-02 21:45:12 +10:00
Geoffrey McRae
d24b031fc5
[client] opengl: cosmetics
2021-07-02 20:10:25 +10:00
Geoffrey McRae
55d185ef9c
[client] opengl: no need to re-bind the already bound texture
2021-07-02 19:51:22 +10:00
Geoffrey McRae
9cbc255448
[client] opengl: do not prematurely delete overlay textures
...
Overlay textures exist for the lifetime of the renderer and as such
should not be deleted when the resolution changes.
2021-07-02 19:50:31 +10:00
Geoffrey McRae
212cc32097
[client] opengl: deconfigure is idempotent
2021-07-02 19:50:15 +10:00
Quantum
6419279c3c
[client] wayland/clipboard: prefer text/plain over text/html
...
When both text/plain and text/html are available, we should prefer the plain
text as we can't paste HTML.
2021-06-26 12:49:47 +10:00
Quantum
f3a1eaf557
[client] wayland: fix full screen toggle in capture mode regression
...
This was fixed in 9db3cd7b
and accidentally broke again in 4b99bba2
.
2021-06-20 09:27:33 +10:00
Geoffrey McRae
facbb54776
[client] x11: create _NET_WM_BYPASS_COMPOSITOR if it doesn't exist
...
If a compositor has not yet started or is not running the atom
`_NET_WM_BYPASS_COMPOSITOR` may not have yet been created. As such we
need to create it so that if a compositor is started it will see this
propery and honour it.
2021-06-17 11:16:26 +10:00
Geoffrey McRae
9f25f7fced
[client] main: display error when the frame has been truncated
2021-06-12 19:06:32 +10:00