render: properly release rendered buffers (#9807)
* cleanup eglSync * properly release buffers in renderer * add renderingDoneCallback and use it in screencopy * use static constructor for CEGLSync
This commit is contained in:
parent
5d005f11fa
commit
2ee5118d7a
14 changed files with 119 additions and 161 deletions
|
|
@ -35,7 +35,10 @@ CSyncReleaser::~CSyncReleaser() {
|
|||
m_timeline->signal(m_point);
|
||||
}
|
||||
|
||||
CFileDescriptor CSyncReleaser::mergeSyncFds(const CFileDescriptor& fd1, const CFileDescriptor& fd2) {
|
||||
static CFileDescriptor mergeSyncFds(const CFileDescriptor& fd1, const CFileDescriptor& fd2) {
|
||||
// combines the fences of both sync_fds into a dma_fence_array (https://www.kernel.org/doc/html/latest/driver-api/dma-buf.html#c.dma_fence_array_create)
|
||||
// with the signal_on_any param set to false, so the new sync_fd will "signal when all fences in the array signal."
|
||||
|
||||
struct sync_merge_data data{
|
||||
.name = "merged release fence",
|
||||
.fd2 = fd2.get(),
|
||||
|
|
@ -51,13 +54,11 @@ CFileDescriptor CSyncReleaser::mergeSyncFds(const CFileDescriptor& fd1, const CF
|
|||
return CFileDescriptor(data.fence);
|
||||
}
|
||||
|
||||
void CSyncReleaser::addReleaseSync(SP<CEGLSync> sync) {
|
||||
void CSyncReleaser::addSyncFileFd(const Hyprutils::OS::CFileDescriptor& syncFd) {
|
||||
if (m_fd.isValid())
|
||||
m_fd = mergeSyncFds(m_fd, sync->takeFD());
|
||||
m_fd = mergeSyncFds(m_fd, syncFd);
|
||||
else
|
||||
m_fd = sync->fd().duplicate();
|
||||
|
||||
m_sync = sync;
|
||||
m_fd = syncFd.duplicate();
|
||||
}
|
||||
|
||||
void CSyncReleaser::drop() {
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@
|
|||
*/
|
||||
|
||||
class CSyncTimeline;
|
||||
class CEGLSync;
|
||||
|
||||
class CSyncReleaser {
|
||||
public:
|
||||
|
|
@ -22,13 +21,11 @@ class CSyncReleaser {
|
|||
// drops the releaser, will never signal anymore
|
||||
void drop();
|
||||
|
||||
// wait for this gpu job to finish before releasing
|
||||
Hyprutils::OS::CFileDescriptor mergeSyncFds(const Hyprutils::OS::CFileDescriptor& fd1, const Hyprutils::OS::CFileDescriptor& fd2);
|
||||
void addReleaseSync(SP<CEGLSync> sync);
|
||||
// wait for this sync_fd to signal before releasing
|
||||
void addSyncFileFd(const Hyprutils::OS::CFileDescriptor& syncFd);
|
||||
|
||||
private:
|
||||
SP<CSyncTimeline> m_timeline;
|
||||
uint64_t m_point = 0;
|
||||
Hyprutils::OS::CFileDescriptor m_fd;
|
||||
SP<CEGLSync> m_sync;
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue