diff --git a/layer/VkLayer_FROG_gamescope_wsi.cpp b/layer/VkLayer_FROG_gamescope_wsi.cpp
index c817880f18..3069fc851d 100644
--- a/layer/VkLayer_FROG_gamescope_wsi.cpp
+++ b/layer/VkLayer_FROG_gamescope_wsi.cpp
@@ -302,6 +302,7 @@ namespace GamescopeWSILayer {
struct GamescopeInstanceData {
wl_display* display;
uint32_t appId = 0;
+ std::string engineName;
GamescopeLayerClient::Flags flags = 0;
};
VKROOTS_DEFINE_SYNCHRONIZED_MAP_TYPE(GamescopeInstance, VkInstance);
@@ -524,9 +525,14 @@ namespace GamescopeWSILayer {
{
uint32_t appId = clientAppId();
+ std::string engineName;
+ if (pCreateInfo->pApplicationInfo && pCreateInfo->pApplicationInfo->pEngineName)
+ engineName = pCreateInfo->pApplicationInfo->pEngineName;
+
auto state = GamescopeInstance::create(*pInstance, GamescopeInstanceData {
.display = display,
.appId = appId,
+ .engineName = engineName,
.flags = defaultLayerClientFlags(pCreateInfo->pApplicationInfo, appId),
});
@@ -1211,7 +1217,8 @@ namespace GamescopeWSILayer {
uint32_t(pCreateInfo->imageColorSpace),
uint32_t(pCreateInfo->compositeAlpha),
uint32_t(pCreateInfo->preTransform),
- uint32_t(pCreateInfo->clipped));
+ uint32_t(pCreateInfo->clipped),
+ gamescopeInstance->engineName.c_str());
return VK_SUCCESS;
}
diff --git a/protocol/gamescope-swapchain.xml b/protocol/gamescope-swapchain.xml
index 91be3fc02d..58ac8463b7 100644
--- a/protocol/gamescope-swapchain.xml
+++ b/protocol/gamescope-swapchain.xml
@@ -89,6 +89,7 @@
+
diff --git a/src/WaylandServer/WaylandServerLegacy.h b/src/WaylandServer/WaylandServerLegacy.h
index 0facb7dc8b..63ee2ca17e 100644
--- a/src/WaylandServer/WaylandServerLegacy.h
+++ b/src/WaylandServer/WaylandServerLegacy.h
@@ -29,6 +29,7 @@ struct wlserver_vk_swapchain_feedback
VkCompositeAlphaFlagBitsKHR vk_composite_alpha;
VkSurfaceTransformFlagBitsKHR vk_pre_transform;
VkBool32 vk_clipped;
+ std::shared_ptr vk_engine_name;
std::shared_ptr hdr_metadata_blob;
};
diff --git a/src/mangoapp.cpp b/src/mangoapp.cpp
index 91e01bc275..d8e1ce7eda 100644
--- a/src/mangoapp.cpp
+++ b/src/mangoapp.cpp
@@ -31,6 +31,7 @@ struct mangoapp_msg_v1 {
uint16_t displayRefresh;
bool bAppWantsHDR : 1;
bool bSteamFocused : 1;
+ char engineName[40];
// WARNING: Always ADD fields, never remove or repurpose fields
} __attribute__((packed)) mangoapp_msg_v1;
@@ -60,6 +61,11 @@ void mangoapp_update( uint64_t visible_frametime, uint64_t app_frametime_ns, uin
mangoapp_msg_v1.displayRefresh = (uint16_t) gamescope::ConvertmHzToHz( g_nOutputRefresh );
mangoapp_msg_v1.bAppWantsHDR = g_bAppWantsHDRCached;
mangoapp_msg_v1.bSteamFocused = g_focusedBaseAppId == 769;
+ memset(mangoapp_msg_v1.engineName, 0, sizeof(mangoapp_msg_v1.engineName));
+ if (focusWindow_engine)
+ focusWindow_engine->copy(mangoapp_msg_v1.engineName, sizeof(mangoapp_msg_v1.engineName) / sizeof(char));
+ else
+ std::string("gamescope").copy(mangoapp_msg_v1.engineName, sizeof(mangoapp_msg_v1.engineName) / sizeof(char));
msgsnd(msgid, &mangoapp_msg_v1, sizeof(mangoapp_msg_v1) - sizeof(mangoapp_msg_v1.hdr.msg_type), IPC_NOWAIT);
}
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index 11a7cade6c..a04e10bcad 100644
--- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp
@@ -882,6 +882,7 @@ int g_BlurRadius = 5;
unsigned int g_BlurFadeStartTime = 0;
pid_t focusWindow_pid;
+std::shared_ptr focusWindow_engine = nullptr;
focus_t g_steamcompmgr_xdg_focus;
std::vector> g_steamcompmgr_xdg_wins;
@@ -6033,6 +6034,9 @@ bool handle_done_commit( steamcompmgr_win_t *w, xwayland_ctx_t *ctx, uint64_t co
uint32_t j;
for ( j = 0; j < w->commit_queue.size(); j++ )
{
+ if (w->commit_queue[ j ]->feedback.has_value())
+ w->engineName = w->commit_queue[ j ]->feedback->vk_engine_name;
+
if ( w->commit_queue[ j ]->commitID == commitID )
{
gpuvis_trace_printf( "commit %lu done", w->commit_queue[ j ]->commitID );
@@ -6072,6 +6076,7 @@ bool handle_done_commit( steamcompmgr_win_t *w, xwayland_ctx_t *ctx, uint64_t co
if ( !cv_paint_debug_pause_base_plane )
g_HeldCommits[ HELD_COMMIT_BASE ] = w->commit_queue[ j ];
hasRepaint = true;
+ focusWindow_engine = w->engineName;
}
if ( w == global_focus.overrideWindow )
diff --git a/src/steamcompmgr.hpp b/src/steamcompmgr.hpp
index 9f384c461c..ae15252ccd 100644
--- a/src/steamcompmgr.hpp
+++ b/src/steamcompmgr.hpp
@@ -144,6 +144,7 @@ struct wlserver_x11_surface_info *lookup_x11_surface_info_from_xid( gamescope_xw
extern gamescope::VBlankTime g_SteamCompMgrVBlankTime;
extern pid_t focusWindow_pid;
+extern std::shared_ptr focusWindow_engine;
void init_xwayland_ctx(uint32_t serverId, gamescope_xwayland_server_t *xwayland_server);
void gamescope_set_selection(std::string contents, GamescopeSelection eSelection);
diff --git a/src/steamcompmgr_shared.hpp b/src/steamcompmgr_shared.hpp
index 095694e493..4f70080b25 100644
--- a/src/steamcompmgr_shared.hpp
+++ b/src/steamcompmgr_shared.hpp
@@ -140,6 +140,8 @@ struct steamcompmgr_win_t {
bool unlockedForFrameCallback = false;
bool receivedDoneCommit = false;
+ std::shared_ptr engineName;
+
std::vector< gamescope::Rc > commit_queue;
std::shared_ptr> icon;
diff --git a/src/wlserver.cpp b/src/wlserver.cpp
index 78a86ee0e2..e59cc8ffae 100644
--- a/src/wlserver.cpp
+++ b/src/wlserver.cpp
@@ -840,7 +840,8 @@ static void gamescope_swapchain_swapchain_feedback( struct wl_client *client, st
uint32_t vk_colorspace,
uint32_t vk_composite_alpha,
uint32_t vk_pre_transform,
- uint32_t vk_clipped)
+ uint32_t vk_clipped,
+ const char *vk_engine_name)
{
wlserver_wl_surface_info *wl_info = (wlserver_wl_surface_info *)wl_resource_get_user_data( resource );
if ( wl_info )
@@ -852,6 +853,7 @@ static void gamescope_swapchain_swapchain_feedback( struct wl_client *client, st
.vk_composite_alpha = VkCompositeAlphaFlagBitsKHR(vk_composite_alpha),
.vk_pre_transform = VkSurfaceTransformFlagBitsKHR(vk_pre_transform),
.vk_clipped = VkBool32(vk_clipped),
+ .vk_engine_name = std::make_shared(vk_engine_name),
.hdr_metadata_blob = nullptr,
});
}