diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index dfc760e..0680f80 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -1972,6 +1972,33 @@ void vulkan_free_texture( VulkanTexture_t vulkanTex ) } } +int32_t vulkan_ref_commit( VulkanTexture_t vulkanTex ) +{ + if ( vulkanTex == 0 ) + return 0; + + CVulkanTexture *pTex = getVulkanTexture( vulkanTex ); + + assert( pTex != nullptr ); + assert( pTex->handle == vulkanTex ); + + return ++pTex->nCommitRefCount; +} + +int32_t vulkan_free_commit( VulkanTexture_t vulkanTex ) +{ + if ( vulkanTex == 0 ) + return 0; + + CVulkanTexture *pTex = getVulkanTexture( vulkanTex ); + + assert( pTex != nullptr ); + assert( pTex->handle == vulkanTex ); + + int32_t refs = --pTex->nCommitRefCount; + return refs; +} + bool operator==(const struct VulkanPipeline_t::LayerBinding_t& lhs, struct VulkanPipeline_t::LayerBinding_t& rhs) { if ( lhs.bFilter != rhs.bFilter ) diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index 128cc5e..7e66106 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -120,6 +120,7 @@ public: uint32_t m_FBID = 0; std::atomic nRefCount; + int32_t nCommitRefCount = 0; VulkanTexture_t handle = 0; @@ -148,6 +149,9 @@ int vulkan_texture_get_fence( VulkanTexture_t vulkanTex ); void vulkan_free_texture( VulkanTexture_t vulkanTex ); +int32_t vulkan_ref_commit( VulkanTexture_t vulkanTex ); +int32_t vulkan_free_commit( VulkanTexture_t vulkanTex ); + bool vulkan_composite( struct Composite_t *pComposite, struct VulkanPipeline_t *pPipeline, std::shared_ptr *pScreenshotTexture ); uint32_t vulkan_get_last_composite_fbid( void ); diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index 1d42935..5a9e549 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -260,6 +260,15 @@ static Atom gamescopeCtrlAppIDAtom; static Atom gamescopeCtrlWindowAtom; static Atom gamescopeInputCounterAtom; +enum HeldCommitTypes_t +{ + HELD_COMMIT_BASE, + + HELD_COMMIT_COUNT, +}; + +std::array g_HeldCommits; + /* opacity property name; sometime soon I'll write up an EWMH spec for it */ #define OPACITY_PROP "_NET_WM_WINDOW_OPACITY" #define GAME_PROP "STEAM_GAME" @@ -628,34 +637,43 @@ destroy_buffer( struct wl_listener *listener, void * ) std::lock_guard lock( wlr_buffer_map_lock ); wlr_buffer_map_entry *entry = wl_container_of( listener, entry, listener ); - if ( entry->fb_id != 0 ) - { - drm_drop_fbid( &g_DRM, entry->fb_id ); - } - if ( entry->vulkanTex != 0 ) { vulkan_free_texture( entry->vulkanTex ); } + if ( entry->fb_id != 0 ) + { + drm_drop_fbid( &g_DRM, entry->fb_id ); + } + wl_list_remove( &entry->listener.link ); /* Has to be the last thing we do as this deletes *entry. */ wlr_buffer_map.erase( wlr_buffer_map.find( entry->buf ) ); } +static void +ref_commit( commit_t &commit ) +{ + vulkan_ref_commit( commit.vulkanTex ); +} + static void release_commit( commit_t &commit ) { - if ( commit.fb_id != 0 ) + if ( !vulkan_free_commit( commit.vulkanTex ) ) { - drm_unlock_fbid( &g_DRM, commit.fb_id ); - commit.fb_id = 0; - } + if ( commit.fb_id != 0 ) + { + drm_unlock_fbid( &g_DRM, commit.fb_id ); + commit.fb_id = 0; + } - wlserver_lock(); - wlr_buffer_unlock( commit.buf ); - wlserver_unlock(); + wlserver_lock(); + wlr_buffer_unlock( commit.buf ); + wlserver_unlock(); + } } static bool @@ -3359,6 +3377,7 @@ void check_new_wayland_res( void ) } newCommit.commitID = ++maxCommmitID; + ref_commit( newCommit ); w->commit_queue.push_back( newCommit ); }