Commit graph

349 commits

Author SHA1 Message Date
Simon Ser
535fa8c7e5 steamcompmgr: add _NET_WM_STATE to supported atoms 2020-08-26 11:50:26 +02:00
Simon Ser
9889d4f521 steamcompmgr: set _NET_WM_STATE_FOCUSED 2020-08-26 11:50:26 +02:00
Simon Ser
3b9f8a6d85
Rename NET_WM_STATE_* Atom globals
Give them a less misleading name, because WM_STATE is a separate thing.
2020-08-12 12:04:45 +02:00
Simon Ser
aa853dbb76
steamcompmgr: use initializer for supported atoms
Makes it less error-prone to add atoms to the list.
2020-08-12 11:41:07 +02:00
Pierre-Loup A. Griffais
695fc4eb17 steamcompmgr: flip opacity default and ignore transparent windows for focus
Origin has a bunch of sub-windows that are fully translucent until remapped.
2020-08-04 18:25:39 -07:00
Pierre-Loup A. Griffais
272699656f steamcompmgr: also allow override redirect windows out-of-game
Only if there's no alternative. Useful for Steam updater screen.
2020-08-04 18:25:39 -07:00
Pierre-Loup A. Griffais
a24b3ba008 steamcompmgr: add focus debug optional spew 2020-08-04 18:25:39 -07:00
Simon Ser
d7132a2397
Remove unused CVulkanTexture::m_DMA 2020-07-30 13:38:05 +02:00
Simon Ser
dd4d035808
Fix DMA-BUF leak in CVulkanTexture with bFlippable
We were storing the DMA-BUF in a CVulkanTexture field, without using it
after BInit, and without cleaning it up on destroy.
2020-07-30 13:34:59 +02:00
Pierre-Loup A. Griffais
69bcb1b339 Revert "Hold buffers till steamcompmgr processes them"
This reverts commit 98e263c37d.
2020-07-24 15:01:33 -07:00
Pierre-Loup A. Griffais
da81b37d07 Revert "Add wlr_buffer to commit queue"
This reverts commit 789f009a53.
2020-07-24 15:01:32 -07:00
Pierre-Loup A. Griffais
0757f2676b Revert "Copy commit queue in check_new_wayland_res"
This reverts commit 9c9a8093ee.
2020-07-24 15:01:31 -07:00
Pierre-Loup A. Griffais
fb2fd1127a Revert "Hold client buffers till KMS stops using them"
This reverts commit c9e11ebdbf.
2020-07-24 15:01:28 -07:00
Simon Ser
77722293f3 Don't use VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA for imported DMA-BUFs
We don't know whether clients create scanout-able DMA-BUFs.
2020-07-23 22:41:56 +02:00
Simon Ser
c9e11ebdbf Hold client buffers till KMS stops using them 2020-07-23 22:26:06 +02:00
Simon Ser
9c9a8093ee Copy commit queue in check_new_wayland_res
This will allow us to call wlr_buffer_lock/unlock in import_commit without
causing a deadlock.
2020-07-23 22:26:06 +02:00
Simon Ser
789f009a53 Add wlr_buffer to commit queue
This lets us keep the buffers for pending commits locked.
2020-07-23 22:26:06 +02:00
Simon Ser
98e263c37d Hold buffers till steamcompmgr processes them 2020-07-23 22:26:06 +02:00
Simon Ser
b7505b23cf Get DMA-BUF from wlr_buffer if possible
wlr_texture_to_dmabuf involves issuing EGL commands to get a DMA-BUF out
of an EGLImage.

When the client submits a DMA-BUF via the linux-dmabuf protocol, there's
no need to go through EGL. We can directly import the client's DMA-BUF
into Vulkan.

The old code is still retained as a fallback in case the client uses
wl_drm (old Xwayland) or wl_shm. Removing it would involve creating a
Vulkan-based wlr_renderer.

References: https://github.com/Plagman/gamescope/issues/16
2020-07-23 22:14:17 +02:00
Simon Ser
4ddb892d4f
wlserver: listen for new_input on the multi backend
The multi backend aggregates all input devices. No need to have a
different listener for headless and libinput.
2020-07-23 13:52:07 +02:00
Pierre-Loup A. Griffais
064d132c93 wlserver: Fix use-after-free of wlr_surface in steamcompmgr. 2020-07-03 15:05:00 -07:00
Pierre-Loup A. Griffais
2e7f86f80c steamcompmgr: Only raise new windows if they want to be.
Leaves embed tray icon windows to take care of.
2020-07-03 14:27:57 -07:00
Pierre-Loup A. Griffais
6d65808e0a steamcompmgr: implement _NET_ACTIVE_WINDOW.
Doesn't actually seem to be used for the newly-mapped Origin setup
window, so hacks have to stay in for the time being until that's
understood.
2020-07-03 14:01:08 -07:00
Pierre-Loup A. Griffais
d95d4bf796 steamcompmgr: focus tweaks/hacks when out of game.
Avoid override redirect windows.

Raise new windows, don't focus tiny windows. If we only raised windows
that want to be activated, we probably wouldn't need the hack to filter
out small windows. TBD.
2020-07-03 13:00:09 -07:00
Pierre-Loup A. Griffais
575171360b wlserver: properly handle touch for scaled windows.
Gets scale from steamcompmgr in an extremely safe and elegant way.
2020-07-02 17:40:31 -07:00
Pierre-Loup A. Griffais
76b7d58a74 Show cursor always, not just in-game.
Will do a cosmetic pass later but unblock using Steam windows that use
OS cursor for now.
2020-06-29 13:46:36 -07:00
Simon Ser
4524ac3cbb
Fix alloc-dealloc-mismatch in add_win
ASan trace:

    ==14537==ERROR: AddressSanitizer: alloc-dealloc-mismatch (operator new vs free) on 0x6120002290c0
    DispatchAsyncEvent backlog, failed to dispatch all this frame. Queue depth: 1685 (1687 input number was)
        #0 0x7f44ebe590e9 in __interceptor_free /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cpp:123
        #1 0x555b4b76b66f in add_win ../src/steamcompmgr.cpp:1550
        #2 0x555b4b7735d4 in steamcompmgr_main(int, char**) ../src/steamcompmgr.cpp:2278
        #3 0x555b4b79fca5 in steamCompMgrThreadRun() ../src/main.cpp:124
        #4 0x555b4b79f5ee in void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60
        #5 0x555b4b79f467 in std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95
        #6 0x555b4b79f34b in void std:🧵:_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264
        #7 0x555b4b79f28e in std:🧵:_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271
        #8 0x555b4b79ebb2 in std:🧵:_State_impl<std:🧵:_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215
        #9 0x7f44eb664b73 in execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80
        #10 0x7f44eaaad421 in start_thread (/usr/lib/libpthread.so.0+0x9421)
        #11 0x7f44ea9dcbf2 in __GI___clone (/usr/lib/libc.so.6+0xffbf2)

    0x6120002290c0 is located 0 bytes inside of 304-byte region [0x6120002290c0,0x6120002291f0)
    allocated by thread T18 here:
        #0 0x7f44ebe5af41 in operator new(unsigned long) /build/gcc/src/gcc/libsanitizer/asan/asan_new_delete.cpp:99
        #1 0x555b4b76b2ae in add_win ../src/steamcompmgr.cpp:1533
        #2 0x555b4b7735d4 in steamcompmgr_main(int, char**) ../src/steamcompmgr.cpp:2278
        #3 0x555b4b79fca5 in steamCompMgrThreadRun() ../src/main.cpp:124
        #4 0x555b4b79f5ee in void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:60
        #5 0x555b4b79f467 in std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/10.1.0/bits/invoke.h:95
        #6 0x555b4b79f34b in void std:🧵:_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/10.1.0/thread:264
        #7 0x555b4b79f28e in std:🧵:_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/10.1.0/thread:271
        #8 0x555b4b79ebb2 in std:🧵:_State_impl<std:🧵:_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/10.1.0/thread:215
        #9 0x7f44eb664b73 in execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80

    Thread T18 created by T0 here:
    DispatchAsyncEvent backlog, failed to dispatch all this frame. Queue depth: 669 (1699 input number was)
        #0 0x7f44ebdff1c7 in __interceptor_pthread_create /build/gcc/src/gcc/libsanitizer/asan/asan_interceptors.cpp:214
        #1 0x7f44eb664e49 in __gthread_create /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663
        #2 0x7f44eb664e49 in std:🧵:_M_start_thread(std::unique_ptr<std:🧵:_State, std::default_delete<std:🧵:_State> >, void (*)()) /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:135
        #3 0x555b4b79fd3e in startSteamCompMgr() ../src/main.cpp:129
        #4 0x555b4b7a725e in xwayland_ready ../src/wlserver.cpp:114
        #5 0x555b4b8dea6a in wlr_signal_emit_safe ../subprojects/wlroots/util/signal.c:29
        #6 0x555b4b8e2263 in xserver_handle_ready ../subprojects/wlroots/xwayland/server.c:234
        #7 0x7f44ebb5f434  (/usr/lib/libwayland-server.so.0+0xa434)
2020-06-18 19:03:28 +02:00
Simon Ser
5228f37089
Fix EINVAL when using direct scan-out without libliftoff
When directly scanning out game buffers, we need to make sure the game
buffer is suitable for scanout. If that's not the case, we need to
fallback to composition.

The fallback path was implemented, but we never checked whether scan-out
is possible in drm_can_avoid_composite. Perform an atomic test-only
commit to fix this.
2020-06-18 18:01:32 +02:00
Simon Ser
bae255ee1a
Get rid of C_SIDE
wlroots headers can mostly be included with extern "C" blocks. Two
exceptions are the use of `static` for array args and `class` as a
struct field. These can be #define'ed to avoid C++ build errors.

This allows the whole project to be built as a single C++ codebase,
without having to maintain hybrid header files.
2020-06-11 12:44:36 +02:00
Pierre-Loup A. Griffais
453caf7672 steamcompmgr: don't focus overlay windows, they're just there to be composited 2020-06-02 16:07:15 -07:00
Pierre-Loup A. Griffais
44023e25d0 steamcompmgr: (mostly) obey stacking order when out of game 2020-06-01 17:37:59 -07:00
Simon Ser
d41c865661
Fix error handling in drm_can_avoid_composite
-1 is a truthy value.
2020-05-26 17:15:27 +02:00
Simon Ser
cb540e3fc7
Fix error handling in add_connector_property 2020-05-26 17:00:27 +02:00
Simon Ser
af983d2b75
Print DRM logs to stderr instead of stdout
stdout isn't flushed on each newline when redirected to a file. stderr
is always line-buffered. This prevents missing logs and badly
interleaved logs.
2020-05-26 16:58:47 +02:00
Simon Ser
cdef160f14
Simplify fbids_queued handling in page_flip_handler 2020-05-26 16:50:18 +02:00
Simon Ser
9802890c93
Fix spurious assertions in page_flip_handler
This commit fixes two issues.

A first issue is that fbids_in_req was previously populated
drm_can_avoid_composite and read from in page_flip_handler. As a
result, calling drm_can_avoid_composite then page_flip_handler would
prevent drm_atomic_commit from referencing the right FBs
(page_flip_handler runs in a separate thread and clears fbids_in_req).

To fix this, add a new fbids_queued vector filled by drm_atomic_commit.
Make page_flip_handler read from this new vector instead of
fbids_in_req. As a bonus, this fixes a data race since fbids_queued is
now protected by flip_lock.

The second issue is that drm_can_avoid_composite assumes all layers made
it into a hw plane when liftoff_output_apply succeeds. That's not the
case because libliftoff supports mixed hw plane + composition (where
some layers make it into a hw plane and the others get composited).

To fix this, make drm_can_avoid_composite fail if some but not all
layers make it into a hw plane. In the future, we'll want to support the
mixed mode too.

Closes: https://github.com/Plagman/gamescope/issues/65
References: https://github.com/Plagman/gamescope/issues/41
2020-05-26 16:29:50 +02:00
Simon Ser
bcc7cf3b55
Fix memory leak in drm_can_avoid_composite
We were creating a new DRM blob each page-flip and never destroying it.
Instead, create the mode blob once on startup.
2020-05-26 10:57:57 +02:00
Simon Ser
9353ba11d3
Add error handling when no physical device is found
References: https://github.com/Plagman/gamescope/issues/49
2020-05-22 12:47:57 +02:00
Simon Ser
a69017d08d Use upstream wlr_xwayland_server
Use wlr_xwayland_server, which allows enough customization for us.

References: https://github.com/swaywm/wlroots/pull/2175
Closes: https://github.com/Plagman/gamescope/issues/15
2020-05-19 22:21:45 +02:00
Simon Ser
2062141c49
Introduce drm_free_fb
This function takes care of calling drmModeRmFB. In the future it'll
also take care of releasing the client buffer when using direct
scan-out.
2020-05-19 14:25:59 +02:00
Simon Ser
0ee8d451e4
Replace map_fbid_inflightflips pair with a struct
This makes it explicit what "first" and "second" are. This also allows
to add more fields.
2020-05-19 14:05:52 +02:00
Simon Ser
02b233429f
Add error handling to drm_fbid_from_dmabuf 2020-05-19 10:52:51 +02:00
Simon Ser
d70df758a8
Remove dead code in xwayland_surface_role_commit
The FDs are guaranteed to be set if wlr_texture_to_dmabuf doesn't return
an error.
2020-05-15 15:26:48 +02:00
Simon Ser
48b429e7b1
Add n_planes == 1 assert in drm_fbid_from_dmabuf
This code assumes a single planes. Let's add a safe-guard so that we
don't forget this function when adding support for multiple planes.
2020-05-15 15:26:47 +02:00
Simon Ser
b305b7f123
Dup FD in CVulkanTexture::BInit
This saves us the wlr_dmabuf_attributes juggle and makes it easier to
understand the FDs ownership and lifetime.
2020-05-15 15:26:47 +02:00
Simon Ser
db876af1c4
Use wlr_dmabuf_attributes_finish instead of close
This ensures we don't leak any FD.
2020-05-15 14:48:07 +02:00
Pierre-Loup A. Griffais
09bc171666 Revert "steamcompmgr: attempt to get rid of damage_sequence"
This reverts commit de16a27674.
2020-05-13 13:52:02 -07:00
Simon Ser
c0bdf361d5
Don't set WAYLAND_DISPLAY
We don't actually support Wayland clients (yet). Xwayland doesn't use
WAYLAND_DISPLAY, the compositor creates a special Wayland socket instead.
2020-05-12 15:55:01 +02:00
Simon Ser
1e82803574
Improve initOutput error handling
Bail out on DRM error.
2020-05-12 15:07:52 +02:00
Simon Ser
dced8a88da
Switch VT on Ctrl+Alt+F<n>
Only works when switching to fbcon for now. We need to stop
page-flipping when the DRM FD is paused to support switching to another
compositor.

References: https://github.com/Plagman/gamescope/issues/6
2020-05-12 11:19:21 +02:00
Simon Ser
16d74b8e15
Fix segfault when system doesn't support Vulkan 2020-05-12 10:14:57 +02:00
Simon Ser
c147de2134 Fix alloc-dealloc-mismatch for win objects
win objects are allocated with `new`, so they need to be de-allocated
with `delete` instead of `free`.

    ==589398==ERROR: AddressSanitizer: alloc-dealloc-mismatch (operator new vs free) on 0x61200017f140
    (EE) failed to read Wayland events: Broken pipe
    X connection to :1 broken (explicit kill or server shutdown).
        #0 0x7f5468ae4720 in __interceptor_free /build/gcc/src/gcc/libsanitizer/asan/asan_malloc_linux.cc:122
        #1 0x559820f5c9a0 in finish_destroy_win ../src/steamcompmgr.cpp:1743
        #2 0x559820f5ca6d in destroy_win ../src/steamcompmgr.cpp:1759
        #3 0x559820f6163e in steamcompmgr_main ../src/steamcompmgr.cpp:2288
        #4 0x559820f8e977 in steamCompMgrThreadRun() ../src/main.cpp:121
        #5 0x559820f8e3e9 in void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/9.3.0/bits/invoke.h:60
        #6 0x559820f8e24f in std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/9.3.0/bits/invoke.h:95
        #7 0x559820f8e0b3 in void std:🧵:_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/9.3.0/thread:244
        #8 0x559820f8dfae in std:🧵:_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/9.3.0/thread:251
        #9 0x559820f8d7ba in std:🧵:_State_impl<std:🧵:_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/9.3.0/thread:195
        #10 0x7f5468006b23 in execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80
        #11 0x7f546745346e in start_thread (/usr/lib/libpthread.so.0+0x946e)
        #12 0x7f54673833d2 in clone (/usr/lib/libc.so.6+0xff3d2)

    0x61200017f140 is located 0 bytes inside of 296-byte region [0x61200017f140,0x61200017f268)
    allocated by thread T40 here:
        #0 0x7f5468ae6968 in operator new(unsigned long) /build/gcc/src/gcc/libsanitizer/asan/asan_new_delete.cc:104
        #1 0x559820f595fe in add_win ../src/steamcompmgr.cpp:1548
        #2 0x559820f614e8 in steamcompmgr_main ../src/steamcompmgr.cpp:2278
        #3 0x559820f8e977 in steamCompMgrThreadRun() ../src/main.cpp:121
        #4 0x559820f8e3e9 in void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) /usr/include/c++/9.3.0/bits/invoke.h:60
        #5 0x559820f8e24f in std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) /usr/include/c++/9.3.0/bits/invoke.h:95
        #6 0x559820f8e0b3 in void std:🧵:_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/include/c++/9.3.0/thread:244
        #7 0x559820f8dfae in std:🧵:_Invoker<std::tuple<void (*)()> >::operator()() /usr/include/c++/9.3.0/thread:251
        #8 0x559820f8d7ba in std:🧵:_State_impl<std:🧵:_Invoker<std::tuple<void (*)()> > >::_M_run() /usr/include/c++/9.3.0/thread:195
        #9 0x7f5468006b23 in execute_native_thread_routine /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:80

    Thread T40 created by T0 here:
        #0 0x7f5468a0e377 in __interceptor_pthread_create /build/gcc/src/gcc/libsanitizer/asan/asan_interceptors.cc:208
        #1 0x7f5468006df9 in __gthread_create /build/gcc/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu/bits/gthr-default.h:663
        #2 0x7f5468006df9 in std:🧵:_M_start_thread(std::unique_ptr<std:🧵:_State, std::default_delete<std:🧵:_State> >, void (*)()) /build/gcc/src/gcc/libstdc++-v3/src/c++11/thread.cc:135
        #3 0x559820f8ea10 in startSteamCompMgr ../src/main.cpp:126
        #4 0x559820f95cfb in xwayland_ready ../src/wlserver.c:119
        #5 0x5598210de191 in wlr_signal_emit_safe ../subprojects/wlroots/util/signal.c:29
        #6 0x559820ff596b in xserver_handle_ready ../subprojects/wlroots/xwayland/xwayland.c:251
        #7 0x7f5468744434  (/usr/lib/libwayland-server.so.0+0xa434)
        #8 0x7ffc9796869f  ([stack]+0x1f69f)
2020-05-08 22:12:13 +02:00
Simon Ser
7733ffb769 Fix crash on touch up 2020-05-08 22:11:38 +02:00
Pierre-Loup A. Griffais
de16a27674 steamcompmgr: attempt to get rid of damage_sequence
It probably won't be as simple as that, but we'll see...
2020-04-06 18:28:54 -07:00
Pierre-Loup A. Griffais
37d30471af steamcompmgr: Add support for obeying transient windows. 2020-04-06 17:05:43 -07:00
Pierre-Loup A. Griffais
db062a47cd steamcompmgr: fixed unsigned math in screen magnifier
Offsets would wrap around and go nuts past the center, only top-left would
work.
2020-04-06 12:55:13 -07:00
Pierre-Loup A. Griffais
29eaa16785 wlserver: greatly simplify touch handling
Remove drag stickiness, delay before click, etc.

Also let the session specify which button is pressed on touch, if any.
2020-04-01 19:13:58 -07:00
Roman Gilg
f416279a1c Revert "feat: use global pointer position variable"
This reverts commit 0f8d679994.
2020-04-01 22:42:15 +02:00
Roman Gilg
5868f20502 Revert "feat: add relative pointer and constraints support"
This reverts commit a4fa525255.
2020-04-01 22:42:09 +02:00
Roman Gilg
b23b5b7189 Revert "refactor: unify pointer movement"
This reverts commit d4361f4649.
2020-04-01 22:41:58 +02:00
Roman Gilg
c2058733e3 Revert "refactor: remove unneeded cursor query functions"
This reverts commit 9547ec9a15.
2020-04-01 22:41:50 +02:00
Roman Gilg
4565766cc5 Revert "refactor: remove unneeded cursor calls on paint"
This reverts commit be1ff3d903.
2020-04-01 22:41:40 +02:00
Roman Gilg
42a268bd27 refactor: clean up layers properties loop
Restructure the loop a bit to have less code repetition and make it easier to
understand.
2020-03-10 02:02:40 +01:00
Roman Gilg
8833e07618 feat: add layer debugging via libliftoff log
Activate libliftoff's internal log when layers are enabled and the parameter
'd' is provided.

Note: this needs some patches to libliftoff to make the debug readable that I
have proposed upstream.
2020-03-10 02:02:40 +01:00
Roman Gilg
d17f234738 fix: continue layering when fbs available
Trying to layer onto planes should be continued when fb ids are set and
not the other way around. Here the assert also failed when only having
one layer.
2020-03-10 02:02:40 +01:00
Roman Gilg
be1ff3d903 refactor: remove unneeded cursor calls on paint
It is enough to get the global cursor location when repainting it. So we do not
need to query the relative position. If later on we find this is not right we
should be still able to get the relative position from the surface position
instead of calling into XWayland.

Also it is not expected and apparently unnecessary to move the cursor in the
paint function. Therefore remove this call too.
2020-03-10 01:55:58 +01:00
Roman Gilg
9547ec9a15 refactor: remove unneeded cursor query functions
With cursor position going through global variables we do not need to query the
global position anymore. Remove the MouseCursor function for that.

Furtheron the relative position getter is also not necessary, but let's remove
this one in a separate commit.

This commit also adds a debug line for debugging flaky focus changing.
2020-03-10 01:55:58 +01:00
Roman Gilg
d4361f4649 refactor: unify pointer movement
In nested mode we can use the same code path as in drm mode now.
2020-03-10 01:55:58 +01:00
Roman Gilg
a4fa525255 feat: add relative pointer and constraints support
For now only available on drm backend. For nested there is currently a
different workaround active making it work.

Closes #19
2020-03-10 01:55:58 +01:00
Roman Gilg
0f8d679994 feat: use global pointer position variable
Instead of going through the X11 connection just set the pointer position
directly via global variable.
2020-03-10 01:55:58 +01:00
Roman Gilg
f7d815a203 refactor: add cursor class
Puts all cursor relevant code into a single class. Preparation for getting
cursor movement directly through libinput.
2020-03-10 01:55:58 +01:00
Roman Gilg
920fe8bd8f style: remove trailing whitespace
Many code editiors remove trailing whitespace automatically making patches
difficult since often unrelated lines get changed with the same commit.

So remove the whitespace in the steamcompmgr file all at once in this separate
commit.
2020-03-10 01:55:58 +01:00
Oschowa
2a74683c11 Use build in glslangValidator functionally to generate shader include
file.
This removes the xxd dependency.
2020-01-28 21:30:20 +01:00
Pierre-Loup A. Griffais
bc39b20a8f steamcompmgr: fix rare crash when starting games (DOOM in this case). 2020-01-27 23:18:34 -08:00
Pierre-Loup A. Griffais
1bcd0bd930 Vulkan: fix a nasty race.
We could garbage-collect fences before/during their wait.
2020-01-27 22:46:38 -08:00
Pierre-Loup A. Griffais
578849e429 Vulkan: fix validation errors. 2020-01-27 22:32:16 -08:00
Pierre-Loup A. Griffais
06db3d903a steamcompmgr: close commit fd if no matching window.
That was probably a leak on app exit before?
2020-01-27 21:24:10 -08:00
Pierre-Loup A. Griffais
7e4b1d971c steamcompmgr: cleanup check_new_wayland_res.
Now that we can process everything in the queue, we can make the flow
a bit simpler.
2020-01-27 21:08:47 -08:00
Pierre-Loup A. Griffais
7df0b8655a steamcompmgr: add detail to fence debugging. 2020-01-28 04:10:58 +00:00
Pierre-Loup A. Griffais
e72724f050 embedded: fix a crash on startup in Portal.
Trying to push a new frame with no valid contents would send an
uninitialized texture handle to the Vulkan renderer.
2020-01-27 22:21:12 +00:00
Pierre-Loup A. Griffais
2b111b43dd SDL: initialize after wayland.
Otherwise the input thread can start doing wayland stuff before it's safe.
2020-01-26 17:51:27 -08:00
Pierre-Loup A. Griffais
b4893840eb vblank: more tweaks, align to DRM vblank. 2020-01-26 16:28:35 -08:00
Pierre-Loup A. Griffais
4ca73da9f6 vblankmanager: initial system to let steamcompmgr know when to repaint
For now just mark one repaint per refresh interval without any particular
alignment, as that can be hard to get in nested. We'll use the display
timing extensions for that later.

We'll have it align properly in embedded mode soon.
2020-01-26 14:59:51 -08:00
Pierre-Loup A. Griffais
5e3a9c9408 Vulkan: have a whole bunch more scratch command buffer slots
If running non-vsynced apps, we might need to keep track of 500+ in-flight
commits. Maybe make dynamic at some point?
2020-01-26 13:36:30 -08:00
Pierre-Loup A. Griffais
ca954bb237 steamcompmgr: rework how commits are handled
Keep track of a queue of commits and use the wait thread to get notified
when they're done.

Only repaint when new commits are done, not just queued.
2020-01-26 13:25:28 -08:00
Pierre-Loup A. Griffais
4f01be3bf5 Vulkan: shouldn't need to have synchronous uploads anymore. 2020-01-25 20:34:03 -08:00
Pierre-Loup A. Griffais
dfba164987 Vulkan: Remove one TODO by implementing deferred free for textures. 2020-01-25 20:31:19 -08:00
Pierre-Loup A. Griffais
9a177050e5 Vulkan: fix everything using the same command buffer.
We can't quite get away with it now that we want to kick off several
waits at the same time.
2020-01-25 19:51:11 -08:00
Pierre-Loup A. Griffais
982e61e28d steamcompmgr: add support for spewing stats into a pipe 2020-01-24 01:47:26 +00:00
Pierre-Loup A. Griffais
dde441b13f steamcompmgr: tweak focus logic to know about Steam pop-up windows
Like the standalone input configurator view.
2020-01-24 00:45:24 +00:00
Pierre-Loup A. Griffais
4079d0c785 steamcompmgr: rework a couple of things to plan for decoupling paints
- Add a commit wait thread that just waits for the work associated with
   an in-bound dma-buff is done. We'd like to be getting a fence directly
   from Wayland, but in the absence of that we'll make our own by tapping
   into implicit-sync, DX11-style. gpuvis logging of the outcome of the
   waits in the thread are consistent with the end of GPU work.

 - Rework wayland commit handoff between wlserver and steamcompmgr to let
   steamcompmgr have full access to the commit queue, letting it remove
   elements in the middle and still keep going, compared to the previous
   interface. This lets steamcompmgr get one commit per window per loop,
   for now. We should be able to kick off waits and ref/unref resources
   for all pending commits soon, with some work on the accounting first.

This should also fix an issue introduced recently where the overlay
could get really starved in embedded mode, as we were just getting
the first commit in the queue for a single frame.
2020-01-23 00:52:17 -08:00
Pierre-Loup A. Griffais
cf16f59e84 steamcompmgr: exit when subcommand exits, if there is one 2020-01-22 22:34:38 -08:00
Pierre-Loup A. Griffais
1830b53c2e steamcompmgr.cpp: rise 2020-01-22 21:50:01 -08:00
Pierre-Loup A. Griffais
74143121cd Fix instant crash on embedded from recent nested resize work. 2020-01-20 23:47:55 +00:00
Pierre-Loup A. Griffais
6183a70564 nested: toggle filter with meta+n 2020-01-20 02:04:57 -08:00
Pierre-Loup A. Griffais
4dcacf3cc1 steamcompmgr: make cursor scaling more current, remove some cruft. 2020-01-20 01:58:39 -08:00
Pierre-Loup A. Griffais
d6ff686b64 nested: make Meta+f toggle fullscreen for the output window. 2020-01-20 01:45:43 -08:00
Pierre-Loup A. Griffais
188ea49e51 nested: let the output surface be resizeable
And let the SDL window be resizeable too.
2020-01-20 01:32:54 -08:00
Pierre-Loup A. Griffais
228c5e049c We needed our threads to block SIGUSR1, not ignore it.
It's a requirement of wlroots, since it uses it to get notified of
Xwayland readiness.

Having our threads use SIG_IGN would mean that they could still get
selected to get the signal and would just discard it, as opposed to
not being in the running at all. So the more threads we added, the
least chance we had of the notify function running consistently at
startup.

Now seems to consistently agree that XWayland is up every startup.
2020-01-18 21:08:37 -08:00
Pierre-Loup A. Griffais
3ca59feabd inputsdl: grab cursor when focused, send mouse input through X.
This more or less makes everything pretty playable.
2020-01-18 20:37:11 -08:00
Pierre-Loup A. Griffais
946b49c7a6 steamcompmgr: fix bug from 2013 with cursor hiding.
We don't want to unhide the cursor in the small period of time where we
don't have a foxued window.
2020-01-18 18:12:39 -08:00
Pierre-Loup A. Griffais
6481e1d777 rendervulkan: offset rendering a bit to avoid blurry text.
This isn't a perfect fix, see comment.
2020-01-18 17:35:23 -08:00
Pierre-Loup A. Griffais
303c702547 rendervulkan: it's 2020, surely GPUs understand integers by now?! 2020-01-18 17:24:56 -08:00
Pierre-Loup A. Griffais
7b2220003c Let it take a command to run in its DISPLAY after "--". 2020-01-18 17:14:49 -08:00
Pierre-Loup A. Griffais
90fa0770e8 nested: plumb some more output options.
Output window size, scaling filter, border.

TODO: make output dynamically resizeable, and some settings reloadable.
2020-01-18 16:05:19 -08:00
Pierre-Loup A. Griffais
19e2e511b6 sdlinput: nested keyboard support. 2020-01-18 15:10:14 -08:00
Pierre-Loup A. Griffais
b306714f3c drm: always set DRM_MODE_ATOMIC_ALLOW_MODESET for now.
That seems to make DC happier when we change the src and dst rects.
2020-01-18 03:40:51 +00:00
Pierre-Loup A. Griffais
bb52b60301 wlserver: some more basic tweaks for touch logic.
Add primitive hold-n-drag.
2020-01-17 03:27:55 -08:00
Pierre-Loup A. Griffais
3f51eb4d25 steamcompmgr: fix a bug where the cursor would only unhide if clicked
Ideally we'd get actual MotionNotify and redraw if needed, but probably
grabbed in this case. This was Shadowverse.
2020-01-17 02:45:43 -08:00
Pierre-Loup A. Griffais
56b2aa2d92 wlserver: wire kb+mouse+touch input coming from wlr, mainly libinput.
Add the concept of a cursor coordinate when that initializes when focusing
a surface.

Put some super primitive tap to left-click emulation in there for now.
2020-01-17 02:36:53 -08:00
Pierre-Loup A. Griffais
3eacb24d01 steamcompmgr: fix launchers/etc not displaying at first.
If a window already has a buffer attached by the time we figure out it
exists and sets its role, we missed the initial commit and will never
get it. For windows that animate interactively, that's fine, as we'll
get another one soon enough, but 2D apps like launchers repaint on
demand, so it's not fine there.
2020-01-17 00:45:21 +00:00
Pierre-Loup A. Griffais
bb945da160 steamcompmgr: Remove skipping all frames if no main plane.
If the base game is stuck before having rendered anything, we still want
to show overlay layers when they animate so the user can get out.

Let us composite and the empty texture should take care of it.
2020-01-15 22:58:22 -08:00
Pierre-Loup A. Griffais
dd6d0d5ad8 drm: drmModeAtomicCommit can return -ENOSPC, make non-fatal.
It's non-fatal, presumably we messed up source coordinates for that flip
but needs root-causing. Can happen in the very early loading of MGSV:TPP.

Fix a bug with the new flip lock where non-fatal flip errors would hang.
2020-01-15 18:31:05 -08:00
Pierre-Loup A. Griffais
c0a793e290 wlserver: handle EINTR in the main loop epoll.
Fixes the server going away when we need it most, or when attaching GDB.
2020-01-15 17:48:20 -08:00
Pierre-Loup A. Griffais
1b0f273f21 steamcompmgr: flush output to startup pipe with a newline. 2020-01-15 15:38:21 -08:00
Pierre-Loup A. Griffais
bdbdabe19b steamcompmgr: add option to send DISPLAY back to invoker.
So the session script can read it back and know when gamescope is ready.
2020-01-14 23:51:22 -08:00
Pierre-Loup A. Griffais
e1c4298d2a Rename project and executable to gamescope.
We're a superset of steamcompmgr now, but have a wider scope, so new
name to reflect it.
2020-01-14 17:35:36 -08:00
Pierre-Loup A. Griffais
83ccb4d74d composite.hlsl: This seems a bit faster on Raven? 2020-01-13 22:42:12 -08:00
Pierre-Loup A. Griffais
901103af3f wlserver: anti-fd exhaustion measures.
If we only take the first commit, we leave a bunch in the queue, which
makes us that much more likely to run out of FDs when importing the
myriad of buffer referenced coming from a non-vsynced client. Fixes
crashes with vblank_mode=0 glxgears after the recent changes.

We were always subject to such crashes, just getting lucky/fast before.
2020-01-13 22:09:55 -08:00
Pierre-Loup A. Griffais
fb49601138 steamcompmgr: use next wayland buffer.
Not last. Prevents non-vsynced clients from getting too far ahead.
2020-01-13 21:14:02 -08:00
Pierre-Loup A. Griffais
94ecdfdc6e drm: more logging. 2020-01-13 20:57:39 -08:00
Pierre-Loup A. Griffais
1a1fa8629f drm: workaround for flip failures launching The Witcher 3.
Tries to flip a 1x1 surface, apparently amdgpu doesn't like it

In a liftoff future it would surely detect that and let us know.
2020-01-13 20:19:17 -08:00
Pierre-Loup A. Griffais
8827ea367e drm: re-add non-liftoff path, with logging. 2020-01-13 20:18:28 -08:00
Pierre-Loup A. Griffais
3a17f3eed7 steamcompmgr: small fixes to not fix damage until we really painted. 2020-01-13 18:53:29 -08:00
Pierre-Loup A. Griffais
e637bdad10 steamcompmgr: gpuvis frame cadence debugging.
Now that things are generally more stable, let's take a look.
2020-01-13 18:45:53 -08:00
Pierre-Loup A. Griffais
c77df96523 rendervulkan: always write all layers in the descriptor.
Use an empty dummy texture for unbound slots, as the driver can't know
what the shader will sample from.

Also remove any sort of implicit attempts at compaction of slots.
2020-01-09 02:34:54 +00:00
Pierre-Loup A. Griffais
807b24f731 steamcompmgr: Added a debug option to always composite.
This way we never flip anything but our own buffers, to facilitate bug
isolation.
2020-01-08 02:40:14 +00:00
Pierre-Loup A. Griffais
6efedbb587 DRM: Protect ourselves against a race condition in flip accounting.
The flip handler could try to deref before we had added the refs.
2020-01-08 01:38:36 +00:00
Pierre-Loup A. Griffais
2092afd078 steamcompmgr: we weren't hiding the Steam window anymore.
Also fix the mouse focus edge condition to actually be correct.
2020-01-07 23:39:24 +00:00
Pierre-Loup A. Griffais
5598fcfa57 steamcompmgr: Handle early WL_SURFACE_ID notification.
Untested for now as it only happens when we lose a race, leaving a
printout to confirm if it worked in the wild later.
2020-01-07 19:50:34 +00:00
Pierre-Loup A. Griffais
94c4c05e40 Reconcile new cursor DRM code and nested path. 2020-01-06 20:16:27 -08:00
Pierre-Loup A. Griffais
4d6602ba4b DRM: Make liftoff layers conditional for now.
Can't get them to be useful, might need library and amdgpu DC fixes.
2020-01-06 19:36:20 -08:00
Pierre-Loup A. Griffais
6b3e2ddf68 DRM: multi-plane support via libliftoff.
Import libliftoff as subproject and plumb our planes through it.

Wait for a flip to complete immediately after queuing it for now.

Also immediately wait for cursor image uploads, as we don't have to
do Vulkan rendering anymore after queuing an upload.

Cursor shows up with format hack, but is badly corrupt. We might need
to use a DRM dumb_fb rather than going through the same Vulkan image.

Alpha bits of surfaces are ignored again, need to make Steam select
an ARGB visual for overlay windows, probably.

Setting up the "alpha" plane property somehow makes overlays not
show up at all despite liftoff happily letting us go with scanout.
2020-01-05 22:19:04 -08:00
Pierre-Loup A. Griffais
a8d96fb227 steamcompmgr: let's go with -e instead, for embedded.
As opposed to nested.
2020-01-05 22:19:03 -08:00
Pierre-Loup A. Griffais
d5e90511d5 rendervulkan: Fix corruption at the bottom of the compute path.
Thread group size doesn't have to be aligned with image dimensions, as
is the case with 16x16 on a 1920x1080 output.
2020-01-05 19:01:44 -08:00
Pierre-Loup A. Griffais
0565c32a55 steamcompmgr: Don't composite the cursor when it's empty. 2020-01-05 18:10:15 -08:00
Pierre-Loup A. Griffais
c4321e54b2 rendervulkan: Some attempted fixes, in vain.
Only set implicit_sync on in-bound buffers, we'll sync our scanout image
ourselves by exporting the fence and passing to DRM, and flushing.

The fence export actually fails, so leave it commented our for now.

Flushing also doesn't do anything, the bottom of our scanout image is still
corrupt when scanning out to DRM.
2020-01-05 17:56:59 -08:00
Pierre-Loup A. Griffais
db94055511 Fix DRM output, initializing SDL apparently breaks it.
We don't want SDL input in the non-nested case at any rate.
2020-01-05 04:45:45 -08:00
Pierre-Loup A. Griffais
83683d270c steamcompmgr: Add command-line argument for relying on Steam GameIDs.
So we can easily test single-app scenarios by generating placeholder
ones. Will also make it more robust by using Xres1.2, which should
remove the need for Alkazar's patch for Dead Cells and other apps that
don't get tagged right by the current overlay.
2020-01-04 19:37:04 -08:00
Pierre-Loup A. Griffais
97aac0bbf9 Add some code to detect if the cursor becomes fully hidden.
That should come in handy for auto-grabbing in the nested case.
2020-01-04 19:19:54 -08:00
Pierre-Loup A. Griffais
8a8eea1df3 Don't like this 2013 cursor rescaling logic anymore.
It worked well enough with the Big Picture cursor, and seeing it change
scales between Steam and a game was sometimes jarring, but it doesn't
compute hotspot offset right, and scaling cursors doesn't come out great
a lot of the time.
2020-01-02 19:43:10 -08:00
Pierre-Loup A. Griffais
d357278b98 Add SDL input handling in the nested case, plumb basic mouse stuff.
Relative mouse broken right now.
2020-01-02 19:26:53 -08:00
Roman Gilg
b11f46d4e7 fix: handle terminate better 2020-01-02 00:00:34 +01:00
Pierre-Loup A. Griffais
81e5e1b2f8 steamcompmgr: re-add cursor painting.
We're in sole control of the cursor now, there's no "fake" cursor anymore.

Don't attempt to hide it in X, it doesn't matter.

Also Vulkan rendering of a texture populated from arbitrary bits.

Also add the third layer to the shader... Badly needs clean-up.
2020-01-01 23:36:58 +09:00
Pierre-Loup A. Griffais
898e653c39 rendervulkan: Use FIFO present mode for now in the nested case.
That's a good enough proxy for a real vblank cadence and helps my Envy
not catch on fire.
2020-01-01 15:30:38 +09:00
Pierre-Loup A. Griffais
010ba40691 wlserver: Flush clients on any unlock.
This should make steamcompmgr messages actually go when we send them.

We're pulling too many frames out of "vsynced" clients now, need to instill
a real frame cadence based on vblank and notify based on that.
2020-01-01 15:30:38 +09:00
Pierre-Loup A. Griffais
c70e71d1e2 I think I've come to terms with not building wlr stuff as C++.
Might as well clean up some of the initial madness.
2020-01-01 15:30:38 +09:00
Pierre-Loup A. Griffais
7bf4d963b4 x11: With great power comes great responsibility, I guess.
The WL_SURFACE_ID messages force us to register SubstructureRedirectMask,
which means we have to participate in a bunch more stuff before windows
will resize and reconfigure properly. This fixes a bunch of problems with
real games.
2020-01-01 15:30:38 +09:00
Pierre-Loup A. Griffais
56c1fd217e wlserver: I think that worked, now make it not destroy a core. 2020-01-01 15:30:38 +09:00
Pierre-Loup A. Griffais
24c10095e5 wlserver: Add naive locking to try to see if that fixes hangs for good.
Change the wl event loop to busy-wait for now as that's easiest to make
unlock periodically.
2020-01-01 15:30:38 +09:00