steamcompmgr: Add framework for held commits

This commit is contained in:
Joshua Ashton 2021-12-11 01:25:39 +00:00 committed by Pierre-Loup A. Griffais
parent a5af1a78c1
commit 296a3d498d
3 changed files with 62 additions and 12 deletions

View file

@ -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 )

View file

@ -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 );

View file

@ -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,24 +637,32 @@ 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 )
{ {
@ -657,6 +674,7 @@ release_commit( commit_t &commit )
wlr_buffer_unlock( commit.buf ); wlr_buffer_unlock( commit.buf );
wlserver_unlock(); wlserver_unlock();
} }
}
static bool static bool
import_commit ( struct wlr_buffer *buf, commit_t &commit ) import_commit ( struct wlr_buffer *buf, commit_t &commit )
@ -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 );
} }