Add wlr_buffer destroy callback.
Couldn't find a wlr_buffer creation callback, so doing some work on commit.
This commit is contained in:
parent
c0d745baac
commit
5fc9df512c
1 changed files with 33 additions and 0 deletions
|
@ -300,6 +300,14 @@ static bool useXRes = true;
|
||||||
std::mutex wayland_commit_lock;
|
std::mutex wayland_commit_lock;
|
||||||
std::vector<ResListEntry_t> wayland_commit_queue;
|
std::vector<ResListEntry_t> wayland_commit_queue;
|
||||||
|
|
||||||
|
struct wlr_buffer_map_entry {
|
||||||
|
struct wl_listener listener;
|
||||||
|
struct wlr_buffer *buf;
|
||||||
|
};
|
||||||
|
|
||||||
|
static std::mutex wlr_buffer_map_lock;
|
||||||
|
static std::unordered_map<struct wlr_buffer*, wlr_buffer_map_entry> wlr_buffer_map;
|
||||||
|
|
||||||
static std::atomic< bool > g_bTakeScreenshot{false};
|
static std::atomic< bool > g_bTakeScreenshot{false};
|
||||||
|
|
||||||
static int g_nudgePipe[2] = {-1, -1};
|
static int g_nudgePipe[2] = {-1, -1};
|
||||||
|
@ -612,6 +620,18 @@ static win * find_win( struct wlr_surface *surf )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
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 );
|
||||||
|
|
||||||
|
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
|
static void
|
||||||
release_commit( commit_t &commit )
|
release_commit( commit_t &commit )
|
||||||
{
|
{
|
||||||
|
@ -635,6 +655,8 @@ release_commit( commit_t &commit )
|
||||||
static bool
|
static bool
|
||||||
import_commit ( struct wlr_buffer *buf, commit_t &commit )
|
import_commit ( struct wlr_buffer *buf, commit_t &commit )
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock( wlr_buffer_map_lock );
|
||||||
|
|
||||||
commit.buf = buf;
|
commit.buf = buf;
|
||||||
|
|
||||||
commit.vulkanTex = vulkan_create_texture_from_wlr_buffer( buf );
|
commit.vulkanTex = vulkan_create_texture_from_wlr_buffer( buf );
|
||||||
|
@ -650,6 +672,17 @@ import_commit ( struct wlr_buffer *buf, commit_t &commit )
|
||||||
commit.fb_id = 0;
|
commit.fb_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto it = wlr_buffer_map.find( buf );
|
||||||
|
if ( it == wlr_buffer_map.end() )
|
||||||
|
{
|
||||||
|
wlr_buffer_map_entry& entry = wlr_buffer_map[buf];
|
||||||
|
entry.listener.notify = destroy_buffer;
|
||||||
|
entry.buf = buf;
|
||||||
|
|
||||||
|
wlserver_lock();
|
||||||
|
wl_signal_add( &buf->events.destroy, &entry.listener );
|
||||||
|
wlserver_unlock();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue