steamcompmgr: Add framework for held commits
This commit is contained in:
parent
a5af1a78c1
commit
296a3d498d
3 changed files with 62 additions and 12 deletions
|
@ -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 )
|
||||
|
|
|
@ -120,6 +120,7 @@ public:
|
|||
uint32_t m_FBID = 0;
|
||||
|
||||
std::atomic<int32_t> 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<CVulkanTexture> *pScreenshotTexture );
|
||||
uint32_t vulkan_get_last_composite_fbid( void );
|
||||
|
||||
|
|
|
@ -260,6 +260,15 @@ static Atom gamescopeCtrlAppIDAtom;
|
|||
static Atom gamescopeCtrlWindowAtom;
|
||||
static Atom gamescopeInputCounterAtom;
|
||||
|
||||
enum HeldCommitTypes_t
|
||||
{
|
||||
HELD_COMMIT_BASE,
|
||||
|
||||
HELD_COMMIT_COUNT,
|
||||
};
|
||||
|
||||
std::array<commit_t, HELD_COMMIT_COUNT> 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<std::mutex> 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 );
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue