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)
|
bool operator==(const struct VulkanPipeline_t::LayerBinding_t& lhs, struct VulkanPipeline_t::LayerBinding_t& rhs)
|
||||||
{
|
{
|
||||||
if ( lhs.bFilter != rhs.bFilter )
|
if ( lhs.bFilter != rhs.bFilter )
|
||||||
|
|
|
@ -120,6 +120,7 @@ public:
|
||||||
uint32_t m_FBID = 0;
|
uint32_t m_FBID = 0;
|
||||||
|
|
||||||
std::atomic<int32_t> nRefCount;
|
std::atomic<int32_t> nRefCount;
|
||||||
|
int32_t nCommitRefCount = 0;
|
||||||
|
|
||||||
VulkanTexture_t handle = 0;
|
VulkanTexture_t handle = 0;
|
||||||
|
|
||||||
|
@ -148,6 +149,9 @@ int vulkan_texture_get_fence( VulkanTexture_t vulkanTex );
|
||||||
|
|
||||||
void vulkan_free_texture( 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 );
|
bool vulkan_composite( struct Composite_t *pComposite, struct VulkanPipeline_t *pPipeline, std::shared_ptr<CVulkanTexture> *pScreenshotTexture );
|
||||||
uint32_t vulkan_get_last_composite_fbid( void );
|
uint32_t vulkan_get_last_composite_fbid( void );
|
||||||
|
|
||||||
|
|
|
@ -260,6 +260,15 @@ static Atom gamescopeCtrlAppIDAtom;
|
||||||
static Atom gamescopeCtrlWindowAtom;
|
static Atom gamescopeCtrlWindowAtom;
|
||||||
static Atom gamescopeInputCounterAtom;
|
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 */
|
/* opacity property name; sometime soon I'll write up an EWMH spec for it */
|
||||||
#define OPACITY_PROP "_NET_WM_WINDOW_OPACITY"
|
#define OPACITY_PROP "_NET_WM_WINDOW_OPACITY"
|
||||||
#define GAME_PROP "STEAM_GAME"
|
#define GAME_PROP "STEAM_GAME"
|
||||||
|
@ -628,25 +637,33 @@ destroy_buffer( struct wl_listener *listener, void * )
|
||||||
std::lock_guard<std::mutex> lock( wlr_buffer_map_lock );
|
std::lock_guard<std::mutex> lock( wlr_buffer_map_lock );
|
||||||
wlr_buffer_map_entry *entry = wl_container_of( listener, entry, listener );
|
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 )
|
if ( entry->vulkanTex != 0 )
|
||||||
{
|
{
|
||||||
vulkan_free_texture( entry->vulkanTex );
|
vulkan_free_texture( entry->vulkanTex );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( entry->fb_id != 0 )
|
||||||
|
{
|
||||||
|
drm_drop_fbid( &g_DRM, entry->fb_id );
|
||||||
|
}
|
||||||
|
|
||||||
wl_list_remove( &entry->listener.link );
|
wl_list_remove( &entry->listener.link );
|
||||||
|
|
||||||
/* Has to be the last thing we do as this deletes *entry. */
|
/* Has to be the last thing we do as this deletes *entry. */
|
||||||
wlr_buffer_map.erase( wlr_buffer_map.find( entry->buf ) );
|
wlr_buffer_map.erase( wlr_buffer_map.find( entry->buf ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ref_commit( commit_t &commit )
|
||||||
|
{
|
||||||
|
vulkan_ref_commit( commit.vulkanTex );
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
release_commit( commit_t &commit )
|
release_commit( commit_t &commit )
|
||||||
{
|
{
|
||||||
|
if ( !vulkan_free_commit( commit.vulkanTex ) )
|
||||||
|
{
|
||||||
if ( commit.fb_id != 0 )
|
if ( commit.fb_id != 0 )
|
||||||
{
|
{
|
||||||
drm_unlock_fbid( &g_DRM, commit.fb_id );
|
drm_unlock_fbid( &g_DRM, commit.fb_id );
|
||||||
|
@ -656,6 +673,7 @@ release_commit( commit_t &commit )
|
||||||
wlserver_lock();
|
wlserver_lock();
|
||||||
wlr_buffer_unlock( commit.buf );
|
wlr_buffer_unlock( commit.buf );
|
||||||
wlserver_unlock();
|
wlserver_unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@ -3359,6 +3377,7 @@ void check_new_wayland_res( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
newCommit.commitID = ++maxCommmitID;
|
newCommit.commitID = ++maxCommmitID;
|
||||||
|
ref_commit( newCommit );
|
||||||
w->commit_queue.push_back( newCommit );
|
w->commit_queue.push_back( newCommit );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue