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
|
|
@ -7,6 +7,7 @@ IHLBuffer::~IHLBuffer() {
|
|||
|
||||
void IHLBuffer::sendRelease() {
|
||||
resource->sendRelease();
|
||||
syncReleasers.clear();
|
||||
}
|
||||
|
||||
void IHLBuffer::lock() {
|
||||
|
|
@ -18,10 +19,8 @@ void IHLBuffer::unlock() {
|
|||
|
||||
ASSERT(nLocks >= 0);
|
||||
|
||||
if (nLocks == 0) {
|
||||
if (nLocks == 0)
|
||||
sendRelease();
|
||||
syncReleaser.reset();
|
||||
}
|
||||
}
|
||||
|
||||
bool IHLBuffer::locked() {
|
||||
|
|
@ -40,11 +39,17 @@ void IHLBuffer::onBackendRelease(const std::function<void()>& fn) {
|
|||
});
|
||||
}
|
||||
|
||||
void IHLBuffer::addReleasePoint(CDRMSyncPointState& point) {
|
||||
ASSERT(locked());
|
||||
if (point)
|
||||
syncReleasers.emplace_back(point.createSyncRelease());
|
||||
}
|
||||
|
||||
CHLBufferReference::CHLBufferReference() : buffer(nullptr) {
|
||||
;
|
||||
}
|
||||
|
||||
CHLBufferReference::CHLBufferReference(const CHLBufferReference& other) : release(other.release), buffer(other.buffer) {
|
||||
CHLBufferReference::CHLBufferReference(const CHLBufferReference& other) : buffer(other.buffer) {
|
||||
if (buffer)
|
||||
buffer->lock();
|
||||
}
|
||||
|
|
@ -64,8 +69,7 @@ CHLBufferReference& CHLBufferReference::operator=(const CHLBufferReference& othe
|
|||
other.buffer->lock();
|
||||
if (buffer)
|
||||
buffer->unlock();
|
||||
buffer = other.buffer;
|
||||
release = other.release;
|
||||
buffer = other.buffer;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -24,11 +24,12 @@ class IHLBuffer : public Aquamarine::IBuffer {
|
|||
virtual bool locked();
|
||||
|
||||
void onBackendRelease(const std::function<void()>& fn);
|
||||
void addReleasePoint(CDRMSyncPointState& point);
|
||||
|
||||
SP<CTexture> texture;
|
||||
bool opaque = false;
|
||||
SP<CWLBufferResource> resource;
|
||||
UP<CSyncReleaser> syncReleaser;
|
||||
std::vector<UP<CSyncReleaser>> syncReleasers;
|
||||
|
||||
struct {
|
||||
CHyprSignalListener backendRelease;
|
||||
|
|
@ -57,8 +58,7 @@ class CHLBufferReference {
|
|||
operator bool() const;
|
||||
|
||||
// unlock and drop the buffer without sending release
|
||||
void drop();
|
||||
void drop();
|
||||
|
||||
CDRMSyncPointState release;
|
||||
SP<IHLBuffer> buffer;
|
||||
SP<IHLBuffer> buffer;
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue